This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
themis.datatypes/themis/datatypes/address.py

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