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)))
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue