team-3/src/c3nav/mapdata/permissions.py

67 lines
2.3 KiB
Python
Raw Normal View History

from collections import OrderedDict
2016-09-11 21:39:01 +02:00
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
2016-09-11 21:41:39 +02:00
from rest_framework.exceptions import PermissionDenied
from rest_framework.permissions import BasePermission
2016-12-19 19:46:07 +01:00
from shapely.geometry import box
2016-09-11 21:41:39 +02:00
2016-12-07 16:11:33 +01:00
from c3nav.mapdata.models import Source
from c3nav.mapdata.utils.cache import get_packages_cached
2016-12-19 19:46:07 +01:00
from c3nav.mapdata.utils.misc import get_dimensions
2016-09-11 21:39:01 +02:00
def get_public_packages():
packages_cached = get_packages_cached()
return [packages_cached[name] for name in settings.PUBLIC_PACKAGES]
2016-12-07 16:11:33 +01:00
def get_unlocked_packages_names(request, packages_cached=None):
if packages_cached is None:
packages_cached = get_packages_cached()
if settings.DIRECT_EDITING:
return packages_cached.keys()
2016-09-11 21:39:01 +02:00
return set(settings.PUBLIC_PACKAGES) | set(request.session.get('unlocked_packages', ()))
2016-12-07 16:11:33 +01:00
def get_unlocked_packages(request, packages_cached=None):
if packages_cached is None:
packages_cached = get_packages_cached()
names = get_unlocked_packages_names(request, packages_cached=packages_cached)
return tuple(packages_cached[name] for name in names if name in packages_cached)
2016-12-06 23:18:05 +01:00
2016-09-11 21:39:01 +02:00
def can_access_package(request, package):
2016-12-06 23:18:05 +01:00
return settings.DEBUG or package.name in get_unlocked_packages_names(request)
2016-09-11 21:39:01 +02:00
2016-11-27 14:03:39 +01:00
def filter_queryset_by_package_access(request, queryset):
2016-12-06 23:18:05 +01:00
return queryset if settings.DIRECT_EDITING else queryset.filter(package__in=get_unlocked_packages(request))
2016-09-11 21:39:01 +02:00
2016-12-19 19:46:07 +01:00
def get_public_private_area(level):
width, height = get_dimensions()
everything = box(0, 0, width, height)
public_area = level.public_geometries.areas_and_doors
private_area = everything.difference(public_area)
return public_area, private_area
def get_excludables_includables():
excludables = []
includables = []
if settings.DEBUG:
excludables.append((':public', _('public areas')))
includables.append((':nonpublic', _('non-public areas')))
else:
pass
return OrderedDict(excludables), OrderedDict(includables)
2016-09-11 21:39:01 +02:00
class LockedMapFeatures(BasePermission):
def has_object_permission(self, request, view, obj):
if isinstance(obj, Source):
if not can_access_package(request, obj.package):
raise PermissionDenied(_('This Source belongs to a package you don\'t have access to.'))
return True