From d4fc3821f480af85c45bb504fd9f2f44f8b06603 Mon Sep 17 00:00:00 2001
From: Julien Muchembled <jm@nexedi.com>
Date: Wed, 5 Oct 2016 19:22:15 +0200
Subject: [PATCH] ERP5Form: use decorator syntax to apply lazyMethod on
 Listbox/PlanningBox methods

---
 product/ERP5Form/ListBox.py     | 209 +++++++++++---------------------
 product/ERP5Form/PlanningBox.py |   9 +-
 2 files changed, 73 insertions(+), 145 deletions(-)

diff --git a/product/ERP5Form/ListBox.py b/product/ERP5Form/ListBox.py
index d713da4d8d..d612824682 100644
--- a/product/ERP5Form/ListBox.py
+++ b/product/ERP5Form/ListBox.py
@@ -533,6 +533,7 @@ class ListBoxRenderer:
 
   # Here, define many getters which cache the results for better performance.
 
+  @lazyMethod
   def getContext(self):
     """Return the context of rendering this ListBox.
     """
@@ -541,37 +542,32 @@ class ListBoxRenderer:
       value = self.getForm().aq_parent
     return value
 
-  getContext = lazyMethod(getContext)
-
+  @lazyMethod
   def getForm(self):
     """Return the form which contains the ListBox.
     """
     return self.field.aq_parent
 
-  getForm = lazyMethod(getForm)
-
+  @lazyMethod
   def getEncoding(self):
     """Retutn the encoding of strings in the fields. Default to UTF-8.
     """
     return self.getPortalObject().getProperty('management_page_charset', 'utf-8')
 
-  getEncoding = lazyMethod(getEncoding)
-
+  @lazyMethod
   def isReset(self):
     """Determine if the ListBox should be reset.
     """
     reset = self.request.get('reset', 0)
     return (reset not in (0, '0'))
 
-  isReset = lazyMethod(isReset)
-
+  @lazyMethod
   def getFieldErrorDict(self):
     """Return a dictionary of errors.
     """
     return self.request.get('field_errors', {})
 
-  getFieldErrorDict = lazyMethod(getFieldErrorDict)
-
+  @lazyMethod
   def getUrl(self):
     """
       Return a requested URL.
@@ -582,8 +578,7 @@ class ListBoxRenderer:
     return '%s/%s' % (self.getContext().absolute_url(),
                       self.request.other.get('current_form_id', 'view'))
 
-  getUrl = lazyMethod(getUrl)
-
+  @lazyMethod
   def getRequestedSelectionName(self):
     """Return a selection name which may be passed by a request.
     If not present, return "default". This selection can be different from the selection
@@ -598,64 +593,54 @@ class ListBoxRenderer:
 
     return selection_name
 
-  getRequestedSelectionName = lazyMethod(getRequestedSelectionName)
-
+  @lazyMethod
   def getSelectionIndex(self):
     """Return the index of a requested selection, or None if not specified.
     """
     return self.request.get('selection_index', None)
 
-  getSelectionIndex = lazyMethod(getSelectionIndex)
-
+  @lazyMethod
   def getReportDepth(self):
     """Return the depth of reports, or None if not specified.
     """
     return self.request.get('report_depth', None)
 
-  getReportDepth = lazyMethod(getReportDepth)
-
+  @lazyMethod
   def getPortalObject(self):
     """Return the portal object.
     """
     return self.getContext().getPortalObject()
 
-  getPortalObject = lazyMethod(getPortalObject)
-
+  @lazyMethod
   def getPortalUrlString(self):
     """Return the URL of the portal as a string.
     """
     return self.getPortalObject().portal_url()
 
-  getPortalUrlString = lazyMethod(getPortalUrlString)
-
+  @lazyMethod
   def getCategoryTool(self):
     """Return the Category Tool.
     """
     return self.getPortalObject().portal_categories
 
-  getCategoryTool = lazyMethod(getCategoryTool)
-
+  @lazyMethod
   def getDomainTool(self):
     """Return the Domain Tool.
     """
     return self.getPortalObject().portal_domains
 
-  getDomainTool = lazyMethod(getDomainTool)
-
+  @lazyMethod
   def getCatalogTool(self):
     """Return the Catalog Tool.
     """
     return self.getPortalObject().portal_catalog
 
-  getCatalogTool = lazyMethod(getCatalogTool)
-
+  @lazyMethod
   def getSelectionTool(self):
     """Return the Selection Tool.
     """
     return self.getPortalObject().portal_selections
 
-  getSelectionTool = lazyMethod(getSelectionTool)
-
   def getPrefixedString(self, string):
     prefix = self.render_prefix
     if prefix is None:
@@ -664,55 +649,50 @@ class ListBoxRenderer:
       result = '%s_%s' % (prefix, string)
     return result
 
+  @lazyMethod
   def getId(self):
     """Return the id of the field. Usually, "listbox".
        The prefix will automatically be added
     """
     return self.getPrefixedString(self.field.id)
 
-  getId = lazyMethod(getId)
-
+  @lazyMethod
   def getUnprefixedId(self):
     """Return the id of the field. Usually, "listbox".
     """
     return self.field.id
 
-  getUnprefixedId = lazyMethod(getUnprefixedId)
-
+  @lazyMethod
   def getTitle(self):
     """Return the title. Make sure that it is in unicode.
     """
     return unicode(self.field.get_value('title'), self.getEncoding())
 
-  getTitle = lazyMethod(getTitle)
-
   def getMaxLineNumber(self):
     """Return the maximum number of lines shown in a page.
     This must be overridden in subclasses.
     """
     raise NotImplementedError, "getMaxLineNumber must be overridden in a subclass"
 
+  @lazyMethod
   def showSearchLine(self):
     """Return a boolean that represents whether a search line is displayed or not.
     """
     return self.field.get_value('search')
 
-  showSearchLine = lazyMethod(showSearchLine)
-
+  @lazyMethod
   def showSelectColumn(self):
     """Return a boolean that represents whether a select column is displayed or not.
     """
     return self.field.get_value('select')
 
-  showSelectColumn = lazyMethod(showSelectColumn)
-
+  @lazyMethod
   def showAnchorColumn(self):
     """Return a boolean that represents whether a anchor column is displayed or not.
     """
     return self.field.get_value('anchor')
 
-  showAnchorColumn = lazyMethod(showAnchorColumn)
-
+  @lazyMethod
   def isHideRowsOnNoSearchCriterion(self, REQUEST=None):
     """
       Return a boolean that represents whether search rows are shown or not.
@@ -767,8 +747,7 @@ class ListBoxRenderer:
         return 0
     return 1
 
-  isHideRowsOnNoSearchCriterion = lazyMethod(isHideRowsOnNoSearchCriterion)
-
+  @lazyMethod
   def showStat(self):
     """Return a boolean that represents whether a stat line is displayed or not.
 
@@ -777,43 +756,37 @@ class ListBoxRenderer:
     """
     return (self.getStatMethod() is not None) and (len(self.getStatColumnList()) > 0)
 
-  showStat = lazyMethod(showStat)
-
+  @lazyMethod
   def isDomainTreeSupported(self):
     """Return a boolean that represents whether a domain tree is supported or not.
     """
     return (self.field.get_value('domain_tree') and len(self.getDomainRootList()) > 0)
 
-  isDomainTreeSupported = lazyMethod(isDomainTreeSupported)
-
+  @lazyMethod
   def isReportTreeSupported(self):
     """Return a boolean that represents whether a report tree is supported or not.
     """
     return (self.field.get_value('report_tree') and len(self.getReportRootList()) > 0)
 
-  isReportTreeSupported = lazyMethod(isReportTreeSupported)
-
+  @lazyMethod
   def isDomainTreeMode(self):
     """Return whether the current mode is domain tree mode or not.
     """
     return self.isDomainTreeSupported() and self.getSelection().domain_tree_mode
 
-  isDomainTreeMode = lazyMethod(isDomainTreeMode)
-
+  @lazyMethod
   def isReportTreeMode(self):
     """Return whether the current mode is report tree mode or not.
     """
     return self.isReportTreeSupported() and self.getSelection().report_tree_mode
 
-  isReportTreeMode = lazyMethod(isReportTreeMode)
-
+  @lazyMethod
   def getDefaultParamList(self):
     """Return the list of default parameters.
     """
     return self.field.get_value('default_params')
 
-  getDefaultParamList = lazyMethod(getDefaultParamList)
-
+  @lazyMethod
   def getListMethodName(self):
     """Return the name of the list method. If not defined, return None.
     """
@@ -824,8 +797,7 @@ class ListBoxRenderer:
       name = list_method
     return name or None
 
-  getListMethodName = lazyMethod(getListMethodName)
-
+  @lazyMethod
   def getCountMethodName(self):
     """Return the name of the count method. If not defined, return None.
     """
@@ -836,8 +808,7 @@ class ListBoxRenderer:
       name = count_method
     return name or None
 
-  getCountMethodName = lazyMethod(getCountMethodName)
-
+  @lazyMethod
   def getStatMethodName(self):
     """Return the name of the stat method. If not defined, return None.
     """
@@ -848,8 +819,7 @@ class ListBoxRenderer:
       name = stat_method
     return name or None
 
-  getStatMethodName = lazyMethod(getStatMethodName)
-
+  @lazyMethod
   def getRowCSSMethodName(self):
     """Return the name of the row CSS method. If not defined, return None.
     """
@@ -860,39 +830,34 @@ class ListBoxRenderer:
       name = row_css_method
     return name or None
 
-  getRowCSSMethodName = lazyMethod(getRowCSSMethodName)
-
+  @lazyMethod
   def getSelectionName(self):
     """Return the selection name.
     """
     return self.getPrefixedString(self.field.get_value('selection_name'))
 
-  getSelectionName = lazyMethod(getSelectionName)
-
+  @lazyMethod
   def getMetaTypeList(self):
     """Return the list of meta types for filtering. Return None when empty.
     """
     meta_types = [c[0] for c in self.field.get_value('meta_types')]
     return meta_types or None
 
-  getMetaTypeList = lazyMethod(getMetaTypeList)
-
+  @lazyMethod
   def getPortalTypeList(self):
     """Return the list of portal types for filtering. Return None when empty.
     """
     portal_types = [c[0] for c in self.field.get_value('portal_types')]
     return portal_types or None
 
-  getPortalTypeList = lazyMethod(getPortalTypeList)
-
+  @lazyMethod
   def getColumnList(self):
     """Return the columns. Make sure that the titles are in unicode.
     """
     columns = self.field.get_value('columns')
     return [(str(c[0]), unicode(c[1], self.getEncoding())) for c in columns]
 
-  getColumnList = lazyMethod(getColumnList)
-
+  @lazyMethod
   def getAllColumnList(self):
     """Return the all columns. Make sure that the titles are in unicode.
        Make sure there is no duplicates.
@@ -904,15 +869,13 @@ class ListBoxRenderer:
                            if c[0] not in all_column_id_set)
     return all_column_list
 
-  getAllColumnList = lazyMethod(getAllColumnList)
-
+  @lazyMethod
   def getStyleColumnList(self):
     """Return the style columns columns.
     """
     return self.field.get_value('style_columns')
 
-  getStyleColumnList = lazyMethod(getStyleColumnList)
-
+  @lazyMethod
   def getStatColumnList(self):
     """Return the stat columns. Fall back to all the columns if empty.
     """
@@ -923,8 +886,7 @@ class ListBoxRenderer:
       stat_column_list = [(c[0], c[0]) for c in self.getAllColumnList()]
     return stat_column_list
 
-  getStatColumnList = lazyMethod(getStatColumnList)
-
+  @lazyMethod
   def getUrlColumnList(self):
     """Return the url columns. Make sure that it is an empty list, when not defined.
     """
@@ -938,31 +900,27 @@ class ListBoxRenderer:
     untranslatable_columns = self.field.get_value('untranslatable_columns')
     return untranslatable_columns or []
 
-  getUrlColumnList = lazyMethod(getUrlColumnList)
-
+  @lazyMethod
   def getDefaultSortColumnList(self):
     """Return the default sort columns.
     """
     return self.field.get_value('sort')
 
-  getDefaultSortColumnList = lazyMethod(getDefaultSortColumnList)
-
+  @lazyMethod
   def getDomainRootList(self):
     """Return the domain root list. Make sure that the titles are in unicode.
     """
     domain_root_list = self.field.get_value('domain_root_list')
     return [(str(c[0]), unicode(c[1], self.getEncoding())) for c in domain_root_list]
 
-  getDomainRootList = lazyMethod(getDomainRootList)
-
+  @lazyMethod
   def getReportRootList(self):
     """Return the report root list. Make sure that the titles are in unicode.
     """
     report_root_list = self.field.get_value('report_root_list')
     return [(str(c[0]), unicode(c[1], self.getEncoding())) for c in report_root_list]
 
-  getReportRootList = lazyMethod(getReportRootList)
-
+  @lazyMethod
   def getDisplayStyleList(self):
     """Return the list of avaible display style. Make sure that the
     titles are in unicode"""
@@ -970,20 +928,16 @@ class ListBoxRenderer:
     return [(str(c[0]), unicode(c[1], self.getEncoding())) for c in \
                                                       display_style_list]
 
-  getDisplayStyleList = lazyMethod(getDisplayStyleList)
-
+  @lazyMethod
   def getDefaultDisplayStyle(self):
     """Return the default display list style."""
     return self.field.get_value('default_display_style')
 
-  getDefaultDisplayStyle = lazyMethod(getDefaultDisplayStyle)
-
+  @lazyMethod
   def getGlobalSearchColumn(self):
     """Return the full text search key."""
     return self.field.get_value('global_search_column')
 
-  getGlobalSearchColumn = lazyMethod(getGlobalSearchColumn)
-
   # backwards compatability
   def getGlobalSearchColumnScript(self):
     warn("getGlobalSearchColumnScript() is deprecated. Do not use it!", \
@@ -993,14 +947,15 @@ class ListBoxRenderer:
   getFullTextSearchKey=getGlobalSearchColumn
   getFullTextSearchKeyScript=getGlobalSearchColumnScript
 
+  @lazyMethod
   def getPageNavigationTemplate(self):
     """Return the list box page navigation template."""
     return self.field.get_value('page_navigation_template')
 
-  getPageNavigationTemplate = lazyMethod(getPageNavigationTemplate)
   # backwards compatability
   getPageNavigationMode = getPageNavigationTemplate
 
+  @lazyMethod
   def getSearchColumnIdSet(self):
     """Return the set of the ids of the search columns. Fall back to the catalog schema, if not defined.
     """
@@ -1010,8 +965,7 @@ class ListBoxRenderer:
     isValidColumn = self.getCatalogTool().getSQLCatalog().isValidColumn
     return {id for id, title in self.getAllColumnList() if isValidColumn(id)}
 
-  getSearchColumnIdSet = lazyMethod(getSearchColumnIdSet)
-
+  @lazyMethod
   def getSortColumnIdSet(self):
     """Return the set of the ids of the sort columns. Fall back to search column ids, if not defined.
     """
@@ -1020,16 +974,14 @@ class ListBoxRenderer:
       return {c[0] for c in sort_columns}
     return self.getSearchColumnIdSet()
 
-  getSortColumnIdSet = lazyMethod(getSortColumnIdSet)
-
+  @lazyMethod
   def getEditableColumnIdSet(self):
     """Return the set of the ids of the editable columns.
     """
     editable_columns = self.field.get_value('editable_columns')
     return {c[0] for c in editable_columns}
 
-  getEditableColumnIdSet = lazyMethod(getEditableColumnIdSet)
-
+  @lazyMethod
   def getListActionUrl(self):
     """Return the URL of the list action.
     """
@@ -1048,11 +1000,10 @@ class ListBoxRenderer:
       list_action_part_list.append('&ignore_layout:int=1')
     return ''.join(list_action_part_list)
 
-  getListActionUrl = lazyMethod(getListActionUrl)
-
   # Whether the selection object is initialized.
   is_selection_initialized = False
 
+  @lazyMethod
   def getSelection(self):
     """FIXME: Tweak a selection and return the selection object.
     This code depends on the implementation of Selection too much.
@@ -1100,22 +1051,18 @@ class ListBoxRenderer:
 
     return selection
 
-  getSelection = lazyMethod(getSelection)
-
+  @lazyMethod
   def getCheckedUidList(self):
     """Return the list of checked uids.
     """
     return self.getSelection().getCheckedUids()
 
-  getCheckedUidList = lazyMethod(getCheckedUidList)
-
+  @lazyMethod
   def getCheckedUidSet(self):
     """Return the set of checked uids.
     """
     return set(self.getCheckedUidList())
 
-  getCheckedUidSet = lazyMethod(getCheckedUidSet)
-
   def setDisplayedColumnIdList(self, displayed_column_id_list):
     """Set the column to be displayed.
        Impact the result of getSelectedColumnList.
@@ -1137,6 +1084,7 @@ class ListBoxRenderer:
     return request.get('list_style', \
                         selection.getParams().get('list_style', self.getDefaultDisplayStyle()))
 
+  @lazyMethod
   def getSelectedColumnList(self):
     """Return the list of selected columns.
     """
@@ -1168,8 +1116,7 @@ class ListBoxRenderer:
                                                        REQUEST = self.request)
     return column_list
 
-  getSelectedColumnList = lazyMethod(getSelectedColumnList)
-
+  @lazyMethod
   def getColumnAliasList(self):
     """Return the list of column aliases for SQL, because SQL does not allow a symbol to contain dots.
     """
@@ -1178,8 +1125,7 @@ class ListBoxRenderer:
       alias_list.append(sql.replace('.', '_'))
     return alias_list
 
-  getColumnAliasList = lazyMethod(getColumnAliasList)
-
+  @lazyMethod
   def getParamDict(self):
     """Return a dictionary of parameters.
     """
@@ -1291,8 +1237,6 @@ class ListBoxRenderer:
     self.getSelection().edit(params=params)
     return params
 
-  getParamDict = lazyMethod(getParamDict)
-
   def getEditableField(self, alias):
     """Get an editable field for column, using column alias.
     Return None if a field for this column does not exist.
@@ -1311,6 +1255,7 @@ class ListBoxRenderer:
       # by the template field listbox id or by the proxy field listbox id.
       field = aq_inner(field.getTemplateField())
 
+  @lazyMethod
   def getListMethod(self):
     """Return the list method object.
     """
@@ -1327,8 +1272,7 @@ class ListBoxRenderer:
 
     return list_method
 
-  getListMethod = lazyMethod(getListMethod)
-
+  @lazyMethod
   def getCountMethod(self):
     """Return the count method object.
     """
@@ -1348,8 +1292,7 @@ class ListBoxRenderer:
 
     return count_method
 
-  getCountMethod = lazyMethod(getCountMethod)
-
+  @lazyMethod
   def getStatMethod(self):
     """Return the stat method object.
     """
@@ -1369,8 +1312,7 @@ class ListBoxRenderer:
 
     return stat_method
 
-  getStatMethod = lazyMethod(getStatMethod)
-
+  @lazyMethod
   def getRowCSSMethod(self):
     """Return the row css method object.
     """
@@ -1380,8 +1322,7 @@ class ListBoxRenderer:
       row_css_method = getattr(self.getContext(), row_css_method_name, None)
     return row_css_method
 
-  getRowCSSMethod = lazyMethod(getRowCSSMethod)
-
+  @lazyMethod
   def getDomainSelection(self):
     """Return a DomainSelection object wrapped with the context.
     """
@@ -1419,8 +1360,7 @@ class ListBoxRenderer:
 
       return DomainSelection(domain_dict = root_dict).__of__(self.getContext())
 
-  getDomainSelection = lazyMethod(getDomainSelection)
-
+  @lazyMethod
   def getStatSelectExpression(self):
     """Return a string which expresses the information retrieved by SELECT for
     the statistics.
@@ -1448,8 +1388,6 @@ class ListBoxRenderer:
 
     return ', '.join(select_expression_list)
 
-  getStatSelectExpression = lazyMethod(getStatSelectExpression)
-
   def makeReportTreeList(self, root_dict = None, report_path = None, base_category = None, depth = 0,
                          unfolded_list = (), is_report_opened = True, sort_on = (('id', 'ASC'),),
                          checked_permission='View'):
@@ -1584,6 +1522,7 @@ class ListBoxRenderer:
     """
     raise NotImplementedError, "getLineStart must be overridden in a subclass"
 
+  @lazyMethod
   def getSelectedDomainPath(self):
     """Return a selected domain path.
     """
@@ -1596,8 +1535,7 @@ class ListBoxRenderer:
         domain_path = None
     return domain_path
 
-  getSelectedDomainPath = lazyMethod(getSelectedDomainPath)
-
+  @lazyMethod
   def getSelectedReportPath(self):
     """Return a selected report path.
     """
@@ -1613,8 +1551,6 @@ class ListBoxRenderer:
 
     return selection.getReportPath(default = default_selection_report_path)
 
-  getSelectedReportPath = lazyMethod(getSelectedReportPath)
-
   def getLabelValueList(self):
     """Return a list of values, where each value is a tuple consisting of an property id, a title and a string which
     describes the current sorting order, one of ascending, descending and None. If a value is not sortable, the id is
@@ -2130,6 +2066,7 @@ class ListBoxRendererLine:
     """
     return self.obj
 
+  @lazyMethod
   def getObject(self):
     """Return a real object.
     """
@@ -2138,22 +2075,18 @@ class ListBoxRendererLine:
     except AttributeError:
       return self.obj
 
-  getObject = lazyMethod(getObject)
-
+  @lazyMethod
   def getUid(self):
     """Return the uid of the object.
     """
     return getattr(aq_base(self.obj), 'uid', None)
 
-  getUid = lazyMethod(getUid)
-
+  @lazyMethod
   def getUrl(self):
     """Return the absolute URL path of the object
     """
     return self.getBrain().getUrl()
 
-  getUrl = lazyMethod(getUrl)
-
   def isSummary(self):
     """Return whether this line is a summary or not.
     """
@@ -2562,20 +2495,18 @@ class ListBoxHTMLRenderer(ListBoxRenderer):
     """
     return ListBoxHTMLRendererLine
 
+  @lazyMethod
   def getLineStart(self):
     """Return a requested start number.
     """
     return int(self.getParamDict().get('list_start', 0))
 
-  getLineStart = lazyMethod(getLineStart)
-
+  @lazyMethod
   def getMaxLineNumber(self):
     """Return the maximum number of lines shown in a page.
     """
     return self.field.get_value('lines')
 
-  getMaxLineNumber = lazyMethod(getMaxLineNumber)
-
   def getMD5Checksum(self):
     """Generate a MD5 checksum against checked uids. This is used to confirm
     that selected values do not change between a display of a dialog and an execution.
diff --git a/product/ERP5Form/PlanningBox.py b/product/ERP5Form/PlanningBox.py
index 8c0828d416..5606841494 100644
--- a/product/ERP5Form/PlanningBox.py
+++ b/product/ERP5Form/PlanningBox.py
@@ -1222,20 +1222,19 @@ class BasicStructure:
 
     return object_list
 
+  @lazyMethod
   def getPortalObject(self):
     """Return the portal object.
     """
     return self.context.getPortalObject()
 
-  getPortalObject = lazyMethod(getPortalObject)
-
+  @lazyMethod
   def getSelectionTool(self):
     """Return the Selection Tool.
     """
     return self.getPortalObject().portal_selections
 
-  getSelectionTool = lazyMethod(getSelectionTool)
-
+  @lazyMethod
   def getPortalTypeList(self):
     """
     Return the list of portal types for filtering. Return None when empty.
@@ -1243,8 +1242,6 @@ class BasicStructure:
     portal_types = [c[0] for c in self.field.get_value('portal_types')]
     return portal_types or None
 
-  getPortalTypeList = lazyMethod(getPortalTypeList)
-
   def getReportGroupList(self, report_tree_list=[], \
                   sec_layer_method_name=None,show_stat=0):
     """
-- 
2.30.9