--- a/src/pyams_sequence/widget/__init__.py Thu Oct 08 12:21:45 2015 +0200
+++ b/src/pyams_sequence/widget/__init__.py Tue May 16 11:20:42 2017 +0200
@@ -21,8 +21,8 @@
from pyams_form.interfaces.form import IFormLayer
from pyams_i18n.interfaces import II18n
from pyams_sequence.interfaces import ISequentialIntIds, ISequentialIdInfo
-from pyams_sequence.schema import IInternalReference
-from pyams_sequence.widget.interfaces import IInternalReferenceWidget
+from pyams_sequence.schema import IInternalReference, IInternalReferencesList
+from pyams_sequence.widget.interfaces import IInternalReferenceWidget, IInternalReferencesListWidget
try:
from pyams_workflow.interfaces import IWorkflowVersions, IWorkflowVersion, IWorkflowManagedContent
@@ -31,17 +31,18 @@
else:
handle_workflow = True
-from z3c.form.interfaces import IFieldWidget
+from z3c.form.interfaces import IFieldWidget, IDataConverter
# import packages
from hypatia.catalog import CatalogQuery
-from hypatia.query import Eq
+from hypatia.query import Eq, Any
from pyams_catalog.query import CatalogResultSet
from pyams_form.widget import widgettemplate_config
from pyams_sequence.utility import get_last_version
from pyams_utils.adapter import adapter_config
from pyams_utils.registry import get_utility
from z3c.form.browser.widget import HTMLInputWidget
+from z3c.form.converter import BaseDataConverter
from z3c.form.widget import Widget, FieldWidget
from zope.interface import implementer_only
@@ -58,9 +59,11 @@
class InternalReferenceWidget(HTMLInputWidget, Widget):
"""Internal reference widget"""
+ content_type = None
+
@property
def query_params(self):
- return json.dumps({'content_type': self.field.content_type})
+ return json.dumps({'content_type': self.content_type or self.field.content_type})
@property
def values_map(self):
@@ -81,3 +84,57 @@
def InternalReferenceFieldWidget(field, request):
"""Internal reference field widget factory"""
return FieldWidget(field, InternalReferenceWidget(request))
+
+
+#
+# Internal references list widget
+#
+
+@adapter_config(context=(IInternalReferencesList, IInternalReferencesListWidget), provides=IDataConverter)
+class InternalReferencesListDataConverter(BaseDataConverter):
+ """Internal references list data converter"""
+
+ def toWidgetValue(self, value):
+ if not value:
+ return ''
+ return ','.join(value)
+
+ def toFieldValue(self, value):
+ if not value:
+ return []
+ return value.split(',')
+
+
+@widgettemplate_config(mode='input', template='templates/references-list-input.pt', layer=IFormLayer)
+@widgettemplate_config(mode='display', template='templates/references-list-display.pt', layer=IFormLayer)
+@implementer_only(IInternalReferencesListWidget)
+class InternalReferencesListWidget(HTMLInputWidget, Widget):
+ """Internal references list widget"""
+
+ content_type = None
+
+ @property
+ def query_params(self):
+ return json.dumps({'content_type': self.content_type or self.field.content_type})
+
+ @property
+ def values_map(self):
+ catalog = get_utility(ICatalog)
+ sequence = get_utility(ISequentialIntIds)
+ values = self.value
+ if isinstance(values, str):
+ values = values.split(',')
+ params = Any(catalog['oid'], values)
+ results = {}
+ for item in map(get_last_version, CatalogResultSet(CatalogQuery(catalog).query(params))):
+ oid_info = ISequentialIdInfo(item)
+ results.update({oid_info.hex_oid: '{0} ({1})'.format(II18n(item).query_attribute('title',
+ request=self.request),
+ sequence.get_short_oid(oid_info.oid))})
+ return json.dumps(results)
+
+
+@adapter_config(context=(IInternalReferencesList, IFormLayer), provides=IFieldWidget)
+def InternalReferencesListFieldWidget(field, request):
+ """Internal references list field widget factory"""
+ return FieldWidget(field, InternalReferencesListWidget(request))