register changed geometries when some important attribute changes
This commit is contained in:
parent
05030bc91c
commit
0419d82d97
3 changed files with 12 additions and 0 deletions
|
@ -9,6 +9,8 @@ from c3nav.mapdata.models.base import SerializableMixin
|
||||||
from c3nav.mapdata.utils.geometry import assert_multilinestring, assert_multipolygon
|
from c3nav.mapdata.utils.geometry import assert_multilinestring, assert_multipolygon
|
||||||
from c3nav.mapdata.utils.json import format_geojson
|
from c3nav.mapdata.utils.json import format_geojson
|
||||||
|
|
||||||
|
geometry_affecting_fields = ('height', 'width', 'access_restriction')
|
||||||
|
|
||||||
|
|
||||||
class GeometryMixin(SerializableMixin):
|
class GeometryMixin(SerializableMixin):
|
||||||
"""
|
"""
|
||||||
|
@ -22,6 +24,10 @@ class GeometryMixin(SerializableMixin):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.orig_geometry = None if 'geometry' in self.get_deferred_fields() else self.geometry
|
self.orig_geometry = None if 'geometry' in self.get_deferred_fields() else self.geometry
|
||||||
|
self._orig = {field.attname: (None if field.name in self.get_deferred_fields()
|
||||||
|
else getattr(self, field.attname))
|
||||||
|
for field in self._meta.get_fields()
|
||||||
|
if field.name in geometry_affecting_fields}
|
||||||
|
|
||||||
def get_geojson_properties(self, *args, **kwargs) -> dict:
|
def get_geojson_properties(self, *args, **kwargs) -> dict:
|
||||||
result = OrderedDict((
|
result = OrderedDict((
|
||||||
|
@ -88,6 +94,10 @@ class GeometryMixin(SerializableMixin):
|
||||||
def contains(self, x, y) -> bool:
|
def contains(self, x, y) -> bool:
|
||||||
return self.geometry.contains(Point(x, y))
|
return self.geometry.contains(Point(x, y))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def all_geometry_changed(self):
|
||||||
|
return any(getattr(self, attname) != value for attname, value in self._orig.items())
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def geometry_changed(self):
|
def geometry_changed(self):
|
||||||
if self.orig_geometry is None:
|
if self.orig_geometry is None:
|
||||||
|
|
|
@ -73,6 +73,7 @@ class LevelGeometryMixin(GeometryMixin):
|
||||||
return base_subtitle
|
return base_subtitle
|
||||||
|
|
||||||
def register_change(self, force=False):
|
def register_change(self, force=False):
|
||||||
|
force = force or self.all_geometry_changed
|
||||||
if force or self.geometry_changed:
|
if force or self.geometry_changed:
|
||||||
changed_geometries.register(self.level_id, self.geometry if force else self.get_changed_geometry())
|
changed_geometries.register(self.level_id, self.geometry if force else self.get_changed_geometry())
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,7 @@ class SpaceGeometryMixin(GeometryMixin):
|
||||||
|
|
||||||
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
|
||||||
if force or self.geometry_changed:
|
if force or self.geometry_changed:
|
||||||
changed_geometries.register(space.level_id, space.geometry.intersection(
|
changed_geometries.register(space.level_id, space.geometry.intersection(
|
||||||
self.geometry if force else self.get_changed_geometry()
|
self.geometry if force else self.get_changed_geometry()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue