[Erp5-report] r31088 jm - in /erp5/trunk/products: ERP5/bootstrap/erp5_core/SkinTemplateIte...

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Dec 4 17:35:11 CET 2009


Author: jm
Date: Fri Dec  4 17:35:10 2009
New Revision: 31088

URL: http://svn.erp5.org?rev=31088&view=rev
Log:
Allow use of ParallelListFields in ListBox cells

Modified:
    erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_hashCategoryList.xml
    erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/change_log
    erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision
    erp5/trunk/products/ERP5Form/ListBox.py
    erp5/trunk/products/ERP5Form/ParallelListField.py

Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_hashCategoryList.xml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_hashCategoryList.xml?rev=31088&r1=31087&r2=31088&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_hashCategoryList.xml [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_hashCategoryList.xml [utf8] Fri Dec  4 17:35:10 2009
@@ -65,27 +65,23 @@
 # Initialise result\n
 sub_field_list = []\n
 \n
+title = default_sub_field_property_dict[\'title\']\n
+\n
 # Maximum size of the MultiListField\n
-default_sub_field_property_dict.update({\'required\': 0,\'field_type\': \'ListField\',\'size\': 1,\'item_list\': [(\'\', \'\')] + item_list,\'value\': None})\n
-\n
-z = 0\n
+default_sub_field_property_dict.update(title=\' \',\n
+                                       key=\'default:list\',\n
+                                       field_type=\'ListField\',\n
+                                       size=1,\n
+                                       item_list=[(\'\', \'\')] + item_list,\n
+                                       value=None)\n
 for value in value_list:\n
   new_dict = default_sub_field_property_dict.copy()\n
   new_dict[\'value\'] = value\n
-  new_dict[\'title\'] = \' \'\n
-  new_dict[\'key\'] = str(z)\n
-  z += 1\n
   sub_field_list.append(new_dict)\n
 \n
-request = context.REQUEST\n
+sub_field_list.append(default_sub_field_property_dict)\n
 \n
-new_dict = default_sub_field_property_dict.copy()\n
-new_dict[\'title\'] = \' \'\n
-new_dict[\'key\'] = str(z)\n
-sub_field_list.append(new_dict)\n
-\n
-if len(sub_field_list):\n
-  sub_field_list[0][\'title\'] = default_sub_field_property_dict[\'title\']\n
+sub_field_list[0][\'title\'] = title\n
 return sub_field_list\n
 
 
@@ -130,19 +126,14 @@
                             <string>default_sub_field_property_dict</string>
                             <string>is_right_display</string>
                             <string>sub_field_list</string>
+                            <string>_getitem_</string>
+                            <string>title</string>
                             <string>_getattr_</string>
                             <string>None</string>
-                            <string>z</string>
                             <string>_getiter_</string>
                             <string>value</string>
                             <string>new_dict</string>
                             <string>_write_</string>
-                            <string>str</string>
-                            <string>_inplacevar_</string>
-                            <string>context</string>
-                            <string>request</string>
-                            <string>len</string>
-                            <string>_getitem_</string>
                           </tuple>
                         </value>
                     </item>

Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/change_log
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/change_log?rev=31088&r1=31087&r2=31088&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/change_log [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/change_log [utf8] Fri Dec  4 17:35:10 2009
@@ -1,3 +1,7 @@
+2009-12-04 jm
+* Allow use of ParallelListFields in ListBox cells. Fields using
+  Base_hashCategoryList requires ERP5Form to be up-to-date.
+
 2009-11-18 yo
 * Move localization-related preferences to General from UI.
 

Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision?rev=31088&r1=31087&r2=31088&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision [utf8] Fri Dec  4 17:35:10 2009
@@ -1,1 +1,1 @@
-1393
+1394

Modified: erp5/trunk/products/ERP5Form/ListBox.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/ListBox.py?rev=31088&r1=31087&r2=31088&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/ListBox.py [utf8] (original)
+++ erp5/trunk/products/ERP5Form/ListBox.py [utf8] Fri Dec  4 17:35:10 2009
@@ -2317,46 +2317,24 @@
         else:
           error_message = u''
 
-        if getattr(brain, 'asContext', None) is not None:
-          # We needed a way to pass the current line object (ie. brain)
-          # to the field which is being displayed. Since the
-          # render_view API did not permit this, we pass the line object
-          # as the REQUEST. But this has side effects since it breaks
-          # many possibilities. Therefore, the trick is to wrap
-          # the REQUEST into the brain. In addition, the define a
-          # cell property on the request itself so that forms may
-          # use the 'cell' value (refer to get_value method in Form.py)
-          cell_request = brain.asContext( REQUEST = request
-                                        , form    = request.form
-                                        , cell    = brain
-                                        )
-          if editable_field.get_value('enabled', REQUEST=cell_request):
-            cell_html = editable_field.render( \
-                              value   = display_value
-                            , REQUEST = cell_request
-                            , key     = key
-                            )
-          else:
-            cell_html = ''
+        # We need a way to pass the current line object (ie. brain) to the
+        # field which is being displayed. Since the render_view API did not
+        # permit this, we use the 'cell' value to pass the line object.
+        request.set('cell', brain)
+        enabled = editable_field.get_value('enabled', REQUEST=request)
+        if enabled:
+          cell_html = editable_field.render(value=display_value,
+                                            REQUEST=request,
+                                            key=key)
+          if isinstance(cell_html, str):
+            cell_html = unicode(cell_html, encoding)
         else:
-          # If the brain does not support asContext (eg. it is None), no way
-          request.cell = self.getObject()
-          cell_request = brain
-          if editable_field.get_value('enabled', REQUEST=cell_request):
-            cell_html = editable_field.render( value   = display_value
-                                             , REQUEST = cell_request
-                                             , key     = key
-                                             )
-          else:
-            cell_html = ''
-
-        if isinstance(cell_html, str):
-          cell_html = unicode(cell_html, encoding)
+          cell_html = u''
 
         if url is None:
           html = cell_html + error_message
         else:
-          if editable_field.get_value('editable', REQUEST=cell_request):
+          if enabled:
             html = u'%s' % cell_html
           else:
             html = u'<a href="%s">%s</a>' % (url, cell_html)

Modified: erp5/trunk/products/ERP5Form/ParallelListField.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/ParallelListField.py?rev=31088&r1=31087&r2=31088&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/ParallelListField.py [utf8] (original)
+++ erp5/trunk/products/ERP5Form/ParallelListField.py [utf8] Fri Dec  4 17:35:10 2009
@@ -51,7 +51,7 @@
       Separation of items list is made with a Hash Script, which take 
       the items list in input, and return a list of dictionnaries.
 
-      Each dictionnary describes a (Multi)Listfield.
+      Each dictionnary describes a (Multi)ListField.
       The keys are:
         - key: 
             default: default
@@ -134,18 +134,17 @@
       REQUEST.set(KEYWORD % 'default', "")
       REQUEST.set(KEYWORD % 'first_item', 0)
       REQUEST.set(KEYWORD % 'items', sub_field_property_dict['item_list'])
+      sub_widget = self.sub_widget[sub_field_property_dict['field_type']]
       if sub_field_property_dict.get('editable', 1):
-        result = self.sub_widget[sub_field_property_dict['field_type']].render(
-                field,
-                field.generate_subfield_key(sub_field_property_dict['key'],
-                                            key=key),
-                sub_field_property_dict['value'],
-                REQUEST=REQUEST)
+        result = sub_widget.render(field,
+                                   field.generate_subfield_key(
+                                     sub_field_property_dict['key'], key=key),
+                                   sub_field_property_dict['value'],
+                                   REQUEST=REQUEST)
       else:
-        result = self.sub_widget[sub_field_property_dict['field_type']].render_view(
-                field,
-                sub_field_property_dict['value'],
-                REQUEST)
+        result = sub_widget.render_view(field,
+                                        sub_field_property_dict['value'],
+                                        REQUEST)
       for parameter in ('title', 'required', 'size', 'default', 'first_item',
                         'items'):
         # As it doesn't seem possible to delete value in the REQUEST,
@@ -155,63 +154,47 @@
 
 class ParallelListValidator(Validator.MultiSelectionValidator):
 
-  property_names = Validator.MultiSelectionValidator.property_names 
-
-  def __init__(self):
-    """
-    Generate some subvalidator used for rendering.
-    """
-    self.sub_validator = {
-      'ListField': Validator.SelectionValidatorInstance,
-      'MultiListField': Validator.MultiSelectionValidatorInstance,
-    }
-
-  def validate(self, field, key, REQUEST):    
-
+  property_names = Validator.MultiSelectionValidator.property_names
+
+  sub_validator = {
+    'ListField': Validator.SelectionValidatorInstance,
+    'MultiListField': Validator.MultiSelectionValidatorInstance,
+  }
+
+  def validate(self, field, key, REQUEST):
     result_list = []
-    hash_list = generateSubForm(field, field.get_value('default'), REQUEST)
-    is_sub_field_required = 0
+    hash_list = generateSubForm(field, (), REQUEST)
     for sub_field_property_dict in hash_list:
-      try:
-        sub_result_list = self.validate_sub_field(
-                                  field,
-                                  field.generate_subfield_key(
-                                      sub_field_property_dict['key'], 
-                                      validation=1, key=key),
-                                  REQUEST,
-                                  sub_field_property_dict)
-        if not isinstance(sub_result_list, (list, tuple)):
-          sub_result_list = [sub_result_list]
-        else:
-          sub_result_list = list(sub_result_list)
-        result_list.extend(sub_result_list)
-      except ValidationError:
-        is_sub_field_required = 1
-    
-    if result_list == []:
-      if field.get_value('required'):
-        self.raise_error('required_not_found', field)
-    else:
-      if is_sub_field_required:
-        self.raise_error('required_not_found', field)
+      id = field.generate_subfield_key(sub_field_property_dict['key'],
+                                       validation=1, key=key)
+      sub_result_list = self.validate_sub_field(field, id, REQUEST,
+                                                sub_field_property_dict)
+      if not isinstance(sub_result_list, (list, tuple)):
+        sub_result_list = [sub_result_list]
+      result_list.extend(sub_result_list)
     return result_list
 
   def validate_sub_field(self, field, id, REQUEST, sub_field_property_dict):
     """
     Validates a subfield (as part of field validation).
     """
-    for parameter in ('title', 'required', 'size'):
-      REQUEST.set(KEYWORD % parameter, sub_field_property_dict[parameter])
-    REQUEST.set(KEYWORD % 'default', "")
-    REQUEST.set(KEYWORD % 'items', sub_field_property_dict['item_list'])
-    result = self.sub_validator[sub_field_property_dict['field_type']].validate(
-        field, id, REQUEST)
-    for parameter in ('title', 'required', 'size', 'default', 'first_item',
-                      'items'):
-      # As it doesn't seem possible to delete value in the REQUEST,
-      # use a marker
-      REQUEST.set(KEYWORD % parameter, MARKER)
-    return result
+    try:
+      for parameter in ('title', 'required', 'size'):
+        REQUEST.set(KEYWORD % parameter, sub_field_property_dict[parameter])
+      REQUEST.set(KEYWORD % 'default', "")
+      REQUEST.set(KEYWORD % 'items', sub_field_property_dict['item_list'])
+      field_type = sub_field_property_dict['field_type']
+      if id[-5:] == ':list':
+        id = id[:-5]
+        field_type = 'Multi' + field_type
+        REQUEST.set(id, [x for x in REQUEST.get(id, ()) if x != ''])
+      return self.sub_validator[field_type].validate(field, id, REQUEST)
+    finally:
+      for parameter in ('title', 'required', 'size', 'default', 'first_item',
+                        'items'):
+        # As it doesn't seem possible to delete value in the REQUEST,
+        # use a marker
+        REQUEST.set(KEYWORD % parameter, MARKER)
 
 ParallelListWidgetInstance = ParallelListWidget()
 ParallelListFieldValidatorInstance = ParallelListValidator()
@@ -240,8 +223,8 @@
     return result
 
 def generateSubForm(self, value, REQUEST):
-  item_list = [x for x in self.get_value('items') \
-               if x not in (('',''), ['',''])]
+  item_list = [x for x in self.get_value('items', REQUEST)
+                 if x[0] != '' and x[1]]
 
   value_list = value
   if not isinstance(value_list, (list, tuple)):
@@ -249,37 +232,27 @@
 
   empty_sub_field_property_dict = {
     'key': 'default',
-    'title': self.get_value('title'),
-    'required': 0,
     'field_type': 'MultiListField',
     'item_list': [],
     'value': [],
     'is_right_display': 0,
-    'size': 5,
-    'editable' : self.get_value('editable', REQUEST=REQUEST)
   }
-
-  hash_list = []
-  hash_script_id = self.get_value('hash_script_id')
-  if hash_script_id not in [None, '']:
-    script = getattr(self, hash_script_id)
-    script_hash_list = script(
+  for property in 'title', 'size', 'required', 'editable':
+    empty_sub_field_property_dict[property] = self.get_value(property, REQUEST)
+
+  hash_script_id = self.get_value('hash_script_id', REQUEST)
+  if hash_script_id:
+    return getattr(self, hash_script_id)(
             item_list,
             value_list,
             default_sub_field_property_dict=empty_sub_field_property_dict,
             is_right_display=0)
-    hash_list.extend(script_hash_list)
   else:
     # No hash_script founded, generate a little hash_script 
     # to display only a MultiListField
-    default_sub_field_property_dict = empty_sub_field_property_dict.copy()
-    default_sub_field_property_dict.update({
-        'item_list': item_list,
-        'value': value_list,
-    })
-    hash_list.append(default_sub_field_property_dict)
-  return hash_list
-
+    empty_sub_field_property_dict['item_list'] = item_list
+    empty_sub_field_property_dict['value'] = value_list
+    return [empty_sub_field_property_dict]
 
 # Register get_value
 from Products.ERP5Form.ProxyField import registerOriginalGetValueClassAndArgument




More information about the Erp5-report mailing list