[Erp5-report] r12052 - /erp5/trunk/products/ERP5Form/ListBox.py

nobody at svn.erp5.org nobody at svn.erp5.org
Sat Jan 13 10:55:59 CET 2007


Author: jp
Date: Sat Jan 13 10:55:57 2007
New Revision: 12052

URL: http://svn.erp5.org?rev=12052&view=rev
Log:
Fix bug #55

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

Modified: erp5/trunk/products/ERP5Form/ListBox.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/ListBox.py?rev=12052&r1=12051&r2=12052&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/ListBox.py (original)
+++ erp5/trunk/products/ERP5Form/ListBox.py Sat Jan 13 10:55:57 2007
@@ -37,6 +37,7 @@
 from Products.ERP5Type.Utils import getPath
 from Products.ERP5Type.Document import newTempBase
 from Products.CMFCore.utils import getToolByName
+from Products.CMFCore.utils import _checkPermission
 from Products.ZSQLCatalog.zsqlbrain import ZSQLBrain
 from Products.ERP5Type.Message import Message
 
@@ -1711,6 +1712,13 @@
 
   getUid = VolatileCachingMethod(getUid)
 
+  def getUrl(self):
+    """Return the absolute URL path of the object
+    """
+    return self.getBrain().getUrl()
+
+  getUrl = VolatileCachingMethod(getUrl)
+
   def isSummary(self):
     """Return whether this line is a summary or not.
     """
@@ -1894,6 +1902,19 @@
 
     html_list = []
 
+    # Check is there is a validation error at the level of the listbox
+    # as a whole. This will be required later to decide wherer to
+    # display values from (ie. from the REQUEST or from the object)
+    has_error = 0
+    for key in error_dict.keys():
+      for editable_id in editable_column_id_set:
+        candidate_field_key = "%s_%s" % (field_id, editable_id)
+        if key.startswith(candidate_field_key):
+          has_error = 1
+          break
+      if has_error:
+        break
+
     for (original_value, processed_value), (sql, title), alias \
       in zip(self.getValueList(), self.renderer.getSelectedColumnList(), self.renderer.getColumnAliasList()):
       # By default, no error.
@@ -1956,38 +1977,51 @@
       if editable_field is not None and sql in editable_column_id_set:
         # XXX what if the object does not have uid?
         key = '%s_%s' % (editable_field_id, self.getUid())
-        if error_dict.has_key(key):
-          error = True
+        widget_key = editable_field.generate_field_key(key=key)
+        if has_error: # If there is any error on listbox, we should use what the user has typed
+          display_value = None
+        else:
+          validated_value_dict = self.renderer.request.get(field_id, None)
+          if validated_value_dict is None:
+            # If this is neither an error nor a validated listbox
+            # we should use the original value
+            display_value = original_value
+          else:
+            # If the listbox has been validated (ie. as it is the
+            # case whenever a relation field displays a popup menu)
+            # we have to use the value entered by the user
+            display_value = None #
+        if error_dict.has_key(key): # If error on current field, we should display message
           error_text = error_dict[key].error_text
           error_text = cgi.escape(error_text)
           if isinstance(error_text, str):
             error_text = unicode(error_text, encoding)
           error_message = u'<br />' + error_text
-          widget_key = editable_field.generate_field_key(key=key)
-          error_value = self.renderer.request.get(widget_key, None)
         else:
           error_message = u''
-          error_value = None
-
-        # XXX this is a horrible hack.
-        if editable_field.meta_type in ('DateTimeField', 'ProxyField', ):
-          # XXX Some fields prefer None to ''.
+
+        if brain 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_html = editable_field.render( \
-                            value   = error_value or original_value
+                            value   = display_value
                           , REQUEST = brain.asContext( \
                                                REQUEST = self.renderer.request
                                              , form    = self.renderer.request.form
+                                             , cell    = self.getObject()
                                              )
                           , key     = key
                           )
         else:
-          # We use REQUEST which is not so good here.
-          # This prevents from using standard display process.
-          # XXX what does the above comment mean exactly? why don't we fix Formulator?
-          # XXX (JPS) - render_view does not get REQUEST - this breaks so many possibilities
-          REQUEST = get_request() # Dirtymax hack by JPS - render_view API update required
-          REQUEST.cell = self.getObject()
-          cell_html = editable_field.render( value   = error_value or original_value
+          # No brain, no way
+          self.renderer.request.cell = self.getObject()
+          cell_html = editable_field.render( value   = error_value or user_value or display_value
                                            , REQUEST = brain
                                            , key     = key
                                            )
@@ -2010,6 +2044,8 @@
         if url is None:
           html = processed_value
         else:
+          # JPS-XXX - I think we should not display a URL for objects
+          # which do not have the View permission
           html = u'<a href="%s">%s</a>' % (url, processed_value)
 
       html_list.append((html, original_value, error, editable_field))




More information about the Erp5-report mailing list