summaryrefslogtreecommitdiff
path: root/ishtar_common/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/utils.py')
-rw-r--r--ishtar_common/utils.py96
1 files changed, 54 insertions, 42 deletions
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 83627cafc..7a51936b1 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -497,8 +497,45 @@ def post_save_geo(sender, **kwargs):
current_source = "default"
if hasattr(instance.__class__, "_meta"):
current_source = unicode(instance.__class__._meta.verbose_name)
- if instance.point_source_item and \
- instance.point_source_item != current_source: # refetch
+
+ profile = get_current_profile()
+ modified = False
+
+ 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 (instance.point_source_item and
+ instance.point_source_item != current_source) or (
+ instance.point_source == 'M' and modified): # refetch
csrs = instance.spatial_reference_system
if instance.x and instance.y:
@@ -512,8 +549,6 @@ def post_save_geo(sender, **kwargs):
point = instance.point
point_2d = instance.point_2d
- profile = get_current_profile()
- modified = False
if (point or point_2d) and instance.x is None and not \
instance.point_source: # db source
@@ -579,13 +614,22 @@ def post_save_geo(sender, **kwargs):
srs = get_srid_obj_from_point(point_2d)
instance.spatial_reference_system = srs
modified = True
-
- 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
+ else:
+ centroid, source, point_source = None, None, None
+ if instance.multi_polygon and instance.multi_polygon_source == 'P':
+ source = current_source
+ centroid = instance.multi_polygon.centroid
+ point_source = 'M'
+ if not centroid and profile.use_town_for_geo: # try to get from
+ # parent
+ town_centroid = instance.get_town_centroid()
+ if town_centroid:
+ centroid, source = town_centroid
+ point_source = 'T'
+ if centroid:
+ instance.point_2d, instance.point_source_item = centroid, source
instance.point = None
- instance.point_source = 'T'
+ instance.point_source = point_source
instance.x = instance.point_2d.x
instance.y = instance.point_2d.y
srs = get_srid_obj_from_point(instance.point_2d)
@@ -597,38 +641,6 @@ def post_save_geo(sender, **kwargs):
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