Commit b41f0737 authored by Jérome Perrin's avatar Jérome Perrin

Check fields uses existing scripts as external validator

If we rename a script used as external validator, we don't have way of detecting that this script might be used, so add to the "static checks" a check that for every field referencing an external validator, this validator can actually be traversed.

/reviewed-on nexedi/erp5!1031
parents bea28e78 c685c027
"""Print all field that uses non existing scripts as external_validator
"""
portal = context.getPortalObject()
restrictedTraverse = portal.restrictedTraverse
skins_tool = portal.portal_skins
for skin_name, skin_path_list in skins_tool.getSkinPaths():
skins_tool.changeSkin(skin_name)
for skin_folder in skin_path_list.split(','):
for form_path, form in skins_tool.ZopeFind(
skins_tool[skin_folder],
obj_metatypes=['ERP5 Form', 'ERP5 Report'],
search_sub=1,
):
for field in form.get_fields():
if field.meta_type == 'ProxyField':
if field.getRecursiveTemplateField(
) is None or field.get_recursive_tales('external_validator'):
continue
try:
external_validator = field.get_recursive_orig_value(
'external_validator')
except KeyError:
continue
else:
if field.get_tales('external_validator'):
continue
try:
external_validator = field.get_orig_value('external_validator')
except KeyError:
continue
if external_validator:
method_name = external_validator.getMethodName()
if restrictedTraverse(method_name, None) is None:
print "{form_path}/{field_id} uses an external validator non existant in {skin_name}: {method_name}".format(
form_path=form_path,
field_id=field.getId(),
skin_name=skin_name,
method_name=method_name,
)
return printed
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</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>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SkinsTool_checkFieldExternalValidator</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -216,6 +216,10 @@ class TestXHTMLMixin(ERP5TypeTestCase):
"Repeated listbox selection names:\n" +
portal_skins.SkinsTool_checkDuplicateSelectionName())
def test_SkinsTool_checkFieldExternalValidator(self):
self.assertFalse(
self.portal.portal_skins.SkinsTool_checkFieldExternalValidator())
def test_javascript_lint(self):
skins_tool = self.portal.portal_skins
path_list = []
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment