Commit ea376035 authored by Romain Courteaud's avatar Romain Courteaud

Modify code layout.


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@3959 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent f53292c8
##############################################################################
#
# Copyright (c) 2002 Nexedi SARL and Contributors. All Rights Reserved.
# Copyright (c) 2002, 2005 Nexedi SARL and Contributors. All Rights Reserved.
# Jean-Paul Smets-Solanes <jp@nexedi.com>
# Sebastien Robin <seb@nexedi.com>
#
......@@ -27,56 +27,49 @@
#
##############################################################################
from Products.CMFCore.utils import UniqueObject
from Acquisition import Implicit
from AccessControl import ClassSecurityInfo
from Globals import InitializeClass, DTMLFile
from Products.ERP5Type import Permissions
from Products.ERP5 import _dtmldir
from Products.ERP5Type.Tool.BaseTool import BaseTool
from Products.ERP5Type.Document.Folder import Folder
from zLOG import LOG
from DateTime import DateTime
class DomainTool(BaseTool):
"""
A tool to define ranges and subranges (predicates)
A tool to define ranges and subranges (predicates)
"""
id = 'portal_domains'
meta_type = 'ERP5 Domain Tool'
portal_type = 'Domain Tool'
allowed_types = ( 'ERP5 Domain',)
allowed_types = ('ERP5 Domain', )
# Declarative Security
security = ClassSecurityInfo()
#
# ZMI methods
#
#manage_options = Folder.manage_options
security.declareProtected( Permissions.ManagePortal, 'manage_overview' )
manage_overview = DTMLFile( 'explainDomainTool', _dtmldir )
security.declareProtected(Permissions.ManagePortal, 'manage_overview')
manage_overview = DTMLFile('explainDomainTool', _dtmldir)
# XXX FIXME method should not be public
# (some users are not able to see resource's price)
security.declarePublic('searchPredicateList')
def searchPredicateList(self,context,test=1,sort_method=None,
ignored_category_list=None,filter_method=None,
acquired=1,**kw):
def searchPredicateList(self, context, test=1, sort_method=None,
ignored_category_list=None, filter_method=None,
acquired=1, **kw):
"""
Search all predicates wich corresponds to this particular context.
Search all predicates which corresponds to this particular
context.
- The sort_method parameter allows to give a method wich will be
- The sort_method parameter allows to give a method which will be
used in order to sort the list of predicates founds. The most
important predicate is the first one in the list.
- ignored_category_list : this is the list of category that we do
- ignored_category_list: this is the list of category that we do
not want to test. For example, we might want to not test the
destination or the source of a predicate.
- the acquired parameter allow to define if we want to use
- the acquired parameter allows to define if we want to use
acquisition for categories. By default we want.
"""
portal_catalog = context.portal_catalog
portal_categories = context.portal_categories
......@@ -84,47 +77,53 @@ class DomainTool(BaseTool):
expression_list = []
checked_column_list = []
sql_kw = {}
# Search the columns of the predicate table
for column in portal_catalog.getColumnIds():
if column.startswith('predicate.'):
column_list.append(column.split('.')[1])
for column in column_list:
if column in checked_column_list:
continue
range_property = 0
if column.endswith('_range_min') or column.endswith('_range_max'):
range_property = 1
property = column[-len('_range_min')]
if '%s_range_min' % column in column_list:
range_property = 1
property = column
if range_property:
# We have to check a range property
base_name = 'predicate.%s' % property
# LOG('searchPredicateList, getPath',0,context.getPath())
# LOG('searchPredicateList, base_name',0,base_name)
# LOG('searchPredicateList, property',0,property)
# LOG('searchPredicateList, getProperty',0,context.getProperty(property))
value = context.getProperty(property)
expression = ''
if value is None:
expression += "%s is NULL AND %s_range_min is NULL AND %s_range_max is NULL" \
% ((base_name,)*3)
else:
if isinstance(value, DateTime):
value = value.ISO()
expression = "%s is NULL AND %s_range_min is NULL AND %s_range_max is NULL " % ((base_name,)*3)
expression += "OR %s = '%s' " % (base_name,value)
expression += "OR %s_range_min <= '%s' AND %s_range_max is NULL " \
% (base_name,value,base_name)
expression += "OR %s_range_min is NULL AND %s_range_max > '%s' " \
% (base_name,base_name,value)
expression += "OR %s_range_min <= '%s' AND %s_range_max > '%s' " \
% (base_name,value,base_name,value)
expression = '( ' + expression + ' )'
expression_list.append(expression)
checked_column_list.append('%s' % property)
checked_column_list.append('%s_range_min' % property)
checked_column_list.append('%s_range_max' % property)
if column not in checked_column_list:
range_property = 0
if (column.endswith('_range_min')) or \
(column.endswith('_range_max')):
range_property = 1
# XXX FIXME: what means property here ?
property = column[-len('_range_min')]
if ('%s_range_min' % column) in column_list:
range_property = 1
property = column
if range_property:
# We have to check a range property
base_name = 'predicate.%s' % property
# LOG('searchPredicateList, getPath', 0, context.getPath())
# LOG('searchPredicateList, base_name', 0, base_name)
# LOG('searchPredicateList, property', 0, property)
# LOG('searchPredicateList, getProperty', 0,
# context.getProperty(property))
value = context.getProperty(property)
format_dict = {'base_name': base_name}
expression = "(%(base_name)s is NULL) AND " \
"(%(base_name)s_range_min is NULL) AND " \
"(%(base_name)s_range_max is NULL)" % format_dict
if value is not None:
# Handle Mysql datetime correctly
if isinstance(value, DateTime):
value = value.ISO()
format_dict['value'] = value
# Generate expression
expression += "OR (%(base_name)s = '%(value)s') " \
"OR (%(base_name)s_range_min <= '%(value)s') AND " \
"(%(base_name)s_range_max is NULL) " \
"OR (%(base_name)s_range_min is NULL) AND " \
"%(base_name)s_range_max > '%(value)s' " \
"OR (%(base_name)s_range_min <= '%(value)s') AND " \
"%(base_name)s_range_max > '%(value)s' " \
% format_dict
expression = '( %s )' % expression
expression_list.append(expression)
checked_column_list.append('%s' % property)
checked_column_list.append('%s_range_min' % property)
checked_column_list.append('%s_range_max' % property)
# Add predicate.uid for automatic join
sql_kw['predicate.uid'] = '!=0'
where_expression = ' AND '.join(expression_list)
......@@ -136,9 +135,12 @@ class DomainTool(BaseTool):
category_list = context.getCategoryList()
if len(category_list)==0:
category_list = ['NULL']
category_expression = portal_categories.buildSQLSelector(category_list,query_table='predicate_category')
if len(where_expression)>0:
where_expression = '(%s) AND (%s)' % (where_expression,category_expression)
category_expression = portal_categories.buildSQLSelector(
category_list,
query_table='predicate_category')
if len(where_expression) > 0:
where_expression = '(%s) AND (%s)' % \
(where_expression,category_expression)
else:
where_expression = category_expression
sql_kw['where_expression'] = where_expression
......@@ -148,55 +150,60 @@ class DomainTool(BaseTool):
# LOG('searchPredicateList, kw',0,kw)
sql_result_list = portal_catalog.searchResults(**kw)
if kw.has_key('src__') and kw['src__']:
if kw.get('src__'):
return sql_result_list
result_list = []
#LOG('searchPredicateList, result_list before test',0,[x.getObject() for x in sql_result_list])
# LOG('searchPredicateList, result_list before test', 0,
# [x.getObject() for x in sql_result_list])
for predicate in [x.getObject() for x in sql_result_list]:
if test==0 or predicate.test(context):
result_list.append(predicate)
#LOG('searchPredicateList, result_list before sort',0,result_list)
# LOG('searchPredicateList, result_list before sort', 0, result_list)
if filter_method is not None:
result_list = filter_method(result_list)
if sort_method is not None:
result_list.sort(sort_method)
#LOG('searchPredicateList, result_list after sort',0,result_list)
# LOG('searchPredicateList, result_list after sort', 0, result_list)
return result_list
# XXX FIXME method should not be public
# (some users are not able to see resource's price)
security.declarePublic('generateMappedValue')
def generateMappedValue(self,context,test=1,predicate_list=None,**kw):
def generateMappedValue(self, context, test=1, predicate_list=None, **kw):
"""
We will generate a mapped value with the list of all predicates founds. Let's say
we have 3 predicates (in the order we want) like this:
We will generate a mapped value with the list of all predicates
founds.
Let's say we have 3 predicates (in the order we want) like this:
Predicate 1 [ base_price1, , , , , , ]
Predicate 2 [ base_price2, quantity2 , , , , , ]
Predicate 3 [ base_price3, quantity3 , , , , , ]
Our MappedValue generated will have the base_price of the predicate1, and the quantity of
the Predicate2, because Predicate 1 is the first one wich defines a base_price and the
Predicate2 is the first one wich defines a quantity
Our MappedValue generated will have the base_price of the
predicate1, and the quantity of the Predicate2, because Predicate
1 is the first one which defines a base_price and the Predicate2
is the first one wich defines a quantity.
"""
# First get the list of predicates
if predicate_list is None:
predicate_list = self.searchPredicateList(context,test=test,**kw)
predicate_list = self.searchPredicateList(context, test=test, **kw)
if len(predicate_list)==0:
return None
#mapped_value = newTempBase(self.getPortalObject(),'new_mapped_value')
from Products.ERP5Type.Document import newTempDeliveryCell
mapped_value = newTempDeliveryCell(self.getPortalObject(),'new_mapped_value')
mapped_value_property_dict = {}
# Look for each property the first predicate wich defines the property
for predicate in predicate_list:
for mapped_value_property in predicate.getMappedValuePropertyList():
if not mapped_value_property_dict.has_key(mapped_value_property):
value = predicate.getProperty(mapped_value_property)
if value is not None:
mapped_value_property_dict[mapped_value_property] = value
mapped_value = mapped_value.asContext(**mapped_value_property_dict)
# No predicate, return None
mapped_value = None
else:
# Generate tempDeliveryCell
from Products.ERP5Type.Document import newTempDeliveryCell
mapped_value = newTempDeliveryCell(self.getPortalObject(),
'new_mapped_value')
mapped_value_property_dict = {}
# Look for each property the first predicate which defines the
# property
for predicate in predicate_list:
for mapped_value_property in predicate.getMappedValuePropertyList():
if not mapped_value_property_dict.has_key(mapped_value_property):
value = predicate.getProperty(mapped_value_property)
if value is not None:
mapped_value_property_dict[mapped_value_property] = value
# Update mapped value
mapped_value = mapped_value.asContext(**mapped_value_property_dict)
return mapped_value
InitializeClass(DomainTool)
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