Add a Speakers field type
This commit is contained in:
parent
cec5c287b5
commit
be54cacaef
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -62,6 +62,11 @@
|
|||
component=".editors.DeputiesOrMinistriesFactory"
|
||||
/>
|
||||
|
||||
<utility
|
||||
name="themis.fields.Speakers"
|
||||
component=".editors.SpeakersFactory"
|
||||
/>
|
||||
|
||||
<utility
|
||||
name="themis.fields.LegisSession"
|
||||
component=".editors.LegisSessionFactory"
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -64,6 +64,11 @@
|
|||
name="themis.fields.DeputiesOrMinistries"
|
||||
/>
|
||||
|
||||
<utility
|
||||
component=".handlers.SpeakersHandler"
|
||||
name="themis.fields.Speakers"
|
||||
/>
|
||||
|
||||
<utility
|
||||
component=".handlers.LegisSessionHandler"
|
||||
name="themis.fields.LegisSession"
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -24,6 +24,8 @@
|
|||
<adapter factory=".widgets.DeputyOrMinistryFieldWidget"/>
|
||||
<adapter factory=".widgets.DeputiesOrMinistriesFieldWidget"/>
|
||||
|
||||
<adapter factory=".widgets.SpeakersFieldWidget"/>
|
||||
|
||||
<adapter factory=".widgets.LegisSessionFieldWidget"/>
|
||||
|
||||
<adapter factory=".widgets.DateOnlyFieldWidget"/>
|
||||
|
|
Reference in New Issue