[Erp5-report] r10993 - in /erp5/trunk/products/ERP5Form: ./ dtml/

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Oct 27 17:26:41 CEST 2006


Author: romain
Date: Fri Oct 27 17:26:37 2006
New Revision: 10993

URL: http://svn.erp5.org?rev=10993&view=rev
Log:
ProxyField can now surcharged attributes from the template field.
The extra_context attribute is now be deprecated.

Added:
    erp5/trunk/products/ERP5Form/dtml/proxyFieldEdit.dtml
    erp5/trunk/products/ERP5Form/dtml/proxyFieldListHeader.dtml
    erp5/trunk/products/ERP5Form/dtml/proxyFieldTales.dtml
Modified:
    erp5/trunk/products/ERP5Form/Form.py
    erp5/trunk/products/ERP5Form/MultiRelationField.py
    erp5/trunk/products/ERP5Form/ProxyField.py
    erp5/trunk/products/ERP5Form/RelationField.py

Modified: erp5/trunk/products/ERP5Form/Form.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/Form.py?rev=10993&r1=10992&r2=10993&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/Form.py (original)
+++ erp5/trunk/products/ERP5Form/Form.py Fri Oct 27 17:26:37 2006
@@ -57,6 +57,7 @@
         self.tales = {}
 
     tales_expr = self.tales.get(id, "")
+    # tales_expr = self.get_tales(id)
     if tales_expr:
         REQUEST = get_request()
         form = self.aq_parent # XXX (JPS) form for default is wrong apparently in listbox - double check
@@ -109,6 +110,7 @@
             self.overrides = {}
 
         override = self.overrides.get(id, "")
+        # override = self.get_override(id)
         if override:
             # call wrapped method to get answer
             value = override.__of__(self)()

Modified: erp5/trunk/products/ERP5Form/MultiRelationField.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/MultiRelationField.py?rev=10993&r1=10992&r2=10993&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/MultiRelationField.py (original)
+++ erp5/trunk/products/ERP5Form/MultiRelationField.py Fri Oct 27 17:26:37 2006
@@ -62,7 +62,8 @@
                           'container_getter_id', 'catalog_index',
                           'relation_setter_id', 'columns', 'sort',
                           'parameter_list','list_method',
-                          'first_item', 'items', 'size', 'extra_item']
+                          'first_item', 'items', 'size', 'extra_item',
+                          ]
 
   property_names = Widget.LinesTextAreaWidget.property_names + \
                    Widget.TextWidget.property_names + \
@@ -548,6 +549,7 @@
             portal_type = relation_uid[len(NEW_CONTENT_PREFIX):]
             translated_portal_type = Message(domain='erp5_ui',
                                              message=portal_type)
+            # XXX Replace New by Add
             message = Message(
                     domain='erp5_ui', message='New ${portal_type}',
                     mapping={'portal_type': translated_portal_type})
@@ -766,15 +768,13 @@
   widget = MultiRelationStringFieldWidgetInstance
   validator = MultiRelationStringFieldValidatorInstance
 
-  security.declareProtected('Access contents information', 'get_value')
-  def get_value(self, id, **kw):
-    """
-    Get value for id.
-    Optionally pass keyword arguments that get passed to TALES
-    expression.
+  security.declareProtected('Access contents information', 'get_orig_value')
+  def get_orig_value(self, id):
+    """
+    Get value for id; don't do any override calculation.
     """
     if id in ('is_relation_field', 'is_multi_relation_field'):
       result = 1
     else:
-      result = ZMIField.get_value(self, id, **kw)
+      result = ZMIField.get_orig_value(self, id)
     return result

Modified: erp5/trunk/products/ERP5Form/ProxyField.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/ProxyField.py?rev=10993&r1=10992&r2=10993&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/ProxyField.py (original)
+++ erp5/trunk/products/ERP5Form/ProxyField.py Fri Oct 27 17:26:37 2006
@@ -2,6 +2,7 @@
 #
 # Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved.
 #                    Jean-Paul Smets <jp at nexedi.com>
+#                    Romain Courteaud <romain at nexedi.com>
 #
 # WARNING: This program as such is intended to be used by professional
 # programmers who take the whole responsability of assessing all potential
@@ -43,15 +44,16 @@
 from AccessControl import ClassSecurityInfo
 import string
 
-from zLOG import LOG, WARNING
+from zLOG import LOG, WARNING, DEBUG
 from Acquisition import aq_base, aq_inner, aq_acquire, aq_chain
+from Globals import DTMLFile
 
 class ProxyWidget(Widget.Widget):
   """
-      A widget that renders itself as a field from another form
-      after changing its title and id. It is recommended to define
-      a master form on which complex fields with a lot of TALES
-      are defined in order to minimize code duplication.
+  A widget that renders itself as a field from another form
+  after changing its title and id. It is recommended to define
+  a master form on which complex fields with a lot of TALES
+  are defined in order to minimize code duplication.
   """
 
   property_names = [
@@ -81,7 +83,7 @@
   # Remove it as soon as possible
   extra_context = fields.ListTextAreaField(
                                 'extra_context', 
-                                title='Extra Context', 
+                                title='Extra Context (deprecated)', 
                                 description='Additional context variables.',
                                 default=(), 
                                 required=0)
@@ -102,7 +104,7 @@
     proxy_field = field.getTemplateField()
     if proxy_field is not None:
       REQUEST = field.updateContext(REQUEST)
-      result = proxy_field.widget.render(proxy_field, key, value, REQUEST)
+      result = proxy_field.widget.render(field, key, value, REQUEST)
     return result
 
   def render_view(self, field, value):
@@ -112,7 +114,7 @@
     result = ''
     proxy_field = field.getTemplateField()
     if proxy_field is not None:
-      result = proxy_field.widget.render_view(proxy_field, value)
+      result = proxy_field.widget.render_view(field, value)
     return result
 
 class ProxyValidator(Validator.Validator):
@@ -125,7 +127,7 @@
     proxy_field = field.getTemplateField()
     REQUEST = field.updateContext(REQUEST)
     try:
-      result = proxy_field.validator.validate(proxy_field, key, REQUEST)
+      result = proxy_field.validator.validate(field, key, REQUEST)
     except ValidationError, error:
       error.field_id = field.id
       raise error
@@ -140,6 +142,184 @@
 
   widget = ProxyWidgetInstance
   validator = ProxyValidatorInstance
+
+  # methods screen
+  security.declareProtected('View management screens',
+                            'manage_main')
+  manage_main = DTMLFile('dtml/proxyFieldEdit', globals())
+
+  # tales screen
+  security.declareProtected('View management screens',
+                            'manage_talesForm')
+  manage_talesForm = DTMLFile('dtml/proxyFieldTales', globals())
+
+  # proxy field list header
+  security.declareProtected('View management screens', 'proxyFieldListHeader')
+  proxyFieldListHeader = DTMLFile('dtml/proxyFieldListHeader', globals())
+
+  security.declareProtected('Change Formulator Forms', 'manage_edit')
+  def manage_edit(self, REQUEST):
+    """
+    Surcharged values from proxied field.
+    """
+    # Edit template field attributes
+    template_field = self.getRecursiveTemplateField()
+    if template_field is not None:
+
+      # Check the surcharged checkboxes
+      surcharge_list = []
+      for group in template_field.form.get_groups():
+        for field in template_field.form.get_fields_in_group(group):
+          field_id = field.id
+          checkbox_key = "surcharge_%s" % field_id
+          if not REQUEST.has_key(checkbox_key):
+            surcharge_list.append(field_id)
+
+      try:
+        # validate the form and get results
+        result = template_field.form.validate(REQUEST)
+      except ValidationError, err:
+        if REQUEST:
+          message = "Error: %s - %s" % (err.field.get_value('title'),
+                                        err.error_text)
+          return self.manage_main(self, REQUEST,
+                                  manage_tabs_message=message)
+        else:
+          raise
+
+      self._surcharged_edit(result, surcharge_list)
+    
+    # Edit standards attributes
+    # XXX It is not possible to call ZMIField.manage_edit because
+    # it returns at the end...
+    # we need to had a parameter to the method
+    try:
+      # validate the form and get results
+      result = self.form.validate(REQUEST)
+    except ValidationError, err:
+      if REQUEST:
+        message = "Error: %s - %s" % (err.field.get_value('title'),
+                                      err.error_text)
+        return self.manage_main(self,REQUEST,
+                                manage_tabs_message=message)
+      else:
+        raise
+
+    self._edit(result)
+        
+    if REQUEST:
+      message="Content changed."
+      return self.manage_main(self, REQUEST,
+                              manage_tabs_message=message)
+
+  def _surcharged_edit(self, result, surcharge_list):
+    # first check for any changes  
+    values = self.values
+    # if we are in unicode mode, convert result to unicode
+    # acquire get_unicode_mode and get_stored_encoding from form..
+    if self.get_unicode_mode():
+      new_result = {}
+      for key, value in result.items():
+        if type(value) == type(''):
+          # in unicode mode, Formulator UI always uses UTF-8
+          value = unicode(value, 'UTF-8')
+        new_result[key] = value
+      result = new_result
+
+    changed = []
+    for key, value in result.items():
+      # XXX Remove old values
+      values.pop(key, None)
+      # store keys for which we want to notify change
+      if not values.has_key(key) or values[key] != value:
+        changed.append(key)
+
+    proxied_field = self.getTemplateField()
+    for key, value in result.items():
+      if key not in surcharge_list:
+        result.pop(key)
+
+    # now do actual update of values
+    values.update(result)
+    self.values = values
+    self.delegated_list = surcharge_list
+
+    # finally notify field of all changed values if necessary
+    for key in changed:
+      method_name = "on_value_%s_changed" % key
+      if hasattr(self, method_name):
+        getattr(self, method_name)(values[key])
+
+  security.declareProtected('Change Formulator Forms', 'manage_tales')
+  def manage_tales(self, REQUEST):
+    """
+    Surcharged talesfrom proxied field.
+    """
+    template_field = self.getRecursiveTemplateField()
+    if template_field is not None:
+
+      # Check the surcharged checkboxes
+      surcharge_list = []
+      for group in template_field.tales_form.get_groups():
+        for field in template_field.tales_form.get_fields_in_group(group):
+          field_id = field.id
+          checkbox_key = "surcharge_%s" % field_id
+          if not REQUEST.has_key(checkbox_key):
+            surcharge_list.append(field_id)
+
+
+      try:
+        # validate the form and get results
+        result = template_field.tales_form.validate(REQUEST)
+      except ValidationError, err:
+        if REQUEST:
+          message = "Error: %s - %s" % (err.field.get_value('title'),
+                                        err.error_text)
+          return self.manage_talesForm(self, REQUEST,
+                                       manage_tabs_message=message)
+        else:
+          raise
+
+      self._surcharged_tales(result, surcharge_list)
+
+    try:
+      # validate the form and get results
+      result = self.tales_form.validate(REQUEST)
+    except ValidationError, err:
+      if REQUEST:
+        message = "Error: %s - %s" % (err.field.get_value('title'),
+                                      err.error_text)
+        return self.manage_talesForm(self,REQUEST,
+                                     manage_tabs_message=message)
+      else:
+        raise
+
+    self._edit_tales(result)
+
+    
+    if REQUEST:
+      message="Content changed."
+      return self.manage_talesForm(self, REQUEST,
+                                            manage_tabs_message=message)
+
+  def _surcharged_tales(self, result, surcharge_list):
+    # first check for any changes  
+    tales = self.tales
+
+    changed = []
+    for key, value in result.items():
+      # XXX Remove old values
+      tales.pop(key, None)
+
+    proxied_field = self.getTemplateField()
+    for key, value in result.items():
+      if key not in surcharge_list:
+        result.pop(key)
+
+    # now do actual update of values
+    tales.update(result)
+    self.tales = tales
+    self.delegated_list = surcharge_list
 
   def getTemplateField(self):
     """
@@ -158,17 +338,88 @@
       proxy_field = None
     return proxy_field
 
-  def render_htmlgrid(self, value=None, REQUEST=None, key=None):
-    """
-    render_htmlgrid returns a list of tuple (title, html render)
-    We will use title generated by the widget.
-    """
-    result = ()
-    proxy_field = self.getTemplateField()
-    if proxy_field is not None :
-      result = proxy_field.render_htmlgrid(key=key, value=value,
-                                           REQUEST=REQUEST)
-    return result
+  def getRecursiveTemplateField(self):
+    """
+    Return template field of the proxy field.
+    This result must not be a ProxyField.
+    """
+    template_field = self.getTemplateField()
+    if template_field.__class__ == ProxyField:
+      return template_field.getTemplateField()
+    else:
+      return template_field
+
+  security.declareProtected('Access contents information', 
+                            'is_delegated')
+  def is_delegated(self, id):
+    """
+    Return true if we get the value from the proxied field.
+    No, if we surcharged the value on the proxy field.
+    """
+    # Update old proxied field
+    try:
+      if id in self.delegated_list:
+        return False
+      else:
+        return True
+    except AttributeError:
+      # Update old proxied field
+      self.delegated_list = []
+      return True
+
+  security.declareProtected('Access contents information', 
+                            'get_recursive_orig_value')
+  def get_recursive_orig_value(self, id, include=1):
+    """
+    Get value for id recursively.
+    """
+    if include and \
+      ((id in self.widget.property_names) or \
+       not self.is_delegated(id)):
+      return self.get_orig_value(id)
+    else:
+      proxied_field = self.getTemplateField()
+      if proxied_field.__class__ == ProxyField:
+        return proxied_field.get_recursive_orig_value(id)
+      else:
+        return proxied_field.get_orig_value(id)
+
+  security.declareProtected('View management screens', 'get_recursive_tales')
+  def get_recursive_tales(self, id, include=1):
+    """
+    Get tales expression method for id.
+    """
+    if include and \
+      ((id in self.widget.property_names) or \
+       not self.is_delegated(id)):
+      return self.get_tales(id)
+    else:
+      proxied_field = self.getTemplateField()
+      if proxied_field.__class__ == ProxyField:
+        return proxied_field.get_recursive_tales(id)
+      else:
+        return proxied_field.get_tales(id)
+    
+  # XXX Not implemented
+  security.declareProtected('View management screens', 'get_recursive_override')
+  def get_recursive_override(self, id):
+    """
+    Get override method for id (not wrapped).
+    """
+    return self.overrides.get(id, "")
+
+  security.declareProtected('View management screens', 'get_error_message')
+  def get_error_message(self, name):
+    """
+    """
+    try:
+      return self.message_values[name]
+    except KeyError:
+      proxied_field = self.getTemplateField()
+      if proxied_field is not None:
+        return proxied_field.get_error_message(name)
+      else:
+        return ZMIField.get_error_message(self, name)
 
   def updateContext(self, REQUEST):
     """
@@ -182,15 +433,20 @@
 
   security.declareProtected('Edit target', 'manage_edit_target')
   def manage_edit_target(self, REQUEST):
-      """ Edit target field of this proxy
-      """
-      proxy_field = self.getTemplateField()
-      if proxy_field:
-          url='/'.join((self.absolute_url(),self.get_value('form_id'),self.get_value('field_id'),'manage_main'))
-          REQUEST.RESPONSE.redirect(url)
-      else:
-          # FIXME: should show some error message ("form_id and field_id don't define a valid template")
-          pass
+    """ 
+    Edit target field of this proxy
+    """
+    proxy_field = self.getTemplateField()
+    if proxy_field:
+      url='/'.join((self.absolute_url(),
+                    self.get_value('form_id'),
+                    self.get_value('field_id'),
+                    'manage_main'))
+      REQUEST.RESPONSE.redirect(url)
+    else:
+      # FIXME: should show some error message 
+      # ("form_id and field_id don't define a valid template")
+      pass
 
   security.declareProtected('Access contents information', 'get_value')
   def get_value(self, id, **kw):
@@ -200,7 +456,8 @@
     expression.
     """
     result = None
-    if id in self.widget.property_names:
+    if (id in self.widget.property_names) or \
+       (not self.is_delegated(id)):
       result = ZMIField.get_value(self, id, **kw)
     else:
       proxy_field = self.getTemplateField()
@@ -214,7 +471,8 @@
     Return true if the field defines such a value.
     """
     result = None
-    if id in self.widget.property_names:
+    if (id in self.widget.property_names) or \
+       (not self.is_delegated(id)):
       result = ZMIField.has_value(self, id)
     else:
       proxy_field = self.getTemplateField()

Modified: erp5/trunk/products/ERP5Form/RelationField.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/RelationField.py?rev=10993&r1=10992&r2=10993&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/RelationField.py (original)
+++ erp5/trunk/products/ERP5Form/RelationField.py Fri Oct 27 17:26:37 2006
@@ -98,7 +98,7 @@
       _v_message_name_list.append(message_name)
       _v_dict[message_name] = 1
   message_names = _v_message_name_list
-
+  
   _v_dict = {}
   _v_property_name_list = []
   for property_name in property_names:
@@ -150,17 +150,15 @@
   widget = RelationStringFieldWidgetInstance
   validator = RelationStringFieldValidatorInstance
 
-  security.declareProtected('Access contents information', 'get_value')
-  def get_value(self, id, **kw):
+  security.declareProtected('Access contents information', 'get_orig_value')
+  def get_orig_value(self, id):
     """
-    Get value for id.
-    Optionally pass keyword arguments that get passed to TALES
-    expression.
+    Get value for id; don't do any override calculation.
     """
-    if id == 'is_relation_field':
+    if id == 'is_relation_field': 
       result = 1
     elif id == 'is_multi_relation_field':
       result = 0
     else:
-      result = ZMIField.get_value(self, id, **kw)
+      result = ZMIField.get_orig_value(self, id)
     return result

Added: erp5/trunk/products/ERP5Form/dtml/proxyFieldEdit.dtml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/dtml/proxyFieldEdit.dtml?rev=10993&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Form/dtml/proxyFieldEdit.dtml (added)
+++ erp5/trunk/products/ERP5Form/dtml/proxyFieldEdit.dtml Fri Oct 27 17:26:37 2006
@@ -1,0 +1,132 @@
+<dtml-var manage_page_header>
+<dtml-let help_product="'Formulator'" help_topic=meta_type>
+<dtml-var manage_tabs>
+</dtml-let>
+
+<p class="form-help">
+Surcharge <dtml-var meta_type> properties here.
+</p>
+
+<form action="manage_edit" method="POST">
+<table cellspacing="0" cellpadding="2" border="0">
+
+  <!-- First, display ProxyField properties -->
+  <!-- see: Formulator/dtml/fieldEdit.dtml -->
+  <dtml-in "form.get_groups()">
+  <dtml-let group=sequence-item fields="form.get_fields_in_group(group)">
+
+  <dtml-if fields>
+  <tr>
+  <td colspan="3" class="form-title">
+    Proxy Widget properties
+  </td>
+  </tr>
+  <dtml-var fieldListHeader>
+  <dtml-let current_field="this()">
+  <dtml-in fields>
+  <dtml-let field=sequence-item field_id="field.id"
+            value="current_field.get_orig_value(field_id)"
+            override="current_field.get_override(field_id)"
+            tales="current_field.get_tales(field_id)">
+    <tr>
+      <td align="left" valign="top">
+      <div class="form-label">
+      <dtml-if "tales or override">[</dtml-if><dtml-var "field.title()"><dtml-if "field.has_value('required') and field.get_value('required')">*</dtml-if><dtml-if "tales or override">]</dtml-if>
+      </div>
+      </td>
+      <td align="left" valign="top">
+      <dtml-var "field.render(value)">
+      </td>
+      <td><div class="form-element">
+      <dtml-var "field.meta_type">
+      </div></td>
+    </tr>
+  </dtml-let>
+  </dtml-in>
+  </dtml-let>
+  </dtml-if>
+  </dtml-let>
+  </dtml-in>
+
+
+<!-- Then, display Template Field properties -->
+<dtml-let proxy_field="this()"
+          current_field="proxy_field.getRecursiveTemplateField()">
+  
+  <dtml-if "current_field is not None">
+    <dtml-let form="current_field.form">
+
+  <dtml-in "form.get_groups()">
+    <dtml-let group=sequence-item fields="form.get_fields_in_group(group)">
+      <dtml-if fields>
+        <tr>
+          <td colspan="3" class="form-title">
+            <dtml-var "_.string.capitalize(group)"> properties
+          </td>
+        </tr>
+
+        <dtml-var proxyFieldListHeader>
+
+        <dtml-in fields>
+        <dtml-let field=sequence-item field_id="field.id"
+                  value="proxy_field.get_recursive_orig_value(field_id)"
+                  override="proxy_field.get_recursive_override(field_id)"
+                  tales="proxy_field.get_recursive_tales(field_id)">
+          <tr>
+            <td align="left" valign="top">
+              <dtml-let checkbox_key="'surcharge_%s' % field_id" >
+                <dtml-if "proxy_field.is_delegated(field_id)">
+                  <input type="checkbox" 
+                         name="<dtml-var checkbox_key>" 
+                         checked="checked" />
+                <dtml-else >
+                  <input type="checkbox" 
+                         name="<dtml-var checkbox_key>" />
+                </dtml-if >
+              </dtml-let >
+            </td>
+            <td align="left" valign="top">
+            <div class="form-label">
+              <dtml-if "tales or override">[
+                </dtml-if>
+                <dtml-var "field.title()">
+                <dtml-if "field.has_value('required') and field.get_value('required')">*
+                </dtml-if>
+                <dtml-if "tales or override">]
+              </dtml-if>
+            </div>
+            </td>
+            <td align="left" valign="top">
+            <dtml-var "field.render(value)">
+            </td>
+            <td><div class="form-element">
+            <dtml-var "field.meta_type">
+            </div></td>
+          </tr>
+        </dtml-let>
+        </dtml-in>
+      </dtml-if>
+    </dtml-let>
+  </dtml-in>
+
+  </dtml-let>
+  </dtml-if>
+  </dtml-let>
+
+    <tr>
+      <td align="left" valign="top">
+      <div class="form-element">
+      <input class="form-element" type="submit" name="submit" 
+       value="Save Changes" /> 
+      </div>
+      </td>
+    </tr>
+
+
+
+</table>
+</form>
+
+
+
+<dtml-var manage_page_footer>

Added: erp5/trunk/products/ERP5Form/dtml/proxyFieldListHeader.dtml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/dtml/proxyFieldListHeader.dtml?rev=10993&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Form/dtml/proxyFieldListHeader.dtml (added)
+++ erp5/trunk/products/ERP5Form/dtml/proxyFieldListHeader.dtml Fri Oct 27 17:26:37 2006
@@ -1,0 +1,22 @@
+<tr class="list-header">
+  <td align="left" valign="top">
+  <div class="form-label">
+  Delegated
+  </div>
+  </td>
+  <td align="left" valign="top">
+  <div class="form-label">
+  Name
+  </div>
+  </td>
+  <td align="left" valign="top">
+  <div class="form-label">
+  Value
+  </div>
+  </td>
+  <td align="left" valign="top">
+  <div class="form-label">
+  Field
+  </div>
+  </td>
+</tr>

Added: erp5/trunk/products/ERP5Form/dtml/proxyFieldTales.dtml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/dtml/proxyFieldTales.dtml?rev=10993&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Form/dtml/proxyFieldTales.dtml (added)
+++ erp5/trunk/products/ERP5Form/dtml/proxyFieldTales.dtml Fri Oct 27 17:26:37 2006
@@ -1,0 +1,139 @@
+<dtml-var manage_page_header>
+<dtml-var manage_tabs>
+
+<p class="form-help">
+Edit <dtml-var meta_type> method TALES expressions here.
+<dtml-if "not isTALESAvailable()"><br>
+<span style="color: #FF0000;">
+Zope Page Templates and therefore TALES is not installed.
+This tab can therefore not be used.
+</span>
+</dtml-if>
+</p>
+
+
+<form action="manage_tales" method="POST">
+<table cellspacing="0" cellpadding="2" border="0">
+
+
+  <dtml-in "override_form.get_groups()">
+  <dtml-let group=sequence-item fields="tales_form.get_fields_in_group(group)">
+
+  <dtml-if fields>
+  <tr>
+  <td colspan="3" class="form-title">
+    Proxy Widget properties
+  </td>
+  </tr>
+
+  <dtml-var fieldListHeader>
+
+  <dtml-let current_field="this()">
+  <dtml-in fields>
+  <dtml-let field=sequence-item field_id="field.id"
+            value="current_field.get_tales(field.id)">
+    <tr>
+      <td align="left" valign="top">
+      <div class="form-label">
+      <dtml-var "field.title()">
+      </div>
+      </td>
+      <td align="left" valign="top">
+      <dtml-var "field.render(value)">
+      </td>
+      <td><div class="form-element">
+      <dtml-var "current_field.form.get_field(field.id).meta_type">
+      </div></td>
+    </tr>
+  </dtml-let>
+  </dtml-in>
+  </dtml-let>
+  </dtml-if>
+  </dtml-let>
+  </dtml-in>
+
+
+
+
+<!-- XXX Loop until find not a proxy field -->
+<dtml-let proxy_field="this()"
+          current_field="proxy_field.getRecursiveTemplateField()">
+
+  <dtml-if "current_field is not None">
+    <dtml-let form="current_field.tales_form">
+
+  <dtml-in "form.get_groups()">
+    <dtml-let group=sequence-item fields="form.get_fields_in_group(group)">
+      <dtml-if fields>
+        <tr>
+          <td colspan="3" class="form-title">
+            <dtml-var "_.string.capitalize(group)"> properties
+          </td>
+        </tr>
+
+        <dtml-var proxyFieldListHeader>
+
+        <dtml-in fields>
+
+
+          <dtml-let field=sequence-item field_id="field.id"
+                    value="proxy_field.get_recursive_tales(field_id)">
+            <tr>
+              <td align="left" valign="top">
+                <dtml-let checkbox_key="'surcharge_%s' % field_id" >
+                  <dtml-if "proxy_field.is_delegated(field_id)">
+                    <input type="checkbox" 
+                           name="<dtml-var checkbox_key>" 
+                           checked="checked" />
+                  <dtml-else >
+                    <input type="checkbox" 
+                           name="<dtml-var checkbox_key>" />
+                  </dtml-if >
+                </dtml-let >
+              </td>
+
+
+
+              <td align="left" valign="top">
+              <div class="form-label">
+              <dtml-var "field.title()">
+              </div>
+              </td>
+              <td align="left" valign="top">
+              <dtml-var "field.render(value)">
+              </td>
+              <td><div class="form-element">
+              <dtml-var "current_field.form.get_field(field.id).meta_type">
+              </div></td>
+            </tr>
+          </dtml-let>
+
+        </dtml-in>
+
+      </dtml-if>
+    </dtml-let>
+  </dtml-in>
+
+  </dtml-let>
+  </dtml-if>
+  </dtml-let>
+
+  <tr>
+    <td align="left" valign="top">
+    <div class="form-element">
+    <input class="form-element" type="submit" name="submit" 
+     value="Save Changes" /> 
+    </div>
+    </td>
+  </tr>
+
+
+</table>
+</form>
+
+
+
+<dtml-var manage_page_footer>
+
+
+




More information about the Erp5-report mailing list