""" Author: Michel Peltriaux Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany Contact: michel.peltriaux@sgdnord.rlp.de Created on: 07.03.22 """ import base64 import xmltodict from django.db.models import Sum from django.utils import formats from intervention.models import Intervention from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP class EgonExporter: """ EGON is the payment management system of SNU RLP. Due to compatibility reasons we need to provide the old style of data transmission between KSP and EGON: 1. Create GML from intervention object 2. Send created GML to the appropriate RabbitMQ channel """ intervention = None gml_builder = None def __init__(self, intervention: Intervention): self.intervention = intervention self.gml_builder = EgonGmlBuilder(intervention) def export_to_rabbitmq(self): raise NotImplementedError("ToDo!") class EgonGmlBuilder: """ Creates the GML for EGON export """ intervention = None gml = None def __init__(self, intervention: Intervention): self.intervention = intervention self.gml = self.build_gml() def _gen_flurstuecksKennzeichen(self, parcel): """ Generates oneo:flurstuecksKennzeichen to provide backwards compatibility Args: parcel (Parcel): The requested parcel Returns: str """ gmrkng_code = "000000" flr_code = "{0:03d}".format(int(parcel.flr or 0)) flrstckzhlr_code = "{0:05d}".format(int(parcel.flrstck_zhlr or 0)) flrstcknnr_code = "{0:06d}".format(int(parcel.flrstck_nnr or 0)) return gmrkng_code + flr_code + flrstckzhlr_code + flrstcknnr_code def _sum_all_payments(self): all_payments = self.intervention.payments.aggregate( summed=Sum("amount") )["summed"] return all_payments def _gen_kompensationsArt(self): comp_type = "Ersatzzahlung" if self.intervention.compensations.exists(): comp_type += " und Kompensation" return comp_type def _gen_geometry_list(self): geom = self.intervention.geometry.geom geom.transform(DEFAULT_SRID_RLP) geoms_list = [ { "gml:Polygon": { "gml:exterior": { "gml:LinearRing": { "gml:posList": " ".join([f"{str(coord[0])},{str(coord[1])}" for coord in coords[0]]) } } } } for coords in geom.coords ] return geoms_list def _gen_raumreferenz(self): parcels = self.intervention.get_underlying_parcels() spatial_reference_list = [ { "oneo:datumAbgleich": None, "oneo:ortsangabe": { "oneo:Ortsangaben": { "oneo:kreisSchluessel": parcel.district.krs, "oneo:gemeindeSchluessel": parcel.district.gmnd, "oneo:verbandsgemeindeSchluessel": parcel.gmrkng, "oneo:flurstuecksKennzeichen": self._gen_flurstuecksKennzeichen(parcel), } }, } for parcel in parcels ] return spatial_reference_list def _gen_foto(self): revoc_docs, regular_docs = self.intervention.get_documents() docs_list = [ { "oneo:Foto": { "oneo:aufnahmezeitpunkt": formats.localize(doc.date_of_creation), "oneo:bemerkung": doc.comment, "oneo:fotoverweis": base64.b64encode(doc.file.read()).decode("utf-8"), "oneo:dateiname": doc.title, "oneo:hauptfoto": False, } } for doc in regular_docs ] return docs_list def build_gml(self): xml_dict = { "wfs:FeatureCollection": { "oneo:Eingriffsverfahren": { "@gml:id": self.intervention.identifier, "oneo:azEintragungsstelle": self.intervention.responsible.conservation_file_number, "oneo:azZulassungsstelle": self.intervention.responsible.registration_file_number, "oneo:bemerkungZulassungsstelle": None, "oneo:eintragungsstelle": self.intervention.responsible.conservation_office.long_name, "oneo:zulassungsstelle": self.intervention.responsible.registration_office.long_name, "oneo:ersatzzahlung": self._sum_all_payments(), "oneo:kompensationsart": self._gen_kompensationsArt(), "oneo:verfahrensrecht": self.intervention.legal.laws.first().short_name, "oneo:verfahrenstyp": self.intervention.legal.process_type.long_name, "oneo:eingreifer": { "oneo:Eingreifer": { "oneo:art": self.intervention.responsible.handler.type.long_name, "oneo:bemerkung": self.intervention.responsible.handler.type.long_name, } }, "oneo:erfasser": { "oneo:Erfasser": { "oneo:name": None, "oneo:bemerkung": None, } }, "oneo:zulassung": { "oneo:Zulassungstermin": { "oneo:bauBeginn": formats.localize(self.intervention.payments.first().due_on), "oneo:erlass": formats.localize(self.intervention.legal.registration_date), "oneo:rechtsKraft": formats.localize(self.intervention.legal.binding_date), } }, "oneo:geometrie": { "gml:multiSurfaceProperty": { "gml:MultiPolygon": { "@srsName": f"http://www.opengis.net/gml/srs/epsg.xml#{DEFAULT_SRID_RLP}", "gml:polygonMember": self._gen_geometry_list(), } }, }, "oneo:kennung": self.intervention.identifier, "oneo:bezeichnung": self.intervention.title, "oneo:bemerkung": self.intervention.comment, "oneo:verantwortlicheStelle": None, "oneo:veroffentlichtAm": None, "oneo:raumreferenz": { "oneo:Raumreferenz": self._gen_raumreferenz(), }, "oneo:foto": self._gen_foto(), } }, } gml = xmltodict.unparse(xml_dict) return gml