[Checkins] SVN: grok/branches/jw-fix-viewlet-sorting/src/grok/ Fix for https://bugs.launchpad.net/grok/+bug/231106

Jan-Wijbrand Kolman janwijbrand at gmail.com
Fri May 16 10:54:33 EDT 2008


Log message for revision 86792:
  Fix for https://bugs.launchpad.net/grok/+bug/231106

Changed:
  U   grok/branches/jw-fix-viewlet-sorting/src/grok/components.py
  U   grok/branches/jw-fix-viewlet-sorting/src/grok/ftests/viewlet/order.py

-=-
Modified: grok/branches/jw-fix-viewlet-sorting/src/grok/components.py
===================================================================
--- grok/branches/jw-fix-viewlet-sorting/src/grok/components.py	2008-05-16 14:53:29 UTC (rev 86791)
+++ grok/branches/jw-fix-viewlet-sorting/src/grok/components.py	2008-05-16 14:54:33 UTC (rev 86792)
@@ -661,7 +661,7 @@
 
 class ViewletManager(ViewletManagerBase):
     interface.implements(interfaces.IViewletManager)
-    
+
     template = None
 
     def __init__(self, context, request, view):
@@ -673,14 +673,29 @@
             name=self.module_info.package_dotted_name
             )
 
+    def sort(self, viewlets):
+        """Sort the viewlets.
+
+        ``viewlets`` is a list of tuples of the form (name, viewlet).
+        """
+        # In Grok, the default order of the viewlets is determined
+        # by util.sort_components.
+        sorted_components = util.sort_components(
+            (viewlet for name, viewlet in viewlets))
+
+        indexed_viewlets = (
+            (sorted_components.index(viewlet), (name, viewlet)) for
+            name, viewlet in viewlets)
+
+        return [indexed[1] for indexed in sorted(indexed_viewlets)]
+
     def render(self):
         """See zope.contentprovider.interfaces.IContentProvider"""
         # Now render the view
         if self.template:
             return self.template.render(self)
         else:
-            viewlets = util.sort_components(self.viewlets)
-            return u'\n'.join([viewlet.render() for viewlet in viewlets])
+            return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
 
     def namespace(self):
         return {}

Modified: grok/branches/jw-fix-viewlet-sorting/src/grok/ftests/viewlet/order.py
===================================================================
--- grok/branches/jw-fix-viewlet-sorting/src/grok/ftests/viewlet/order.py	2008-05-16 14:53:29 UTC (rev 86791)
+++ grok/branches/jw-fix-viewlet-sorting/src/grok/ftests/viewlet/order.py	2008-05-16 14:54:33 UTC (rev 86792)
@@ -27,6 +27,19 @@
   Wilma
   Barney
   <BLANKLINE>
+
+A different way of determining viewlet order is for the
+viewletmanager to override the sort() method::
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/fred/@@orderview2")
+  >>> print browser.contents
+  Cave
+  Barney
+  <BLANKLINE>
+
 """
 
 import grok
@@ -82,3 +95,28 @@
 
     def render(self):
         return "Fred"
+
+class OrderView2(grok.View):
+    grok.template('orderview')
+
+class CaveManager2(grok.ViewletManager):
+    grok.view(OrderView2)
+    grok.name('cave')
+
+    def sort(self, viewlets):
+        # Alphabetical-by-name, reversed.
+        return sorted(viewlets, reverse=True)
+
+class NoExplicitOrderCaveViewlet(grok.Viewlet):
+    grok.name('cave')
+    grok.viewletmanager(CaveManager2)
+
+    def render(self):
+        return "Cave"
+
+class NoExplicitOrderBarneyViewlet(grok.Viewlet):
+    grok.name('barney')
+    grok.viewletmanager(CaveManager2)
+
+    def render(self):
+        return "Barney"



More information about the Checkins mailing list