summaryrefslogtreecommitdiff
path: root/ishtar_common/utils.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-02-19 17:36:25 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-04-24 19:38:56 +0200
commit4f63ed814f96bbc68c22c98b799c3911d62aa737 (patch)
tree1ac2de99841b7a28fee128a68700f59458594f14 /ishtar_common/utils.py
parentb6d3f2dc4a24bb055b73b7c80815685572a83086 (diff)
downloadIshtar-4f63ed814f96bbc68c22c98b799c3911d62aa737.tar.bz2
Ishtar-4f63ed814f96bbc68c22c98b799c3911d62aa737.zip
Geo: manage container and warehouse - manage geo save dependencies
Diffstat (limited to 'ishtar_common/utils.py')
-rw-r--r--ishtar_common/utils.py104
1 files changed, 84 insertions, 20 deletions
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 408309c4e..2aa8db298 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -487,18 +487,28 @@ def post_save_geo(sender, **kwargs):
"""
Convert raw x, y, z point to real geo field
"""
- if not kwargs.get('instance'):
+ if not kwargs.get('instance') or getattr(kwargs['instance'],
+ '_post_saved_geo', False):
return
from ishtar_common.models import get_current_profile # not clean but utils
# is loaded before models
instance = kwargs.get('instance')
+ current_source = unicode(instance.__class__._meta.verbose_name)
+ if instance.point_source_item and \
+ instance.point_source_item != current_source: # refetch
+ instance.point, instance.point_2d = None, None
+ instance.x, instance.y = None, None
+ instance.point_source = None
+
point = instance.point
point_2d = instance.point_2d
profile = get_current_profile()
modified = False
+ print (instance)
- if (point or point_2d) and instance.x is None: # db source
+ if (point or point_2d) and instance.x is None and not \
+ instance.point_source: # db source
if point:
current_point = point
instance.z = point.z
@@ -509,11 +519,13 @@ def post_save_geo(sender, **kwargs):
srs = get_srid_obj_from_point(current_point)
instance.spatial_reference_system = srs
instance.point_source = 'P'
+ instance.point_source_item = current_source
if not point_2d:
instance.point_2d = convert_coordinates_to_point(
instance.point.x, instance.point.y,
srid=current_point.srid)
- elif not instance.point_source and instance.x and instance.y and \
+ modified = True
+ elif instance.x and instance.y and \
instance.spatial_reference_system and \
instance.spatial_reference_system.auth_name == 'EPSG' and \
instance.spatial_reference_system.srid != 0: # form input
@@ -523,43 +535,95 @@ def post_save_geo(sender, **kwargs):
srid=instance.spatial_reference_system.srid)
except forms.ValidationError:
return # irrelevant data in DB
+ distance = 1 # arbitrary
+ if point_2d and instance.point_2d:
+ distance = point_2d.transform(
+ 4326, clone=True).distance(
+ instance.point_2d.transform(4326, clone=True))
+
if instance.z:
point = convert_coordinates_to_point(
instance.x, instance.y, instance.z,
srid=instance.spatial_reference_system.srid)
- if point_2d != instance.point_2d or point != instance.point:
+ # no change if distance inf to 1 mm
+ if distance >= 0.0001 and (point_2d != instance.point_2d
+ or point != instance.point):
instance.point = point
instance.point_2d = point_2d
instance.point_source = 'P'
+ instance.point_source_item = current_source
modified = True
- elif not point_2d and profile.use_town_for_geo: # try to get from parent
- point_2d = instance.get_town_centroid()
- if point_2d != instance.point_2d:
+ else:
+ instance.point_source = None
+ # get coordinates from parents
+ precise_points = instance.get_precise_points()
+ if precise_points:
+ point_2d, point, source_item = precise_points
instance.point_2d = point_2d
- instance.point_source = 'T' # town
+ instance.point = point
+ instance.point_source = 'P'
+ instance.point_source_item = source_item
instance.x = point_2d.x
instance.y = point_2d.y
+ if point:
+ instance.z = point.z
srs = get_srid_obj_from_point(point_2d)
instance.spatial_reference_system = srs
modified = True
- if not hasattr(instance, 'multi_polygon'):
- return
-
- if instance.multi_polygon and not instance.multi_polygon_source:
- # should be a db source
- instance.multi_polygon_source = 'P'
- modified = True
- elif profile.use_town_for_geo and instance.multi_polygon_source != 'P':
- poly = instance.get_town_polygons()
- if poly and poly != instance.multi_polygon:
- instance.multi_polygon_source = 'T' # town
- instance.multi_polygon = poly
+ elif profile.use_town_for_geo: # try to get from parent
+ centroid = instance.get_town_centroid()
+ if centroid and centroid[0]:
+ instance.point_2d, instance.point_source_item = centroid
+ instance.point = None
+ instance.point_source = 'T'
+ instance.x = instance.point_2d.x
+ instance.y = instance.point_2d.y
+ srs = get_srid_obj_from_point(instance.point_2d)
+ instance.spatial_reference_system = srs
+ modified = True
+ else:
+ instance.point_2d, instance.point_source_item = None, None
+ instance.point = None
+ instance.point_source = None
+ modified = True
+
+ if hasattr(instance, 'multi_polygon'):
+ if instance.multi_polygon_source_item and \
+ instance.multi_polygon_source_item != current_source: # refetch
+ instance.multi_polygon = None
+ instance.multi_polygon_source = None
+
+ if instance.multi_polygon and not instance.multi_polygon_source:
+ # should be a db source
+ instance.multi_polygon_source = 'P'
+ instance.multi_polygon_source_item = current_source
modified = True
+ elif instance.multi_polygon_source != 'P':
+ precise_poly = instance.get_precise_polygons()
+ if precise_poly:
+ poly, source_item = precise_poly
+ instance.multi_polygon = poly
+ instance.multi_polygon_source = 'P'
+ instance.multi_polygon_source_item = source_item
+ modified = True
+ elif profile.use_town_for_geo:
+ poly = instance.get_town_polygons()
+ if poly:
+ poly, poly_source = poly
+ if poly != instance.multi_polygon:
+ instance.multi_polygon_source_item = poly_source
+ instance.multi_polygon_source = 'T' # town
+ try:
+ instance.multi_polygon = poly
+ modified = True
+ except TypeError:
+ print(instance, instance.pk)
if modified:
instance.skip_history_when_saving = True
+ instance._post_saved_geo = True
instance.save()
return