Add widget with custom view for mail number

This commit is contained in:
Frédéric Péters 2011-07-28 15:22:46 +02:00
parent 799b04604b
commit 04943cf4ed
9 changed files with 96 additions and 1 deletions

View File

@ -26,6 +26,7 @@ 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.interfaces import IMailId
from themis.fields.interfaces import IMailRefId
from themis.fields.vocabs import SubjectsSource
@ -354,6 +355,10 @@ class RelatedDoc(Relation):
return clone
class MailId(TextLine):
implements(IMailId, IFromUnicode)
class MailRefId(TextLine):
implements(IMailRefId, IFromUnicode)

View File

@ -13,6 +13,7 @@ from themis.fields import Deputy, Deputies
from themis.fields import Ministry, Ministries
from themis.fields import DeputyOrMinistry, DeputiesOrMinistries
from themis.fields import RelatedDoc
from themis.fields import MailId
from themis.fields import MailRefId
from plone.schemaeditor.fields import FieldFactory
@ -47,3 +48,5 @@ RadioChoiceFactory = FieldFactory(RadioChoice, u'Choice (radio)', values=[])
RelatedDocFactory = FieldFactory(RelatedDoc, u'Related Document')
MailRefIdFactory = FieldFactory(MailRefId, u'Mail Reference')
MailIdFactory = FieldFactory(MailId, u'Mail Number')

View File

@ -77,6 +77,11 @@
component=".editors.RelatedDocFactory"
/>
<utility
name="themis.fields.MailId"
component=".editors.MailIdFactory"
/>
<utility
name="themis.fields.MailRefId"
component=".editors.MailRefIdFactory"

View File

@ -22,6 +22,7 @@ if HAVE_SUPERMODEL:
from themis.fields import Contact, Contacts
from themis.fields import LegisSession
from themis.fields import RelatedDoc
from themis.fields import MailId
from themis.fields import MailRefId
class CommissionHandler_(BaseHandler):
@ -99,9 +100,13 @@ if HAVE_SUPERMODEL:
RelatedDocHandler = RelatedDocHandler_(RelatedDoc)
class MailIdHandler_(BaseHandler):
pass
MailIdHandler = MailIdHandler_(MailId)
class MailRefIdHandler_(BaseHandler):
pass
MailRefIdHandler = MailRefIdHandler_(MailRefId)

View File

@ -79,6 +79,11 @@
name="themis.fields.RelatedDoc"
/>
<utility
component=".handlers.MailIdHandler"
name="themis.fields.MailId"
/>
<utility
component=".handlers.MailRefIdHandler"
name="themis.fields.MailRefId"

View File

@ -94,6 +94,18 @@ class IRelatedDoc(IRelation):
description=IField['missing_value'].description,
required=False)
class IMailId(IField):
default = schema.Text(
description=IField['default'].description,
required=False)
missing_value = schema.Text(
title=IField['missing_value'].title,
description=IField['missing_value'].description,
required=False)
class IMailIdWidget(ITextWidget):
pass
class IMailRefId(IField):
default = schema.Text(

View File

@ -0,0 +1,23 @@
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:tal="http://xml.zope.org/namespaces/tal"
tal:omit-tag="">
<a id="" class="" href="#"
tal:attributes="id view/id;
class view/klass;
style view/style;
title view/title;
lang view/lang;
href view/href;
onclick view/onclick;
ondblclick view/ondblclick;
onmousedown view/onmousedown;
onmouseup view/onmouseup;
onmouseover view/onmouseover;
onmousemove view/onmousemove;
onmouseout view/onmouseout;
onkeypress view/onkeypress;
onkeydown view/onkeydown;
onkeyup view/onkeyup"><tal:block
condition="view/value" content="view/value"
/></a>
</html>

View File

@ -21,6 +21,7 @@ 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 themis.fields.interfaces import IMailId, IMailIdWidget
from themis.fields.interfaces import IMailRefId, IMailRefIdWidget
from plone.formwidget.autocomplete.interfaces import IAutocompleteWidget
@ -194,6 +195,33 @@ def RelatedDocFieldWidget(field, request):
return FieldWidget(field, ContentTreeWidget(request))
class MailIdWidget(TextWidget):
implements(IMailIdWidget)
def get_matching_object(self):
catalog = getToolByName(self.context, 'portal_catalog')
results = catalog(themis_mail_ref=self.value)
objects = [x.getObject() for x in results]
if len(objects) == 0:
return None
if len(objects) > 1:
pass # should we display a warning?
return objects[0]
def href(self):
object = self.get_matching_object()
if object:
return object.absolute_url()
return None
@adapter(IMailId, IFormLayer)
@implementer(IFieldWidget)
def MailIdFieldWidget(field, request):
"""IFieldWidget factory for MailId"""
return FieldWidget(field, MailIdWidget(request))
class MailRefIdWidget(TextWidget):
implements(IMailRefIdWidget)

View File

@ -30,6 +30,7 @@
<adapter factory=".widgets.DateFieldWidget"/>
<adapter factory=".widgets.RadioChoiceFieldWidget"/>
<adapter factory=".widgets.RelatedDocFieldWidget"/>
<adapter factory=".widgets.MailIdFieldWidget"/>
<adapter factory=".widgets.MailRefIdFieldWidget"/>
<class class=".widgets.OrderedSelectAndAddWidget">
@ -60,10 +61,18 @@
class="plone.formwidget.autocomplete.widget.AutocompleteSearch"
/>
<z3c:widgetTemplate
mode="display"
widget=".interfaces.IMailIdWidget"
layer="z3c.form.interfaces.IFormLayer"
template="mail_id_display.pt"
/>
<z3c:widgetTemplate
mode="display"
widget=".interfaces.IMailRefIdWidget"
layer="z3c.form.interfaces.IFormLayer"
template="mail_ref_id_display.pt"
/>
</configure>