an attempt to get rid of missing _orig with changesets
This commit is contained in:
parent
ae2303ce22
commit
6390a51fc6
5 changed files with 25 additions and 27 deletions
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue