Add a "Related Document" field type
This commit is contained in:
parent
f80581f331
commit
8c0211008e
|
@ -11,5 +11,6 @@ themis/fields/__init__.py
|
||||||
themis/fields/editors.py
|
themis/fields/editors.py
|
||||||
themis/fields/handlers.py
|
themis/fields/handlers.py
|
||||||
themis/fields/interfaces.py
|
themis/fields/interfaces.py
|
||||||
|
themis/fields/marshaler.py
|
||||||
themis/fields/vocabs.py
|
themis/fields/vocabs.py
|
||||||
themis/fields/widgets.py
|
themis/fields/widgets.py
|
|
@ -4,6 +4,8 @@ from zope.schema import Choice, Field, List, Date, Orderable
|
||||||
from zope.schema.interfaces import IFromUnicode, IChoice
|
from zope.schema.interfaces import IFromUnicode, IChoice
|
||||||
from zope.schema.interfaces import WrongType
|
from zope.schema.interfaces import WrongType
|
||||||
|
|
||||||
|
from z3c.relationfield.schema import RelationChoice, RelationList
|
||||||
|
|
||||||
from themis.fields.interfaces import ICommission
|
from themis.fields.interfaces import ICommission
|
||||||
from themis.fields.interfaces import ICommissions
|
from themis.fields.interfaces import ICommissions
|
||||||
from themis.fields.vocabs import CommissionsSource
|
from themis.fields.vocabs import CommissionsSource
|
||||||
|
@ -23,10 +25,14 @@ from themis.fields.vocabs import ContactsSource
|
||||||
from themis.fields.interfaces import IDateOnly
|
from themis.fields.interfaces import IDateOnly
|
||||||
from themis.fields.interfaces import IRadioChoice
|
from themis.fields.interfaces import IRadioChoice
|
||||||
from themis.fields.interfaces import ISubjects, ILegisSession, IList
|
from themis.fields.interfaces import ISubjects, ILegisSession, IList
|
||||||
|
from themis.fields.interfaces import IRelatedDoc
|
||||||
|
|
||||||
from themis.fields.vocabs import SubjectsSource
|
from themis.fields.vocabs import SubjectsSource
|
||||||
from themis.fields.vocabs import LegislativeSessionsSource
|
from themis.fields.vocabs import LegislativeSessionsSource
|
||||||
|
|
||||||
|
from plone.formwidget.contenttree import ObjPathSourceBinder
|
||||||
|
from z3c.relationfield.schema import Relation
|
||||||
|
|
||||||
|
|
||||||
class Commission(Field):
|
class Commission(Field):
|
||||||
implements(ICommission, IChoice)
|
implements(ICommission, IChoice)
|
||||||
|
@ -331,3 +337,18 @@ class RadioChoice(Choice):
|
||||||
implements(IRadioChoice)
|
implements(IRadioChoice)
|
||||||
|
|
||||||
|
|
||||||
|
class RelatedDoc(Relation):
|
||||||
|
implements(IRelatedDoc)
|
||||||
|
|
||||||
|
def __init__(self, **kw):
|
||||||
|
super(RelatedDoc, self).__init__(**kw)
|
||||||
|
self.vocabulary = ObjPathSourceBinder()
|
||||||
|
|
||||||
|
source = property(lambda self: self.vocabulary)
|
||||||
|
|
||||||
|
def bind(self, object):
|
||||||
|
"""See zope.schema._bootstrapinterfaces.IField."""
|
||||||
|
clone = super(RelatedDoc, self).bind(object)
|
||||||
|
clone.vocabulary = self.vocabulary(object)
|
||||||
|
return clone
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ from themis.fields import Contact, Contacts
|
||||||
from themis.fields import Deputy, Deputies
|
from themis.fields import Deputy, Deputies
|
||||||
from themis.fields import Ministry, Ministries
|
from themis.fields import Ministry, Ministries
|
||||||
from themis.fields import DeputyOrMinistry, DeputiesOrMinistries
|
from themis.fields import DeputyOrMinistry, DeputiesOrMinistries
|
||||||
|
from themis.fields import RelatedDoc
|
||||||
from plone.schemaeditor.fields import FieldFactory
|
from plone.schemaeditor.fields import FieldFactory
|
||||||
|
|
||||||
@interface.implementer(editor_ifaces.IFieldEditFormSchema)
|
@interface.implementer(editor_ifaces.IFieldEditFormSchema)
|
||||||
|
@ -41,3 +42,5 @@ LegisSessionFactory = FieldFactory(LegisSession, u'Legislative Session')
|
||||||
DateOnlyFactory = FieldFactory(DateOnly, u'Date')
|
DateOnlyFactory = FieldFactory(DateOnly, u'Date')
|
||||||
|
|
||||||
RadioChoiceFactory = FieldFactory(RadioChoice, u'Choice (radio)', values=[])
|
RadioChoiceFactory = FieldFactory(RadioChoice, u'Choice (radio)', values=[])
|
||||||
|
|
||||||
|
RelatedDocFactory = FieldFactory(RelatedDoc, u'Related Document')
|
||||||
|
|
|
@ -72,4 +72,9 @@
|
||||||
component=".editors.RadioChoiceFactory"
|
component=".editors.RadioChoiceFactory"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<utility
|
||||||
|
name="themis.fields.RelatedDoc"
|
||||||
|
component=".editors.RelatedDocFactory"
|
||||||
|
/>
|
||||||
|
|
||||||
</configure>
|
</configure>
|
||||||
|
|
|
@ -10,6 +10,7 @@ if HAVE_SUPERMODEL:
|
||||||
from zope.interface import implements
|
from zope.interface import implements
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
from plone.supermodel.interfaces import IToUnicode
|
from plone.supermodel.interfaces import IToUnicode
|
||||||
|
from plone.app.relationfield.widget import RelationChoiceHandler
|
||||||
|
|
||||||
from themis.fields import Commission, Commissions
|
from themis.fields import Commission, Commissions
|
||||||
from themis.fields import DateOnly
|
from themis.fields import DateOnly
|
||||||
|
@ -20,6 +21,7 @@ if HAVE_SUPERMODEL:
|
||||||
from themis.fields import DeputyOrMinistry, DeputiesOrMinistries
|
from themis.fields import DeputyOrMinistry, DeputiesOrMinistries
|
||||||
from themis.fields import Contact, Contacts
|
from themis.fields import Contact, Contacts
|
||||||
from themis.fields import LegisSession
|
from themis.fields import LegisSession
|
||||||
|
from themis.fields import RelatedDoc
|
||||||
|
|
||||||
class CommissionHandler_(BaseHandler):
|
class CommissionHandler_(BaseHandler):
|
||||||
pass
|
pass
|
||||||
|
@ -91,4 +93,9 @@ if HAVE_SUPERMODEL:
|
||||||
|
|
||||||
RadioChoiceHandler = RadioChoiceHandler_(RadioChoice)
|
RadioChoiceHandler = RadioChoiceHandler_(RadioChoice)
|
||||||
|
|
||||||
|
class RelatedDocHandler_(BaseHandler):
|
||||||
|
pass
|
||||||
|
|
||||||
|
RelatedDocHandler = RelatedDocHandler_(RelatedDoc)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -74,4 +74,9 @@
|
||||||
name="themis.fields.RadioChoice"
|
name="themis.fields.RadioChoice"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<utility
|
||||||
|
component=".handlers.RelatedDocHandler"
|
||||||
|
name="themis.fields.RelatedDoc"
|
||||||
|
/>
|
||||||
|
|
||||||
</configure>
|
</configure>
|
||||||
|
|
|
@ -3,6 +3,7 @@ from zope.interface import Interface
|
||||||
from zope.schema.interfaces import IChoice, IField, IList, IDate
|
from zope.schema.interfaces import IChoice, IField, IList, IDate
|
||||||
from zope import schema
|
from zope import schema
|
||||||
from z3c.form.interfaces import IOrderedSelectWidget
|
from z3c.form.interfaces import IOrderedSelectWidget
|
||||||
|
from z3c.relationfield.interfaces import IRelation
|
||||||
|
|
||||||
class ICommission(IField):
|
class ICommission(IField):
|
||||||
'''Field containing a unicode string without newlines that is a commission.'''
|
'''Field containing a unicode string without newlines that is a commission.'''
|
||||||
|
@ -82,3 +83,13 @@ class IRadioChoice(IChoice):
|
||||||
required=False,
|
required=False,
|
||||||
values=[])
|
values=[])
|
||||||
|
|
||||||
|
class IRelatedDoc(IRelation):
|
||||||
|
default = schema.Text(
|
||||||
|
title=IField['default'].title,
|
||||||
|
description=IField['default'].description,
|
||||||
|
required=False)
|
||||||
|
|
||||||
|
missing_value = schema.Text(
|
||||||
|
title=IField['missing_value'].title,
|
||||||
|
description=IField['missing_value'].description,
|
||||||
|
required=False)
|
||||||
|
|
|
@ -18,6 +18,7 @@ from themis.fields.interfaces import IDeputy, IDeputies
|
||||||
from themis.fields.interfaces import IMinistry, IMinistries
|
from themis.fields.interfaces import IMinistry, IMinistries
|
||||||
from themis.fields.interfaces import IDeputyOrMinistry, IDeputiesOrMinistries
|
from themis.fields.interfaces import IDeputyOrMinistry, IDeputiesOrMinistries
|
||||||
from themis.fields.interfaces import IOrderedSelectAndAddWidget
|
from themis.fields.interfaces import IOrderedSelectAndAddWidget
|
||||||
|
from themis.fields.interfaces import IRelatedDoc
|
||||||
|
|
||||||
from plone.formwidget.autocomplete.interfaces import IAutocompleteWidget
|
from plone.formwidget.autocomplete.interfaces import IAutocompleteWidget
|
||||||
from plone.formwidget.autocomplete.widget import AutocompleteSelectionWidget
|
from plone.formwidget.autocomplete.widget import AutocompleteSelectionWidget
|
||||||
|
@ -27,6 +28,7 @@ from z3c.form.browser.orderedselect import OrderedSelectWidget
|
||||||
from z3c.form.browser.checkbox import CheckBoxWidget
|
from z3c.form.browser.checkbox import CheckBoxWidget
|
||||||
from z3c.form.browser.select import SelectWidget
|
from z3c.form.browser.select import SelectWidget
|
||||||
from z3c.form.browser.radio import RadioWidget
|
from z3c.form.browser.radio import RadioWidget
|
||||||
|
from plone.formwidget.contenttree.widget import ContentTreeWidget
|
||||||
|
|
||||||
@adapter(ICommission, IFormLayer)
|
@adapter(ICommission, IFormLayer)
|
||||||
@implementer(IFieldWidget)
|
@implementer(IFieldWidget)
|
||||||
|
@ -181,3 +183,9 @@ class OrderedSelectAndAddWidget(OrderedSelectWidget):
|
||||||
self._bound_source = source
|
self._bound_source = source
|
||||||
return self._bound_source
|
return self._bound_source
|
||||||
|
|
||||||
|
@adapter(IRelatedDoc, IFormLayer)
|
||||||
|
@implementer(IFieldWidget)
|
||||||
|
def RelatedDocFieldWidget(field, request):
|
||||||
|
'''IFieldWidget factory for RadioChoiceWidget'''
|
||||||
|
return FieldWidget(field, ContentTreeWidget(request))
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
<adapter factory=".widgets.DateOnlyFieldWidget"/>
|
<adapter factory=".widgets.DateOnlyFieldWidget"/>
|
||||||
<adapter factory=".widgets.DateFieldWidget"/>
|
<adapter factory=".widgets.DateFieldWidget"/>
|
||||||
<adapter factory=".widgets.RadioChoiceFieldWidget"/>
|
<adapter factory=".widgets.RadioChoiceFieldWidget"/>
|
||||||
|
<adapter factory=".widgets.RelatedDocFieldWidget"/>
|
||||||
|
|
||||||
<class class=".widgets.OrderedSelectAndAddWidget">
|
<class class=".widgets.OrderedSelectAndAddWidget">
|
||||||
<require
|
<require
|
||||||
|
|
Reference in New Issue