an attempt to get rid of missing _orig with changesets

This commit is contained in:
Laura Klünder 2024-12-05 20:42:25 +01:00
parent ae2303ce22
commit 6390a51fc6
5 changed files with 25 additions and 27 deletions

View file

@ -167,14 +167,12 @@ class UpdateObjectOperation(BaseOperation):
}) })
instances = list(serializers.deserialize("json", json.dumps(data))) instances = list(serializers.deserialize("json", json.dumps(data)))
for i in instances: for i in instances:
instance = i.object new_instance = i.object
if "geometry" in self.fields: if hasattr(instance, "_orig") and not hasattr(new_instance, "_orig"):
with suppress(AttributeError): new_instance._orig = instance._orig
instance.register_change() if hasattr(instance, "_orig_geometry") and not hasattr(new_instance, "_orig_geometry"):
with suppress(AttributeError): new_instance._orig_geometry = instance._orig_geometry
# todo: this is overkill, not always needed, we should do this differently anyways new_instance.save()
instance.register_changed_geometries()
instance.save()
return instances[-1].object return instances[-1].object

View file

@ -10,6 +10,7 @@ from c3nav.mapdata.fields import I18nField
from c3nav.mapdata.models import MapUpdate from c3nav.mapdata.models import MapUpdate
# todo: get rid of this?
class SerializableMixin(models.Model): class SerializableMixin(models.Model):
_affected_by_changeset = None _affected_by_changeset = None

View file

@ -32,7 +32,7 @@ class GeometryMixin(SerializableMixin):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if not self.no_orig: 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() self._orig = {field.attname: (None if field.attname in self.get_deferred_fields()
else getattr(self, field.attname)) else getattr(self, field.attname))
for field in self._meta.get_fields() for field in self._meta.get_fields()
@ -106,24 +106,24 @@ class GeometryMixin(SerializableMixin):
@property @property
def geometry_changed(self): def geometry_changed(self):
if self.orig_geometry is None: if self._orig_geometry is None:
return True return True
if self.geometry is self.orig_geometry: if self.geometry is self._orig_geometry:
return False 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 return True
field = self._meta.get_field('geometry') field = self._meta.get_field('geometry')
rounded = field.to_python(field.get_prep_value(self.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 True
return False return False
def get_changed_geometry(self): def get_changed_geometry(self):
field = self._meta.get_field('geometry') field = self._meta.get_field('geometry')
new_geometry = field.get_final_value(self.geometry) new_geometry = field.get_final_value(self.geometry)
if self.orig_geometry is None: if self._orig_geometry is None:
return new_geometry 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'): if self._meta.get_field('geometry').geomtype in ('polygon', 'multipolygon'):
difference = unary_union(assert_multipolygon(difference)) difference = unary_union(assert_multipolygon(difference))
return difference return difference

View file

@ -181,10 +181,10 @@ class ObstacleGroup(TitledMixin, models.Model):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.orig_color = self.color self._orig = {"color": self.color}
def save(self, *args, **kwargs): 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() self.register_changed_geometries()
super().save(*args, **kwargs) super().save(*args, **kwargs)

View file

@ -268,7 +268,7 @@ class LocationGroupCategory(SerializableMixin, models.Model):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.orig_priority = self.priority self._orig = {"priority": self.priority}
class Meta: class Meta:
verbose_name = _('Location Group Category') verbose_name = _('Location Group Category')
@ -290,7 +290,7 @@ class LocationGroupCategory(SerializableMixin, models.Model):
group.register_changed_geometries(do_query=False) group.register_changed_geometries(do_query=False)
def save(self, *args, **kwargs): 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() self.register_changed_geometries()
super().save(*args, **kwargs) super().save(*args, **kwargs)
@ -338,10 +338,12 @@ class LocationGroup(Location, models.Model):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.orig_priority = self.priority self._orig = {
self.orig_hierarchy = self.hierarchy "priority": self.priority,
self.orig_category_id = self.category_id "hierarchy": self.hierarchy,
self.orig_color = self.color "category": self.category,
"color": self.color,
}
locations = [] locations = []
@ -394,10 +396,7 @@ class LocationGroup(Location, models.Model):
return (1, self.category.priority, self.priority) return (1, self.category.priority, self.priority)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if self.pk and (self.orig_color != self.color or if self.pk and any(getattr(self, attname) != value for attname, value in self._orig.items()):
self.priority != self.orig_priority or
self.hierarchy != self.orig_hierarchy or
self.category_id != self.orig_category_id):
self.register_changed_geometries() self.register_changed_geometries()
super().save(*args, **kwargs) super().save(*args, **kwargs)