From 3fcc4385589eebc8804178f88cd3a74555de5c23 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Fri, 4 Feb 2022 15:17:08 +0100 Subject: [PATCH 01/17] Revert "Revert accidental docker->master merge" This reverts commit 49aba49406927d0002d87f1c63d1e809633c3f92. --- Dockerfile | 20 +++++++ README.md | 56 +++++++++++++++++ docker-compose.yml | 83 ++++++++++++++++++++++++++ konova/celery.py | 2 +- konova/sub_settings/django_settings.py | 26 ++++---- konova/sub_settings/sso_settings.py | 6 +- nginx/Dockerfile | 4 ++ nginx/nginx.conf | 20 +++++++ requirements.txt | 3 +- 9 files changed, 201 insertions(+), 19 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 nginx/Dockerfile create mode 100644 nginx/nginx.conf diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..aad14222 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.7-slim +ENV PYTHONUNBUFFERED 1 + +WORKDIR /konova + +# Install some dependencies +RUN apt update +RUN apt install -y gdal-bin + +# Copy requirements file into workspace +COPY ./requirements.txt /konova/ +RUN pip install --upgrade pip +RUN pip install -r requirements.txt + +# Copy rest of project into workspace +COPY . /konova/ + +# Move static files in designated folder +RUN python manage.py collectstatic --noinput + diff --git a/README.md b/README.md index 44971474..8fee9211 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ the database postgresql and the css library bootstrap as well as the icon packag fontawesome for a modern look, following best practices from the industry. ## Background processes +### !!! For non-docker run Konova uses celery for background processing. To start the worker you need to run ```shell $ celery -A konova worker -l INFO @@ -18,3 +19,58 @@ Technical documention is provided in the projects git wiki. A user documentation is not available (and not needed, yet). +# Docker +To run the docker-compose as expected, you need to take the following steps: + +1. Create a database containing docker, using an appropriate Dockerfile, e.g. the following +``` +version: '3.3' +services: + postgis: + image: postgis/postgis + restart: always + container_name: postgis-docker + ports: + - 5433:5432 + volumes: + - db-volume:/var/lib/postgresql/data + environment: + - POSTGRES_PASSWORD=postgres + - POSTGRES_USER=postgres + networks: + - db-network-bridge + +networks: + db-network-bridge: + driver: "bridge" + +volumes: + db-volume: +``` +This Dockerfile creates a Docker container running postgresql and postgis, creates the default superuser postgres, +creates a named volume for persisting the database and creates a new network bridge, which **must be used by any other +container, which wants to write/read on this database**. + +2. Make sure the name of the network bridge above matches the network in the konova docker-compose.yml +3. Get into the running postgis container (`docker exec -it postgis-docker bash`) and create new databases, users and so on. Make sure the database `konova` exists now! +4. Replace all `CHANGE_ME_xy` values inside of konova/docker-compose.yml for your installation. Make sure the `SSO_HOST` holds the proper SSO host, e.g. for the arnova project `arnova.example.org` (Arnova must be installed and the webserver configured as well, of course) +5. Take a look on konova/settings.py and konova/sub_settings/django_settings.py. Again: Replace all occurences of `CHANGE_ME` with proper values for your installation. + 1. Make sure you have the proper host strings added to `ALLOWED_HOSTS` inside of django_settings.py. +6. Build and run the docker setup using `docker-compose build` and `docker-compose start` from the main directory of this project (where the docker-compose.yml lives) +7. Run migrations! To do so, get into the konova service container (`docker exec -it konova-docker bash`) and run the needed commands (`python manage.py makemigrations LIST_OF_ALL_MIGRATABLE_APPS`, then `python manage.py migrate`) +8. Run the setup command `python manage.py setup` and follow the instructions on the CLI +9. To enable **SMTP** mail support, make sure your host machine (the one where the docker container run) has the postfix service configured properly. Make sure the `mynetworks` variable is xtended using the docker network bridge ip, created in the postgis container and used by the konova services. + 1. **Hint**: You can find out this easily by trying to perform a test mail in the running konova web application (which will fail, of course). Then take a look to the latest entries in `/var/log/mail.log` on your host machine. The failed IP will be displayed there. + 2. **Please note**: This installation guide is based on SMTP using postfix! + 3. Restart the postfix service on your host machine to reload the new configuration (`service postfix restart`) +10. Finally, make sure your host machine webserver passes incoming requests properly to the docker nginx webserver of konova. A proper nginx config for the host machine may look like this: +``` +server { + server_name konova.domain.org; + + location / { + proxy_pass http://localhost:KONOVA_NGINX_DOCKER_PORT/; + proxy_set_header Host $host; + } +} +``` \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..a67fb2ff --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,83 @@ +version: '3.3' + +services: + redis: + image: redis + container_name: "konova-redis-cache" + volumes: + - /redis/data:/bitnami/redis/data + environment: + - REDIS_PASSWORD=CHANGE_ME + + konova: + external_links: + - postgis:db + - arnova-nginx-server:arnova + build: . + container_name: "konova-docker" + command: gunicorn konova.wsgi:application --bind 0.0.0.0:8000 + volumes: + - .:/konova + - konova_uploaded_files:/konova_uploaded_files + - static_file_volume:/konova/static # Point to the volume for static files. Shared with nginx service + expose: + - 8000 + depends_on: + - redis + environment: + - POSTGRES_NAME=konova + - POSTGRES_PORT=5432 + - POSTGRES_PASSWORD=CHANGE_ME + - POSTGRES_USER=konova + - POSTGRES_HOST=db + - REDIS_HOST=redis + - SSO_HOST=CHANGE_ME_TO_SSO_HOST_URL + - SMTP_HOST=172.17.0.1 + - SMTP_PORT=25 + - SMTP_REAL_REPLY_MAIL=ksp-servicestelle@sgdnord.rlp.de + +# To provide a celery worker instance, we need to add the celery worker as an own service + celery_worker: + external_links: + - postgis:db + - arnova-nginx-server:arnova + build: . + container_name: "konova-worker-docker" + command: celery -A konova worker -l INFO + volumes: + - .:/konova + - konova_uploaded_files:/konova_uploaded_files + depends_on: + - konova + environment: + - POSTGRES_NAME=konova + - POSTGRES_PORT=5432 + - POSTGRES_PASSWORD=CHANGE_ME + - POSTGRES_USER=konova + - POSTGRES_HOST=db + - REDIS_HOST=redis + - SSO_HOST=CHANGE_ME_TO_SSO_HOST_URL + - SMTP_HOST=172.17.0.1 + - SMTP_PORT=25 + - SMTP_REAL_REPLY_MAIL=ksp-servicestelle@sgdnord.rlp.de + + nginx: + build: ./nginx + container_name: "konova-nginx-server" + ports: + - "1337:80" + depends_on: + - konova + volumes: + - static_file_volume:/konova/static # Point to the volume for static files. Shared with konova service + +# Instead of an own, new network, we need to connect to the existing one, which is provided by the postgis container +# NOTE: THIS NETWORK MUST EXIST +networks: + default: + external: + name: postgis_nat_it_backend + +volumes: + static_file_volume: + konova_uploaded_files: \ No newline at end of file diff --git a/konova/celery.py b/konova/celery.py index 478f2844..ab06cf7c 100644 --- a/konova/celery.py +++ b/konova/celery.py @@ -17,7 +17,7 @@ app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() # Declare redis as broker -app.conf.broker_url = 'redis://localhost:6379/0' +app.conf.broker_url = f"redis://{os.environ.get('REDIS_HOST')}:6379/0" @app.task(bind=True) diff --git a/konova/sub_settings/django_settings.py b/konova/sub_settings/django_settings.py index b0d6ff8a..e725f57f 100644 --- a/konova/sub_settings/django_settings.py +++ b/konova/sub_settings/django_settings.py @@ -124,10 +124,11 @@ WSGI_APPLICATION = 'konova.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', - 'NAME': 'konova', - 'USER': 'postgres', - 'HOST': '127.0.0.1', - 'PORT': '5432', + 'NAME': os.environ.get('POSTGRES_NAME'), + 'USER': os.environ.get('POSTGRES_USER'), + 'HOST': os.environ.get('POSTGRES_HOST'), + 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), + 'PORT': os.environ.get('POSTGRES_PORT'), } } @@ -209,19 +210,14 @@ DEBUG_TOOLBAR_CONFIG = { } # EMAIL (see https://docs.djangoproject.com/en/dev/topics/email/) - -# CHANGE_ME !!! ONLY FOR DEVELOPMENT !!! if DEBUG: + # ONLY FOR DEVELOPMENT NEEDED EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' - EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location + EMAIL_FILE_PATH = '/tmp/app-messages' -DEFAULT_FROM_EMAIL = "service@ksp.de" # The default email address for the 'from' element +DEFAULT_FROM_EMAIL = "no-reply@ksp.de" # The default email address for the 'from' element SERVER_EMAIL = DEFAULT_FROM_EMAIL # The default email sender address, which is used by Django to send errors via mail -EMAIL_HOST = "localhost" -EMAIL_REPLY_TO = "ksp-servicestelle@sgdnord.rlp.de" +EMAIL_HOST = os.environ.get('SMTP_HOST') +EMAIL_REPLY_TO = os.environ.get('SMTP_REAL_REPLY_MAIL') SUPPORT_MAIL_RECIPIENT = EMAIL_REPLY_TO -EMAIL_PORT = "25" -#EMAIL_HOST_USER = "" -#EMAIL_HOST_PASSWORD = "" -EMAIL_USE_TLS = False -EMAIL_USE_SSL = False +EMAIL_PORT = os.environ.get('SMTP_PORT') diff --git a/konova/sub_settings/sso_settings.py b/konova/sub_settings/sso_settings.py index 20417f04..390ed403 100644 --- a/konova/sub_settings/sso_settings.py +++ b/konova/sub_settings/sso_settings.py @@ -7,7 +7,9 @@ Created on: 31.01.22 """ # SSO settings -SSO_SERVER_BASE = "http://127.0.0.1:8000/" +import os + +SSO_SERVER_BASE = f"http://{os.environ.get('SSO_HOST')}/" SSO_SERVER = f"{SSO_SERVER_BASE}sso/" SSO_PRIVATE_KEY = "QuziFeih7U8DZvQQ1riPv2MXz0ZABupHED9wjoqZAqeMQaqkqTfxJDRXgSIyASwJ" -SSO_PUBLIC_KEY = "AGGK7E8eT5X5u2GD38ygGG3GpAefmIldJiiWW7gldRPqCG1CzmUfGdvPSGDbEY2n" \ No newline at end of file +SSO_PUBLIC_KEY = "AGGK7E8eT5X5u2GD38ygGG3GpAefmIldJiiWW7gldRPqCG1CzmUfGdvPSGDbEY2n" diff --git a/nginx/Dockerfile b/nginx/Dockerfile new file mode 100644 index 00000000..4c49d2ee --- /dev/null +++ b/nginx/Dockerfile @@ -0,0 +1,4 @@ +FROM nginx:alpine + +RUN rm /etc/nginx/conf.d/default.conf +COPY nginx.conf /etc/nginx/conf.d \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 00000000..26b326ca --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,20 @@ +upstream konova { + server konova:8000; +} + +server { + + listen 80; + + location / { + proxy_pass http://konova; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_redirect off; + } + + location /static/ { + alias /konova/static/; + } + +} diff --git a/requirements.txt b/requirements.txt index e2f43108..20e0bff8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,4 +47,5 @@ wcwidth==0.2.5 webservices==0.7 wrapt==1.13.3 xmltodict==0.12.0 -zipp==3.4.1 \ No newline at end of file +zipp==3.4.1 +gunicorn==20.1.0 \ No newline at end of file From f50f17d593231adf22792d48279dea2eca73c86f Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 9 Mar 2022 14:02:25 +0100 Subject: [PATCH 02/17] Docker worker enhancement * drops docker worker process in favor of background celery worker on main process * changes uploaded files folder into host-based folder --- docker-compose.yml | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index a67fb2ff..bf32e64a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,10 +15,11 @@ services: - arnova-nginx-server:arnova build: . container_name: "konova-docker" - command: gunicorn konova.wsgi:application --bind 0.0.0.0:8000 + command: sh -c 'celery -A konova worker -l INFO --detach && gunicorn konova.wsgi:application --bind 0.0.0.0:8000' + restart: always volumes: - .:/konova - - konova_uploaded_files:/konova_uploaded_files + - /path/to/host/folder:/konova_uploaded_files - static_file_volume:/konova/static # Point to the volume for static files. Shared with nginx service expose: - 8000 @@ -36,31 +37,6 @@ services: - SMTP_PORT=25 - SMTP_REAL_REPLY_MAIL=ksp-servicestelle@sgdnord.rlp.de -# To provide a celery worker instance, we need to add the celery worker as an own service - celery_worker: - external_links: - - postgis:db - - arnova-nginx-server:arnova - build: . - container_name: "konova-worker-docker" - command: celery -A konova worker -l INFO - volumes: - - .:/konova - - konova_uploaded_files:/konova_uploaded_files - depends_on: - - konova - environment: - - POSTGRES_NAME=konova - - POSTGRES_PORT=5432 - - POSTGRES_PASSWORD=CHANGE_ME - - POSTGRES_USER=konova - - POSTGRES_HOST=db - - REDIS_HOST=redis - - SSO_HOST=CHANGE_ME_TO_SSO_HOST_URL - - SMTP_HOST=172.17.0.1 - - SMTP_PORT=25 - - SMTP_REAL_REPLY_MAIL=ksp-servicestelle@sgdnord.rlp.de - nginx: build: ./nginx container_name: "konova-nginx-server" @@ -79,5 +55,4 @@ networks: name: postgis_nat_it_backend volumes: - static_file_volume: - konova_uploaded_files: \ No newline at end of file + static_file_volume: \ No newline at end of file From 7d29dddd226397fe7b3dfcb50c9bfe49d1d911dd Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 25 Apr 2022 16:07:38 +0200 Subject: [PATCH 03/17] WIP: Docker enhancement * reduce containers into a single one, holding nginx + celery + redis all at once --- Dockerfile | 6 ++++-- docker-compose.yml | 44 ++++++++++++++++++++++---------------------- nginx/nginx.conf | 2 +- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/Dockerfile b/Dockerfile index aad14222..290c3d08 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ -FROM python:3.7-slim +FROM python:3.7 ENV PYTHONUNBUFFERED 1 WORKDIR /konova # Install some dependencies RUN apt update -RUN apt install -y gdal-bin +RUN apt install -y gdal-bin redis-server nginx # Copy requirements file into workspace COPY ./requirements.txt /konova/ @@ -13,6 +13,8 @@ RUN pip install --upgrade pip RUN pip install -r requirements.txt # Copy rest of project into workspace +RUN rm /etc/nginx/sites-enabled/default +COPY ./nginx/nginx.conf /etc/nginx/conf.d COPY . /konova/ # Move static files in designated folder diff --git a/docker-compose.yml b/docker-compose.yml index bf32e64a..74f8c0b4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,13 @@ version: '3.3' services: - redis: - image: redis - container_name: "konova-redis-cache" - volumes: - - /redis/data:/bitnami/redis/data - environment: - - REDIS_PASSWORD=CHANGE_ME + #redis: + # image: redis + # container_name: "konova-redis-cache" + # volumes: + # - /redis/data:/bitnami/redis/data + # environment: + # - REDIS_PASSWORD=CHANGE_ME konova: external_links: @@ -15,37 +15,37 @@ services: - arnova-nginx-server:arnova build: . container_name: "konova-docker" - command: sh -c 'celery -A konova worker -l INFO --detach && gunicorn konova.wsgi:application --bind 0.0.0.0:8000' + command: sh -c 'service nginx start && service redis-server start && celery -A konova worker --detach && gunicorn konova.wsgi:application --bind 0.0.0.0:8000' restart: always volumes: - .:/konova - /path/to/host/folder:/konova_uploaded_files - static_file_volume:/konova/static # Point to the volume for static files. Shared with nginx service - expose: - - 8000 - depends_on: - - redis + ports: + - "1337:80" + #depends_on: + # - redis environment: - POSTGRES_NAME=konova - POSTGRES_PORT=5432 - POSTGRES_PASSWORD=CHANGE_ME - POSTGRES_USER=konova - POSTGRES_HOST=db - - REDIS_HOST=redis + - REDIS_HOST=localhost - SSO_HOST=CHANGE_ME_TO_SSO_HOST_URL - SMTP_HOST=172.17.0.1 - SMTP_PORT=25 - SMTP_REAL_REPLY_MAIL=ksp-servicestelle@sgdnord.rlp.de - nginx: - build: ./nginx - container_name: "konova-nginx-server" - ports: - - "1337:80" - depends_on: - - konova - volumes: - - static_file_volume:/konova/static # Point to the volume for static files. Shared with konova service + #nginx: + # build: ./nginx + # container_name: "konova-nginx-server" + # ports: + # - "1337:80" + # depends_on: + # - konova + # volumes: + # - static_file_volume:/konova/static # Point to the volume for static files. Shared with konova service # Instead of an own, new network, we need to connect to the existing one, which is provided by the postgis container # NOTE: THIS NETWORK MUST EXIST diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 26b326ca..373393a2 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -1,5 +1,5 @@ upstream konova { - server konova:8000; + server localhost:8000; } server { From 80de57a0879697b1bfbbd1e7adab40720022c956 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 26 Apr 2022 08:55:07 +0200 Subject: [PATCH 04/17] WIP: Docker enhancement * reduces all needed containers into a single one * simplifies initial startup command by adding docker-entrypoint.sh --- Dockerfile | 8 +++++--- docker-compose.yml | 28 ++-------------------------- docker-entrypoint.sh | 7 +++++++ nginx/nginx.conf => nginx.conf | 0 nginx/Dockerfile | 4 ---- 5 files changed, 14 insertions(+), 33 deletions(-) create mode 100755 docker-entrypoint.sh rename nginx/nginx.conf => nginx.conf (100%) delete mode 100644 nginx/Dockerfile diff --git a/Dockerfile b/Dockerfile index 290c3d08..ad61d714 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,14 +7,16 @@ WORKDIR /konova RUN apt update RUN apt install -y gdal-bin redis-server nginx -# Copy requirements file into workspace +# Copy requirements file into workspace and install all dependencies COPY ./requirements.txt /konova/ RUN pip install --upgrade pip RUN pip install -r requirements.txt -# Copy rest of project into workspace +# Remove nginx default configuration and replace with own configuration RUN rm /etc/nginx/sites-enabled/default -COPY ./nginx/nginx.conf /etc/nginx/conf.d +COPY ./nginx.conf /etc/nginx/conf.d + +# Copy rest of project into workspace COPY . /konova/ # Move static files in designated folder diff --git a/docker-compose.yml b/docker-compose.yml index 74f8c0b4..c7bd3f4b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,30 +1,19 @@ version: '3.3' services: - #redis: - # image: redis - # container_name: "konova-redis-cache" - # volumes: - # - /redis/data:/bitnami/redis/data - # environment: - # - REDIS_PASSWORD=CHANGE_ME - konova: external_links: - postgis:db - arnova-nginx-server:arnova build: . container_name: "konova-docker" - command: sh -c 'service nginx start && service redis-server start && celery -A konova worker --detach && gunicorn konova.wsgi:application --bind 0.0.0.0:8000' + command: ./docker-entrypoint.sh restart: always volumes: - .:/konova - - /path/to/host/folder:/konova_uploaded_files - - static_file_volume:/konova/static # Point to the volume for static files. Shared with nginx service + - /data/apps/konova/uploaded_files:/konova_uploaded_files ports: - "1337:80" - #depends_on: - # - redis environment: - POSTGRES_NAME=konova - POSTGRES_PORT=5432 @@ -37,22 +26,9 @@ services: - SMTP_PORT=25 - SMTP_REAL_REPLY_MAIL=ksp-servicestelle@sgdnord.rlp.de - #nginx: - # build: ./nginx - # container_name: "konova-nginx-server" - # ports: - # - "1337:80" - # depends_on: - # - konova - # volumes: - # - static_file_volume:/konova/static # Point to the volume for static files. Shared with konova service - # Instead of an own, new network, we need to connect to the existing one, which is provided by the postgis container # NOTE: THIS NETWORK MUST EXIST networks: default: external: name: postgis_nat_it_backend - -volumes: - static_file_volume: \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 00000000..3e405b72 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# Start all needed services inside the container! + +service nginx start +service redis-server start +celery -A konova worker --detach +gunicorn konova.wsgi:application --bind 0.0.0.0:8000 \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx.conf similarity index 100% rename from nginx/nginx.conf rename to nginx.conf diff --git a/nginx/Dockerfile b/nginx/Dockerfile deleted file mode 100644 index 4c49d2ee..00000000 --- a/nginx/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM nginx:alpine - -RUN rm /etc/nginx/conf.d/default.conf -COPY nginx.conf /etc/nginx/conf.d \ No newline at end of file From 7027e0c02bd58ba8e813d14337713976048ee02d Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 26 Apr 2022 10:09:58 +0200 Subject: [PATCH 05/17] Docker enhancement * optimizes image build dependency * increases gunicorn default number of workers --- Dockerfile | 2 +- docker-entrypoint.sh | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index ad61d714..6e35526c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.7 +FROM python:3.9-slim ENV PYTHONUNBUFFERED 1 WORKDIR /konova diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 3e405b72..e9f2cea2 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,7 +1,7 @@ #!/bin/bash -# Start all needed services inside the container! - +# Start all needed services once the container is fired up! service nginx start service redis-server start celery -A konova worker --detach -gunicorn konova.wsgi:application --bind 0.0.0.0:8000 \ No newline at end of file +# Rule of thumb: (2*CPU)+1 as worker_num -> Use 5 as default (matches a dual core) +gunicorn --workers=5 konova.wsgi:application --bind=0.0.0.0:8000 \ No newline at end of file From b0a15d9d1c036b9ebc8606d1529bc81ff5551a94 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 31 May 2022 16:53:13 +0200 Subject: [PATCH 06/17] Konova Code fix * adds command sync_codelist * provides updating of all codes to the newest version (id) * must be run once on staging, can be dropped afterwards since the root for the problem has been resolved on the codelist management application --- codelist/management/commands/sync_codelist.py | 165 ++++++++++++++++++ .../management/commands/update_codelist.py | 1 - codelist/settings.py | 2 +- .../migrations/0005_auto_20220218_0917.py | 4 +- compensation/models/state.py | 1 - konova/migrations/0005_auto_20220216_0856.py | 4 +- 6 files changed, 170 insertions(+), 7 deletions(-) create mode 100644 codelist/management/commands/sync_codelist.py diff --git a/codelist/management/commands/sync_codelist.py b/codelist/management/commands/sync_codelist.py new file mode 100644 index 00000000..1ad7c72d --- /dev/null +++ b/codelist/management/commands/sync_codelist.py @@ -0,0 +1,165 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: michel.peltriaux@sgdnord.rlp.de +Created on: 31.05.22 + +""" + +from django.db import transaction + +from codelist.models import KonovaCode +from compensation.models import CompensationAction, CompensationState +from intervention.models import Legal, Handler, Responsibility +from konova.management.commands.setup import BaseKonovaCommand + + +class Command(BaseKonovaCommand): + help = "Updates internal codelist by external API" + + def handle(self, *args, **options): + try: + with transaction.atomic(): + self.sync_codelist() + except KeyboardInterrupt: + self._break_line() + exit(-1) + + def __get_newest_code(self, code): + code = KonovaCode.objects.filter( + atom_id=code.atom_id, + parent=code.parent, + code_lists__in=code.code_lists.all(), + ).order_by( + "-id" + ).first() + return code + + def __migrate_compensation_action_codes(self): + all_actions = CompensationAction.objects.all() + used_codes = [] + for action in all_actions: + stored_codes = action.action_type.all() + codes = [] + for code in stored_codes: + codes.append(self.__get_newest_code(code)) + action.action_type.set(codes) + used_codes += codes + + stored_codes = action.action_type_details.all() + codes = [] + for code in stored_codes: + codes.append(self.__get_newest_code(code)) + action.action_type_details.set(codes) + used_codes += codes + + action.save() + return used_codes + + def __migrate_compensation_state_codes(self): + all_states = CompensationState.objects.all() + used_codes = [] + for state in all_states: + code = state.biotope_type + if code is not None: + new_code = self.__get_newest_code(code) + state.biotope_type = new_code + used_codes.append(new_code) + + stored_codes = state.biotope_type_details.all() + codes = [] + for code in stored_codes: + codes.append(self.__get_newest_code(code)) + state.biotope_type_details.set(codes) + + used_codes += codes + state.save() + return used_codes + + def __migrate_legal_codes(self): + all_legal = Legal.objects.all() + used_codes = [] + for legal in all_legal: + code = legal.process_type + if code is not None: + new_code = self.__get_newest_code(code) + legal.process_type = new_code + used_codes.append(new_code) + + stored_codes = legal.laws.all() + codes = [] + for code in stored_codes: + codes.append(self.__get_newest_code(code)) + legal.laws.set(codes) + + used_codes += codes + legal.save() + return used_codes + + def __migrate_handler_codes(apps): + all_handlers = Handler.objects.all() + used_codes = [] + for handler in all_handlers: + code = handler.type + if code is None: + continue + new_code = apps.__get_newest_code(code) + handler.type = new_code + used_codes.append(new_code) + handler.save() + return used_codes + + def __migrate_responsibility_codes(apps): + all_resps = Responsibility.objects.all() + used_codes = [] + for responsibility in all_resps: + code = responsibility.registration_office + if code is not None: + new_code = apps.__get_newest_code(code) + responsibility.registration_office = new_code + used_codes.append(new_code) + + code = responsibility.conservation_office + if code is not None: + new_code = apps.__get_newest_code(code) + responsibility.conservation_office = new_code + used_codes.append(new_code) + + responsibility.save() + return used_codes + + def sync_codelist(self): + """ Due to issues on the external codelist app there can be multiple entries of the same code + (atom_id, parent, list) but with different identifiers. + + These issues have been resolved but already + + Returns: + + """ + self._write_warning("Sync codes in usage and replace by newest entries...") + used_codes = [] + used_codes += self.__migrate_compensation_action_codes() + used_codes += self.__migrate_compensation_state_codes() + used_codes += self.__migrate_legal_codes() + used_codes += self.__migrate_handler_codes() + used_codes += self.__migrate_responsibility_codes() + self._write_success(f"Synced {len(used_codes)} code usages!") + + all_codes = KonovaCode.objects.all() + newest_code_ids = [] + for code in all_codes: + newest_code = self.__get_newest_code(code) + newest_code_ids.append(newest_code.id) + + code_ids_to_keep = set(newest_code_ids) + self._write_warning(f"Of {all_codes.count()} KonovaCodes there are {len(code_ids_to_keep)} to keep as newest versions...") + + deletable_codes = KonovaCode.objects.all().exclude( + id__in=code_ids_to_keep + ) + deletable_codes_count = deletable_codes.count() + self._write_warning(f"{deletable_codes_count} found which are obsolet...") + if deletable_codes_count > 0: + deletable_codes.delete() + self._write_success("Obsolete codes deleted!") \ No newline at end of file diff --git a/codelist/management/commands/update_codelist.py b/codelist/management/commands/update_codelist.py index 345b3244..d29b272b 100644 --- a/codelist/management/commands/update_codelist.py +++ b/codelist/management/commands/update_codelist.py @@ -6,7 +6,6 @@ Created on: 23.08.21 """ import requests -from django.core.management import BaseCommand from xml.etree import ElementTree as etree from codelist.models import KonovaCode, KonovaCodeList diff --git a/codelist/settings.py b/codelist/settings.py index 61652bd0..3bd70328 100644 --- a/codelist/settings.py +++ b/codelist/settings.py @@ -14,7 +14,7 @@ CODELIST_INTERVENTION_HANDLER_ID = 903 # CLMassnahmeträger CODELIST_CONSERVATION_OFFICE_ID = 907 # CLNaturschutzbehörden CODELIST_REGISTRATION_OFFICE_ID = 1053 # CLZulassungsbehörden CODELIST_BIOTOPES_ID = 654 # CL_Biotoptypen -CODELIST_AFTER_STATE_BIOTOPES__ID = 974 # CL-KSP_ZielBiotoptypen - USAGE HAS BEEN DROPPED IN 2022 IN FAVOR OF 654 +CODELIST_AFTER_STATE_BIOTOPES_ID = 974 # CL-KSP_ZielBiotoptypen - USAGE HAS BEEN DROPPED IN 2022 IN FAVOR OF 654 CODELIST_BIOTOPES_EXTRA_CODES_ID = 975 # CLZusatzbezeichnung CODELIST_LAW_ID = 1048 # CLVerfahrensrecht CODELIST_PROCESS_TYPE_ID = 44382 # CLVerfahrenstyp diff --git a/compensation/migrations/0005_auto_20220218_0917.py b/compensation/migrations/0005_auto_20220218_0917.py index 43e7db9c..00442640 100644 --- a/compensation/migrations/0005_auto_20220218_0917.py +++ b/compensation/migrations/0005_auto_20220218_0917.py @@ -3,7 +3,7 @@ from django.db import migrations, models, transaction import django.db.models.deletion -from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_AFTER_STATE_BIOTOPES__ID +from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_AFTER_STATE_BIOTOPES_ID def migrate_entries_974_to_654(apps, schema_editor): @@ -23,7 +23,7 @@ def migrate_entries_974_to_654(apps, schema_editor): state.save() old_list_states = CompensationState.objects.filter( - biotope_type__code_lists__in=[CODELIST_AFTER_STATE_BIOTOPES__ID] + biotope_type__code_lists__in=[CODELIST_AFTER_STATE_BIOTOPES_ID] ) if old_list_states.count() > 0: raise Exception("Still unmigrated values!") diff --git a/compensation/models/state.py b/compensation/models/state.py index 5cb8376a..77026b55 100644 --- a/compensation/models/state.py +++ b/compensation/models/state.py @@ -12,7 +12,6 @@ from codelist.models import KonovaCode from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID from compensation.managers import CompensationStateManager from konova.models import UuidModel -from konova.utils.message_templates import COMPENSATION_STATE_REMOVED class CompensationState(UuidModel): diff --git a/konova/migrations/0005_auto_20220216_0856.py b/konova/migrations/0005_auto_20220216_0856.py index 43c518ae..567e2065 100644 --- a/konova/migrations/0005_auto_20220216_0856.py +++ b/konova/migrations/0005_auto_20220216_0856.py @@ -2,7 +2,7 @@ from django.db import migrations, transaction -from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_AFTER_STATE_BIOTOPES__ID +from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_AFTER_STATE_BIOTOPES_ID def migrate_biotopes_from_974_to_654(apps, schema_editor): @@ -23,7 +23,7 @@ def migrate_biotopes_from_974_to_654(apps, schema_editor): all_states = CompensationState.objects.all() after_state_list_elements = all_states.filter( - biotope_type__code_lists__in=[CODELIST_AFTER_STATE_BIOTOPES__ID] + biotope_type__code_lists__in=[CODELIST_AFTER_STATE_BIOTOPES_ID] ) if after_state_list_elements.count() > 0: raise Exception("Still states with wrong codelist entries!") From 6c99a5b4e67940490d502dbdbf0ad7eca8b04546 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 15 Jun 2022 17:44:43 +0200 Subject: [PATCH 07/17] # 175 Report law calculation bugfix * fixes bug where amount of used laws in intervention forms would not be calculated properly --- analysis/utils/report.py | 46 ++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/analysis/utils/report.py b/analysis/utils/report.py index 996f87b5..63a06b84 100644 --- a/analysis/utils/report.py +++ b/analysis/utils/report.py @@ -137,22 +137,36 @@ class TimespanReport: ).order_by( "long_name" ) - # Fetch all law ids which are used by any .legal object of an intervention object - intervention_laws_total = self.queryset.values_list("legal__laws__id") - intervention_laws_checked = self.queryset.filter(checked__isnull=False).values_list("legal__laws__id") - intervention_laws_recorded = self.queryset.filter(recorded__isnull=False).values_list( - "legal__laws__id") - # Count how often which law id appears in the above list, return only the long_name of the law and the resulting - # count (here 'num'). This is for keeping the db fetch as small as possible - # Compute the sum for total, checked and recorded - self.evaluated_laws = laws.annotate( - num=Count("id", filter=Q(id__in=intervention_laws_total)), - num_checked=Count("id", filter=Q(id__in=intervention_laws_checked)), - num_recorded=Count("id", filter=Q(id__in=intervention_laws_recorded)), - ).values_list("short_name", "long_name", "num_checked", "num_recorded", "num", named=True) - self.law_sum = self.evaluated_laws.aggregate(sum_num=Sum("num"))["sum_num"] - self.law_sum_checked = self.evaluated_laws.aggregate(sum_num_checked=Sum("num_checked"))["sum_num_checked"] - self.law_sum_recorded = self.evaluated_laws.aggregate(sum_num_recorded=Sum("num_recorded"))["sum_num_recorded"] + + evaluated_laws = [] + sum_num_checked = 0 + sum_num_recorded = 0 + sum_num = 0 + for law in laws: + num = self.queryset.filter( + legal__laws__atom_id=law.atom_id + ).count() + num_checked = self.queryset_checked.filter( + legal__laws__atom_id=law.atom_id + ).count() + num_recorded = self.queryset_recorded.filter( + legal__laws__atom_id=law.atom_id + ).count() + evaluated_laws.append({ + "short_name": law.short_name, + "long_name": law.long_name, + "num": num, + "num_checked": num_checked, + "num_recorded": num_recorded, + }) + sum_num += num + sum_num_checked += num_checked + sum_num_recorded += num_recorded + + self.evaluated_laws = evaluated_laws + self.law_sum = sum_num + self.law_sum_checked = sum_num_checked + self.law_sum_recorded = sum_num_recorded def _evaluate_compensations(self): """ Analyzes the types of compensation distribution From 8245cf5bbba8e7e58cdeee1455bb6298da0f084f Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 21 Jun 2022 13:54:41 +0200 Subject: [PATCH 08/17] # 177 Report help texts * adds report form field help texts * adds translations --- analysis/forms.py | 2 ++ locale/de/LC_MESSAGES/django.mo | Bin 43248 -> 43382 bytes locale/de/LC_MESSAGES/django.po | 53 +++++++++++++++++++++++--------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/analysis/forms.py b/analysis/forms.py index 11d2f98b..68e217af 100644 --- a/analysis/forms.py +++ b/analysis/forms.py @@ -22,6 +22,7 @@ class TimespanReportForm(BaseForm): date_from = forms.DateField( label_suffix="", label=_("From"), + help_text=_("Entries created from..."), widget=forms.DateInput( attrs={ "type": "date", @@ -34,6 +35,7 @@ class TimespanReportForm(BaseForm): date_to = forms.DateField( label_suffix="", label=_("To"), + help_text=_("Entries created until..."), widget=forms.DateInput( attrs={ "type": "date", diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 885f0b9dcd4b08bdf1c8f5ab613c98115850330d..565041d895d5e4ac1ec637ab74ba4fad76557ec5 100644 GIT binary patch delta 11894 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 93238630..5764c56b 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-31 13:05+0200\n" +"POT-Creation-Date: 2022-06-21 13:53+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -40,11 +40,19 @@ msgstr "" msgid "From" msgstr "Vom" -#: analysis/forms.py:36 +#: analysis/forms.py:25 +msgid "Entries created from..." +msgstr "Einträge erstellt seit..." + +#: analysis/forms.py:37 msgid "To" msgstr "Bis" -#: analysis/forms.py:47 compensation/forms/forms.py:77 +#: analysis/forms.py:38 +msgid "Entries created until..." +msgstr "Einträge erstellt bis..." + +#: analysis/forms.py:49 compensation/forms/forms.py:77 #: compensation/templates/compensation/detail/eco_account/view.html:59 #: compensation/templates/compensation/report/eco_account/report.html:16 #: compensation/utils/quality.py:100 ema/templates/ema/detail/view.html:49 @@ -56,11 +64,11 @@ msgstr "Bis" msgid "Conservation office" msgstr "Eintragungsstelle" -#: analysis/forms.py:49 compensation/forms/forms.py:79 +#: analysis/forms.py:51 compensation/forms/forms.py:79 msgid "Select the responsible office" msgstr "Verantwortliche Stelle" -#: analysis/forms.py:58 compensation/forms/forms.py:88 +#: analysis/forms.py:60 compensation/forms/forms.py:88 #: compensation/forms/forms.py:118 compensation/forms/forms.py:199 #: intervention/forms/forms.py:64 intervention/forms/forms.py:81 #: intervention/forms/forms.py:97 intervention/forms/forms.py:113 @@ -69,15 +77,15 @@ msgstr "Verantwortliche Stelle" msgid "Click for selection" msgstr "Auswählen..." -#: analysis/forms.py:65 +#: analysis/forms.py:67 msgid "Generate report" msgstr "Bericht generieren" -#: analysis/forms.py:66 +#: analysis/forms.py:68 msgid "Select a timespan and the desired conservation office" msgstr "Wählen Sie die Zeitspanne und die gewünschte Eintragungsstelle" -#: analysis/forms.py:69 konova/forms.py:227 +#: analysis/forms.py:71 konova/forms.py:227 msgid "Continue" msgstr "Weiter" @@ -415,6 +423,7 @@ msgid "Company Mustermann" msgstr "Firma Mustermann" #: compensation/forms/forms.py:143 +#: compensation/templates/compensation/report/compensation/report.html:34 msgid "Is CEF" msgstr "Ist CEF-Maßnahme" @@ -423,6 +432,7 @@ msgid "Optionally: Whether this compensation is a CEF compensation?" msgstr "Optional: Handelt es sich um eine CEF-Maßnahme?" #: compensation/forms/forms.py:156 +#: compensation/templates/compensation/report/compensation/report.html:44 msgid "Is coherence keeping" msgstr "Ist Kohärenzsicherungsmaßnahme" @@ -434,7 +444,10 @@ msgstr "Optional: Handelt es sich um eine Kohärenzsicherungsmaßnahme?" #: compensation/forms/forms.py:169 #: compensation/templates/compensation/detail/compensation/view.html:44 #: compensation/templates/compensation/detail/eco_account/view.html:75 +#: compensation/templates/compensation/report/compensation/report.html:24 +#: compensation/templates/compensation/report/eco_account/report.html:24 #: ema/templates/ema/detail/view.html:61 +#: ema/templates/ema/report/report.html:24 msgid "Is PIK" msgstr "Ist PIK Maßnahme" @@ -673,14 +686,14 @@ msgstr "" msgid "Pieces" msgstr "Stück" -#: compensation/models/eco_account.py:56 +#: compensation/models/eco_account.py:55 msgid "" "Deductable surface can not be larger than existing surfaces in after states" msgstr "" "Die abbuchbare Fläche darf die Gesamtfläche der Zielzustände nicht " "überschreiten" -#: compensation/models/eco_account.py:63 +#: compensation/models/eco_account.py:62 msgid "" "Deductable surface can not be smaller than the sum of already existing " "deductions. Please contact the responsible users for the deductions!" @@ -972,7 +985,12 @@ msgstr "Fehlende Flächenmengen laut Zielzustand: " #: compensation/templates/compensation/detail/compensation/view.html:57 #: compensation/templates/compensation/detail/compensation/view.html:67 #: compensation/templates/compensation/detail/eco_account/view.html:78 +#: compensation/templates/compensation/report/compensation/report.html:27 +#: compensation/templates/compensation/report/compensation/report.html:37 +#: compensation/templates/compensation/report/compensation/report.html:47 +#: compensation/templates/compensation/report/eco_account/report.html:27 #: ema/templates/ema/detail/view.html:64 +#: ema/templates/ema/report/report.html:27 #: venv/lib/python3.7/site-packages/django/forms/widgets.py:710 msgid "Yes" msgstr "Ja" @@ -981,7 +999,12 @@ msgstr "Ja" #: compensation/templates/compensation/detail/compensation/view.html:59 #: compensation/templates/compensation/detail/compensation/view.html:69 #: compensation/templates/compensation/detail/eco_account/view.html:80 +#: compensation/templates/compensation/report/compensation/report.html:29 +#: compensation/templates/compensation/report/compensation/report.html:39 +#: compensation/templates/compensation/report/compensation/report.html:49 +#: compensation/templates/compensation/report/eco_account/report.html:29 #: ema/templates/ema/detail/view.html:66 +#: ema/templates/ema/report/report.html:29 #: venv/lib/python3.7/site-packages/django/forms/widgets.py:711 msgid "No" msgstr "Nein" @@ -1018,10 +1041,10 @@ msgstr "Verzeichnet am" #: compensation/templates/compensation/detail/compensation/view.html:107 #: compensation/templates/compensation/detail/eco_account/view.html:85 -#: compensation/templates/compensation/report/compensation/report.html:24 -#: compensation/templates/compensation/report/eco_account/report.html:37 +#: compensation/templates/compensation/report/compensation/report.html:54 +#: compensation/templates/compensation/report/eco_account/report.html:47 #: ema/templates/ema/detail/view.html:71 -#: ema/templates/ema/report/report.html:24 +#: ema/templates/ema/report/report.html:34 #: intervention/templates/intervention/detail/view.html:113 #: intervention/templates/intervention/report/report.html:87 msgid "Last modified" @@ -1123,11 +1146,11 @@ msgstr "Maßnahmenträger" msgid "Report" msgstr "Bericht" -#: compensation/templates/compensation/report/eco_account/report.html:24 +#: compensation/templates/compensation/report/eco_account/report.html:34 msgid "Deductions for" msgstr "Abbuchungen für" -#: compensation/templates/compensation/report/eco_account/report.html:32 +#: compensation/templates/compensation/report/eco_account/report.html:42 #: intervention/templates/intervention/report/report.html:53 #: intervention/templates/intervention/report/report.html:74 msgid "None" From 30d8a3c6e5718632fa274b57e5ee624bc7146564 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 21 Jun 2022 14:02:49 +0200 Subject: [PATCH 09/17] # 177 Timespanreport column order * rearranges the column order so 'Total' will always be the first column --- .../reports/includes/compensation/amount.html | 20 +++++++++---------- .../reports/includes/eco_account/amount.html | 4 ++-- .../includes/eco_account/deductions.html | 20 ++++++++++++++----- .../reports/includes/intervention/amount.html | 4 ++-- .../includes/intervention/compensated_by.html | 8 ++++---- .../reports/includes/intervention/laws.html | 10 +++++----- .../reports/includes/old_data/amount.html | 10 +++++----- 7 files changed, 43 insertions(+), 33 deletions(-) diff --git a/analysis/templates/analysis/reports/includes/compensation/amount.html b/analysis/templates/analysis/reports/includes/compensation/amount.html index 86383b69..de6e2564 100644 --- a/analysis/templates/analysis/reports/includes/compensation/amount.html +++ b/analysis/templates/analysis/reports/includes/compensation/amount.html @@ -15,40 +15,40 @@ {% trans 'Area of responsibility' %} + {% trans 'Total' %} + {% trans 'Number single areas' %} {% fa5_icon 'star' %} {% trans 'Checked' %} {% fa5_icon 'bookmark' %} {% trans 'Recorded' %} - {% trans 'Number single areas' %} - {% trans 'Total' %} {% trans 'Conservation office by law' %} + {{report.compensation_report.queryset_registration_office_unb_count|default_if_zero:"-"}} + {{report.compensation_report.num_single_surfaces_total_unb|default_if_zero:"-"}} {{report.compensation_report.queryset_registration_office_unb_checked_count|default_if_zero:"-"}} {{report.compensation_report.queryset_registration_office_unb_recorded_count|default_if_zero:"-"}} - {{report.compensation_report.num_single_surfaces_total_unb|default_if_zero:"-"}} - {{report.compensation_report.queryset_registration_office_unb_count|default_if_zero:"-"}} {% trans 'Land-use planning' %} + {{report.compensation_report.queryset_registration_office_tbp_count|default_if_zero:"-"}} + {{report.compensation_report.num_single_surfaces_total_tbp|default_if_zero:"-"}} {{report.compensation_report.queryset_registration_office_tbp_checked_count|default_if_zero:"-"}} {{report.compensation_report.queryset_registration_office_tbp_recorded_count|default_if_zero:"-"}} - {{report.compensation_report.num_single_surfaces_total_tbp|default_if_zero:"-"}} - {{report.compensation_report.queryset_registration_office_tbp_count|default_if_zero:"-"}} {% trans 'Other registration office' %} + {{report.compensation_report.queryset_registration_office_other_count|default_if_zero:"-"}} + {{report.compensation_report.num_single_surfaces_total_other|default_if_zero:"-"}} {{report.compensation_report.queryset_registration_office_other_checked_count|default_if_zero:"-"}} {{report.compensation_report.queryset_registration_office_other_recorded_count|default_if_zero:"-"}} - {{report.compensation_report.num_single_surfaces_total_other|default_if_zero:"-"}} - {{report.compensation_report.queryset_registration_office_other_count|default_if_zero:"-"}} {% trans 'Total' %} + {{report.compensation_report.queryset_count|default_if_zero:"-"}} + {{report.compensation_report.num_single_surfaces_total|default_if_zero:"-"}} {{report.compensation_report.queryset_checked_count|default_if_zero:"-"}} {{report.compensation_report.queryset_recorded_count|default_if_zero:"-"}} - {{report.compensation_report.num_single_surfaces_total|default_if_zero:"-"}} - {{report.compensation_report.queryset_count|default_if_zero:"-"}} diff --git a/analysis/templates/analysis/reports/includes/eco_account/amount.html b/analysis/templates/analysis/reports/includes/eco_account/amount.html index 668250e6..a36211f3 100644 --- a/analysis/templates/analysis/reports/includes/eco_account/amount.html +++ b/analysis/templates/analysis/reports/includes/eco_account/amount.html @@ -10,14 +10,14 @@ - + - +
{% fa5_icon 'bookmark' %} {% trans 'Recorded' %} {% trans 'Total' %}{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}
{{report.eco_account_report.queryset_recorded_count|default_if_zero:"-"}} {{report.eco_account_report.queryset_count|default_if_zero:"-"}}{{report.eco_account_report.queryset_recorded_count|default_if_zero:"-"}}
diff --git a/analysis/templates/analysis/reports/includes/eco_account/deductions.html b/analysis/templates/analysis/reports/includes/eco_account/deductions.html index c9a0e8d5..1ad423fd 100644 --- a/analysis/templates/analysis/reports/includes/eco_account/deductions.html +++ b/analysis/templates/analysis/reports/includes/eco_account/deductions.html @@ -5,18 +5,28 @@ - - + + - - - + + +
{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}{% fa5_icon 'bookmark' %} {% trans 'Recorded' %} {% trans 'Surface' %} {% trans 'Total' %} {% trans 'Total' %} {% trans 'Surface' %}{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}{% fa5_icon 'bookmark' %} {% trans 'Recorded' %} {% trans 'Surface' %}
{{report.eco_account_report.queryset_deductions_recorded_count|default_if_zero:"-"}}{{report.eco_account_report.recorded_deductions_sq_m|default_if_zero:"-"}}m² {{report.eco_account_report.queryset_deductions_count|default_if_zero:"-"}}{{report.eco_account_report.deductions_sq_m|default_if_zero:"-"}}m² + {{report.eco_account_report.deductions_sq_m|default_if_zero:"-"}} + {% if report.eco_account_report.deductions_sq_m > 0 %} + m² + {% endif %} + {{report.eco_account_report.queryset_deductions_recorded_count|default_if_zero:"-"}} + {{report.eco_account_report.recorded_deductions_sq_m|default_if_zero:"-"}} + {% if report.eco_account_report.recorded_deductions_sq_m > 0 %} + m² + {% endif %} +
diff --git a/analysis/templates/analysis/reports/includes/intervention/amount.html b/analysis/templates/analysis/reports/includes/intervention/amount.html index 0c934483..fc0b5fac 100644 --- a/analysis/templates/analysis/reports/includes/intervention/amount.html +++ b/analysis/templates/analysis/reports/includes/intervention/amount.html @@ -14,16 +14,16 @@ + - + -
{% trans 'Total' %} {% fa5_icon 'star' %} {% trans 'Checked' %} {% fa5_icon 'bookmark' %} {% trans 'Recorded' %}{% trans 'Total' %}
{{report.intervention_report.queryset_count|default_if_zero:"-"}} {{report.intervention_report.queryset_checked_count|default_if_zero:"-"}} {{report.intervention_report.queryset_recorded_count|default_if_zero:"-"}}{{report.intervention_report.queryset_count|default_if_zero:"-"}}
diff --git a/analysis/templates/analysis/reports/includes/intervention/compensated_by.html b/analysis/templates/analysis/reports/includes/intervention/compensated_by.html index c6be40cc..d76bec4a 100644 --- a/analysis/templates/analysis/reports/includes/intervention/compensated_by.html +++ b/analysis/templates/analysis/reports/includes/intervention/compensated_by.html @@ -5,29 +5,29 @@ {% trans 'Compensation type' %} + {% trans 'Total' %} {% fa5_icon 'star' %} {% trans 'Checked' %} {% fa5_icon 'bookmark' %} {% trans 'Recorded' %} - {% trans 'Total' %} {% trans 'Compensation' %} + {{report.intervention_report.compensation_sum|default_if_zero:"-"}} {{report.intervention_report.compensation_sum_checked|default_if_zero:"-"}} {{report.intervention_report.compensation_sum_recorded|default_if_zero:"-"}} - {{report.intervention_report.compensation_sum|default_if_zero:"-"}} {% trans 'Payment' %} + {{report.intervention_report.payment_sum|default_if_zero:"-"}} {{report.intervention_report.payment_sum_checked|default_if_zero:"-"}} {{report.intervention_report.payment_sum_recorded|default_if_zero:"-"}} - {{report.intervention_report.payment_sum|default_if_zero:"-"}} {% trans 'Deductions' %} + {{report.intervention_report.deduction_sum|default_if_zero:"-"}} {{report.intervention_report.deduction_sum_checked|default_if_zero:"-"}} {{report.intervention_report.deduction_sum_recorded|default_if_zero:"-"}} - {{report.intervention_report.deduction_sum|default_if_zero:"-"}} diff --git a/analysis/templates/analysis/reports/includes/intervention/laws.html b/analysis/templates/analysis/reports/includes/intervention/laws.html index e310197f..55f6a551 100644 --- a/analysis/templates/analysis/reports/includes/intervention/laws.html +++ b/analysis/templates/analysis/reports/includes/intervention/laws.html @@ -13,15 +13,15 @@ {% trans 'Law' %} + + {% trans 'Total' %} + {% fa5_icon 'star' %} {% trans 'Checked' %} {% fa5_icon 'bookmark' %} {% trans 'Recorded' %} - - {% trans 'Total' %} - @@ -34,16 +34,16 @@ {{law.long_name}} + {{law.num|default_if_zero:"-"}} {{law.num_checked|default_if_zero:"-"}} {{law.num_recorded|default_if_zero:"-"}} - {{law.num|default_if_zero:"-"}} {% endfor %} {% trans 'Total' %} + {{report.intervention_report.law_sum|default_if_zero:"-"}} {{report.intervention_report.law_sum_checked|default_if_zero:"-"}} {{report.intervention_report.law_sum_recorded|default_if_zero:"-"}} - {{report.intervention_report.law_sum|default_if_zero:"-"}} diff --git a/analysis/templates/analysis/reports/includes/old_data/amount.html b/analysis/templates/analysis/reports/includes/old_data/amount.html index cd79cb6f..bc1fc1a8 100644 --- a/analysis/templates/analysis/reports/includes/old_data/amount.html +++ b/analysis/templates/analysis/reports/includes/old_data/amount.html @@ -14,26 +14,26 @@ - - + + - + - + - +
{% fa5_icon 'star' %} {% trans 'Type' %}{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}{% trans 'Type' %} {% trans 'Total' %}{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}
{% trans 'Intervention' %}{{report.old_data_report.queryset_intervention_recorded_count|default_if_zero:"-"}} {{report.old_data_report.queryset_intervention_count|default_if_zero:"-"}}{{report.old_data_report.queryset_intervention_recorded_count|default_if_zero:"-"}}
{% trans 'Compensation' %}{{report.old_data_report.queryset_comps_recorded_count|default_if_zero:"-"}} {{report.old_data_report.queryset_comps_count|default_if_zero:"-"}}{{report.old_data_report.queryset_comps_recorded_count|default_if_zero:"-"}}
{% trans 'Eco-account' %}{{report.old_data_report.queryset_acc_recorded_count|default_if_zero:"-"}} {{report.old_data_report.queryset_acc_count|default_if_zero:"-"}}{{report.old_data_report.queryset_acc_recorded_count|default_if_zero:"-"}}
From 2d3299cffa98469cadc16bc2bd20da2e207e53c3 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 21 Jun 2022 14:11:01 +0200 Subject: [PATCH 10/17] # 177 Timespanreport helptext for deductions * adds help text for recorded deduction section --- .../includes/eco_account/deductions.html | 5 ++ locale/de/LC_MESSAGES/django.mo | Bin 43382 -> 43590 bytes locale/de/LC_MESSAGES/django.po | 72 ++++++++++-------- 3 files changed, 46 insertions(+), 31 deletions(-) diff --git a/analysis/templates/analysis/reports/includes/eco_account/deductions.html b/analysis/templates/analysis/reports/includes/eco_account/deductions.html index 1ad423fd..df235cbf 100644 --- a/analysis/templates/analysis/reports/includes/eco_account/deductions.html +++ b/analysis/templates/analysis/reports/includes/eco_account/deductions.html @@ -1,6 +1,11 @@ {% load i18n fontawesome_5 ksp_filters %}

{% trans 'Deductions' %}

+ + {% blocktrans %} + Recorded = Counts the deductions whose interventions have been recorded + {% endblocktrans %} +
diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 565041d895d5e4ac1ec637ab74ba4fad76557ec5..804e1b7d41506e24c690c111a47de53d94be1c18 100644 GIT binary patch delta 12151 zcmZA72Y62R-^cMI3rR>K5kyD`F%m>XY_X{kBWe~!ZW1(z#O5xwSL{`@lveFsrBzh% zrz%!!w$!R!HLA4#_vb!8&*OQ{b$#>tjdOncoZ#{-+wJffH|Ldn9`h`&C^yRr#f$*U zx<&eUag|zDN_orj%VAlmIEVbO3YL|Je4ZG~`jLF$ik8(5?_nC&kF~7UxD^x8qmpHf z!z3(%KVdvRLto2sTIJ#_Ya#{JF&`elJb2dRucMb9Kp%W<%5ztCHDHC}V9Lv&o?C%= zaieh`>bc_>fj^n@R~SV9mJh@6ry?Agyj9WU>!Tm}wit-X7=%NSkz3PI9WBOS{M@)7 z3z0vM1@STJKJO~Fg-{bMjgj_wO{;1T zXa#BoHefJ*g#|DhbK~!*3I2)d$EzCaubJc_Aw$p`OPPEus(}QPZ;yH~8Ovc`)G=9v zTB*I56OUslJcEVs6>1BDtJ?!EZj7(a`sbpeDFu2k3AHqxQ7e#!8rUe*(oaFncsc4Y zZ9~oI6z0e4sG0wT8n}NAdqqlPLGtmaep;g1Z(oD;*WUM{Kn)MU5S)r(xCYhHVbp`a zp$2@<NoYhp(Y55L6&QsY z@j}#|uQ2(wsJ+~Th4CxYikwGn)h{N0AGIaVQ0@9A*aIkx8gLZSuG6YaLL;eZZb(FR z&=u8SAJhsBG4Sjz zXq=AP(>>S{e?V{H$XHDd=h!O^IJe2<>^GwS)PsP=B6w(cQ1 zH8USt(+vDkdlibhF$&!=4%I+a)cpylfiytPq=V6cI%Mgn*KaJUoyAxjSE1TDj9Q@+ z^;v(-{2~Qv_@?nLRwe%kTVt693<5`>?%#~s>#uMCo%K&{Z~My$VPu#*Cf_#o=gTtqF=Bh(knx3PVQB2kC0CU(Un)J(RbwqQSMkAFrl zyoXw;Cs+(~vOg*>gX$;7Ng^kShUkGUjBQXOY>zqOJ$WuaDPt|?z` z@}Hyb-;U~dH|D}`Py=%wA)ytxggPvDP!Bvr4eSZ#!oN-4;~o3d`x=X&&P;jKfNNni zw#0Hc64l;1)BrZ32D}4VVW+i+L`MqFq27j=rW_#LjJYwQnLYDzs6DTN;n)t<@DNi! z0yW^ts6#jlwIVA~ujzW!ME9ZEJ?1K>$1|qj25Ke`kv|()|DZ-1*W9w)uo}Ad9(7id zumScp`OT;=-VxMuSI`%)qdI(q8puo3VfAUj{hDz-6587is6){UwKpSB1Ij|pY#C~a z*Pt5QjT*=S)Zx2;8sHP7ccNWi3@Ngzp(ZvF%iunA>NUGXA`gc1xzo~>N8L~x)o}{) zd&U}o?25GkTjL8;-?Wu|cG{rcmJX=BPRG1B4AuT5)QZeUe_Yjy9aqJ63aaA)RQ@%p zV;_1^J`mMVG1O}rgZkz-M?XwO9nxXwgJX>|Py<vB4Ru6y@II=;ekPxZx^E0>3uj;euEIdvfnj(Qm*E{$dy|~>?oT2M z)!_=%0~=8@J7CO4t-v)@!;euNy1#1=$RE{UDC%rPpjNOPYD+4k`e|u=AN6)P2a-@n zBTdCLR0m5@U$RZ886PnDA5b0qihBL-qE_M|>eRnL4dgZI)9caBo=^npa8@z-M5G_5 z)q{jan1MRQGmL9d4eUp~_gAqpzC`V1OnZA^ZBXCzuBf+RB&wacn1CBl_4lzB`gE`- z{0_$Gi_?)rV=AVgW|EEi5?(|t(XXhLxQF@iUkt|le6^I1Mr~O=V>=8Y-v@P{6Sac# zQ7iokYNfVf0R3CLNT}nZs0XuAXWcJh4WCq=L6rf zzYp=KjwTs5VR`cBFdRL*u>ML!cCnYTF%}@-1xsKi#^GYDi6>DXCSQK{cEfno1m>ew za4~A2t593G0rlzLhNW;P7R4*5`qy1qe>LDvYnpjZ)Xe=*4F#EeQBxm*>L?1e#Br!I zQV+GaEl_8o3#y$#s3jkY+OmnLv$P2H{CXz|HMj@0)CWz)Nz{NYqXu{bHK03K1)pFw zjC$YxTdf1*$xlYzzaNX>A=KM)4YiUU-R&)_hSB7m$s{sJ%tDRKtA}kNV>Ie?C!l7K zWXc_;e5i4nDPMtFiEYM%s1MI+)Jpt@>gNf%>HYWWY41gDEJ%ePx?^e73PhWHoUy7Y zuZcR04NwiXHucF!!&VALVPE3{)Qk^eC47X{^!}GfwoheO)PvJehioP`!9AFW?hbo^ zZ7_sL1*cWj?(|I}tcZTxgJW^<`^{3$Z%};Y-wWego_+DTaD34l7_i)XJr! z4(Id%tiSgB3sZ5(cokLt(%cw0(4Ij>RL4oE??fN;$FZn}=a~A9r~!S4+L8;X*YZ!) zbKdFp*(jdQ`s=kxq`(iyqYl$N^uW(B5;veHp26*S0o72}Ap5zssDbQ44e$tR0#{L6 z`vL>eJ;OfS1yCzf*h!)Ui897S)O$V%18|hdXBiiv4%aHwz`j9scoTEsYb=Rgnf3sq z(U*J!48_){j?++YmvbZubvO<+gBhrfm!lrsf||kCs1-PhTGErK`|qF{eu>(G0)y?D z$6{Xc%}@jGglcCnYURe*I;}+{)ZrE^g9lOH==-Q8^c`Z4v?O|wFNYdf9BLqSQ5|aa8<;mHT5FRFuqBkc!9qqb(YaW$&J zou~$mqh@vKCF;Q* zqwS^p0CjrDn*2=Tr>KGKL3MZvwKaE)udxVu{c%g}S3uog&uI!eqL#29Y6V83ejQIn z4PYJ?#uZo%_o8O{40SdFKIDXB6sm&>sF^M@u0p+T8&E5_1GRPkagtDnr%m5MxB{@sOOSU9rr+Wkck?=RE)=YsJG`hs{PZbi8+5Ip^@A} zeewRl>i8U!Fm|l{4~i2|1Ifm+cmb!O=SK_zXXAK0i@UM&IQtVDL}4lNbx^;KQ&0n* ziyT&`wTgshvL1tQAC|;y)SkV-f*3r(-m?nWjeH~24A+?Q&8R*99(8Ch8t-E``F~A5 ze4?F?MK8VoNhCD$PR4Gi!;y?y(h^C+b2p&Q;r4g3yj zqK{B3`V^i0NaUSt@8t-bO+MEYd&D23R$w*i^zXt-cp5d(oKx)q`JlEg1T~NfraS?) z6^ZDL@1qW1UsFG9D(kO;NfhY4osU&;Bl_S?bR9}m2hUNjn=dCX5hGFgOw=LF!W@{5 z+JZBv6}y4j(m$~Y`b@Vc)^Vbu*nXJW}xC?dIzCjJ_C`RL1EQfA0 z>?M!E3go+?K4@9k8NbCwSR{+>#bivx1x^wg=}pu?o?{*Ko@sa33}eW@iwQUZ)zD$g zg?VP#24e{MFw}}w#{f(~4ZO9nGioIr=#S3fBwCS}ikjIa)QoSVZhV9qnCEPJiwa^< z@-Y~IEzu9VV_qDH8o-CBLpL7F;56jdgS8WvV5K>h#izn){YauU1#Rcrhhq)u3$`8e z;W5;}E~7fUWAcBaI?OrGHWx_rZL<#_a!KSAxI)qYlY3 zRKq(^9Ud~C!~EoLoBThh`}`N!D;9=2<)u&^#9}DcKz-0UpxPUan$S#ir+;e+3B8Xi zFc`nYAp8;Y;0;s%1T`byh4yT6t z3C-*T>cQ)%J+>CvOBsfB$TmW~ZWB=hTZwvZ6RM-{Pz|3)y^gn06N*}FzYX_a_x0JXQ-sKa&%hvHp~#pGr7A2Ju9UbC3xoNVlb zrSXXIG1ed-vceunJB%Xl96~}%yb3kqJ*Wo{V`F@X&9TZ#`(L}qVL$RmQ8S4D#6I=a zPy=m%Y9|r(JE9ZDVOI>pIjH-#p_|_SeI&Fe`%w=ZMa}dCYGp2=9{3H_@B`EmzchK@ zRrb~uM4gd1)LW2*+WStZE$fTg^P#A-HWj_~{x32&tVTVs1=aBZbi-q)0iM9hcn+(g z?`r#0H^l1XhoJ7?is85eBk&w*MPH(}AmUT|t?GuO>ED__!UH|m*m@iNj6vv5eIb)C zf*Me9)Ig)q3oD`8scuX_Px1{=&o@QgpJ?*!(5Ww0ClWfv4pT84b>nDMgA+{oR8)gm z=!Nr8&n-c9umyGh4%8{%gXQry#$bW9_Me`cU~Tea*RuYq_?7}S@Q0~*hHc1K{>=WD zj7eCK{4c22^DhiXzt7FT1!DyHHpaoIv$7aV;u@@g$5Dsy73z$Iu4DamW7ImkpbF+7 z|K=*ehDMr9u&MZte0}0S#8je!DNn&eF*V;f2(<<9M>}{ zUto7mPh^ExHz(nFTX%@-#Uv_Ge-b8v3@e}EE)K!?Y z^G|;0x@w$YRM|@+i3p>^@|6Eh%v6QBX5l?^f3_)$Ca>?qKKv7Rnexs?y@~~?Ym02L z)B4&pu#JM9#D0@MLOK_rt1o5xPe`{(-yrn<>Y8Wn&54=hFA^_EzmM)v46zDwYTzmGt!;h?8}XRk;z9aG&k&^JQvZEd}HE!;wjOC(DjS!Cx4aZo^`}S zVw5SHOIp_q;|6R(d_vqIz9)FWtm%Z)!H@q?P@F-mB(3Xj@^4>v$%Ili-;^gC+ZjWs zZ%3>rf5|*Job(>jrOiDLjH*6LdMG~1q4nolVk-Z^e_bWK*QC3f^edx2F10An$zTVX zvNt>?5kZ|dv6Ogo>AUcp@FvC*<=(1u?LTF%%Rxozn+#4O3ewS0{GIrX`nfm=_0O}b zNyp$~;uz^Q_$i(xbS07>NK__<5FxZx#jdh`CjTMfn*U4^lTAfF(q9rih*;tj<(+XP z;ZM3P>KcF} zHx}iAKTLTp(#1$$Am&h)gZwC*MRcXC9Fd2z(b$T(LHQ>*5kDqc5WC55#roR+3^KYp z5)FwI;!`T061_<;CUn&y|Dh{o|F})Q8d01WP3S6%jqIfBr{1nRq^9A=xZc!FC%=<; zq4m$tXmx!@!Dajm!-xi?3#fwYOX4tP9f)S6yAT@*UHgdBlRK5jC@xZx+#&xmhKnTHu@9r9&}_T0mtKV5(L0BblA!9Cq6 zuT7+p4<%xWR^-1RbREP-ChgopqLy85d6B+gDuS>mSPrsL0#zxQHK0lB8u?Sq7~rAn`8paP5J1+E2ujUSaY})&Dgz?-FZBYhWvgPUZ%Z z)>Wb;ahiCK(3O|^W%vQ^Cfs>2lDO}xwSR1++=n*kx9vDJWv> zhpUJUroKAqe@$Hx$|@7b$)6{J%{_snHxZMFk(9l}y2J$1c{MXGH|$2)0b;QBzX1t9 z3Qu7vq5?N1VI|k?|M!PC_x(!Ua*B5lB?y1Y!YR|W3kzXQSB||mib~XtC5DhbNE9M{ zD2LhqyJXH1Es3|Uhsw~w4{w$CCS8%@Qj||aA1sJRC|^e0BOOM>nP>XoIg>s~`57XC zd`aS!lOL@qc>5|v<|5^Vv6rd1LcTxo|F52=>^v1Sh;hVr%6`KRgs%R?N3Il7H-dB( z97DL~zlcOIvj`wMlCH)Lp`>+vPQDE3_pmkb=4$>{`fCbnn2G_$Xsk^%=Dr~Ol_*ZU zOT-Ym>gmrmZlMt#H7wBG5dy?T-C?MOMeGu@H4ZGGQkwf+muN%Fb? delta 11953 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 5764c56b..d149f3dc 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-21 13:53+0200\n" +"POT-Creation-Date: 2022-06-21 14:09+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -143,9 +143,29 @@ msgid "Area of responsibility" msgstr "Zuständigkeitsbereich" #: analysis/templates/analysis/reports/includes/compensation/amount.html:18 +#: analysis/templates/analysis/reports/includes/compensation/amount.html:47 +#: analysis/templates/analysis/reports/includes/eco_account/amount.html:13 +#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:13 +#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:14 #: analysis/templates/analysis/reports/includes/intervention/amount.html:17 #: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:8 #: analysis/templates/analysis/reports/includes/intervention/laws.html:17 +#: analysis/templates/analysis/reports/includes/intervention/laws.html:43 +#: analysis/templates/analysis/reports/includes/old_data/amount.html:18 +#: konova/templates/konova/includes/quickstart/compensations.html:16 +#: konova/templates/konova/includes/quickstart/ecoaccounts.html:16 +#: konova/templates/konova/includes/quickstart/interventions.html:16 +msgid "Total" +msgstr "Insgesamt" + +#: analysis/templates/analysis/reports/includes/compensation/amount.html:19 +msgid "Number single areas" +msgstr "Einzelflächen" + +#: analysis/templates/analysis/reports/includes/compensation/amount.html:20 +#: analysis/templates/analysis/reports/includes/intervention/amount.html:18 +#: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:9 +#: analysis/templates/analysis/reports/includes/intervention/laws.html:20 #: compensation/tables.py:38 #: compensation/templates/compensation/detail/compensation/view.html:74 #: intervention/tables.py:38 @@ -154,14 +174,14 @@ msgstr "Zuständigkeitsbereich" msgid "Checked" msgstr "Geprüft" -#: analysis/templates/analysis/reports/includes/compensation/amount.html:19 -#: analysis/templates/analysis/reports/includes/eco_account/amount.html:13 -#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:8 -#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:9 -#: analysis/templates/analysis/reports/includes/intervention/amount.html:18 -#: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:9 -#: analysis/templates/analysis/reports/includes/intervention/laws.html:20 -#: analysis/templates/analysis/reports/includes/old_data/amount.html:18 +#: analysis/templates/analysis/reports/includes/compensation/amount.html:21 +#: analysis/templates/analysis/reports/includes/eco_account/amount.html:14 +#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:15 +#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:16 +#: analysis/templates/analysis/reports/includes/intervention/amount.html:19 +#: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:10 +#: analysis/templates/analysis/reports/includes/intervention/laws.html:23 +#: analysis/templates/analysis/reports/includes/old_data/amount.html:19 #: compensation/tables.py:44 compensation/tables.py:219 #: compensation/templates/compensation/detail/compensation/view.html:93 #: compensation/templates/compensation/detail/eco_account/includes/deductions.html:31 @@ -173,26 +193,6 @@ msgstr "Geprüft" msgid "Recorded" msgstr "Verzeichnet" -#: analysis/templates/analysis/reports/includes/compensation/amount.html:20 -msgid "Number single areas" -msgstr "Einzelflächen" - -#: analysis/templates/analysis/reports/includes/compensation/amount.html:21 -#: analysis/templates/analysis/reports/includes/compensation/amount.html:47 -#: analysis/templates/analysis/reports/includes/eco_account/amount.html:14 -#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:10 -#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:11 -#: analysis/templates/analysis/reports/includes/intervention/amount.html:19 -#: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:10 -#: analysis/templates/analysis/reports/includes/intervention/laws.html:23 -#: analysis/templates/analysis/reports/includes/intervention/laws.html:43 -#: analysis/templates/analysis/reports/includes/old_data/amount.html:19 -#: konova/templates/konova/includes/quickstart/compensations.html:16 -#: konova/templates/konova/includes/quickstart/ecoaccounts.html:16 -#: konova/templates/konova/includes/quickstart/interventions.html:16 -msgid "Total" -msgstr "Insgesamt" - #: analysis/templates/analysis/reports/includes/compensation/amount.html:26 msgid "Conservation office by law" msgstr "Naturschutzbehörde (§17 Abs.3 BNatSchG)" @@ -221,8 +221,18 @@ msgstr "Ökokonten" msgid "Deductions" msgstr "Abbuchungen" -#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:9 -#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:11 +#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:5 +msgid "" +"\n" +" Recorded = Counts the deductions whose interventions have been recorded\n" +" " +msgstr "" +"\n" +"Verzeichnet = Anzahl der Abbuchungen welche zu bereits verzeichneten Eingriffen gehören" +" " + +#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:14 +#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:16 #: compensation/forms/modalForms.py:187 #: compensation/templates/compensation/detail/compensation/includes/states-after.html:36 #: compensation/templates/compensation/detail/compensation/includes/states-before.html:36 From 83039e63ce72203af77e29994e9e345413f62f1c Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 21 Jun 2022 14:19:10 +0200 Subject: [PATCH 11/17] # 177 Timespanreport and Excel download * fixes bug on excel download * adds new order of columns to excel template for report download * enhances subtitle for old data entries on timespanreport template --- .../old_data/card_old_interventions.html | 2 +- analysis/utils/excel/excel.py | 2 +- analysis/utils/excel/excel_report.xlsx | Bin 10693 -> 10697 bytes locale/de/LC_MESSAGES/django.mo | Bin 43590 -> 43640 bytes locale/de/LC_MESSAGES/django.po | 13 ++++++++----- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html b/analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html index a25a5712..d0dc356f 100644 --- a/analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html +++ b/analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html @@ -10,7 +10,7 @@ {% fa5_icon 'pencil-ruler' %} {% trans 'Old interventions' %} - {% trans 'Before' %} 16.06.2018 + {% trans 'Binding date before' %} 16.06.2018 diff --git a/analysis/utils/excel/excel.py b/analysis/utils/excel/excel.py index 611f6a0c..818da7fd 100644 --- a/analysis/utils/excel/excel.py +++ b/analysis/utils/excel/excel.py @@ -108,7 +108,7 @@ class TempExcelFile: for _iter_entry in _iter_obj: j = 0 for _iter_attr in _attrs: - _new_cell = ws.cell(start_cell.row + i, start_cell.column + j, getattr(_iter_entry, _iter_attr)) + _new_cell = ws.cell(start_cell.row + i, start_cell.column + j, _iter_entry.get(_iter_attr, "MISSING")) _new_cell.border = border_style j += 1 i += 1 diff --git a/analysis/utils/excel/excel_report.xlsx b/analysis/utils/excel/excel_report.xlsx index 72cf1295461bac4f862d9bc163f7601c7c32ba20..041dfcf338a3f985d242e386ddc3a0e00383c4be 100644 GIT binary patch delta 7999 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 diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 804e1b7d41506e24c690c111a47de53d94be1c18..176b3feb054157ba59137c54fc2186bb40c3dc06 100644 GIT binary patch delta 8593 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 delta 8553 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 Bf9n7M diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index d149f3dc..6da567e1 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-21 14:09+0200\n" +"POT-Creation-Date: 2022-06-21 14:11+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -228,8 +228,8 @@ msgid "" " " msgstr "" "\n" -"Verzeichnet = Anzahl der Abbuchungen welche zu bereits verzeichneten Eingriffen gehören" -" " +"Verzeichnet = Anzahl der Abbuchungen welche zu bereits verzeichneten " +"Eingriffen gehören " #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:14 #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:16 @@ -325,8 +325,8 @@ msgid "Old interventions" msgstr "Altfälle" #: analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html:13 -msgid "Before" -msgstr "Vor" +msgid "Binding date before" +msgstr "Bestandskraft- bzw. Rechtskraftdatum vor" #: compensation/filters.py:122 msgid "Show only unrecorded" @@ -4333,6 +4333,9 @@ msgstr "" msgid "Unable to connect to qpid with SASL mechanism %s" msgstr "" +#~ msgid "Before" +#~ msgstr "Vor" + #~ msgid "Groups" #~ msgstr "Gruppen" From e4528dc5ef5b9f0e08d65e5b02dde8a7a97239ee Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 21 Jun 2022 14:25:50 +0200 Subject: [PATCH 12/17] # 177 Overview layout enhancement * enhances layout title section layout on overview template --- templates/generic_index.html | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/templates/generic_index.html b/templates/generic_index.html index 729be8e4..94be63d7 100644 --- a/templates/generic_index.html +++ b/templates/generic_index.html @@ -14,12 +14,14 @@ {% endblock %} {% block body %} -

+
{% if table.title %}
-

- {{ table.title }} -

+
+

+ {{ table.title }} +

+
{% if table.subtitle %}
From 72b779de98df9139b13be1fac620f16819c54029 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 21 Jun 2022 14:27:32 +0200 Subject: [PATCH 13/17] # 177 Impressum link * adds impressum link to footer --- konova/contexts.py | 4 +++- konova/sub_settings/context_settings.py | 1 + templates/footer.html | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/konova/contexts.py b/konova/contexts.py index 49357312..70cb1aac 100644 --- a/konova/contexts.py +++ b/konova/contexts.py @@ -7,7 +7,8 @@ Created on: 16.11.20 """ from django.http import HttpRequest -from konova.sub_settings.context_settings import BASE_TITLE, HELP_LINK, BASE_FRONTEND_TITLE, TAB_TITLE_IDENTIFIER +from konova.sub_settings.context_settings import BASE_TITLE, HELP_LINK, BASE_FRONTEND_TITLE, TAB_TITLE_IDENTIFIER, \ + IMPRESSUM_LINK from konova.sub_settings.django_settings import EMAIL_REPLY_TO @@ -25,6 +26,7 @@ class BaseContext: "user": request.user, "current_role": None, "help_link": HELP_LINK, + "impressum_link": IMPRESSUM_LINK, "CONTACT_MAIL": EMAIL_REPLY_TO, } diff --git a/konova/sub_settings/context_settings.py b/konova/sub_settings/context_settings.py index c28b744c..d4b1821c 100644 --- a/konova/sub_settings/context_settings.py +++ b/konova/sub_settings/context_settings.py @@ -11,3 +11,4 @@ BASE_TITLE = "KSP - Kompensationsverzeichnis Service Portal" BASE_FRONTEND_TITLE = "Kompensationsverzeichnis Service Portal" TAB_TITLE_IDENTIFIER = "tab_title" HELP_LINK = "https://dienste.naturschutz.rlp.de/doku/doku.php?id=ksp:start" +IMPRESSUM_LINK = "https://naturschutz.rlp.de/index.php?q=impressum" diff --git a/templates/footer.html b/templates/footer.html index af8fd949..3c26c44d 100644 --- a/templates/footer.html +++ b/templates/footer.html @@ -6,7 +6,7 @@ {% trans 'Help' %} - {% trans 'Impressum' %} + {% trans 'Impressum' %} {% trans 'Contact' %} From 053612a92498f143ed76ec2da1c3898ab8b35ab2 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 27 Jun 2022 14:31:09 +0200 Subject: [PATCH 14/17] #180 Shared data users hidden * implements hidden visibility of shared users on non-shared entries --- .../detail/compensation/view.html | 13 ++++++-- .../compensation/detail/eco_account/view.html | 13 ++++++-- ema/templates/ema/detail/view.html | 13 ++++++-- .../templates/intervention/detail/view.html | 13 ++++++-- locale/de/LC_MESSAGES/django.mo | Bin 43640 -> 43924 bytes locale/de/LC_MESSAGES/django.po | 30 ++++++++++++------ 6 files changed, 61 insertions(+), 21 deletions(-) diff --git a/compensation/templates/compensation/detail/compensation/view.html b/compensation/templates/compensation/detail/compensation/view.html index 5a125ccd..759f7600 100644 --- a/compensation/templates/compensation/detail/compensation/view.html +++ b/compensation/templates/compensation/detail/compensation/view.html @@ -123,9 +123,16 @@ {% include 'user/includes/team_data_modal_button.html' %} {% endfor %}
- {% for user in obj.intervention.users.all %} - {% include 'user/includes/contact_modal_button.html' %} - {% endfor %} + {% if has_access %} + {% for user in obj.users.all %} + {% include 'user/includes/contact_modal_button.html' %} + {% endfor %} + {% else %} + + {% fa5_icon 'eye-slash' %} + {{obj.users.count}} {% trans 'other users' %} + + {% endif %}
diff --git a/compensation/templates/compensation/detail/eco_account/view.html b/compensation/templates/compensation/detail/eco_account/view.html index 432315a8..c5bd2c54 100644 --- a/compensation/templates/compensation/detail/eco_account/view.html +++ b/compensation/templates/compensation/detail/eco_account/view.html @@ -101,9 +101,16 @@ {% include 'user/includes/team_data_modal_button.html' %} {% endfor %}
- {% for user in obj.users.all %} - {% include 'user/includes/contact_modal_button.html' %} - {% endfor %} + {% if has_access %} + {% for user in obj.users.all %} + {% include 'user/includes/contact_modal_button.html' %} + {% endfor %} + {% else %} + + {% fa5_icon 'eye-slash' %} + {{obj.users.count}} {% trans 'other users' %} + + {% endif %} diff --git a/ema/templates/ema/detail/view.html b/ema/templates/ema/detail/view.html index 16f31378..3e0d701b 100644 --- a/ema/templates/ema/detail/view.html +++ b/ema/templates/ema/detail/view.html @@ -87,9 +87,16 @@ {% include 'user/includes/team_data_modal_button.html' %} {% endfor %}
- {% for user in obj.user.all %} - {% include 'user/includes/contact_modal_button.html' %} - {% endfor %} + {% if has_access %} + {% for user in obj.users.all %} + {% include 'user/includes/contact_modal_button.html' %} + {% endfor %} + {% else %} + + {% fa5_icon 'eye-slash' %} + {{obj.users.count}} {% trans 'other users' %} + + {% endif %} diff --git a/intervention/templates/intervention/detail/view.html b/intervention/templates/intervention/detail/view.html index 1a596bb0..8a7799d3 100644 --- a/intervention/templates/intervention/detail/view.html +++ b/intervention/templates/intervention/detail/view.html @@ -129,9 +129,16 @@ {% include 'user/includes/team_data_modal_button.html' %} {% endfor %}
- {% for user in obj.users.all %} - {% include 'user/includes/contact_modal_button.html' %} - {% endfor %} + {% if has_access %} + {% for user in obj.users.all %} + {% include 'user/includes/contact_modal_button.html' %} + {% endfor %} + {% else %} + + {% fa5_icon 'eye-slash' %} + {{obj.users.count}} {% trans 'other users' %} + + {% endif %} diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 176b3feb054157ba59137c54fc2186bb40c3dc06..7072e4c2765d9290ef6c1c9cd3971d3b72a6cf1e 100644 GIT binary patch delta 10222 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 txqC$A*s_wMB6o3#r>vk73%HbNjN2DpR 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 6da567e1..c62c2bd3 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-21 14:11+0200\n" +"POT-Creation-Date: 2022-06-27 14:23+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1549,6 +1549,18 @@ msgstr "Eingriffsverursacher" msgid "Exists" msgstr "vorhanden" +#: intervention/templates/intervention/detail/view.html:138 +msgid "" +"The data must be shared with you, if you want to see which other users have " +"shared access as well." +msgstr "" +"Die Daten müssen für Sie freigegeben sein, damit Sie sehen können welche weiteren Nutzern " +"ebenfalls Zugriff hierauf haben." + +#: intervention/templates/intervention/detail/view.html:140 +msgid "other users" +msgstr "weitere Nutzer" + #: intervention/templates/intervention/report/report.html:58 msgid "Deductions of eco-accounts" msgstr "Abbuchungen von Ökokonten" @@ -1871,7 +1883,7 @@ msgstr "In Zwischenablage kopiert" #: konova/templates/konova/widgets/tree/checkbox/checkbox-tree-select.html:4 #: konova/templates/konova/widgets/tree/radio/radio-tree-select.html:4 -#: templates/generic_index.html:56 +#: templates/generic_index.html:58 msgid "Search" msgstr "Suchen" @@ -2463,31 +2475,31 @@ msgstr "" msgid "Fields with * are required." msgstr "* sind Pflichtfelder." -#: templates/generic_index.html:39 +#: templates/generic_index.html:41 msgid "New entry" msgstr "Neuer Eintrag" -#: templates/generic_index.html:41 user/templates/user/team/index.html:22 +#: templates/generic_index.html:43 user/templates/user/team/index.html:22 msgid "New" msgstr "Neu" -#: templates/generic_index.html:56 +#: templates/generic_index.html:58 msgid "Search for keywords" msgstr "Nach Schlagwörtern suchen" -#: templates/generic_index.html:57 +#: templates/generic_index.html:59 msgid "Start search" msgstr "Starte Suche" -#: templates/generic_index.html:69 +#: templates/generic_index.html:71 msgid "Results per page" msgstr "Treffer pro Seite" -#: templates/generic_index.html:93 templates/generic_index.html:118 +#: templates/generic_index.html:95 templates/generic_index.html:120 msgid "Filter" msgstr "" -#: templates/generic_index.html:120 +#: templates/generic_index.html:122 msgid "Apply filter" msgstr "Filter anwenden" From 85a456312360bf41dcf15106929717e3383e5d51 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 13 Jul 2022 08:19:27 +0200 Subject: [PATCH 15/17] Geometry Model geom SRID migration * adds two new migrations for transforming existing geometries into the default SRID --- konova/migrations/0012_auto_20220713_0801.py | 35 ++++++++++++++++++++ konova/migrations/0013_auto_20220713_0814.py | 22 ++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 konova/migrations/0012_auto_20220713_0801.py create mode 100644 konova/migrations/0013_auto_20220713_0814.py diff --git a/konova/migrations/0012_auto_20220713_0801.py b/konova/migrations/0012_auto_20220713_0801.py new file mode 100644 index 00000000..bd6e7645 --- /dev/null +++ b/konova/migrations/0012_auto_20220713_0801.py @@ -0,0 +1,35 @@ +# Generated by Django 3.1.3 on 2022-07-13 06:01 +import django +from django.db import migrations + +from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP + + +def migrate_geometry_srs(apps, schema_editor): + Geometry = apps.get_model("konova", "Geometry") + all_geoms = Geometry.objects.all() + + # Transform all geoms and store in new geom field + for geometry in all_geoms: + geom = geometry.geom + if geom is None: + continue + geom.transform(DEFAULT_SRID_RLP) + geometry.geom_tmp = geom + geometry.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('konova', '0011_auto_20220420_1101'), + ] + + operations = [ + migrations.AddField( + model_name="geometry", + name="geom_tmp", + field=django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=DEFAULT_SRID_RLP) + ), + migrations.RunPython(migrate_geometry_srs), + ] diff --git a/konova/migrations/0013_auto_20220713_0814.py b/konova/migrations/0013_auto_20220713_0814.py new file mode 100644 index 00000000..c0af268e --- /dev/null +++ b/konova/migrations/0013_auto_20220713_0814.py @@ -0,0 +1,22 @@ +# Generated by Django 3.1.3 on 2022-07-13 06:14 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('konova', '0012_auto_20220713_0801'), + ] + + operations = [ + migrations.RemoveField( + model_name="geometry", + name="geom" + ), + migrations.RenameField( + model_name="geometry", + old_name="geom_tmp", + new_name="geom" + ), + ] From 72e55993950e68e91b0074f3e98dca54e638dcd9 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 13 Jul 2022 10:53:45 +0200 Subject: [PATCH 16/17] Test update * updates tests for SRID migration --- api/tests/v1/update/test_api_update.py | 5 +++++ api/utils/serializer/serializer.py | 3 +++ konova/forms.py | 4 ++-- konova/models/geometry.py | 3 +-- konova/tests/test_views.py | 10 ++++------ 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/api/tests/v1/update/test_api_update.py b/api/tests/v1/update/test_api_update.py index ff867e69..ffaa6870 100644 --- a/api/tests/v1/update/test_api_update.py +++ b/api/tests/v1/update/test_api_update.py @@ -12,6 +12,7 @@ from django.contrib.gis import geos from django.urls import reverse from api.tests.v1.share.test_api_sharing import BaseAPIV1TestCase +from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP class APIV1UpdateTestCase(BaseAPIV1TestCase): @@ -63,6 +64,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase): put_props = put_body["properties"] put_geom = geos.fromstr(json.dumps(put_body)) + put_geom.transform(DEFAULT_SRID_RLP) self.assertEqual(put_geom, self.intervention.geometry.geom) self.assertEqual(put_props["title"], self.intervention.title) self.assertNotEqual(modified_on, self.intervention.modified) @@ -92,6 +94,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase): put_props = put_body["properties"] put_geom = geos.fromstr(json.dumps(put_body)) + put_geom.transform(DEFAULT_SRID_RLP) self.assertEqual(put_geom, self.compensation.geometry.geom) self.assertEqual(put_props["title"], self.compensation.title) self.assertNotEqual(modified_on, self.compensation.modified) @@ -121,6 +124,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase): put_props = put_body["properties"] put_geom = geos.fromstr(json.dumps(put_body)) + put_geom.transform(DEFAULT_SRID_RLP) self.assertEqual(put_geom, self.eco_account.geometry.geom) self.assertEqual(put_props["title"], self.eco_account.title) self.assertNotEqual(modified_on, self.eco_account.modified) @@ -152,6 +156,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase): put_props = put_body["properties"] put_geom = geos.fromstr(json.dumps(put_body)) + put_geom.transform(DEFAULT_SRID_RLP) self.assertEqual(put_geom, self.ema.geometry.geom) self.assertEqual(put_props["title"], self.ema.title) self.assertNotEqual(modified_on, self.ema.modified) diff --git a/api/utils/serializer/serializer.py b/api/utils/serializer/serializer.py index 8d618e44..e0511b85 100644 --- a/api/utils/serializer/serializer.py +++ b/api/utils/serializer/serializer.py @@ -12,6 +12,7 @@ from django.contrib.gis import geos from django.contrib.gis.geos import GEOSGeometry from django.core.paginator import Paginator +from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP from konova.utils.message_templates import DATA_UNSHARED @@ -133,6 +134,8 @@ class AbstractModelAPISerializer: if isinstance(geojson, dict): geojson = json.dumps(geojson) geometry = geos.fromstr(geojson) + if geometry.srid != DEFAULT_SRID_RLP: + geometry.transform(DEFAULT_SRID_RLP) if geometry.empty: geometry = None return geometry diff --git a/konova/forms.py b/konova/forms.py index 0a341e0c..ced2bf10 100644 --- a/konova/forms.py +++ b/konova/forms.py @@ -369,14 +369,14 @@ class SimpleGeomForm(BaseForm): if self.instance is None or self.instance.geometry is None: raise LookupError geometry = self.instance.geometry - geometry.geom = self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID)) + geometry.geom = self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID_RLP)) geometry.modified = action geometry.save() except LookupError: # No geometry or linked instance holding a geometry exist --> create a new one! geometry = Geometry.objects.create( - geom=self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID)), + geom=self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID_RLP)), created=action, ) # Start the parcel update procedure in a background process diff --git a/konova/models/geometry.py b/konova/models/geometry.py index b996feb7..e55082ac 100644 --- a/konova/models/geometry.py +++ b/konova/models/geometry.py @@ -21,8 +21,7 @@ class Geometry(BaseResource): """ Geometry model """ - from konova.settings import DEFAULT_SRID - geom = MultiPolygonField(null=True, blank=True, srid=DEFAULT_SRID) + geom = MultiPolygonField(null=True, blank=True, srid=DEFAULT_SRID_RLP) def __str__(self): return str(self.id) diff --git a/konova/tests/test_views.py b/konova/tests/test_views.py index 73029f96..4037c6bf 100644 --- a/konova/tests/test_views.py +++ b/konova/tests/test_views.py @@ -430,15 +430,13 @@ class BaseTestCase(TestCase): self.assertTrue(True) return + tolerance = 0.001 if geom1.srid != geom2.srid: - tolerance = 0.001 # Due to prior possible transformation of any of these geometries, we need to make sure there exists a # transformation from one coordinate system into the other, which is valid - geom1_t = geom1.transform(geom2.srid, clone=True) - geom2_t = geom2.transform(geom1.srid, clone=True) - self.assertTrue(geom1_t.equals_exact(geom2, tolerance) or geom2_t.equals_exact(geom1, tolerance)) - else: - self.assertTrue(geom1.equals(geom2)) + geom1.transform(geom2.srid) + geom2.transform(geom1.srid) + self.assertTrue(geom1.equals_exact(geom2, tolerance) or geom2.equals_exact(geom1, tolerance)) class BaseViewTestCase(BaseTestCase): From a955e9f564df34af3c1811ae9ca3748d31a1a653 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 13 Jul 2022 11:21:51 +0200 Subject: [PATCH 17/17] Revert "Merge branch 'Docker' into master" This reverts commit 8c47c8ae3505e624bb6c9ec8aafa32fd6bf71fb0, reversing changes made to 2206565673471e7c198b37083990f4e537d90948. Undos accidental remote merge --- Dockerfile | 24 ----------- README.md | 56 -------------------------- docker-compose.yml | 34 ---------------- docker-entrypoint.sh | 7 ---- konova/celery.py | 2 +- konova/sub_settings/django_settings.py | 30 ++++++++------ konova/sub_settings/sso_settings.py | 6 +-- nginx.conf | 20 --------- requirements.txt | 3 +- 9 files changed, 21 insertions(+), 161 deletions(-) delete mode 100644 Dockerfile delete mode 100644 docker-compose.yml delete mode 100755 docker-entrypoint.sh delete mode 100644 nginx.conf diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 6e35526c..00000000 --- a/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM python:3.9-slim -ENV PYTHONUNBUFFERED 1 - -WORKDIR /konova - -# Install some dependencies -RUN apt update -RUN apt install -y gdal-bin redis-server nginx - -# Copy requirements file into workspace and install all dependencies -COPY ./requirements.txt /konova/ -RUN pip install --upgrade pip -RUN pip install -r requirements.txt - -# Remove nginx default configuration and replace with own configuration -RUN rm /etc/nginx/sites-enabled/default -COPY ./nginx.conf /etc/nginx/conf.d - -# Copy rest of project into workspace -COPY . /konova/ - -# Move static files in designated folder -RUN python manage.py collectstatic --noinput - diff --git a/README.md b/README.md index 8fee9211..44971474 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ the database postgresql and the css library bootstrap as well as the icon packag fontawesome for a modern look, following best practices from the industry. ## Background processes -### !!! For non-docker run Konova uses celery for background processing. To start the worker you need to run ```shell $ celery -A konova worker -l INFO @@ -19,58 +18,3 @@ Technical documention is provided in the projects git wiki. A user documentation is not available (and not needed, yet). -# Docker -To run the docker-compose as expected, you need to take the following steps: - -1. Create a database containing docker, using an appropriate Dockerfile, e.g. the following -``` -version: '3.3' -services: - postgis: - image: postgis/postgis - restart: always - container_name: postgis-docker - ports: - - 5433:5432 - volumes: - - db-volume:/var/lib/postgresql/data - environment: - - POSTGRES_PASSWORD=postgres - - POSTGRES_USER=postgres - networks: - - db-network-bridge - -networks: - db-network-bridge: - driver: "bridge" - -volumes: - db-volume: -``` -This Dockerfile creates a Docker container running postgresql and postgis, creates the default superuser postgres, -creates a named volume for persisting the database and creates a new network bridge, which **must be used by any other -container, which wants to write/read on this database**. - -2. Make sure the name of the network bridge above matches the network in the konova docker-compose.yml -3. Get into the running postgis container (`docker exec -it postgis-docker bash`) and create new databases, users and so on. Make sure the database `konova` exists now! -4. Replace all `CHANGE_ME_xy` values inside of konova/docker-compose.yml for your installation. Make sure the `SSO_HOST` holds the proper SSO host, e.g. for the arnova project `arnova.example.org` (Arnova must be installed and the webserver configured as well, of course) -5. Take a look on konova/settings.py and konova/sub_settings/django_settings.py. Again: Replace all occurences of `CHANGE_ME` with proper values for your installation. - 1. Make sure you have the proper host strings added to `ALLOWED_HOSTS` inside of django_settings.py. -6. Build and run the docker setup using `docker-compose build` and `docker-compose start` from the main directory of this project (where the docker-compose.yml lives) -7. Run migrations! To do so, get into the konova service container (`docker exec -it konova-docker bash`) and run the needed commands (`python manage.py makemigrations LIST_OF_ALL_MIGRATABLE_APPS`, then `python manage.py migrate`) -8. Run the setup command `python manage.py setup` and follow the instructions on the CLI -9. To enable **SMTP** mail support, make sure your host machine (the one where the docker container run) has the postfix service configured properly. Make sure the `mynetworks` variable is xtended using the docker network bridge ip, created in the postgis container and used by the konova services. - 1. **Hint**: You can find out this easily by trying to perform a test mail in the running konova web application (which will fail, of course). Then take a look to the latest entries in `/var/log/mail.log` on your host machine. The failed IP will be displayed there. - 2. **Please note**: This installation guide is based on SMTP using postfix! - 3. Restart the postfix service on your host machine to reload the new configuration (`service postfix restart`) -10. Finally, make sure your host machine webserver passes incoming requests properly to the docker nginx webserver of konova. A proper nginx config for the host machine may look like this: -``` -server { - server_name konova.domain.org; - - location / { - proxy_pass http://localhost:KONOVA_NGINX_DOCKER_PORT/; - proxy_set_header Host $host; - } -} -``` \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index c7bd3f4b..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,34 +0,0 @@ -version: '3.3' - -services: - konova: - external_links: - - postgis:db - - arnova-nginx-server:arnova - build: . - container_name: "konova-docker" - command: ./docker-entrypoint.sh - restart: always - volumes: - - .:/konova - - /data/apps/konova/uploaded_files:/konova_uploaded_files - ports: - - "1337:80" - environment: - - POSTGRES_NAME=konova - - POSTGRES_PORT=5432 - - POSTGRES_PASSWORD=CHANGE_ME - - POSTGRES_USER=konova - - POSTGRES_HOST=db - - REDIS_HOST=localhost - - SSO_HOST=CHANGE_ME_TO_SSO_HOST_URL - - SMTP_HOST=172.17.0.1 - - SMTP_PORT=25 - - SMTP_REAL_REPLY_MAIL=ksp-servicestelle@sgdnord.rlp.de - -# Instead of an own, new network, we need to connect to the existing one, which is provided by the postgis container -# NOTE: THIS NETWORK MUST EXIST -networks: - default: - external: - name: postgis_nat_it_backend diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh deleted file mode 100755 index e9f2cea2..00000000 --- a/docker-entrypoint.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -# Start all needed services once the container is fired up! -service nginx start -service redis-server start -celery -A konova worker --detach -# Rule of thumb: (2*CPU)+1 as worker_num -> Use 5 as default (matches a dual core) -gunicorn --workers=5 konova.wsgi:application --bind=0.0.0.0:8000 \ No newline at end of file diff --git a/konova/celery.py b/konova/celery.py index ab06cf7c..478f2844 100644 --- a/konova/celery.py +++ b/konova/celery.py @@ -17,7 +17,7 @@ app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() # Declare redis as broker -app.conf.broker_url = f"redis://{os.environ.get('REDIS_HOST')}:6379/0" +app.conf.broker_url = 'redis://localhost:6379/0' @app.task(bind=True) diff --git a/konova/sub_settings/django_settings.py b/konova/sub_settings/django_settings.py index 54c35bee..746df289 100644 --- a/konova/sub_settings/django_settings.py +++ b/konova/sub_settings/django_settings.py @@ -125,11 +125,10 @@ WSGI_APPLICATION = 'konova.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', - 'NAME': os.environ.get('POSTGRES_NAME'), - 'USER': os.environ.get('POSTGRES_USER'), - 'HOST': os.environ.get('POSTGRES_HOST'), - 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), - 'PORT': os.environ.get('POSTGRES_PORT'), + 'NAME': 'konova', + 'USER': 'postgres', + 'HOST': '127.0.0.1', + 'PORT': '5432', } } @@ -219,14 +218,19 @@ DEBUG_TOOLBAR_CONFIG = { } # EMAIL (see https://docs.djangoproject.com/en/dev/topics/email/) -if DEBUG: - # ONLY FOR DEVELOPMENT NEEDED - EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' - EMAIL_FILE_PATH = '/tmp/app-messages' -DEFAULT_FROM_EMAIL = "no-reply@ksp.de" # The default email address for the 'from' element +# CHANGE_ME !!! ONLY FOR DEVELOPMENT !!! +if DEBUG: + EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' + EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location + +DEFAULT_FROM_EMAIL = "service@ksp.de" # The default email address for the 'from' element SERVER_EMAIL = DEFAULT_FROM_EMAIL # The default email sender address, which is used by Django to send errors via mail -EMAIL_HOST = os.environ.get('SMTP_HOST') -EMAIL_REPLY_TO = os.environ.get('SMTP_REAL_REPLY_MAIL') +EMAIL_HOST = "localhost" +EMAIL_REPLY_TO = "ksp-servicestelle@sgdnord.rlp.de" SUPPORT_MAIL_RECIPIENT = EMAIL_REPLY_TO -EMAIL_PORT = os.environ.get('SMTP_PORT') +EMAIL_PORT = "25" +#EMAIL_HOST_USER = "" +#EMAIL_HOST_PASSWORD = "" +EMAIL_USE_TLS = False +EMAIL_USE_SSL = False diff --git a/konova/sub_settings/sso_settings.py b/konova/sub_settings/sso_settings.py index 390ed403..20417f04 100644 --- a/konova/sub_settings/sso_settings.py +++ b/konova/sub_settings/sso_settings.py @@ -7,9 +7,7 @@ Created on: 31.01.22 """ # SSO settings -import os - -SSO_SERVER_BASE = f"http://{os.environ.get('SSO_HOST')}/" +SSO_SERVER_BASE = "http://127.0.0.1:8000/" SSO_SERVER = f"{SSO_SERVER_BASE}sso/" SSO_PRIVATE_KEY = "QuziFeih7U8DZvQQ1riPv2MXz0ZABupHED9wjoqZAqeMQaqkqTfxJDRXgSIyASwJ" -SSO_PUBLIC_KEY = "AGGK7E8eT5X5u2GD38ygGG3GpAefmIldJiiWW7gldRPqCG1CzmUfGdvPSGDbEY2n" +SSO_PUBLIC_KEY = "AGGK7E8eT5X5u2GD38ygGG3GpAefmIldJiiWW7gldRPqCG1CzmUfGdvPSGDbEY2n" \ No newline at end of file diff --git a/nginx.conf b/nginx.conf deleted file mode 100644 index 373393a2..00000000 --- a/nginx.conf +++ /dev/null @@ -1,20 +0,0 @@ -upstream konova { - server localhost:8000; -} - -server { - - listen 80; - - location / { - proxy_pass http://konova; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $host; - proxy_redirect off; - } - - location /static/ { - alias /konova/static/; - } - -} diff --git a/requirements.txt b/requirements.txt index 15a8d172..79a479ed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -48,5 +48,4 @@ wcwidth==0.2.5 webservices==0.7 wrapt==1.13.3 xmltodict==0.12.0 -zipp==3.4.1 -gunicorn==20.1.0 \ No newline at end of file +zipp==3.4.1 \ No newline at end of file