Document Actions
3.10. How to do change the sort order for Bungeni folderish containers
Introduction
The default ordering of sqlalchemy is by primary key or OId which is not really helpful for the average human.
Details
This can be done with a customizations of the container display view.
Specifically you have to customize the listing method which returns a rendered table using the zc.table library. You can specify any sequence of the contained instances that you want, when instantiating the formatter.
E.g. to sort by the query parameter order_by:
The context._class.c._data._list is a list of all column names in your current context. For security reasons (SQL injection) the parameter is checked against them. Anyway it would not make much sense to order by a column which is not part of the query ;)
import alchemist.ui.container
from zope.security import proxy
from zc.table import table
class ContainerListing( alchemist.ui.container.ContainerListing ):
def update(self):
super( ContainerListing, self ).update()
@property
def formatter( self ):
context = proxy.removeSecurityProxy( self.context )
order_by = self.request.get('order_by', None)
query=context._query
if order_by:
if order_by in context._class.c._data._list:
query=query.order_by(order_by)
formatter = table.AlternatingRowFormatter( context,
self.request,
query,
prefix="form",
columns = self.columns )
formatter.cssClasses['table'] = 'listing'
formatter.table_id = "datacontents"
return formatter
Register the customized page for your layer:
<!-- Container UI -->
<browser:page
for="ore.alchemist.interfaces.IAlchemistContainer"
permission="zope.View"
name="index"
menu="context_actions"
title="Listing"
template="templates/generic-container.pt"
layer="bungeni.ui.interfaces.IBungeniSkin"
/>



