Compare commits

..

36 Commits

Author SHA1 Message Date
492110882b Fixes + enhancements
* minor fixes and enhancements
2022-08-01 14:07:48 +02:00
fbb7b66249 Merge branch 'master' into 132_Old_entries 2022-07-14 08:09:46 +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
d7c9c77b7b Merge pull request 'master' (#174) from master into Docker
Reviewed-on: SGD-Nord/konova#174
2022-06-02 09:38:06 +02:00
b273afdea3 Merge pull request 'Konova Code fix' (#173) from konova_code_migration into master
Reviewed-on: SGD-Nord/konova#173
2022-06-02 09:37:36 +02:00
e513db9da5 Merge pull request 'master' (#172) from master into Docker
Reviewed-on: SGD-Nord/konova#172
2022-06-02 08:53:32 +02:00
b0a15d9d1c 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
2022-05-31 16:53:13 +02:00
bec9c967b9 Merge pull request 'Update docker' (#159) from master into Docker
Reviewed-on: SGD-Nord/konova#159
2022-05-09 14:03:12 +02:00
a7b8752119 Merge pull request 'Docker_worker_enhance' (#155) from Docker_worker_enhance into Docker
Reviewed-on: SGD-Nord/konova#155
2022-05-09 11:05:33 +02:00
7027e0c02b Docker enhancement
* optimizes image build dependency
* increases gunicorn default number of workers
2022-04-26 10:09:58 +02:00
80de57a087 WIP: Docker enhancement
* reduces all needed containers into a single one
* simplifies initial startup command by adding docker-entrypoint.sh
2022-04-26 08:55:07 +02:00
7d29dddd22 WIP: Docker enhancement
* reduce containers into a single one, holding nginx + celery + redis all at once
2022-04-25 16:07:38 +02:00
4fc1ca9eed Merge pull request 'master' (#147) from master into Docker
Reviewed-on: SGD-Nord/konova#147
2022-04-13 08:48:19 +02:00
57e3287821 Merge pull request 'master' (#136) from master into Docker
Reviewed-on: SGD-Nord/konova#136
2022-03-21 12:21:50 +01:00
f50f17d593 Docker worker enhancement
* drops docker worker process in favor of background celery worker on main process
* changes uploaded files folder into host-based folder
2022-03-09 14:03:50 +01:00
05c8d6e520 Merge pull request 'master' (#134) from master into Docker
Reviewed-on: SGD-Nord/konova#134
2022-03-04 13:33:35 +01:00
a80fa4c700 Merge pull request 'master' (#130) from master into Docker
Reviewed-on: SGD-Nord/konova#130
2022-02-25 13:07:59 +01:00
65179eaaab Merge pull request 'HOTFIX' (#124) from master into Docker
Reviewed-on: SGD-Nord/konova#124
2022-02-18 15:28:35 +01:00
fdfb724109 Merge pull request 'master' (#123) from master into Docker
Reviewed-on: SGD-Nord/konova#123
2022-02-18 15:21:29 +01:00
cc4e4d650b Merge pull request 'master' (#113) from master into Docker
Reviewed-on: SGD-Nord/konova#113
2022-02-11 16:10:47 +01:00
3fcc438558 Revert "Revert accidental docker->master merge"
This reverts commit 49aba49406.
2022-02-04 15:17:08 +01:00
34 changed files with 490 additions and 146 deletions

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

@ -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!")

View File

@ -12,7 +12,6 @@ from codelist.models import KonovaCode
from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID
from compensation.managers import CompensationStateManager from compensation.managers import CompensationStateManager
from konova.models import UuidModel from konova.models import UuidModel
from konova.utils.message_templates import COMPENSATION_STATE_REMOVED
class CompensationState(UuidModel): class CompensationState(UuidModel):

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

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

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

@ -10,6 +10,7 @@ from django.utils.timezone import make_aware
from konova.models import Geometry from konova.models import Geometry
from konova.settings import DEFAULT_GROUP from konova.settings import DEFAULT_GROUP
from user.models import User, UserActionLogEntry, UserAction, Team from user.models import User, UserActionLogEntry, UserAction, Team
from konova.tasks import celery_update_parcels
class BaseMigrater: class BaseMigrater:
@ -62,7 +63,7 @@ class BaseMigrater:
geom = instance.geometry or Geometry() geom = instance.geometry or Geometry()
geom.geom = db_result_geom geom.geom = db_result_geom
geom.save() geom.save()
# celery_update_parcels.delay(geom.id) celery_update_parcels.delay(geom.id)
instance.geometry = geom instance.geometry = geom
return instance return instance
@ -143,9 +144,10 @@ class BaseMigrater:
) )
fetch_results = tmp_cursor.fetchall() fetch_results = tmp_cursor.fetchall()
instance.log.all().delete() migrated_identifier = "(migriert)"
instance.log.filter(comment__contains=migrated_identifier).delete()
for result in fetch_results: for result in fetch_results:
comment = result[0] comment = f"{result[0]} {migrated_identifier}"
timestamp = make_aware(result[1]) timestamp = make_aware(result[1])
user_name = result[2] user_name = result[2]
user = self._get_migrate_user(user_name) user = self._get_migrate_user(user_name)
@ -172,11 +174,11 @@ class BaseMigrater:
first_entry = instance.log.order_by("timestamp").first() first_entry = instance.log.order_by("timestamp").first()
last_entry = instance.log.order_by("-timestamp").first() last_entry = instance.log.order_by("-timestamp").first()
if first_entry is not None: if first_entry is not None and instance.created is None:
instance.created = UserActionLogEntry.get_created_action(first_entry.user) instance.created = UserActionLogEntry.get_created_action(first_entry.user)
instance.created.timestamp = first_entry.timestamp instance.created.timestamp = first_entry.timestamp
instance.created.save() instance.created.save()
if last_entry is not None: if last_entry is not None and instance.modified != last_entry:
instance.modified = last_entry instance.modified = last_entry
tmp_cursor.close() tmp_cursor.close()

View File

@ -1,6 +1,6 @@
import datetime import datetime
from django.contrib.auth.models import Group from django.contrib.gis.gdal import GDALException
from django.contrib.gis.geos import MultiPolygon, Polygon from django.contrib.gis.geos import MultiPolygon, Polygon
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.db import transaction from django.db import transaction
@ -13,8 +13,8 @@ from compensation.utils.quality import EcoAccountQualityChecker
from intervention.models import Responsibility, Handler, Intervention, Legal from intervention.models import Responsibility, Handler, Intervention, Legal
from konova.management.commands.kspMigrater.compensation_migrater import CompensationMigrater from konova.management.commands.kspMigrater.compensation_migrater import CompensationMigrater
from konova.models import Geometry from konova.models import Geometry
from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP, DEFAULT_SRID from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP
from user.models import User, UserActionLogEntry from user.models import UserActionLogEntry
class EcoAccountMigrater(CompensationMigrater): class EcoAccountMigrater(CompensationMigrater):
@ -104,7 +104,7 @@ class EcoAccountMigrater(CompensationMigrater):
if db_result_geom is not None: if db_result_geom is not None:
deductions_db_result_geom = MultiPolygon.from_ewkt(deduction_db_results[0][0]) deductions_db_result_geom = MultiPolygon.from_ewkt(deduction_db_results[0][0])
else: else:
deductions_db_result_geom = MultiPolygon(srid=DEFAULT_SRID) deductions_db_result_geom = MultiPolygon(srid=DEFAULT_SRID_RLP)
tmp_cursor.execute( tmp_cursor.execute(
'select ' 'select '
@ -121,7 +121,7 @@ class EcoAccountMigrater(CompensationMigrater):
db_result_geom = account_db_result_geom.union(deductions_db_result_geom) db_result_geom = account_db_result_geom.union(deductions_db_result_geom)
if isinstance(db_result_geom, Polygon): if isinstance(db_result_geom, Polygon):
db_result_geom = MultiPolygon(db_result_geom, srid=DEFAULT_SRID) db_result_geom = MultiPolygon(db_result_geom, srid=DEFAULT_SRID_RLP)
instance.geometry = instance.geometry or Geometry() instance.geometry = instance.geometry or Geometry()
try: try:
# Calculate area by transforming # Calculate area by transforming
@ -146,6 +146,8 @@ class EcoAccountMigrater(CompensationMigrater):
instance.geometry.save() instance.geometry.save()
except TypeError: except TypeError:
raise TypeError(f"{identifier}, {db_result_geom}") raise TypeError(f"{identifier}, {db_result_geom}")
except GDALException as e:
raise GDALException(f"{identifier}, {e}")
tmp_cursor.close() tmp_cursor.close()
return instance return instance

View File

@ -1,5 +1,5 @@
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from codelist.models import KonovaCode from codelist.models import KonovaCode
from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_REGISTRATION_OFFICE_ID from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_REGISTRATION_OFFICE_ID
@ -84,6 +84,8 @@ class UserMigrater(BaseMigrater):
except ObjectDoesNotExist: except ObjectDoesNotExist:
# organisation code might not be valid anymore # organisation code might not be valid anymore
continue continue
except MultipleObjectsReturned as e:
raise MultipleObjectsReturned(f"{_org}: {e}")
if company_team is not None and len(user_teams) == 0: if company_team is not None and len(user_teams) == 0:
# Only team is the company team # Only team is the company team
company_team.users.add(user) company_team.users.add(user)

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

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

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