88 lines
3.2 KiB
Python
88 lines
3.2 KiB
Python
import requests
|
|
import urllib
|
|
import urlparse
|
|
|
|
from django.core.urlresolvers import reverse
|
|
from django.db import models
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from passerelle.base.models import BaseResource
|
|
from passerelle.utils.api import endpoint
|
|
|
|
|
|
class BaseAdresse(BaseResource):
|
|
service_url = models.CharField(max_length=128, blank=False,
|
|
default='https://api-adresse.data.gouv.fr/',
|
|
verbose_name=_('Service URL'),
|
|
help_text=_('Base Adresse Web Service URL'))
|
|
|
|
category = _('Geographic information system')
|
|
|
|
class Meta:
|
|
verbose_name = _('Base Adresse Web Service')
|
|
|
|
@classmethod
|
|
def get_icon_class(cls):
|
|
return 'gis'
|
|
|
|
@endpoint()
|
|
def search(self, request, q, format='json'):
|
|
if format != 'json':
|
|
raise NotImplementedError()
|
|
|
|
scheme, netloc, path, params, query, fragment = urlparse.urlparse(self.service_url)
|
|
path = '/search/'
|
|
query = urllib.urlencode({'q': q, 'limit': 1})
|
|
url = urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
|
|
|
|
result_response = requests.get(url)
|
|
result = []
|
|
|
|
for feature in result_response.json().get('features'):
|
|
if not feature['geometry']['type'] == 'Point':
|
|
continue # skip unknown
|
|
result.append({
|
|
'lon': str(feature['geometry']['coordinates'][0]),
|
|
'lat': str(feature['geometry']['coordinates'][1]),
|
|
'display_name': feature['properties']['label'],
|
|
})
|
|
break
|
|
|
|
return result
|
|
|
|
@endpoint()
|
|
def reverse(self, request, lat, lon, format='json'):
|
|
response_format = 'json'
|
|
if format != 'json':
|
|
raise NotImplementedError()
|
|
|
|
scheme, netloc, path, params, query, fragment = urlparse.urlparse(self.service_url)
|
|
path = '/reverse/'
|
|
query = urllib.urlencode({'lat': lat, 'lon': lon})
|
|
url = urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
|
|
|
|
result_response = requests.get(url)
|
|
result = None
|
|
|
|
for feature in result_response.json().get('features'):
|
|
if not feature['geometry']['type'] == 'Point':
|
|
continue # skip unknown
|
|
result = {}
|
|
result['lon'] = str(feature['geometry']['coordinates'][0])
|
|
result['lat'] = str(feature['geometry']['coordinates'][1])
|
|
result['address'] = {'country': 'France'}
|
|
for prop in feature['properties']:
|
|
if prop in ('city', 'postcode'):
|
|
result['address'][prop] = feature['properties'][prop]
|
|
elif prop == 'housenumber':
|
|
result['address']['house_number'] = feature['properties'][prop]
|
|
elif prop == 'label':
|
|
result['display_name'] = feature['properties'][prop]
|
|
elif prop == 'name':
|
|
house_number = feature['properties'].get('housenumber')
|
|
value = feature['properties'][prop]
|
|
if house_number and value.startswith(house_number):
|
|
value = value[len(house_number):].strip()
|
|
result['address']['road'] = value
|
|
return result
|