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

"Tom Gross" <[email protected]>
Newsgroups gmane.comp.web.zope.plone.archetypes.cvs
Message-ID <[email protected]>
Author: tom_gross
Date: Mon Dec  6 15:30:30 2010
New Revision: 13322

Modified:
   MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/popup.pt
   MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/view.py
   MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/test_product.py
Log:
cleaned up breadcrumb code (refs #11289)


Modified: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/popup.pt
==============================================================================
--- MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/popup.pt	(original)
+++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/popup.pt	Mon Dec  6 15:30:30 2010
@@ -115,8 +115,7 @@
 
         <span id="breadcrumbs-you-are-here" i18n:domain="plone"
             i18n:translate="you_are_here">You are here:</span>
-        <tal:crumbs tal:repeat="
-            crumb python:view.breadcrumbs(widget.startup_directory)">
+        <tal:crumbs tal:repeat="crumb view/breadcrumbs">
 
         <a class="browsesite"
             tal:attributes="href crumb/absolute_url;

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	Mon Dec  6 15:30:30 2010
@@ -31,6 +31,7 @@
     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
@@ -76,9 +77,11 @@
             return ref.UID()
 
     def getStartupDirectory(self, field):
-        """ Return the path to the startup directory. """
+        """ Return the URL to the startup directory. """
         widget = field.widget
-        directory = widget.startup_directory
+
+        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),
@@ -92,7 +95,14 @@
                                  False)
                 if callable(method):
                     method = method()
-                return 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 utils.getStartupDirectory(self.context, directory)
 
     def getPortalPath(self):
@@ -146,7 +156,7 @@
 
         if show_query:
             try:
-                results=catalog(**query)
+                results = catalog(**query)
             except ParseError:
                 pass
 
@@ -260,33 +270,27 @@
 
         return Batch(result, b_size, b_start, orphan=1)
 
-    def breadcrumbs(self, startup_directory):
+    def breadcrumbs(self, startup_directory=None):
         assert self._updated
-        context = aq_inner(self.context)
 
+        context = aq_inner(self.context)
         portal_state = getMultiAdapter((context, self.request),
                                        name=u'plone_portal_state')
-        portal = portal_state.portal()
-
-        crumbs = context.restrictedTraverse('@@breadcrumbs_view').breadcrumbs()
-
-        if startup_directory.startswith('/'):
-            startup_directory = startup_directory[1:]
-
-        startup_folder = portal.restrictedTraverse(startup_directory)
-        startup_folder_url = startup_folder.absolute_url()
-
-        newcrumbs = []
-        for c in crumbs:
-            if c['absolute_url'].startswith(startup_folder_url):
-                c['absolute_url'] = self.genRefBrowserUrl(c['absolute_url'])
-                newcrumbs.append(c)
+        bc_view = context.restrictedTraverse('@@breadcrumbs_view')
+        crumbs = bc_view.breadcrumbs()
 
         if not self.widget.restrict_browsing_to_startup_directory:
-            newcrumbs.insert(0,
-                {'Title': 'Home',
-                 'absolute_url': self.genRefBrowserUrl(
-                                    portal_state.navigation_root_url())})
+            newcrumbs = [{'Title': 'Home',
+                          'absolute_url': self.genRefBrowserUrl(
+                                portal_state.navigation_root_url())}]
+        else:
+            # browsing is restricted, so only the last item is
+            # interesting
+            crumbs = crumbs[-1:]
+            newcrumbs = []
+        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	Mon Dec  6 15:30:30 2010
@@ -298,7 +298,7 @@
         self.request.set('fieldName', fieldname)
         self.request.set('fieldRealName', fieldname)
         popup = self._getPopup()
-        bc = popup.breadcrumbs('layer1')
+        bc = popup.breadcrumbs()
 
         path = ''
         pat = self.pat % (fieldname, fieldname)
@@ -311,18 +311,17 @@
             assert bc['Title'] == compare[1]
 
     def test_startup(self):
-        """ The startup dir doesn't match the path we start with.
-
-            -> the crumbs are empty except the home entry
+        """A completely different startup dir.
         """
         fieldname = 'multiRef3'
         self.request.set('at_url', '/plone/layer1/layer2/ref')
         self.request.set('fieldName', fieldname)
         self.request.set('fieldRealName', fieldname)
-        popup = self._getPopup()
-        bc = popup.breadcrumbs('news')
-        assert len(bc) == 1
-        assert bc[0]['Title'] == 'Home'
+        popup = self._getPopup(obj=self.portal.news)
+        bc = popup.breadcrumbs()
+        self.assertEqual(len(bc), 2)
+        self.assertEqual(bc[0]['Title'], 'Home')
+        self.assertEqual(bc[1]['Title'], 'News')
 
     def test_restrictedbrowsing(self):
         """ Only browse startup-dir and below """
@@ -331,16 +330,15 @@
         self.request.set('fieldName', fieldname)
         self.request.set('fieldRealName', fieldname)
 
-        field = self.obj.getField(fieldname)
-        field.widget.restrict_browsing_to_startup_directory = 1
+        widget = self.folder.ref.getField(fieldname).widget
+        widget.restrict_browsing_to_startup_directory = 1
 
-        popup = self._getPopup()
-        bc = popup.breadcrumbs('layer1/layer2')
-        assert len(bc) == 2
-        assert bc[0]['Title'] == 'Layer2'
-        assert bc[1]['Title'] == 'ref'
+        popup = self._getPopup(obj=self.portal.layer1.layer2)
+        bc = popup.breadcrumbs(widget)
+        self.assertEqual(len(bc), 1)
+        self.assertEqual(bc[0]['Title'], 'Layer2')
 
-        field.widget.restrict_browsing_to_startup_directory = 0
+        widget.restrict_browsing_to_startup_directory = 0
 
     def test_isNotSelf(self):
         catalog = getToolByName(self.portal, 'portal_catalog')
@@ -393,11 +391,13 @@
 
         # dynamic query
         field.widget.startup_directory_method = 'dynamicDirectory'
-        assert helper.getStartupDirectory(field) == '/bar/dynamic'
+        self.assertEqual(helper.getStartupDirectory(field),
+                         'http://nohost/plone/bar/dynamic')
 
         # constant query
         field.widget.startup_directory_method = 'constantDirectory'
-        assert helper.getStartupDirectory(field) == '/foo/constant'
+        self.assertEqual(helper.getStartupDirectory(field),
+                         'http://nohost/plone/foo/constant')
 
         # clean up
         field.widget.startup_directory_method = ''
@@ -473,6 +473,7 @@
         self.setRoles(['Manager'])
         makeContent(self.portal, portal_type='RefBrowserDemo', id='demo1')
         makeContent(self.portal, portal_type='Document', id='page1')
+        makeContent(self.portal, portal_type='Folder', id='folder1')
         self.demo1_url = self.portal.demo1.absolute_url(1)
         self.popup_url = '%s/refbrowser_popup' % self.demo1_url
 
@@ -526,12 +527,16 @@
                 'value="Add..." src="') in body
         assert '''<input type="button" class="destructive" value="Clear reference" onclick="javascript:refbrowser_removeReference('singleRef', 0)" />''' in body
 
-    def getNormalizedPopup(self, url=None):
+    def getNormalizedPopup(self, url=None, field=None, startup_path=None):
         if url is None:
             url = self.demo1_url
+        if field is None:
+            field = 'singleRef'
+        if startup_path is None:
+            startup_path = self.popup_url
         response = self.publish(
-            '%s?fieldName=singleRef&fieldRealName=singleRef&at_url=%s'
-          % (self.popup_url, url), self.basic_auth)
+            '%s?fieldName=%s&fieldRealName=%s&at_url=%s'
+          % (startup_path, field, field, url), self.basic_auth)
 
         return normalize(response.getBody())
 
@@ -550,24 +555,23 @@
         assert '<input type="hidden" name="at_url" value="plone/demo1" />' in body
 
     def test_popup_items(self):
-        wanted_rows = 6
+        wanted_rows = 7
         wanted_insertlinks = 2
 
         body = self.getNormalizedPopup()
         INSERTLINK = re.compile(r'<input type="checkbox" class="insertreference" rel="[0-9a-f]*?" />')
 
         ROWS = re.compile(r'<tr.*?>(.*?)</tr>', re.MULTILINE|re.DOTALL)
-        assert len(ROWS.findall(body)) == wanted_rows
-        assert len(INSERTLINK.findall(body)) == wanted_insertlinks
+        self.assertEqual(len(ROWS.findall(body)), wanted_rows)
+        self.assertEqual(len(INSERTLINK.findall(body)), wanted_insertlinks)
 
         makeContent(self.portal, portal_type='News Item', id='newsitem')
         body = self.getNormalizedPopup()
 
-        assert len(ROWS.findall(body)) == wanted_rows + 1
-        assert len(INSERTLINK.findall(body)) == wanted_insertlinks
+        self.assertEqual(len(ROWS.findall(body)), wanted_rows + 1)
+        self.assertEqual(len(INSERTLINK.findall(body)), wanted_insertlinks)
 
     def test_bc_navigationroot(self):
-        makeContent(self.portal, portal_type='Folder', id='folder1')
         makeContent(self.portal.folder1, portal_type='Document', id='page1')
 
         page = self.portal.folder1.page1
@@ -583,7 +587,7 @@
         browser.addHeader('Authorization', 'Basic %s' % basic)
         browser.open('%s/refbrowser_popup?%s' % (page.absolute_url(),
                                                  urlencode(data)))
-        self.failUnless(('<a class="browsesite" href="http://nohost/plone/refbrowser_popup?'
+        self.assertTrue(('<a class="browsesite" href="http://nohost/plone/refbrowser_popup?'
                          'fieldName=relatedItems&amp;fieldRealName=relatedItems'
                          '&amp;at_url=plone/folder1/page1" rel="Home"> '
                          '<span>Home</span> </a>')
@@ -593,12 +597,29 @@
         zope.interface.alsoProvides(self.portal.folder1, INavigationRoot)
         browser.open('%s/refbrowser_popup?%s' % (page.absolute_url(),
                                                  urlencode(data)))
-        self.failUnless(('<a class="browsesite" href="http://nohost/plone/folder1/refbrowser_popup?'
+        self.assertTrue(('<a class="browsesite" href="http://nohost/plone/folder1/refbrowser_popup?'
                          'fieldName=relatedItems&amp;fieldRealName=relatedItems'
                          '&amp;at_url=plone/folder1/page1" rel="Home"> '
                          '<span>Home</span> </a>')
                          in normalize(browser.contents))
 
+    def test_startup_directory(self):
+        startup_path = self.portal.folder1.absolute_url(1)
+        body = self.getNormalizedPopup(startup_path=startup_path,
+                                       field='multiRef3')
+        self.assertTrue(
+            ('<div id="portal-breadcrumbs"> '
+               '<span id="breadcrumbs-you-are-here">You are here:</span> '
+               '<span id="breadcrumbs-home"> '
+                 '<a href="http://nohost/plone">Home</a> '
+                   '<span class="breadcrumbSeparator"> &rsaquo; </span> '
+               '</span> '
+               '<span id="breadcrumbs-1" dir="ltr"> '
+                 '<span id="breadcrumbs-current">folder1</span> '
+               '</span> '
+             '</div>') in body)
+
+
 def test_suite():
     return unittest.TestSuite([
         unittest.makeSuite(ProductsTestCase),

------------------------------------------------------------------------------
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.