Compare commits

..

No commits in common. "492110882b6d5e883decba346cca4eaf7570780e" and "fb36bb6d3eb154f2942fc0000f820bad70a64565" have entirely different histories.

34 changed files with 146 additions and 490 deletions

View File

@ -22,7 +22,6 @@ 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",
@ -35,7 +34,6 @@ 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">{% trans 'Total' %}</th>
<th scope="col" class="w-25">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th> <th scope="col" class="w-25">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col">{% trans 'Total' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{{report.eco_account_report.queryset_count|default_if_zero:"-"}}</td>
<td>{{report.eco_account_report.queryset_recorded_count|default_if_zero:"-"}}</td> <td>{{report.eco_account_report.queryset_recorded_count|default_if_zero:"-"}}</td>
<td>{{report.eco_account_report.queryset_count|default_if_zero:"-"}}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -1,37 +1,22 @@
{% 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" class="w-25">{% trans 'Total' %}</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' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %} {% trans 'Surface' %}</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' %} {% trans 'Surface' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{{report.eco_account_report.queryset_deductions_count|default_if_zero:"-"}}</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.queryset_deductions_recorded_count|default_if_zero:"-"}}</td>
<td> <td>{{report.eco_account_report.recorded_deductions_sq_m|default_if_zero:"-"}}m²</td>
{{report.eco_account_report.recorded_deductions_sq_m|default_if_zero:"-"}} <td>{{report.eco_account_report.queryset_deductions_count|default_if_zero:"-"}}</td>
{% if report.eco_account_report.recorded_deductions_sq_m > 0 %} <td>{{report.eco_account_report.deductions_sq_m|default_if_zero:"-"}}m²</td>
{% 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">{% trans 'Type' %}</th> <th scope="col" class="w-25">{% fa5_icon 'star' %} {% trans 'Type' %}</th>
<th scope="col">{% trans 'Total' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th> <th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
<th scope="col">{% trans 'Total' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{% trans 'Intervention' %}</td> <td>{% trans 'Intervention' %}</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> <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>
</tr> </tr>
<tr> <tr>
<td>{% trans 'Compensation' %}</td> <td>{% trans 'Compensation' %}</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> <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>
</tr> </tr>
<tr> <tr>
<td>{% trans 'Eco-account' %}</td> <td>{% trans 'Eco-account' %}</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> <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>
</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 'Binding date before' %} 16.06.2018</span> <span>{% trans '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, _iter_entry.get(_iter_attr, "MISSING")) _new_cell = ws.cell(start_cell.row + i, start_cell.column + j, getattr(_iter_entry, _iter_attr))
_new_cell.border = border_style _new_cell.border = border_style
j += 1 j += 1
i += 1 i += 1

View File

@ -137,36 +137,22 @@ 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
evaluated_laws = [] intervention_laws_total = self.queryset.values_list("legal__laws__id")
sum_num_checked = 0 intervention_laws_checked = self.queryset.filter(checked__isnull=False).values_list("legal__laws__id")
sum_num_recorded = 0 intervention_laws_recorded = self.queryset.filter(recorded__isnull=False).values_list(
sum_num = 0 "legal__laws__id")
for law in laws: # Count how often which law id appears in the above list, return only the long_name of the law and the resulting
num = self.queryset.filter( # count (here 'num'). This is for keeping the db fetch as small as possible
legal__laws__atom_id=law.atom_id # Compute the sum for total, checked and recorded
).count() self.evaluated_laws = laws.annotate(
num_checked = self.queryset_checked.filter( num=Count("id", filter=Q(id__in=intervention_laws_total)),
legal__laws__atom_id=law.atom_id num_checked=Count("id", filter=Q(id__in=intervention_laws_checked)),
).count() num_recorded=Count("id", filter=Q(id__in=intervention_laws_recorded)),
num_recorded = self.queryset_recorded.filter( ).values_list("short_name", "long_name", "num_checked", "num_recorded", "num", named=True)
legal__laws__atom_id=law.atom_id self.law_sum = self.evaluated_laws.aggregate(sum_num=Sum("num"))["sum_num"]
).count() self.law_sum_checked = self.evaluated_laws.aggregate(sum_num_checked=Sum("num_checked"))["sum_num_checked"]
evaluated_laws.append({ self.law_sum_recorded = self.evaluated_laws.aggregate(sum_num_recorded=Sum("num_recorded"))["sum_num_recorded"]
"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,7 +12,6 @@ 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):
@ -64,7 +63,6 @@ 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)
@ -94,7 +92,6 @@ 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)
@ -124,7 +121,6 @@ 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)
@ -156,7 +152,6 @@ 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,7 +12,6 @@ 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
@ -134,8 +133,6 @@ 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

@ -1,165 +0,0 @@
"""
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,6 +12,7 @@ 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,16 +123,9 @@
{% 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.intervention.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

@ -101,16 +101,9 @@
{% 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,16 +87,9 @@
{% 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.user.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

@ -129,16 +129,9 @@
{% 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,8 +7,7 @@ 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
@ -26,7 +25,6 @@ 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_RLP)) geometry.geom = self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID))
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_RLP)), geom=self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID)),
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,7 +10,6 @@ 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:
@ -63,7 +62,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
@ -144,10 +143,9 @@ class BaseMigrater:
) )
fetch_results = tmp_cursor.fetchall() fetch_results = tmp_cursor.fetchall()
migrated_identifier = "(migriert)" instance.log.all().delete()
instance.log.filter(comment__contains=migrated_identifier).delete()
for result in fetch_results: for result in fetch_results:
comment = f"{result[0]} {migrated_identifier}" comment = result[0]
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)
@ -174,11 +172,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 and instance.created is None: if first_entry is not 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 and instance.modified != last_entry: if last_entry is not None:
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.gis.gdal import GDALException from django.contrib.auth.models import Group
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 from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP, DEFAULT_SRID
from user.models import UserActionLogEntry from user.models import User, 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_RLP) deductions_db_result_geom = MultiPolygon(srid=DEFAULT_SRID)
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_RLP) db_result_geom = MultiPolygon(db_result_geom, srid=DEFAULT_SRID)
instance.geometry = instance.geometry or Geometry() instance.geometry = instance.geometry or Geometry()
try: try:
# Calculate area by transforming # Calculate area by transforming
@ -146,8 +146,6 @@ 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, MultipleObjectsReturned from django.core.exceptions import ObjectDoesNotExist
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,8 +84,6 @@ 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

@ -1,35 +0,0 @@
# 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

@ -1,22 +0,0 @@
# 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,7 +21,8 @@ class Geometry(BaseResource):
""" """
Geometry model Geometry model
""" """
geom = MultiPolygonField(null=True, blank=True, srid=DEFAULT_SRID_RLP) from konova.settings import DEFAULT_SRID
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,4 +11,3 @@ 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,13 +430,15 @@ class BaseTestCase(TestCase):
self.assertTrue(True) self.assertTrue(True)
return return
tolerance = 0.001
if geom1.srid != geom2.srid: if geom1.srid != geom2.srid:
tolerance = 0.001
# Due to prior possible transformation of any of these geometries, we need to make sure there exists a # 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.transform(geom2.srid) geom1_t = geom1.transform(geom2.srid, clone=True)
geom2.transform(geom1.srid) geom2_t = geom2.transform(geom1.srid, clone=True)
self.assertTrue(geom1.equals_exact(geom2, tolerance) or geom2.equals_exact(geom1, tolerance)) self.assertTrue(geom1_t.equals_exact(geom2, tolerance) or geom2_t.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-06-27 14:23+0200\n" "POT-Creation-Date: 2022-05-31 13:05+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,19 +40,11 @@ msgstr ""
msgid "From" msgid "From"
msgstr "Vom" msgstr "Vom"
#: analysis/forms.py:25 #: analysis/forms.py:36
msgid "Entries created from..."
msgstr "Einträge erstellt seit..."
#: analysis/forms.py:37
msgid "To" msgid "To"
msgstr "Bis" msgstr "Bis"
#: analysis/forms.py:38 #: analysis/forms.py:47 compensation/forms/forms.py:77
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
@ -64,11 +56,11 @@ msgstr "Einträge erstellt bis..."
msgid "Conservation office" msgid "Conservation office"
msgstr "Eintragungsstelle" msgstr "Eintragungsstelle"
#: analysis/forms.py:51 compensation/forms/forms.py:79 #: analysis/forms.py:49 compensation/forms/forms.py:79
msgid "Select the responsible office" msgid "Select the responsible office"
msgstr "Verantwortliche Stelle" msgstr "Verantwortliche Stelle"
#: analysis/forms.py:60 compensation/forms/forms.py:88 #: analysis/forms.py:58 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
@ -77,15 +69,15 @@ msgstr "Verantwortliche Stelle"
msgid "Click for selection" msgid "Click for selection"
msgstr "Auswählen..." msgstr "Auswählen..."
#: analysis/forms.py:67 #: analysis/forms.py:65
msgid "Generate report" msgid "Generate report"
msgstr "Bericht generieren" msgstr "Bericht generieren"
#: analysis/forms.py:68 #: analysis/forms.py:66
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:71 konova/forms.py:227 #: analysis/forms.py:69 konova/forms.py:227
msgid "Continue" msgid "Continue"
msgstr "Weiter" msgstr "Weiter"
@ -143,29 +135,9 @@ 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
@ -174,14 +146,14 @@ msgstr "Einzelflächen"
msgid "Checked" msgid "Checked"
msgstr "Geprüft" msgstr "Geprüft"
#: analysis/templates/analysis/reports/includes/compensation/amount.html:21 #: analysis/templates/analysis/reports/includes/compensation/amount.html:19
#: analysis/templates/analysis/reports/includes/eco_account/amount.html:14 #: analysis/templates/analysis/reports/includes/eco_account/amount.html:13
#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:15 #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:8
#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:16 #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:9
#: analysis/templates/analysis/reports/includes/intervention/amount.html:19 #: analysis/templates/analysis/reports/includes/intervention/amount.html:18
#: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:10 #: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:9
#: analysis/templates/analysis/reports/includes/intervention/laws.html:23 #: analysis/templates/analysis/reports/includes/intervention/laws.html:20
#: analysis/templates/analysis/reports/includes/old_data/amount.html:19 #: analysis/templates/analysis/reports/includes/old_data/amount.html:18
#: 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
@ -193,6 +165,26 @@ 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)"
@ -221,18 +213,8 @@ msgstr "Ökokonten"
msgid "Deductions" msgid "Deductions"
msgstr "Abbuchungen" msgstr "Abbuchungen"
#: analysis/templates/analysis/reports/includes/eco_account/deductions.html:5 #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:9
msgid "" #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:11
"\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
@ -325,8 +307,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 "Binding date before" msgid "Before"
msgstr "Bestandskraft- bzw. Rechtskraftdatum vor" msgstr "Vor"
#: compensation/filters.py:122 #: compensation/filters.py:122
msgid "Show only unrecorded" msgid "Show only unrecorded"
@ -433,7 +415,6 @@ 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"
@ -442,7 +423,6 @@ 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"
@ -454,10 +434,7 @@ 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"
@ -696,14 +673,14 @@ msgstr ""
msgid "Pieces" msgid "Pieces"
msgstr "Stück" msgstr "Stück"
#: compensation/models/eco_account.py:55 #: compensation/models/eco_account.py:56
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:62 #: compensation/models/eco_account.py:63
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!"
@ -995,12 +972,7 @@ 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"
@ -1009,12 +981,7 @@ 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"
@ -1051,10 +1018,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:54 #: compensation/templates/compensation/report/compensation/report.html:24
#: compensation/templates/compensation/report/eco_account/report.html:47 #: compensation/templates/compensation/report/eco_account/report.html:37
#: ema/templates/ema/detail/view.html:71 #: ema/templates/ema/detail/view.html:71
#: ema/templates/ema/report/report.html:34 #: ema/templates/ema/report/report.html:24
#: 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"
@ -1156,11 +1123,11 @@ msgstr "Maßnahmenträger"
msgid "Report" msgid "Report"
msgstr "Bericht" msgstr "Bericht"
#: compensation/templates/compensation/report/eco_account/report.html:34 #: compensation/templates/compensation/report/eco_account/report.html:24
msgid "Deductions for" msgid "Deductions for"
msgstr "Abbuchungen für" msgstr "Abbuchungen für"
#: compensation/templates/compensation/report/eco_account/report.html:42 #: compensation/templates/compensation/report/eco_account/report.html:32
#: 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"
@ -1549,18 +1516,6 @@ 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"
@ -1883,7 +1838,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:58 #: templates/generic_index.html:56
msgid "Search" msgid "Search"
msgstr "Suchen" msgstr "Suchen"
@ -2475,31 +2430,31 @@ msgstr ""
msgid "Fields with * are required." msgid "Fields with * are required."
msgstr "* sind Pflichtfelder." msgstr "* sind Pflichtfelder."
#: templates/generic_index.html:41 #: templates/generic_index.html:39
msgid "New entry" msgid "New entry"
msgstr "Neuer Eintrag" msgstr "Neuer Eintrag"
#: templates/generic_index.html:43 user/templates/user/team/index.html:22 #: templates/generic_index.html:41 user/templates/user/team/index.html:22
msgid "New" msgid "New"
msgstr "Neu" msgstr "Neu"
#: templates/generic_index.html:58 #: templates/generic_index.html:56
msgid "Search for keywords" msgid "Search for keywords"
msgstr "Nach Schlagwörtern suchen" msgstr "Nach Schlagwörtern suchen"
#: templates/generic_index.html:59 #: templates/generic_index.html:57
msgid "Start search" msgid "Start search"
msgstr "Starte Suche" msgstr "Starte Suche"
#: templates/generic_index.html:71 #: templates/generic_index.html:69
msgid "Results per page" msgid "Results per page"
msgstr "Treffer pro Seite" msgstr "Treffer pro Seite"
#: templates/generic_index.html:95 templates/generic_index.html:120 #: templates/generic_index.html:93 templates/generic_index.html:118
msgid "Filter" msgid "Filter"
msgstr "" msgstr ""
#: templates/generic_index.html:122 #: templates/generic_index.html:120
msgid "Apply filter" msgid "Apply filter"
msgstr "Filter anwenden" msgstr "Filter anwenden"
@ -4345,9 +4300,6 @@ 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="{{ impressum_link }}" target="_blank">{% trans 'Impressum' %}</a> <a href="{% url 'home' %}">{% 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,15 +14,13 @@
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<div> <div class="col-md">
{% 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">