#26 Annual conservation report

* introduces new app 'analysis' for annual report generating and future features
* adds new templates (WIP)
* adds new routes (WIP)
This commit is contained in:
mpeltriaux 2021-10-18 15:52:51 +02:00
parent 2b06a439cf
commit 92155fb742
22 changed files with 641 additions and 126 deletions

0
analysis/__init__.py Normal file
View File

3
analysis/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
analysis/apps.py Normal file
View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class AnalysisConfig(AppConfig):
name = 'analysis'

3
analysis/models.py Normal file
View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View File

@ -0,0 +1,17 @@
{% extends 'base.html' %}
{% load i18n fontawesome_5 %}
{% block body %}
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<h3>{% trans 'Report' %}</h3>
<h5>{{office.long_name}}</h5>
</div>
</div>
<div class="col-sm-12 col-md-12 col-lg-12">
{% include 'analysis/reports/includes/intervention/card_intervention.html' %}
{% include 'analysis/reports/includes/card_compensation.html' %}
{% include 'analysis/reports/includes/card_eco_account.html' %}
{% include 'analysis/reports/includes/card_old_interventions.html' %}
</div>
{% endblock %}

View File

@ -0,0 +1,23 @@
{% load i18n fontawesome_5 %}
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<div class="card">
<div id="compensation" class="card-header cursor-pointer rlp-r" data-toggle="collapse" data-target="#compensationBody" aria-expanded="true" aria-controls="compensationBody">
<div class="row">
<div class="col-sm-6">
<h5>
{% fa5_icon 'leaf' %}
{% trans 'Compensations' %}
</h5>
</div>
</div>
</div>
<div id="compensationBody" class="collapse" aria-labelledby="compensation">
<div class="card-body">
{% include 'form/table/generic_table_form_body.html' %}
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,23 @@
{% load i18n fontawesome_5 %}
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<div class="card">
<div id="ecoAccounts" class="card-header cursor-pointer rlp-r" data-toggle="collapse" data-target="#ecoAccountsBody" aria-expanded="true" aria-controls="ecoAccountsBody">
<div class="row">
<div class="col-sm-6">
<h5>
{% fa5_icon 'tree' %}
{% trans 'Eco-Accounts' %}
</h5>
</div>
</div>
</div>
<div id="ecoAccountsBody" class="collapse" aria-labelledby="ecoAccounts">
<div class="card-body">
{% include 'form/table/generic_table_form_body.html' %}
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,24 @@
{% load i18n fontawesome_5 %}
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<div class="card">
<div id="oldIntervention" class="card-header cursor-pointer rlp-r" data-toggle="collapse" data-target="#oldInterventionBody" aria-expanded="true" aria-controls="oldInterventionBody">
<div class="row">
<div class="col-sm-6">
<h5>
{% fa5_icon 'pencil-ruler' %}
{% trans 'Old interventions' %}
</h5>
<span>{% trans 'Before' %} 16.06.2018</span>
</div>
</div>
</div>
<div id="oldInterventionBody" class="collapse" aria-labelledby="oldIntervention">
<div class="card-body">
{% include 'form/table/generic_table_form_body.html' %}
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,30 @@
{% load i18n fontawesome_5 %}
<h3>{% trans 'Amount' %}</h3>
<strong>
{% blocktrans %}
Checked = Has been checked by the registration office according to LKompVzVo
{% endblocktrans %}
<br>
{% blocktrans %}
Recorded = Has been checked and published by the conservation office
{% endblocktrans %}
</strong>
<div class="table-container">
<table class="table table-hover">
<thead>
<tr>
<th scope="col" class="w-25">{% trans 'Total' %}</th>
<th scope="col">{% fa5_icon 'star' %} {% trans 'Checked' %}</th>
<th scope="col">{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{report.intervention_report.queryset.count}}</td>
<td>{{report.intervention_report.queryset_checked.count}}</td>
<td>{{report.intervention_report.queryset_recorded.count}}</td>
</tr>
</tbody>
</table>
</div>

View File

@ -0,0 +1,26 @@
{% load i18n fontawesome_5 %}
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<div class="card">
<div id="intervention" class="card-header cursor-pointer rlp-r" data-toggle="collapse" data-target="#interventionBody" aria-expanded="true" aria-controls="interventionBody">
<div class="row">
<div class="col-sm-6">
<h5>
{% fa5_icon 'pencil-ruler' %}
{% trans 'Interventions' %}
</h5>
</div>
</div>
</div>
<div id="interventionBody" class="collapse" aria-labelledby="intervention">
<div class="card-body">
{% include 'analysis/reports/includes/intervention/amount.html' %}
<hr>
{% include 'analysis/reports/includes/intervention/laws.html' %}
<hr>
{% include 'analysis/reports/includes/intervention/compensated_by.html' %}
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,34 @@
{% load i18n fontawesome_5 %}
<h3>{% trans 'Compensated by' %}</h3>
<div class="table-container scroll-300">
<table class="table table-hover">
<thead>
<tr>
<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">{% trans 'Checked' %}</th>
<th class="w-25" scope="col">{% trans 'Recorded' %}</th>
</tr>
</thead>
<tbody>
<tr>
<th>{% trans 'Compensation' %}</th>
<td>{{report.intervention_report.compensation_sum}}</td>
<td>{{report.intervention_report.compensation_sum_checked}}</td>
<td>{{report.intervention_report.compensation_sum_recorded}}</td>
</tr>
<tr>
<th>{% trans 'Payment' %}</th>
<td>{{report.intervention_report.payment_sum}}</td>
<td>{{report.intervention_report.payment_sum_checked}}</td>
<td>{{report.intervention_report.payment_sum_recorded}}</td>
</tr>
<tr>
<th>{% trans 'Deductions' %}</th>
<td>{{report.intervention_report.deduction_sum}}</td>
<td>{{report.intervention_report.deduction_sum_checked}}</td>
<td>{{report.intervention_report.deduction_sum_recorded}}</td>
</tr>
</tbody>
</table>
</div>

View File

@ -0,0 +1,50 @@
{% load i18n fontawesome_5 %}
<h3>{% trans 'Law usage' %}</h3>
<strong>
{% blocktrans %}
Please note: One intervention can be based on multiple laws. This table therefore does not
count
{% endblocktrans %}
</strong>
<div class="table-container scroll-300">
<table class="table table-hover">
<thead>
<tr>
<th class="w-25" scope="col">
{% trans 'Law' %}
</th>
<th scope="col">
{% trans 'Checked' %}
</th>
<th scope="col">
{% trans 'Recorded' %}
</th>
<th scope="col">
{% trans 'Total' %}
</th>
</tr>
</thead>
<tbody>
{% for law in report.intervention_report.evaluated_laws %}
<tr>
<td>
{{law.short_name}}
<br>
<small>
{{law.long_name}}
</small>
</td>
<td>{{law.num_checked}}</td>
<td>{{law.num_recorded}}</td>
<td>{{law.num}}</td>
</tr>
{% endfor %}
<tr>
<td><strong>{% trans 'Total' %}</strong></td>
<td><strong>{{report.intervention_report.law_sum_checked}}</strong></td>
<td><strong>{{report.intervention_report.law_sum_recorded}}</strong></td>
<td><strong>{{report.intervention_report.law_sum}}</strong></td>
</tr>
</tbody>
</table>
</div>

View File

@ -0,0 +1,8 @@
{% extends 'base.html' %}
{% load i18n fontawesome_5 %}
{% block body %}
<div class="row">
<h3>{% trans 'Reports' %}</h3>
</div>
{% endblock %}

3
analysis/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

15
analysis/urls.py Normal file
View File

@ -0,0 +1,15 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 15.10.21
"""
from django.urls import path
from analysis.views import *
app_name = "analysis"
urlpatterns = [
path("reports/", index_reports_view, name="reports"),
path("reports/<id>", detail_report_view, name="report-detail"),
]

127
analysis/utils/report.py Normal file
View File

@ -0,0 +1,127 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 18.10.21
"""
from django.db.models import Count, Sum, Q
from codelist.models import KonovaCode
from codelist.settings import CODELIST_LAW_ID
from compensation.models import Compensation, Payment, EcoAccountDeduction
from intervention.models import Intervention
class TimespanReport:
office_id = -1
class InterventionReport:
queryset = Intervention.objects.none()
queryset_checked = Intervention.objects.none()
queryset_recorded = Intervention.objects.none()
# Law related
law_sum = -1
law_sum_checked = -1
law_sum_recorded = -1
evaluated_laws = None
# Compensations related
compensation_sum = -1
compensation_sum_checked = -1
compensation_sum_recorded = -1
payment_sum = -1
payment_sum_checked = -1
payment_sum_recorded = -1
deduction_sum = -1
deduction_sum_checked = -1
deduction_sum_recorded = -1
def __init__(self, id: str):
self.queryset = Intervention.objects.filter(
responsible__conservation_office__id=id,
deleted=None,
)
self.queryset_checked = self.queryset.filter(
checked__isnull=False
)
self.queryset_recorded = self.queryset.filter(
recorded__isnull=False
)
self._create_report()
def _create_report(self):
""" Creates all report information
Returns:
"""
self._evaluate_laws()
self._evaluate_compensations()
def _evaluate_laws(self):
""" Analyzes the intervention-law distribution
Returns:
"""
# Count interventions based on law
# Fetch all KonovaCodes for laws, sorted alphabetically
laws = KonovaCode.objects.filter(
is_archived=False,
is_leaf=True,
code_lists__in=[CODELIST_LAW_ID],
).order_by(
"long_name"
)
# Fetch all law ids which are used by any .legal object of an intervention object
intervention_laws_total = self.queryset.values_list("legal__laws__id")
intervention_laws_checked = self.queryset.filter(checked__isnull=False).values_list("legal__laws__id")
intervention_laws_recorded = self.queryset.filter(recorded__isnull=False).values_list(
"legal__laws__id")
# Count how often which law id appears in the above list, return only the long_name of the law and the resulting
# count (here 'num'). This is for keeping the db fetch as small as possible
# Compute the sum for total, checked and recorded
self.evaluated_laws = laws.annotate(
num=Count("id", filter=Q(id__in=intervention_laws_total)),
num_checked=Count("id", filter=Q(id__in=intervention_laws_checked)),
num_recorded=Count("id", filter=Q(id__in=intervention_laws_recorded)),
).values_list("short_name", "long_name", "num_checked", "num_recorded", "num", named=True)
self.law_sum = self.evaluated_laws.aggregate(sum_num=Sum("num"))["sum_num"]
self.law_sum_checked = self.evaluated_laws.aggregate(sum_num_checked=Sum("num_checked"))["sum_num_checked"]
self.law_sum_recorded = self.evaluated_laws.aggregate(sum_num_recorded=Sum("num_recorded"))["sum_num_recorded"]
def _evaluate_compensations(self):
""" Analyzes the types of compensation distribution
Returns:
"""
# Count all compensations
comps = Compensation.objects.filter(
intervention__in=self.queryset
)
self.compensation_sum = comps.count()
self.compensation_sum_checked = comps.filter(intervention__checked__isnull=False).count()
self.compensation_sum_recorded = comps.filter(intervention__recorded__isnull=False).count()
# Count all payments
payments = Payment.objects.filter(
intervention__in=self.queryset
)
self.payment_sum = payments.count()
self.payment_sum_checked = payments.filter(intervention__checked__isnull=False).count()
self.payment_sum_recorded = payments.filter(intervention__recorded__isnull=False).count()
# Count all deductions
deductions = EcoAccountDeduction.objects.filter(
intervention__in=self.queryset
)
self.deduction_sum = deductions.count()
self.deduction_sum_checked = deductions.filter(intervention__checked__isnull=False).count()
self.deduction_sum_recorded = deductions.filter(intervention__recorded__isnull=False).count()
def __init__(self, office_id: str):
self.office_id = office_id
self.intervention_report = self.InterventionReport(self.office_id)

59
analysis/views.py Normal file
View File

@ -0,0 +1,59 @@
from django.contrib.auth.decorators import login_required
from django.db.models import Count, Q, Sum
from django.http import HttpRequest
from django.shortcuts import render, get_object_or_404
from analysis.utils.report import TimespanReport
from codelist.models import KonovaCode
from codelist.settings import CODELIST_LAW_ID
from compensation.models import EcoAccount, Compensation
from ema.models import Ema
from intervention.models import Intervention
from konova.contexts import BaseContext
from konova.decorators import conservation_office_group_required
@login_required
@conservation_office_group_required
def index_reports_view(request: HttpRequest):
"""
Args:
request (HttpRequest): The incoming request
Returns:
"""
template = "analysis/reports/index.html"
context = {}
context = BaseContext(request, context).context
return render(request, template, context)
def detail_report_view(request: HttpRequest, id: str):
cons_office = get_object_or_404(
KonovaCode,
id=id,
)
cons_interventions = Intervention.objects.filter(
responsible__conservation_office__id=id,
deleted=None,
)
cons_comps = Compensation.objects.filter(
intervention__in=cons_interventions,
deleted=None,
)
cons_eco_account = EcoAccount.objects.filter(
responsible__conservation_office__id=id,
deleted=None,
)
report = TimespanReport(id)
template = "analysis/reports/detail.html"
context = {
"office": cons_office,
"report": report,
}
context = BaseContext(request, context).context
return render(request, template, context)

View File

@ -69,6 +69,7 @@ INSTALLED_APPS = [
'user', 'user',
'ema', 'ema',
'codelist', 'codelist',
'analysis',
] ]
if DEBUG: if DEBUG:
INSTALLED_APPS += [ INSTALLED_APPS += [

View File

@ -36,7 +36,8 @@ urlpatterns = [
path('ema/', include("ema.urls")), path('ema/', include("ema.urls")),
path('user/', include("user.urls")), path('user/', include("user.urls")),
path('news/', include("news.urls")), path('news/', include("news.urls")),
path('news/', include("codelist.urls")), path('cl/', include("codelist.urls")),
path('analysis/', include("analysis.urls")),
# Generic deadline routes # Generic deadline routes
path('deadline/<id>/remove', remove_deadline_view, name="deadline-remove"), path('deadline/<id>/remove', remove_deadline_view, name="deadline-remove"),

Binary file not shown.

View File

@ -19,7 +19,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: 2021-10-14 09:12+0200\n" "POT-Creation-Date: 2021-10-18 14:59+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"
@ -29,12 +29,111 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: analysis/templates/analysis/reports/detail.html:7
#: compensation/templates/compensation/report/compensation/report.html:7
#: compensation/templates/compensation/report/eco_account/report.html:7
#: ema/templates/ema/report/report.html:7
#: intervention/templates/intervention/report/report.html:7
msgid "Report"
msgstr "Bericht"
#: analysis/templates/analysis/reports/includes/card_compensation.html:11
#: compensation/tables.py:62
#: intervention/templates/intervention/detail/includes/compensations.html:8
#: intervention/templates/intervention/report/report.html:49
msgid "Compensations"
msgstr "Kompensationen"
#: analysis/templates/analysis/reports/includes/card_eco_account.html:11
msgid "Eco-Accounts"
msgstr "Ökokonten"
#: analysis/templates/analysis/reports/includes/card_intervention.html:10
#: intervention/tables.py:66
msgid "Interventions"
msgstr "Eingriffe"
#: analysis/templates/analysis/reports/includes/card_intervention.html:17
msgid "Total interventions"
msgstr "Insgesamt"
#: analysis/templates/analysis/reports/includes/card_intervention.html:22
msgid "Amount total"
msgstr "Anzahl insgesamt"
#: analysis/templates/analysis/reports/includes/card_intervention.html:26
msgid "Amount checked"
msgstr "Anzahl geprüft"
#: analysis/templates/analysis/reports/includes/card_intervention.html:30
msgid "Amount recorded"
msgstr "Anzahl verzeichnet"
#: analysis/templates/analysis/reports/includes/card_intervention.html:37
msgid "Law usage"
msgstr "Gesetzesanwendungen"
#: analysis/templates/analysis/reports/includes/card_intervention.html:43
#: intervention/forms/forms.py:68
#: intervention/templates/intervention/detail/view.html:39
#: intervention/templates/intervention/report/report.html:20
msgid "Law"
msgstr "Gesetz"
#: analysis/templates/analysis/reports/includes/card_intervention.html:46
#: compensation/tables.py:35
#: compensation/templates/compensation/detail/compensation/view.html:43
#: intervention/tables.py:33
#: intervention/templates/intervention/detail/view.html:68 user/models.py:48
msgid "Checked"
msgstr "Geprüft"
#: analysis/templates/analysis/reports/includes/card_intervention.html:49
#: compensation/tables.py:41 compensation/tables.py:181
#: compensation/templates/compensation/detail/compensation/view.html:57
#: compensation/templates/compensation/detail/eco_account/includes/deductions.html:31
#: compensation/templates/compensation/detail/eco_account/view.html:44
#: ema/tables.py:38 ema/templates/ema/detail/view.html:28
#: intervention/tables.py:39
#: intervention/templates/intervention/detail/view.html:82 user/models.py:49
msgid "Recorded"
msgstr "Verzeichnet"
#: analysis/templates/analysis/reports/includes/card_intervention.html:52
#: analysis/templates/analysis/reports/includes/card_intervention.html:72
#: konova/templates/konova/home.html:23 konova/templates/konova/home.html:61
#: konova/templates/konova/home.html:100
msgid "Total"
msgstr "Insgesamt"
#: analysis/templates/analysis/reports/includes/card_intervention.html:81
msgid ""
"\n"
" Please note: One intervention can be based on "
"multiple laws. This table therefore does not\n"
" count\n"
" "
msgstr ""
#: analysis/templates/analysis/reports/includes/card_old_interventions.html:11
msgid "Old interventions"
msgstr "Altfälle"
#: analysis/templates/analysis/reports/includes/card_old_interventions.html:13
msgid "Before"
msgstr "Vor"
#: analysis/templates/analysis/reports/index.html:6
#: templates/navbars/navbar.html:46
msgid "Reports"
msgstr "Berichte"
#: compensation/filters.py:70 #: compensation/filters.py:70
msgid "Show only unrecorded" msgid "Show only unrecorded"
msgstr "Nur unverzeichnete anzeigen" msgstr "Nur unverzeichnete anzeigen"
#: compensation/forms/forms.py:31 compensation/tables.py:25 #: compensation/forms/forms.py:31 compensation/tables.py:25
#: compensation/tables.py:167 ema/tables.py:28 intervention/forms/forms.py:27 #: compensation/tables.py:166 ema/tables.py:28 intervention/forms/forms.py:27
#: intervention/tables.py:23 #: intervention/tables.py:23
#: intervention/templates/intervention/detail/includes/compensations.html:30 #: intervention/templates/intervention/detail/includes/compensations.html:30
msgid "Identifier" msgid "Identifier"
@ -45,7 +144,7 @@ msgid "Generated automatically"
msgstr "Automatisch generiert" msgstr "Automatisch generiert"
#: compensation/forms/forms.py:43 compensation/tables.py:30 #: compensation/forms/forms.py:43 compensation/tables.py:30
#: compensation/tables.py:172 #: compensation/tables.py:171
#: compensation/templates/compensation/detail/compensation/includes/documents.html:28 #: compensation/templates/compensation/detail/compensation/includes/documents.html:28
#: compensation/templates/compensation/detail/compensation/view.html:31 #: compensation/templates/compensation/detail/compensation/view.html:31
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:28 #: compensation/templates/compensation/detail/eco_account/includes/documents.html:28
@ -308,12 +407,12 @@ msgstr "Maßnahmentyp wählen"
#: compensation/templates/compensation/detail/compensation/includes/documents.html:35 #: compensation/templates/compensation/detail/compensation/includes/documents.html:35
#: compensation/templates/compensation/detail/compensation/includes/states-after.html:40 #: compensation/templates/compensation/detail/compensation/includes/states-after.html:40
#: compensation/templates/compensation/detail/compensation/includes/states-before.html:40 #: compensation/templates/compensation/detail/compensation/includes/states-before.html:40
#: compensation/templates/compensation/detail/eco_account/includes/actions.html:37 #: compensation/templates/compensation/detail/eco_account/includes/actions.html:38
#: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:37 #: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:37
#: compensation/templates/compensation/detail/eco_account/includes/deductions.html:40 #: compensation/templates/compensation/detail/eco_account/includes/deductions.html:40
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:34 #: compensation/templates/compensation/detail/eco_account/includes/documents.html:34
#: compensation/templates/compensation/detail/eco_account/includes/states-after.html:39 #: compensation/templates/compensation/detail/eco_account/includes/states-after.html:40
#: compensation/templates/compensation/detail/eco_account/includes/states-before.html:39 #: compensation/templates/compensation/detail/eco_account/includes/states-before.html:40
#: ema/templates/ema/detail/includes/actions.html:37 #: ema/templates/ema/detail/includes/actions.html:37
#: ema/templates/ema/detail/includes/deadlines.html:37 #: ema/templates/ema/detail/includes/deadlines.html:37
#: ema/templates/ema/detail/includes/documents.html:34 #: ema/templates/ema/detail/includes/documents.html:34
@ -358,38 +457,38 @@ msgstr "Geben Sie die Daten der neuen Maßnahme ein"
msgid "Added action" msgid "Added action"
msgstr "Maßnahme hinzugefügt" msgstr "Maßnahme hinzugefügt"
#: compensation/models.py:78 #: compensation/models.py:82
msgid "cm" msgid "cm"
msgstr "" msgstr ""
#: compensation/models.py:79 #: compensation/models.py:83
msgid "m" msgid "m"
msgstr "" msgstr ""
#: compensation/models.py:80 #: compensation/models.py:84
msgid "km" msgid "km"
msgstr "" msgstr ""
#: compensation/models.py:81 #: compensation/models.py:85
msgid "m²" msgid "m²"
msgstr "" msgstr ""
#: compensation/models.py:82 #: compensation/models.py:86
msgid "ha" msgid "ha"
msgstr "" msgstr ""
#: compensation/models.py:83 #: compensation/models.py:87
msgid "Pieces" msgid "Pieces"
msgstr "Stück" msgstr "Stück"
#: compensation/models.py:311 #: compensation/models.py:321
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.py:318 #: compensation/models.py:328
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!"
@ -397,40 +496,17 @@ msgstr ""
"Es wurde bereits mehr Fläche abgebucht, als Sie nun als abbuchbar einstellen " "Es wurde bereits mehr Fläche abgebucht, als Sie nun als abbuchbar einstellen "
"wollen. Kontaktieren Sie die für die Abbuchungen verantwortlichen Nutzer!" "wollen. Kontaktieren Sie die für die Abbuchungen verantwortlichen Nutzer!"
#: compensation/tables.py:35 #: compensation/tables.py:47 compensation/tables.py:187 ema/tables.py:44
#: compensation/templates/compensation/detail/compensation/view.html:43
#: intervention/tables.py:33
#: intervention/templates/intervention/detail/view.html:68 user/models.py:48
msgid "Checked"
msgstr "Geprüft"
#: compensation/tables.py:41 compensation/tables.py:182
#: compensation/templates/compensation/detail/compensation/view.html:57
#: compensation/templates/compensation/detail/eco_account/includes/deductions.html:31
#: compensation/templates/compensation/detail/eco_account/view.html:44
#: ema/tables.py:38 ema/templates/ema/detail/view.html:28
#: intervention/tables.py:39
#: intervention/templates/intervention/detail/view.html:82 user/models.py:49
msgid "Recorded"
msgstr "Verzeichnet"
#: compensation/tables.py:47 compensation/tables.py:188 ema/tables.py:44
#: intervention/tables.py:51 #: intervention/tables.py:51
msgid "Editable" msgid "Editable"
msgstr "Freigegeben" msgstr "Freigegeben"
#: compensation/tables.py:53 compensation/tables.py:194 ema/tables.py:50 #: compensation/tables.py:53 compensation/tables.py:193 ema/tables.py:50
#: intervention/tables.py:57 #: intervention/tables.py:57
msgid "Last edit" msgid "Last edit"
msgstr "Zuletzt bearbeitet" msgstr "Zuletzt bearbeitet"
#: compensation/tables.py:62 #: compensation/tables.py:84 compensation/tables.py:224 ema/tables.py:82
#: intervention/templates/intervention/detail/includes/compensations.html:8
#: intervention/templates/intervention/report/report.html:49
msgid "Compensations"
msgstr "Kompensationen"
#: compensation/tables.py:84 compensation/tables.py:225 ema/tables.py:82
#: intervention/tables.py:88 #: intervention/tables.py:88
msgid "Open {}" msgid "Open {}"
msgstr "Öffne {}" msgstr "Öffne {}"
@ -451,46 +527,47 @@ msgstr "Am {} von {} geprüft worden"
#: compensation/tables.py:129 #: compensation/tables.py:129
#: compensation/templates/compensation/detail/compensation/view.html:60 #: compensation/templates/compensation/detail/compensation/view.html:60
#: compensation/templates/compensation/detail/eco_account/includes/deductions.html:56
#: compensation/templates/compensation/detail/eco_account/view.html:47 #: compensation/templates/compensation/detail/eco_account/view.html:47
#: ema/tables.py:101 ema/templates/ema/detail/view.html:31 #: ema/tables.py:101 ema/templates/ema/detail/view.html:31
#: intervention/models.py:384 intervention/tables.py:131 #: intervention/tables.py:131
#: intervention/templates/intervention/detail/view.html:85 #: intervention/templates/intervention/detail/view.html:85
msgid "Not recorded yet" msgid "Not recorded yet"
msgstr "Noch nicht verzeichnet" msgstr "Noch nicht verzeichnet"
#: compensation/tables.py:134 compensation/tables.py:263 ema/tables.py:106 #: compensation/tables.py:134 compensation/tables.py:262 ema/tables.py:106
#: intervention/models.py:389 intervention/tables.py:136 #: intervention/tables.py:136
msgid "Recorded on {} by {}" msgid "Recorded on {} by {}"
msgstr "Am {} von {} verzeichnet worden" msgstr "Am {} von {} verzeichnet worden"
#: compensation/tables.py:159 compensation/tables.py:286 ema/tables.py:129 #: compensation/tables.py:158 compensation/tables.py:284 ema/tables.py:129
#: intervention/tables.py:159 #: intervention/tables.py:159
msgid "Full access granted" msgid "Full access granted"
msgstr "Für Sie freigegeben - Datensatz kann bearbeitet werden" msgstr "Für Sie freigegeben - Datensatz kann bearbeitet werden"
#: compensation/tables.py:159 compensation/tables.py:286 ema/tables.py:129 #: compensation/tables.py:158 compensation/tables.py:284 ema/tables.py:129
#: intervention/tables.py:159 #: intervention/tables.py:159
msgid "Access not granted" msgid "Access not granted"
msgstr "Nicht freigegeben - Datensatz nur lesbar" msgstr "Nicht freigegeben - Datensatz nur lesbar"
#: compensation/tables.py:177 #: compensation/tables.py:176
#: compensation/templates/compensation/detail/eco_account/view.html:35 #: compensation/templates/compensation/detail/eco_account/view.html:35
#: konova/templates/konova/widgets/progressbar.html:3 #: konova/templates/konova/widgets/progressbar.html:3
msgid "Available" msgid "Available"
msgstr "Verfügbar" msgstr "Verfügbar"
#: compensation/tables.py:203 #: compensation/tables.py:202
msgid "Eco Accounts" msgid "Eco Accounts"
msgstr "Ökokonten" msgstr "Ökokonten"
#: compensation/tables.py:225 #: compensation/tables.py:224
#: compensation/templates/compensation/detail/eco_account/view.html:19 #: compensation/templates/compensation/detail/eco_account/view.html:19
#: intervention/forms/modalForms.py:258 intervention/forms/modalForms.py:265 #: intervention/forms/modalForms.py:258 intervention/forms/modalForms.py:265
#: konova/templates/konova/home.html:88 templates/navbars/navbar.html:34 #: konova/templates/konova/home.html:88 templates/navbars/navbar.html:34
msgid "Eco-account" msgid "Eco-account"
msgstr "Ökokonto" msgstr "Ökokonto"
#: compensation/tables.py:258 #: compensation/tables.py:257
msgid "Not recorded yet. Can not be used for deductions, yet." msgid "Not recorded yet. Can not be used for deductions, yet."
msgstr "" msgstr ""
"Noch nicht verzeichnet. Kann noch nicht für Abbuchungen genutzt werden." "Noch nicht verzeichnet. Kann noch nicht für Abbuchungen genutzt werden."
@ -522,7 +599,7 @@ msgid "Amount"
msgstr "Menge" msgstr "Menge"
#: compensation/templates/compensation/detail/compensation/includes/actions.html:53 #: compensation/templates/compensation/detail/compensation/includes/actions.html:53
#: compensation/templates/compensation/detail/eco_account/includes/actions.html:51 #: compensation/templates/compensation/detail/eco_account/includes/actions.html:53
#: ema/templates/ema/detail/includes/actions.html:51 #: ema/templates/ema/detail/includes/actions.html:51
msgid "Remove action" msgid "Remove action"
msgstr "Maßnahme entfernen" msgstr "Maßnahme entfernen"
@ -638,8 +715,8 @@ msgstr "Biotoptyp"
#: compensation/templates/compensation/detail/compensation/includes/states-after.html:54 #: compensation/templates/compensation/detail/compensation/includes/states-after.html:54
#: compensation/templates/compensation/detail/compensation/includes/states-before.html:54 #: compensation/templates/compensation/detail/compensation/includes/states-before.html:54
#: compensation/templates/compensation/detail/eco_account/includes/states-after.html:52 #: compensation/templates/compensation/detail/eco_account/includes/states-after.html:54
#: compensation/templates/compensation/detail/eco_account/includes/states-before.html:52 #: compensation/templates/compensation/detail/eco_account/includes/states-before.html:54
#: ema/templates/ema/detail/includes/states-after.html:52 #: ema/templates/ema/detail/includes/states-after.html:52
#: ema/templates/ema/detail/includes/states-before.html:52 #: ema/templates/ema/detail/includes/states-before.html:52
msgid "Remove state" msgid "Remove state"
@ -670,6 +747,7 @@ msgstr "Geprüft am "
#: compensation/templates/compensation/detail/compensation/view.html:50 #: compensation/templates/compensation/detail/compensation/view.html:50
#: compensation/templates/compensation/detail/compensation/view.html:64 #: compensation/templates/compensation/detail/compensation/view.html:64
#: compensation/templates/compensation/detail/eco_account/includes/deductions.html:54
#: compensation/templates/compensation/detail/eco_account/view.html:51 #: compensation/templates/compensation/detail/eco_account/view.html:51
#: ema/templates/ema/detail/view.html:35 #: ema/templates/ema/detail/view.html:35
#: intervention/templates/intervention/detail/view.html:75 #: intervention/templates/intervention/detail/view.html:75
@ -755,6 +833,12 @@ msgstr "Eingriffskennung"
msgid "Created" msgid "Created"
msgstr "Erstellt" msgstr "Erstellt"
#: compensation/templates/compensation/detail/eco_account/includes/deductions.html:54
#, fuzzy
#| msgid "Recorded on "
msgid "Recorded on"
msgstr "Verzeichnet am"
#: compensation/templates/compensation/detail/eco_account/includes/deductions.html:63 #: compensation/templates/compensation/detail/eco_account/includes/deductions.html:63
#: intervention/templates/intervention/detail/includes/deductions.html:58 #: intervention/templates/intervention/detail/includes/deductions.html:58
msgid "Remove Deduction" msgid "Remove Deduction"
@ -789,24 +873,17 @@ msgstr "Fehlt"
msgid "Action handler" msgid "Action handler"
msgstr "Maßnahmenträger" msgstr "Maßnahmenträger"
#: compensation/templates/compensation/report/compensation/report.html:7 #: compensation/templates/compensation/report/compensation/report.html:55
#: compensation/templates/compensation/report/eco_account/report.html:7 #: compensation/templates/compensation/report/eco_account/report.html:72
#: ema/templates/ema/report/report.html:7 #: ema/templates/ema/report/report.html:59
#: intervention/templates/intervention/report/report.html:7 #: intervention/templates/intervention/report/report.html:105
msgid "Report"
msgstr "Bericht"
#: compensation/templates/compensation/report/compensation/report.html:58
#: compensation/templates/compensation/report/eco_account/report.html:75
#: ema/templates/ema/report/report.html:62
#: intervention/templates/intervention/report/report.html:108
msgid "Open in browser" msgid "Open in browser"
msgstr "Im Browser öffnen" msgstr "Im Browser öffnen"
#: compensation/templates/compensation/report/compensation/report.html:62 #: compensation/templates/compensation/report/compensation/report.html:59
#: compensation/templates/compensation/report/eco_account/report.html:79 #: compensation/templates/compensation/report/eco_account/report.html:76
#: ema/templates/ema/report/report.html:66 #: ema/templates/ema/report/report.html:63
#: intervention/templates/intervention/report/report.html:112 #: intervention/templates/intervention/report/report.html:109
msgid "View in LANIS" msgid "View in LANIS"
msgstr "In LANIS öffnen" msgstr "In LANIS öffnen"
@ -823,8 +900,8 @@ msgid "Compensation {} edited"
msgstr "Kompensation {} bearbeitet" msgstr "Kompensation {} bearbeitet"
#: compensation/views/compensation_views.py:213 #: compensation/views/compensation_views.py:213
#: compensation/views/eco_account_views.py:278 ema/views.py:175 #: compensation/views/eco_account_views.py:287 ema/views.py:175
#: intervention/views.py:428 #: intervention/views.py:437
msgid "Log" msgid "Log"
msgstr "Log" msgstr "Log"
@ -833,23 +910,23 @@ msgid "Compensation removed"
msgstr "Kompensation entfernt" msgstr "Kompensation entfernt"
#: compensation/views/compensation_views.py:253 #: compensation/views/compensation_views.py:253
#: compensation/views/eco_account_views.py:377 ema/views.py:328 #: compensation/views/eco_account_views.py:386 ema/views.py:328
#: intervention/views.py:124 #: intervention/views.py:126
msgid "Document added" msgid "Document added"
msgstr "Dokument hinzugefügt" msgstr "Dokument hinzugefügt"
#: compensation/views/compensation_views.py:309 #: compensation/views/compensation_views.py:309
#: compensation/views/eco_account_views.py:321 ema/views.py:272 #: compensation/views/eco_account_views.py:330 ema/views.py:272
msgid "State added" msgid "State added"
msgstr "Zustand hinzugefügt" msgstr "Zustand hinzugefügt"
#: compensation/views/compensation_views.py:328 #: compensation/views/compensation_views.py:328
#: compensation/views/eco_account_views.py:340 ema/views.py:291 #: compensation/views/eco_account_views.py:349 ema/views.py:291
msgid "Action added" msgid "Action added"
msgstr "Maßnahme hinzugefügt" msgstr "Maßnahme hinzugefügt"
#: compensation/views/compensation_views.py:347 #: compensation/views/compensation_views.py:347
#: compensation/views/eco_account_views.py:359 ema/views.py:310 #: compensation/views/eco_account_views.py:368 ema/views.py:310
msgid "Deadline added" msgid "Deadline added"
msgstr "Frist/Termin hinzugefügt" msgstr "Frist/Termin hinzugefügt"
@ -861,33 +938,33 @@ msgstr "Zustand gelöscht"
msgid "Action removed" msgid "Action removed"
msgstr "Maßnahme entfernt" msgstr "Maßnahme entfernt"
#: compensation/views/eco_account_views.py:87 #: compensation/views/eco_account_views.py:86
msgid "Eco-Account {} added" msgid "Eco-Account {} added"
msgstr "Ökokonto {} hinzugefügt" msgstr "Ökokonto {} hinzugefügt"
#: compensation/views/eco_account_views.py:142 #: compensation/views/eco_account_views.py:141
msgid "Eco-Account {} edited" msgid "Eco-Account {} edited"
msgstr "Ökokonto {} bearbeitet" msgstr "Ökokonto {} bearbeitet"
#: compensation/views/eco_account_views.py:228 #: compensation/views/eco_account_views.py:237
msgid "Eco-account removed" msgid "Eco-account removed"
msgstr "Ökokonto entfernt" msgstr "Ökokonto entfernt"
#: compensation/views/eco_account_views.py:255 #: compensation/views/eco_account_views.py:264
msgid "Deduction removed" msgid "Deduction removed"
msgstr "Abbuchung entfernt" msgstr "Abbuchung entfernt"
#: compensation/views/eco_account_views.py:298 ema/views.py:249 #: compensation/views/eco_account_views.py:307 ema/views.py:249
#: intervention/views.py:468 #: intervention/views.py:477
msgid "{} unrecorded" msgid "{} unrecorded"
msgstr "{} entzeichnet" msgstr "{} entzeichnet"
#: compensation/views/eco_account_views.py:298 ema/views.py:249 #: compensation/views/eco_account_views.py:307 ema/views.py:249
#: intervention/views.py:468 #: intervention/views.py:477
msgid "{} recorded" msgid "{} recorded"
msgstr "{} verzeichnet" msgstr "{} verzeichnet"
#: compensation/views/eco_account_views.py:434 intervention/views.py:450 #: compensation/views/eco_account_views.py:443 intervention/views.py:459
msgid "Deduction added" msgid "Deduction added"
msgstr "Abbuchung hinzugefügt" msgstr "Abbuchung hinzugefügt"
@ -965,12 +1042,6 @@ msgstr "Bauvorhaben XY; Flur ABC"
msgid "Process type" msgid "Process type"
msgstr "Verfahrenstyp" msgstr "Verfahrenstyp"
#: intervention/forms/forms.py:68
#: intervention/templates/intervention/detail/view.html:39
#: intervention/templates/intervention/report/report.html:20
msgid "Law"
msgstr "Gesetz"
#: intervention/forms/forms.py:70 #: intervention/forms/forms.py:70
msgid "Multiple selection possible" msgid "Multiple selection possible"
msgstr "Mehrfachauswahl möglich" msgstr "Mehrfachauswahl möglich"
@ -1120,31 +1191,31 @@ msgstr ""
"Das Ökokonto {} hat für eine Abbuchung von {} m² nicht ausreichend " "Das Ökokonto {} hat für eine Abbuchung von {} m² nicht ausreichend "
"Restfläche. Es stehen noch {} m² zur Verfügung." "Restfläche. Es stehen noch {} m² zur Verfügung."
#: intervention/models.py:324 #: intervention/models.py:329
msgid "Registration office file number missing" msgid "Registration office file number missing"
msgstr "Aktenzeichen Zulassungsbehörde fehlt" msgstr "Aktenzeichen Zulassungsbehörde fehlt"
#: intervention/models.py:327 #: intervention/models.py:332
msgid "Conservation office file number missing" msgid "Conservation office file number missing"
msgstr "Aktenzeichen Naturschutzbehörde fehlt" msgstr "Aktenzeichen Naturschutzbehörde fehlt"
#: intervention/models.py:330 #: intervention/models.py:335
msgid "Responsible data missing" msgid "Responsible data missing"
msgstr "Daten zu Verantwortlichen fehlen" msgstr "Daten zu Verantwortlichen fehlen"
#: intervention/models.py:344 #: intervention/models.py:349
msgid "Revocation exists" msgid "Revocation exists"
msgstr "Widerspruch liegt vor" msgstr "Widerspruch liegt vor"
#: intervention/models.py:347 #: intervention/models.py:352
msgid "Registration date missing" msgid "Registration date missing"
msgstr "Datum Zulassung bzw. Satzungsbeschluss fehlt" msgstr "Datum Zulassung bzw. Satzungsbeschluss fehlt"
#: intervention/models.py:350 #: intervention/models.py:355
msgid "Binding on missing" msgid "Binding on missing"
msgstr "Datum Bestandskraft fehlt" msgstr "Datum Bestandskraft fehlt"
#: intervention/models.py:352 #: intervention/models.py:357
msgid "Legal data missing" msgid "Legal data missing"
msgstr "Rechtliche Daten fehlen" msgstr "Rechtliche Daten fehlen"
@ -1155,10 +1226,6 @@ msgstr "Rechtliche Daten fehlen"
msgid "Revocation" msgid "Revocation"
msgstr "Widerspruch" msgstr "Widerspruch"
#: intervention/tables.py:66
msgid "Interventions"
msgstr "Eingriffe"
#: intervention/tables.py:176 #: intervention/tables.py:176
msgid "No revocation" msgid "No revocation"
msgstr "Kein Widerspruch" msgstr "Kein Widerspruch"
@ -1226,15 +1293,15 @@ msgstr "Abbuchungen von Ökokonten"
msgid "Exist" msgid "Exist"
msgstr "Vorhanden" msgstr "Vorhanden"
#: intervention/views.py:77 #: intervention/views.py:79
msgid "Intervention {} added" msgid "Intervention {} added"
msgstr "Eingriff {} hinzugefügt" msgstr "Eingriff {} hinzugefügt"
#: intervention/views.py:212 #: intervention/views.py:221
msgid "This intervention has a revocation from {}" msgid "This intervention has a revocation from {}"
msgstr "Es existiert ein Widerspruch vom {}" msgstr "Es existiert ein Widerspruch vom {}"
#: intervention/views.py:228 #: intervention/views.py:237
msgid "" msgid ""
"Remember: This data has not been shared with you, yet. This means you can " "Remember: This data has not been shared with you, yet. This means you can "
"only read but can not edit or perform any actions like running a check or " "only read but can not edit or perform any actions like running a check or "
@ -1244,43 +1311,43 @@ msgstr ""
"bedeutet, dass Sie nur lesenden Zugriff hierauf haben und weder bearbeiten, " "bedeutet, dass Sie nur lesenden Zugriff hierauf haben und weder bearbeiten, "
"noch Prüfungen durchführen oder verzeichnen können." "noch Prüfungen durchführen oder verzeichnen können."
#: intervention/views.py:255 #: intervention/views.py:264
msgid "Intervention {} edited" msgid "Intervention {} edited"
msgstr "Eingriff {} bearbeitet" msgstr "Eingriff {} bearbeitet"
#: intervention/views.py:287 #: intervention/views.py:296
msgid "{} removed" msgid "{} removed"
msgstr "{} entfernt" msgstr "{} entfernt"
#: intervention/views.py:308 #: intervention/views.py:317
msgid "Revocation removed" msgid "Revocation removed"
msgstr "Widerspruch entfernt" msgstr "Widerspruch entfernt"
#: intervention/views.py:334 #: intervention/views.py:343
msgid "{} has already been shared with you" msgid "{} has already been shared with you"
msgstr "{} wurde bereits für Sie freigegeben" msgstr "{} wurde bereits für Sie freigegeben"
#: intervention/views.py:339 #: intervention/views.py:348
msgid "{} has been shared with you" msgid "{} has been shared with you"
msgstr "{} ist nun für Sie freigegeben" msgstr "{} ist nun für Sie freigegeben"
#: intervention/views.py:346 #: intervention/views.py:355
msgid "Share link invalid" msgid "Share link invalid"
msgstr "Freigabelink ungültig" msgstr "Freigabelink ungültig"
#: intervention/views.py:367 #: intervention/views.py:376
msgid "Share settings updated" msgid "Share settings updated"
msgstr "Freigabe Einstellungen aktualisiert" msgstr "Freigabe Einstellungen aktualisiert"
#: intervention/views.py:386 #: intervention/views.py:395
msgid "Check performed" msgid "Check performed"
msgstr "Prüfung durchgeführt" msgstr "Prüfung durchgeführt"
#: intervention/views.py:406 #: intervention/views.py:415
msgid "Revocation added" msgid "Revocation added"
msgstr "Widerspruch hinzugefügt" msgstr "Widerspruch hinzugefügt"
#: intervention/views.py:473 #: intervention/views.py:482
msgid "There are errors on this intervention:" msgid "There are errors on this intervention:"
msgstr "Es liegen Fehler in diesem Eingriff vor:" msgstr "Es liegen Fehler in diesem Eingriff vor:"
@ -1403,10 +1470,13 @@ msgstr "Kontrolle am"
msgid "Other" msgid "Other"
msgstr "Sonstige" msgstr "Sonstige"
#: konova/templates/konova/home.html:23 konova/templates/konova/home.html:61 #: konova/sub_settings/django_settings.py:154
#: konova/templates/konova/home.html:100 msgid "German"
msgid "Total" msgstr ""
msgstr "Insgesamt"
#: konova/sub_settings/django_settings.py:155
msgid "English"
msgstr ""
#: konova/templates/konova/home.html:27 konova/templates/konova/home.html:65 #: konova/templates/konova/home.html:27 konova/templates/konova/home.html:65
#: konova/templates/konova/home.html:104 #: konova/templates/konova/home.html:104
@ -1634,10 +1704,6 @@ msgstr ""
msgid "Export..." msgid "Export..."
msgstr "" msgstr ""
#: templates/navbars/navbar.html:46
msgid "Reports"
msgstr "Berichte"
#: templates/navbars/navbar.html:58 user/templates/user/index.html:31 #: templates/navbars/navbar.html:58 user/templates/user/index.html:31
msgid "Settings" msgid "Settings"
msgstr "Einstellungen" msgstr "Einstellungen"
@ -2980,9 +3046,6 @@ msgstr ""
#~ msgid "Transfer comment" #~ msgid "Transfer comment"
#~ msgstr "Verwendungszweck" #~ msgstr "Verwendungszweck"
#~ msgid "EMA recorded"
#~ msgstr "EMA verzeichnet"
#~ msgid "Edit {}" #~ msgid "Edit {}"
#~ msgstr "Bearbeite {}" #~ msgstr "Bearbeite {}"

View File

@ -43,7 +43,7 @@
<a class="dropdown-item" href="{% url 'ema:index' %}" title="{% trans 'Payment funded compensations' %}">{% fa5_icon 'euro-sign' %} {% trans 'EMA' %}</a> <a class="dropdown-item" href="{% url 'ema:index' %}" title="{% trans 'Payment funded compensations' %}">{% fa5_icon 'euro-sign' %} {% trans 'EMA' %}</a>
<a class="dropdown-item" href="{% url 'home' %}">{% fa5_icon 'file-import' %} {% trans 'Import...' %}</a> <a class="dropdown-item" href="{% url 'home' %}">{% fa5_icon 'file-import' %} {% trans 'Import...' %}</a>
<a class="dropdown-item" href="{% url 'home' %}">{% fa5_icon 'file-export' %} {% trans 'Export...' %}</a> <a class="dropdown-item" href="{% url 'home' %}">{% fa5_icon 'file-export' %} {% trans 'Export...' %}</a>
<a class="dropdown-item" href="{% url 'home' %}">{% fa5_icon 'file-alt' %} {% trans 'Reports' %}</a> <a class="dropdown-item" href="{% url 'analysis:reports' %}">{% fa5_icon 'file-alt' %} {% trans 'Reports' %}</a>
</div> </div>
</li> </li>