Merge pull request 'geometry_srid_migration' (#183) from geometry_srid_migration into master
Reviewed-on: SGD-Nord/konova#183
This commit is contained in:
		
						commit
						2206565673
					
				@ -12,6 +12,7 @@ from django.contrib.gis import geos
 | 
			
		||||
from django.urls import reverse
 | 
			
		||||
 | 
			
		||||
from api.tests.v1.share.test_api_sharing import BaseAPIV1TestCase
 | 
			
		||||
from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class APIV1UpdateTestCase(BaseAPIV1TestCase):
 | 
			
		||||
@ -63,6 +64,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase):
 | 
			
		||||
 | 
			
		||||
        put_props = put_body["properties"]
 | 
			
		||||
        put_geom = geos.fromstr(json.dumps(put_body))
 | 
			
		||||
        put_geom.transform(DEFAULT_SRID_RLP)
 | 
			
		||||
        self.assertEqual(put_geom, self.intervention.geometry.geom)
 | 
			
		||||
        self.assertEqual(put_props["title"], self.intervention.title)
 | 
			
		||||
        self.assertNotEqual(modified_on, self.intervention.modified)
 | 
			
		||||
@ -92,6 +94,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase):
 | 
			
		||||
 | 
			
		||||
        put_props = put_body["properties"]
 | 
			
		||||
        put_geom = geos.fromstr(json.dumps(put_body))
 | 
			
		||||
        put_geom.transform(DEFAULT_SRID_RLP)
 | 
			
		||||
        self.assertEqual(put_geom, self.compensation.geometry.geom)
 | 
			
		||||
        self.assertEqual(put_props["title"], self.compensation.title)
 | 
			
		||||
        self.assertNotEqual(modified_on, self.compensation.modified)
 | 
			
		||||
@ -121,6 +124,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase):
 | 
			
		||||
 | 
			
		||||
        put_props = put_body["properties"]
 | 
			
		||||
        put_geom = geos.fromstr(json.dumps(put_body))
 | 
			
		||||
        put_geom.transform(DEFAULT_SRID_RLP)
 | 
			
		||||
        self.assertEqual(put_geom, self.eco_account.geometry.geom)
 | 
			
		||||
        self.assertEqual(put_props["title"], self.eco_account.title)
 | 
			
		||||
        self.assertNotEqual(modified_on, self.eco_account.modified)
 | 
			
		||||
@ -152,6 +156,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase):
 | 
			
		||||
 | 
			
		||||
        put_props = put_body["properties"]
 | 
			
		||||
        put_geom = geos.fromstr(json.dumps(put_body))
 | 
			
		||||
        put_geom.transform(DEFAULT_SRID_RLP)
 | 
			
		||||
        self.assertEqual(put_geom, self.ema.geometry.geom)
 | 
			
		||||
        self.assertEqual(put_props["title"], self.ema.title)
 | 
			
		||||
        self.assertNotEqual(modified_on, self.ema.modified)
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@ from django.contrib.gis import geos
 | 
			
		||||
from django.contrib.gis.geos import GEOSGeometry
 | 
			
		||||
from django.core.paginator import Paginator
 | 
			
		||||
 | 
			
		||||
from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP
 | 
			
		||||
from konova.utils.message_templates import DATA_UNSHARED
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -133,6 +134,8 @@ class AbstractModelAPISerializer:
 | 
			
		||||
        if isinstance(geojson, dict):
 | 
			
		||||
            geojson = json.dumps(geojson)
 | 
			
		||||
        geometry = geos.fromstr(geojson)
 | 
			
		||||
        if geometry.srid != DEFAULT_SRID_RLP:
 | 
			
		||||
            geometry.transform(DEFAULT_SRID_RLP)
 | 
			
		||||
        if geometry.empty:
 | 
			
		||||
            geometry = None
 | 
			
		||||
        return geometry
 | 
			
		||||
 | 
			
		||||
@ -369,14 +369,14 @@ class SimpleGeomForm(BaseForm):
 | 
			
		||||
            if self.instance is None or self.instance.geometry is None:
 | 
			
		||||
                raise LookupError
 | 
			
		||||
            geometry = self.instance.geometry
 | 
			
		||||
            geometry.geom = self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID))
 | 
			
		||||
            geometry.geom = self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID_RLP))
 | 
			
		||||
            geometry.modified = action
 | 
			
		||||
 | 
			
		||||
            geometry.save()
 | 
			
		||||
        except LookupError:
 | 
			
		||||
            # No geometry or linked instance holding a geometry exist --> create a new one!
 | 
			
		||||
            geometry = Geometry.objects.create(
 | 
			
		||||
                geom=self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID)),
 | 
			
		||||
                geom=self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID_RLP)),
 | 
			
		||||
                created=action,
 | 
			
		||||
            )
 | 
			
		||||
        # Start the parcel update procedure in a background process
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										35
									
								
								konova/migrations/0012_auto_20220713_0801.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								konova/migrations/0012_auto_20220713_0801.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
# Generated by Django 3.1.3 on 2022-07-13 06:01
 | 
			
		||||
import django
 | 
			
		||||
from django.db import migrations
 | 
			
		||||
 | 
			
		||||
from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def migrate_geometry_srs(apps, schema_editor):
 | 
			
		||||
    Geometry = apps.get_model("konova", "Geometry")
 | 
			
		||||
    all_geoms = Geometry.objects.all()
 | 
			
		||||
 | 
			
		||||
    # Transform all geoms and store in new geom field
 | 
			
		||||
    for geometry in all_geoms:
 | 
			
		||||
        geom = geometry.geom
 | 
			
		||||
        if geom is None:
 | 
			
		||||
            continue
 | 
			
		||||
        geom.transform(DEFAULT_SRID_RLP)
 | 
			
		||||
        geometry.geom_tmp = geom
 | 
			
		||||
        geometry.save()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('konova', '0011_auto_20220420_1101'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.AddField(
 | 
			
		||||
            model_name="geometry",
 | 
			
		||||
            name="geom_tmp",
 | 
			
		||||
            field=django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=DEFAULT_SRID_RLP)
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.RunPython(migrate_geometry_srs),
 | 
			
		||||
    ]
 | 
			
		||||
							
								
								
									
										22
									
								
								konova/migrations/0013_auto_20220713_0814.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								konova/migrations/0013_auto_20220713_0814.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
# Generated by Django 3.1.3 on 2022-07-13 06:14
 | 
			
		||||
 | 
			
		||||
from django.db import migrations
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('konova', '0012_auto_20220713_0801'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.RemoveField(
 | 
			
		||||
            model_name="geometry",
 | 
			
		||||
            name="geom"
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.RenameField(
 | 
			
		||||
            model_name="geometry",
 | 
			
		||||
            old_name="geom_tmp",
 | 
			
		||||
            new_name="geom"
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
@ -21,8 +21,7 @@ class Geometry(BaseResource):
 | 
			
		||||
    """
 | 
			
		||||
    Geometry model
 | 
			
		||||
    """
 | 
			
		||||
    from konova.settings import DEFAULT_SRID
 | 
			
		||||
    geom = MultiPolygonField(null=True, blank=True, srid=DEFAULT_SRID)
 | 
			
		||||
    geom = MultiPolygonField(null=True, blank=True, srid=DEFAULT_SRID_RLP)
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return str(self.id)
 | 
			
		||||
 | 
			
		||||
@ -430,15 +430,13 @@ class BaseTestCase(TestCase):
 | 
			
		||||
            self.assertTrue(True)
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        tolerance = 0.001
 | 
			
		||||
        if geom1.srid != geom2.srid:
 | 
			
		||||
            tolerance = 0.001
 | 
			
		||||
            # Due to prior possible transformation of any of these geometries, we need to make sure there exists a
 | 
			
		||||
            # transformation from one coordinate system into the other, which is valid
 | 
			
		||||
            geom1_t = geom1.transform(geom2.srid, clone=True)
 | 
			
		||||
            geom2_t = geom2.transform(geom1.srid, clone=True)
 | 
			
		||||
            self.assertTrue(geom1_t.equals_exact(geom2, tolerance) or geom2_t.equals_exact(geom1, tolerance))
 | 
			
		||||
        else:
 | 
			
		||||
            self.assertTrue(geom1.equals(geom2))
 | 
			
		||||
            geom1.transform(geom2.srid)
 | 
			
		||||
            geom2.transform(geom1.srid)
 | 
			
		||||
        self.assertTrue(geom1.equals_exact(geom2, tolerance) or geom2.equals_exact(geom1, tolerance))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BaseViewTestCase(BaseTestCase):
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user