From: Israel S. P. <svn...@pl...> - 2010-07-25 10:36:13
|
Author: dukebody Date: Sun Jul 25 10:36:05 2010 New Revision: 38231 Modified: plone.formwidget.contenttree/trunk/ (props changed) plone.formwidget.contenttree/trunk/docs/HISTORY.txt plone.formwidget.contenttree/trunk/plone/formwidget/contenttree/source.py plone.formwidget.contenttree/trunk/plone/formwidget/contenttree/widget.py Log: Merge dukebody-context branch 37522:37945. Modified: plone.formwidget.contenttree/trunk/docs/HISTORY.txt ============================================================================== --- plone.formwidget.contenttree/trunk/docs/HISTORY.txt (original) +++ plone.formwidget.contenttree/trunk/docs/HISTORY.txt Sun Jul 25 10:36:05 2010 @@ -3,6 +3,15 @@ 1.0b2 - unreleased ------------------ + +* Fall back to the site to perform content-related operations if the + context is not wrapped into an aquisition chain. + [dukebody] + +* Compute the view name as the request URL left-stripped the content + absolute URL. + [dukebody] + * Make it possible to restrict the field to objects below a path The constructor of ObjPathSource takes a path keyword argument with a PathIndex catalog query. This argument filters objects Modified: plone.formwidget.contenttree/trunk/plone/formwidget/contenttree/source.py ============================================================================== --- plone.formwidget.contenttree/trunk/plone/formwidget/contenttree/source.py (original) +++ plone.formwidget.contenttree/trunk/plone/formwidget/contenttree/source.py Sun Jul 25 10:36:05 2010 @@ -1,11 +1,14 @@ import itertools +from Acquisition.interfaces import IAcquirer from zope.interface import implements from zope.component import getMultiAdapter from zope.schema.interfaces import IContextSourceBinder from zope.schema.vocabulary import SimpleTerm +from zope.app.component.hooks import getSite + from plone.app.layout.navigation.interfaces import INavigationQueryBuilder from plone.app.vocabularies.catalog import parse_query @@ -166,8 +169,12 @@ self.navigation_tree_query = navigation_tree_query def __call__(self, context): + content = context + + if not IAcquirer.providedBy(content): + content = getSite() return self.path_source( - context, + content, selectable_filter=self.selectable_filter, navigation_tree_query=self.navigation_tree_query) Modified: plone.formwidget.contenttree/trunk/plone/formwidget/contenttree/widget.py ============================================================================== --- plone.formwidget.contenttree/trunk/plone/formwidget/contenttree/widget.py (original) +++ plone.formwidget.contenttree/trunk/plone/formwidget/contenttree/widget.py Sun Jul 25 10:36:05 2010 @@ -1,5 +1,6 @@ from AccessControl import getSecurityManager from Acquisition import Explicit +from Acquisition.interfaces import IAcquirer from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile from zope.interface import implementsOnly, implementer @@ -9,6 +10,8 @@ import z3c.form.widget import z3c.form.util +from zope.app.component.hooks import getSite + from plone.app.layout.navigation.interfaces import INavtreeStrategy from plone.app.layout.navigation.navtree import buildFolderTree @@ -30,9 +33,15 @@ def validate_access(self): content = self.context.form.context - view_name = self.request.getURL().split('/')[-3] - # /path/to/obj/++widget++wname/@@contenttree-fetch?q=foo + # If the object is not wrapped in an acquisition chain + # we cannot check any permission. + if not IAcquirer.providedBy(content): + return + + url = self.request.getURL() + view_name = url[len(content.absolute_url()):].split('/')[1] + # May raise Unauthorized # If the view is 'edit', then traversal prefers the view and @@ -58,7 +67,7 @@ # Update the widget before accessing the source. # The source was only bound without security applied # during traversal before. - self.context.update() + widget.update() source = widget.bound_source directory = self.request.form.get('href', None) @@ -70,8 +79,12 @@ if 'is_default_page' not in navtree_query: navtree_query['is_default_page'] = False - strategy = getMultiAdapter((context, widget), INavtreeStrategy) - catalog = getToolByName(context, 'portal_catalog') + content = context + if not IAcquirer.providedBy(content): + content = getSite() + + strategy = getMultiAdapter((content, widget), INavtreeStrategy) + catalog = getToolByName(content, 'portal_catalog') children = [] for brain in catalog(navtree_query): @@ -112,12 +125,15 @@ ' return row[1] + " (" + row[0] + ")"; }') def render_tree(self): - context = self.context + content = self.context + if not IAcquirer.providedBy(content): + content = getSite() + source = self.bound_source - strategy = getMultiAdapter((context, self), INavtreeStrategy) - data = buildFolderTree(context, - obj=context, + strategy = getMultiAdapter((content, self), INavtreeStrategy) + data = buildFolderTree(content, + obj=content, query=source.navigation_tree_query, strategy=strategy) @@ -133,6 +149,8 @@ def js_extra(self): + site = getSite() + form_url = self.request.getURL() form_prefix = self.form.prefix + self.__parent__.prefix @@ -140,8 +158,8 @@ url = "%s/++widget++%s/@@contenttree-fetch" % (form_url, widget_name,) - portal_path = getToolByName(self.context, 'portal_url').getPortalPath() - ts = getToolByName(self.context, 'translation_service') + portal_path = getToolByName(site, 'portal_url').getPortalPath() + ts = getToolByName(site, 'translation_service') return """\ $('#%(id)s-widgets-query').after( |