Add a "Related Document" field type

This commit is contained in:
Frédéric Péters 2011-06-30 19:21:44 +02:00
parent f80581f331
commit 8c0211008e
9 changed files with 62 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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')

View File

@ -72,4 +72,9 @@
component=".editors.RadioChoiceFactory" component=".editors.RadioChoiceFactory"
/> />
<utility
name="themis.fields.RelatedDoc"
component=".editors.RelatedDocFactory"
/>
</configure> </configure>

View File

@ -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)

View File

@ -74,4 +74,9 @@
name="themis.fields.RadioChoice" name="themis.fields.RadioChoice"
/> />
<utility
component=".handlers.RelatedDocHandler"
name="themis.fields.RelatedDoc"
/>
</configure> </configure>

View File

@ -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)

View File

@ -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))

View File

@ -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