How to create a Plone form widget that works like MultiContentTreeFieldWidget but preserves the order of items
Question
I have a dexterity behaviour that allows me to relate items and store the relations as UUIDs
relatedItems = schema.List(
title=u"Related Items",
description=u"Search for content that is related to this item",
required=False,
value_type=schema.Choice(
source=UUIDSourceBinder(navigation_tree_query={'portal_type':
TYPES_WITH_TEASERS})))
form.widget(relatedItems='plone.formwidget.contenttree.widget.MultiContentTreeFieldWidget')
This works great except that if you have a few relations then every time you edit the item their order changes. We're displaying the related items in the right hand column of the page (e.g. see this article about food) and want to control the order so that we can put more interesting teasers first.
Debugging it looks likely this reordering is down to the fact z3c.formwidget.query.widget.QuerySourceRadioWidget.update
uses a set when processing request parameters. Presumably this is to prevent duplicates but has two nasty side effects:
- a field’s value gets updated when it hasn't changed
- order is lost when it might be important
Is there an alternative to MultiContentTreeFieldWidget
that works in a similar way but preserves the order you add items? Even better is there a widget that does this and also allows you to reorder items as well?
Solution
I didn't find an alternative but subsequently z3c.formwidget.query has been updated to use a list instead of a set when processing request parameters. Version 0.7 fixes this
http://pypi.python.org/pypi/z3c.formwidget.query/0.7
Add the following to your [versions] section in buildout to resolve
z3c.formwidget.query = 0.7