register_change should be done correctly

This commit is contained in:
Laura Klünder 2024-12-05 19:22:16 +01:00
parent 93e7b92647
commit ae2303ce22
3 changed files with 16 additions and 4 deletions

View file

@ -1,4 +1,5 @@
import json
from contextlib import suppress
from dataclasses import dataclass
from typing import Annotated, Literal, Union, TypeAlias, Any, Self, Iterator
@ -165,8 +166,15 @@ class UpdateObjectOperation(BaseOperation):
"fields": values,
})
instances = list(serializers.deserialize("json", json.dumps(data)))
for instance in instances:
instance.object.save()
for i in instances:
instance = i.object
if "geometry" in self.fields:
with suppress(AttributeError):
instance.register_change()
with suppress(AttributeError):
# todo: this is overkill, not always needed, we should do this differently anyways
instance.register_changed_geometries()
instance.save()
return instances[-1].object
@ -189,6 +197,8 @@ class UpdateManyToManyOperation(BaseOperation):
field_manager = getattr(instance, self.field)
field_manager.add(*self.add_values)
field_manager.remove(*self.remove_values)
with suppress(AttributeError):
instance.register_change(force=True)
return instance
@ -199,6 +209,8 @@ class ClearManyToManyOperation(BaseOperation):
def apply(self, values: FieldValuesDict, instance: Model) -> Model:
values[self.field] = []
getattr(instance, self.field).clear()
with suppress(AttributeError):
instance.register_change(force=True)
return instance

View file

@ -78,7 +78,7 @@ class LevelGeometryMixin(GeometryMixin):
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 or self.pk is None:
changed_geometries.register(self.level_id, self.geometry if force else self.get_changed_geometry())
def register_delete(self):

View file

@ -76,7 +76,7 @@ class SpaceGeometryMixin(GeometryMixin):
def register_change(self, force=False):
space = self.space
force = force or self.all_geometry_changed
if force or self.geometry_changed:
if force or self.geometry_changed or self.pk is None:
changed_geometries.register(space.level_id, space.geometry.intersection(
unwrap_geom(self.geometry if force else self.get_changed_geometry())
))