[Erp5-report] r16562 - /erp5/trunk/products/ERP5Form/PlanningBox.py

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Sep 24 08:51:13 CEST 2007


Author: rafael
Date: Mon Sep 24 08:51:13 2007
New Revision: 16562

URL: http://svn.erp5.org?rev=16562&view=rev
Log:

Improved Performance and some code review/cleanning.


Modified:
    erp5/trunk/products/ERP5Form/PlanningBox.py

Modified: erp5/trunk/products/ERP5Form/PlanningBox.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/PlanningBox.py?rev=16562&r1=16561&r2=16562&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/PlanningBox.py (original)
+++ erp5/trunk/products/ERP5Form/PlanningBox.py Mon Sep 24 08:51:13 2007
@@ -96,9 +96,7 @@
     block_moved_string = REQUEST.get('block_moved','')
     block_previous_string = REQUEST.get('previous_block_moved','')
 
-    ##################################################
     ############## REBUILD STRUCTURE #################
-    ##################################################
     # build structure
     basic, planning = PlanningBoxWidgetInstance.render_structure(field=field,
                           REQUEST= REQUEST,
@@ -110,9 +108,7 @@
     planning_coordinates = planning_coordinates_method(basic=basic,
                                                        planning=planning)
 
-    ##################################################
     ########## RECOVERING BLOCK MOVED DICTS ##########
-    ##################################################
     #  converting string to a structure
     block_moved_list = self.getBlockPositionFromString(block_moved_string)
     # block_moved_list now holds a list of structure recovered from the REQUEST
@@ -170,9 +166,7 @@
     error_block_list = []
     error_info_dict = {}
 
-    ##################################################
     ########## GETTING BLOCK INFORMATIONS ############
-    ##################################################
     # iterating each block_moved element and recovering all usefull properties
     # 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
@@ -278,14 +272,11 @@
         activity_dict[final_block['activity_origin'].name] = [final_block]
 
 
-    ##################################################
     # getting object_dict to update object properties once activities are up to
     # date. Activities values will be updated directly on the
     object_dict = self.getObjectDict(basic=basic, planning=planning)
 
-    ##################################################
     ############# UPDATING ACTIVITIES ################
-    ##################################################
     # 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
     # deals with activities (i.e task object) : an object can be represented by
@@ -331,9 +322,7 @@
             activity_desc['axis_start'] = start_value
             activity_desc['axis_stop'] = stop_value
 
-    ##################################################
     ############### UPDATING OBJECTS #################
-    ##################################################
     # using result from updated activities to process update on objects.
     update_dict = {}
     # first building a dict with all informations for each object.
@@ -1166,9 +1155,7 @@
     portal_categories = getattr(self.form,'portal_categories',None)
     portal_domains = getattr(self.form,'portal_domains',None)
 
-    ##################################################
     ############### BUILDING QUERY ###################
-    ##################################################
     kw = self.params
     # remove selection_expression if present
     # This is necessary for now, because the actual selection expression in
@@ -1180,8 +1167,7 @@
       del kw['select_expression']
 
     if getattr(self.sec_layer_list_method, 'method_name', None) is not None:
-       self.sec_layer_list_method = getattr(
-                                      self.context,
+       self.sec_layer_list_method = getattr( self.context,
                                       self.sec_layer_list_method.method_name)
     if getattr(self.list_method, 'method_name', None) is not None:
       if self.list_method.method_name == 'ObjectValues':
@@ -1213,9 +1199,7 @@
       # use current selection
       self.list_method = None
 
-    ##################################################
     ############## DEFINING STAT METHOD ##############
-    ##################################################
     stat_method = self.field.get_value('stat_method')
     stat_method = getattr(self.context, stat_method, None)
     if stat_method is None:
@@ -1223,9 +1207,7 @@
     else:
       show_stat = 1
 
-    ##################################################
     ############ BUILDING REPORT_TREE ################
-    ##################################################
     # assuming result is report tree, building it
     # When building the body, need to go through all report lines
     # each report line is a tuple of the form :
@@ -1241,10 +1223,9 @@
     self.selection_report_path = self.selection.getReportPath(
                                   default=default_selection_report_path)
 
-    # XXX use LOG instead Raise
-    #if self.selection_report_path in (None, ()):
-    #  raise PlanningBoxError, 'report path is empty or not valid on %s' % \
-    #    self.field.absolute_url()
+    if self.selection_report_path in (None, ()):
+      LOG("BasicStructure",0 ,"report path is empty or not valid on  %s" % \
+                      self.field.absolute_url())
 
     # testing report_depth value
     if report_depth is not None:
@@ -1267,14 +1248,23 @@
                                     sort_on=self.selection.sort_on,
                                     form_id=self.form.id)
 
-    #if report_tree_list == []:
-      #raise PlanningBoxError, "Report tree list is empty on %s" % \
-      #  self.field.absolute_url()
-
-
-    ##################################################
+    if report_tree_list == []:
+      LOG("BasicStructure",0 ,"Report tree list is empty on %s" % 
+                      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 ###############
-    ##################################################
     # report_groups is another structure based on report_tree but
     # taking care of the object activities.
     # build two structures :
@@ -1289,22 +1279,20 @@
     self.nbr_groups=0
     object_list=[]
     sec_layer_object_list=[]
+    build_object_list = []
+    build_sec_layer_object_list = []
     self.report_activity_dict = {}
     indic_line=0
     index_line=0
     blocks_object={}
     select_expression = ''
     self.sec_layer_uid_list = []
-    
-    
+
     self.selection.edit(params = kw)
     if self.list_method not in (None,''):
       # valid list_method has been found
       build_object_list = self.selection(method = self.list_method,
                     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
     if self.sec_layer_list_method not in (None,''):
@@ -1312,9 +1300,6 @@
                       method=self.sec_layer_list_method,
                       context=self.context,
                       REQUEST=self.REQUEST)
-    else:
-      build_sec_layer_object_list = []
-
 
     # now iterating through report_tree_list
     for object_tree_line in report_tree_list:
@@ -1351,12 +1336,8 @@
       else:
         info_dict['stat'] = 0
         sec_layer_object_list = []
-
         if self.selection_report_path == 'parent':
           object_list = [object_tree_line.getObject()]
-
-        # recovering exeption_uid_list
-        exception_uid_list = object_tree_line.getExceptionUidList()
 
         domain_obj = object_tree_line.getObject()
         # Default Values
@@ -1375,6 +1356,8 @@
           object_list = 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, ()) :
           # Filter folders if parent tree :
           # build new object_list for current line
@@ -1398,13 +1381,8 @@
             # this represents the second duplicated object
             # display object content in report tree with stat
             # stats are displayed in the first object present
-            #
             self.report_groups += [(object_tree_line,object_list, info_dict)]
             self.nbr_groups += 1
-          else:
-            # do nothing
-            # case of parent tree unfolded (second object and no stats)
-            pass
         else:
           # object is pure summary !
           if len(object_list) and object_tree_line.is_open:
@@ -1443,30 +1421,12 @@
       self.selection.edit(report_list=unfolded_list)
 
 
-    ##################################################
     ############## CHECKING CONSTRAINTS ##############
-    ##################################################
     # XXX Constraints checking should be called here
     # and results saved in a list (list of url corresponding to objects not
     # 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 #############
-    ##################################################
     # now that our report_group structure has been cut need to get secondary
     # axis bounds to add only the blocs needed afterwards
     # getting secondary_axis_occurence to define begin and end secondary_axis
@@ -1480,28 +1440,20 @@
     # rendering)
     self.getSecondaryAxisInfo(self.secondary_axis_info)
 
-    ##################################################
     ####### SAVING NEW PROPERTIES INTO REQUEST #######
-    ##################################################
     if self.list_method is not None and self.render_format != 'list':
      self.selection.edit(params = self.params)
      self.context.portal_selections.setSelectionFor(self.selection_name,
                                                  self.selection,
                                                  REQUEST = self.REQUEST)
 
-    ##################################################
     ######### BUILDING GROUP_OBJECT STRUCTURE ########
-    ##################################################
     # building group_object structure using sub lines depth (in case of a
     # report tree) by doing this.
     # taking into account page bounds to generate only the structure needed
     # instanciate BasicGroup class in BasicStructure so that the structure can
     # be built
-    status = self.buildGroupStructure()
-    if status != 1:
-      # ERROR
-      # Found errors while setting group structure
-      return status
+    self.buildGroupStructure()
     # everything is fine
     return 1
 
@@ -1527,11 +1479,8 @@
     start_property_id = self.field.get_value('x_start_bloc')
     stop_property_id= self.field.get_value('x_stop_bloc')
     for (object_tree_group, object_list, info_dict) in self.report_groups:
-
       # defining empty list for each kind of occurence.
-      group_list = None
       group_list = []
-      item_list = None
       item_list = []
 
       # recovering group_properties
@@ -1698,7 +1647,7 @@
     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)
     and setting selection bounds (start & stop).
@@ -1708,13 +1657,10 @@
     example).
     """
     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
     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':
       axis_dict['bound_start'] = 0
       axis_dict['bound_stop'] = axis_dict['bound_end']
@@ -1732,7 +1678,8 @@
         axis_dict['bound_start'] = self.params.get('list_start',0)
         if type(axis_dict['bound_start']) is type([]):
           axis_dict['bound_start'] = axis_dict['bound_start'][0]
-        axis_dict['bound_start'] = int(axis_dict['bound_start'])
+        if axis_dict['bound_start'] is not None:
+          axis_dict['bound_start'] = int(axis_dict['bound_start'])
       axis_dict['bound_start'] = max(axis_dict['bound_start'],0)
 
       if axis_dict['bound_start'] > axis_dict['bound_end']:
@@ -1798,9 +1745,8 @@
           group_start = report_group_object.getObject().start_date
           group_stop  = report_group_object.getObject().stop_date -1
           # build dict to fix BasicActivity bounds
-          secondary_axis_bounds = {}
-          secondary_axis_bounds['bound_start'] = group_start
-          secondary_axis_bounds['bound_stop']  = group_stop
+          secondary_axis_bounds = { 'bound_start': group_start,
+                                    'bound_stop' : group_stop }
         else:
           secondary_axis_bounds = self.secondary_axis_info
 
@@ -1819,11 +1765,7 @@
                                          self.list_error,
                                          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
 
@@ -1966,7 +1908,6 @@
           current_color=''
 
           if self.property_dict['stat'] == 1:
-            info = None
             info = {}
             info['info_center'] = ''
             info['info_topright'] = ''
@@ -1980,7 +1921,6 @@
             height = \
                  getattr(activity_content.getObject(),object_property_height)
           else:
-            info = None
             info = {}
             info['info_center'] = ''
             info['info_topright'] = ''
@@ -2000,18 +1940,18 @@
             if obj.getUid() not in self.sec_layer_uid_list:
               # if value recovered is not null, then updating
               if info_center_method is not None:
-                 info['info_center']=str(info_center_method())
+                info['info_center']=str(info_center_method())
               if info_topright_method is not None:
-                 info['info_topright']=str(info_topright_method())
+                info['info_topright']=str(info_topright_method())
               if info_topleft_method is not None:
-                 info['info_topleft']=str(info_topleft_method())
+                info['info_topleft']=str(info_topleft_method())
               if info_botleft_method is not None:
-                 info['info_botleft'] =str(info_botleft_method())
+                info['info_botleft'] =str(info_botleft_method())
               if info_botright_method is not None:
-                 info['info_botright']=str(info_botright_method())
+                info['info_botright']=str(info_botright_method())
 
             if info_tooltip_method is not None:
-               info['info_tooltip']=str(info_tooltip_method())
+              info['info_tooltip']=str(info_tooltip_method())
 
             title = info['info_center']
             color_script = getattr(activity_content.getObject(),
@@ -2241,24 +2181,16 @@
     # call method to build secondary axis structure
     # need start_bound, stop_bound and number of groups to build
     # used in non calendar mode
-    status = self.buildSecondaryAxis(basic_structure, field)
-    if status != 1:
-      # XXX Hidding error is not a good solution generally
-      # ERROR while building secondary axis
-      return status
+    self.buildSecondaryAxis(basic_structure, field)
+
     # completing axisgroup informations according to their bounds
-    status = self.completeAxis()
-    if status != 1:
-      # ERROR while completing axis
-      return status
+    self.completeAxis()
+
     # the whole structure is almost completed : axis_groups are defined, as
     # axis_elements with their activities. Just need to create blocks related
     # to the activities (special process only for Calendar mode) with their
     # BlockPosition
-    status = self.buildBlocs(basic_structure=basic_structure, REQUEST=REQUEST)
-    if status != 1:
-      # ERROR while building blocks
-      return status
+    self.buildBlocs(basic_structure=basic_structure, REQUEST=REQUEST)
     # everything is fine, returning 'true' flag.
     return 1
 
@@ -2289,12 +2221,7 @@
                                  delimiter_min_number=delimiter_min_number,
                                  form_id = basic_structure.form.id,
                                  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_start = int(axis_start)
     axis_range = axis_stop - axis_start
@@ -2517,22 +2444,19 @@
             axis_start = basic_structure.secondary_axis_info['bound_start']
             axis_stop  = basic_structure.secondary_axis_info['bound_stop']
             axis_range = axis_stop - axis_start
-          status = activity.addBlocs(main_axis_start=0,
-                                main_axis_stop=self.main_axis.size,
-                                secondary_axis_start = axis_start,
-                                secondary_axis_stop  = axis_stop,
-                                secondary_axis_range = axis_range,
-                                planning=self, warning=warning,
-                                error_block_list=error_block_list,
-                                error_info_dict=error_info_dict)
-          if status != 1: 
-            return status
+          activity.addBlocs(main_axis_start=0,
+                            main_axis_stop=self.main_axis.size,
+                            secondary_axis_start = axis_start,
+                            secondary_axis_stop  = axis_stop,
+                            secondary_axis_range = axis_range,
+                            planning=self, warning=warning,
+                            error_block_list=error_block_list,
+                            error_info_dict=error_info_dict)
+
         if axis_group_object.property_dict['stat'] == 1:
           # case stat group_object, need to update block size to display
           # stats informations
-          status = axis_group_object.updateStatBlocks()
-          if status != 1: 
-            return status
+          axis_group_object.updateStatBlocks()
     # no problem during process, returning 'true' flag
     return 1
 




More information about the Erp5-report mailing list