# HG changeset patch # User Sylvain Thénault # Date 1253526129 -7200 # Node ID d77aa97f95f97487e0f0f4afe3e141606bc79daf # Parent 3c035436ca65757aea27d2bbefb2cbd96ee64567# Parent c61a526b530e6904f4e1a5fddfa1238de3d14ce1 merge diff -r c61a526b530e -r d77aa97f95f9 web/formfields.py --- a/web/formfields.py Mon Sep 21 11:18:55 2009 +0200 +++ b/web/formfields.py Mon Sep 21 11:42:09 2009 +0200 @@ -22,6 +22,22 @@ Radio, Select, DateTimePicker) +def vocab_sort(vocab): + """sort vocabulary, considering option groups""" + result = [] + partresult = [] + for label, value in vocab: + if value is None: # opt group start + if partresult: + result += sorted(partresult) + partresult = [] + result.append( (label, value) ) + else: + partresult.append( (label, value) ) + result += sorted(partresult) + return result + + class Field(object): """field class is introduced to control what's displayed in forms. It makes the link between something to edit and its display in the form. Actual @@ -190,7 +206,7 @@ if self.internationalizable: vocab = [(form.req._(label), value) for label, value in vocab] if self.sort: - vocab = sorted(vocab) + vocab = vocab_sort(vocab) return vocab def form_init(self, form): @@ -475,7 +491,7 @@ relatedvocab = [] vocab = res + form.form_field_vocabulary(self) + relatedvocab if self.sort: - vocab = sorted(vocab) + vocab = vocab_sort(vocab) return vocab def format_single_value(self, req, value): diff -r c61a526b530e -r d77aa97f95f9 web/test/unittest_formfields.py --- a/web/test/unittest_formfields.py Mon Sep 21 11:18:55 2009 +0200 +++ b/web/test/unittest_formfields.py Mon Sep 21 11:42:09 2009 +0200 @@ -128,5 +128,16 @@ self.commit() self.assertEquals(description_format_field.initial(form), 'text/rest') + +class UtilsTC(TestCase): + def test_vocab_sort(self): + self.assertEquals(vocab_sort([('Z', 1), ('A', 2), + ('Group 1', None), ('Y', 3), ('B', 4), + ('Group 2', None), ('X', 5), ('C', 6)]), + [('A', 2), ('Z', 1), + ('Group 1', None), ('B', 4), ('Y', 3), + ('Group 2', None), ('C', 6), ('X', 5)] + ) + if __name__ == '__main__': unittest_main() diff -r c61a526b530e -r d77aa97f95f9 web/views/workflow.py --- a/web/views/workflow.py Mon Sep 21 11:18:55 2009 +0200 +++ b/web/views/workflow.py Mon Sep 21 11:42:09 2009 +0200 @@ -52,7 +52,8 @@ class ChangeStateFormView(form.FormViewMixIn, view.EntityView): id = 'statuschange' title = _('status change') - __select__ = implements(IWorkflowable) & match_form_params('treid') + __select__ = (one_line_rset() & implements(IWorkflowable) + & match_form_params('treid')) def cell_call(self, row, col): entity = self.rset.get_entity(row, col)