GeometryField.get_final_value() for comparing new values with old values

This commit is contained in:
Laura Klünder 2017-11-19 21:40:32 +01:00
parent b30fbe90d0
commit 9ffdf2052a
3 changed files with 22 additions and 16 deletions

View file

@ -78,23 +78,28 @@ class GeometryField(models.TextField):
elif self.geomtype == 'point' and not isinstance(value, Point):
raise exception('Expected Point instance, got %s instead.' % repr(value))
def get_final_value(self, value, as_json=False):
json_value = format_geojson(mapping(value))
rounded_value = shape(json_value)
shapely_logger.setLevel('ERROR')
if rounded_value.is_valid:
return json_value if as_json else rounded_value
shapely_logger.setLevel('INFO')
rounded_value = rounded_value.buffer(0)
if not rounded_value.is_empty:
value = rounded_value
else:
logging.debug('Fixing rounded geometry failed, saving it to the database without rounding.')
return format_geojson(mapping(value), round=False) if as_json else value
def get_prep_value(self, value):
if value is None:
return None
self._validate_geomtype(value, exception=TypeError)
json_value = format_geojson(mapping(value))
shapely_logger.setLevel('ERROR')
rounded_value = shape(json_value)
if not rounded_value.is_valid:
logging.debug('Rounded geometry is invalid, trying to fix this...')
rounded_value = rounded_value.buffer(0)
if not rounded_value.is_empty:
json_value = format_geojson(mapping(rounded_value), round=False)
else:
logging.debug('Fixing failed, saving it to the database without rounding.')
json_value = format_geojson(mapping(value), round=False)
shapely_logger.setLevel('INFO')
return json.dumps(json_value)
return json.dumps(self.get_final_value(value, as_json=True))
def value_to_string(self, obj):
value = self.value_from_object(obj)

View file

@ -119,8 +119,7 @@ class GeometryMixin(SerializableMixin):
def get_changed_geometry(self):
field = self._meta.get_field('geometry')
new_geometry = self.geometry
new_geometry = field.to_python(field.get_prep_value(new_geometry))
new_geometry = field.get_final_value(self.geometry)
if self.orig_geometry is None:
return new_geometry
difference = new_geometry.symmetric_difference(self.orig_geometry)

View file

@ -496,6 +496,8 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
num_deleted = 0
num_created = 0
field = AltitudeArea._meta.get_field('geometry')
for candidate in all_candidates:
new_area = None
@ -516,7 +518,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
if potential_areas:
new_area = max(potential_areas, key=itemgetter(1))[0]
if not new_area.geometry.almost_equals(candidate.geometry):
if not field.get_final_value(new_area.geometry).almost_equals(candidate.geometry):
num_modified += 1
if new_area is None: