summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-02-19 20:12:56 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-04-24 19:38:56 +0200
commit0e34062d370da99b1c1711a0045bd639d1add20e (patch)
treea25c51fe15544468460b93825f8b12d926c05de9
parent34868fbe8f2f733d4d8513c8f5f2b0656f62abff (diff)
downloadIshtar-0e34062d370da99b1c1711a0045bd639d1add20e.tar.bz2
Ishtar-0e34062d370da99b1c1711a0045bd639d1add20e.zip
Geom: fi x, y overload by form - geo tests
-rw-r--r--archaeological_finds/tests.py98
-rw-r--r--ishtar_common/models.py7
-rw-r--r--ishtar_common/utils.py9
3 files changed, 109 insertions, 5 deletions
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py
index 7303ed56d..9efd6ac79 100644
--- a/archaeological_finds/tests.py
+++ b/archaeological_finds/tests.py
@@ -22,6 +22,7 @@ import json
from django.conf import settings
from django.contrib.auth.models import User, Permission, ContentType
+from django.contrib.gis.geos import GEOSGeometry
from django.core.files import File
from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.urlresolvers import reverse
@@ -31,7 +32,7 @@ from ishtar_common.models import ImporterType, IshtarUser, ImporterColumn,\
from django.utils.translation import pgettext_lazy, gettext_lazy as _
from ishtar_common.models import Person, get_current_profile, UserProfile, \
- Town, Area, Document
+ Town, Area, Document, SpatialReferenceSystem
from archaeological_context_records.models import Period, Dating, \
ContextRecord, DatingType, DatingQuality
from archaeological_finds import models, views
@@ -1444,3 +1445,98 @@ class TreatmentTest(FindInit, TestCase):
self.assertEqual(q.count(), 1)
initial_find = q.all()[0]
self.assertEqual(initial_find.upstream_treatment, None)
+
+
+class GeomaticTest(FindInit, TestCase):
+ fixtures = FIND_FIXTURES
+ model = models.Find
+
+ def setUp(self):
+ self.create_finds(data_base={"label": u"Find 1"}, force=True)
+
+ def test_post_save_point(self):
+ find = self.finds[0]
+ base_find = find.base_finds.all()[0]
+
+ srs, __ = SpatialReferenceSystem.objects.get_or_create(
+ txt_idx='wgs84', defaults={"srid": 4326, "label": 'WGS84',
+ 'auth_name': 'EPSG'}
+ )
+
+ # db source
+ geom = GEOSGeometry('POINT({} {} {})'.format(2, 43, 1), srid=4326)
+ base_find.point = geom
+ base_find.save()
+ base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ self.assertIsNotNone(base_find.point)
+ self.assertIsNotNone(base_find.point_2d)
+ self.assertIsNotNone(base_find.x)
+ self.assertIsNotNone(base_find.y)
+ self.assertIsNotNone(base_find.z)
+ self.assertEqual(base_find.point_source, 'P') # precise
+ self.assertEqual(base_find.point_source_item,
+ unicode(models.BaseFind._meta.verbose_name))
+
+ # form input
+ base_find.x = 2
+ base_find.y = 3
+ base_find.z = 4
+ base_find.spatial_reference_system = srs
+ base_find.save()
+ base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ self.assertIsNotNone(base_find.point_2d)
+ self.assertIsNotNone(base_find.point)
+ self.assertEqual(base_find.point_source, 'P') # precise
+ self.assertEqual(base_find.point_source_item,
+ unicode(models.BaseFind._meta.verbose_name))
+
+ # reinit
+ base_find.x = None
+ base_find.y = None
+ base_find.z = None
+ base_find.save()
+ base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ self.assertIsNone(base_find.point_2d)
+ self.assertIsNone(base_find.point)
+ self.assertEqual(base_find.point_source, None)
+ self.assertEqual(base_find.point_source_item, None)
+
+ profile, created = IshtarSiteProfile.objects.get_or_create(
+ slug='default', active=True)
+ profile.use_town_for_geo = True
+ profile.save()
+
+ # geom from context record town
+ center = 'POINT(6 10)'
+ limit = 'MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),'\
+ '((6 3,9 2,9 4,6 3)))'
+ cr = ContextRecord.objects.get(pk=base_find.context_record.pk)
+ t = cr.town
+ t.center ='SRID=4326;' + center
+ t.limit = 'SRID=4326;' + limit
+ t.save()
+ cr = ContextRecord.objects.get(pk=base_find.context_record.pk)
+ base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ base_find.save()
+ self.assertEqual(base_find.point_2d, cr.town.center)
+ self.assertEqual(base_find.multi_polygon, cr.town.limit)
+ self.assertEqual(base_find.point_source, 'T') # town
+ self.assertEqual(base_find.point_source_item,
+ unicode(ContextRecord._meta.verbose_name))
+
+ # overload of coordinates by form
+ base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ base_find.x = 5
+ base_find.y = 6
+ base_find.z = 1
+ base_find.spatial_reference_system = srs
+ base_find.save()
+
+ base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ self.assertIsNotNone(base_find.point_2d)
+ self.assertIsNotNone(base_find.point)
+ self.assertEqual(base_find.point_2d.wkt, 'POINT (5 6)')
+ self.assertEqual(base_find.point_source, 'P') # precise
+ self.assertEqual(base_find.point_source_item,
+ unicode(models.BaseFind._meta.verbose_name))
+
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 28e469e31..9dd90de65 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -3085,10 +3085,11 @@ class Town(Imported, models.Model):
def generate_area(self, force=False):
if not force and (self.surface or not self.limit):
return
- self.surface = self.limit.transform(settings.SURFACE_SRID,
- clone=True).area
- if not self.surface:
+ surface = self.limit.transform(settings.SURFACE_SRID,
+ clone=True).area
+ if surface > 214748364 or not surface:
return False
+ self.surface = surface
self.save()
return True
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index a263f3640..c9b53c5ee 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -499,8 +499,15 @@ def post_save_geo(sender, **kwargs):
current_source = unicode(instance.__class__._meta.verbose_name)
if instance.point_source_item and \
instance.point_source_item != current_source: # refetch
+ csrs = instance.spatial_reference_system
+
+ if instance.x and instance.y:
+ new_point = GEOSGeometry(
+ 'POINT({} {})'.format(instance.x, instance.y), srid=csrs.srid)
+ proj_point = instance.point_2d.transform(csrs.srid, clone=True)
+ if new_point.distance(proj_point) < 0.0001:
+ instance.x, instance.y = None, None
instance.point, instance.point_2d = None, None
- instance.x, instance.y = None, None
instance.point_source = None
point = instance.point