From e6d621cbf22af1a6cf8243ac1a411234c3a5d772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 28 Sep 2011 08:27:23 +0200 Subject: [PATCH] unfinished historic lines field --- themis/fields/__init__.py | 23 +++++++++++++++ themis/fields/dochistoline_display.pt | 13 +++++++++ themis/fields/dochistoline_input.pt | 34 ++++++++++++++++++++++ themis/fields/editors.py | 3 ++ themis/fields/editors.zcml | 5 ++++ themis/fields/handlers.py | 6 ++++ themis/fields/handlers.zcml | 5 ++++ themis/fields/interfaces.py | 12 +++++++- themis/fields/widgets.py | 42 +++++++++++++++++++++++++-- themis/fields/widgets.zcml | 15 ++++++++++ 10 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 themis/fields/dochistoline_display.pt create mode 100644 themis/fields/dochistoline_input.pt diff --git a/themis/fields/__init__.py b/themis/fields/__init__.py index 83d7951..793e63c 100644 --- a/themis/fields/__init__.py +++ b/themis/fields/__init__.py @@ -30,6 +30,8 @@ from themis.fields.interfaces import IRelatedDocs from themis.fields.interfaces import IMailId from themis.fields.interfaces import IMailRefId +from themis.fields.interfaces import IDocHistoLine, IDocHistoLines + from themis.fields.vocabs import SubjectsSource from themis.fields.vocabs import LegislativeSessionsSource @@ -372,3 +374,24 @@ class MailId(TextLine): class MailRefId(TextLine): implements(IMailRefId, IFromUnicode) + +class DocHistoLine(Field): + implements(IDocHistoLine, IFromUnicode) + date = None + comment = None + +class DocHistoLines(Field): + implements(IDocHistoLines, IList) + _type = list + + def __init__(self, **kw): + self.required = False + self.value_type = DocHistoLine() + 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(DocHistoLines, self).__init__(**kw) + diff --git a/themis/fields/dochistoline_display.pt b/themis/fields/dochistoline_display.pt new file mode 100644 index 0000000..192e659 --- /dev/null +++ b/themis/fields/dochistoline_display.pt @@ -0,0 +1,13 @@ +
+ + + TODO + +
diff --git a/themis/fields/dochistoline_input.pt b/themis/fields/dochistoline_input.pt new file mode 100644 index 0000000..7a04e0b --- /dev/null +++ b/themis/fields/dochistoline_input.pt @@ -0,0 +1,34 @@ +
+ + +
+
+ + + +
+
+ + + +
+
+
+
diff --git a/themis/fields/editors.py b/themis/fields/editors.py index 51206ad..918846d 100644 --- a/themis/fields/editors.py +++ b/themis/fields/editors.py @@ -16,6 +16,7 @@ from themis.fields import RelatedDoc from themis.fields import RelatedDocs from themis.fields import MailId from themis.fields import MailRefId +from themis.fields import DocHistoLines from plone.schemaeditor.fields import FieldFactory @interface.implementer(editor_ifaces.IFieldEditFormSchema) @@ -53,3 +54,5 @@ RelatedDocsFactory = FieldFactory(RelatedDocs, u'Related Documents') MailRefIdFactory = FieldFactory(MailRefId, u'Mail Reference') MailIdFactory = FieldFactory(MailId, u'Mail Number') + +DocHistoLinesFactory = FieldFactory(DocHistoLines, u'Historic Lines') diff --git a/themis/fields/editors.zcml b/themis/fields/editors.zcml index 2ba160f..66484de 100644 --- a/themis/fields/editors.zcml +++ b/themis/fields/editors.zcml @@ -92,4 +92,9 @@ component=".editors.MailRefIdFactory" /> + + diff --git a/themis/fields/handlers.py b/themis/fields/handlers.py index 9e26d9b..7b4e47e 100644 --- a/themis/fields/handlers.py +++ b/themis/fields/handlers.py @@ -25,6 +25,7 @@ if HAVE_SUPERMODEL: from themis.fields import RelatedDocs from themis.fields import MailId from themis.fields import MailRefId + from themis.fields import DocHistoLines class CommissionHandler_(BaseHandler): pass @@ -116,3 +117,8 @@ if HAVE_SUPERMODEL: MailRefIdHandler = MailRefIdHandler_(MailRefId) + class DocHistoLinesHandler_(BaseHandler): + pass + + DocHistoLinesHandler = DocHistoLinesHandler_(DocHistoLines) + diff --git a/themis/fields/handlers.zcml b/themis/fields/handlers.zcml index 9e2d5d2..389a082 100644 --- a/themis/fields/handlers.zcml +++ b/themis/fields/handlers.zcml @@ -94,4 +94,9 @@ name="themis.fields.MailRefId" /> + + diff --git a/themis/fields/interfaces.py b/themis/fields/interfaces.py index 28ab056..cf89c87 100644 --- a/themis/fields/interfaces.py +++ b/themis/fields/interfaces.py @@ -2,7 +2,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, ITextWidget +from z3c.form.interfaces import IWidget, IOrderedSelectWidget, ITextWidget from z3c.relationfield.interfaces import IRelation, IRelationList from plone.formwidget.autocomplete.interfaces import IAutocompleteWidget @@ -142,3 +142,13 @@ class IRelatedDocWidget(IAutocompleteWidget): class IRelatedDocsWidget(IAutocompleteWidget): pass + +class IDocHistoLine(IField): + date = schema.Date(title=u'Date', required=True) + comment = schema.TextLine(title=u'Commentaire', required=True) + +class IDocHistoLines(IList): + pass + +class IDocHistoLineWidget(IWidget): + pass diff --git a/themis/fields/widgets.py b/themis/fields/widgets.py index 57ec81f..d64e183 100644 --- a/themis/fields/widgets.py +++ b/themis/fields/widgets.py @@ -5,12 +5,13 @@ from zope.component import adapts, adapter from Products.CMFCore.utils import getToolByName -from z3c.form.interfaces import IFormLayer, IFieldWidget -from z3c.form.widget import FieldWidget +from z3c.form.interfaces import IFormLayer, IFieldWidget, NOVALUE +from z3c.form.widget import Widget, FieldWidget from collective.z3cform.datetimewidget import DateWidget from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile +from z3c.form.converter import BaseDataConverter from themis.fields.interfaces import ICommission, ICommissions from zope.schema.interfaces import IDate, IContextSourceBinder, ISource @@ -28,6 +29,7 @@ from themis.fields.interfaces import IRelatedDocs from themis.fields.interfaces import IMailId, IMailIdWidget from themis.fields.interfaces import IMailRefId, IMailRefIdWidget from themis.fields.interfaces import IRelatedDocWidget, IRelatedDocsWidget +from themis.fields.interfaces import IDocHistoLineWidget, IDocHistoLine from plone.formwidget.autocomplete.interfaces import IAutocompleteWidget from plone.formwidget.autocomplete.widget import AutocompleteSelectionWidget, AutocompleteMultiSelectionWidget @@ -301,3 +303,39 @@ def MailRefIdFieldWidget(field, request): return FieldWidget(field, MailRefIdWidget(request)) + +class DocHistoLineWidget(Widget): + implements(IDocHistoLineWidget) + + def extract(self, default=NOVALUE): + from themis.fields import DocHistoLine + if not (self.name + '.comment') in self.request.form: + return NOVALUE + dochistoline = DocHistoLine() + has_value = None + for attr in ('comment', ): + setattr(dochistoline, attr, self.request.get(self.name + '.' + attr)) + has_value = has_value or getattr(dochistoline, attr) + if not has_value: + return NOVALUE + return dochistoline + +@adapter(IDocHistoLine, IFormLayer) +@implementer(IFieldWidget) +def DocHistoLineFieldWidget(field, request): + return FieldWidget(field, DocHistoLineWidget(request)) + +class DocHistoLineConverter(BaseDataConverter): + adapts(IDocHistoLine, IDocHistoLineWidget) + + def toWidgetValue(self, value): + print 'XXX, histoline converter, to widget value!' + from themis.fields import DocHistoLine + if value is None: + return DocHistoLine() + return value + + def toFieldValue(self, value): + print 'XXX, to field value' + return value + diff --git a/themis/fields/widgets.zcml b/themis/fields/widgets.zcml index 3e81e58..e7763ed 100644 --- a/themis/fields/widgets.zcml +++ b/themis/fields/widgets.zcml @@ -76,4 +76,19 @@ template="mail_ref_id_display.pt" /> + + + + + + +