register updated geometries for tile cache invalidation

This commit is contained in:
Laura Klünder 2017-10-23 19:25:15 +02:00
parent cd09cbab68
commit 5af314d282
9 changed files with 160 additions and 0 deletions

View file

@ -28,6 +28,10 @@ class GeometryMixin(SerializableMixin):
abstract = True
base_manager_name = 'objects'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.orig_geometry = None if 'geometry' in self.get_deferred_fields() else self.geometry
def get_geojson_properties(self, *args, **kwargs) -> dict:
result = OrderedDict((
('type', self.__class__.__name__.lower()),
@ -76,6 +80,14 @@ class GeometryMixin(SerializableMixin):
def recalculate_bounds(self):
self.minx, self.miny, self.maxx, self.maxy = self.geometry.bounds
@property
def geometry_changed(self):
return self.orig_geometry is None or (self.geometry is not self.orig_geometry and
not self.geometry.almost_equals(self.orig_geometry, 2))
def get_changed_geometry(self):
return self.geometry if self.orig_geometry is None else self.geometry.symmetric_difference(self.orig_geometry)
def save(self, *args, **kwargs):
self.recalculate_bounds()
super().save(*args, **kwargs)

View file

@ -15,6 +15,7 @@ from c3nav.mapdata.models import Level
from c3nav.mapdata.models.access import AccessRestrictionMixin
from c3nav.mapdata.models.geometry.base import GeometryMixin
from c3nav.mapdata.models.locations import SpecificLocation
from c3nav.mapdata.render.cache import changed_geometries
from c3nav.mapdata.utils.geometry import assert_multilinestring, assert_multipolygon, clean_geometry
@ -41,6 +42,17 @@ class LevelGeometryMixin(GeometryMixin):
result['level'] = self.level_id
return result
def register_change(self, force=False):
if force or self.geometry_changed:
changed_geometries.register(self.level_id, self.geometry if force else self.get_changed_geometry())
def register_delete(self):
changed_geometries.register(self.level_id, self.geometry)
def save(self, *args, **kwargs):
self.register_change()
super().save(*args, **kwargs)
class Building(LevelGeometryMixin, models.Model):
"""

View file

@ -5,6 +5,7 @@ from shapely.geometry import CAP_STYLE, JOIN_STYLE, mapping
from c3nav.mapdata.fields import GeometryField
from c3nav.mapdata.models.geometry.base import GeometryMixin
from c3nav.mapdata.models.locations import SpecificLocation
from c3nav.mapdata.render.cache import changed_geometries
from c3nav.mapdata.utils.json import format_geojson
@ -28,6 +29,21 @@ class SpaceGeometryMixin(GeometryMixin):
result['color'] = color
return result
def register_change(self, force=True):
space = self.space
if force or self.geometry_changed:
changed_geometries.register(space.level_id, space.geometry.intersection(
self.geometry if force else self.get_changed_geometry()
))
def register_delete(self):
space = self.space
changed_geometries.register(space.level_id, space.geometry.intersection(self.geometry))
def save(self, *args, **kwargs):
self.register_change()
super().save(*args, **kwargs)
class Column(SpaceGeometryMixin, models.Model):
"""