From 4276247ea02df7d7368d59105986fb735144aa5f Mon Sep 17 00:00:00 2001 From: Yusei Tahara <yusei@nexedi.com> Date: Thu, 7 May 2009 07:27:16 +0000 Subject: [PATCH] 2009-05-07 yusei * Add SkinsTool_makeFieldLibraryAndProxifyAllField. This is a helper script to make a field library and proxify existing fields. But you still need to adjust by hand... git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@26868 20353a03-c40f-0410-a6d1-a30d3c3de9de --- ...ool_makeFieldLibraryAndProxifyAllField.xml | 401 ++++++++++++++++++ bt5/erp5_forge/bt/change_log | 3 + bt5/erp5_forge/bt/revision | 2 +- 3 files changed, 405 insertions(+), 1 deletion(-) create mode 100644 bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/SkinsTool_makeFieldLibraryAndProxifyAllField.xml diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/SkinsTool_makeFieldLibraryAndProxifyAllField.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/SkinsTool_makeFieldLibraryAndProxifyAllField.xml new file mode 100644 index 0000000000..86f3e03e7d --- /dev/null +++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/SkinsTool_makeFieldLibraryAndProxifyAllField.xml @@ -0,0 +1,401 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <tuple> + <global name="PythonScript" module="Products.PythonScripts.PythonScript"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>Script_magic</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>_bind_names</string> </key> + <value> + <object> + <klass> + <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>_asgns</string> </key> + <value> + <dictionary> + <item> + <key> <string>name_container</string> </key> + <value> <string>container</string> </value> + </item> + <item> + <key> <string>name_context</string> </key> + <value> <string>context</string> </value> + </item> + <item> + <key> <string>name_m_self</string> </key> + <value> <string>script</string> </value> + </item> + <item> + <key> <string>name_subpath</string> </key> + <value> <string>traverse_subpath</string> </value> + </item> + </dictionary> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>_body</string> </key> + <value> <string encoding="cdata"><![CDATA[ + +#\n +# This script helps you to make a field library and make all fields in your skin folder proxify by field library.\n +# But this cannot generate perfect field library. Please check the output and fix by hand.\n +#\n +# Parameters\n +#\n +# skin_folder_id : Target skin folder. This must be a copy of the original skin folder.\n +# field_library_id : Id of your new field library\n +# proxify : If True, then add a field library and make all fields proxify, else only display information what fields will be.\n +# \n +# CAUTION\n +# 1. Even proxify flag is False, this script unproxify all proxy fields in the skin folder you specified by skin_folder_id parameter.\n +#\n +# 2. Please add an external method(Base_getTALESMethodText). This is required to extract tales expression from TALESMethod instance.\n +# Due to security reason, this script is not provided by erp5_forge.\n +#\n +# sample code:\n +#\n +# def getTALESText(tales_method):\n +# return tales_method._text\n +#\n +\n +if not skin_folder_id.startswith(\'copy_of_\'):\n + raise ValueError, "Please make a copy and apply to the copy. skin_folder_id must start with \'copy_of_\'."\n +\n +\n +skin_folder = getattr(context.portal_skins, skin_folder_id)\n +core_field_library = context.erp5_core.Base_viewFieldLibrary\n +\n +for form in skin_folder.objectValues():\n + if (form.meta_type==\'ERP5 Form\' or form.meta_type==\'ERP5 Report\') and not form.getId().endswith(\'FieldLibrary\'):\n + field_dict = dict([(field.getId(), None) for field in form.getUnProxyableFieldList()])\n + form.unProxifyField(field_dict)\n +\n +field_list = []\n +for form in skin_folder.objectValues():\n + if form.meta_type==\'ERP5 Form\' and not form.getId().endswith(\'FieldLibrary\'):\n + field_list.extend(form.objectValues())\n +\n +form_field_list = []\n +for dict_ in core_field_library.getFormFieldList():\n + if ((dict_[\'form_path\'].startswith(\'erp5_core.\') or dict_[\'form_path\'].startswith(\'erp5_base.\'))\n + and dict_[\'form_id\'].startswith(\'Base_view\')):\n + form_field_list.append(dict_)\n +\n +def getMatchedTemplateField(field):\n + proxyable_field_list_data = core_field_library.getProxyableFieldList(field, form_field_list)\n +\n + proxyable_field_list_tmp = []\n + for id_ in proxyable_field_list_data[0]:\n + list_ = proxyable_field_list_data[1][id_]\n + for d in list_:\n + matched_rate = d[\'matched_rate\']\n + template_field = d[\'field_object\']\n + if matched_rate==0 and template_field.meta_type.lower()==\'\'.join(template_field.getId().split(\'_\')[1:]):\n + matched_rate = 0.1\n + proxyable_field_list_tmp.append(((matched_rate, field.id==template_field.id), template_field))\n +\n + proxyable_field_list_tmp.sort()\n + proxyable_field_list_tmp.reverse()\n + proxyable_field_list = [i[1] for i in proxyable_field_list_tmp]\n +\n + for template_field in proxyable_field_list:\n + if compare(field, template_field):\n + return template_field\n +\n +key_list_dict = {\n +\'FloatField\': (\'default\', \'input_style\', \'precision\'),\n +\'ListField\': (\'default\', \'items\'),\n +\'IntegerField\': (\'default\', ),\n +\'MultiRelationStringField\':(\'base_category\', \'catalog_index\'),\n +\'StringField\': (\'default\',),\n +\'TextAreaField\': (\'default\', \'width\', \'height\'),\n +\'RelationStringField\':(\'base_category\', \'catalog_index\'),\n +\'OOoChart\': (\'default\',),\n +\'DateTimeField\': (\'default\',),\n +\'ParallelListField\':(\'default\', \'items\'),\n +\'CheckBoxField\': (\'default\',),\n +\'FileField\': (\'default\',),\n +\'MultiListField\':(\'default\',\'items\'),\n +\'MatrixBox\':(),\n +\'ListBox\':(\'list_action\',),\n +\'LinesField\':(\'default\',),\n +\'ImageField\':(\'default\',),\n + }\n +\n +def getPropertyValue(field, key):\n + value = field.get_tales(key)\n + if value:\n + return context.Base_getTALESMethodText(value)\n + else:\n + return field.get_value(key) or None\n +\n +def compare(field, template_field):\n + # check your and your.\n + if not field.getId().startswith(\'your_\') and template_field.getId().startswith(\'your_\'):\n + return False\n + # check property\n + key_list = key_list_dict.get(field.meta_type)\n + if not key_list:\n + return False\n + for key in key_list:\n + if getPropertyValue(field, key)!=getPropertyValue(template_field, key):\n + return False\n + return True\n +\n +\n +\n +\n +\n +field_proxy_mapping_list = []\n +for field in field_list:\n + template_field = getMatchedTemplateField(field)\n + field_proxy_mapping_list.append((field.meta_type, field.getId(), template_field, field))\n +\n +field_proxy_mapping_list.sort()\n +\n +\n +\n +def getFieldLibraryDictAndFieldMappingList():\n + def findGenericFieldName(field):\n + # there are some generic fields in erp5_core\n + generic_field_dict = {\n + \'CheckBoxField\':\'my_checkbox\',\n + \'DateTimeField\':\'my_date\',\n + \'EmailField\':\'my_email\',\n + \'IntegerField\':\'my_integer_value\',\n + \'MultiRelationStringField\':\'my_multi_relation_field\',\n + \'PasswordField\':\'my_password\',\n + \'RelationStringField\':\'my_relation_field\',\n + \'EditorField\':\'my_text_content\',\n + \'PlanningBox\':\'planning_box\',\n + }\n + template_field_id = None\n +\n + # Special case 1\n + if meta_type==\'FloatField\':\n + if field.id.endswith(\'price\'):\n + template_field_id = \'my_money_quantity\'\n + elif field.id.endswith(\'quantity\'):\n + template_field_id = \'my_quantity\'\n + elif field.id.endswith(\'ratio\'):\n + template_field_id = \'my_percent\'\n + else:\n + template_field_id = \'my_float_field\'\n + # Special case 2\n + if meta_type==\'ListBox\':\n + if field.get_value(\'list_action\')==\'list\':\n + template_field_id = \'my_list_mode_listbox\'\n + else:\n + template_field_id = \'my_view_mode_listbox\'\n + elif meta_type in generic_field_dict:\n + template_field_id = generic_field_dict.get(field.meta_type)\n + elif makeFieldNameFromMetaType(meta_type) in core_field_library.objectIds():\n + template_field_id = makeFieldNameFromMetaType(meta_type)\n + return template_field_id\n +\n + def makeFieldNameFromMetaType(meta_type):\n + return \'my%s\' % \'\'.join([(i.isupper() and \'_%s\' % i.lower()) or i for i in meta_type])\n +\n + field_library_dict = {}\n + mapping_list = []\n +\n + for meta_type, id_, template_field, field in field_proxy_mapping_list:\n + template_field_id = None\n + if template_field is None:\n + template_field_id = findGenericFieldName(field) or makeFieldNameFromMetaType(meta_type)\n + template_form_id = core_field_library.getId()\n + else:\n + template_field_id = template_field.getId()\n + template_form_id = template_field.aq_parent.getId()\n + field_library_dict[template_field_id] = template_form_id\n + mapping_list.append((field, template_form_id, template_field_id))\n +\n + return field_library_dict, mapping_list\n +\n +\n +field_library_dict, mapping_list = getFieldLibraryDictAndFieldMappingList()\n +\n +\n +def showResult():\n + result = []\n + def output(text):\n + result.append(text)\n + output(\'<html><body>\')\n + output(\'<h1>Field Library</h1><table border=1>\')\n + for field_id, form_id in field_library_dict.items():\n + form = getattr(context, form_id)\n + template_field = getattr(form, field_id)\n + template_field_name = \'%s.%s\' % (form_id, field_id)\n + template_field_url = template_field.absolute_url()+\'/manage_main\'\n + output(\'<tr><td>%s</td><td><a href="%s">%s</a></td></tr>\' % (field_id, template_field_url, template_field_name))\n + output(\'</table>\')\n +\n + meta_type_field_list_dict = {}\n + for field, template_form_id, template_field_id in mapping_list:\n + if not field.meta_type in meta_type_field_list_dict:\n + meta_type_field_list_dict[field.meta_type] = []\n + meta_type_field_list_dict[field.meta_type].append((field, template_form_id, template_field_id))\n +\n + for meta_type in meta_type_field_list_dict:\n + output(\'<h1>%s</h1><table border=1>\' % meta_type)\n + for field, template_form_id, template_field_id in meta_type_field_list_dict[meta_type]:\n + field_url = field.absolute_url()+\'/manage_main\'\n + field_name = \'%s.%s\' % (field.aq_parent.getId(), field.getId())\n + template_field_url = getattr(getattr(context, template_form_id), template_field_id).absolute_url()+\'/manage_main\'\n + template_field_name = \'%s.%s\' % (template_form_id, template_field_id)\n + output(\'<tr><td><a href="%s">%s</a></td><td><a href="%s">%s</a></td></tr>\' % (field_url, field_name, template_field_url, template_field_name))\n + output(\'</table>\')\n +\n + output(\'</body></html>\')\n + return \'\'.join(result)\n +\n +\n +print showResult()\n +\n +\n +if proxify:\n +\n + field_library_form = None\n + if field_library_id in skin_folder.objectIds():\n + field_library_form = getattr(skin_folder, field_library_id, None)\n + if field_library_form is None:\n + skin_folder.manage_addProduct[\'ERP5Form\'].addERP5Form(id=field_library_id, title=\'\')\n + field_library_form = getattr(skin_folder, field_library_id, None)\n + for field_id, form_id in field_library_dict.items():\n + field_library_form.manage_addProduct[\'Formulator\'].manage_addField(id=field_id, title=\'\', fieldname=\'ProxyField\')\n + field = getattr(field_library_form, field_id)\n + field.manage_edit_xmlrpc(dict(form_id=form_id, field_id=field_id))\n +\n + for field, form_id, field_id in mapping_list:\n + form = field.aq_parent\n + form.proxifyField(field_dict={field.getId():\'%s.%s\' % (field_library_id, field_id)})\n +\n +\n +return printed\n + + +]]></string> </value> + </item> + <item> + <key> <string>_code</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>_params</string> </key> + <value> <string>skin_folder_id, field_library_id, proxify=False</string> </value> + </item> + <item> + <key> <string>errors</string> </key> + <value> + <tuple/> + </value> + </item> + <item> + <key> <string>func_code</string> </key> + <value> + <object> + <klass> + <global name="FuncCode" module="Shared.DC.Scripts.Signature"/> + </klass> + <tuple/> + <state> + <dictionary> + <item> + <key> <string>co_argcount</string> </key> + <value> <int>3</int> </value> + </item> + <item> + <key> <string>co_varnames</string> </key> + <value> + <tuple> + <string>skin_folder_id</string> + <string>field_library_id</string> + <string>proxify</string> + <string>_print_</string> + <string>_print</string> + <string>_getattr_</string> + <string>ValueError</string> + <string>getattr</string> + <string>context</string> + <string>skin_folder</string> + <string>core_field_library</string> + <string>_getiter_</string> + <string>form</string> + <string>dict</string> + <string>append</string> + <string>$append0</string> + <string>field</string> + <string>None</string> + <string>field_dict</string> + <string>field_list</string> + <string>form_field_list</string> + <string>dict_</string> + <string>_getitem_</string> + <string>compare</string> + <string>getMatchedTemplateField</string> + <string>key_list_dict</string> + <string>getPropertyValue</string> + <string>field_proxy_mapping_list</string> + <string>template_field</string> + <string>getFieldLibraryDictAndFieldMappingList</string> + <string>field_library_dict</string> + <string>mapping_list</string> + <string>showResult</string> + <string>field_library_form</string> + <string>field_id</string> + <string>form_id</string> + </tuple> + </value> + </item> + </dictionary> + </state> + </object> + </value> + </item> + <item> + <key> <string>func_defaults</string> </key> + <value> + <tuple> + <int>0</int> + </tuple> + </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>SkinsTool_makeFieldLibraryAndProxifyAllField</string> </value> + </item> + <item> + <key> <string>title</string> </key> + <value> <string>Field Library Creation Helper</string> </value> + </item> + <item> + <key> <string>warnings</string> </key> + <value> + <tuple/> + </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_forge/bt/change_log b/bt5/erp5_forge/bt/change_log index 783d816548..5bbc762c60 100644 --- a/bt5/erp5_forge/bt/change_log +++ b/bt5/erp5_forge/bt/change_log @@ -1,3 +1,6 @@ +2009-05-07 yusei +* Add SkinsTool_makeFieldLibraryAndProxifyAllField. This is a helper script to make a field library and proxify existing fields. But you still need to adjust by hand... + 2009-04-24 jerome * Add a utility script to check that all relation field defines proxy listbox id or columns diff --git a/bt5/erp5_forge/bt/revision b/bt5/erp5_forge/bt/revision index 7d4983b989..4754f24761 100644 --- a/bt5/erp5_forge/bt/revision +++ b/bt5/erp5_forge/bt/revision @@ -1 +1 @@ -458 \ No newline at end of file +461 \ No newline at end of file -- 2.30.9