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 import json
from contextlib import suppress
from dataclasses import dataclass from dataclasses import dataclass
from typing import Annotated, Literal, Union, TypeAlias, Any, Self, Iterator from typing import Annotated, Literal, Union, TypeAlias, Any, Self, Iterator
@ -165,8 +166,15 @@ class UpdateObjectOperation(BaseOperation):
"fields": values, "fields": values,
}) })
instances = list(serializers.deserialize("json", json.dumps(data))) instances = list(serializers.deserialize("json", json.dumps(data)))
for instance in instances: for i in instances:
instance.object.save() 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 return instances[-1].object
@ -189,6 +197,8 @@ class UpdateManyToManyOperation(BaseOperation):
field_manager = getattr(instance, self.field) field_manager = getattr(instance, self.field)
field_manager.add(*self.add_values) field_manager.add(*self.add_values)
field_manager.remove(*self.remove_values) field_manager.remove(*self.remove_values)
with suppress(AttributeError):
instance.register_change(force=True)
return instance return instance
@ -199,6 +209,8 @@ class ClearManyToManyOperation(BaseOperation):
def apply(self, values: FieldValuesDict, instance: Model) -> Model: def apply(self, values: FieldValuesDict, instance: Model) -> Model:
values[self.field] = [] values[self.field] = []
getattr(instance, self.field).clear() getattr(instance, self.field).clear()
with suppress(AttributeError):
instance.register_change(force=True)
return instance return instance

View file

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

View file

@ -76,7 +76,7 @@ class SpaceGeometryMixin(GeometryMixin):
def register_change(self, force=False): def register_change(self, force=False):
space = self.space space = self.space
force = force or self.all_geometry_changed 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( changed_geometries.register(space.level_id, space.geometry.intersection(
unwrap_geom(self.geometry if force else self.get_changed_geometry()) unwrap_geom(self.geometry if force else self.get_changed_geometry())
)) ))