base adresse: add support for geocoding API (#10326)

This commit is contained in:
Frédéric Péters 2016-04-30 23:53:02 +02:00
parent a3c2d56853
commit f4c398d9a6
2 changed files with 39 additions and 11 deletions

View File

@ -29,10 +29,10 @@ format.
</p>
<ul>
<li>{% trans 'Geocoding:' %} <a href="{% url 'base_adresse-search' slug=object.slug %}"
>{{ site_base_uri }}{% url 'base_adresse-search' slug=object.slug %}</a></li>
<li>{% trans 'Reverse geocoding:' %} <a href="{% url 'base_adresse-reverse' slug=object.slug %}"
>{{ site_base_uri }}{% url 'base_adresse-reverse' slug=object.slug %}</a></li>
<li>{% trans 'Geocoding:' %} <a href="{% url 'base_adresse-search' slug=object.slug %}?q=169 rue du chateau, paris&format=json"
>{{ site_base_uri }}{% url 'base_adresse-search' slug=object.slug %}</a>?q=<i>q</i>&amp;format=json</li>
<li>{% trans 'Reverse geocoding:' %} <a href="{% url 'base_adresse-reverse' slug=object.slug %}?lat=48.833708&amp;lon=2.323349&amp;format=json"
>{{ site_base_uri }}{% url 'base_adresse-reverse' slug=object.slug %}</a>?lat=<i>lat</i>&amp;lon=<i>lon</i>&amp;format=json</li>
</ul>
</div>

View File

@ -49,15 +49,43 @@ class BaseAddresseDeleteView(DeleteView):
class SearchView(View, SingleObjectMixin):
model = BaseAddresse
def get(self, request, *args, **kwargs):
raise NotImplementedError()
class SearchPathView(View, SingleObjectMixin):
model = BaseAddresse
def get_query(self, request, *args, **kwargs):
if not 'q' in request.GET:
return HttpResponseBadRequest('missing parameter')
return request.GET['q']
def get(self, request, *args, **kwargs):
raise NotImplementedError()
response_format = 'json'
if 'format' in request.GET:
response_format = request.GET['format']
if response_format != 'json':
raise NotImplementedError()
scheme, netloc, path, params, query, fragment = urlparse.urlparse(
self.get_object().service_url)
path = '/search/'
query = urllib.urlencode({'q': self.get_query(request, *args, **kwargs), '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 utils.response_for_json(request, result)
class SearchPathView(SearchView):
def get_query(self, request, *args, **kwargs):
return kwargs.get('path')
class ReverseView(View, SingleObjectMixin):