diff options
| -rw-r--r-- | archaeological_finds/tests.py | 98 | ||||
| -rw-r--r-- | ishtar_common/models.py | 7 | ||||
| -rw-r--r-- | ishtar_common/utils.py | 9 | 
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 | 
