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/handlers.py
themis/fields/interfaces.py
themis/fields/marshaler.py
themis/fields/vocabs.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 WrongType
from z3c.relationfield.schema import RelationChoice, RelationList
from themis.fields.interfaces import ICommission
from themis.fields.interfaces import ICommissions
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 IRadioChoice
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 LegislativeSessionsSource
from plone.formwidget.contenttree import ObjPathSourceBinder
from z3c.relationfield.schema import Relation
class Commission(Field):
implements(ICommission, IChoice)
@ -331,3 +337,18 @@ class RadioChoice(Choice):
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 Ministry, Ministries
from themis.fields import DeputyOrMinistry, DeputiesOrMinistries
from themis.fields import RelatedDoc
from plone.schemaeditor.fields import FieldFactory
@interface.implementer(editor_ifaces.IFieldEditFormSchema)
@ -41,3 +42,5 @@ LegisSessionFactory = FieldFactory(LegisSession, u'Legislative Session')
DateOnlyFactory = FieldFactory(DateOnly, u'Date')
RadioChoiceFactory = FieldFactory(RadioChoice, u'Choice (radio)', values=[])
RelatedDocFactory = FieldFactory(RelatedDoc, u'Related Document')

View File

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

View File

@ -10,6 +10,7 @@ if HAVE_SUPERMODEL:
from zope.interface import implements
from zope.component import adapts
from plone.supermodel.interfaces import IToUnicode
from plone.app.relationfield.widget import RelationChoiceHandler
from themis.fields import Commission, Commissions
from themis.fields import DateOnly
@ -20,6 +21,7 @@ if HAVE_SUPERMODEL:
from themis.fields import DeputyOrMinistry, DeputiesOrMinistries
from themis.fields import Contact, Contacts
from themis.fields import LegisSession
from themis.fields import RelatedDoc
class CommissionHandler_(BaseHandler):
pass
@ -91,4 +93,9 @@ if HAVE_SUPERMODEL:
RadioChoiceHandler = RadioChoiceHandler_(RadioChoice)
class RelatedDocHandler_(BaseHandler):
pass
RelatedDocHandler = RelatedDocHandler_(RelatedDoc)

View File

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

View File

@ -3,6 +3,7 @@ from zope.interface import Interface
from zope.schema.interfaces import IChoice, IField, IList, IDate
from zope import schema
from z3c.form.interfaces import IOrderedSelectWidget
from z3c.relationfield.interfaces import IRelation
class ICommission(IField):
'''Field containing a unicode string without newlines that is a commission.'''
@ -82,3 +83,13 @@ class IRadioChoice(IChoice):
required=False,
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 IDeputyOrMinistry, IDeputiesOrMinistries
from themis.fields.interfaces import IOrderedSelectAndAddWidget
from themis.fields.interfaces import IRelatedDoc
from plone.formwidget.autocomplete.interfaces import IAutocompleteWidget
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.select import SelectWidget
from z3c.form.browser.radio import RadioWidget
from plone.formwidget.contenttree.widget import ContentTreeWidget
@adapter(ICommission, IFormLayer)
@implementer(IFieldWidget)
@ -181,3 +183,9 @@ class OrderedSelectAndAddWidget(OrderedSelectWidget):
self._bound_source = 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.DateFieldWidget"/>
<adapter factory=".widgets.RadioChoiceFieldWidget"/>
<adapter factory=".widgets.RelatedDocFieldWidget"/>
<class class=".widgets.OrderedSelectAndAddWidget">
<require