[Erp5-report] r20204 - in /erp5/trunk/products/CMFActivity: ./ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Mar 28 19:25:08 CET 2008


Author: jerome
Date: Fri Mar 28 19:25:08 2008
New Revision: 20204

URL: http://svn.erp5.org?rev=20204&view=rev
Log:
store and restore REQUEST information so when the activity is invoked
absolute_url returns the same URL it would have returned if called directly.
This is needed because during invocation it's another REQUEST, from
timerservice.

Modified:
    erp5/trunk/products/CMFActivity/ActivityTool.py
    erp5/trunk/products/CMFActivity/tests/testCMFActivity.py

Modified: erp5/trunk/products/CMFActivity/ActivityTool.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/ActivityTool.py?rev=20204&r1=20203&r2=20204&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/ActivityTool.py (original)
+++ erp5/trunk/products/CMFActivity/ActivityTool.py Fri Mar 28 19:25:08 2008
@@ -134,7 +134,13 @@
     self.traceback = None
     self.processing = None
     self.user_name = str(_getAuthenticatedUser(self))
-    # Store REQUEST Info ?
+    # Store REQUEST Info
+    request = getattr(obj, 'REQUEST', None)
+    if request is not None:
+      self.request_info = dict(
+        SERVER_URL=request.other['SERVER_URL'],
+        VirtualRootPhysicalPath=request.other.get('VirtualRootPhysicalPath'),
+        _script=list(request._script))
 
   def getObject(self, activity_tool):
     """return the object referenced in this message."""
@@ -805,7 +811,18 @@
         if parents is None:
           warn('CMFActivity.ActivityTool.invoke: PARENTS is not defined in REQUEST. It should only happen in unit tests.')
           request['PARENTS'] = self.aq_chain[:]
-        new_request_container = request_container.__class__(REQUEST=request.clone())
+        
+        # restore request information
+        new_request = request.clone()
+        request_info = getattr(message, 'request_info', None)
+        if request_info is not None:
+          new_request.other['SERVER_URL'] = request_info['SERVER_URL']
+          virtual_root_path = request_info.get('VirtualRootPhysicalPath')
+          if virtual_root_path:
+            new_request.other['VirtualRootPhysicalPath'] = virtual_root_path
+          new_request._script = request_info['_script']
+
+        new_request_container = request_container.__class__(REQUEST=new_request)
         # Recreate acquisition chain.
         my_self = new_request_container
         base_chain.reverse()

Modified: erp5/trunk/products/CMFActivity/tests/testCMFActivity.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/tests/testCMFActivity.py?rev=20204&r1=20203&r2=20204&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/tests/testCMFActivity.py (original)
+++ erp5/trunk/products/CMFActivity/tests/testCMFActivity.py Fri Mar 28 19:25:08 2008
@@ -2798,6 +2798,45 @@
       LOG('Testing... ',0,message)
     self.CheckSerializationTag('SQLQueue')
 
+  def test_108_testAbsoluteUrl(self):
+    # Tests that absolute_url works in activities. The URL generation is based
+    # on REQUEST information when the method was activated.
+    request = self.portal.REQUEST
+
+    request.setServerURL('http', 'test.erp5.org', '9080')
+    request.other['PARENTS'] = [self.portal.organisation_module]
+    request.setVirtualRoot('virtual_root')
+
+    calls = []
+    def checkAbsoluteUrl(self):
+      calls.append(self.absolute_url())
+    Organisation.checkAbsoluteUrl = checkAbsoluteUrl
+
+    try:
+      o = self.portal.organisation_module.newContent(
+                    portal_type='Organisation', id='test_obj')
+      self.assertEquals(o.absolute_url(),
+          'http://test.erp5.org:9080/virtual_root/test_obj')
+      o.activate().checkAbsoluteUrl()
+      
+      # Reset server URL and virtual root before executing messages.
+      # This simulates the case of activities beeing executed with different
+      # REQUEST, such as TimerServer.
+      request.setServerURL('https', 'anotherhost.erp5.org', '443')
+      request.other['PARENTS'] = [self.app]
+      request.setVirtualRoot('')
+      # obviously, the object url is different
+      self.assertEquals(o.absolute_url(),
+          'https://anotherhost.erp5.org/%s/organisation_module/test_obj'
+           % self.portal.getId())
+
+      # but activities are executed using the previous request information
+      self.flushAllActivities(loop_size=1000)
+      self.assertEquals(calls, ['http://test.erp5.org:9080/virtual_root/test_obj'])
+    finally:
+      delattr(Organisation, 'checkAbsoluteUrl')
+
+
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestCMFActivity))




More information about the Erp5-report mailing list