diff -r 4ce98983666a -r 829abfdd6d27 src/pyams_gis/zmi/widget/area.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_gis/zmi/widget/area.py Wed Jul 11 11:40:09 2018 +0200 @@ -0,0 +1,103 @@ +# +# Copyright (c) 2008-2017 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library +import json + +# import interfaces +from pyams_form.interfaces.form import IFormLayer, IForm +from pyams_gis.interfaces import IGeoArea +from pyams_gis.interfaces.widget import IGeoAreaWidget +from pyams_gis.schema import IGeoAreaField +from pyams_utils.interfaces.data import IObjectData +from z3c.form.interfaces import IFieldWidget, IObjectFactory + +# import packages +from pyams_form.widget import widgettemplate_config +from pyams_gis.area import GeoArea +from pyams_utils.adapter import adapter_config +from z3c.form.browser.object import ObjectWidget +from z3c.form.object import getIfName +from z3c.form.widget import FieldWidget +from zope.interface import implementer_only, alsoProvides, Interface + + +@adapter_config(name=getIfName(IGeoArea), + context=(Interface, IFormLayer, IForm, IGeoAreaWidget), provides=IObjectFactory) +class GeoAreaObjectFactory(object): + """GeoArea object factory""" + + def __init__(self, context, request, form, widget): + self.context = context + self.request = request + self.form = form + self.widget = widget + + def __call__(self, data): + return GeoArea() + + +@widgettemplate_config(mode='input', template='templates/geoarea-input.pt', layer=IFormLayer) +@implementer_only(IGeoAreaWidget) +class GeoAreaWidget(ObjectWidget): + """GeoArea widget""" + + def updateWidgets(self, setErrors=True): + super(GeoAreaWidget, self).updateWidgets() + widgets = self.subform.widgets + x1 = widgets['x1'] + x1.input_css_class = 'col-md-2' + x1.object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'} + alsoProvides(x1, IObjectData) + x2 = widgets['x2'] + x2.input_css_class = 'col-md-2' + x2.object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'} + alsoProvides(x2, IObjectData) + y1 = widgets['y1'] + y1.input_css_class = 'col-md-2' + y1.object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'} + alsoProvides(y1, IObjectData) + y2 = widgets['y2'] + y2.input_css_class = 'col-md-2' + y2.object_data = {'ams-change-handler': 'PyAMS_GIS.area.changedCoordinate'} + alsoProvides(y2, IObjectData) + projection = widgets['projection'] + projection.object_data = { + 'ams-events-handlers': { + 'change.select2': 'PyAMS_GIS.area.changedProjection' + } + } + alsoProvides(projection, IObjectData) + + @property + def wgs_coordinates(self): + value = self.field.get(self.field.interface(self.context)) + if not value: + return json.dumps({'x1': None, + 'y1': None, + 'x2': None, + 'y2': None}) + else: + point1, point2 = value.wgs_coordinates + return json.dumps({'x1': float(point1[0]), + 'y1': float(point1[1]), + 'x2': float(point2[0]), + 'y2': float(point2[1])}) + + +@adapter_config(context=(IGeoAreaField, IFormLayer), provides=IFieldWidget) +def GeoAreaFieldWidget(field, request): + """GeoArea field widget factory""" + return FieldWidget(field, GeoAreaWidget(request))