How to do change the sort order for Bungeni folderish containers — Site
Personal tools

Skip to content. | Skip to navigation

 
You are here:

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"

/>