* adds Ema model (basically Compensation inherited)
* adds index view for EMAs
* fixes drop-down link bug for menu 'More' in navbar
* refactors some more forms to use process_request()
* adds modified attribute to BaseResource for easy last_modified check
* adds setting of modified attribute in all places where UserAction.EDITED is added to log
* adds EMA_ACCOUNT_IDENTIFIER_LENGTH and EMA_ACCOUNT_IDENTIFIER_TEMPLATE to ema/settings.py
* adds EmaAdmin to ema/admin.py
* fixes wrong title in intervention detail view html for revocations
* adds support for subtitle variable to BaseTable and generic_index.html
* drops next_version attribute from models
* adds/updates translations
* adds default ordering for UserActionLogEntry
   * removes extra ordering in log modal rendering
pull/9/head
mipel 3 years ago
parent 03fe293cd8
commit d1f43f8c64

@ -89,6 +89,8 @@ class NewPaymentForm(BaseModalForm):
intervention=self.intervention,
)
self.intervention.log.add(edited_action)
self.intervention.modified = edited_action
self.intervention.save()
return pay
@ -122,6 +124,8 @@ class NewStateModalForm(BaseModalForm):
comment=_("Added state")
)
self.instance.log.add(user_action)
self.instance.modified = user_action
self.instance.save()
state = CompensationState.objects.create(
biotope_type=self.cleaned_data["biotope_type"],
@ -244,6 +248,8 @@ class NewDeadlineModalForm(BaseModalForm):
action=UserAction.EDITED,
comment=_("Added deadline")
)
self.instance.modified = edited_action
self.instance.save()
self.instance.log.add(edited_action)
self.instance.deadlines.add(deadline)
return deadline
@ -314,6 +320,8 @@ class NewActionModalForm(BaseModalForm):
action=UserAction.EDITED,
comment=_("Added action"),
)
self.instance.modified = edited_action
self.instance.save()
self.instance.log.add(edited_action)
self.instance.actions.add(comp_action)
return comp_action

@ -91,8 +91,8 @@ class CompensationAction(BaseResource):
class AbstractCompensation(BaseObject):
"""
Abstract compensation model which holds basic attributes, shared by subclasses like the regular Compensation
or EcoAccount.
Abstract compensation model which holds basic attributes, shared by subclasses like the regular Compensation,
EMA or EcoAccount.
"""
responsible = models.OneToOneField(
@ -112,9 +112,6 @@ class AbstractCompensation(BaseObject):
geometry = models.ForeignKey(Geometry, null=True, blank=True, on_delete=models.SET_NULL)
documents = models.ManyToManyField("konova.Document", blank=True)
# Holds a successor for this data
next_version = models.ForeignKey("Compensation", null=True, blank=True, on_delete=models.DO_NOTHING)
class Meta:
abstract = True

@ -7,5 +7,6 @@ Created on: 18.12.20
"""
COMPENSATION_IDENTIFIER_LENGTH = 10
COMPENSATION_IDENTIFIER_TEMPLATE = "KOM-{}"
ECO_ACCOUNT_IDENTIFIER_LENGTH = 10
ECO_ACCOUNT_IDENTIFIER_TEMPLATE = "OEK-{}"

@ -5,7 +5,6 @@ Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 01.12.20
"""
from django.db.models import Sum
from django.http import HttpRequest
from django.template.loader import render_to_string
from django.urls import reverse
@ -15,7 +14,6 @@ from django.utils.translation import gettext_lazy as _
from compensation.filters import CompensationTableFilter, EcoAccountTableFilter
from compensation.models import Compensation, EcoAccount
from intervention.filters import InterventionTableFilter
from konova.sub_settings.django_settings import DEFAULT_DATE_TIME_FORMAT
from konova.utils.tables import BaseTable
import django_tables2 as tables
@ -53,7 +51,7 @@ class CompensationTable(BaseTable):
lm = tables.Column(
verbose_name=_("Last edit"),
orderable=True,
accessor="created__timestamp",
accessor="modified__timestamp",
)
class Meta(BaseTable.Meta):
@ -126,21 +124,21 @@ class CompensationTable(BaseTable):
"""
html = ""
checked = value is not None
recorded = value is not None
tooltip = _("Not recorded yet")
if checked:
if recorded:
value = value.timestamp
value = localtime(value)
on = value.strftime(DEFAULT_DATE_TIME_FORMAT)
tooltip = _("Recorded on {} by {}").format(on, record.intervention.recorded.user)
html += self.render_bookmark(
tooltip=tooltip,
icn_filled=checked,
icn_filled=recorded,
)
return format_html(html)
def render_e(self, value, record: Compensation):
""" Renders the registered column for a compensation
""" Renders the editable column for a compensation
Args:
value (str): The identifier value
@ -192,7 +190,7 @@ class EcoAccountTable(BaseTable):
lm = tables.Column(
verbose_name=_("Last edit"),
orderable=True,
accessor="created__timestamp",
accessor="modified__timestamp",
)
class Meta(BaseTable.Meta):

@ -118,7 +118,7 @@ def log_view(request: HttpRequest, id: str):
context = {
"modal_body_template": body_template,
"log": comp.log.all().order_by("-timestamp"),
"log": comp.log.all(),
"modal_title": _("Log"),
}
context = BaseContext(request, context).context

@ -180,7 +180,7 @@ def log_view(request: HttpRequest, id: str):
context = {
"modal_body_template": body_template,
"log": comp.log.all().order_by("-timestamp"),
"log": comp.log.all(),
"modal_title": _("Log"),
}
context = BaseContext(request, context).context

@ -6,18 +6,15 @@ Created on: 09.08.21
"""
from django.utils.translation import gettext_lazy as _
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import HttpRequest
from django.shortcuts import get_object_or_404, render, redirect
from django.shortcuts import get_object_or_404
from compensation.forms import NewPaymentForm
from compensation.models import Payment
from intervention.models import Intervention
from konova.contexts import BaseContext
from konova.decorators import default_group_required
from konova.forms import RemoveModalForm
from konova.utils.message_templates import FORM_INVALID
@login_required
@ -34,29 +31,10 @@ def new_payment_view(request: HttpRequest, intervention_id: str):
"""
intervention = get_object_or_404(Intervention, id=intervention_id)
form = NewPaymentForm(request.POST or None, instance=intervention, user=request.user)
template = form.template
if request.method == "POST":
if form.is_valid():
payment = form.save()
messages.success(
request,
_("Payment added")
)
return redirect(request.META.get("HTTP_REFERER", "home"))
else:
messages.info(
return form.process_request(
request,
FORM_INVALID
msg_success=_("Payment added")
)
return redirect(request.META.get("HTTP_REFERER", "home"))
elif request.method == "GET":
context = {
"form": form,
}
context = BaseContext(request, context).context
return render(request, template, context)
else:
raise NotImplementedError
@login_required

@ -0,0 +1,10 @@
from django.contrib import admin
from compensation.admin import CompensationAdmin
from ema.models import Ema
class EmaAdmin(CompensationAdmin):
pass
admin.site.register(Ema, EmaAdmin)

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

@ -0,0 +1,53 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 19.08.21
"""
from django.db.models import QuerySet
from compensation.filters import CompensationTableFilter
class EmaTableFilter(CompensationTableFilter):
"""
Since EMA and compensation are basically the same, we can reuse CompensationTableFilter and extend the MAE filter
in the future by inheriting.
"""
def _filter_show_all(self, queryset, name, value) -> QuerySet:
""" Filters queryset depending on value of 'show_all' setting
Args:
queryset ():
name ():
value ():
Returns:
"""
if not value:
return queryset.filter(
users__in=[self.user], # requesting user has access
)
else:
return queryset
def _filter_show_recorded(self, queryset, name, value) -> QuerySet:
""" Filters queryset depending on value of 'show_recorded' setting
Args:
queryset ():
name ():
value ():
Returns:
"""
if not value:
return queryset.filter(
recorded=None,
)
else:
return queryset

@ -0,0 +1,74 @@
from django.contrib.auth.models import User
from django.db import models
from compensation.models import AbstractCompensation
from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE
from user.models import UserActionLogEntry
class Ema(AbstractCompensation):
"""
EMA = Ersatzzahlungsmaßnahme
(compensation actions from payments)
Until 2015 the EMA was the data object to keep track of any compensation, which has been funded by payments
previously paid. In 2015 another organization got in charge of this, which led to the creation of the data object
MAE (which is basically the same, just renamed in their system) to differ between the 'old' payment funded ones and
the new. For historical reasons, we need to keep EMAs in our system, since there are still entries done to this day,
which have been performed somewhere before 2015 and therefore needs to be entered.
Further information:
https://snu.rlp.de/de/foerderungen/massnahmen-aus-ersatzzahlungen/uebersicht-mae/
EMA therefore holds data like a compensation: actions, before-/after-states, deadlines, ...
"""
# Users having access on this object
# Not needed in regular Compensation since their access is defined by the linked intervention's access
users = models.ManyToManyField(
User,
help_text="Users having access (shared with)"
)
# Refers to "verzeichnen"
recorded = models.OneToOneField(
UserActionLogEntry,
on_delete=models.SET_NULL,
null=True,
blank=True,
help_text="Holds data on user and timestamp of this action",
related_name="+"
)
def __str__(self):
return "{}".format(self.identifier)
def save(self, *args, **kwargs):
if self.identifier is None or len(self.identifier) == 0:
# Create new identifier
new_id = self._generate_new_identifier()
while Ema.objects.filter(identifier=new_id).exists():
new_id = self._generate_new_identifier()
self.identifier = new_id
super().save(*args, **kwargs)
def get_LANIS_link(self) -> str:
""" Generates a link for LANIS depending on the geometry
Returns:
"""
try:
geom = self.geometry.geom.transform(DEFAULT_SRID_RLP, clone=True)
x = geom.centroid.x
y = geom.centroid.y
zoom_lvl = 16
except AttributeError:
# If no geometry has been added, yet.
x = 1
y = 1
zoom_lvl = 6
return LANIS_LINK_TEMPLATE.format(
zoom_lvl,
x,
y,
)

@ -0,0 +1,10 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 19.08.21
"""
EMA_ACCOUNT_IDENTIFIER_LENGTH = 10
EMA_ACCOUNT_IDENTIFIER_TEMPLATE = "EMA-{}"

@ -0,0 +1,132 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 19.08.21
"""
from django.http import HttpRequest
from django.utils.html import format_html
from django.utils.timezone import localtime
from django.utils.translation import gettext_lazy as _
from django.urls import reverse
import django_tables2 as tables
from konova.sub_settings.django_settings import DEFAULT_DATE_TIME_FORMAT
from konova.utils.tables import BaseTable
from ema.filters import EmaTableFilter
from ema.models import Ema
class EmaTable(BaseTable):
"""
Since EMA and compensation are basically the same, we can reuse CompensationTableFilter and extend the EMA filter
in the future by inheriting.
"""
id = tables.Column(
verbose_name=_("Identifier"),
orderable=True,
accessor="identifier",
)
t = tables.Column(
verbose_name=_("Title"),
orderable=True,
accessor="title",
)
r = tables.Column(
verbose_name=_("Recorded"),
orderable=True,
empty_values=[],
accessor="recorded",
)
e = tables.Column(
verbose_name=_("Editable"),
orderable=True,
empty_values=[],
accessor="users",
)
lm = tables.Column(
verbose_name=_("Last edit"),
orderable=True,
accessor="created__timestamp",
)
class Meta(BaseTable.Meta):
template_name = "django_tables2/bootstrap4.html"
def __init__(self, request: HttpRequest, *args, **kwargs):
self.title = _("Payment funded compensations")
self.subtitle = _("EMA explanation")
self.add_new_url = reverse("ema:new")
qs = kwargs.get("queryset", None)
self.filter = EmaTableFilter(
user=request.user,
data=request.GET,
queryset=qs,
)
super().__init__(request, self.filter, *args, **kwargs)
def render_id(self, value, record: Ema):
""" Renders the id column for a EMA
Args:
value (str): The identifier value
record (EMA): The EMA record
Returns:
"""
html = ""
html += self.render_link(
tooltip=_("Open {}").format(_("EMA")),
href=reverse("ema:open", args=(record.id,)),
txt=value,
new_tab=False,
)
return format_html(html)
def render_r(self, value, record: Ema):
""" Renders the registered column for a EMA
Args:
value (str): The identifier value
record (Ema): The EMA record
Returns:
"""
html = ""
recorded = value is not None
tooltip = _("Not recorded yet")
if recorded:
value = value.timestamp
value = localtime(value)
on = value.strftime(DEFAULT_DATE_TIME_FORMAT)
tooltip = _("Recorded on {} by {}").format(on, record.recorded.user)
html += self.render_bookmark(
tooltip=tooltip,
icn_filled=recorded,
)
return format_html(html)
def render_e(self, value, record: Ema):
""" Renders the editable column for a EMA
Args:
value (str): The identifier value
record (Ema): The EMA record
Returns:
"""
html = ""
has_access = value.filter(
username=self.user.username
).exists()
html += self.render_icn(
tooltip=_("Full access granted") if has_access else _("Access not granted"),
icn_class="fas fa-edit rlp-r-inv" if has_access else "far fa-edit",
)
return format_html(html)

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

@ -0,0 +1,16 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 19.08.21
"""
from django.urls import path
from ema.views import index_view, new_view, open_view
app_name = "ema"
urlpatterns = [
path("", index_view, name="index"),
path("new/", new_view, name="new"),
path("<id>", open_view, name="open"),
]

@ -0,0 +1,70 @@
from django.contrib.auth.decorators import login_required
from django.http import HttpRequest
from django.shortcuts import render, get_object_or_404
from ema.tables import EmaTable
from konova.contexts import BaseContext
from konova.decorators import conservation_office_group_required
from ema.models import Ema
@login_required
def index_view(request: HttpRequest):
""" Renders the index view for MAEs
Args:
request (HttpRequest): The incoming request
Returns:
"""
template = "generic_index.html"
emas = Ema.objects.filter(
deleted=None,
).order_by(
"-modified"
)
table = EmaTable(
request,
queryset=emas
)
context = {
"table": table,
}
context = BaseContext(request, context).context
return render(request, template, context)
@login_required
@conservation_office_group_required
def new_view(request: HttpRequest):
""" Renders the form for a new MAE
Args:
request (HttpRequest): The incoming request
Returns:
"""
template = "generic_index.html"
context = {}
context = BaseContext(request, context).context
return render(request, template, context)
@login_required
def open_view(request: HttpRequest, id: str):
""" Renders the form for a new MAE
Args:
request (HttpRequest): The incoming request
id (str): The MAE id
Returns:
"""
ema = get_object_or_404(Ema, id=id)
template = "generic_index.html"
context = {}
context = BaseContext(request, context).context
return render(request, template, context)

@ -203,6 +203,8 @@ class EditInterventionForm(NewInterventionForm):
action=UserAction.EDITED
)
self.instance.log.add(user_action)
self.instance.modified = user_action
self.instance.save()
return self.instance
@ -381,6 +383,8 @@ class NewRevocationForm(BaseModalForm):
document=document,
created=created_action,
)
self.instance.modified = edited_action
self.instance.save()
self.instance.log.add(edited_action)
self.instance.legal.revocation = revocation
self.instance.legal.save()
@ -553,6 +557,8 @@ class NewWithdrawForm(BaseModalForm):
action=UserAction.CREATED
)
self.instance.log.add(user_action_edit)
self.instance.modified = user_action_edit
self.instance.save()
# Create withdraw depending on Intervention or EcoAccount as the initial instance
if self.is_intervention_initially:

@ -21,9 +21,9 @@ class ResponsibilityData(UuidModel):
Holds intervention data about responsible organizations and their file numbers for this case
"""
registration_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True, related_name="+")
registration_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True, related_name="+", blank=True)
registration_file_number = models.CharField(max_length=1000, blank=True, null=True)
conservation_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True, related_name="+")
conservation_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True, related_name="+", blank=True)
conservation_file_number = models.CharField(max_length=1000, blank=True, null=True)
handler = models.CharField(max_length=500, null=True, blank=True, help_text="Refers to 'Eingriffsverursacher'")
@ -115,9 +115,6 @@ class Intervention(BaseObject):
related_name="+"
)
# Holds which intervention is simply a newer version of this dataset
next_version = models.ForeignKey("Intervention", null=True, blank=True, on_delete=models.DO_NOTHING)
# Users having access on this object
users = models.ManyToManyField(User, help_text="Users having access (data shared with)")
access_token = models.CharField(

@ -50,7 +50,7 @@ class InterventionTable(BaseTable):
lm = tables.Column(
verbose_name=_("Last edit"),
orderable=True,
accessor="created__timestamp",
accessor="modified__timestamp",
)
"""
# ToDo: Decide to keep actions column or to dismiss them
@ -164,23 +164,3 @@ class InterventionTable(BaseTable):
icn_class="fas fa-edit rlp-r-inv" if has_access else "far fa-edit",
)
return format_html(html)
def render_ac(self, value, record):
"""
Renders possible actions for this record, such as delete.
"""
intervention = _("Intervention")
html = ""
html += self.render_open_btn(
_("Open {}").format(intervention),
reverse("intervention:open", args=(record.id,))
)
html += self.render_edit_btn(
_("Edit {}").format(intervention),
reverse("intervention:edit", args=(record.id,)),
)
html += self.render_delete_btn(
_("Delete {}").format(intervention),
reverse("intervention:remove", args=(record.id,)),
)
return format_html(html)

@ -94,7 +94,7 @@
<th scope="row">{% trans 'Binding on' %}</th>
<td class="align-middle">{{intervention.legal.binding_date|default_if_none:""}}</td>
</tr>
<tr {% if intervention.legal.revocation %}class="alert alert-danger" title="{% trans 'Missing' %}" {% endif %}>
<tr {% if intervention.legal.revocation %}class="alert alert-danger" title="{% trans 'Exists' %}" {% endif %}>
<th scope="row">{% trans 'Revocation' %}</th>
<td class="align-middle">{{intervention.legal.revocation.date|naturalday|default_if_none:""}}</td>
</tr>

@ -33,9 +33,6 @@ def index_view(request: HttpRequest):
# Filtering by user access is performed in table filter inside of InterventionTableFilter class
interventions = Intervention.objects.filter(
deleted=None, # not deleted
next_version=None, # only newest versions
).order_by(
"-created__timestamp"
)
table = InterventionTable(
request=request,
@ -273,22 +270,10 @@ def create_share_view(request: HttpRequest, id: str):
"""
intervention = get_object_or_404(Intervention, id=id)
form = ShareInterventionForm(request.POST or None, instance=intervention, request=request)
if request.method == "POST":
if form.is_valid():
form.save()
messages.info(
return form.process_request(
request,
_("Share settings updated")
msg_success=_("Share settings updated")
)
return redirect(request.META.get("HTTP_REFERER", "home"))
elif request.method == "GET":
context = {
"form": form,
}
context = BaseContext(request, context).context
return render(request, form.template, context)
else:
raise NotImplementedError
@login_required
@ -324,28 +309,10 @@ def new_revocation_view(request: HttpRequest, id: str):
"""
intervention = get_object_or_404(Intervention, id=id)
form = NewRevocationForm(request.POST or None, request.FILES or None, instance=intervention, user=request.user)
if request.method == "POST":
if form.is_valid():
form.save()
messages.info(
request,
_("Revocation added")
)
else:
messages.error(
return form.process_request(
request,
FORM_INVALID,
extra_tags="danger",
msg_success=_("Revocation added")
)
return redirect(request.META.get("HTTP_REFERER", "home"))
elif request.method == "GET":
context = {
"form": form,
}
context = BaseContext(request, context).context
return render(request, form.template, context)
else:
raise NotImplementedError
@login_required
@ -365,7 +332,7 @@ def log_view(request: HttpRequest, id: str):
context = {
"modal_body_template": body_template,
"log": intervention.log.all().order_by("-timestamp"),
"log": intervention.log.all(),
"modal_title": _("Log"),
}
context = BaseContext(request, context).context

@ -45,7 +45,6 @@ class BaseForm(forms.Form):
def __init__(self, *args, **kwargs):
self.instance = kwargs.pop("instance", None)
self.user = kwargs.pop("user", None)
self.request = kwargs.pop("request", None)
super().__init__(*args, **kwargs)
# Check for required fields
@ -341,6 +340,8 @@ class NewDocumentForm(BaseModalForm):
comment=_("Added document"),
)
self.instance.log.add(edited_action)
self.instance.modified = edited_action
self.instance.save()
return doc

@ -16,6 +16,7 @@ from django.db import models, transaction
from compensation.settings import COMPENSATION_IDENTIFIER_TEMPLATE, COMPENSATION_IDENTIFIER_LENGTH, \
ECO_ACCOUNT_IDENTIFIER_TEMPLATE, ECO_ACCOUNT_IDENTIFIER_LENGTH
from ema.settings import EMA_ACCOUNT_IDENTIFIER_LENGTH, EMA_ACCOUNT_IDENTIFIER_TEMPLATE
from intervention.settings import INTERVENTION_IDENTIFIER_LENGTH, INTERVENTION_IDENTIFIER_TEMPLATE
from konova.utils.generators import generate_random_string
from user.models import UserActionLogEntry, UserAction
@ -39,7 +40,21 @@ class BaseResource(UuidModel):
"""
A basic resource model, which defines attributes for every derived model
"""
created = models.ForeignKey(UserActionLogEntry, on_delete=models.SET_NULL, null=True, blank=True, related_name='+')
created = models.ForeignKey(
UserActionLogEntry,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='+'
)
modified = models.ForeignKey(
UserActionLogEntry,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='+',
help_text="Last modified"
)
class Meta:
abstract = True
@ -131,6 +146,8 @@ class BaseObject(BaseResource):
"""
from compensation.models import Compensation, EcoAccount
from intervention.models import Intervention
from ema.models import Ema
definitions = {
Intervention: {
"length": INTERVENTION_IDENTIFIER_LENGTH,
@ -144,6 +161,10 @@ class BaseObject(BaseResource):
"length": ECO_ACCOUNT_IDENTIFIER_LENGTH,
"template": ECO_ACCOUNT_IDENTIFIER_TEMPLATE,
},
Ema: {
"length": EMA_ACCOUNT_IDENTIFIER_LENGTH,
"template": EMA_ACCOUNT_IDENTIFIER_TEMPLATE,
},
}
if self.__class__ not in definitions:

@ -68,6 +68,7 @@ INSTALLED_APPS = [
'organisation',
'news',
'user',
'ema',
]
if DEBUG:
INSTALLED_APPS += [

@ -31,7 +31,7 @@ urlpatterns = [
path('', home_view, name="home"),
path('intervention/', include("intervention.urls")),
path('compensation/', include("compensation.urls")),
path('ema/', include("intervention.urls")), #ToDo
path('ema/', include("ema.urls")),
path('organisation/', include("organisation.urls")),
path('user/', include("user.urls")),
path('news/', include("news.urls")),

@ -24,6 +24,7 @@ class BaseTable(tables.tables.Table):
add_new_entries = True
add_new_url = None
title = None
subtitle = ""
class Meta:
attrs = {

@ -64,7 +64,6 @@ def home_view(request: HttpRequest):
# First fetch all valid objects (undeleted, only newest versions)
interventions = Intervention.objects.filter(
deleted=None,
next_version=None,
)
# Then fetch only user related ones
user_interventions = interventions.filter(
@ -74,14 +73,12 @@ def home_view(request: HttpRequest):
# Repeat for other objects
comps = Compensation.objects.filter(
deleted=None,
next_version=None,
)
user_comps = comps.filter(
intervention__users__in=[user]
)
eco_accs = EcoAccount.objects.filter(
deleted=None,
next_version=None,
)
user_ecco_accs = eco_accs.filter(
users__in=[user]

Binary file not shown.

@ -3,20 +3,20 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#: compensation/filters.py:71 compensation/forms.py:42 compensation/forms.py:47
#: compensation/forms.py:60 compensation/forms.py:209 compensation/forms.py:277
#: compensation/filters.py:71 compensation/forms.py:43 compensation/forms.py:48
#: compensation/forms.py:61 compensation/forms.py:219 compensation/forms.py:289
#: intervention/filters.py:26 intervention/filters.py:40
#: intervention/filters.py:47 intervention/filters.py:48
#: intervention/forms.py:319 intervention/forms.py:331
#: intervention/forms.py:343 konova/forms.py:106 konova/forms.py:242
#: konova/forms.py:275 konova/forms.py:280 konova/forms.py:292
#: konova/forms.py:304 konova/forms.py:317 user/forms.py:38
#: intervention/forms.py:322 intervention/forms.py:334
#: intervention/forms.py:346 konova/forms.py:107 konova/forms.py:241
#: konova/forms.py:274 konova/forms.py:279 konova/forms.py:291
#: konova/forms.py:303 konova/forms.py:316 user/forms.py:38
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-08-11 14:47+0200\n"
"POT-Creation-Date: 2021-08-19 12:40+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -30,161 +30,161 @@ msgstr ""
msgid "Show only unrecorded"
msgstr "Nur unverzeichnete anzeigen"
#: compensation/forms.py:41 compensation/forms.py:266
#: compensation/forms.py:42 compensation/forms.py:278
#: compensation/templates/compensation/detail/eco_account/includes/withdraws.html:31
#: intervention/templates/intervention/detail/includes/withdraws.html:31
msgid "Amount"
msgstr "Menge"
#: compensation/forms.py:43
#: compensation/forms.py:44
msgid "Amount in Euro"
msgstr "Betrag in Euro"
#: compensation/forms.py:46
#: compensation/forms.py:47
#: intervention/templates/intervention/detail/includes/payments.html:31
msgid "Due on"
msgstr "Fällig am"
#: compensation/forms.py:48
#: compensation/forms.py:49
msgid "Due on which date"
msgstr "Zahlung wird an diesem Datum erwartet"
#: compensation/forms.py:61
#: compensation/forms.py:62
msgid "Transfer note"
msgstr "Verwendungszweck"
#: compensation/forms.py:62
#: compensation/forms.py:63
msgid "Note for money transfer"
msgstr "Verwendungszweck für Überweisung"
#: compensation/forms.py:68
#: compensation/forms.py:69
msgid "Payment"
msgstr "Zahlung"
#: compensation/forms.py:69
#: compensation/forms.py:70
msgid "Add a payment for intervention '{}'"
msgstr "Neue Ersatzzahlung zu Eingriff '{}' hinzufügen"
#: compensation/forms.py:81
#: compensation/forms.py:82
msgid "Added payment"
msgstr "Zahlung hinzufügen"
#: compensation/forms.py:96
#: compensation/forms.py:99
msgid "Biotope Type"
msgstr "Biotoptyp"
#: compensation/forms.py:99
#: compensation/forms.py:102
msgid "Select the biotope type"
msgstr "Biotoptyp wählen"
#: compensation/forms.py:104
#: compensation/forms.py:107
#: compensation/templates/compensation/detail/compensation/includes/states-after.html:36
#: compensation/templates/compensation/detail/compensation/includes/states-before.html:36
#: compensation/templates/compensation/detail/eco_account/includes/states-after.html:36
#: compensation/templates/compensation/detail/eco_account/includes/states-before.html:36
#: intervention/forms.py:459
#: intervention/forms.py:474
msgid "Surface"
msgstr "Fläche"
#: compensation/forms.py:107 intervention/forms.py:461
#: compensation/forms.py:110 intervention/forms.py:476
msgid "in m²"
msgstr ""
#: compensation/forms.py:112
#: compensation/forms.py:115
msgid "New state"
msgstr "Neuer Zustand"
#: compensation/forms.py:113
#: compensation/forms.py:116
msgid "Insert data for the new state"
msgstr "Geben Sie die Daten des neuen Zustandes ein"
#: compensation/forms.py:121
#: compensation/forms.py:124
msgid "Added state"
msgstr "Zustand hinzugefügt"
#: compensation/forms.py:135 konova/forms.py:156
#: compensation/forms.py:140 konova/forms.py:157
msgid "Object removed"
msgstr "Objekt entfernt"
#: compensation/forms.py:181
#: compensation/forms.py:191
msgid "Deadline Type"
msgstr "Fristart"
#: compensation/forms.py:184
#: compensation/forms.py:194
msgid "Select the deadline type"
msgstr "Fristart wählen"
#: compensation/forms.py:193
#: compensation/forms.py:203
#: compensation/templates/compensation/detail/compensation/includes/deadlines.html:31
#: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:31
#: intervention/forms.py:318
#: intervention/forms.py:321
msgid "Date"
msgstr "Datum"
#: compensation/forms.py:196
#: compensation/forms.py:206
msgid "Select date"
msgstr "Datum wählen"
#: compensation/forms.py:208 compensation/forms.py:276
#: compensation/forms.py:218 compensation/forms.py:288
#: compensation/templates/compensation/detail/compensation/includes/actions.html:34
#: compensation/templates/compensation/detail/compensation/includes/deadlines.html:34
#: compensation/templates/compensation/detail/compensation/includes/documents.html:31
#: compensation/templates/compensation/detail/eco_account/includes/actions.html:34
#: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:34
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:31
#: intervention/forms.py:342
#: intervention/forms.py:345
#: intervention/templates/intervention/detail/includes/documents.html:31
#: intervention/templates/intervention/detail/includes/revocation.html:35
#: konova/forms.py:303
#: konova/forms.py:302
msgid "Comment"
msgstr "Kommentar"
#: compensation/forms.py:210 compensation/forms.py:278
#: intervention/forms.py:344 konova/forms.py:305
#: compensation/forms.py:220 compensation/forms.py:290
#: intervention/forms.py:347 konova/forms.py:304
msgid "Additional comment, maximum {} letters"
msgstr "Zusätzlicher Kommentar, maximal {} Zeichen"
#: compensation/forms.py:221
#: compensation/forms.py:231
msgid "New deadline"
msgstr "Neue Frist"
#: compensation/forms.py:222
#: compensation/forms.py:232
msgid "Insert data for the new deadline"
msgstr "Geben Sie die Daten der neuen Frist ein"
#: compensation/forms.py:239
#: compensation/forms.py:249
msgid "Added deadline"
msgstr "Frist/Termin hinzugefügt"
#: compensation/forms.py:248
#: compensation/forms.py:260
msgid "Action Type"
msgstr "Maßnahmentyp"
#: compensation/forms.py:251
#: compensation/forms.py:263
msgid "Select the action type"
msgstr "Maßnahmentyp wählen"
#: compensation/forms.py:254
#: compensation/forms.py:266
msgid "Unit"
msgstr "Einheit"
#: compensation/forms.py:257
#: compensation/forms.py:269
msgid "Select the unit"
msgstr "Einheit wählen"
#: compensation/forms.py:269
#: compensation/forms.py:281
msgid "Insert the amount"
msgstr "Menge eingeben"
#: compensation/forms.py:289
#: compensation/forms.py:301
msgid "New action"
msgstr "Neue Maßnahme"
#: compensation/forms.py:290
#: compensation/forms.py:302
msgid "Insert data for the new action"
msgstr "Geben Sie die Daten der neuen Maßnahme ein"
#: compensation/forms.py:309
#: compensation/forms.py:321
msgid "Added action"
msgstr "Maßnahme hinzugefügt"
@ -212,114 +212,114 @@ msgstr ""
msgid "Pieces"
msgstr "Stück"
#: compensation/tables.py:26 compensation/tables.py:166
#: intervention/forms.py:29 intervention/tables.py:23
#: compensation/tables.py:24 compensation/tables.py:164 ema/tables.py:28
#: intervention/forms.py:30 intervention/tables.py:23
#: intervention/templates/intervention/detail/includes/compensations.html:30
msgid "Identifier"
msgstr "Kennung"
#: compensation/tables.py:31 compensation/tables.py:171
#: compensation/tables.py:29 compensation/tables.py:169
#: compensation/templates/compensation/detail/compensation/includes/documents.html:28
#: compensation/templates/compensation/detail/compensation/view.html:24
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:28
#: compensation/templates/compensation/detail/eco_account/view.html:31
#: intervention/forms.py:36 intervention/tables.py:28
#: ema/tables.py:33 intervention/forms.py:37 intervention/tables.py:28
#: intervention/templates/intervention/detail/includes/compensations.html:33
#: intervention/templates/intervention/detail/includes/documents.html:28
#: intervention/templates/intervention/detail/view.html:31 konova/forms.py:274
#: intervention/templates/intervention/detail/view.html:31 konova/forms.py:273
msgid "Title"
msgstr "Bezeichnung"
#: compensation/tables.py:36
#: compensation/tables.py:34
#: compensation/templates/compensation/detail/compensation/view.html:36
#: intervention/tables.py:33
#: intervention/templates/intervention/detail/view.html:63 user/models.py:48
msgid "Checked"
msgstr "Geprüft"
#: compensation/tables.py:42 compensation/tables.py:181
#: compensation/tables.py:40 compensation/tables.py:179
#: compensation/templates/compensation/detail/compensation/view.html:50
#: compensation/templates/compensation/detail/eco_account/view.html:43
#: intervention/tables.py:39
#: ema/tables.py:38 intervention/tables.py:39
#: intervention/templates/intervention/detail/view.html:77 user/models.py:49
msgid "Recorded"
msgstr "Verzeichnet"
#: compensation/tables.py:48 compensation/tables.py:187
#: compensation/tables.py:46 compensation/tables.py:185 ema/tables.py:44
#: intervention/tables.py:45
msgid "Editable"
msgstr "Freigegeben"
#: compensation/tables.py:54 compensation/tables.py:193
#: compensation/tables.py:52 compensation/tables.py:191 ema/tables.py:50
#: intervention/tables.py:51
msgid "Last edit"
msgstr "Zuletzt bearbeitet"
#: compensation/tables.py:63
#: compensation/tables.py:61
#: intervention/templates/intervention/detail/includes/compensations.html:8
msgid "Compensations"
msgstr "Kompensationen"
#: compensation/tables.py:85 compensation/tables.py:224
#: intervention/tables.py:92 intervention/tables.py:175
#: compensation/tables.py:83 compensation/tables.py:222 ema/tables.py:82
#: intervention/tables.py:92
msgid "Open {}"
msgstr "Öffne {}"
#: compensation/tables.py:85
#: compensation/tables.py:83
#: compensation/templates/compensation/detail/compensation/view.html:12
#: konova/templates/konova/home.html:49 templates/navbar.html:28
msgid "Compensation"
msgstr "Kompensation"
#: compensation/tables.py:106 intervention/tables.py:111
#: compensation/tables.py:104 intervention/tables.py:111
msgid "Not checked yet"
msgstr "Noch nicht geprüft"
#: compensation/tables.py:111 intervention/tables.py:116
#: compensation/tables.py:109 intervention/tables.py:116
msgid "Checked on {} by {}"
msgstr "Am {} von {} geprüft worden"
#: compensation/tables.py:130
#: compensation/tables.py:128
#: compensation/templates/compensation/detail/compensation/view.html:53
#: compensation/templates/compensation/detail/eco_account/view.html:46
#: intervention/tables.py:135
#: ema/tables.py:101 intervention/tables.py:135
#: intervention/templates/intervention/detail/view.html:80
msgid "Not recorded yet"
msgstr "Noch nicht verzeichnet"
#: compensation/tables.py:135 compensation/tables.py:262
#: compensation/tables.py:133 compensation/tables.py:260 ema/tables.py:106
#: intervention/tables.py:140
msgid "Recorded on {} by {}"
msgstr "Am {} von {} verzeichnet worden"
#: compensation/tables.py:158 compensation/tables.py:285
#: compensation/tables.py:156 compensation/tables.py:283 ema/tables.py:129
#: intervention/tables.py:163
msgid "Full access granted"
msgstr "Für Sie freigegeben - Datensatz kann bearbeitet werden"
#: compensation/tables.py:158 compensation/tables.py:285
#: compensation/tables.py:156 compensation/tables.py:283 ema/tables.py:129
#: intervention/tables.py:163
msgid "Access not granted"
msgstr "Nicht freigegeben - Datensatz nur lesbar"
#: compensation/tables.py:176
#: compensation/tables.py:174
#: compensation/templates/compensation/detail/eco_account/view.html:35
#: konova/templates/konova/custom_widgets/progressbar.html:3
msgid "Available"
msgstr "Verfügbar"
#: compensation/tables.py:202
#: compensation/tables.py:200
msgid "Eco Accounts"
msgstr "Ökokonten"
#: compensation/tables.py:224
#: compensation/tables.py:222
#: compensation/templates/compensation/detail/eco_account/view.html:19
#: intervention/forms.py:443 intervention/forms.py:450
#: intervention/forms.py:458 intervention/forms.py:465
#: konova/templates/konova/home.html:88 templates/navbar.html:34
msgid "Eco-account"
msgstr "Ökokonto"
#: compensation/tables.py:257
#: compensation/tables.py:255
msgid "Not recorded yet. Can not be used for withdraws, yet."
msgstr ""
"Noch nicht verzeichnet. Kann noch nicht für Abbuchungen genutzt werden."
@ -414,7 +414,7 @@ msgstr "Frist/Termin hinzufügen"
#: compensation/templates/compensation/detail/compensation/includes/deadlines.html:28
#: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:28
#: intervention/forms.py:41
#: intervention/forms.py:42
msgid "Type"
msgstr "Typ"
@ -432,7 +432,7 @@ msgstr "Dokumente"
#: compensation/templates/compensation/detail/compensation/includes/documents.html:14
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:14
#: intervention/templates/intervention/detail/includes/documents.html:14
#: konova/forms.py:316
#: konova/forms.py:315
msgid "Add new document"
msgstr "Neues Dokument hinzufügen"
@ -517,7 +517,7 @@ msgstr "Zuletzt bearbeitet"
#: compensation/templates/compensation/detail/compensation/view.html:72
#: compensation/templates/compensation/detail/eco_account/view.html:65
#: intervention/forms.py:252
#: intervention/forms.py:255
#: intervention/templates/intervention/detail/view.html:111
msgid "Shared with"
msgstr "Freigegeben für"
@ -568,7 +568,7 @@ msgid "Remove Withdraw"
msgstr "Abbuchung entfernen"
#: compensation/views/compensation_views.py:122
#: compensation/views/eco_account_views.py:184 intervention/views.py:369
#: compensation/views/eco_account_views.py:184 intervention/views.py:336
msgid "Log"
msgstr "Log"
@ -577,7 +577,7 @@ msgid "Compensation removed"
msgstr "Kompensation entfernt"
#: compensation/views/compensation_views.py:162
#: compensation/views/eco_account_views.py:283 intervention/views.py:96
#: compensation/views/eco_account_views.py:283 intervention/views.py:93
msgid "Document added"
msgstr "Dokument hinzugefügt"
@ -612,26 +612,42 @@ msgstr "Ökokonto entfernt"
msgid "Withdraw removed"
msgstr "Abbuchung entfernt"
#: compensation/views/eco_account_views.py:204 intervention/views.py:409
#: compensation/views/eco_account_views.py:204 intervention/views.py:376
msgid "{} unrecorded"
msgstr "{} entzeichnet"
#: compensation/views/eco_account_views.py:204 intervention/views.py:409
#: compensation/views/eco_account_views.py:204 intervention/views.py:376
msgid "{} recorded"
msgstr "{} verzeichnet"
#: compensation/views/eco_account_views.py:303 intervention/views.py:391
#: compensation/views/eco_account_views.py:303 intervention/views.py:358
msgid "Withdraw added"
msgstr "Abbuchung hinzugefügt"
#: compensation/views/payment_views.py:43
#: compensation/views/payment_views.py:40
msgid "Payment added"
msgstr "Zahlung hinzugefügt"
#: compensation/views/payment_views.py:78
#: compensation/views/payment_views.py:60
msgid "Payment removed"
msgstr "Zahlung gelöscht"
#: ema/tables.py:59 templates/navbar.html:43
msgid "Payment funded compensations"
msgstr "Ersatzzahlungsmaßnahmen (EMA)"
#: ema/tables.py:60
msgid "EMA explanation"
msgstr ""
"EMA sind Kompensationen, die durch Ersatzzahlungen finanziert wurden. "
"Beachten Sie, dass hier nur die EMAs vor 2015 verwaltet werden! Alle "
"Maßnahmen aus Ersatzzahlungen, die nach 2015 rechtskräftig wurden, werden "
"durch die Stiftung Natur und Umwelt verwaltet."
#: ema/tables.py:82 templates/navbar.html:43
msgid "EMA"
msgstr ""
#: intervention/filters.py:25
msgid "Show unshared"
msgstr "Nicht freigegebene anzeigen"
@ -648,125 +664,125 @@ msgstr "Gemarkung"
msgid "Search for district"
msgstr "Nach Gemarkung suchen"
#: intervention/forms.py:32
#: intervention/forms.py:33
msgid "Generated automatically if none was given"
msgstr "Wird automatisch erzeugt, falls nicht angegeben"
#: intervention/forms.py:44
#: intervention/forms.py:45
msgid "Which intervention type is this"
msgstr "Welcher Eingriffstyp"
#: intervention/forms.py:47
#: intervention/forms.py:48
#: intervention/templates/intervention/detail/view.html:39
msgid "Law"
msgstr "Gesetz"
#: intervention/forms.py:50
#: intervention/forms.py:51
msgid "Based on which law"
msgstr "Basiert auf welchem Recht"
#: intervention/forms.py:53
#: intervention/forms.py:54
#: intervention/templates/intervention/detail/view.html:59
msgid "Intervention handler"
msgstr "Eingriffsverursacher"
#: intervention/forms.py:56
#: intervention/forms.py:57
msgid "Who performs the intervention"
msgstr "Wer führt den Eingriff durch"
#: intervention/forms.py:59
#: intervention/forms.py:60
msgid "Data provider"
msgstr "Datenbereitsteller"
#: intervention/forms.py:61
#: intervention/forms.py:62
msgid "Who provides the data for the intervention"
msgstr "Wer stellt die Daten für den Eingriff zur Verfügung"
#: intervention/forms.py:66
#: intervention/forms.py:67
msgid "Organization"
msgstr "Organisation"
#: intervention/forms.py:72
#: intervention/forms.py:73
msgid "Data provider details"
msgstr "Datenbereitsteller Details"
#: intervention/forms.py:75
#: intervention/forms.py:76
msgid "Further details"
msgstr "Weitere Details"
#: intervention/forms.py:88
#: intervention/forms.py:89
msgid "Map"
msgstr "Karte"
#: intervention/forms.py:90
#: intervention/forms.py:91
msgid "Where does the intervention take place"
msgstr "Wo findet der Eingriff statt"
#: intervention/forms.py:98
#: intervention/forms.py:99
msgid "Files"
msgstr "Dateien"
#: intervention/forms.py:105
#: intervention/forms.py:106
msgid "New intervention"
msgstr "Neuer Eingriff"
#: intervention/forms.py:147
#: intervention/forms.py:148
msgid "Edit intervention"
msgstr "Eingriff bearbeiten"
#: intervention/forms.py:241
#: intervention/forms.py:244
msgid "Share link"
msgstr "Freigabelink"
#: intervention/forms.py:243
#: intervention/forms.py:246
msgid "Send this link to users who you want to have writing access on the data"
msgstr "Andere Nutzer erhalten über diesen Link Zugriff auf die Daten"
#: intervention/forms.py:255
#: intervention/forms.py:258
msgid "Remove check to remove access for this user"
msgstr "Wählen Sie die Nutzer ab, die keinen Zugriff mehr haben sollen"
#: intervention/forms.py:266
#: intervention/forms.py:269
#: intervention/templates/intervention/detail/includes/controls.html:15
msgid "Share"
msgstr "Freigabe"
#: intervention/forms.py:267
#: intervention/forms.py:270
msgid "Share settings for {}"
msgstr "Freigabe Einstellungen für {}"
#: intervention/forms.py:320
#: intervention/forms.py:323
msgid "Date of revocation"
msgstr "Datum des Widerspruchs"
#: intervention/forms.py:330
#: intervention/forms.py:333
#: intervention/templates/intervention/detail/includes/revocation.html:38
msgid "Document"
msgstr "Dokument"
#: intervention/forms.py:332 konova/forms.py:293
#: intervention/forms.py:335 konova/forms.py:292
msgid "Must be smaller than 15 Mb"
msgstr "Muss kleiner als 15 Mb sein"
#: intervention/forms.py:355
#: intervention/forms.py:358
#: intervention/templates/intervention/detail/includes/revocation.html:18
msgid "Add revocation"
msgstr "Widerspruch hinzufügen"
#: intervention/forms.py:391
#: intervention/forms.py:396
msgid "Checked intervention data"
msgstr "Eingriffsdaten geprüft"
#: intervention/forms.py:397
#: intervention/forms.py:402
msgid "Checked compensations data and payments"
msgstr "Kompensationen und Zahlungen geprüft"
#: intervention/forms.py:405
#: intervention/forms.py:410
#: intervention/templates/intervention/detail/includes/controls.html:19
msgid "Run check"
msgstr "Prüfung vornehmen"
#: intervention/forms.py:406 konova/forms.py:362
#: intervention/forms.py:411 konova/forms.py:363
msgid ""
"I, {} {}, confirm that all necessary control steps have been performed by "
"myself."
@ -774,36 +790,36 @@ msgstr ""
"Ich, {} {}, bestätige, dass die notwendigen Kontrollschritte durchgeführt "
"wurden:"
#: intervention/forms.py:445
#: intervention/forms.py:460
msgid "Only recorded accounts can be selected for withdraws"
msgstr "Nur verzeichnete Ökokonten können für Abbuchungen verwendet werden."
#: intervention/forms.py:464 intervention/forms.py:471
#: intervention/tables.py:92 intervention/tables.py:172
#: intervention/forms.py:479 intervention/forms.py:486
#: intervention/tables.py:92
#: intervention/templates/intervention/detail/view.html:19
#: konova/templates/konova/home.html:11 templates/navbar.html:22
msgid "Intervention"
msgstr "Eingriff"
#: intervention/forms.py:466
#: intervention/forms.py:481
msgid "Only shared interventions can be selected"
msgstr "Nur freigegebene Eingriffe können gewählt werden"
#: intervention/forms.py:479
#: intervention/forms.py:494
msgid "New Withdraw"
msgstr "Neue Abbuchung"
#: intervention/forms.py:480
#: intervention/forms.py:495
msgid "Enter the information for a new withdraw from a chosen eco-account"
msgstr "Geben Sie die Informationen für eine neue Abbuchung ein."
#: intervention/forms.py:516
#: intervention/forms.py:531
msgid ""
"Eco-account {} is not recorded yet. You can only withdraw from recorded "
"accounts."
msgstr ""
#: intervention/forms.py:529
#: intervention/forms.py:544
msgid ""
"The account {} has not enough surface for a withdraw of {} m². There are "
"only {} m² left"
@ -811,31 +827,31 @@ msgstr ""
"Das Ökokonto {} hat für eine Abbuchung von {} m² nicht ausreichend "
"Restfläche. Es stehen noch {} m² zur Verfügung."
#: intervention/models.py:203
#: intervention/models.py:200
msgid "Registration office file number missing"
msgstr "Aktenzeichen Zulassungsbehörde fehlt"
#: intervention/models.py:206
#: intervention/models.py:203
msgid "Conversation office file number missing"
msgstr "Aktenzeichen Naturschutzbehörde fehlt"
#: intervention/models.py:209
#: intervention/models.py:206
msgid "Responsible data missing"
msgstr "Daten zu Verantwortlichen fehlen"
#: intervention/models.py:223
#: intervention/models.py:220
msgid "Revocation exists"
msgstr "Widerspruch liegt vor"
#: intervention/models.py:226
#: intervention/models.py:223
msgid "Registration date missing"
msgstr "Datum Zulassung bzw. Satzungsbeschluss fehlt"
#: intervention/models.py:229
#: intervention/models.py:226
msgid "Binding on missing"
msgstr "Datum Bestandskraft fehlt"
#: intervention/models.py:231
#: intervention/models.py:228
msgid "Legal data missing"
msgstr "Rechtliche Daten fehlen"
@ -843,14 +859,6 @@ msgstr "Rechtliche Daten fehlen"
msgid "Interventions"
msgstr "Eingriffe"
#: intervention/tables.py:179
msgid "Edit {}"
msgstr "Bearbeite {}"
#: intervention/tables.py:183
msgid "Delete {}"
msgstr "Lösche {}"
#: intervention/templates/intervention/detail/includes/compensations.html:14
msgid "Add new compensation"
msgstr "Neue Kompensation hinzufügen"
@ -902,10 +910,10 @@ msgstr "Ökokonto Kennung"
#: intervention/templates/intervention/detail/view.html:34
#: intervention/templates/intervention/detail/view.html:38
#: intervention/templates/intervention/detail/view.html:46
#: intervention/templates/intervention/detail/view.html:54
#: intervention/templates/intervention/detail/view.html:58
#: intervention/templates/intervention/detail/view.html:90
#: intervention/templates/intervention/detail/view.html:94
#: intervention/templates/intervention/detail/view.html:98
msgid "Missing"
msgstr "Fehlt"
@ -937,19 +945,23 @@ msgstr "Datum Zulassung bzw. Satzungsbeschluss"
msgid "Binding on"
msgstr "Datum Bestandskraft"
#: intervention/views.py:68
#: intervention/templates/intervention/detail/view.html:98
msgid "Exists"
msgstr "vorhanden"
#: intervention/views.py:65
msgid "Intervention {} added"
msgstr "Eingriff {} hinzugefügt"
#: intervention/views.py:71 intervention/views.py:172
#: intervention/views.py:68 intervention/views.py:169
msgid "Invalid input"
msgstr "Eingabe fehlerhaft"
#: intervention/views.py:130
#: intervention/views.py:127
msgid "This intervention has a revocation from {}"
msgstr "Es existiert ein Widerspruch vom {}"
#: intervention/views.py:146
#: intervention/views.py:143
msgid ""
"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 "
@ -959,43 +971,43 @@ msgstr ""
"bedeutet, dass Sie nur lesenden Zugriff hierauf haben und weder bearbeiten, "
"noch Prüfungen durchführen oder verzeichnen können."
#: intervention/views.py:169
#: intervention/views.py:166
msgid "{} edited"
msgstr "{} bearbeitet"
#: intervention/views.py:198
#: intervention/views.py:195
msgid "{} removed"
msgstr "{} entfernt"
#: intervention/views.py:219
#: intervention/views.py:216
msgid "Revocation removed"
msgstr "Widerspruch entfernt"
#: intervention/views.py:245
#: intervention/views.py:242
msgid "{} has already been shared with you"
msgstr "{} wurde bereits für Sie freigegeben"
#: intervention/views.py:250
#: intervention/views.py:247
msgid "{} has been shared with you"
msgstr "{} ist nun für Sie freigegeben"
#: intervention/views.py:257
#: intervention/views.py:254
msgid "Share link invalid"
msgstr "Freigabelink ungültig"
#: intervention/views.py:281
#: intervention/views.py:275
msgid "Share settings updated"
msgstr "Freigabe Einstellungen aktualisiert"
#: intervention/views.py:309
#: intervention/views.py:294
msgid "Check performed"
msgstr "Prüfung durchgeführt"
#: intervention/views.py:332
#: intervention/views.py:314
msgid "Revocation added"
msgstr "Widerspruch hinzugefügt"
#: intervention/views.py:414
#: intervention/views.py:381
msgid "There are errors on this intervention:"
msgstr "Es liegen Fehler in diesem Eingriff vor:"
@ -1020,60 +1032,60 @@ msgstr ""
msgid "You need to be part of another user group."
msgstr "Hierfür müssen Sie einer anderen Nutzergruppe angehören!"
#: konova/forms.py:66
#: konova/forms.py:67
msgid "Not editable"
msgstr "Nicht editierbar"
#: konova/forms.py:105 konova/forms.py:241
#: konova/forms.py:106 konova/forms.py:240
msgid "Confirm"
msgstr "Bestätige"
#: konova/forms.py:117 konova/forms.py:250
#: konova/forms.py:118 konova/forms.py:249
msgid "Remove"
msgstr "Löschen"
#: konova/forms.py:119
#: konova/forms.py:120
msgid "You are about to remove {} {}"
msgstr "Sie sind dabei {} {} zu löschen"
#: konova/forms.py:251
#: konova/forms.py:250
msgid "Are you sure?"
msgstr "Sind Sie sicher?"
#: konova/forms.py:279
#: konova/forms.py:278
msgid "Created on"
msgstr "Erstellt"
#: konova/forms.py:281
#: konova/forms.py:280
msgid "When has this file been created? Important for photos."
msgstr "Wann wurde diese Datei erstellt oder das Foto aufgenommen?"
#: konova/forms.py:291
#: konova/forms.py:290
#: venv/lib/python3.7/site-packages/django/db/models/fields/files.py:231
msgid "File"
msgstr "Datei"
#: konova/forms.py:341
#: konova/forms.py:340
msgid "Added document"
msgstr "Dokument hinzugefügt"
#: konova/forms.py:353
#: konova/forms.py:354
msgid "Confirm record"
msgstr "Verzeichnen bestätigen"
#: konova/forms.py:361
#: konova/forms.py:362
msgid "Record data"
msgstr "Daten verzeichnen"
#: konova/forms.py:366
#: konova/forms.py:367
msgid "Confirm unrecord"
msgstr "Entzeichnen bestätigen"
#: konova/forms.py:367
#: konova/forms.py:368
msgid "Unrecord data"
msgstr "Daten entzeichnen"
#: konova/forms.py:368
#: konova/forms.py:369
msgid "I, {} {}, confirm that this data must be unrecorded."
msgstr ""
"Ich, {} {}, bestätige, dass diese Daten wieder entzeichnet werden müssen."
@ -1102,19 +1114,19 @@ msgstr "Wenn meine freigegebenen Daten gelöscht wurden"
msgid "On registered data edited"
msgstr "Wenn meine freigegebenen Daten bearbeitet wurden"
#: konova/models.py:168
#: konova/models.py:189
msgid "Finished"
msgstr "Umgesetzt bis"
#: konova/models.py:169
#: konova/models.py:190
msgid "Maintain"
msgstr "Unterhaltung bis"
#: konova/models.py:170
#: konova/models.py:191
msgid "Control"
msgstr "Kontrolle am"
#: konova/models.py:171
#: konova/models.py:192
msgid "Other"
msgstr "Sonstige"
@ -1158,11 +1170,23 @@ msgstr "Es gab einen Fehler im Formular."
msgid "There are errors in this intervention."
msgstr "Es liegen Fehler in diesem Eingriff vor:"
#: konova/views.py:142
#: konova/utils/messenger.py:69
msgid "{} checked"
msgstr "{} geprüft"
#: konova/utils/messenger.py:71
msgid "<a href=\"{}\">Check it out</a>"
msgstr ""
#: konova/utils/messenger.py:72
msgid "{} has been checked successfully by user {}! {}"
msgstr ""
#: konova/views.py:138
msgid "Document '{}' deleted"
msgstr "Dokument '{}' gelöscht"
#: konova/views.py:161
#: konova/views.py:157
msgid "Deadline removed"
msgstr "Frist gelöscht"
@ -1214,39 +1238,39 @@ msgstr "Abbrechen"
msgid "Save"
msgstr "Speichern"
#: templates/form/generic_table_form_body.html:21
#: templates/form/generic_table_form_body.html:22
msgid "Fields with * are required."
msgstr "* sind Pflichtfelder."
#: templates/generic_index.html:19
#: templates/generic_index.html:28
msgid "New entry"
msgstr "Neuer Eintrag"
#: templates/generic_index.html:21
#: templates/generic_index.html:30
msgid "New"
msgstr "Neu"
#: templates/generic_index.html:36
#: templates/generic_index.html:45
msgid "Search for keywords"
msgstr "Nach Schlagwörtern suchen"
#: templates/generic_index.html:36
#: templates/generic_index.html:45
msgid "Search"
msgstr "Suchen"
#: templates/generic_index.html:37
#: templates/generic_index.html:46
msgid "Start search"
msgstr "Starte Suche"
#: templates/generic_index.html:49
#: templates/generic_index.html:58
msgid "Results per page"
msgstr "Treffer pro Seite"
#: templates/generic_index.html:73 templates/generic_index.html:79
#: templates/generic_index.html:82 templates/generic_index.html:88
msgid "Filter"
msgstr ""
#: templates/generic_index.html:81
#: templates/generic_index.html:90
msgid "Apply filter"
msgstr "Filter anwenden"
@ -1282,10 +1306,6 @@ msgstr "Home"
msgid "More"
msgstr "Mehr"
#: templates/navbar.html:43
msgid "EMA"
msgstr ""
#: templates/navbar.html:44
msgid "Import..."
msgstr ""
@ -2578,8 +2598,11 @@ msgstr ""
msgid "A fontawesome icon field"
msgstr ""
#~ msgid "exists"
#~ msgstr "vorhanden"
#~ msgid "Edit {}"
#~ msgstr "Bearbeite {}"
#~ msgid "Delete {}"
#~ msgstr "Lösche {}"
#~ msgid "Actions"
#~ msgstr "Aktionen"
@ -2605,9 +2628,6 @@ msgstr ""
#~ msgid "Last login on"
#~ msgstr "Zuletzt eingeloggt am"
#~ msgid "Delete compensation"
#~ msgstr "Kompensation löschen"
#~ msgid "Add new eco account"
#~ msgstr "Neues Ökokonto hinzufügen"

@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ base_title }}</title>
<title>{{ base_frontend_title }}</title>
<link rel="icon" type="image/ico" href="{% static 'images/ksp-favicon.ico' %}">
{% bootstrap_css %}
{% bootstrap_javascript jquery='full' %}

@ -5,12 +5,21 @@
{% block body %}
<div class="col-md">
{% if table.title is not None %}
{% if table.title %}
<div class="row">
<h3>
{{ table.title }}
</h3>
</div>
{% if table.subtitle %}
<div class="row mb-2">
<div class="col-lg">
<small>
{{ table.subtitle }}
</small>
</div>
</div>
{% endif %}
{% endif %}
<div class="row">
{% if table.add_new_entries %}

@ -34,13 +34,13 @@
{% trans 'Eco-account' %}
</a>
</li>
<li class=" menu-elem dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<a class="nav-btn nav-link">
<li class=" menu-elem dropdown">
<div class="btn nav-btn" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
{% fa5_icon 'ellipsis-v' %}
{% trans 'More' %}
</a>
</div>
<div class="dropdown-menu">
<a class="dropdown-item" href="{% url 'home' %}">{% 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-export' %} {% trans 'Export...' %}</a>
<a class="dropdown-item" href="{% url 'home' %}">{% fa5_icon 'file-alt' %} {% trans 'Reports' %}</a>

@ -74,6 +74,11 @@ class UserActionLogEntry(models.Model):
)
comment = models.CharField(max_length=255, null=True, blank=True, help_text="Additional comment on this entry")
class Meta:
ordering = (
"-timestamp",
)
def __str__(self):
return "{} | {} | {}".format(self.user.username, self.timestamp, self.action)

Loading…
Cancel
Save