78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
from zope.interface import Interface
|
|
from zope import schema
|
|
from zope.schema import Object, Field
|
|
from zope.schema.interfaces import IObject, IField, IFromUnicode
|
|
from zope.interface import implements, implementer
|
|
from zope.component import adapts, adapter, provideAdapter
|
|
|
|
from z3c.form.interfaces import IFormLayer, IFieldWidget, NOVALUE
|
|
from z3c.form.widget import Widget, FieldWidget
|
|
from z3c.form.interfaces import IWidget
|
|
from z3c.form.converter import BaseDataConverter
|
|
|
|
from themis.datatypes.interfaces import MessageFactory as _
|
|
|
|
class IAddress(IField):
|
|
title = schema.TextLine(title=_(u'Title'), required=False)
|
|
street = schema.TextLine(title=_(u'Street'), required=False)
|
|
zipcode = schema.TextLine(title=_(u'Zip'), required=False)
|
|
city = schema.TextLine(title=_(u'City'), required=False)
|
|
phone1 = schema.TextLine(title=_(u'Phone'), required=False)
|
|
phone2 = schema.TextLine(title=_(u'Phone 2'), required=False)
|
|
fax = schema.TextLine(title=_(u'Fax'), required=False)
|
|
email = schema.TextLine(title=_(u'Email'), required=False)
|
|
|
|
class Address(Field):
|
|
implements(IAddress, IFromUnicode)
|
|
|
|
title = None
|
|
street = None
|
|
zipcode = None
|
|
city = None
|
|
phone1 = None
|
|
phone2 = None
|
|
fax = None
|
|
email = None
|
|
|
|
class IAddressWidget(IWidget):
|
|
pass
|
|
|
|
class AddressWidget(Widget):
|
|
implements(IAddressWidget)
|
|
|
|
def update(self):
|
|
super(AddressWidget, self).update()
|
|
|
|
def extract(self, default=NOVALUE):
|
|
if not (self.name + '.street') in self.request.form:
|
|
return NOVALUE
|
|
address = Address()
|
|
has_value = None
|
|
for attr in ('title', 'street', 'zipcode', 'city', 'phone1', 'phone2',
|
|
'fax', 'email'):
|
|
setattr(address, attr, self.request.get(self.name + '.' + attr))
|
|
has_value = has_value or getattr(address, attr)
|
|
if not has_value:
|
|
return NOVALUE
|
|
return address
|
|
|
|
|
|
@adapter(IAddress, IFormLayer)
|
|
@implementer(IFieldWidget)
|
|
def AddressFieldWidget(field, request):
|
|
"""IFieldWidget factory for Address."""
|
|
return FieldWidget(field, AddressWidget(request))
|
|
|
|
|
|
class AddressConverter(BaseDataConverter):
|
|
adapts(IAddress, IAddressWidget)
|
|
|
|
def toWidgetValue(self, value):
|
|
if value is None:
|
|
return Address()
|
|
return value
|
|
|
|
def toFieldValue(self, value):
|
|
return value
|
|
|