[Checkins] SVN: grok/branches/0.12/src/grok/ Merge jw-fix-viewlet-sorting branch. Fixes https://bugs.launchpad.net/grok/+bug/231106

Jan-Wijbrand Kolman janwijbrand at gmail.com
Mon May 19 04:45:39 EDT 2008


Log message for revision 86834:
  Merge jw-fix-viewlet-sorting branch. Fixes https://bugs.launchpad.net/grok/+bug/231106

Changed:
  U   grok/branches/0.12/src/grok/components.py
  U   grok/branches/0.12/src/grok/ftests/viewlet/order.py
  U   grok/branches/0.12/src/grok/util.py

-=-
Modified: grok/branches/0.12/src/grok/components.py
===================================================================
--- grok/branches/0.12/src/grok/components.py	2008-05-19 08:32:13 UTC (rev 86833)
+++ grok/branches/0.12/src/grok/components.py	2008-05-19 08:45:38 UTC (rev 86834)
@@ -626,14 +626,37 @@
             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. util.sort_components() however expects
+        # a list of just components, but sort() is supposed to deal
+        # with a list of (name, viewlet) tuples.
+        # To handle this situation we first store the name part on the
+        # viewlet, then use util.sort_components() and then "unpack"
+        # the name from the viewlet and recreate the list of (name,
+        # viewlet) tuples, now in the correct order.
+        s_viewlets = []
+        for name, viewlet in viewlets:
+             # Stuff away viewlet name so we can later retrieve it.
+             # XXX We loose name information in case the same viewlet
+             # is in the viewlets list twice, but with a different
+             # name. Most probably this situation doesn't occur.
+             viewlet.__viewlet_name__ = name
+             s_viewlets.append(viewlet)
+        s_viewlets = util.sort_components(s_viewlets)
+        return [(viewlet.__viewlet_name__, viewlet) for viewlet in s_viewlets]
+
     def render(self):
         """See zope.contentprovider.interfaces.IContentProvider"""
         # Now render the view
         if self.template:
-            return self.template.render(self) 
+            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/0.12/src/grok/ftests/viewlet/order.py
===================================================================
--- grok/branches/0.12/src/grok/ftests/viewlet/order.py	2008-05-19 08:32:13 UTC (rev 86833)
+++ grok/branches/0.12/src/grok/ftests/viewlet/order.py	2008-05-19 08:45:38 UTC (rev 86834)
@@ -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"

Modified: grok/branches/0.12/src/grok/util.py
===================================================================
--- grok/branches/0.12/src/grok/util.py	2008-05-19 08:32:13 UTC (rev 86833)
+++ grok/branches/0.12/src/grok/util.py	2008-05-19 08:45:38 UTC (rev 86834)
@@ -113,16 +113,15 @@
             not m.__name__.startswith('_')]
 
 def _sort_key(component):
-    explicit_order, implicit_order = class_annotation(component,
-                                                      'grok.order',
-                                                      (0,0))
+    # If components have a grok.order directive, sort by that.
+    explicit_order, implicit_order = class_annotation(
+        component, 'grok.order', (0,0))
     return (explicit_order,
             component.__module__,
             implicit_order,
             component.__class__.__name__)
 
 def sort_components(components):
-    # if components have a grok.order directive, sort by that
     return sorted(components, key=_sort_key)
 
 AMBIGUOUS_COMPONENT = object()
@@ -144,7 +143,7 @@
         raise GrokError("Multiple possible %ss for %r, please use "
                         "%s." % (component_name, factory, component_directive),
                         factory)
-    
+
 def determine_module_component(module_info, annotation, classes):
     """Determine module-level component.
 
@@ -169,7 +168,7 @@
         component = components[0]
     else:
         component= AMBIGUOUS_COMPONENT
-        
+
     module_component = module_info.getAnnotation(annotation, None)
     if module_component:
         component = module_component



More information about the Checkins mailing list