[Erp5-report] r32831 jp - /erp5/trunk/products/ERP5Type/CodingStyle.py

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Feb 19 07:29:09 CET 2010


Author: jp
Date: Fri Feb 19 07:29:08 2010
New Revision: 32831

URL: http://svn.erp5.org?rev=32831&view=rev
Log:
Initial upload of coding style methods and monkey patches. The idea is to provide a checkConsistency method for all skin folder items until they become all ERP5Type documents.

Added:
    erp5/trunk/products/ERP5Type/CodingStyle.py

Added: erp5/trunk/products/ERP5Type/CodingStyle.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/CodingStyle.py?rev=32831&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Type/CodingStyle.py (added)
+++ erp5/trunk/products/ERP5Type/CodingStyle.py [utf8] Fri Feb 19 07:29:08 2010
@@ -1,0 +1,133 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2010 Nexedi SA and Contributors. All Rights Reserved.
+#          Jean-Paul Smets <jp at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+from Products.ERP5Type.ObjectMessage import ObjectMessage
+from Products.ERP5Type import Permissions
+
+# Define legacy calls which are superceded by new calls
+def getLegacyCallableIdItemList(self):
+  return (
+      ('WebSection_getPermanentURLForView', 'getPermanentURL'),
+    )
+
+# Define acceptable prefix list for skin folder items
+skin_prefix_list = None
+def getSkinPrefixList(self):
+  """
+  Return the list of acceptable prefix. Cache the result.
+
+  TODO: make the cache more efficient (read-only transaction
+  cache)
+  """
+  global skin_prefix_list
+  if skin_prefix_list:
+    return skin_prefix_list
+
+  portal = self.getPortalObject()
+
+  # Add portal types prefix
+  portal_types = portal.portal_types
+  skin_prefix_list = []
+  for portal_type in portal_types.contentValues():
+    portal_prefix = portal_type.getId().replace(' ', '')
+    skin_prefix_list.append(portal_prefix)
+
+  # Add document classes prefix
+  from Products.ERP5Type import Document
+  for document_class in Document.__dict__.keys():
+    if not document_class.startswith('add') and \
+        not document_class.startswith('new') and \
+        not document_class.startswith('_'):
+      skin_prefix_list.append(document_class)
+
+  # Add interfaces prefix
+  from Products.ERP5Type import interfaces
+  for interface_name in interfaces.__dict__.keys():
+    if interface_name.startswith('I'):
+      skin_prefix_list.append(interface_name)
+
+  # Add other prefix
+  skin_prefix_list.extend((
+    'Base',
+    'Entity',
+    'NotificationTool',
+    'ERP5Site',
+    'ERP5Type',
+  ))
+
+  skin_prefix_list = set(skin_prefix_list)
+  return skin_prefix_list
+
+# Generic method to check consistency of a skin item
+def checkConsistency(self, source_code=None):
+  """
+  Make sure skin folder item has appropriate prefix
+  and that its source code, if any, does not contain
+  calls to legacy methods
+  """
+  message_list = []
+  portal_path = self.getPortalObject().getPath()
+  portal_path_len = len(portal_path)
+
+  # Make sure id is acceptable
+  document_id = self.id
+  if document_id != document_id.lower():
+    # Only test prefix with big caps
+    prefix = document_id.split('_')[0]
+    if prefix not in getSkinPrefixList(self):
+      message_list.append(
+        ObjectMessage(object_relative_url='/'.join(self.getPhysicalPath())[portal_path_len:],
+                      message='Wrong prefix %s' % prefix))
+
+  # Make sure source code does not contain legacy callables
+  if source_code:
+    for legacy_string, new_string in getLegacyCallableIdItemList(self):
+      if source_code.find(legacy_string) >= 0:
+        message_list.append(
+          ObjectMessage(object_relative_url='/'.join(self.getPhysicalPath())[portal_path_len:],
+                        message='Source code contains legacy call to %s' % legacy_string))
+  
+  return message_list
+
+# Add checkConsistency to Python Scripts
+def checkPythonScriptConsistency(self):
+  return checkConsistency(self, source_code=self.body())
+
+from Products.PythonScripts.PythonScript import PythonScript
+PythonScript.checkConsistency= checkPythonScriptConsistency
+PythonScript.checkConsistency__roles__ = ('Manager',) # A hack to protect the method
+
+# Add checkConsistency to Page Templates
+def checkPageTemplateConsistency(self):
+  return checkConsistency(self, source_code=self.read())
+
+from Products.PageTemplates.PageTemplate import PageTemplate
+PageTemplate.checkConsistency= checkPageTemplateConsistency
+PageTemplate.checkConsistency__roles__ = ('Manager',) # A hack to protect the method
+




More information about the Erp5-report mailing list