[Checkins] SVN: grok/trunk/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:30:22 EDT 2008
Log message for revision 86832:
Merge jw-fix-viewlet-sorting branch. Fixes https://bugs.launchpad.net/grok/+bug/231106
Changed:
U grok/trunk/src/grok/components.py
U grok/trunk/src/grok/ftests/viewlet/order.py
U grok/trunk/src/grok/util.py
-=-
Modified: grok/trunk/src/grok/components.py
===================================================================
--- grok/trunk/src/grok/components.py 2008-05-19 08:27:03 UTC (rev 86831)
+++ grok/trunk/src/grok/components.py 2008-05-19 08:30:21 UTC (rev 86832)
@@ -662,7 +662,7 @@
class ViewletManager(ViewletManagerBase):
interface.implements(interfaces.IViewletManager)
-
+
template = None
def __init__(self, context, request, view):
@@ -674,14 +674,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)
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/trunk/src/grok/ftests/viewlet/order.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/order.py 2008-05-19 08:27:03 UTC (rev 86831)
+++ grok/trunk/src/grok/ftests/viewlet/order.py 2008-05-19 08:30:21 UTC (rev 86832)
@@ -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/trunk/src/grok/util.py
===================================================================
--- grok/trunk/src/grok/util.py 2008-05-19 08:27:03 UTC (rev 86831)
+++ grok/trunk/src/grok/util.py 2008-05-19 08:30:21 UTC (rev 86832)
@@ -97,6 +97,7 @@
interface.directlyProvides(request, *ifaces)
def _sort_key(component):
+ # If components have a grok.order directive, sort by that.
explicit_order, implicit_order = grok.order.bind().get(component)
return (explicit_order,
component.__module__,
@@ -104,5 +105,4 @@
component.__class__.__name__)
def sort_components(components):
- # if components have a grok.order directive, sort by that
return sorted(components, key=_sort_key)
More information about the Checkins
mailing list