From: wichert <svn...@pl...> - 2007-01-30 11:27:29
|
Author: wichert Date: Tue Jan 30 11:27:27 2007 New Revision: 12127 Added: CMFPlone/trunk/interfaces/breadcrumbs.py - copied unchanged from r12126, CMFPlone/branches/2.5/interfaces/breadcrumbs.py Modified: CMFPlone/trunk/HISTORY.txt CMFPlone/trunk/RegistrationTool.py CMFPlone/trunk/browser/navigation.py CMFPlone/trunk/configure.zcml CMFPlone/trunk/interfaces/__init__.py CMFPlone/trunk/tests/testNavigationView.py Log: Forward port from 2.5 branch: add a new IHideFromBreadcrumbs interface. Items marked with this interface will not be shown in the breadcrumb trail. Mark the portal factory with this interface so it no longer polutes the breadcrumbs. Modified: CMFPlone/trunk/HISTORY.txt ============================================================================== --- CMFPlone/trunk/HISTORY.txt (original) +++ CMFPlone/trunk/HISTORY.txt Tue Jan 30 11:27:27 2007 @@ -415,6 +415,13 @@ CatalogTool._initIndexes. [hannosch] +Plone 2.5.x + + _ Add a new IHideFromBreadcrumbs interface. Items marked with this + interface will not be shown in the breadcrumb trail. Mark the portal + factory with this interface so it no longer polutes the breadcrumbs. + [wichert] + Plone 2.5.2 - Orb - released January 16, 2007 - Fix issue with drag and drop caused by changing of css ids in Modified: CMFPlone/trunk/RegistrationTool.py ============================================================================== --- CMFPlone/trunk/RegistrationTool.py (original) +++ CMFPlone/trunk/RegistrationTool.py Tue Jan 30 11:27:27 2007 @@ -6,6 +6,8 @@ from Products.CMFDefault.RegistrationTool import RegistrationTool as BaseTool from Products.CMFPlone import ToolNames +from Products.CMFCore.permissions import AddPortalMember + from Globals import InitializeClass from AccessControl import ClassSecurityInfo, Unauthorized from Products.CMFPlone.PloneBaseTool import PloneBaseTool @@ -150,6 +152,30 @@ return None + + security.declareProtected(AddPortalMember, 'isMemberIdAllowed') + def isMemberIdAllowed(self, id): + if len(id) < 1 or id == 'Anonymous User': + return 0 + if not self._ALLOWED_MEMBER_ID_PATTERN.match( id ): + return 0 + + pas = getToolByName("acl_users") + if IPluggableAuthService.providedBy(pas): + results = pas.searchPrincipals(id=id) + if results: + return 0 + else: + membership = getToolByName(self, 'portal_membership') + if membership.getMemberById(id) is not None: + return 0 + groups = getToolByName(self, 'portal_groups') + if groups.getGroupById(id) is not None: + return 0 + + return 1 + + security.declarePublic('generatePassword') def generatePassword(self): """Generates a password which is guaranteed to comply Modified: CMFPlone/trunk/browser/navigation.py ============================================================================== --- CMFPlone/trunk/browser/navigation.py (original) +++ CMFPlone/trunk/browser/navigation.py Tue Jan 30 11:27:27 2007 @@ -10,6 +10,7 @@ from Products.CMFPlone.browser.interfaces import INavigationTabs from Products.CMFPlone.browser.interfaces import INavigationTree from Products.CMFPlone.browser.interfaces import ISiteMap +from Products.CMFPlone.interfaces import IHideFromBreadcrumbs from Products.CMFPlone.browser.navtree import NavtreeQueryBuilder, SitemapQueryBuilder @@ -253,6 +254,10 @@ view = getMultiAdapter((container, request), name='breadcrumbs_view') base = tuple(view.breadcrumbs()) + # Some things want to be hidden from the breadcrumbs + if IHideFromBreadcrumbs.providedBy(context): + return base + if base: item_url = '%s/%s' % (base[-1]['absolute_url'], name) Modified: CMFPlone/trunk/configure.zcml ============================================================================== --- CMFPlone/trunk/configure.zcml (original) +++ CMFPlone/trunk/configure.zcml Tue Jan 30 11:27:27 2007 @@ -36,6 +36,17 @@ interface=".interfaces.IFactoryTool" /> + <five:implements + class=".FactoryTool.FactoryTool" + interface=".interfaces.IHideFromBreadcrumbs" + /> + + + <five:implements + class=".FactoryTool.TempFolder" + interface=".interfaces.IHideFromBreadcrumbs" + /> + <five:deprecatedManageAddDelete class=".Portal.PloneSite" /> Modified: CMFPlone/trunk/interfaces/__init__.py ============================================================================== --- CMFPlone/trunk/interfaces/__init__.py (original) +++ CMFPlone/trunk/interfaces/__init__.py Tue Jan 30 11:27:27 2007 @@ -17,6 +17,7 @@ from view import IDynamicViewTypeInformation from factory import IFactoryTool from translationservice import ITranslationServiceTool +from breadcrumbs import IHideFromBreadcrumbs import PropertiesTool import PloneBaseTool Modified: CMFPlone/trunk/tests/testNavigationView.py ============================================================================== --- CMFPlone/trunk/tests/testNavigationView.py (original) +++ CMFPlone/trunk/tests/testNavigationView.py Tue Jan 30 11:27:27 2007 @@ -7,6 +7,7 @@ execfile(os.path.join(sys.path[0], 'framework.py')) from zope.publisher.browser import setDefaultSkin +from zope.interface import directlyProvides from Products.CMFPlone.tests import PloneTestCase from Products.CMFPlone.tests import dummy @@ -16,6 +17,7 @@ from Products.CMFPlone.browser.navigation import CatalogNavigationTabs from Products.CMFPlone.browser.navigation import CatalogNavigationBreadcrumbs from Products.CMFPlone.browser.navigation import PhysicalNavigationBreadcrumbs +from Products.CMFPlone.interfaces import IHideFromBreadcrumbs portal_name = PloneTestCase.portal_name @@ -693,11 +695,19 @@ class TestCatalogBreadCrumbs(TestBaseBreadCrumbs): - view_class = CatalogNavigationBreadcrumbs + view_class = CatalogNavigationBreadcrumbs class TestPhysicalBreadCrumbs(TestBaseBreadCrumbs): - view_class = PhysicalNavigationBreadcrumbs + view_class = PhysicalNavigationBreadcrumbs + + def testBreadcrumbsFilterByInterface(self): + view = self.view_class(self.portal.folder1.doc11, self.request) + crumbs = view.breadcrumbs() + directlyProvides(self.portal.folder1, IHideFromBreadcrumbs) + newcrumbs = view.breadcrumbs() + self.assertEqual(len(crumbs)-1, len(newcrumbs)) + self.assertEqual(newcrumbs[0]['absolute_url'], self.portal.folder1.doc11.absolute_url()) def test_suite(): |