show current (maybe anonymous) user and their permissions
This commit is contained in:
parent
af8b48518b
commit
d4a0a9b7dd
6 changed files with 55 additions and 9 deletions
|
@ -11,7 +11,8 @@ from c3nav.editor.api import ChangeSetViewSet, EditorViewSet
|
||||||
from c3nav.mapdata.api import (AccessRestrictionViewSet, AreaViewSet, BuildingViewSet, ColumnViewSet, DoorViewSet,
|
from c3nav.mapdata.api import (AccessRestrictionViewSet, AreaViewSet, BuildingViewSet, ColumnViewSet, DoorViewSet,
|
||||||
HoleViewSet, LevelViewSet, LineObstacleViewSet, LocationBySlugViewSet,
|
HoleViewSet, LevelViewSet, LineObstacleViewSet, LocationBySlugViewSet,
|
||||||
LocationGroupCategoryViewSet, LocationGroupViewSet, LocationViewSet, MapViewSet,
|
LocationGroupCategoryViewSet, LocationGroupViewSet, LocationViewSet, MapViewSet,
|
||||||
ObstacleViewSet, POIViewSet, RampViewSet, SourceViewSet, SpaceViewSet, StairViewSet)
|
ObstacleViewSet, POIViewSet, RampViewSet, SourceViewSet, SpaceViewSet, StairViewSet,
|
||||||
|
UserViewSet)
|
||||||
from c3nav.routing.api import RoutingViewSet
|
from c3nav.routing.api import RoutingViewSet
|
||||||
|
|
||||||
router = SimpleRouter()
|
router = SimpleRouter()
|
||||||
|
@ -36,6 +37,8 @@ router.register(r'locations/by_slug', LocationBySlugViewSet, base_name='location
|
||||||
router.register(r'locationgroupcategories', LocationGroupCategoryViewSet)
|
router.register(r'locationgroupcategories', LocationGroupCategoryViewSet)
|
||||||
router.register(r'locationgroups', LocationGroupViewSet)
|
router.register(r'locationgroups', LocationGroupViewSet)
|
||||||
|
|
||||||
|
router.register(r'user', UserViewSet, base_name='user')
|
||||||
|
|
||||||
router.register(r'routing', RoutingViewSet, base_name='routing')
|
router.register(r'routing', RoutingViewSet, base_name='routing')
|
||||||
|
|
||||||
router.register(r'editor', EditorViewSet, base_name='editor')
|
router.register(r'editor', EditorViewSet, base_name='editor')
|
||||||
|
|
|
@ -27,6 +27,7 @@ from c3nav.mapdata.models.locations import (Location, LocationGroupCategory, Loc
|
||||||
from c3nav.mapdata.utils.locations import (get_location_by_id_for_request, get_location_by_slug_for_request,
|
from c3nav.mapdata.utils.locations import (get_location_by_id_for_request, get_location_by_slug_for_request,
|
||||||
searchable_locations_for_request, visible_locations_for_request)
|
searchable_locations_for_request, visible_locations_for_request)
|
||||||
from c3nav.mapdata.utils.models import get_submodels
|
from c3nav.mapdata.utils.models import get_submodels
|
||||||
|
from c3nav.mapdata.utils.user import get_user_data
|
||||||
|
|
||||||
|
|
||||||
def optimize_query(qs):
|
def optimize_query(qs):
|
||||||
|
@ -378,3 +379,9 @@ class SourceViewSet(MapdataViewSet):
|
||||||
|
|
||||||
class AccessRestrictionViewSet(MapdataViewSet):
|
class AccessRestrictionViewSet(MapdataViewSet):
|
||||||
queryset = AccessRestriction.objects.all()
|
queryset = AccessRestriction.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class UserViewSet(MapdataViewSet):
|
||||||
|
@list_route(methods=['get'])
|
||||||
|
def current(self, request, key=None):
|
||||||
|
return Response(get_user_data(request))
|
||||||
|
|
26
src/c3nav/mapdata/utils/user.py
Normal file
26
src/c3nav/mapdata/utils/user.py
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from django.utils.translation import ungettext_lazy
|
||||||
|
|
||||||
|
from c3nav.mapdata.models.access import AccessPermission
|
||||||
|
|
||||||
|
|
||||||
|
def get_user_data(request):
|
||||||
|
permissions = AccessPermission.get_for_request(request)
|
||||||
|
result = {
|
||||||
|
'logged_in': bool(request.user.is_authenticated),
|
||||||
|
}
|
||||||
|
if permissions:
|
||||||
|
result.update({
|
||||||
|
'title': _('not logged in'),
|
||||||
|
'subtitle': ungettext_lazy('%d area unlocked', '%d areas unlocked', len(permissions)) % len(permissions),
|
||||||
|
'permissions': tuple(permissions),
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
result.update({
|
||||||
|
'title': _('Login'),
|
||||||
|
'subtitle': None,
|
||||||
|
'permissions': (),
|
||||||
|
})
|
||||||
|
if request.user.is_authenticated:
|
||||||
|
result['title'] = request.user.username
|
||||||
|
return result
|
|
@ -12,10 +12,20 @@ header {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
header h1 {
|
header h1 {
|
||||||
font-size: 3rem;
|
font-size: 3rem;
|
||||||
margin:0;
|
margin: 0;
|
||||||
|
}
|
||||||
|
header #user {
|
||||||
|
text-align: right;
|
||||||
|
padding: 0 0 3px 10px;
|
||||||
|
}
|
||||||
|
header #user small {
|
||||||
|
display: block;
|
||||||
|
margin-top: -3px;
|
||||||
|
color: #606c76;
|
||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
|
|
|
@ -20,6 +20,10 @@
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<h1>c3nav</h1>
|
<h1>c3nav</h1>
|
||||||
|
<a href="#" id="user">
|
||||||
|
<span>{{ user_data.title }}</span>
|
||||||
|
{% if user_data.subtitle %}<small>{{ user_data.subtitle }}</small>{% endif %}
|
||||||
|
</a>
|
||||||
</header>
|
</header>
|
||||||
<main class="map" data-state="{{ state }}">
|
<main class="map" data-state="{{ state }}">
|
||||||
<section id="popup-buttons">
|
<section id="popup-buttons">
|
||||||
|
|
|
@ -1,23 +1,18 @@
|
||||||
# flake8: noqa
|
|
||||||
import json
|
import json
|
||||||
from collections import OrderedDict
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
import qrcode
|
import qrcode
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.cache import cache
|
|
||||||
from django.core.serializers.json import DjangoJSONEncoder
|
from django.core.serializers.json import DjangoJSONEncoder
|
||||||
from django.http import Http404, HttpResponse, HttpResponseBadRequest
|
from django.http import HttpResponse, HttpResponseBadRequest
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.urls import reverse
|
|
||||||
from django.views.decorators.cache import cache_control
|
from django.views.decorators.cache import cache_control
|
||||||
from django.views.decorators.http import etag
|
from django.views.decorators.http import etag
|
||||||
|
|
||||||
from c3nav.mapdata.models import Location, Source
|
from c3nav.mapdata.models import Location, Source
|
||||||
from c3nav.mapdata.models.access import AccessPermission
|
|
||||||
from c3nav.mapdata.models.level import Level
|
|
||||||
from c3nav.mapdata.models.locations import LocationRedirect, SpecificLocation
|
from c3nav.mapdata.models.locations import LocationRedirect, SpecificLocation
|
||||||
from c3nav.mapdata.utils.locations import get_location_by_slug_for_request, levels_by_short_label_for_request
|
from c3nav.mapdata.utils.locations import get_location_by_slug_for_request, levels_by_short_label_for_request
|
||||||
|
from c3nav.mapdata.utils.user import get_user_data
|
||||||
from c3nav.mapdata.views import set_tile_access_cookie
|
from c3nav.mapdata.views import set_tile_access_cookie
|
||||||
|
|
||||||
|
|
||||||
|
@ -81,6 +76,7 @@ def map_index(request, mode=None, slug=None, slug2=None, details=None, level=Non
|
||||||
'levels': json.dumps(tuple((level.pk, level.short_label) for level in levels.values()), separators=(',', ':')),
|
'levels': json.dumps(tuple((level.pk, level.short_label) for level in levels.values()), separators=(',', ':')),
|
||||||
'state': json.dumps(state, separators=(',', ':'), cls=DjangoJSONEncoder),
|
'state': json.dumps(state, separators=(',', ':'), cls=DjangoJSONEncoder),
|
||||||
'tile_cache_server': settings.TILE_CACHE_SERVER,
|
'tile_cache_server': settings.TILE_CACHE_SERVER,
|
||||||
|
'user_data': get_user_data(request),
|
||||||
}
|
}
|
||||||
return render(request, 'site/map.html', ctx)
|
return render(request, 'site/map.html', ctx)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue