[Erp5-report] r11111 - in /erp5/trunk/products/ERP5/Document: WebSection.py WebSite.py

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Nov 6 11:57:21 CET 2006


Author: bartek
Date: Mon Nov  6 11:57:21 2006
New Revision: 11111

URL: http://svn.erp5.org?rev=11111&view=rev
Log:
Accelerated version of aq_dynamic with better support for URLs in editable_mode. Still a quick hack. Refactoring needed to prevent code duplication

Modified:
    erp5/trunk/products/ERP5/Document/WebSection.py
    erp5/trunk/products/ERP5/Document/WebSite.py

Modified: erp5/trunk/products/ERP5/Document/WebSection.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/WebSection.py?rev=11111&r1=11110&r2=11111&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/WebSection.py (original)
+++ erp5/trunk/products/ERP5/Document/WebSection.py Mon Nov  6 11:57:21 2006
@@ -37,6 +37,9 @@
 
 from zLOG import LOG
 
+from Products.ERP5.Document.WebSite import reserved_name_dict, reserved_name_dict_init, CACHE_KEY, WEBSITE_USER
+WEBSECTION_KEY = 'web_section_value'
+
 class WebSection(Domain):
     """
       A Web Section is a Domain with an extended API intended to
@@ -74,3 +77,69 @@
       #"""
       #return self
 
+    def _aq_dynamic(self, name):
+      """
+        Try to find a suitable document based on the
+        web site local naming policies as defined by
+        the WebSite_getDocumentValue script
+      """
+      global reserved_name_dict_init
+      global reserved_name_dict
+      request = self.REQUEST
+      # Register current web site physical path for later URL generation
+      if not request.has_key(WEBSECTION_KEY):
+        request[WEBSECTION_KEY] = self.getPhysicalPath()
+        # Normalize web parameter in the request
+        # Fix common user mistake and transform '1' string to boolean
+        for web_param in ['ignore_layout', 'editable_mode']:
+          if hasattr(request, web_param):
+            if getattr(request, web_param, None) in ('1', 1, True):
+              request.set(web_param, True)
+            else:
+              request.set(web_param, False)
+      # First let us call the super method
+      dynamic = Domain._aq_dynamic(self, name)
+      if dynamic is not None:
+        return dynamic
+      # Do some optimisation here for names which can not be names of documents
+      if  reserved_name_dict.has_key(name) \
+          or name.startswith('_') or name.startswith('portal_')\
+          or name.startswith('aq_') or name.startswith('selection_') \
+          or name.startswith('sort-') or name.startswith('WebSite_') \
+          or name.startswith('WebSection_') or name.startswith('Base_'):
+        return None
+      if not reserved_name_dict_init:
+        # Feed reserved_name_dict_init with skin names
+        portal = self.getPortalObject()
+        for skin_folder in portal.portal_skins.objectValues():
+          for id in skin_folder.objectIds():
+            reserved_name_dict[id] = 1
+        for id in portal.objectIds():
+          reserved_name_dict[id] = 1
+        reserved_name_dict_init = 1
+      #LOG('aq_dynamic name',0, name)
+      if not request.has_key(CACHE_KEY):
+        request[CACHE_KEY] = {}
+      elif request[CACHE_KEY].has_key(name):
+        return request[CACHE_KEY][name]
+      try:
+        portal = self.getPortalObject()
+        # Use the webmaster identity to find documents
+        if request[CACHE_KEY].has_key(WEBSITE_USER):
+          user = request[CACHE_KEY][WEBSITE_USER] # Retrieve user from request cache
+        else:
+          user = portal.acl_users.getUserById(self.getWebmaster())
+          request[CACHE_KEY][WEBSITE_USER] = user # Cache user per request
+        if user is not None:
+          old_manager = getSecurityManager()
+          newSecurityManager(get_request(), user)
+        document = self.WebSite_getDocumentValue(portal, name)
+        request[CACHE_KEY][name] = document
+        if user is not None:
+          setSecurityManager(old_manager)
+      except:
+        # Cleanup non recursion dict in case of exception
+        if request[CACHE_KEY].has_key(name):
+          del request[CACHE_KEY][name]
+        raise
+      return document

Modified: erp5/trunk/products/ERP5/Document/WebSite.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/WebSite.py?rev=11111&r1=11110&r2=11111&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/WebSite.py (original)
+++ erp5/trunk/products/ERP5/Document/WebSite.py Mon Nov  6 11:57:21 2006
@@ -46,9 +46,9 @@
 
 from zLOG import LOG
 
-
-
 WEBSITE_KEY = 'web_site_value'
+WEBSECTION_KEY = 'web_section_value'
+WEBSITE_USER = 'web_site_user'
 
 class WebSiteTraversalHook(Persistent):
   """
@@ -67,7 +67,7 @@
     if type(path) is type(''):
       path = path.split( '/')
 
-    website_path = self._v_request.get(WEBSITE_KEY, None)
+    website_path = self._v_request.get(WEBSECTION_KEY, self._v_request.get(WEBSITE_KEY, None))
     if website_path:
       website_path = tuple(website_path)    # Make sure all path are tuples
       path = tuple(path)                    # Make sure all path are tuples
@@ -110,6 +110,19 @@
 
 # Use a request key to store access attributes and prevent infinite recursion
 CACHE_KEY = 'web_site_aq_cache'
+reserved_name_dict = { 'getApplicableLayout' : 1,
+                       'getLayout' : 1,
+                       'Localizer' : 1,
+                       'field_render' : 1,
+                       'getListItemUrl' : 1,
+                       'getLocalPropertyManager' : 1,
+                       'getOrderedGlobalActionList' : 1,
+                       'allow_discussion' : 1,
+                       'im_func' : 1,
+                       'id' : 1,
+                       'method_id' : 1,
+                       'role_map' : 1,  }
+reserved_name_dict_init = 0
 
 class WebSite(Domain):
     """
@@ -171,28 +184,41 @@
         web site local naming policies as defined by
         the WebSite_getDocumentValue script
       """
+      global reserved_name_dict_init
+      global reserved_name_dict
       request = self.REQUEST
-      # Normalize web parameter in the request
-      # Fix common user mistake and transform '1' string to boolean
-      for web_param in ['ignore_layout', 'editable_mode']:
-        if hasattr(request, web_param):
-          if getattr(request, web_param, None) in ('1', 1, True):
-            request.set(web_param, True)
-          else:
-            request.set(web_param, False)
       # Register current web site physical path for later URL generation
       if not request.has_key(WEBSITE_KEY):
         request[WEBSITE_KEY] = self.getPhysicalPath()
+        # Normalize web parameter in the request
+        # Fix common user mistake and transform '1' string to boolean
+        for web_param in ['ignore_layout', 'editable_mode']:
+          if hasattr(request, web_param):
+            if getattr(request, web_param, None) in ('1', 1, True):
+              request.set(web_param, True)
+            else:
+              request.set(web_param, False)
       # First let us call the super method
       dynamic = Domain._aq_dynamic(self, name)
       if dynamic is not None:
         return dynamic
       # Do some optimisation here for names which can not be names of documents
-      if name.startswith('_') or name.startswith('portal_')\
+      if  reserved_name_dict.has_key(name) \
+          or name.startswith('_') or name.startswith('portal_')\
           or name.startswith('aq_') or name.startswith('selection_') \
-          or name.startswith('sort-') or name == 'getLayout' \
-          or name == 'getListItemUrl' or name.startswith('WebSite_'):
+          or name.startswith('sort-') or name.startswith('WebSite_') \
+          or name.startswith('WebSection_') or name.startswith('Base_'):
         return None
+      if not reserved_name_dict_init:
+        # Feed reserved_name_dict_init with skin names
+        portal = self.getPortalObject()
+        for skin_folder in portal.portal_skins.objectValues():
+          for id in skin_folder.objectIds():
+            reserved_name_dict[id] = 1
+        for id in portal.objectIds():
+          reserved_name_dict[id] = 1
+        reserved_name_dict_init = 1
+      #LOG('aq_dynamic name',0, name)
       if not request.has_key(CACHE_KEY):
         request[CACHE_KEY] = {}
       elif request[CACHE_KEY].has_key(name):
@@ -200,10 +226,14 @@
       try:
         portal = self.getPortalObject()
         # Use the webmaster identity to find documents
-        user = portal.acl_users.getUserById(self.getWebmaster())
+        if request[CACHE_KEY].has_key(WEBSITE_USER):
+          user = request[CACHE_KEY][WEBSITE_USER] # Retrieve user from request cache
+        else:
+          user = portal.acl_users.getUserById(self.getWebmaster())
+          request[CACHE_KEY][WEBSITE_USER] = user # Cache user per request
         if user is not None:
           old_manager = getSecurityManager()
-          newSecurityManager(get_request(), user) # Should be cached per request XXX
+          newSecurityManager(get_request(), user)
         document = self.WebSite_getDocumentValue(portal, name)
         request[CACHE_KEY][name] = document
         if user is not None:




More information about the Erp5-report mailing list