diff --git a/src/c3nav/mapdata/models/access.py b/src/c3nav/mapdata/models/access.py index 2feee118..7704302d 100644 --- a/src/c3nav/mapdata/models/access.py +++ b/src/c3nav/mapdata/models/access.py @@ -257,10 +257,6 @@ class AccessRestrictionMixin(SerializableMixin, models.Model): ]) 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 def q_for_request(cls, request, prefix='', allow_none=False): if request is None and allow_none: diff --git a/src/c3nav/mapdata/models/base.py b/src/c3nav/mapdata/models/base.py index 61f765e9..06562c09 100644 --- a/src/c3nav/mapdata/models/base.py +++ b/src/c3nav/mapdata/models/base.py @@ -2,6 +2,7 @@ from collections import OrderedDict from django.core.cache import cache from django.db import models +from django.db.models import Q from django.utils.translation import ugettext_lazy as _ from django.utils.translation import get_language, get_language_info @@ -45,6 +46,14 @@ class SerializableMixin(models.Model): def title(self): 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): title = I18nField(_('Title'), plural_name='titles', blank=True, fallback_any=True, fallback_value='{model} {pk}') diff --git a/src/c3nav/mapdata/models/geometry/level.py b/src/c3nav/mapdata/models/geometry/level.py index 9e94f768..4880cb89 100644 --- a/src/c3nav/mapdata/models/geometry/level.py +++ b/src/c3nav/mapdata/models/geometry/level.py @@ -80,6 +80,13 @@ class LevelGeometryMixin(GeometryMixin): def register_delete(self): 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): self.register_change() super().save(*args, **kwargs) diff --git a/src/c3nav/mapdata/models/geometry/space.py b/src/c3nav/mapdata/models/geometry/space.py index f0bc8509..040ad3f4 100644 --- a/src/c3nav/mapdata/models/geometry/space.py +++ b/src/c3nav/mapdata/models/geometry/space.py @@ -11,6 +11,7 @@ from django.utils.translation import ugettext_lazy as _ from shapely.geometry import CAP_STYLE, JOIN_STYLE, mapping 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.geometry.base import GeometryMixin from c3nav.mapdata.models.locations import SpecificLocation @@ -57,6 +58,13 @@ class SpaceGeometryMixin(GeometryMixin): level=space.title) 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): space = self.space force = force or self.all_geometry_changed @@ -277,6 +285,13 @@ class LeaveDescription(SerializableMixin): def title(self): 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): """ @@ -310,6 +325,14 @@ class CrossDescription(SerializableMixin): def title(self): 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): """