add wifilocate api

This commit is contained in:
Laura Klünder 2016-12-27 23:39:14 +01:00
parent b970b47ed4
commit 01be74ab33
7 changed files with 43 additions and 6 deletions

View file

@ -7,7 +7,9 @@ from collections import OrderedDict
from django.conf import settings
from django.core.files import File
from django.http import Http404, HttpResponse, HttpResponseNotModified
from rest_framework.decorators import detail_route
from django.http import HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import detail_route, list_route, api_view
from rest_framework.response import Response
from rest_framework.viewsets import ReadOnlyModelViewSet, ViewSet
@ -18,7 +20,7 @@ from c3nav.mapdata.models.geometry import DirectedLineGeometryMapItemWithLevel
from c3nav.mapdata.search import get_location
from c3nav.mapdata.serializers.main import LevelSerializer, PackageSerializer, SourceSerializer
from c3nav.mapdata.utils.cache import (CachedReadOnlyViewSetMixin, cache_mapdata_api_response, get_levels_cached,
get_packages_cached)
get_packages_cached, get_bssid_areas_cached)
class GeometryTypeViewSet(ViewSet):
@ -201,3 +203,20 @@ class LocationViewSet(ViewSet):
if location is None:
raise Http404
return Response(location.to_json())
@list_route(methods=['POST'])
def wifilocate(self, request):
stations = json.loads(request.POST['stations'])[:200]
if not stations:
return Response({})
bssids = get_bssid_areas_cached()
stations = sorted(stations, key=lambda l: l['level'])
for station in stations:
area_name = bssids.get(station['bssid'])
if area_name is not None:
location = get_location(request, area_name)
if location is not None:
return Response({'location': location.to_location_json()});
return Response({'location': None})

View file

@ -347,7 +347,7 @@ class PointLocation(Location):
subtitle += ' - '+add_subtitle
return subtitle
def to_json(self):
def to_location_json(self):
result = super().to_location_json()
result['level'] = self.level.name
result['x'] = self.x

View file

@ -1,5 +1,6 @@
from calendar import timegm
from collections import OrderedDict
from django.db.models import Q
from functools import wraps
from django.core.cache import cache
@ -98,3 +99,13 @@ def get_levels_cached():
def get_packages_cached():
from c3nav.mapdata.models import Package
return {package.name: package for package in Package.objects.all()}
@cache_result('c3nav__mapdata__bssids')
def get_bssid_areas_cached():
from c3nav.mapdata.models import AreaLocation
bssids = {}
for area in AreaLocation.objects.filter(~Q(bssids='')):
for bssid in area.bssids.split('\n'):
bssids[bssid] = area.name
return bssids

View file

@ -188,8 +188,11 @@ USE_TZ = True
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'c3nav.api.authentication.ForceCSRFCheckSessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
)
}
LOCALE_PATHS = (

View file

@ -46,6 +46,9 @@ body, .btn {
.locationselect .icons .map {
background-image:url('../img/icons/map.svg');
}
.locationselect .icons .locate {
background-image:url('../img/icons/locate.svg');
}
.location-group .only-if-selected {
display:none;

View file

@ -8,8 +8,8 @@ c3nav = {
c3nav.visible_areas = c3nav.main_view.attr('data-visible-areas').split(';');
c3nav.qr_modal = $('#qr_modal');
c3nav.mobileclient = (typeof mobileclient !== "undefined")
if (c3nav.mobileclient) {
c3nav.mobileclient = (typeof mobileclient !== "undefined");
if (c3nav.mobileclient || true) {
$('body').removeClass('nomobileclient');
}

View file

@ -37,6 +37,7 @@
</span>
{% endif %}
<div class="icons">
<a href="" class="locate app-only"></a>
<a href="?map-level={{ levels.0 }}" class="map"></a>
</div>
</div>