diff --git a/grandlyon/wcs-scripts/has_close_demands.py b/grandlyon/wcs-scripts/has_close_demands.py index ff79eba..4138b00 100644 --- a/grandlyon/wcs-scripts/has_close_demands.py +++ b/grandlyon/wcs-scripts/has_close_demands.py @@ -1,8 +1,16 @@ +import inspect import json -import os -from quixote import get_publisher + +from pyproj import Proj, transform, Geod + +from qommon import misc +from qommon.storage import Contains from wcs.wf.geolocate import GeolocateWorkflowStatusItem +geod = Geod(ellps='WGS84') + +formdef = form_objects.formdef + result = False coords = vars().get('form_var_carte') if not coords and 'form_var_numero' in vars(): @@ -14,12 +22,15 @@ if not coords and 'form_var_numero' in vars(): if coords: lat, lon = coords.split(';') lat, lon = float(lat), float(lon) - lat1, lat2 = lat - 0.008, lat + 0.008 - lon1, lon2 = lon - 0.006, lon + 0.006 - geojson_file = os.path.join(get_publisher().app_dir, 'geojsons', form_slug + '.json') - for feature in json.load(open(geojson_file))['features']: - lon, lat = feature['geometry']['coordinates'] - if lon > lon1 and lon < lon2 and lat > lat1 and lat < lat2: + applied_filters = ['wf-%s' % x.id for x in formdef.workflow.get_not_endpoint_status()] + formdatas = formdef.data_class().select([Contains('status', applied_filters)]) + for formdata in formdatas: + if not formdata.geolocations: + continue + coords = misc.normalize_geolocation(formdata.geolocations['base']) + + distance = geod.inv(coords['lon'], coords['lat'], lon, lat)[2] + if distance < 750: result = True break diff --git a/grandlyon/wcs-scripts/similar_map.py b/grandlyon/wcs-scripts/similar_map.py index 3424d64..e0da6a5 100644 --- a/grandlyon/wcs-scripts/similar_map.py +++ b/grandlyon/wcs-scripts/similar_map.py @@ -1,8 +1,20 @@ -from wcs.wf.geolocate import GeolocateWorkflowStatusItem +import inspect +import json +import time + +from pyproj import Proj, transform, Geod + +from qommon import misc +from qommon.storage import Contains from qommon.form import MapWidget +from wcs.wf.geolocate import GeolocateWorkflowStatusItem + +geod = Geod(ellps='WGS84') result = '' +formdef = form_objects.formdef + coords = vars().get('form_var_carte') if not coords and 'form_var_numero' in vars(): @@ -13,11 +25,40 @@ if not coords and 'form_var_numero' in vars(): coords = '%(lat)s;%(lon)s' % coords if coords: + print 'similar map' + lat, lon = coords.split(';') + lat, lon = float(lat), float(lon) map_widget = MapWidget('geo', readonly=True, value=coords, initial_zoom=16) + + features = [] + applied_filters = ['wf-%s' % x.id for x in formdef.workflow.get_not_endpoint_status()] + formdatas = formdef.data_class().select([Contains('status', applied_filters)]) + for formdata in formdatas: + if not formdata.geolocations: + continue + coords = misc.normalize_geolocation(formdata.geolocations['base']) + + distance = geod.inv(coords['lon'], coords['lat'], lon, lat)[2] + if distance < 750: + feature = { + 'type': 'Feature', + 'properties': {}, + 'geometry': { + 'type': 'Point', + 'coordinates': [coords['lon'], coords['lat']], + } + } + for field in formdef.fields: + if field.varname in ('numero', 'voie', 'commune', 'message', 'type_probleme'): + feature['properties'][field.varname] = formdata.data.get(field.id) + feature['properties']['datetime'] = time.strftime('%d/%m/%Y %H:%M', formdata.receipt_time) + feature['properties']['reference'] = '%s:%s' % (formdef.url_name, formdata.id) + features.append(feature) + result = ''' -
%s
+
%s
''' % (portal_user_url, - '/geojsons/%s.json' % form_slug, + json.dumps(features), map_widget.render())