Add a Speakers field type

This commit is contained in:
Frédéric Péters 2011-10-24 21:35:19 +02:00
parent cec5c287b5
commit be54cacaef
9 changed files with 85 additions and 1 deletions

View File

@ -22,6 +22,9 @@ from themis.fields.vocabs import DeputiesAndMinistriesSource
from themis.fields.interfaces import IContact, IContacts
from themis.fields.vocabs import ContactsSource
from themis.fields.interfaces import ISpeakers
from themis.fields.vocabs import SpeakersSource
from themis.fields.interfaces import IDateOnly
from themis.fields.interfaces import IRadioChoice
from themis.fields.interfaces import ISubjects, ILegisSession, IList
@ -334,6 +337,23 @@ class DeputiesOrMinistries(Field):
super(DeputiesOrMinistries, self).__init__(**kw)
class Speakers(Field):
implements(ISpeakers, IList)
_type = list
def __init__(self, **kw):
self.required = False
self.value_type = SourcedChoice(source=SpeakersSource())
self.unique = True
self.min_length = None
self.max_length = None
for attr in ('min_length', 'max_length', 'unique', 'value_type'):
if attr in kw: del kw[attr]
super(Speakers, self).__init__(**kw)
class DateOnly(Field):
implements(IDateOnly)
min = None

View File

@ -11,6 +11,7 @@ from themis.fields import LegisSession
from themis.fields import Contact, Contacts
from themis.fields import Deputy, Deputies
from themis.fields import Ministry, Ministries
from themis.fields import Speakers
from themis.fields import DeputyOrMinistry, DeputiesOrMinistries
from themis.fields import RelatedDoc
from themis.fields import RelatedDocs
@ -43,6 +44,8 @@ MinistriesFactory = FieldFactory(Ministries, u'Ministries')
DeputyOrMinistryFactory = FieldFactory(DeputyOrMinistry, u'Deputy or Ministry')
DeputiesOrMinistriesFactory = FieldFactory(DeputiesOrMinistries, u'Deputies or Ministries')
SpeakersFactory = FieldFactory(Speakers, u'Speakers')
LegisSessionFactory = FieldFactory(LegisSession, u'Legislative Session')
DateOnlyFactory = FieldFactory(DateOnly, u'Date')

View File

@ -62,6 +62,11 @@
component=".editors.DeputiesOrMinistriesFactory"
/>
<utility
name="themis.fields.Speakers"
component=".editors.SpeakersFactory"
/>
<utility
name="themis.fields.LegisSession"
component=".editors.LegisSessionFactory"

View File

@ -19,6 +19,7 @@ if HAVE_SUPERMODEL:
from themis.fields import Deputy, Deputies
from themis.fields import Ministry, Ministries
from themis.fields import DeputyOrMinistry, DeputiesOrMinistries
from themis.fields import Speakers
from themis.fields import Contact, Contacts
from themis.fields import LegisSession
from themis.fields import RelatedDoc
@ -94,6 +95,11 @@ if HAVE_SUPERMODEL:
DeputiesOrMinistriesHandler = DeputiesOrMinistriesHandler_(DeputiesOrMinistries)
class SpeakersHandler_(BaseHandler):
pass
SpeakersHandler = SpeakersHandler_(Speakers)
class RadioChoiceHandler_(ChoiceHandler):
pass

View File

@ -64,6 +64,11 @@
name="themis.fields.DeputiesOrMinistries"
/>
<utility
component=".handlers.SpeakersHandler"
name="themis.fields.Speakers"
/>
<utility
component=".handlers.LegisSessionHandler"
name="themis.fields.LegisSession"

View File

@ -42,6 +42,9 @@ class IDeputyOrMinistry(IField):
class IDeputiesOrMinistries(IList):
'''Field containing deputies and/or ministries'''
class ISpeakers(IList):
'''Field containing a list of speakers'''
class IDateOnly(IDate):
'''Field containing a date'''
default = schema.Date(

View File

@ -44,7 +44,8 @@ def cmp_person(x, y):
if t: return t
return cmp(x.firstname.lower(), y.lastname.lower())
def get_terms_for_persons(context, include_deputies=False, include_ministries=False):
def get_terms_for_persons(context, include_deputies=False,
include_ministries=False, include_ministries_collaborators=False):
catalog = getToolByName(context, 'portal_catalog')
if include_deputies:
@ -84,6 +85,16 @@ def get_terms_for_persons(context, include_deputies=False, include_ministries=Fa
'%s:%s' % (prefix, person.id),
label))
if include_ministries_collaborators:
results = catalog(portal_type='themis.datatypes.ministry')
ministries = [x.getObject() for x in results]
ministries.sort(cmp_person)
for person in ministries:
terms.append(SimpleVocabulary.createTerm(
'ministry-collab:%s' % person.id,
'ministry-collab:%s' % person.id,
'Collaborateur du Ministre %s %s' % (person.firstname, person.lastname)))
return terms
@ -190,6 +201,28 @@ class ContactsSource(object):
yield u'DO NOT TOUCH'
class SpeakersSource(object):
implements(IContextSourceBinder)
def __init__(self):
pass
def __call__(self, context):
extra_terms = [SimpleVocabulary.createTerm(
'speaker:cour-des-comptes', 'speaker:cour-des-comptes', u'Cour des comptes'),
SimpleVocabulary.createTerm(
'speaker:huis-clos', 'speaker:huis-clos', u'Orateur(s) à huis clos')]
return SimpleVocabulary(get_terms_for_persons(context,
include_deputies=True,
include_ministries=True,
include_ministries_collaborators=True) + extra_terms)
def __iter__(self):
# hack to let schema editor handle the field
yield u'DO NOT TOUCH'
class SubjectsSource(object):
implements(IContextSourceBinder)

View File

@ -32,6 +32,7 @@ from themis.fields.interfaces import IContact, IContacts
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 ISpeakers
from themis.fields.interfaces import IOrderedSelectAndAddWidget
from themis.fields.interfaces import IRelatedDoc
from themis.fields.interfaces import IRelatedDocs
@ -119,6 +120,12 @@ def ContactsFieldWidget(field, request):
"""IFieldWidget factory for ContactsWidget."""
return FieldWidget(field, OrderedSelectAndAddWidget(request))
@adapter(ISpeakers, IFormLayer)
@implementer(IFieldWidget)
def SpeakersFieldWidget(field, request):
"""IFieldWidget factory for SpeakersWidget."""
return FieldWidget(field, OrderedSelectWidget(request))
@adapter(ILegisSession, IFormLayer)
@implementer(IFieldWidget)
def LegisSessionFieldWidget(field, request):

View File

@ -24,6 +24,8 @@
<adapter factory=".widgets.DeputyOrMinistryFieldWidget"/>
<adapter factory=".widgets.DeputiesOrMinistriesFieldWidget"/>
<adapter factory=".widgets.SpeakersFieldWidget"/>
<adapter factory=".widgets.LegisSessionFieldWidget"/>
<adapter factory=".widgets.DateOnlyFieldWidget"/>