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.conf import settings
from django.core.files import File from django.core.files import File
from django.http import Http404, HttpResponse, HttpResponseNotModified 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.response import Response
from rest_framework.viewsets import ReadOnlyModelViewSet, ViewSet 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.search import get_location
from c3nav.mapdata.serializers.main import LevelSerializer, PackageSerializer, SourceSerializer from c3nav.mapdata.serializers.main import LevelSerializer, PackageSerializer, SourceSerializer
from c3nav.mapdata.utils.cache import (CachedReadOnlyViewSetMixin, cache_mapdata_api_response, get_levels_cached, 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): class GeometryTypeViewSet(ViewSet):
@ -201,3 +203,20 @@ class LocationViewSet(ViewSet):
if location is None: if location is None:
raise Http404 raise Http404
return Response(location.to_json()) 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 subtitle += ' - '+add_subtitle
return subtitle return subtitle
def to_json(self): def to_location_json(self):
result = super().to_location_json() result = super().to_location_json()
result['level'] = self.level.name result['level'] = self.level.name
result['x'] = self.x result['x'] = self.x

View file

@ -1,5 +1,6 @@
from calendar import timegm from calendar import timegm
from collections import OrderedDict from collections import OrderedDict
from django.db.models import Q
from functools import wraps from functools import wraps
from django.core.cache import cache from django.core.cache import cache
@ -98,3 +99,13 @@ def get_levels_cached():
def get_packages_cached(): def get_packages_cached():
from c3nav.mapdata.models import Package from c3nav.mapdata.models import Package
return {package.name: package for package in Package.objects.all()} 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 = { REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ( 'DEFAULT_AUTHENTICATION_CLASSES': (
'c3nav.api.authentication.ForceCSRFCheckSessionAuthentication', 'rest_framework.authentication.TokenAuthentication',
), ),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
)
} }
LOCALE_PATHS = ( LOCALE_PATHS = (

View file

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

View file

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

View file

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