[Erp5-report] r15424 - in /erp5/trunk/products/ERP5Form: Form.py dtml/formProxify.dtml

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Aug 2 17:37:42 CEST 2007


Author: yusei
Date: Thu Aug  2 17:37:41 2007
New Revision: 15424

URL: http://svn.erp5.org?rev=15424&view=rev
Log:
Added proxify tab which can convert field to proxy field easily.

Added:
    erp5/trunk/products/ERP5Form/dtml/formProxify.dtml
Modified:
    erp5/trunk/products/ERP5Form/Form.py

Modified: erp5/trunk/products/ERP5Form/Form.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/Form.py?rev=15424&r1=15423&r2=15424&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/Form.py (original)
+++ erp5/trunk/products/ERP5Form/Form.py Thu Aug  2 17:37:41 2007
@@ -32,7 +32,7 @@
 from Products.Formulator.DummyField import fields
 from Products.Formulator.XMLToForm import XMLToForm
 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
-from Products.CMFCore.utils import _checkPermission
+from Products.CMFCore.utils import _checkPermission, getToolByName
 from Products.CMFCore.exceptions import AccessControl_Unauthorized
 from Products.ERP5Type import PropertySheet, Permissions
 
@@ -341,6 +341,11 @@
     # Declarative Security
     security = ClassSecurityInfo()
 
+    # Tabs in ZMI
+    manage_options = (ZMIForm.manage_options[:5] +
+                      ({'label':'Proxify', 'action':'formProxify'},)+
+                      ZMIForm.manage_options[5:])
+
     # Declarative properties
     property_sheets = ( PropertySheet.Base
                       , PropertySheet.SimpleItem)
@@ -351,6 +356,10 @@
     # This is a patched dtml formOrder
     security.declareProtected('View management screens', 'formOrder')
     formOrder = DTMLFile('dtml/formOrder', globals())
+
+    # Proxify form
+    security.declareProtected('View management screens', 'formProxify')
+    formProxify = DTMLFile('dtml/formProxify', globals())
 
     # Default Attributes
     pt = 'form_view'
@@ -503,6 +512,159 @@
 
     manage_FTPput = PUT
 
+    #Methods for Proxify tab.
+    security.declareProtected('View management screens', 'getAllFormFieldList')
+    def getAllFormFieldList(self):
+        """"""
+        form_list = []
+        def iterate(obj):
+            for i in obj.objectValues():
+                if i.meta_type=='ERP5 Form':
+                    form_id = i.getId()
+                    form_path = '%s.%s' % (obj.getId(), form_id)
+                    field_list = []
+                    form_list.append({'form_path':form_path,
+                                      'form_id':form_id,
+                                      'field_list':field_list})
+                    for field in i.objectValues():
+                        if field.meta_type=='ProxyField':
+                            template_field = field.getRecursiveTemplateField()
+                            template_meta_type = getattr(template_field,
+                                                         'meta_type', None)
+                            field_type = '%s(Proxy)' % template_meta_type
+                            proxy_flag = True
+                        else:
+                            field_type = field.meta_type
+                            proxy_flag = False
+                        field_list.append({'field_object':field,
+                                           'field_type':field_type,
+                                           'proxy_flag':proxy_flag})
+                if i.meta_type=='Folder':
+                    iterate(i)
+        iterate(getToolByName(self, 'portal_skins'))
+        return form_list
+
+    security.declareProtected('View management screens', 'getProxyableFieldList')
+    def getProxyableFieldList(self, field, form_field_list=None):
+        """"""
+        meta_type = field.meta_type
+        matched = {}
+        form_order = []
+
+        if form_field_list is None:
+            form_field_list = self.getAllFormFieldList()
+
+        for i in form_field_list:
+            for data in i['field_list']:
+                if data['field_type'].startswith(meta_type):
+                    form_path = i['form_path']
+                    form_id = i['form_id']
+                    field_type = data['field_type']
+                    field_object = data['field_object']
+                    if field.aq_base is field_object.aq_base:
+                        continue
+                    proxy_flag = data['proxy_flag']
+                    if not form_path in form_order:
+                        form_order.append(form_path)
+                        matched[form_path] = []
+                    matched[form_path].append({'form_id':form_id,
+                                               'field_type':field_type,
+                                               'field_object':field_object,
+                                               'proxy_flag':proxy_flag})
+        form_order.sort()
+        return form_order, matched
+
+    security.declareProtected('Change Formulator Forms', 'proxifyField')
+    def proxifyField(self, field_dict=None):
+        """Convert fields to proxy fields"""
+        from Products.ERP5Form.ProxyField import ProxyWidget
+        from Products.Formulator.MethodField import Method
+        from Products.Formulator.TALESField import TALESMethod
+
+        def copy(dict):
+            new_dict = {}
+            for key, value in dict.items():
+                if value=='':
+                    continue
+                if type(value) is Method:
+                    value = Method(value.method_name)
+                elif type(value) is TALESMethod:
+                    value = TALESMethod(value._text)
+                elif not isinstance(value, (str, unicode, int, long, bool,
+                                            list, tuple, dict)):
+                    raise ValueError, str(value)
+                new_dict[key] = value
+            return new_dict
+
+        def is_equal(a, b):
+            type_a = type(a)
+            type_b = type(b)
+            if type_a is not type_b:
+                return False
+            elif type_a is Method:
+                return a.method_name==b.method_name
+            elif type_a is TALESMethod:
+                return a._text==b._text
+            else:
+                return a==b
+
+        def remove_same_value(new_dict, target_dict):
+            for key, value in new_dict.items():
+                target_value = target_dict.get(key)
+                if is_equal(value, target_value):
+                    del new_dict[key]
+            return new_dict
+
+        def get_group_and_position(field_id):
+            for i in self.groups.keys():
+                if field_id in self.groups[i]:
+                    return i, self.groups[i].index(field_id)
+
+        def set_group_and_position(group, position, field_id):
+            self.field_removed(field_id)
+            self.groups[group].insert(position, field_id)
+            # Notify changes explicitly.
+            self.groups = self.groups
+
+        if field_dict is None:
+            return
+
+        for field_id in field_dict.keys():
+            target = field_dict[field_id]
+            target_form_id, target_field_id = target.split('.')
+
+            # keep current group and position.
+            group, position = get_group_and_position(field_id)
+
+            # create proxy field
+            old_field = getattr(self, field_id)
+            self.manage_delObjects(field_id)
+            self.manage_addField(id=field_id, title='', fieldname='ProxyField')
+            proxy_field = getattr(self, field_id)
+            proxy_field.values['form_id'] = target_form_id
+            proxy_field.values['field_id'] = target_field_id
+
+            target_field = proxy_field.getRecursiveTemplateField()
+
+            # copy data
+            new_values = remove_same_value(copy(old_field.values),
+                                           target_field.values)
+            new_tales = remove_same_value(copy(old_field.tales),
+                                          target_field.tales)
+
+            delegated_list = []
+            for i in (new_values.keys()+new_tales.keys()):
+                if not i in delegated_list:
+                    delegated_list.append(i)
+            proxy_field.values.update(new_values)
+            proxy_field.tales.update(new_tales)
+            proxy_field.delegated_list = delegated_list
+
+            # move back to the original group and position.
+            set_group_and_position(group, position, field_id)
+
+        return self.formProxify(manage_tabs_message='Changed')
+
     psyco.bind(__call__)
     psyco.bind(_exec)
 

Added: erp5/trunk/products/ERP5Form/dtml/formProxify.dtml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/dtml/formProxify.dtml?rev=15424&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Form/dtml/formProxify.dtml (added)
+++ erp5/trunk/products/ERP5Form/dtml/formProxify.dtml Thu Aug  2 17:37:41 2007
@@ -1,0 +1,63 @@
+<dtml-var manage_page_header>
+<dtml-var manage_tabs>
+
+<dtml-let form_field_list=getAllFormFieldList>
+
+<p class="form-help">
+Proxify non-proxy fields.
+</p>
+
+<form action="proxifyField" method="POST">
+
+<table border="2">
+<tr>
+<th>Id</th>
+<th>Type</th>
+<th>Proxy Target</th>
+</tr>
+
+<dtml-in objectValues sort=id>
+<dtml-let temp="getProxyableFieldList(_['sequence-item'], form_field_list)"
+          form_order="temp[0]"
+          matched="temp[1]">
+<tr>
+<td><a href="<dtml-var absolute_url>/manage_workspace"><dtml-var id></a></td>
+<td><dtml-var meta_type></td>
+<td>
+<select name="field_dict.<dtml-var id>:record:ignore_empty">
+<option value="" selected></option>
+
+<dtml-in form_order>
+<dtml-let form_path="_['sequence-item']"
+          matched_field_list="matched[form_path]">
+<optgroup label="<dtml-var form_path>">
+<dtml-in matched_field_list>
+<dtml-let item="_['sequence-item']"
+          form_id="item['form_id']"
+          field_object="item['field_object']"
+          field_id="field_object.getId()"
+          field_type="item['field_type']"
+          proxy_mark="item['proxy_flag'] and ' (Proxy)' or ''">
+<option value="<dtml-var "'%s.%s' % (form_id, field_id)">">
+<dtml-var "'%s%s' % (field_id, proxy_mark)">
+</option>
+</dtml-let>
+</dtml-in>
+</optgroup>
+</dtml-let>
+</dtml-in>
+</select>
+</td>
+</tr>
+
+</dtml-let>
+</dtml-in>
+</table>
+
+<input type="submit" value="Apply">
+
+</form>
+
+</dtml-let>
+
+<dtml-var manage_page_footer>




More information about the Erp5-report mailing list