r13337 - in MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk: docs src/archetypes/referencebrowserwidget src/archetypes/referencebrowserwidget/browser src/archetypes/referencebrowserwidget/tests

"Thomas Desvenain" <[email protected]>
Newsgroups gmane.comp.web.zope.plone.archetypes.cvs
Message-ID <[email protected]>
Author: thomasdesvenain
Date: Wed Dec  8 00:19:50 2010
New Revision: 13337

Modified:
   MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/HISTORY.txt
   MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/view.py
   MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/test_product.py
   MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/widget.py
Log:
Fixed: do not return results that are outside of startup directory
  if browse is restricted to it.
Needed back getStartupDirectory method on widget

Modified: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/HISTORY.txt
==============================================================================
--- MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/HISTORY.txt	(original)
+++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/HISTORY.txt	Wed Dec  8 00:19:50 2010
@@ -4,6 +4,10 @@
 2.1 - (svn/unreleased)
 ----------------------
 
+* Fixed: do not return results that are outside of startup directory
+  if browse is restricted to it.
+  [thomasdesvenain]
+
 * Qualify input tag id to avoid name-clashing. Fixes
   https://dev.plone.org/plone/ticket/11325.
   [malthe]

Modified: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/view.py
==============================================================================
--- MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/view.py	(original)
+++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/view.py	Wed Dec  8 00:19:50 2010
@@ -31,7 +31,6 @@
     from Products.CMFPlone.PloneBatch import Batch
 
 from archetypes.referencebrowserwidget import utils
-from archetypes.referencebrowserwidget.utils import getStartupDirectory
 from archetypes.referencebrowserwidget.interfaces import IFieldRelation
 from archetypes.referencebrowserwidget.interfaces import \
         IReferenceBrowserHelperView
@@ -79,30 +78,7 @@
     def getStartupDirectory(self, field):
         """ Return the URL to the startup directory. """
         widget = field.widget
-
-        url_tool = self.context.restrictedTraverse('@@plone_tools').url()
-        basepath = '/'.join(url_tool.getRelativeContentPath(self.context))
-        if getattr(widget, 'startup_directory_method', None):
-            # First check that the method exists and isn't inherited.
-            method = getattr(aq_base(self.context),
-                             widget.startup_directory_method,
-                             False)
-            if method:
-                # Then get the method again, but with acquisition context this
-                # time:
-                method = getattr(self.context,
-                                 widget.startup_directory_method,
-                                 False)
-                if callable(method):
-                    method = method()
-                directory = method
-        elif getattr(widget, 'startup_directory', None):
-            directory = widget.startup_directory
-            if not directory.startswith('/'):
-                directory = '/'.join([basepath, directory])
-        else:
-            directory = basepath
-
+        directory = widget.getStartupDirectory(self.context, field)
         return utils.getStartupDirectory(self.context, directory)
 
     def getPortalPath(self):
@@ -248,6 +224,8 @@
         assert self._updated
         result = []
         if self.widget.show_results_without_query or self.search_text:
+            if self.widget.restrict_browsing_to_startup_directory:
+                pass
 
             qc = getMultiAdapter((self.context, self.request),
                                  name='refbrowser_querycatalog')
@@ -291,6 +269,7 @@
         for c in crumbs:
             c['absolute_url'] = self.genRefBrowserUrl(c['absolute_url'])
             newcrumbs.append(c)
+            
         return newcrumbs
 
     def genRefBrowserUrl(self, urlbase):

Modified: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/test_product.py
==============================================================================
--- MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/test_product.py	(original)
+++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/test_product.py	Wed Dec  8 00:19:50 2010
@@ -399,6 +399,17 @@
         self.assertEqual(helper.getStartupDirectory(field),
                          'http://nohost/plone/layer1/layer2')
 
+        # test base query is restricted on startup directory
+        self.assertFalse('path' in field.widget.getBaseQuery(context, field))
+        field.widget.restrict_browsing_to_startup_directory = 1
+        self.assertTrue('path' in field.widget.getBaseQuery(context, field))
+        self.assertEqual(field.widget.getBaseQuery(context, field)['path'],
+                         '/plone/layer1/layer2')
+
+        field.widget.startup_directory = 'layer1'
+        self.assertEqual(field.widget.getBaseQuery(context, field)['path'],
+                         '/plone/layer1')
+
         field.widget.startup_directory = '/foo/constant'
         self.assertEqual(helper.getStartupDirectory(field),
                          'http://nohost/plone/foo/constant')

Modified: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/widget.py
==============================================================================
--- MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/widget.py	(original)
+++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/widget.py	Wed Dec  8 00:19:50 2010
@@ -1,8 +1,14 @@
-from Products.Archetypes.Widget import ReferenceWidget
-from Products.Archetypes.Registry import registerWidget,registerPropertyType
-from AccessControl import ClassSecurityInfo
 from types import StringType
+
+from Acquisition import aq_base, aq_inner
+from AccessControl import ClassSecurityInfo
+
 from Products.Archetypes.utils import shasattr
+from Products.Archetypes.Registry import registerWidget,registerPropertyType
+from Products.Archetypes.Widget import ReferenceWidget
+from Products.CMFCore.utils import getToolByName
+from archetypes.referencebrowserwidget import utils
+
 
 class ReferenceBrowserWidget(ReferenceWidget):
     _properties = ReferenceWidget._properties.copy()
@@ -38,10 +44,39 @@
     # for documentation of properties see: README.txt
     security = ClassSecurityInfo()
 
+    security.declarePublic('getStartupDirectory')
+    def getStartupDirectory(self, instance, field):
+        """get widget startup directory
+        """
+        url_tool = instance.restrictedTraverse('@@plone_tools').url()
+        basepath = '/'.join(url_tool.getRelativeContentPath(instance))
+        if getattr(self, 'startup_directory_method', None):
+            # First check that the method exists and isn't inherited.
+            method = getattr(aq_base(instance), self.startup_directory_method,
+                             False)
+            if method:
+                # Then get the method again, but with acquisition context this
+                # time:
+                method = getattr(instance, self.startup_directory_method, False)
+                if callable(method):
+                    method = method()
+
+                directory = method
+
+        elif getattr(self, 'startup_directory', None):
+            directory = self.startup_directory
+            if not directory.startswith('/'):
+                directory = '/'.join([basepath, directory])
+
+        else:
+            directory = basepath
+
+        return directory
+
     security.declarePublic('getBaseQuery')
     def getBaseQuery(self, instance, field):
-        """Return base query to use for content search"""
-
+        """Return base query to use for content search
+        """
         query = self.base_query
         if query:
             if type(query) is StringType and shasattr(instance, query):
@@ -54,6 +89,16 @@
         else:
             results = {}
 
+        # If browser browse is restricted to startup_directory
+        # restrict search to it
+        if getattr(self, 'restrict_browsing_to_startup_directory', False):
+            startup_directory = self.getStartupDirectory(instance, field)
+            try:
+                startup_directory = aq_inner(instance.restrictedTraverse(startup_directory))
+                results['path'] = '/'.join(startup_directory.getPhysicalPath())
+            except KeyError:
+                pass
+
         # Add portal type restrictions based on settings in field, if not part
         # of original base_query the template tries to do this, but ignores
         # allowed_types_method, which should override allowed_types
@@ -63,14 +108,16 @@
             if allow_method is not None:
                 meth = getattr(instance, allow_method)
                 allowed_types = meth()
-            results['portal_type']=allowed_types
+
+            results['portal_type'] = allowed_types
 
         return results
 
     security.declarePublic('process_form')
     def process_form(self, instance, field, form, empty_marker=None,
                      emptyReturnsMarker=False, validating=True):
-        """Basic impl for form processing in a widget"""
+        """Basic impl for form processing in a widget
+        """
         result = super(ReferenceBrowserWidget,
                        self).process_form(instance, field, form, empty_marker,
                                           emptyReturnsMarker, validating)
@@ -81,6 +128,7 @@
         if field.required and field.multiValued and \
            not emptyReturnsMarker and result == ([''], {}):
             return [], {}
+
         return result
 
 registerWidget(ReferenceBrowserWidget,

------------------------------------------------------------------------------
What happens now with your Lotus Notes apps - do you make another costly 
upgrade, or settle for being marooned without product support? Time to move
off Lotus Notes and onto the cloud with Force.com, apps are easier to build,
use, and manage than apps on traditional platforms. Sign up for the Lotus 
Notes Migration Kit to learn more. http://p.sf.net/sfu/salesforce-d2d
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.