From 6390a51fc6e165a63a42679bf998780d3f8d1602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 5 Dec 2024 20:42:25 +0100 Subject: [PATCH] an attempt to get rid of missing _orig with changesets --- src/c3nav/editor/operations.py | 14 ++++++-------- src/c3nav/mapdata/models/base.py | 1 + src/c3nav/mapdata/models/geometry/base.py | 14 +++++++------- src/c3nav/mapdata/models/geometry/space.py | 4 ++-- src/c3nav/mapdata/models/locations.py | 19 +++++++++---------- 5 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/c3nav/editor/operations.py b/src/c3nav/editor/operations.py index ee113c30..e9dadc67 100644 --- a/src/c3nav/editor/operations.py +++ b/src/c3nav/editor/operations.py @@ -167,14 +167,12 @@ class UpdateObjectOperation(BaseOperation): }) instances = list(serializers.deserialize("json", json.dumps(data))) 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() + new_instance = i.object + if hasattr(instance, "_orig") and not hasattr(new_instance, "_orig"): + new_instance._orig = instance._orig + if hasattr(instance, "_orig_geometry") and not hasattr(new_instance, "_orig_geometry"): + new_instance._orig_geometry = instance._orig_geometry + new_instance.save() return instances[-1].object diff --git a/src/c3nav/mapdata/models/base.py b/src/c3nav/mapdata/models/base.py index cf551cdc..238280ef 100644 --- a/src/c3nav/mapdata/models/base.py +++ b/src/c3nav/mapdata/models/base.py @@ -10,6 +10,7 @@ from c3nav.mapdata.fields import I18nField from c3nav.mapdata.models import MapUpdate +# todo: get rid of this? class SerializableMixin(models.Model): _affected_by_changeset = None diff --git a/src/c3nav/mapdata/models/geometry/base.py b/src/c3nav/mapdata/models/geometry/base.py index 1a20abe2..ba44e07f 100644 --- a/src/c3nav/mapdata/models/geometry/base.py +++ b/src/c3nav/mapdata/models/geometry/base.py @@ -32,7 +32,7 @@ class GeometryMixin(SerializableMixin): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if not self.no_orig: - 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.attname in self.get_deferred_fields() else getattr(self, field.attname)) for field in self._meta.get_fields() @@ -106,24 +106,24 @@ class GeometryMixin(SerializableMixin): @property def geometry_changed(self): - if self.orig_geometry is None: + if self._orig_geometry is None: return True - if self.geometry is self.orig_geometry: + if self.geometry is self._orig_geometry: return False - if not self.geometry.equals_exact(unwrap_geom(self.orig_geometry), 0.05): + if not self.geometry.equals_exact(unwrap_geom(self._orig_geometry), 0.05): return True field = self._meta.get_field('geometry') rounded = field.to_python(field.get_prep_value(self.geometry)) - if not rounded.equals_exact(unwrap_geom(self.orig_geometry), 0.005): + if not rounded.equals_exact(unwrap_geom(self._orig_geometry), 0.005): return True return False def get_changed_geometry(self): field = self._meta.get_field('geometry') new_geometry = field.get_final_value(self.geometry) - if self.orig_geometry is None: + if self._orig_geometry is None: return new_geometry - difference = new_geometry.symmetric_difference(unwrap_geom(self.orig_geometry)) + difference = new_geometry.symmetric_difference(unwrap_geom(self._orig_geometry)) if self._meta.get_field('geometry').geomtype in ('polygon', 'multipolygon'): difference = unary_union(assert_multipolygon(difference)) return difference diff --git a/src/c3nav/mapdata/models/geometry/space.py b/src/c3nav/mapdata/models/geometry/space.py index df79d640..0922ea04 100644 --- a/src/c3nav/mapdata/models/geometry/space.py +++ b/src/c3nav/mapdata/models/geometry/space.py @@ -181,10 +181,10 @@ class ObstacleGroup(TitledMixin, models.Model): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.orig_color = self.color + self._orig = {"color": self.color} def save(self, *args, **kwargs): - if self.pk and (self.orig_color != self.color): + if self.pk and any(getattr(self, attname) != value for attname, value in self._orig.items()): self.register_changed_geometries() super().save(*args, **kwargs) diff --git a/src/c3nav/mapdata/models/locations.py b/src/c3nav/mapdata/models/locations.py index 9559aac2..a7048c1d 100644 --- a/src/c3nav/mapdata/models/locations.py +++ b/src/c3nav/mapdata/models/locations.py @@ -268,7 +268,7 @@ class LocationGroupCategory(SerializableMixin, models.Model): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.orig_priority = self.priority + self._orig = {"priority": self.priority} class Meta: verbose_name = _('Location Group Category') @@ -290,7 +290,7 @@ class LocationGroupCategory(SerializableMixin, models.Model): group.register_changed_geometries(do_query=False) def save(self, *args, **kwargs): - if self.pk and self.priority != self.orig_priority: + if self.pk and any(getattr(self, attname) != value for attname, value in self._orig.items()): self.register_changed_geometries() super().save(*args, **kwargs) @@ -338,10 +338,12 @@ class LocationGroup(Location, models.Model): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.orig_priority = self.priority - self.orig_hierarchy = self.hierarchy - self.orig_category_id = self.category_id - self.orig_color = self.color + self._orig = { + "priority": self.priority, + "hierarchy": self.hierarchy, + "category": self.category, + "color": self.color, + } locations = [] @@ -394,10 +396,7 @@ class LocationGroup(Location, models.Model): return (1, self.category.priority, self.priority) def save(self, *args, **kwargs): - if self.pk and (self.orig_color != self.color or - self.priority != self.orig_priority or - self.hierarchy != self.orig_hierarchy or - self.category_id != self.orig_category_id): + if self.pk and any(getattr(self, attname) != value for attname, value in self._orig.items()): self.register_changed_geometries() super().save(*args, **kwargs)