Skip to content
Snippets Groups Projects
script_helper.py 6.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • # helferscript mit klassen für den URI und adressen update
    # schuldatenbank heißt in der DB "schulen"
    import requests
    import psycopg2
    import json
    
    
    class DBTools:
        """
    
        Tools für das arbeiten mit der Datenbank, hier sind die select Funktionen
        zum auslesen der Daten und zum updaten der Daten mit den Adressen.
    
        def __init__(self, data: str) -> None:
    
            """
            Aufbauen der Verbindung zu der Datenbank
    
    
            :param str data: Connection String mit allen Informationen für die
                Verbindung zur Datenbank
    
            """
            self.db_connection = psycopg2.connect(data)
            self.cursor = self.db_connection.cursor()
    
        def select_adress(self):
            """
    
            Funktion zum selektieren der Adressdaten der Schulen um diese zu
            geocoden und ihnen URI aus dem AREG zuzuweisen.
    
            :returns: Tupel mit alten Adressdaten der Schulen
    
            :rtype: tuple
            """
    
    
            select_sql = """
            select
                lokaleID,
                adressealt_hnr,
                adressealt_strasse,
                adressealt_plz,
                adressealt_ort
            from
                prototyp_areg.schulen;"""
    
            self.cursor.execute(select_sql)
    
            query_result = self.cursor.fetchall()
    
            return query_result
    
        def select_uri(self):
            """
    
            Funktion zum selektieren der URI aus dem Datensatz um diese mit
            aktuellen AREG Adressen anzureichern.
    
            :return: Tupel mit den AREG URI die in der Datenbank vorhanden sind,
                Safeguard ist vorhanden damit keine NULL Werte kommen.
    
            :rtype: tuple
            """
    
    
            select_sql = """
            select
                distinct(areg_uri)
            from
                prototyp_areg.schulen
            where
                areg_uri like 'https://%';"""
    
            self.cursor.execute(select_sql)
    
            query_data = self.cursor.fetchall()
    
            return query_data
    
    
        def update_uri(self, param_dbid: str, param_uri: str) -> None:
    
            """
            Funktion zum Update der Datenbank mit den URI aus dem Geocoder.
    
            :param str param_dbid: ID der Schule aus der Datenbank (nicht AREG URI)
            :param str param_uri: AREG URI
            """
    
    
            sql_alter = """
            alter table
                prototyp_areg.schulen
            add column if not exists
                areg_uri varchar;
            """
    
            sql_update = f"""
            update
                prototyp_areg.schulen
            set
                areg_uri='{param_uri}'
            where
                lokaleID='{param_dbid}';
    
    
            self.cursor.execute(sql_alter)
            self.cursor.execute(sql_update)
    
        def update_adress(self, data, param_uri: str) -> None:
            """
            Funktion zum Update der Datenbank mit den neuen Adressdaten aus dem
            AREG anhand der URI.
    
            :param dict data: GeoJSON aus der AREG API mit den aktuellen
                Adressdaten
    
            :param param_uri: AREG URI zum zuordnen der Adressdaten
            """
            geometry = str(data['geometry'])
            geometry = geometry.replace("'", '"')
    
    
            sql_alter = """
            alter table
                prototyp_areg.schulen
            add column if not exists
                hnr varchar,
            add column if not exists
                strasse varchar,
            add column if not exists
                plz varchar,
            add column if not exists
                ort varchar,
            add column if not exists
                geom geometry(Point, 4326);
            """
    
            sql_update = f"""
            update
                prototyp_areg.schulen
            set
                hnr='{data['properties']['hnr']}',
                strasse='{data['properties']['stn']}',
                plz='{data['properties']['plz']}',
                ort='{data['properties']['ort']}',
                geom=ST_GeomFromGeoJSON('{geometry}')
            where
                areg_uri='{param_uri}';
            """
    
            self.cursor.execute(sql_alter)
            self.cursor.execute(sql_update)
    
        def closecursor(self) -> None:
    
            Funktion zum Commit und Schießen der Datenbankverbindung nachdem alle
            Änderungen vorgenommen wurden.
    
            """
            # schließt den cursor
            self.db_connection.commit()
            self.cursor.close()
            self.db_connection.close()
    
    
    class APITools:
        """
    
        Tools für das Arbeiten mit der pygeoAPI. Hier sind die Funktionen zum
        aufrufen des Geocoder Prozesses und zum Finden der Adresse anhand der URI
    
        """
        def __init__(self, param_url):
            """
    
            Festlegen der Base URL der API für die weitere Verwendung in den
            Funktionen der Klasse.
    
    
            :param str param_url: Base URL der API
            """
            self.base_url = param_url
    
    
        def geocode(self, data: dict) -> dict:
    
            Funktion zum Aufrufen des Geocoder Prozesses in der API. Bereinigung
            finden nicht in dieser Funktion oder diesem Skript sondern im Geocoder
            statt!
    
            :param dict data: Dictionary mit den alten Adressdaten
            :returns: Dictionary entweder mit einem "uri" Objekt oder einem
                "message" Objekt, wenn uri kommt ist alles gut, wenn message kommt
                dann ist ein fehler aufgetreten
    
            :rtype: dict
            """
            url = self.base_url + r"processes/geocoder/execution"
    
            result = {"message": "you should not see this"}
            request_body = {
                "inputs": {
                    "hnr": data["hnr"],
                    "ort": data["ort"],
                    "plz": data["plz"],
                    "stn": data["stn"],
                    "uri": True
                }
            }
    
            try:
                api_result = requests.post(url, json.dumps(request_body))
                api_result.raise_for_status()
                result = api_result.json()
            except requests.exceptions.ConnectionError as e:
                result = {"message": str(e)}
            except requests.exceptions.Timeout as e:
                result = {"message": str(e)}
            except requests.exceptions.HTTPError as e:
                result = {"message": str(e)}
    
            return result
    
        def findadresse(self, param_uri):
            """
            Funktion zum finden der Adresse im AREG anhand der vergebenen URI.
            :param str param_uri: URI des Datensatzes
            :return: GeoJSON des jeweiligen Items das der URI entspricht
            :rtype: dict
            """
            url = param_uri + r"?f=json"
            response = requests.get(url)
            response_json = response.json()
            return response_json