Compare commits

...

17 Commits

Author SHA1 Message Date
c7d78113dc Merge pull request 'Update Docker' (#184) from master into Docker
Reviewed-on: SGD-Nord/konova#184
2022-07-13 11:31:27 +02:00
a955e9f564 Revert "Merge branch 'Docker' into master"
This reverts commit 8c47c8ae35, reversing
changes made to 2206565673.

Undos accidental remote merge
2022-07-13 11:21:51 +02:00
8c47c8ae35 Merge branch 'Docker' into master 2022-07-13 11:02:57 +02:00
2206565673 Merge pull request 'geometry_srid_migration' (#183) from geometry_srid_migration into master
Reviewed-on: SGD-Nord/konova#183
2022-07-13 10:57:37 +02:00
72e5599395 Test update
* updates tests for SRID migration
2022-07-13 10:53:45 +02:00
85a4563123 Geometry Model geom SRID migration
* adds two new migrations for transforming existing geometries into the default SRID
2022-07-13 08:19:27 +02:00
fc3c0c4beb Merge pull request '#180 Shared data users hidden' (#181) from 180_Visibility_of_contact_data into master
Reviewed-on: SGD-Nord/konova#181
2022-06-27 14:31:30 +02:00
053612a924 #180 Shared data users hidden
* implements hidden visibility of shared users on non-shared entries
2022-06-27 14:31:09 +02:00
10c86af314 Merge pull request '177_Minor_enhancements' (#178) from 177_Minor_enhancements into master
Reviewed-on: SGD-Nord/konova#178
2022-06-22 11:53:43 +02:00
72b779de98 # 177 Impressum link
* adds impressum link to footer
2022-06-21 14:27:32 +02:00
e4528dc5ef # 177 Overview layout enhancement
* enhances layout title section layout on overview template
2022-06-21 14:25:50 +02:00
83039e63ce # 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
2022-06-21 14:19:10 +02:00
2d3299cffa # 177 Timespanreport helptext for deductions
* adds help text for recorded deduction section
2022-06-21 14:11:01 +02:00
30d8a3c6e5 # 177 Timespanreport column order
* rearranges the column order so 'Total' will always be the first column
2022-06-21 14:02:49 +02:00
8245cf5bbb # 177 Report help texts
* adds report form field help texts
* adds translations
2022-06-21 13:54:41 +02:00
3fe80680a0 Merge pull request '# 175 Report law calculation bugfix' (#176) from 175_Report_law_calculation_wrong into master
Reviewed-on: SGD-Nord/konova#176
2022-06-15 17:46:49 +02:00
6c99a5b4e6 # 175 Report law calculation bugfix
* fixes bug where amount of used laws in intervention forms would not be calculated properly
2022-06-15 17:44:43 +02:00
38 changed files with 329 additions and 295 deletions

View File

@ -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

View File

@ -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. fontawesome for a modern look, following best practices from the industry.
## Background processes ## Background processes
### !!! For non-docker run
Konova uses celery for background processing. To start the worker you need to run Konova uses celery for background processing. To start the worker you need to run
```shell ```shell
$ celery -A konova worker -l INFO $ 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). 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;
}
}
```

View File

@ -22,6 +22,7 @@ class TimespanReportForm(BaseForm):
date_from = forms.DateField( date_from = forms.DateField(
label_suffix="", label_suffix="",
label=_("From"), label=_("From"),
help_text=_("Entries created from..."),
widget=forms.DateInput( widget=forms.DateInput(
attrs={ attrs={
"type": "date", "type": "date",
@ -34,6 +35,7 @@ class TimespanReportForm(BaseForm):
date_to = forms.DateField( date_to = forms.DateField(
label_suffix="", label_suffix="",
label=_("To"), label=_("To"),
help_text=_("Entries created until..."),
widget=forms.DateInput( widget=forms.DateInput(
attrs={ attrs={
"type": "date", "type": "date",

View File

@ -15,40 +15,40 @@
<thead> <thead>
<tr> <tr>
<th scope="col">{% trans 'Area of responsibility' %}</th> <th scope="col">{% trans 'Area of responsibility' %}</th>
<th scope="col">{% trans 'Total' %}</th>
<th scope="col">{% trans 'Number single areas' %}</th>
<th scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th> <th scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th> <th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col">{% trans 'Number single areas' %}</th>
<th scope="col">{% trans 'Total' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{% trans 'Conservation office by law' %}</td> <td>{% trans 'Conservation office by law' %}</td>
<td>{{report.compensation_report.queryset_registration_office_unb_count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.num_single_surfaces_total_unb|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_unb_checked_count|default_if_zero:"-"}}</td> <td>{{report.compensation_report.queryset_registration_office_unb_checked_count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_unb_recorded_count|default_if_zero:"-"}}</td> <td>{{report.compensation_report.queryset_registration_office_unb_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.num_single_surfaces_total_unb|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_unb_count|default_if_zero:"-"}}</td>
</tr> </tr>
<tr> <tr>
<td>{% trans 'Land-use planning' %}</td> <td>{% trans 'Land-use planning' %}</td>
<td>{{report.compensation_report.queryset_registration_office_tbp_count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.num_single_surfaces_total_tbp|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_tbp_checked_count|default_if_zero:"-"}}</td> <td>{{report.compensation_report.queryset_registration_office_tbp_checked_count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_tbp_recorded_count|default_if_zero:"-"}}</td> <td>{{report.compensation_report.queryset_registration_office_tbp_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.num_single_surfaces_total_tbp|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_tbp_count|default_if_zero:"-"}}</td>
</tr> </tr>
<tr> <tr>
<td>{% trans 'Other registration office' %}</td> <td>{% trans 'Other registration office' %}</td>
<td>{{report.compensation_report.queryset_registration_office_other_count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.num_single_surfaces_total_other|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_other_checked_count|default_if_zero:"-"}}</td> <td>{{report.compensation_report.queryset_registration_office_other_checked_count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_other_recorded_count|default_if_zero:"-"}}</td> <td>{{report.compensation_report.queryset_registration_office_other_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.num_single_surfaces_total_other|default_if_zero:"-"}}</td>
<td>{{report.compensation_report.queryset_registration_office_other_count|default_if_zero:"-"}}</td>
</tr> </tr>
<tr> <tr>
<td><strong>{% trans 'Total' %}</strong></td> <td><strong>{% trans 'Total' %}</strong></td>
<td><strong>{{report.compensation_report.queryset_count|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.compensation_report.num_single_surfaces_total|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.compensation_report.queryset_checked_count|default_if_zero:"-"}}</strong></td> <td><strong>{{report.compensation_report.queryset_checked_count|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.compensation_report.queryset_recorded_count|default_if_zero:"-"}}</strong></td> <td><strong>{{report.compensation_report.queryset_recorded_count|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.compensation_report.num_single_surfaces_total|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.compensation_report.queryset_count|default_if_zero:"-"}}</strong></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -10,14 +10,14 @@
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th scope="col" class="w-25">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col">{% trans 'Total' %}</th> <th scope="col">{% trans 'Total' %}</th>
<th scope="col" class="w-25">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{{report.eco_account_report.queryset_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.eco_account_report.queryset_count|default_if_zero:"-"}}</td> <td>{{report.eco_account_report.queryset_count|default_if_zero:"-"}}</td>
<td>{{report.eco_account_report.queryset_recorded_count|default_if_zero:"-"}}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -1,22 +1,37 @@
{% load i18n fontawesome_5 ksp_filters %} {% load i18n fontawesome_5 ksp_filters %}
<h3>{% trans 'Deductions' %}</h3> <h3>{% trans 'Deductions' %}</h3>
<strong>
{% blocktrans %}
Recorded = Counts the deductions whose interventions have been recorded
{% endblocktrans %}
</strong>
<div class="table-container"> <div class="table-container">
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %} {% trans 'Surface' %}</th>
<th scope="col" class="w-25">{% trans 'Total' %}</th> <th scope="col" class="w-25">{% trans 'Total' %}</th>
<th scope="col" class="w-25">{% trans 'Total' %} {% trans 'Surface' %}</th> <th scope="col" class="w-25">{% trans 'Total' %} {% trans 'Surface' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %} {% trans 'Surface' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{{report.eco_account_report.queryset_deductions_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.eco_account_report.recorded_deductions_sq_m|default_if_zero:"-"}}m²</td>
<td>{{report.eco_account_report.queryset_deductions_count|default_if_zero:"-"}}</td> <td>{{report.eco_account_report.queryset_deductions_count|default_if_zero:"-"}}</td>
<td>{{report.eco_account_report.deductions_sq_m|default_if_zero:"-"}}m²</td> <td>
{{report.eco_account_report.deductions_sq_m|default_if_zero:"-"}}
{% if report.eco_account_report.deductions_sq_m > 0 %}
{% endif %}
</td>
<td>{{report.eco_account_report.queryset_deductions_recorded_count|default_if_zero:"-"}}</td>
<td>
{{report.eco_account_report.recorded_deductions_sq_m|default_if_zero:"-"}}
{% if report.eco_account_report.recorded_deductions_sq_m > 0 %}
{% endif %}
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -14,16 +14,16 @@
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th scope="col" class="w-25">{% trans 'Total' %}</th>
<th scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th> <th scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th> <th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col" class="w-25">{% trans 'Total' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{{report.intervention_report.queryset_count|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.queryset_checked_count|default_if_zero:"-"}}</td> <td>{{report.intervention_report.queryset_checked_count|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.queryset_recorded_count|default_if_zero:"-"}}</td> <td>{{report.intervention_report.queryset_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.queryset_count|default_if_zero:"-"}}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -5,29 +5,29 @@
<thead> <thead>
<tr> <tr>
<th class="w-25" scope="col">{% trans 'Compensation type' %}</th> <th class="w-25" scope="col">{% trans 'Compensation type' %}</th>
<th class="w-25" scope="col">{% trans 'Total' %}</th>
<th class="w-25" scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th> <th class="w-25" scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th>
<th class="w-25" scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th> <th class="w-25" scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th class="w-25" scope="col">{% trans 'Total' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<th>{% trans 'Compensation' %}</th> <th>{% trans 'Compensation' %}</th>
<td>{{report.intervention_report.compensation_sum|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.compensation_sum_checked|default_if_zero:"-"}}</td> <td>{{report.intervention_report.compensation_sum_checked|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.compensation_sum_recorded|default_if_zero:"-"}}</td> <td>{{report.intervention_report.compensation_sum_recorded|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.compensation_sum|default_if_zero:"-"}}</td>
</tr> </tr>
<tr> <tr>
<th>{% trans 'Payment' %}</th> <th>{% trans 'Payment' %}</th>
<td>{{report.intervention_report.payment_sum|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.payment_sum_checked|default_if_zero:"-"}}</td> <td>{{report.intervention_report.payment_sum_checked|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.payment_sum_recorded|default_if_zero:"-"}}</td> <td>{{report.intervention_report.payment_sum_recorded|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.payment_sum|default_if_zero:"-"}}</td>
</tr> </tr>
<tr> <tr>
<th>{% trans 'Deductions' %}</th> <th>{% trans 'Deductions' %}</th>
<td>{{report.intervention_report.deduction_sum|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.deduction_sum_checked|default_if_zero:"-"}}</td> <td>{{report.intervention_report.deduction_sum_checked|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.deduction_sum_recorded|default_if_zero:"-"}}</td> <td>{{report.intervention_report.deduction_sum_recorded|default_if_zero:"-"}}</td>
<td>{{report.intervention_report.deduction_sum|default_if_zero:"-"}}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -13,15 +13,15 @@
<th class="w-25" scope="col"> <th class="w-25" scope="col">
{% trans 'Law' %} {% trans 'Law' %}
</th> </th>
<th scope="col">
{% trans 'Total' %}
</th>
<th scope="col"> <th scope="col">
{% fa5_icon 'star' %} {% trans 'Checked' %} {% fa5_icon 'star' %} {% trans 'Checked' %}
</th> </th>
<th scope="col"> <th scope="col">
{% fa5_icon 'bookmark' %} {% trans 'Recorded' %} {% fa5_icon 'bookmark' %} {% trans 'Recorded' %}
</th> </th>
<th scope="col">
{% trans 'Total' %}
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -34,16 +34,16 @@
{{law.long_name}} {{law.long_name}}
</small> </small>
</td> </td>
<td>{{law.num|default_if_zero:"-"}}</td>
<td>{{law.num_checked|default_if_zero:"-"}}</td> <td>{{law.num_checked|default_if_zero:"-"}}</td>
<td>{{law.num_recorded|default_if_zero:"-"}}</td> <td>{{law.num_recorded|default_if_zero:"-"}}</td>
<td>{{law.num|default_if_zero:"-"}}</td>
</tr> </tr>
{% endfor %} {% endfor %}
<tr> <tr>
<td><strong>{% trans 'Total' %}</strong></td> <td><strong>{% trans 'Total' %}</strong></td>
<td><strong>{{report.intervention_report.law_sum|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.intervention_report.law_sum_checked|default_if_zero:"-"}}</strong></td> <td><strong>{{report.intervention_report.law_sum_checked|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.intervention_report.law_sum_recorded|default_if_zero:"-"}}</strong></td> <td><strong>{{report.intervention_report.law_sum_recorded|default_if_zero:"-"}}</strong></td>
<td><strong>{{report.intervention_report.law_sum|default_if_zero:"-"}}</strong></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -14,26 +14,26 @@
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th scope="col" class="w-25">{% fa5_icon 'star' %} {% trans 'Type' %}</th> <th scope="col" class="w-25">{% trans 'Type' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col">{% trans 'Total' %}</th> <th scope="col">{% trans 'Total' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{% trans 'Intervention' %}</td> <td>{% trans 'Intervention' %}</td>
<td>{{report.old_data_report.queryset_intervention_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.old_data_report.queryset_intervention_count|default_if_zero:"-"}}</td> <td>{{report.old_data_report.queryset_intervention_count|default_if_zero:"-"}}</td>
<td>{{report.old_data_report.queryset_intervention_recorded_count|default_if_zero:"-"}}</td>
</tr> </tr>
<tr> <tr>
<td>{% trans 'Compensation' %}</td> <td>{% trans 'Compensation' %}</td>
<td>{{report.old_data_report.queryset_comps_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.old_data_report.queryset_comps_count|default_if_zero:"-"}}</td> <td>{{report.old_data_report.queryset_comps_count|default_if_zero:"-"}}</td>
<td>{{report.old_data_report.queryset_comps_recorded_count|default_if_zero:"-"}}</td>
</tr> </tr>
<tr> <tr>
<td>{% trans 'Eco-account' %}</td> <td>{% trans 'Eco-account' %}</td>
<td>{{report.old_data_report.queryset_acc_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.old_data_report.queryset_acc_count|default_if_zero:"-"}}</td> <td>{{report.old_data_report.queryset_acc_count|default_if_zero:"-"}}</td>
<td>{{report.old_data_report.queryset_acc_recorded_count|default_if_zero:"-"}}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -10,7 +10,7 @@
{% fa5_icon 'pencil-ruler' %} {% fa5_icon 'pencil-ruler' %}
{% trans 'Old interventions' %} {% trans 'Old interventions' %}
</h5> </h5>
<span>{% trans 'Before' %} 16.06.2018</span> <span>{% trans 'Binding date before' %} 16.06.2018</span>
</div> </div>
</div> </div>
</div> </div>

View File

@ -108,7 +108,7 @@ class TempExcelFile:
for _iter_entry in _iter_obj: for _iter_entry in _iter_obj:
j = 0 j = 0
for _iter_attr in _attrs: 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 _new_cell.border = border_style
j += 1 j += 1
i += 1 i += 1

View File

@ -137,22 +137,36 @@ class TimespanReport:
).order_by( ).order_by(
"long_name" "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") evaluated_laws = []
intervention_laws_checked = self.queryset.filter(checked__isnull=False).values_list("legal__laws__id") sum_num_checked = 0
intervention_laws_recorded = self.queryset.filter(recorded__isnull=False).values_list( sum_num_recorded = 0
"legal__laws__id") sum_num = 0
# Count how often which law id appears in the above list, return only the long_name of the law and the resulting for law in laws:
# count (here 'num'). This is for keeping the db fetch as small as possible num = self.queryset.filter(
# Compute the sum for total, checked and recorded legal__laws__atom_id=law.atom_id
self.evaluated_laws = laws.annotate( ).count()
num=Count("id", filter=Q(id__in=intervention_laws_total)), num_checked = self.queryset_checked.filter(
num_checked=Count("id", filter=Q(id__in=intervention_laws_checked)), legal__laws__atom_id=law.atom_id
num_recorded=Count("id", filter=Q(id__in=intervention_laws_recorded)), ).count()
).values_list("short_name", "long_name", "num_checked", "num_recorded", "num", named=True) num_recorded = self.queryset_recorded.filter(
self.law_sum = self.evaluated_laws.aggregate(sum_num=Sum("num"))["sum_num"] legal__laws__atom_id=law.atom_id
self.law_sum_checked = self.evaluated_laws.aggregate(sum_num_checked=Sum("num_checked"))["sum_num_checked"] ).count()
self.law_sum_recorded = self.evaluated_laws.aggregate(sum_num_recorded=Sum("num_recorded"))["sum_num_recorded"] 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): def _evaluate_compensations(self):
""" Analyzes the types of compensation distribution """ Analyzes the types of compensation distribution

View File

@ -12,6 +12,7 @@ from django.contrib.gis import geos
from django.urls import reverse from django.urls import reverse
from api.tests.v1.share.test_api_sharing import BaseAPIV1TestCase from api.tests.v1.share.test_api_sharing import BaseAPIV1TestCase
from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP
class APIV1UpdateTestCase(BaseAPIV1TestCase): class APIV1UpdateTestCase(BaseAPIV1TestCase):
@ -63,6 +64,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase):
put_props = put_body["properties"] put_props = put_body["properties"]
put_geom = geos.fromstr(json.dumps(put_body)) 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_geom, self.intervention.geometry.geom)
self.assertEqual(put_props["title"], self.intervention.title) self.assertEqual(put_props["title"], self.intervention.title)
self.assertNotEqual(modified_on, self.intervention.modified) self.assertNotEqual(modified_on, self.intervention.modified)
@ -92,6 +94,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase):
put_props = put_body["properties"] put_props = put_body["properties"]
put_geom = geos.fromstr(json.dumps(put_body)) 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_geom, self.compensation.geometry.geom)
self.assertEqual(put_props["title"], self.compensation.title) self.assertEqual(put_props["title"], self.compensation.title)
self.assertNotEqual(modified_on, self.compensation.modified) self.assertNotEqual(modified_on, self.compensation.modified)
@ -121,6 +124,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase):
put_props = put_body["properties"] put_props = put_body["properties"]
put_geom = geos.fromstr(json.dumps(put_body)) 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_geom, self.eco_account.geometry.geom)
self.assertEqual(put_props["title"], self.eco_account.title) self.assertEqual(put_props["title"], self.eco_account.title)
self.assertNotEqual(modified_on, self.eco_account.modified) self.assertNotEqual(modified_on, self.eco_account.modified)
@ -152,6 +156,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase):
put_props = put_body["properties"] put_props = put_body["properties"]
put_geom = geos.fromstr(json.dumps(put_body)) 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_geom, self.ema.geometry.geom)
self.assertEqual(put_props["title"], self.ema.title) self.assertEqual(put_props["title"], self.ema.title)
self.assertNotEqual(modified_on, self.ema.modified) self.assertNotEqual(modified_on, self.ema.modified)

View File

@ -12,6 +12,7 @@ from django.contrib.gis import geos
from django.contrib.gis.geos import GEOSGeometry from django.contrib.gis.geos import GEOSGeometry
from django.core.paginator import Paginator from django.core.paginator import Paginator
from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP
from konova.utils.message_templates import DATA_UNSHARED from konova.utils.message_templates import DATA_UNSHARED
@ -133,6 +134,8 @@ class AbstractModelAPISerializer:
if isinstance(geojson, dict): if isinstance(geojson, dict):
geojson = json.dumps(geojson) geojson = json.dumps(geojson)
geometry = geos.fromstr(geojson) geometry = geos.fromstr(geojson)
if geometry.srid != DEFAULT_SRID_RLP:
geometry.transform(DEFAULT_SRID_RLP)
if geometry.empty: if geometry.empty:
geometry = None geometry = None
return geometry return geometry

View File

@ -123,9 +123,16 @@
{% include 'user/includes/team_data_modal_button.html' %} {% include 'user/includes/team_data_modal_button.html' %}
{% endfor %} {% endfor %}
<hr> <hr>
{% for user in obj.intervention.users.all %} {% if has_access %}
{% for user in obj.users.all %}
{% include 'user/includes/contact_modal_button.html' %} {% include 'user/includes/contact_modal_button.html' %}
{% endfor %} {% endfor %}
{% else %}
<span title="{% trans 'The data must be shared with you, if you want to see which other users have shared access as well.' %}">
{% fa5_icon 'eye-slash' %}
{{obj.users.count}} {% trans 'other users' %}
</span>
{% endif %}
</td> </td>
</tr> </tr>
</table> </table>

View File

@ -101,9 +101,16 @@
{% include 'user/includes/team_data_modal_button.html' %} {% include 'user/includes/team_data_modal_button.html' %}
{% endfor %} {% endfor %}
<hr> <hr>
{% if has_access %}
{% for user in obj.users.all %} {% for user in obj.users.all %}
{% include 'user/includes/contact_modal_button.html' %} {% include 'user/includes/contact_modal_button.html' %}
{% endfor %} {% endfor %}
{% else %}
<span title="{% trans 'The data must be shared with you, if you want to see which other users have shared access as well.' %}">
{% fa5_icon 'eye-slash' %}
{{obj.users.count}} {% trans 'other users' %}
</span>
{% endif %}
</td> </td>
</tr> </tr>
</table> </table>

View File

@ -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

View File

@ -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

View File

@ -87,9 +87,16 @@
{% include 'user/includes/team_data_modal_button.html' %} {% include 'user/includes/team_data_modal_button.html' %}
{% endfor %} {% endfor %}
<hr> <hr>
{% for user in obj.user.all %} {% if has_access %}
{% for user in obj.users.all %}
{% include 'user/includes/contact_modal_button.html' %} {% include 'user/includes/contact_modal_button.html' %}
{% endfor %} {% endfor %}
{% else %}
<span title="{% trans 'The data must be shared with you, if you want to see which other users have shared access as well.' %}">
{% fa5_icon 'eye-slash' %}
{{obj.users.count}} {% trans 'other users' %}
</span>
{% endif %}
</td> </td>
</tr> </tr>
</table> </table>

View File

@ -129,9 +129,16 @@
{% include 'user/includes/team_data_modal_button.html' %} {% include 'user/includes/team_data_modal_button.html' %}
{% endfor %} {% endfor %}
<hr> <hr>
{% if has_access %}
{% for user in obj.users.all %} {% for user in obj.users.all %}
{% include 'user/includes/contact_modal_button.html' %} {% include 'user/includes/contact_modal_button.html' %}
{% endfor %} {% endfor %}
{% else %}
<span title="{% trans 'The data must be shared with you, if you want to see which other users have shared access as well.' %}">
{% fa5_icon 'eye-slash' %}
{{obj.users.count}} {% trans 'other users' %}
</span>
{% endif %}
</td> </td>
</tr> </tr>
</table> </table>

View File

@ -17,7 +17,7 @@ app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks() app.autodiscover_tasks()
# Declare redis as broker # 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) @app.task(bind=True)

View File

@ -7,7 +7,8 @@ Created on: 16.11.20
""" """
from django.http import HttpRequest 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 from konova.sub_settings.django_settings import EMAIL_REPLY_TO
@ -25,6 +26,7 @@ class BaseContext:
"user": request.user, "user": request.user,
"current_role": None, "current_role": None,
"help_link": HELP_LINK, "help_link": HELP_LINK,
"impressum_link": IMPRESSUM_LINK,
"CONTACT_MAIL": EMAIL_REPLY_TO, "CONTACT_MAIL": EMAIL_REPLY_TO,
} }

View File

@ -369,14 +369,14 @@ class SimpleGeomForm(BaseForm):
if self.instance is None or self.instance.geometry is None: if self.instance is None or self.instance.geometry is None:
raise LookupError raise LookupError
geometry = self.instance.geometry 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.modified = action
geometry.save() geometry.save()
except LookupError: except LookupError:
# No geometry or linked instance holding a geometry exist --> create a new one! # No geometry or linked instance holding a geometry exist --> create a new one!
geometry = Geometry.objects.create( 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, created=action,
) )
# Start the parcel update procedure in a background process # Start the parcel update procedure in a background process

View File

@ -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),
]

View File

@ -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"
),
]

View File

@ -21,8 +21,7 @@ class Geometry(BaseResource):
""" """
Geometry model Geometry model
""" """
from konova.settings import DEFAULT_SRID geom = MultiPolygonField(null=True, blank=True, srid=DEFAULT_SRID_RLP)
geom = MultiPolygonField(null=True, blank=True, srid=DEFAULT_SRID)
def __str__(self): def __str__(self):
return str(self.id) return str(self.id)

View File

@ -11,3 +11,4 @@ BASE_TITLE = "KSP - Kompensationsverzeichnis Service Portal"
BASE_FRONTEND_TITLE = "Kompensationsverzeichnis Service Portal" BASE_FRONTEND_TITLE = "Kompensationsverzeichnis Service Portal"
TAB_TITLE_IDENTIFIER = "tab_title" TAB_TITLE_IDENTIFIER = "tab_title"
HELP_LINK = "https://dienste.naturschutz.rlp.de/doku/doku.php?id=ksp:start" HELP_LINK = "https://dienste.naturschutz.rlp.de/doku/doku.php?id=ksp:start"
IMPRESSUM_LINK = "https://naturschutz.rlp.de/index.php?q=impressum"

View File

@ -125,11 +125,10 @@ WSGI_APPLICATION = 'konova.wsgi.application'
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis', 'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': os.environ.get('POSTGRES_NAME'), 'NAME': 'konova',
'USER': os.environ.get('POSTGRES_USER'), 'USER': 'postgres',
'HOST': os.environ.get('POSTGRES_HOST'), 'HOST': '127.0.0.1',
'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), 'PORT': '5432',
'PORT': os.environ.get('POSTGRES_PORT'),
} }
} }
@ -219,14 +218,19 @@ DEBUG_TOOLBAR_CONFIG = {
} }
# EMAIL (see https://docs.djangoproject.com/en/dev/topics/email/) # 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 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_HOST = "localhost"
EMAIL_REPLY_TO = os.environ.get('SMTP_REAL_REPLY_MAIL') EMAIL_REPLY_TO = "ksp-servicestelle@sgdnord.rlp.de"
SUPPORT_MAIL_RECIPIENT = EMAIL_REPLY_TO 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

View File

@ -7,9 +7,7 @@ Created on: 31.01.22
""" """
# SSO settings # SSO settings
import os SSO_SERVER_BASE = "http://127.0.0.1:8000/"
SSO_SERVER_BASE = f"http://{os.environ.get('SSO_HOST')}/"
SSO_SERVER = f"{SSO_SERVER_BASE}sso/" SSO_SERVER = f"{SSO_SERVER_BASE}sso/"
SSO_PRIVATE_KEY = "QuziFeih7U8DZvQQ1riPv2MXz0ZABupHED9wjoqZAqeMQaqkqTfxJDRXgSIyASwJ" SSO_PRIVATE_KEY = "QuziFeih7U8DZvQQ1riPv2MXz0ZABupHED9wjoqZAqeMQaqkqTfxJDRXgSIyASwJ"
SSO_PUBLIC_KEY = "AGGK7E8eT5X5u2GD38ygGG3GpAefmIldJiiWW7gldRPqCG1CzmUfGdvPSGDbEY2n" SSO_PUBLIC_KEY = "AGGK7E8eT5X5u2GD38ygGG3GpAefmIldJiiWW7gldRPqCG1CzmUfGdvPSGDbEY2n"

View File

@ -430,15 +430,13 @@ class BaseTestCase(TestCase):
self.assertTrue(True) self.assertTrue(True)
return return
if geom1.srid != geom2.srid:
tolerance = 0.001 tolerance = 0.001
if geom1.srid != geom2.srid:
# Due to prior possible transformation of any of these geometries, we need to make sure there exists a # 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 # transformation from one coordinate system into the other, which is valid
geom1_t = geom1.transform(geom2.srid, clone=True) geom1.transform(geom2.srid)
geom2_t = geom2.transform(geom1.srid, clone=True) geom2.transform(geom1.srid)
self.assertTrue(geom1_t.equals_exact(geom2, tolerance) or geom2_t.equals_exact(geom1, tolerance)) self.assertTrue(geom1.equals_exact(geom2, tolerance) or geom2.equals_exact(geom1, tolerance))
else:
self.assertTrue(geom1.equals(geom2))
class BaseViewTestCase(BaseTestCase): class BaseViewTestCase(BaseTestCase):

Binary file not shown.

View File

@ -26,7 +26,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-31 13:05+0200\n" "POT-Creation-Date: 2022-06-27 14:23+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -40,11 +40,19 @@ msgstr ""
msgid "From" msgid "From"
msgstr "Vom" 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" msgid "To"
msgstr "Bis" 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/detail/eco_account/view.html:59
#: compensation/templates/compensation/report/eco_account/report.html:16 #: compensation/templates/compensation/report/eco_account/report.html:16
#: compensation/utils/quality.py:100 ema/templates/ema/detail/view.html:49 #: compensation/utils/quality.py:100 ema/templates/ema/detail/view.html:49
@ -56,11 +64,11 @@ msgstr "Bis"
msgid "Conservation office" msgid "Conservation office"
msgstr "Eintragungsstelle" 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" msgid "Select the responsible office"
msgstr "Verantwortliche Stelle" 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 #: compensation/forms/forms.py:118 compensation/forms/forms.py:199
#: intervention/forms/forms.py:64 intervention/forms/forms.py:81 #: intervention/forms/forms.py:64 intervention/forms/forms.py:81
#: intervention/forms/forms.py:97 intervention/forms/forms.py:113 #: intervention/forms/forms.py:97 intervention/forms/forms.py:113
@ -69,15 +77,15 @@ msgstr "Verantwortliche Stelle"
msgid "Click for selection" msgid "Click for selection"
msgstr "Auswählen..." msgstr "Auswählen..."
#: analysis/forms.py:65 #: analysis/forms.py:67
msgid "Generate report" msgid "Generate report"
msgstr "Bericht generieren" msgstr "Bericht generieren"
#: analysis/forms.py:66 #: analysis/forms.py:68
msgid "Select a timespan and the desired conservation office" msgid "Select a timespan and the desired conservation office"
msgstr "Wählen Sie die Zeitspanne und die gewünschte Eintragungsstelle" 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" msgid "Continue"
msgstr "Weiter" msgstr "Weiter"
@ -135,9 +143,29 @@ msgid "Area of responsibility"
msgstr "Zuständigkeitsbereich" msgstr "Zuständigkeitsbereich"
#: analysis/templates/analysis/reports/includes/compensation/amount.html:18 #: 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/amount.html:17
#: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:8 #: 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: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/tables.py:38
#: compensation/templates/compensation/detail/compensation/view.html:74 #: compensation/templates/compensation/detail/compensation/view.html:74
#: intervention/tables.py:38 #: intervention/tables.py:38
@ -146,14 +174,14 @@ msgstr "Zuständigkeitsbereich"
msgid "Checked" msgid "Checked"
msgstr "Geprüft" msgstr "Geprüft"
#: analysis/templates/analysis/reports/includes/compensation/amount.html:19 #: analysis/templates/analysis/reports/includes/compensation/amount.html:21
#: analysis/templates/analysis/reports/includes/eco_account/amount.html:13 #: analysis/templates/analysis/reports/includes/eco_account/amount.html:14
#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:8 #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:15
#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:9 #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:16
#: analysis/templates/analysis/reports/includes/intervention/amount.html:18 #: analysis/templates/analysis/reports/includes/intervention/amount.html:19
#: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:9 #: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:10
#: analysis/templates/analysis/reports/includes/intervention/laws.html:20 #: analysis/templates/analysis/reports/includes/intervention/laws.html:23
#: analysis/templates/analysis/reports/includes/old_data/amount.html:18 #: analysis/templates/analysis/reports/includes/old_data/amount.html:19
#: compensation/tables.py:44 compensation/tables.py:219 #: compensation/tables.py:44 compensation/tables.py:219
#: compensation/templates/compensation/detail/compensation/view.html:93 #: compensation/templates/compensation/detail/compensation/view.html:93
#: compensation/templates/compensation/detail/eco_account/includes/deductions.html:31 #: compensation/templates/compensation/detail/eco_account/includes/deductions.html:31
@ -165,26 +193,6 @@ msgstr "Geprüft"
msgid "Recorded" msgid "Recorded"
msgstr "Verzeichnet" 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 #: analysis/templates/analysis/reports/includes/compensation/amount.html:26
msgid "Conservation office by law" msgid "Conservation office by law"
msgstr "Naturschutzbehörde (§17 Abs.3 BNatSchG)" msgstr "Naturschutzbehörde (§17 Abs.3 BNatSchG)"
@ -213,8 +221,18 @@ msgstr "Ökokonten"
msgid "Deductions" msgid "Deductions"
msgstr "Abbuchungen" msgstr "Abbuchungen"
#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:9 #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:5
#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:11 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/forms/modalForms.py:187
#: compensation/templates/compensation/detail/compensation/includes/states-after.html:36 #: compensation/templates/compensation/detail/compensation/includes/states-after.html:36
#: compensation/templates/compensation/detail/compensation/includes/states-before.html:36 #: compensation/templates/compensation/detail/compensation/includes/states-before.html:36
@ -307,8 +325,8 @@ msgid "Old interventions"
msgstr "Altfälle" msgstr "Altfälle"
#: analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html:13 #: analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html:13
msgid "Before" msgid "Binding date before"
msgstr "Vor" msgstr "Bestandskraft- bzw. Rechtskraftdatum vor"
#: compensation/filters.py:122 #: compensation/filters.py:122
msgid "Show only unrecorded" msgid "Show only unrecorded"
@ -415,6 +433,7 @@ msgid "Company Mustermann"
msgstr "Firma Mustermann" msgstr "Firma Mustermann"
#: compensation/forms/forms.py:143 #: compensation/forms/forms.py:143
#: compensation/templates/compensation/report/compensation/report.html:34
msgid "Is CEF" msgid "Is CEF"
msgstr "Ist CEF-Maßnahme" msgstr "Ist CEF-Maßnahme"
@ -423,6 +442,7 @@ msgid "Optionally: Whether this compensation is a CEF compensation?"
msgstr "Optional: Handelt es sich um eine CEF-Maßnahme?" msgstr "Optional: Handelt es sich um eine CEF-Maßnahme?"
#: compensation/forms/forms.py:156 #: compensation/forms/forms.py:156
#: compensation/templates/compensation/report/compensation/report.html:44
msgid "Is coherence keeping" msgid "Is coherence keeping"
msgstr "Ist Kohärenzsicherungsmaßnahme" msgstr "Ist Kohärenzsicherungsmaßnahme"
@ -434,7 +454,10 @@ msgstr "Optional: Handelt es sich um eine Kohärenzsicherungsmaßnahme?"
#: compensation/forms/forms.py:169 #: compensation/forms/forms.py:169
#: compensation/templates/compensation/detail/compensation/view.html:44 #: compensation/templates/compensation/detail/compensation/view.html:44
#: compensation/templates/compensation/detail/eco_account/view.html:75 #: 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/detail/view.html:61
#: ema/templates/ema/report/report.html:24
msgid "Is PIK" msgid "Is PIK"
msgstr "Ist PIK Maßnahme" msgstr "Ist PIK Maßnahme"
@ -673,14 +696,14 @@ msgstr ""
msgid "Pieces" msgid "Pieces"
msgstr "Stück" msgstr "Stück"
#: compensation/models/eco_account.py:56 #: compensation/models/eco_account.py:55
msgid "" msgid ""
"Deductable surface can not be larger than existing surfaces in after states" "Deductable surface can not be larger than existing surfaces in after states"
msgstr "" msgstr ""
"Die abbuchbare Fläche darf die Gesamtfläche der Zielzustände nicht " "Die abbuchbare Fläche darf die Gesamtfläche der Zielzustände nicht "
"überschreiten" "überschreiten"
#: compensation/models/eco_account.py:63 #: compensation/models/eco_account.py:62
msgid "" msgid ""
"Deductable surface can not be smaller than the sum of already existing " "Deductable surface can not be smaller than the sum of already existing "
"deductions. Please contact the responsible users for the deductions!" "deductions. Please contact the responsible users for the deductions!"
@ -972,7 +995,12 @@ msgstr "Fehlende Flächenmengen laut Zielzustand: "
#: compensation/templates/compensation/detail/compensation/view.html:57 #: compensation/templates/compensation/detail/compensation/view.html:57
#: compensation/templates/compensation/detail/compensation/view.html:67 #: compensation/templates/compensation/detail/compensation/view.html:67
#: compensation/templates/compensation/detail/eco_account/view.html:78 #: 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/detail/view.html:64
#: ema/templates/ema/report/report.html:27
#: venv/lib/python3.7/site-packages/django/forms/widgets.py:710 #: venv/lib/python3.7/site-packages/django/forms/widgets.py:710
msgid "Yes" msgid "Yes"
msgstr "Ja" msgstr "Ja"
@ -981,7 +1009,12 @@ msgstr "Ja"
#: compensation/templates/compensation/detail/compensation/view.html:59 #: compensation/templates/compensation/detail/compensation/view.html:59
#: compensation/templates/compensation/detail/compensation/view.html:69 #: compensation/templates/compensation/detail/compensation/view.html:69
#: compensation/templates/compensation/detail/eco_account/view.html:80 #: 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/detail/view.html:66
#: ema/templates/ema/report/report.html:29
#: venv/lib/python3.7/site-packages/django/forms/widgets.py:711 #: venv/lib/python3.7/site-packages/django/forms/widgets.py:711
msgid "No" msgid "No"
msgstr "Nein" msgstr "Nein"
@ -1018,10 +1051,10 @@ msgstr "Verzeichnet am"
#: compensation/templates/compensation/detail/compensation/view.html:107 #: compensation/templates/compensation/detail/compensation/view.html:107
#: compensation/templates/compensation/detail/eco_account/view.html:85 #: compensation/templates/compensation/detail/eco_account/view.html:85
#: compensation/templates/compensation/report/compensation/report.html:24 #: compensation/templates/compensation/report/compensation/report.html:54
#: compensation/templates/compensation/report/eco_account/report.html:37 #: compensation/templates/compensation/report/eco_account/report.html:47
#: ema/templates/ema/detail/view.html:71 #: 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/detail/view.html:113
#: intervention/templates/intervention/report/report.html:87 #: intervention/templates/intervention/report/report.html:87
msgid "Last modified" msgid "Last modified"
@ -1123,11 +1156,11 @@ msgstr "Maßnahmenträger"
msgid "Report" msgid "Report"
msgstr "Bericht" msgstr "Bericht"
#: compensation/templates/compensation/report/eco_account/report.html:24 #: compensation/templates/compensation/report/eco_account/report.html:34
msgid "Deductions for" msgid "Deductions for"
msgstr "Abbuchungen für" 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:53
#: intervention/templates/intervention/report/report.html:74 #: intervention/templates/intervention/report/report.html:74
msgid "None" msgid "None"
@ -1516,6 +1549,18 @@ msgstr "Eingriffsverursacher"
msgid "Exists" msgid "Exists"
msgstr "vorhanden" 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 #: intervention/templates/intervention/report/report.html:58
msgid "Deductions of eco-accounts" msgid "Deductions of eco-accounts"
msgstr "Abbuchungen von Ökokonten" msgstr "Abbuchungen von Ökokonten"
@ -1838,7 +1883,7 @@ msgstr "In Zwischenablage kopiert"
#: konova/templates/konova/widgets/tree/checkbox/checkbox-tree-select.html:4 #: konova/templates/konova/widgets/tree/checkbox/checkbox-tree-select.html:4
#: konova/templates/konova/widgets/tree/radio/radio-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" msgid "Search"
msgstr "Suchen" msgstr "Suchen"
@ -2430,31 +2475,31 @@ msgstr ""
msgid "Fields with * are required." msgid "Fields with * are required."
msgstr "* sind Pflichtfelder." msgstr "* sind Pflichtfelder."
#: templates/generic_index.html:39 #: templates/generic_index.html:41
msgid "New entry" msgid "New entry"
msgstr "Neuer Eintrag" 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" msgid "New"
msgstr "Neu" msgstr "Neu"
#: templates/generic_index.html:56 #: templates/generic_index.html:58
msgid "Search for keywords" msgid "Search for keywords"
msgstr "Nach Schlagwörtern suchen" msgstr "Nach Schlagwörtern suchen"
#: templates/generic_index.html:57 #: templates/generic_index.html:59
msgid "Start search" msgid "Start search"
msgstr "Starte Suche" msgstr "Starte Suche"
#: templates/generic_index.html:69 #: templates/generic_index.html:71
msgid "Results per page" msgid "Results per page"
msgstr "Treffer pro Seite" 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" msgid "Filter"
msgstr "" msgstr ""
#: templates/generic_index.html:120 #: templates/generic_index.html:122
msgid "Apply filter" msgid "Apply filter"
msgstr "Filter anwenden" msgstr "Filter anwenden"
@ -4300,6 +4345,9 @@ msgstr ""
msgid "Unable to connect to qpid with SASL mechanism %s" msgid "Unable to connect to qpid with SASL mechanism %s"
msgstr "" msgstr ""
#~ msgid "Before"
#~ msgstr "Vor"
#~ msgid "Groups" #~ msgid "Groups"
#~ msgstr "Gruppen" #~ msgstr "Gruppen"

View File

@ -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/;
}
}

View File

@ -49,4 +49,3 @@ webservices==0.7
wrapt==1.13.3 wrapt==1.13.3
xmltodict==0.12.0 xmltodict==0.12.0
zipp==3.4.1 zipp==3.4.1
gunicorn==20.1.0

View File

@ -6,7 +6,7 @@
<a href="{{ help_link }}" target="_blank">{% trans 'Help' %}</a> <a href="{{ help_link }}" target="_blank">{% trans 'Help' %}</a>
</span> </span>
<span class="col-sm-auto footer-link"> <span class="col-sm-auto footer-link">
<a href="{% url 'home' %}">{% trans 'Impressum' %}</a> <a href="{{ impressum_link }}" target="_blank">{% trans 'Impressum' %}</a>
</span> </span>
<span class="col-sm-auto footer-link"> <span class="col-sm-auto footer-link">
<a href="mailto:{{CONTACT_MAIL}}">{% trans 'Contact' %}</a> <a href="mailto:{{CONTACT_MAIL}}">{% trans 'Contact' %}</a>

View File

@ -14,13 +14,15 @@
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<div class="col-md"> <div>
{% if table.title %} {% if table.title %}
<div class="row"> <div class="row">
<div class="col-md">
<h3> <h3>
{{ table.title }} {{ table.title }}
</h3> </h3>
</div> </div>
</div>
{% if table.subtitle %} {% if table.subtitle %}
<div class="row mb-2"> <div class="row mb-2">
<div class="col-lg"> <div class="col-lg">