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