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

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Aug 10 15:03:17 CEST 2007


Author: yusei
Date: Fri Aug 10 15:03:17 2007
New Revision: 15600

URL: http://svn.erp5.org?rev=15600&view=rev
Log:
Improved to find appropriate proxy target and fixed a bug which
occured when obsolete variable remained in field.

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

Modified: erp5/trunk/products/ERP5Form/Form.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/Form.py?rev=15600&r1=15599&r2=15600&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/Form.py (original)
+++ erp5/trunk/products/ERP5Form/Form.py Fri Aug 10 15:03:17 2007
@@ -514,13 +514,17 @@
     manage_FTPput = PUT
 
     #Methods for Proxify tab.
-    security.declareProtected('View management screens', 'getAllFormFieldList')
-    def getAllFormFieldList(self):
-        """"""
+    security.declareProtected('View management screens', 'getFormFieldList')
+    def getFormFieldList(self):
+        """
+        find fields and forms which name ends with 'FieldLibrary' in
+        same skin folder.
+        """
         form_list = []
         def iterate(obj):
             for i in obj.objectValues():
-                if i.meta_type=='ERP5 Form':
+                if (i.meta_type=='ERP5 Form' and
+                    i.getId().endswith('FieldLibrary')):
                     form_id = i.getId()
                     form_path = '%s.%s' % (obj.getId(), form_id)
                     field_list = []
@@ -528,15 +532,9 @@
                                       '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_type, proxy_flag = get_field_meta_type_and_proxy_flag(field)
+                        if proxy_flag:
+                            field_type = '%s(Proxy)' % field_type
                         field_list.append({'field_object':field,
                                            'field_type':field_type,
                                            'proxy_flag':proxy_flag})
@@ -548,31 +546,109 @@
     security.declareProtected('View management screens', 'getProxyableFieldList')
     def getProxyableFieldList(self, field, form_field_list=None):
         """"""
+        def extract_keyword(name):
+            return [i for i in name.split('_') if not i in ('my', 'default')]
+
+        def check_keyword_list(name, keyword_list):
+            count = 0
+            for i in keyword_list:
+                if i in name:
+                    count += 1
+            return count/float(len(keyword_list))
+
+        def match(field_data):
+            if not field_data['field_type'].startswith(field.meta_type):
+                return 0
+            field_object = field_data['field_object']
+            if field_object.aq_base is field.aq_base:
+                return 0
+            field_id = field_object.getId()
+            if id_.startswith('my_') and not field_id.startswith('my_'):
+                return 0
+            return check_keyword_list(field_id, extract_keyword(id_))
+
+        def make_dict_list_append_function(dic, order_list):
+            def append(key, item):
+                if not key in order_list:
+                    order_list.append(key)
+                    dic[key] = []
+                dic[key].append(item)
+            return append
+
+        def add_default_field_library():
+            portal_url = getToolByName(self, 'portal_url')
+            portal = portal_url.getPortalObject()
+            portal_skins = getToolByName(self, 'portal_skins')
+
+            default_field_library_path = portal.getProperty('erp5_default_field_library_path', None)
+            if (not default_field_library_path or
+                len(default_field_library_path.split('.'))!=2):
+                return
+
+            skinfolder_id, form_id = default_field_library_path.split('.')
+
+            skinfolder = getattr(portal_skins, skinfolder_id, None)
+            default_field_library = getattr(skinfolder, form_id, None)
+            if default_field_library is None:
+                return
+
+            if not default_field_library_path in form_order:
+                for i in default_field_library.objectValues():
+                    field_meta_type, proxy_flag = get_field_meta_type_and_proxy_flag(i)
+                    if meta_type==field_meta_type:
+                        if proxy_flag:
+                            field_meta_type = '%s(Proxy' % field_meta_type
+                        matched_item = {'form_id':form_id,
+                                        'field_type':field_meta_type,
+                                        'field_object':i,
+                                        'proxy_flag':proxy_flag,
+                                        'matched_rate':0
+                                        }
+                        matched_append(default_field_library_path,
+                                       matched_item)
+
+        id_ = field.getId()
         meta_type = field.meta_type
+
         matched = {}
         form_order = []
+        matched_append = make_dict_list_append_function(matched, form_order)
+
+        perfect_matched = {}
+        perfect_matched_form_order = []
+        perfect_matched_append = make_dict_list_append_function(perfect_matched, perfect_matched_form_order)
 
         if form_field_list is None:
-            form_field_list = self.getAllFormFieldList()
+            form_field_list = self.getFormFieldList()
 
         for i in form_field_list:
             for data in i['field_list']:
-                if data['field_type'].startswith(meta_type):
+                tmp = []
+                matched_rate = match(data)
+                if matched_rate>=0.5:
                     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})
+
+                    matched_item = {'form_id':form_id,
+                                    'field_type':field_type,
+                                    'field_object':field_object,
+                                    'proxy_flag':proxy_flag,
+                                    'matched_rate':matched_rate
+                                    }
+                    if matched_rate==1:
+                        perfect_matched_append(form_path, matched_item)
+                    elif not perfect_matched:
+                        matched_append(form_path, matched_item)
+
+        if perfect_matched:
+            perfect_matched_form_order.sort()
+            return perfect_matched_form_order, perfect_matched
+
         form_order.sort()
+        add_default_field_library()
         return form_order, matched
 
     security.declareProtected('Change Formulator Forms', 'proxifyField')
@@ -655,15 +731,29 @@
 
             if target_field.meta_type=='ProxyField':
                 for i in new_values.keys():
-                    if (not i in target_field.delegated_list and
-                        is_equal(target_field.get_recursive_orig_value(i),
-                                 new_values[i])):
-                        del new_values[i]
+                    if not i in target_field.delegated_list:
+                        # obsolete variable check
+                        try:
+                            target_field.get_recursive_orig_value(i)
+                        except KeyError:
+                            # then `i` is obsolete!
+                            del new_values[i]
+                        else:
+                            if is_equal(target_field.get_recursive_orig_value(i),
+                                        new_values[i]):
+                                del new_values[i]
                 for i in new_tales:
-                    if (not i in target_field.delegated_list and
-                        is_equal(target_field.get_recursive_tales(i),
-                                 new_tales[i])):
-                        del new_tales[i]
+                    if not i in target_field.delegated_list:
+                        # obsolete variable check
+                        try:
+                            target_field.get_recursive_tales(i)
+                        except KeyError:
+                            # then `i` is obsolete!
+                            del new_tales[i]
+                        else:
+                            if is_equal(target_field.get_recursive_tales(i),
+                                        new_tales[i]):
+                                del new_tales[i]
 
             delegated_list = []
             for i in (new_values.keys()+new_tales.keys()):
@@ -682,6 +772,15 @@
     psyco.bind(__call__)
     psyco.bind(_exec)
 
+
+# utility function
+def get_field_meta_type_and_proxy_flag(field):
+    if field.meta_type=='ProxyField':
+        return field.getRecursiveTemplateField().meta_type, True
+    else:
+        return field.meta_type, False
+
+
 # More optimizations
 #psyco.bind(ERP5Field)
 # XXX Not useful, as we patch those methods in FormulatorPatch

Modified: erp5/trunk/products/ERP5Form/dtml/formProxify.dtml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/dtml/formProxify.dtml?rev=15600&r1=15599&r2=15600&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/dtml/formProxify.dtml (original)
+++ erp5/trunk/products/ERP5Form/dtml/formProxify.dtml Fri Aug 10 15:03:17 2007
@@ -1,7 +1,7 @@
 <dtml-var manage_page_header>
 <dtml-var manage_tabs>
 
-<dtml-let form_field_list=getAllFormFieldList>
+<dtml-let form_field_list=getFormFieldList>
 
 <p class="form-help">
 Proxify non-proxy fields.




More information about the Erp5-report mailing list