From 228333d5095dee6db57741dfec9565cb848a2d4e Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Thu, 10 Mar 2022 15:31:47 +0100 Subject: [PATCH] #132 WIP Old entries * WIP: implements raw migration from ksp to konova --- .../management/commands/migrate_ksp_konova.py | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 konova/management/commands/migrate_ksp_konova.py diff --git a/konova/management/commands/migrate_ksp_konova.py b/konova/management/commands/migrate_ksp_konova.py new file mode 100644 index 00000000..26cc4156 --- /dev/null +++ b/konova/management/commands/migrate_ksp_konova.py @@ -0,0 +1,79 @@ +import psycopg2 +from django.contrib.gis.geos import MultiPolygon, GEOSException, MultiPoint, MultiLineString, Polygon + +from intervention.models import Intervention, Legal, Responsibility +from konova.management.commands.setup import BaseKonovaCommand +from konova.models import Geometry +from konova.tasks import celery_update_parcels + + +class Command(BaseKonovaCommand): + help = "Migrates from KSP database to Konova" + db_connection = None + + def add_arguments(self, parser): + parser.add_argument('--host', type=str) + parser.add_argument('--db-user', type=str) + parser.add_argument('--db-pw', type=str) + + def handle(self, *args, **options): + try: + self.connect_db(options) + self.migrate_interventions() + + if self.db_connection is not None: + self.db_connection.close() + except KeyboardInterrupt: + self._break_line() + exit(-1) + + def connect_db(self, options): + conn = psycopg2.connect( + host=options["host"], + database="ksp", + user=options["db_user"], + password=options["db_pw"], + ) + self._write_success("Connected to ksp db...") + self.db_connection = conn + + def migrate_interventions(self): + cursor = self.db_connection.cursor() + cursor.execute( + 'select om."KENNUNG", linf."OBJBEZ", ST_AsEWKT(ST_Transform(ST_MakeValid(geomf.the_geom),4326)) as geomf, ST_AsEWKT(ST_Transform(ST_MakeValid(geoml.the_geom),4326)) as geoml, ST_AsEWKT(ST_Transform(ST_MakeValid(geomp.the_geom),4326)) as geomp from "OBJ_MASTER" om left join "LINFOS" linf on om."GISPADID"=linf."GISPADID" left join geometry_f geomf on om."GISPADID"=geomf.gispadid left join geometry_l geoml on om."GISPADID"=geoml.gispadid left join geometry_p geomp on om."GISPADID"=geomp.gispadid where om."OKL"=7730085 and om.archiv=false;' + ) + all_eivs = cursor.fetchall() + for eiv in all_eivs: + intervention = Intervention.objects.get_or_create( + identifier=eiv[0] + )[0] + intervention.title = eiv[1] + try: + # eiv[2] == polygon, eiv[3] == line, eiv[4] == point + if eiv[2] is not None: + eiv_geom = MultiPolygon.from_ewkt(eiv[2]) + elif eiv[3] is not None: + eiv_geom = MultiPoint.from_ewkt(eiv[3]) + eiv_geom = eiv_geom.buffer(0.00001, 1) + if isinstance(eiv_geom, Polygon): + eiv_geom = MultiPolygon(eiv_geom) + elif eiv[4] is not None: + eiv_geom = MultiLineString.from_ewkt(eiv[4]) + eiv_geom = eiv_geom.buffer(0.00001, 1) + if isinstance(eiv_geom, Polygon): + eiv_geom = MultiPolygon(eiv_geom) + else: + eiv_geom = None + except GEOSException: + self._write_error(f"Malicious geometry on {eiv}") + return + geom = intervention.geometry or Geometry() + geom.geom = eiv_geom + geom.save() + #celery_update_parcels.delay(geom.id) + + intervention.geometry = geom + intervention.legal = intervention.legal or Legal.objects.create() + intervention.responsible = intervention.responsible or Responsibility.objects.create() + intervention.save() +