[Erp5-report] r19312 - /erp5/trunk/products/ERP5Catalog/CatalogTool.py

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Feb 14 16:15:38 CET 2008


Author: vincent
Date: Thu Feb 14 16:15:37 2008
New Revision: 19312

URL: http://svn.erp5.org?rev=19312&view=rev
Log:
Minor speed improvements:
Rename some variables which had too-generic names.
Use a set instead of a list when used with "in".
Use a set instead of a value-less dict.
Use string slice instead of "tsartswith" method.
Use 'iter...' variations of dictiteration methods.
Use 'itervalues' instead of 'iteritems' + item lookup by key.
Do not check if a role to skip is already present in new role list.
Fetch instance methods just once when called in a loop.

Modified:
    erp5/trunk/products/ERP5Catalog/CatalogTool.py

Modified: erp5/trunk/products/ERP5Catalog/CatalogTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Catalog/CatalogTool.py?rev=19312&r1=19311&r2=19312&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Catalog/CatalogTool.py (original)
+++ erp5/trunk/products/ERP5Catalog/CatalogTool.py Thu Feb 14 16:15:37 2008
@@ -54,6 +54,7 @@
 import os, time, urllib, warnings
 import sys
 from zLOG import LOG, PROBLEM, WARNING, INFO
+import sets
 
 SECURITY_USING_NUX_USER_GROUPS, SECURITY_USING_PAS = range(2)
 try:
@@ -115,11 +116,6 @@
         withnuxgroups = security_product == SECURITY_USING_NUX_USER_GROUPS
         withpas = security_product == SECURITY_USING_PAS
 
-        allowed = {}
-        for r in rolesForPermissionOn('View', ob):
-          allowed[r] = 1
-        if 'Owner' in allowed:
-          del allowed['Owner']
         if withnuxgroups:
           localroles = mergedLocalRoles(ob, withgroups=1)
         elif withpas:
@@ -132,35 +128,41 @@
         # roles acquired on the parent of the parent....]
         # So if we have ['-Author','Author'] we should remove the role 'Author'
         # but if we have ['Author','-Author'] we have to keep the role 'Author'
-        new_dict = {}
-        for key in localroles.keys():
-          new_list = []
-          remove_list = []
-          for role in localroles[key]:
-            if role.startswith('-'):
-              if not role[1:] in new_list and not role[1:] in remove_list:
-                remove_list.append(role[1:])
-            elif not role in remove_list:
-              new_list.append(role)
-          if len(new_list)>0:
-            new_dict[key] = new_list
-        localroles = new_dict
+        flat_localroles = {}
+        skip_role_set = sets.Set()
+        skip_role = skip_role_set.add
+        clear_skip_role = skip_role_set.clear
+        for key, role_list in localroles.iteritems():
+          new_role_list = []
+          new_role = new_role_list.append
+          clear_skip_role()
+          for role in role_list:
+            if role[:1] == '-':
+              skip_role(role[1:])
+            elif role not in skip_role_set:
+              new_role(role)
+          if len(new_role_list)>0:
+            flat_localroles[key] = new_role_list
+        localroles = flat_localroles
         # For each local role of a user:
         #   If the local role grants View permission, add it.
         # Every addition implies 2 lines:
         #   user:<user_id>
         #   user:<user_id>:<role_id>
         # A line must not be present twice in final result.
+        allowed = sets.Set(rolesForPermissionOn('View', ob))
+        allowed.discard('Owner')
+        add = allowed.add
         for user, roles in localroles.iteritems():
           if withnuxgroups:
             prefix = user
           else:
             prefix = 'user:' + user
           for role in roles:
-            if allowed.has_key(role):
-              allowed[prefix] = 1
-              allowed[prefix + ':' + role] = 1
-        return list(allowed.keys())
+            if role in allowed:
+              add(prefix)
+              add(prefix + ':' + role)
+        return list(allowed)
 
 class RelatedBaseCategory(Method):
     """A Dynamic Method to act as a related key.




More information about the Erp5-report mailing list