Commit 3b8f4430 authored by Jérome Perrin's avatar Jérome Perrin

amendments to r39010: this feature was not working when only "none" was

selected, and when none and actual values where selected on the same axis.


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@39068 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 20c546e5
...@@ -31,7 +31,6 @@ from AccessControl.ZopeGuards import guarded_getattr ...@@ -31,7 +31,6 @@ from AccessControl.ZopeGuards import guarded_getattr
from Products.ERP5Type import Permissions, PropertySheet from Products.ERP5Type import Permissions, PropertySheet
from Products.ERP5.Document.BudgetVariation import BudgetVariation from Products.ERP5.Document.BudgetVariation import BudgetVariation
from Products.ZSQLCatalog.SQLCatalog import Query, NegatedQuery, ComplexQuery from Products.ZSQLCatalog.SQLCatalog import Query, NegatedQuery, ComplexQuery
from Products.ERP5Type.Message import translateString
class NodeBudgetVariation(BudgetVariation): class NodeBudgetVariation(BudgetVariation):
...@@ -131,6 +130,7 @@ class NodeBudgetVariation(BudgetVariation): ...@@ -131,6 +130,7 @@ class NodeBudgetVariation(BudgetVariation):
# parameters such as section_category_uid # parameters such as section_category_uid
axis = '%s_uid' % axis axis = '%s_uid' % axis
query = None
portal_categories = self.getPortalObject().portal_categories portal_categories = self.getPortalObject().portal_categories
for criterion_category in context.getMembershipCriterionCategoryList(): for criterion_category in context.getMembershipCriterionCategoryList():
if '/' not in criterion_category: # safe ... if '/' not in criterion_category: # safe ...
...@@ -139,8 +139,8 @@ class NodeBudgetVariation(BudgetVariation): ...@@ -139,8 +139,8 @@ class NodeBudgetVariation(BudgetVariation):
if criterion_base_category == base_category: if criterion_base_category == base_category:
if node_url == 'budget_special_node/none': if node_url == 'budget_special_node/none':
# This is the "Nothing" virtual node # This is the "Nothing" virtual node
query_dict.setdefault(axis, []).append(Query(**{axis: None})) query = Query(**{axis: None})
if node_url == 'budget_special_node/all_other': elif node_url == 'budget_special_node/all_other':
# This is the "All Other" virtual node # This is the "All Other" virtual node
other_uid_list = [] other_uid_list = []
none_node_selected = False none_node_selected = False
...@@ -153,19 +153,28 @@ class NodeBudgetVariation(BudgetVariation): ...@@ -153,19 +153,28 @@ class NodeBudgetVariation(BudgetVariation):
other_uid_list.append(node.getUid()) other_uid_list.append(node.getUid())
if none_node_selected: if none_node_selected:
# in this case we don't want to include NULL in All others # in this case we don't want to include NULL in All others
query_dict.setdefault(axis, []).append( query = NegatedQuery(Query(**{axis: other_uid_list}))
NegatedQuery(Query(**{axis: other_uid_list})))
else: else:
query_dict.setdefault(axis, []).append( query = ComplexQuery(
ComplexQuery(
NegatedQuery(Query(**{axis: other_uid_list})), NegatedQuery(Query(**{axis: other_uid_list})),
Query(**{axis: None}), Query(**{axis: None}),
operator="OR")) operator="OR")
query_dict.setdefault(axis, []).append( else:
query_dict.setdefault(axis, []).append(
portal_categories.getCategoryValue(node_url, portal_categories.getCategoryValue(node_url,
base_category=criterion_base_category).getUid()) base_category=criterion_base_category).getUid())
if query:
if axis in query_dict:
query_dict[axis] = ComplexQuery(
query,
Query(**{axis: query_dict[axis]}),
operator='OR')
else:
query_dict[axis] = query
return query_dict return query_dict
def getInventoryListQueryDict(self, budget_line): def getInventoryListQueryDict(self, budget_line):
...@@ -210,10 +219,13 @@ class NodeBudgetVariation(BudgetVariation): ...@@ -210,10 +219,13 @@ class NodeBudgetVariation(BudgetVariation):
found = True found = True
if found: if found:
if self.getProperty('include_virtual_none_node'): if self.getProperty('include_virtual_none_node'):
query_dict[axis] = ComplexQuery( if axis in query_dict:
Query(**{axis: None}), query_dict[axis] = ComplexQuery(
Query(**{axis: query_dict[axis]}), Query(**{axis: None}),
operator="OR") Query(**{axis: query_dict[axis]}),
operator="OR")
else:
query_dict[axis] = Query(**{axis: None})
return query_dict return query_dict
return dict() return dict()
......
...@@ -31,7 +31,7 @@ import transaction ...@@ -31,7 +31,7 @@ import transaction
from DateTime import DateTime from DateTime import DateTime
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ZSQLCatalog.SQLCatalog import ComplexQuery from Products.ZSQLCatalog.SQLCatalog import ComplexQuery, Query
from AccessControl import getSecurityManager from AccessControl import getSecurityManager
class TestBudget(ERP5TypeTestCase): class TestBudget(ERP5TypeTestCase):
...@@ -657,7 +657,115 @@ class TestBudget(ERP5TypeTestCase): ...@@ -657,7 +657,115 @@ class TestBudget(ERP5TypeTestCase):
{('source_project/organisation_module/my_organisation',): 200.0, {('source_project/organisation_module/my_organisation',): 200.0,
('source_project/budget_special_node/none',): -300.0 ('source_project/budget_special_node/none',): -300.0
}, budget_line.getEngagedBudgetDict()) }, budget_line.getEngagedBudgetDict())
def test_only_none_virtual_node(self):
# tests consumptions, by using only "none" virtual node on a node budget
# variation
budget_model = self.portal.budget_model_module.newContent(
portal_type='Budget Model')
budget_model.newContent(
portal_type='Node Budget Variation',
int_index=1,
budget_variation='budget_cell',
# this does not work for movement, node and section
# categories ...
inventory_axis='project',
variation_base_category='source_project',
aggregate_value_list=(
self.portal.organisation_module.my_organisation,),
include_virtual_none_node=True)
budget_model.newContent(
portal_type='Category Budget Variation',
int_index=2,
budget_variation='budget_line',
inventory_axis='node_category_strict_membership',
variation_base_category='account_type',)
budget = self.portal.budget_module.newContent(
portal_type='Budget',
start_date_range_min=DateTime(2000, 1, 1),
start_date_range_max=DateTime(2000, 12, 31),
specialise_value=budget_model)
budget_line = budget.newContent(portal_type='Budget Line')
budget_line.edit(
variation_category_list=(
'source_project/budget_special_node/none', # this is 'none'
'account_type/expense',))
form = budget_line.BudgetLine_view
self.portal.REQUEST.other.update(
dict(AUTHENTICATED_USER=getSecurityManager().getUser(),
field_membership_criterion_base_category_list=
form.membership_criterion_base_category_list.get_value('default'),
field_mapped_value_property_list=
form.mapped_value_property_list.get_value('default'),
field_matrixbox_quantity_cell_0_0_0="200",
field_matrixbox_membership_criterion_category_list_cell_0_0_0=[
'source_project/budget_special_node/none',],
))
budget_line.Base_edit(form_id=form.getId())
self.assertEquals(1, len(budget_line.contentValues()))
class ReferenceQuery:
"""Helper class to compare queries
"""
def __eq__(me, query):
self.assertTrue(isinstance(query, Query))
self.assertEquals(query.kw, {'project_uid': None})
return True
self.assertEquals(
dict(from_date=DateTime(2000, 1, 1),
at_date=DateTime(2000, 12, 31).latestTime(),
node_category_strict_membership=['account_type/expense',],
project_uid=ReferenceQuery(),
group_by_node_category_strict_membership=True,
group_by_project=True,
),
budget_model.getInventoryListQueryDict(budget_line))
budget_cell = budget_line.contentValues()[0]
self.assertEquals(
dict(from_date=DateTime(2000, 1, 1),
at_date=DateTime(2000, 12, 31).latestTime(),
node_category_strict_membership=['account_type/expense',],
project_uid=ReferenceQuery(),
),
budget_model.getInventoryQueryDict(budget_cell))
atransaction = self.portal.accounting_module.newContent(
portal_type='Accounting Transaction',
source_section_value=self.portal.organisation_module.my_organisation,
resource_value=self.portal.currency_module.euro,
start_date=DateTime(2000, 1, 2))
atransaction.newContent(
portal_type='Accounting Transaction Line',
source_value=self.portal.account_module.goods_purchase,
source_project_value=self.portal.organisation_module.my_organisation,
source_debit=200)
atransaction.newContent(
portal_type='Accounting Transaction Line',
source_value=self.portal.account_module.goods_purchase,
source_credit=300)
atransaction.stop()
transaction.commit()
self.tic()
self.assertEquals(
{('source_project/budget_special_node/none',): -300.0
}, budget_line.getConsumedBudgetDict())
self.assertEquals(
{('source_project/budget_special_node/none',): -300.0
}, budget_line.getEngagedBudgetDict())
self.assertEquals(-300, budget_cell.getConsumedBudget())
def test_none_and_all_others_virtual_nodes_together(self): def test_none_and_all_others_virtual_nodes_together(self):
# tests consumptions, by using "none" and "all other" virtual nodes # tests consumptions, by using "none" and "all other" virtual nodes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment