register updated geometries for tile cache invalidation
This commit is contained in:
parent
cd09cbab68
commit
5af314d282
9 changed files with 160 additions and 0 deletions
53
src/c3nav/mapdata/render/cache.py
Normal file
53
src/c3nav/mapdata/render/cache.py
Normal file
|
@ -0,0 +1,53 @@
|
|||
from django.db.models.signals import m2m_changed, post_delete
|
||||
|
||||
from c3nav.mapdata.utils.models import get_submodels
|
||||
|
||||
|
||||
class GeometryChangeTracker:
|
||||
def __init__(self):
|
||||
self._geometries_by_level = {}
|
||||
self._deleted_levels = set()
|
||||
|
||||
def register(self, level_id, geometry):
|
||||
self._geometries_by_level.setdefault(level_id, []).append(geometry)
|
||||
|
||||
def level_deleted(self, level_id):
|
||||
self._deleted_levels.add(level_id)
|
||||
|
||||
def reset(self):
|
||||
self._geometries_by_level = {}
|
||||
self._deleted_levels = set()
|
||||
|
||||
|
||||
changed_geometries = GeometryChangeTracker()
|
||||
|
||||
|
||||
def geometry_deleted(sender, instance, **kwargs):
|
||||
instance.register_delete()
|
||||
|
||||
|
||||
def locationgroup_changed(sender, instance, action, reverse, model, pk_set, using, **kwargs):
|
||||
if action not in ('post_add', 'post_remove', 'post_clear'):
|
||||
return
|
||||
|
||||
if not reverse:
|
||||
instance.register_change(force=True)
|
||||
else:
|
||||
if action not in 'post_clear':
|
||||
raise NotImplementedError
|
||||
query = model.objects.filter(pk__in=pk_set)
|
||||
from c3nav.mapdata.models.geometry.space import SpaceGeometryMixin
|
||||
if issubclass(model, SpaceGeometryMixin):
|
||||
query = query.select_related('space')
|
||||
for obj in query:
|
||||
obj.register_change(force=True)
|
||||
|
||||
|
||||
def register_signals():
|
||||
from c3nav.mapdata.models.geometry.base import GeometryMixin
|
||||
for model in get_submodels(GeometryMixin):
|
||||
post_delete.connect(geometry_deleted, sender=model)
|
||||
|
||||
from c3nav.mapdata.models.locations import SpecificLocation
|
||||
for model in get_submodels(SpecificLocation):
|
||||
m2m_changed.connect(locationgroup_changed, sender=model.groups.through)
|
Loading…
Add table
Add a link
Reference in a new issue