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