zurück zur Karte

Backend für Bohrlochanträge

wenn wir von einer solchen Datenbankstruktur ausgehen:


CREATE EXTENSION IF NOT EXISTS postgis;

CREATE TABLE bohrlochantraege (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    beschreibung TEXT,
    antragsdatum DATE,
    geometrie GEOMETRY(GEOMETRY, 4326), -- Unterstützt Punkte, Linien und Polygone
    antragsteller_id INTEGER,
    status VARCHAR(50)
);



    

dann könnte das so aussehen in zope


from Products.Five.browser import BrowserView
from zope.interface import Interface
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
from sqlalchemy import create_engine, Column, Integer, String, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from geoalchemy2 import Geography
import json
import transaction

Base = declarative_base()

class IGeoJSONView(Interface):
    """
    GeoJSON view interface.
    """

class GeoJSONView(BrowserView):
    def __init__(self, context, request):
        self.context = context
        self.request = request

    def __call__(self):
        if self.request.method != 'POST':
            self.request.response.setStatus(405)
            return "Method Not Allowed"

        data = json.loads(self.request['BODY'])

        DATABASE_URL = "postgresql://user:password@localhost/dbname"
        engine = create_engine(DATABASE_URL)
        Session = sessionmaker(bind=engine)
        session = Session()

        try:
            for feature in data['features']:
                geom = json.dumps(feature['geometry'])
                antrag = BohrlochAntrag(
                    name=feature['properties'].get('name', ''),
                    beschreibung=feature['properties'].get('beschreibung', ''),
                    antragsdatum=feature['properties'].get('antragsdatum', None),
                    geometrie='SRID=4326;' + geom,
                    antragsteller_id=feature['properties'].get('antragsteller_id', 0),
                    status=feature['properties'].get('status', '')
                )
                session.add(antrag)
            session.commit()
            self.request.response.setStatus(200)
            return "GeoJSON erfolgreich eingefügt"
        except Exception as e:
            session.rollback()
            self.request.response.setStatus(500)
            return "Ein Fehler ist aufgetreten: " + str(e)
        finally:
            session.close()

class BohrlochAntrag(Base):
    __tablename__ = 'bohrlochantraege'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    beschreibung = Column(String)
    antragsdatum = Column(Date)
    geometrie = Column(Geography(geometry_type='GEOMETRY', srid=4326))
    antragsteller_id = Column(Integer)
    status = Column(String)

def includeme(config):
    config.scan(__name__)

fehlt nur noch ein bisschen ajax und ein speichern button