Add MapQuest as additional geocoding provider

This commit is contained in:
Raphael Michel
2020-12-09 17:22:28 +01:00
parent 54e4ad1a1c
commit a5e41aae50
7 changed files with 60 additions and 14 deletions

View File

@@ -1926,6 +1926,10 @@ Your {event} team"""))
'default': None, 'default': None,
'type': str 'type': str
}, },
'mapquest_apikey': {
'default': None,
'type': str
},
'leaflet_tiles': { 'leaflet_tiles': {
'default': None, 'default': None,
'type': str 'type': str

View File

@@ -41,6 +41,10 @@ class GlobalSettingsForm(SettingsForm):
required=False, required=False,
label=_("OpenCage API key for geocoding"), label=_("OpenCage API key for geocoding"),
)), )),
('mapquest_apikey', SecretKeySettingsField(
required=False,
label=_("MapQuest API key for geocoding"),
)),
('leaflet_tiles', forms.CharField( ('leaflet_tiles', forms.CharField(
required=False, required=False,
label=_("Leaflet tiles URL pattern"), label=_("Leaflet tiles URL pattern"),

View File

@@ -6,7 +6,7 @@
<form action="" method="post" class="form-horizontal" enctype="multipart/form-data"> <form action="" method="post" class="form-horizontal" enctype="multipart/form-data">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form_errors form %} {% bootstrap_form_errors form %}
{% bootstrap_form form layout='horizontal' %} {% bootstrap_form form layout='control' %}
<div class="form-group submit-group"> <div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save"> <button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %} {% trans "Save" %}

View File

@@ -14,14 +14,7 @@ logger = logging.getLogger(__name__)
class GeoCodeView(LoginRequiredMixin, View): class GeoCodeView(LoginRequiredMixin, View):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
gs = GlobalSettingsObject() q = self.request.GET.get('q')
if not gs.settings.opencagedata_apikey:
return JsonResponse({
'success': False,
'results': []
}, status=200)
q = request.GET.get('q')
cd = cache.get('geocode:{}'.format(q)) cd = cache.get('geocode:{}'.format(q))
if cd: if cd:
return JsonResponse({ return JsonResponse({
@@ -29,6 +22,26 @@ class GeoCodeView(LoginRequiredMixin, View):
'results': cd 'results': cd
}, status=200) }, status=200)
gs = GlobalSettingsObject()
if gs.settings.opencagedata_apikey:
res = self._use_opencage(q)
if gs.settings.mapquest_apikey:
res = self._use_mapquest(q)
else:
return JsonResponse({
'success': False,
'results': []
}, status=200)
cache.set('geocode:{}'.format(q), res, timeout=3600 * 6)
return JsonResponse({
'success': True,
'results': res
}, status=200)
def _use_opencage(self, q):
gs = GlobalSettingsObject()
try: try:
r = requests.get( r = requests.get(
'https://api.opencagedata.com/geocode/v1/json?q={}&key={}'.format( 'https://api.opencagedata.com/geocode/v1/json?q={}&key={}'.format(
@@ -51,9 +64,31 @@ class GeoCodeView(LoginRequiredMixin, View):
'lon': r['geometry']['lng'], 'lon': r['geometry']['lng'],
} for r in d['results'] } for r in d['results']
] ]
cache.set('geocode:{}'.format(q), res, timeout=3600 * 6) return res
return JsonResponse({ def _use_mapquest(self, q):
'success': True, gs = GlobalSettingsObject()
'results': res
}, status=200) try:
r = requests.get(
'http://www.mapquestapi.com/geocoding/v1/address?location={}&key={}'.format(
quote(q), gs.settings.mapquest_apikey
)
)
r.raise_for_status()
except IOError:
logger.exception("Geocoding failed")
return JsonResponse({
'success': False,
'results': []
}, status=200)
else:
d = r.json()
res = [
{
'formatted': q,
'lat': r['locations'][0]['latLng']['lat'],
'lon': r['locations'][0]['latLng']['lng'],
} for r in d['results']
]
return res

View File

@@ -128,6 +128,7 @@ Leaflet
loszulegen loszulegen
Ltd Ltd
max max
MapQuest
Merchandise Merchandise
Meta Meta
Metadaten Metadaten

View File

@@ -128,6 +128,7 @@ Leaflet
loszulegen loszulegen
Ltd Ltd
max max
MapQuest
Merchandise Merchandise
Meta Meta
Metadaten Metadaten

View File

@@ -48,6 +48,7 @@ Kosovo
Lead Lead
Leaflet Leaflet
LLC LLC
MapQuest
MOTO MOTO
Multibanco Multibanco
multiline multiline