How to create a Plone form widget that works like MultiContentTreeFieldWidget but preserves the order of items

StackOverflow https://stackoverflow.com/questions/7807693

  •  26-10-2019
  •  | 
  •  

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:

  1. a field’s value gets updated when it hasn't changed
  2. 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?

Was it helpful?

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top