cascade space and level access restrictions

This commit is contained in:
Laura Klünder 2017-12-20 23:05:58 +01:00
parent 303c4be485
commit fbb77a3d13
4 changed files with 39 additions and 4 deletions

View file

@ -257,10 +257,6 @@ class AccessRestrictionMixin(SerializableMixin, models.Model):
]) ])
return result return result
@classmethod
def qs_for_request(cls, request, allow_none=False):
return cls.objects.filter(cls.q_for_request(request, allow_none=allow_none))
@classmethod @classmethod
def q_for_request(cls, request, prefix='', allow_none=False): def q_for_request(cls, request, prefix='', allow_none=False):
if request is None and allow_none: if request is None and allow_none:

View file

@ -2,6 +2,7 @@ from collections import OrderedDict
from django.core.cache import cache from django.core.cache import cache
from django.db import models from django.db import models
from django.db.models import Q
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import get_language, get_language_info from django.utils.translation import get_language, get_language_info
@ -45,6 +46,14 @@ class SerializableMixin(models.Model):
def title(self): def title(self):
return self._meta.verbose_name + ' ' + str(self.id) return self._meta.verbose_name + ' ' + str(self.id)
@classmethod
def qs_for_request(cls, request, allow_none=False):
return cls.objects.filter(cls.q_for_request(request, allow_none=allow_none))
@classmethod
def q_for_request(cls, *args, **kwargs):
return Q()
class TitledMixin(SerializableMixin, models.Model): class TitledMixin(SerializableMixin, models.Model):
title = I18nField(_('Title'), plural_name='titles', blank=True, fallback_any=True, fallback_value='{model} {pk}') title = I18nField(_('Title'), plural_name='titles', blank=True, fallback_any=True, fallback_value='{model} {pk}')

View file

@ -80,6 +80,13 @@ class LevelGeometryMixin(GeometryMixin):
def register_delete(self): def register_delete(self):
changed_geometries.register(self.level_id, self.geometry) changed_geometries.register(self.level_id, self.geometry)
@classmethod
def q_for_request(cls, request, prefix='', allow_none=False):
return (
super().q_for_request(request, prefix=prefix, allow_none=allow_none) &
Level.q_for_request(request, prefix=prefix+'level__', allow_none=allow_none)
)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.register_change() self.register_change()
super().save(*args, **kwargs) super().save(*args, **kwargs)

View file

@ -11,6 +11,7 @@ from django.utils.translation import ugettext_lazy as _
from shapely.geometry import CAP_STYLE, JOIN_STYLE, mapping from shapely.geometry import CAP_STYLE, JOIN_STYLE, mapping
from c3nav.mapdata.fields import GeometryField, I18nField, JSONField from c3nav.mapdata.fields import GeometryField, I18nField, JSONField
from c3nav.mapdata.models import Space
from c3nav.mapdata.models.base import SerializableMixin from c3nav.mapdata.models.base import SerializableMixin
from c3nav.mapdata.models.geometry.base import GeometryMixin from c3nav.mapdata.models.geometry.base import GeometryMixin
from c3nav.mapdata.models.locations import SpecificLocation from c3nav.mapdata.models.locations import SpecificLocation
@ -57,6 +58,13 @@ class SpaceGeometryMixin(GeometryMixin):
level=space.title) level=space.title)
return base_subtitle return base_subtitle
@classmethod
def q_for_request(cls, request, prefix='', allow_none=False):
return (
super().q_for_request(request, prefix=prefix, allow_none=allow_none) &
Space.q_for_request(request, prefix=prefix + 'space__', allow_none=allow_none)
)
def register_change(self, force=True): def register_change(self, force=True):
space = self.space space = self.space
force = force or self.all_geometry_changed force = force or self.all_geometry_changed
@ -277,6 +285,13 @@ class LeaveDescription(SerializableMixin):
def title(self): def title(self):
return self.target_space.title return self.target_space.title
@classmethod
def q_for_request(cls, request, prefix='', allow_none=False):
return (
Space.q_for_request(request, prefix='space__', allow_none=allow_none) &
Space.q_for_request(request, prefix='target_space__', allow_none=allow_none)
)
class CrossDescription(SerializableMixin): class CrossDescription(SerializableMixin):
""" """
@ -310,6 +325,14 @@ class CrossDescription(SerializableMixin):
def title(self): def title(self):
return '%s%s' % (self.origin_space.title, self.target_space.title) return '%s%s' % (self.origin_space.title, self.target_space.title)
@classmethod
def q_for_request(cls, request, prefix='', allow_none=False):
return (
Space.q_for_request(request, prefix='space__', allow_none=allow_none) &
Space.q_for_request(request, prefix='origin_space__', allow_none=allow_none) &
Space.q_for_request(request, prefix='target_space__', allow_none=allow_none)
)
class WifiMeasurement(SpaceGeometryMixin, models.Model): class WifiMeasurement(SpaceGeometryMixin, models.Model):
""" """