Web-Anwendung zur einfachen Erfassung von Geodaten, die auf Django aufsetzt
- Python (>= v3.10)
- pip
- GDAL
- PostgreSQL mit der Erweiterung PostGIS
- npm
- optional Redis
- optional für App Toolbox siehe hier
-
neue virtuelle Python-Umgebung:
python3 -m venv /usr/local/datenwerft/venv
-
Projekt klonen:
git clone https://github.com/rostock/datenwerft /usr/local/datenwerft/datenwerft
-
virtuelle Python-Umgebung aktivieren:
source /usr/local/datenwerft/venv/bin/activate
-
benötigte Python-Module (unter anderem Django) installieren via pip:
pip install -r /usr/local/datenwerft/datenwerft/requirements.txt
-
leere PostgreSQL-Datenbank für die Anwendungsadministration anlegen
-
leere PostgreSQL-Datenbank mit der Erweiterung PostGIS für die App Antragsmanagement anlegen
-
leere PostgreSQL-Datenbank mit der Erweiterung PostGIS für die App BEMAS anlegen
-
leere PostgreSQL-Datenbank mit der Erweiterung PostGIS für die App Datenmanagement anlegen
-
Datenbankschema in Datenbank für die App Datenmanagement installieren (da keines der Datenmodelle in dieser App von Django verwaltet wird):
psql -h [Datenbankhost] -U [Datenbanknutzer] -d [Datenbankname] -f datenmanagement/sql/schema.sql
-
Konfigurationsdatei auf Basis der entsprechenden Vorlage erstellen:
cp /usr/local/datenwerft/datenwerft/secrets.template /usr/local/datenwerft/datenwerft/secrets.py
-
Konfigurationsdatei
/usr/local/datenwerft/datenwerft/settings.py
entsprechend anpassen -
Service-Datei für celery auf Basis der entsprechenden Vorlage erstellen:
cp /usr/local/datenwerft/datenwerft/celery.service.template /etc/systemd/system/celery.service
-
Service-Datei für celery entsprechend anpassen
-
virtuelle Python-Umgebung aktivieren:
source /usr/local/datenwerft/venv/bin/activate
-
JavaScript-Module via npm installieren:
npm install
-
Anwendung initialisieren:
cd /usr/local/datenwerft/datenwerft python manage.py migrate --database=antragsmanagement antragsmanagement python manage.py migrate --database=bemas bemas python manage.py migrate python manage.py antragsmanagement_roles_permissions python manage.py bemas_roles_permissions
-
Administrator initialisieren:
python manage.py createsuperuser
-
Webseiten für Hilfe bauen:
cd /usr/local/datenwerft/datenwerft/hilfe make html
-
statische Dateien initialisieren:
cd /usr/local/datenwerft/datenwerft python manage.py collectstatic -c
-
Besitzer und Gruppe des Anwendungsverzeichnisses entsprechend des genutzten HTTP-Servers anpassen – siehe unten:
chown -R wwwrun:www /usr/local/datenwerft/datenwerft
-
celery-Worker-Service aktivieren und starten:
sudo systemctl daemon-reload sudo systemctl start celery.service sudo systemctl enable celery.service
Deployment (am Beispiel des Apache HTTP Servers)
Wenn das Deployment mittels Apache HTTP Server realisiert werden soll, muss dessen Modul mod_wsgi (für Python v3.x) installiert sein, das ein Web Server Gateway Interface (WSGI) für das Hosting von Python-Anwendungen zur Verfügung stellt.
Konfigurationsdatei des Apache HTTP Servers öffnen und in etwa folgenden Inhalt einfügen (in diesem Beispiel nutzt die virtuelle Python-Umgebung einen Python-Interpreter der Version 3.6):
Alias /datenwerft/static /usr/local/datenwerft/datenwerft/static
Alias /datenwerft/uploads /usr/local/datenwerft/datenwerft/uploads
WSGIDaemonProcess datenwerft processes=2 threads=128 python-path=/usr/local/datenwerft/datenwerft:/usr/local/datenwerft/venv/lib/python3.10/site-packages
WSGIProcessGroup datenwerft
WSGIScriptAlias /datenwerft /usr/local/datenwerft/datenwerft/datenwerft/wsgi.py process-group=datenwerft
<Directory /usr/local/datenwerft/datenwerft/datenwerft>
<Files wsgi.py>
Order deny,allow
Require all granted
</Files>
</Directory>
<Directory /usr/local/datenwerft/datenwerft/static>
Order deny,allow
Require all granted
</Directory>
<Directory /usr/local/datenwerft/datenwerft/uploads>
Order deny,allow
Require all granted
</Directory>
Für die App BEMAS kann optional ein Cronjob eingerichtet werden, der folgenden Befehl ausführt:
python manage.py deletepersons
Dieser Befehl führt dazu, dass alle Personen gelöscht werden, die nicht als Ansprechpartner:innen mit Organisationen verknüpft sind, nicht als Betreiber:innen mit Verursachern verknüpft sind und die als Beschwerdeführer:innen nur noch mit Beschwerden verknüpft sind, die seit BEMAS_STATUS_CHANGE_DEADLINE_DAYS
(siehe secrets.template
) abgeschlossen sind.
Für den Export von PDF-Dateien mit eigenen Templates aus der App Datenmanagement mittels der App Toolbox siehe hier.
Bei Einrückungen werden generell zwei Leerzeichen verwendet, bei Umbrucheinrückungen vier.
Der Python-Code orientiert sich an der Python-Styling-Konvention PEP8. Es empfiehlt sich ein Tool wie pycodestyle zur Überprüfung des Codes zu nutzen. Mit Hilfe von zum Beispiel autopep8 können Python-Dateien auch im Nachhinein noch automatisch korrigiert werden, können dadurch allerdings auch unleserlich werden.
Die Python-Dokumentation wird mittels Docstrings in reStructuredText geschrieben.
Nützliche Tools für eine Entwicklungsumgebung, wie etwa pycodestyle, können zusätzlich via pip installiert werden:
source /usr/local/datenwerft/venv/bin/activate
pip install -r /usr/local/datenwerft/datenwerft/requirements-dev.txt
Die Vorgaben von PEP8 finden mit zwei Ausnahmen vollständig Anwendung:
- Zeilenlänge wird von 79 auf 99 erhöht
- Anzahl der Leerzeichen bei der Einrückung wird von vier auf zwei reduziert (ergibt zudem eine Umbrucheinrückung von vier statt acht)
Die entsprechende Konfigurationsdatei setup.cfg
für pycodestyle ist bereits im Wurzelverzeichnis des Projekts angelegt.
JavaScript-Funktionen werden mittels JSDoc dokumentiert, angelehnt an diese Übersicht.
-
Python-Prüfungen mittels pycodestyle:
cd /usr/local/datenwerft/datenwerft sh linting/pycodestyle
-
Django-Prüfungen mittels djLint:
cd /usr/local/datenwerft/datenwerft sh linting/djlint
-
CSS-Prüfungen mittels Stylelint:
cd /usr/local/datenwerft/datenwerft sh linting/stylelint
-
JavaScript-Prüfungen mittels ESLint:
cd /usr/local/datenwerft/datenwerft sh linting/eslint
-
alle vorgenannten Prüfungen nacheinander:
cd /usr/local/datenwerft/datenwerft sh linting/lint
-
Tests der App Accounts durchführen:
source /usr/local/datenwerft/venv/bin/activate cd /usr/local/datenwerft/datenwerft python manage.py test accounts
-
Tests der App Toolbox durchführen:
source /usr/local/datenwerft/venv/bin/activate cd /usr/local/datenwerft/datenwerft python manage.py test toolbox
-
Tests der App Datenmanagement durchführen:
-
Einzeltest (Beispiel):
source /usr/local/datenwerft/venv/bin/activate cd /usr/local/datenwerft/datenwerft python manage.py test datenmanagement.tests.StrassenTest.test_create
-
alle Tests:
source /usr/local/datenwerft/venv/bin/activate cd /usr/local/datenwerft/datenwerft python manage.py test datenmanagement
-
-
Tests der App Antragsmanagement durchführen:
source /usr/local/datenwerft/venv/bin/activate cd /usr/local/datenwerft/datenwerft python manage.py test antragsmanagement
-
Tests der App BEMAS durchführen:
source /usr/local/datenwerft/venv/bin/activate cd /usr/local/datenwerft/datenwerft python manage.py test bemas
- neuen Branch erstellen – Name des Branches:
- bei Features:
features/<app-name>/<feature-name>
(Beispiel:features/datenmanagement/edit-photos
) - bei Bugfixes:
bugfixes/<app-name>/<bugfix-name>
(Beispiel:bugfixes/accounts/emails
)
- bei Features:
- Änderungen linten und testen (siehe oben)
- Änderungen committen und Commit(s) pushen
- Pull-Request im Branch
main
erstellen - Review anfordern und durchführen lassen
- ggf. Änderungen im Nachgang des Reviews committen und Commit(s) pushen
- Pull-Request im Branch
main
abschließen:- Commit-Message gemäß der Syntax der Conventional-Commit gestalten
- mit der Option Squash and merge mergen
Bei Commits und Pull-Requests in der Branch main
werden folgende GitHub-Actions ausgeführt:
- Linting: Linting gemäß
.github/workflows/linting.yml
- Tests: Tests gemäß
.github/workflows/tests.yml
- Release: Release gemäß
.github/workflows/release.yml