Commit 06bf7dac authored by Rafael Monnerat's avatar Rafael Monnerat

Improved Performance and some code review/cleanning.



git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@16562 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 3362dfd6
...@@ -96,9 +96,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator): ...@@ -96,9 +96,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator):
block_moved_string = REQUEST.get('block_moved','') block_moved_string = REQUEST.get('block_moved','')
block_previous_string = REQUEST.get('previous_block_moved','') block_previous_string = REQUEST.get('previous_block_moved','')
##################################################
############## REBUILD STRUCTURE ################# ############## REBUILD STRUCTURE #################
##################################################
# build structure # build structure
basic, planning = PlanningBoxWidgetInstance.render_structure(field=field, basic, planning = PlanningBoxWidgetInstance.render_structure(field=field,
REQUEST= REQUEST, REQUEST= REQUEST,
...@@ -110,9 +108,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator): ...@@ -110,9 +108,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator):
planning_coordinates = planning_coordinates_method(basic=basic, planning_coordinates = planning_coordinates_method(basic=basic,
planning=planning) planning=planning)
##################################################
########## RECOVERING BLOCK MOVED DICTS ########## ########## RECOVERING BLOCK MOVED DICTS ##########
##################################################
# converting string to a structure # converting string to a structure
block_moved_list = self.getBlockPositionFromString(block_moved_string) block_moved_list = self.getBlockPositionFromString(block_moved_string)
# block_moved_list now holds a list of structure recovered from the REQUEST # block_moved_list now holds a list of structure recovered from the REQUEST
...@@ -170,9 +166,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator): ...@@ -170,9 +166,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator):
error_block_list = [] error_block_list = []
error_info_dict = {} error_info_dict = {}
##################################################
########## GETTING BLOCK INFORMATIONS ############ ########## GETTING BLOCK INFORMATIONS ############
##################################################
# iterating each block_moved element and recovering all usefull properties # iterating each block_moved element and recovering all usefull properties
# BEWARE : no update is done here as an activity can be composed of several # BEWARE : no update is done here as an activity can be composed of several
# blocks and so we need first to check all the blocks moved # blocks and so we need first to check all the blocks moved
...@@ -278,14 +272,11 @@ class PlanningBoxValidator(Validator.StringBaseValidator): ...@@ -278,14 +272,11 @@ class PlanningBoxValidator(Validator.StringBaseValidator):
activity_dict[final_block['activity_origin'].name] = [final_block] activity_dict[final_block['activity_origin'].name] = [final_block]
##################################################
# getting object_dict to update object properties once activities are up to # getting object_dict to update object properties once activities are up to
# date. Activities values will be updated directly on the # date. Activities values will be updated directly on the
object_dict = self.getObjectDict(basic=basic, planning=planning) object_dict = self.getObjectDict(basic=basic, planning=planning)
##################################################
############# UPDATING ACTIVITIES ################ ############# UPDATING ACTIVITIES ################
##################################################
# if activity is composed of several blocks, then check if it is needed to # if activity is composed of several blocks, then check if it is needed to
# update activity itself depending on blocks moved. Beware this part only # update activity itself depending on blocks moved. Beware this part only
# deals with activities (i.e task object) : an object can be represented by # deals with activities (i.e task object) : an object can be represented by
...@@ -331,9 +322,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator): ...@@ -331,9 +322,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator):
activity_desc['axis_start'] = start_value activity_desc['axis_start'] = start_value
activity_desc['axis_stop'] = stop_value activity_desc['axis_stop'] = stop_value
##################################################
############### UPDATING OBJECTS ################# ############### UPDATING OBJECTS #################
##################################################
# using result from updated activities to process update on objects. # using result from updated activities to process update on objects.
update_dict = {} update_dict = {}
# first building a dict with all informations for each object. # first building a dict with all informations for each object.
...@@ -1166,9 +1155,7 @@ class BasicStructure: ...@@ -1166,9 +1155,7 @@ class BasicStructure:
portal_categories = getattr(self.form,'portal_categories',None) portal_categories = getattr(self.form,'portal_categories',None)
portal_domains = getattr(self.form,'portal_domains',None) portal_domains = getattr(self.form,'portal_domains',None)
##################################################
############### BUILDING QUERY ################### ############### BUILDING QUERY ###################
##################################################
kw = self.params kw = self.params
# remove selection_expression if present # remove selection_expression if present
# This is necessary for now, because the actual selection expression in # This is necessary for now, because the actual selection expression in
...@@ -1180,8 +1167,7 @@ class BasicStructure: ...@@ -1180,8 +1167,7 @@ class BasicStructure:
del kw['select_expression'] del kw['select_expression']
if getattr(self.sec_layer_list_method, 'method_name', None) is not None: if getattr(self.sec_layer_list_method, 'method_name', None) is not None:
self.sec_layer_list_method = getattr( self.sec_layer_list_method = getattr( self.context,
self.context,
self.sec_layer_list_method.method_name) self.sec_layer_list_method.method_name)
if getattr(self.list_method, 'method_name', None) is not None: if getattr(self.list_method, 'method_name', None) is not None:
if self.list_method.method_name == 'ObjectValues': if self.list_method.method_name == 'ObjectValues':
...@@ -1213,9 +1199,7 @@ class BasicStructure: ...@@ -1213,9 +1199,7 @@ class BasicStructure:
# use current selection # use current selection
self.list_method = None self.list_method = None
##################################################
############## DEFINING STAT METHOD ############## ############## DEFINING STAT METHOD ##############
##################################################
stat_method = self.field.get_value('stat_method') stat_method = self.field.get_value('stat_method')
stat_method = getattr(self.context, stat_method, None) stat_method = getattr(self.context, stat_method, None)
if stat_method is None: if stat_method is None:
...@@ -1223,9 +1207,7 @@ class BasicStructure: ...@@ -1223,9 +1207,7 @@ class BasicStructure:
else: else:
show_stat = 1 show_stat = 1
##################################################
############ BUILDING REPORT_TREE ################ ############ BUILDING REPORT_TREE ################
##################################################
# assuming result is report tree, building it # assuming result is report tree, building it
# When building the body, need to go through all report lines # When building the body, need to go through all report lines
# each report line is a tuple of the form : # each report line is a tuple of the form :
...@@ -1241,10 +1223,9 @@ class BasicStructure: ...@@ -1241,10 +1223,9 @@ class BasicStructure:
self.selection_report_path = self.selection.getReportPath( self.selection_report_path = self.selection.getReportPath(
default=default_selection_report_path) default=default_selection_report_path)
# XXX use LOG instead Raise if self.selection_report_path in (None, ()):
#if self.selection_report_path in (None, ()): LOG("BasicStructure",0 ,"report path is empty or not valid on %s" % \
# raise PlanningBoxError, 'report path is empty or not valid on %s' % \ self.field.absolute_url())
# self.field.absolute_url()
# testing report_depth value # testing report_depth value
if report_depth is not None: if report_depth is not None:
...@@ -1267,14 +1248,23 @@ class BasicStructure: ...@@ -1267,14 +1248,23 @@ class BasicStructure:
sort_on=self.selection.sort_on, sort_on=self.selection.sort_on,
form_id=self.form.id) form_id=self.form.id)
#if report_tree_list == []: if report_tree_list == []:
#raise PlanningBoxError, "Report tree list is empty on %s" % \ LOG("BasicStructure",0 ,"Report tree list is empty on %s" %
# self.field.absolute_url() self.field.absolute_url())
########### GETTING MAIN AXIS BOUNDS #############
# before building group_object structure, need to recover axis begin & end
# for main to be able to generate a 'smart' structure taking into account
# only the area that need to be rendered. This prevents from useless
# processing
# calculating main axis bounds
self.getMainAxisInfo(self.main_axis_info, report_tree_list)
# applying main axis selection
if report_tree_list != []:
report_tree_list=report_tree_list[self.main_axis_info['bound_start']:
self.main_axis_info['bound_stop']]
##################################################
########### BUILDING REPORT_GROUPS ############### ########### BUILDING REPORT_GROUPS ###############
##################################################
# report_groups is another structure based on report_tree but # report_groups is another structure based on report_tree but
# taking care of the object activities. # taking care of the object activities.
# build two structures : # build two structures :
...@@ -1289,6 +1279,8 @@ class BasicStructure: ...@@ -1289,6 +1279,8 @@ class BasicStructure:
self.nbr_groups=0 self.nbr_groups=0
object_list=[] object_list=[]
sec_layer_object_list=[] sec_layer_object_list=[]
build_object_list = []
build_sec_layer_object_list = []
self.report_activity_dict = {} self.report_activity_dict = {}
indic_line=0 indic_line=0
index_line=0 index_line=0
...@@ -1296,15 +1288,11 @@ class BasicStructure: ...@@ -1296,15 +1288,11 @@ class BasicStructure:
select_expression = '' select_expression = ''
self.sec_layer_uid_list = [] self.sec_layer_uid_list = []
self.selection.edit(params = kw) self.selection.edit(params = kw)
if self.list_method not in (None,''): if self.list_method not in (None,''):
# valid list_method has been found # valid list_method has been found
build_object_list = self.selection(method = self.list_method, build_object_list = self.selection(method = self.list_method,
context=self.context, REQUEST=self.REQUEST) context=self.context, REQUEST=self.REQUEST)
else:
# Reset Object List if ther is no List Method
build_object_list = []
# Defining the Secondary Layer Object List # Defining the Secondary Layer Object List
if self.sec_layer_list_method not in (None,''): if self.sec_layer_list_method not in (None,''):
...@@ -1312,9 +1300,6 @@ class BasicStructure: ...@@ -1312,9 +1300,6 @@ class BasicStructure:
method=self.sec_layer_list_method, method=self.sec_layer_list_method,
context=self.context, context=self.context,
REQUEST=self.REQUEST) REQUEST=self.REQUEST)
else:
build_sec_layer_object_list = []
# now iterating through report_tree_list # now iterating through report_tree_list
for object_tree_line in report_tree_list: for object_tree_line in report_tree_list:
...@@ -1351,13 +1336,9 @@ class BasicStructure: ...@@ -1351,13 +1336,9 @@ class BasicStructure:
else: else:
info_dict['stat'] = 0 info_dict['stat'] = 0
sec_layer_object_list = [] sec_layer_object_list = []
if self.selection_report_path == 'parent': if self.selection_report_path == 'parent':
object_list = [object_tree_line.getObject()] object_list = [object_tree_line.getObject()]
# recovering exeption_uid_list
exception_uid_list = object_tree_line.getExceptionUidList()
domain_obj = object_tree_line.getObject() domain_obj = object_tree_line.getObject()
# Default Values # Default Values
new_object_list = [] new_object_list = []
...@@ -1375,6 +1356,8 @@ class BasicStructure: ...@@ -1375,6 +1356,8 @@ class BasicStructure:
object_list = new_object_list object_list = new_object_list
sec_layer_object_list = sec_new_object_list sec_layer_object_list = sec_new_object_list
# recovering exeption_uid_list
exception_uid_list = object_tree_line.getExceptionUidList()
if exception_uid_list not in ([], None, ()) : if exception_uid_list not in ([], None, ()) :
# Filter folders if parent tree : # Filter folders if parent tree :
# build new object_list for current line # build new object_list for current line
...@@ -1398,13 +1381,8 @@ class BasicStructure: ...@@ -1398,13 +1381,8 @@ class BasicStructure:
# this represents the second duplicated object # this represents the second duplicated object
# display object content in report tree with stat # display object content in report tree with stat
# stats are displayed in the first object present # stats are displayed in the first object present
#
self.report_groups += [(object_tree_line,object_list, info_dict)] self.report_groups += [(object_tree_line,object_list, info_dict)]
self.nbr_groups += 1 self.nbr_groups += 1
else:
# do nothing
# case of parent tree unfolded (second object and no stats)
pass
else: else:
# object is pure summary ! # object is pure summary !
if len(object_list) and object_tree_line.is_open: if len(object_list) and object_tree_line.is_open:
...@@ -1443,30 +1421,12 @@ class BasicStructure: ...@@ -1443,30 +1421,12 @@ class BasicStructure:
self.selection.edit(report_list=unfolded_list) self.selection.edit(report_list=unfolded_list)
##################################################
############## CHECKING CONSTRAINTS ############## ############## CHECKING CONSTRAINTS ##############
##################################################
# XXX Constraints checking should be called here # XXX Constraints checking should be called here
# and results saved in a list (list of url corresponding to objects not # and results saved in a list (list of url corresponding to objects not
# validated) # validated)
##################################################
########### GETTING MAIN AXIS BOUNDS #############
##################################################
# before building group_object structure, need to recover axis begin & end
# for main to be able to generate a 'smart' structure taking into account
# only the area that need to be rendered. This prevents from useless
# processing
# calculating main axis bounds
self.getMainAxisInfo(self.main_axis_info)
# applying main axis selection
if self.report_groups != []:
self.report_groups=self.report_groups[self.main_axis_info['bound_start']:
self.main_axis_info['bound_stop']]
##################################################
############ GETTING SEC AXIS BOUNDS ############# ############ GETTING SEC AXIS BOUNDS #############
##################################################
# now that our report_group structure has been cut need to get secondary # now that our report_group structure has been cut need to get secondary
# axis bounds to add only the blocs needed afterwards # axis bounds to add only the blocs needed afterwards
# getting secondary_axis_occurence to define begin and end secondary_axis # getting secondary_axis_occurence to define begin and end secondary_axis
...@@ -1480,28 +1440,20 @@ class BasicStructure: ...@@ -1480,28 +1440,20 @@ class BasicStructure:
# rendering) # rendering)
self.getSecondaryAxisInfo(self.secondary_axis_info) self.getSecondaryAxisInfo(self.secondary_axis_info)
##################################################
####### SAVING NEW PROPERTIES INTO REQUEST ####### ####### SAVING NEW PROPERTIES INTO REQUEST #######
##################################################
if self.list_method is not None and self.render_format != 'list': if self.list_method is not None and self.render_format != 'list':
self.selection.edit(params = self.params) self.selection.edit(params = self.params)
self.context.portal_selections.setSelectionFor(self.selection_name, self.context.portal_selections.setSelectionFor(self.selection_name,
self.selection, self.selection,
REQUEST = self.REQUEST) REQUEST = self.REQUEST)
##################################################
######### BUILDING GROUP_OBJECT STRUCTURE ######## ######### BUILDING GROUP_OBJECT STRUCTURE ########
##################################################
# building group_object structure using sub lines depth (in case of a # building group_object structure using sub lines depth (in case of a
# report tree) by doing this. # report tree) by doing this.
# taking into account page bounds to generate only the structure needed # taking into account page bounds to generate only the structure needed
# instanciate BasicGroup class in BasicStructure so that the structure can # instanciate BasicGroup class in BasicStructure so that the structure can
# be built # be built
status = self.buildGroupStructure() self.buildGroupStructure()
if status != 1:
# ERROR
# Found errors while setting group structure
return status
# everything is fine # everything is fine
return 1 return 1
...@@ -1527,11 +1479,8 @@ class BasicStructure: ...@@ -1527,11 +1479,8 @@ class BasicStructure:
start_property_id = self.field.get_value('x_start_bloc') start_property_id = self.field.get_value('x_start_bloc')
stop_property_id= self.field.get_value('x_stop_bloc') stop_property_id= self.field.get_value('x_stop_bloc')
for (object_tree_group, object_list, info_dict) in self.report_groups: for (object_tree_group, object_list, info_dict) in self.report_groups:
# defining empty list for each kind of occurence. # defining empty list for each kind of occurence.
group_list = None
group_list = [] group_list = []
item_list = None
item_list = [] item_list = []
# recovering group_properties # recovering group_properties
...@@ -1698,7 +1647,7 @@ class BasicStructure: ...@@ -1698,7 +1647,7 @@ class BasicStructure:
return 1 return 1
def getMainAxisInfo(self, axis_dict): def getMainAxisInfo(self, axis_dict, report_tree_list):
""" """
Getting main axis properties (total pages, current page, groups per page) Getting main axis properties (total pages, current page, groups per page)
and setting selection bounds (start & stop). and setting selection bounds (start & stop).
...@@ -1708,13 +1657,10 @@ class BasicStructure: ...@@ -1708,13 +1657,10 @@ class BasicStructure:
example). example).
""" """
axis_dict['bound_axis_groups'] = self.field.get_value('main_axis_groups') axis_dict['bound_axis_groups'] = self.field.get_value('main_axis_groups')
if axis_dict['bound_axis_groups'] is None:
#XXX raise exception : no group nb/page defined
pass
# setting begin & end bounds # setting begin & end bounds
axis_dict['bound_begin'] = 0 axis_dict['bound_begin'] = 0
axis_dict['bound_end'] = len(self.report_groups) axis_dict['bound_end'] = len(report_tree_list)
if self.render_format == 'list': if self.render_format == 'list':
axis_dict['bound_start'] = 0 axis_dict['bound_start'] = 0
axis_dict['bound_stop'] = axis_dict['bound_end'] axis_dict['bound_stop'] = axis_dict['bound_end']
...@@ -1732,6 +1678,7 @@ class BasicStructure: ...@@ -1732,6 +1678,7 @@ class BasicStructure:
axis_dict['bound_start'] = self.params.get('list_start',0) axis_dict['bound_start'] = self.params.get('list_start',0)
if type(axis_dict['bound_start']) is type([]): if type(axis_dict['bound_start']) is type([]):
axis_dict['bound_start'] = axis_dict['bound_start'][0] axis_dict['bound_start'] = axis_dict['bound_start'][0]
if axis_dict['bound_start'] is not None:
axis_dict['bound_start'] = int(axis_dict['bound_start']) axis_dict['bound_start'] = int(axis_dict['bound_start'])
axis_dict['bound_start'] = max(axis_dict['bound_start'],0) axis_dict['bound_start'] = max(axis_dict['bound_start'],0)
...@@ -1798,9 +1745,8 @@ class BasicStructure: ...@@ -1798,9 +1745,8 @@ class BasicStructure:
group_start = report_group_object.getObject().start_date group_start = report_group_object.getObject().start_date
group_stop = report_group_object.getObject().stop_date -1 group_stop = report_group_object.getObject().stop_date -1
# build dict to fix BasicActivity bounds # build dict to fix BasicActivity bounds
secondary_axis_bounds = {} secondary_axis_bounds = { 'bound_start': group_start,
secondary_axis_bounds['bound_start'] = group_start 'bound_stop' : group_stop }
secondary_axis_bounds['bound_stop'] = group_stop
else: else:
secondary_axis_bounds = self.secondary_axis_info secondary_axis_bounds = self.secondary_axis_info
...@@ -1819,10 +1765,6 @@ class BasicStructure: ...@@ -1819,10 +1765,6 @@ class BasicStructure:
self.list_error, self.list_error,
secondary_axis_bounds) secondary_axis_bounds)
try:
self.basic_group_list.append(child_group)
except (AttributeError):
self.basic_group_list = []
self.basic_group_list.append(child_group) self.basic_group_list.append(child_group)
return 1 return 1
...@@ -1966,7 +1908,6 @@ class BasicGroup: ...@@ -1966,7 +1908,6 @@ class BasicGroup:
current_color='' current_color=''
if self.property_dict['stat'] == 1: if self.property_dict['stat'] == 1:
info = None
info = {} info = {}
info['info_center'] = '' info['info_center'] = ''
info['info_topright'] = '' info['info_topright'] = ''
...@@ -1980,7 +1921,6 @@ class BasicGroup: ...@@ -1980,7 +1921,6 @@ class BasicGroup:
height = \ height = \
getattr(activity_content.getObject(),object_property_height) getattr(activity_content.getObject(),object_property_height)
else: else:
info = None
info = {} info = {}
info['info_center'] = '' info['info_center'] = ''
info['info_topright'] = '' info['info_topright'] = ''
...@@ -2241,24 +2181,16 @@ class PlanningStructure: ...@@ -2241,24 +2181,16 @@ class PlanningStructure:
# call method to build secondary axis structure # call method to build secondary axis structure
# need start_bound, stop_bound and number of groups to build # need start_bound, stop_bound and number of groups to build
# used in non calendar mode # used in non calendar mode
status = self.buildSecondaryAxis(basic_structure, field) self.buildSecondaryAxis(basic_structure, field)
if status != 1:
# XXX Hidding error is not a good solution generally
# ERROR while building secondary axis
return status
# completing axisgroup informations according to their bounds # completing axisgroup informations according to their bounds
status = self.completeAxis() self.completeAxis()
if status != 1:
# ERROR while completing axis
return status
# the whole structure is almost completed : axis_groups are defined, as # the whole structure is almost completed : axis_groups are defined, as
# axis_elements with their activities. Just need to create blocks related # axis_elements with their activities. Just need to create blocks related
# to the activities (special process only for Calendar mode) with their # to the activities (special process only for Calendar mode) with their
# BlockPosition # BlockPosition
status = self.buildBlocs(basic_structure=basic_structure, REQUEST=REQUEST) self.buildBlocs(basic_structure=basic_structure, REQUEST=REQUEST)
if status != 1:
# ERROR while building blocks
return status
# everything is fine, returning 'true' flag. # everything is fine, returning 'true' flag.
return 1 return 1
...@@ -2289,12 +2221,7 @@ class PlanningStructure: ...@@ -2289,12 +2221,7 @@ class PlanningStructure:
delimiter_min_number=delimiter_min_number, delimiter_min_number=delimiter_min_number,
form_id = basic_structure.form.id, form_id = basic_structure.form.id,
selection_name = basic_structure.selection_name) selection_name = basic_structure.selection_name)
#except (ArithmeticError, LookupError, AttributeError, TypeError):
# XXX Seems that too many error are catched
# XXX Shouldn't planning box failed in this case, because of bad config ?
# message = 'error raised in secondary axis generation script : please \
# check "%s"'% field.get_value('sec_axis_script')
# return [(Message(domain='erp5_ui', message=message,mapping=None))]
axis_stop = int(axis_stop) axis_stop = int(axis_stop)
axis_start = int(axis_start) axis_start = int(axis_start)
axis_range = axis_stop - axis_start axis_range = axis_stop - axis_start
...@@ -2517,7 +2444,7 @@ class PlanningStructure: ...@@ -2517,7 +2444,7 @@ class PlanningStructure:
axis_start = basic_structure.secondary_axis_info['bound_start'] axis_start = basic_structure.secondary_axis_info['bound_start']
axis_stop = basic_structure.secondary_axis_info['bound_stop'] axis_stop = basic_structure.secondary_axis_info['bound_stop']
axis_range = axis_stop - axis_start axis_range = axis_stop - axis_start
status = activity.addBlocs(main_axis_start=0, activity.addBlocs(main_axis_start=0,
main_axis_stop=self.main_axis.size, main_axis_stop=self.main_axis.size,
secondary_axis_start = axis_start, secondary_axis_start = axis_start,
secondary_axis_stop = axis_stop, secondary_axis_stop = axis_stop,
...@@ -2525,14 +2452,11 @@ class PlanningStructure: ...@@ -2525,14 +2452,11 @@ class PlanningStructure:
planning=self, warning=warning, planning=self, warning=warning,
error_block_list=error_block_list, error_block_list=error_block_list,
error_info_dict=error_info_dict) error_info_dict=error_info_dict)
if status != 1:
return status
if axis_group_object.property_dict['stat'] == 1: if axis_group_object.property_dict['stat'] == 1:
# case stat group_object, need to update block size to display # case stat group_object, need to update block size to display
# stats informations # stats informations
status = axis_group_object.updateStatBlocks() axis_group_object.updateStatBlocks()
if status != 1:
return status
# no problem during process, returning 'true' flag # no problem during process, returning 'true' flag
return 1 return 1
......
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