Access url for interventions
* adds access_token as new attribute * adds generating of access_token * adds new form * adds two new routes for sharing an intervention * adds translation * adds render_submit to BaseModalForm which triggers rendering the modal footer
This commit is contained in:
parent
b7ab9f6f55
commit
2f33e5fba9
@ -15,7 +15,7 @@ from django.urls import reverse
|
|||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from intervention.models import Intervention
|
from intervention.models import Intervention
|
||||||
from konova.forms import BaseForm
|
from konova.forms import BaseForm, BaseModalForm
|
||||||
from konova.models import Document
|
from konova.models import Document
|
||||||
from konova.settings import DEFAULT_LAT, DEFAULT_LON, DEFAULT_ZOOM
|
from konova.settings import DEFAULT_LAT, DEFAULT_LON, DEFAULT_ZOOM
|
||||||
from organisation.models import Organisation
|
from organisation.models import Organisation
|
||||||
@ -220,6 +220,42 @@ class OpenInterventionForm(EditInterventionForm):
|
|||||||
self.disable_form_field(field)
|
self.disable_form_field(field)
|
||||||
|
|
||||||
|
|
||||||
|
class ShareInterventionForm(BaseModalForm):
|
||||||
|
url = forms.CharField(
|
||||||
|
label=_("Share link"),
|
||||||
|
label_suffix="",
|
||||||
|
disabled=True,
|
||||||
|
required=False,
|
||||||
|
widget=forms.TextInput(
|
||||||
|
attrs={
|
||||||
|
"style": "width:100%",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.form_title = _("Share")
|
||||||
|
self.form_caption = _("Send this link to users who you want to have writing access on the data.")
|
||||||
|
self.template = "modal/modal_form.html"
|
||||||
|
self.render_submit = False
|
||||||
|
|
||||||
|
# Make sure an access_token is set
|
||||||
|
if self.instance.access_token is None:
|
||||||
|
self.instance.generate_access_token()
|
||||||
|
|
||||||
|
self.share_link = self.request.build_absolute_uri(
|
||||||
|
reverse("intervention:share", args=(self.instance.id, self.instance.access_token,))
|
||||||
|
)
|
||||||
|
self.initialize_form_field(
|
||||||
|
"url",
|
||||||
|
self.share_link
|
||||||
|
)
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
|
||||||
class DummyFilterInput(forms.HiddenInput):
|
class DummyFilterInput(forms.HiddenInput):
|
||||||
""" A dummy input widget
|
""" A dummy input widget
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ from django.utils.timezone import now
|
|||||||
|
|
||||||
from intervention.settings import INTERVENTION_IDENTIFIER_LENGTH, INTERVENTION_IDENTIFIER_TEMPLATE
|
from intervention.settings import INTERVENTION_IDENTIFIER_LENGTH, INTERVENTION_IDENTIFIER_TEMPLATE
|
||||||
from konova.models import BaseObject, Geometry, UuidModel
|
from konova.models import BaseObject, Geometry, UuidModel
|
||||||
|
from konova.utils import generators
|
||||||
from konova.utils.generators import generate_random_string
|
from konova.utils.generators import generate_random_string
|
||||||
from organisation.models import Organisation
|
from organisation.models import Organisation
|
||||||
from user.models import UserActionLogEntry
|
from user.models import UserActionLogEntry
|
||||||
@ -92,6 +93,12 @@ class Intervention(BaseObject):
|
|||||||
|
|
||||||
# Users having access on this object
|
# Users having access on this object
|
||||||
users = models.ManyToManyField(User)
|
users = models.ManyToManyField(User)
|
||||||
|
access_token = models.CharField(
|
||||||
|
max_length=255,
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
help_text="Used for sharing access",
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{} ({})".format(self.identifier, self.title)
|
return "{} ({})".format(self.identifier, self.title)
|
||||||
@ -139,6 +146,40 @@ class Intervention(BaseObject):
|
|||||||
_str = "{}{}{}".format(curr_month, curr_year, rand_str)
|
_str = "{}{}{}".format(curr_month, curr_year, rand_str)
|
||||||
return INTERVENTION_IDENTIFIER_TEMPLATE.format(_str)
|
return INTERVENTION_IDENTIFIER_TEMPLATE.format(_str)
|
||||||
|
|
||||||
|
def generate_access_token(self, make_unique: bool = False, rec_depth: int = 5):
|
||||||
|
""" Creates a new access token for the intervention
|
||||||
|
|
||||||
|
Tokens are not used for identification of a table row. The share logic checks the intervention id as well
|
||||||
|
as the given token. Therefore two different interventions can hold the same access_token without problems.
|
||||||
|
For (possible) future changes to the share logic, the make_unique parameter may be used for checking whether
|
||||||
|
the access_token is already used in any intervention. If so, tokens will be generated as long as a free token
|
||||||
|
can be found.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
make_unique (bool): Perform check on uniqueness over all intervention entries
|
||||||
|
rec_depth (int): How many tries for generating a free random token (only if make_unique)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
"""
|
||||||
|
# Make sure we won't end up in an infinite loop of trying to generate access_tokens
|
||||||
|
rec_depth = rec_depth - 1
|
||||||
|
if rec_depth < 0 and make_unique:
|
||||||
|
raise RuntimeError(
|
||||||
|
"Access token generating for {} does not seem to find a free random token! Aborted!".format(self.id)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create random token
|
||||||
|
token = generators.generate_random_string(15)
|
||||||
|
token_used_in = Intervention.objects.filter(access_token=token)
|
||||||
|
# Make sure the token is not used anywhere as access_token, yet.
|
||||||
|
# Make use of QuerySet lazy method for checking if it exists or not.
|
||||||
|
if token_used_in and make_unique:
|
||||||
|
self.generate_access_token(make_unique, rec_depth)
|
||||||
|
else:
|
||||||
|
self.access_token = token
|
||||||
|
self.save()
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if self.identifier is None or len(self.identifier) == 0:
|
if self.identifier is None or len(self.identifier) == 0:
|
||||||
# Create new identifier
|
# Create new identifier
|
||||||
|
@ -24,11 +24,9 @@
|
|||||||
</button>
|
</button>
|
||||||
</a>
|
</a>
|
||||||
{% if has_access %}
|
{% if has_access %}
|
||||||
<a href="{% url 'home' %}" class="mr-2">
|
<button class="btn btn-default btn-modal mr-2" title="{% trans 'Share' %}" data-form-url="{% url 'intervention:share-create' intervention.id %}">
|
||||||
<button class="btn btn-default" title="{% trans 'Share' %}">
|
{% fa5_icon 'share-alt' %}
|
||||||
{% fa5_icon 'share-alt' %}
|
</button>
|
||||||
</button>
|
|
||||||
</a>
|
|
||||||
<a href="{% url 'home' %}" class="mr-2">
|
<a href="{% url 'home' %}" class="mr-2">
|
||||||
<button class="btn btn-default" title="{% trans 'Run check' %}">
|
<button class="btn btn-default" title="{% trans 'Run check' %}">
|
||||||
{% fa5_icon 'star' %}
|
{% fa5_icon 'star' %}
|
||||||
|
@ -7,7 +7,8 @@ Created on: 30.11.20
|
|||||||
"""
|
"""
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
|
||||||
from intervention.views import index_view, new_view, open_view, edit_view, remove_view, new_document_view
|
from intervention.views import index_view, new_view, open_view, edit_view, remove_view, new_document_view, share_view, \
|
||||||
|
create_share_view
|
||||||
|
|
||||||
app_name = "intervention"
|
app_name = "intervention"
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@ -17,4 +18,6 @@ urlpatterns = [
|
|||||||
path('<id>', open_view, name='open'),
|
path('<id>', open_view, name='open'),
|
||||||
path('<id>/edit', edit_view, name='edit'),
|
path('<id>/edit', edit_view, name='edit'),
|
||||||
path('<id>/remove', remove_view, name='remove'),
|
path('<id>/remove', remove_view, name='remove'),
|
||||||
|
path('<id>/share/<token>', share_view, name='share'),
|
||||||
|
path('<id>/share', create_share_view, name='share-create'),
|
||||||
]
|
]
|
@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _
|
|||||||
from django.http import HttpRequest
|
from django.http import HttpRequest
|
||||||
from django.shortcuts import render, get_object_or_404
|
from django.shortcuts import render, get_object_or_404
|
||||||
|
|
||||||
from intervention.forms import NewInterventionForm, EditInterventionForm
|
from intervention.forms import NewInterventionForm, EditInterventionForm, ShareInterventionForm
|
||||||
from intervention.models import Intervention
|
from intervention.models import Intervention
|
||||||
from intervention.tables import InterventionTable
|
from intervention.tables import InterventionTable
|
||||||
from konova.contexts import BaseContext
|
from konova.contexts import BaseContext
|
||||||
@ -198,3 +198,68 @@ def remove_view(request: HttpRequest, id: str):
|
|||||||
}
|
}
|
||||||
context = BaseContext(request, context).context
|
context = BaseContext(request, context).context
|
||||||
return render(request, template, context)
|
return render(request, template, context)
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def share_view(request: HttpRequest, id: str, token: str):
|
||||||
|
""" Performs sharing of an intervention
|
||||||
|
|
||||||
|
If token given in url is not valid, the user will be redirected to the dashboard
|
||||||
|
|
||||||
|
Args:
|
||||||
|
request (HttpRequest): The incoming request
|
||||||
|
id (str): Intervention's id
|
||||||
|
token (str): Access token for intervention
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
"""
|
||||||
|
user = request.user
|
||||||
|
intervention = get_object_or_404(Intervention, id=id)
|
||||||
|
# Check tokens
|
||||||
|
if intervention.access_token == token:
|
||||||
|
# Send different messages in case user has already been added to list of sharing users
|
||||||
|
if intervention.has_access(user):
|
||||||
|
messages.info(
|
||||||
|
request,
|
||||||
|
_("{} has already been shared with you").format(intervention.identifier)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
messages.success(
|
||||||
|
request,
|
||||||
|
_("{} has been shared with you").format(intervention.identifier)
|
||||||
|
)
|
||||||
|
intervention.users.add(user)
|
||||||
|
return redirect("intervention:open", id=id)
|
||||||
|
else:
|
||||||
|
messages.error(
|
||||||
|
request,
|
||||||
|
_("Share link invalid"),
|
||||||
|
extra_tags="danger",
|
||||||
|
)
|
||||||
|
return redirect("home")
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def create_share_view(request: HttpRequest, id: str):
|
||||||
|
""" Renders sharing form for an intervention
|
||||||
|
|
||||||
|
Args:
|
||||||
|
request (HttpRequest): The incoming request
|
||||||
|
id (str): Intervention's id
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
"""
|
||||||
|
user = request.user
|
||||||
|
intervention = get_object_or_404(Intervention, id=id)
|
||||||
|
form = ShareInterventionForm(request.POST or None, instance=intervention, request=request)
|
||||||
|
if request.method != "GET":
|
||||||
|
raise NotImplementedError
|
||||||
|
context = {
|
||||||
|
"form": form,
|
||||||
|
}
|
||||||
|
context = BaseContext(request, context).context
|
||||||
|
return render(request, form.template, context)
|
||||||
|
|
||||||
|
|
||||||
|
@ -109,6 +109,7 @@ class BaseModalForm(BaseForm, BSModalForm):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
is_modal_form = True
|
is_modal_form = True
|
||||||
|
render_submit = True
|
||||||
|
|
||||||
|
|
||||||
class SimpleGeomForm(BaseForm):
|
class SimpleGeomForm(BaseForm):
|
||||||
|
Binary file not shown.
@ -4,16 +4,16 @@
|
|||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
#
|
#
|
||||||
#: compensation/forms.py:27 compensation/forms.py:32 compensation/forms.py:45
|
#: compensation/forms.py:27 compensation/forms.py:32 compensation/forms.py:45
|
||||||
#: intervention/filters.py:25 intervention/filters.py:31
|
#: intervention/filters.py:26 intervention/filters.py:40
|
||||||
#: intervention/filters.py:38 intervention/filters.py:39 konova/forms.py:78
|
#: intervention/filters.py:47 intervention/filters.py:48 konova/forms.py:78
|
||||||
#: konova/forms.py:154 konova/forms.py:181 konova/forms.py:186
|
#: konova/forms.py:155 konova/forms.py:182 konova/forms.py:187
|
||||||
#: konova/forms.py:198 konova/forms.py:209 konova/forms.py:222 user/forms.py:38
|
#: konova/forms.py:199 konova/forms.py:210 konova/forms.py:223 user/forms.py:38
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
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-07-28 08:51+0200\n"
|
"POT-Creation-Date: 2021-07-30 13:23+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@ -57,57 +57,97 @@ msgstr "Zahlung"
|
|||||||
msgid "Add a payment for intervention '{}'"
|
msgid "Add a payment for intervention '{}'"
|
||||||
msgstr "Neue Ersatzzahlung zu Eingriff '{}' hinzufügen"
|
msgstr "Neue Ersatzzahlung zu Eingriff '{}' hinzufügen"
|
||||||
|
|
||||||
#: compensation/tables.py:18 compensation/tables.py:71 intervention/forms.py:26
|
#: compensation/tables.py:24 compensation/tables.py:164
|
||||||
#: intervention/tables.py:23
|
#: intervention/forms.py:27 intervention/tables.py:23
|
||||||
#: intervention/templates/intervention/detail/related-objects.html:30
|
#: intervention/templates/intervention/detail/related-objects.html:30
|
||||||
msgid "Identifier"
|
msgid "Identifier"
|
||||||
msgstr "Kennung"
|
msgstr "Kennung"
|
||||||
|
|
||||||
#: compensation/tables.py:23 compensation/tables.py:76 intervention/forms.py:33
|
#: compensation/tables.py:29 compensation/tables.py:169
|
||||||
#: intervention/tables.py:28
|
#: intervention/forms.py:34 intervention/tables.py:28
|
||||||
#: intervention/templates/intervention/detail/related-documents.html:28
|
#: intervention/templates/intervention/detail/related-documents.html:28
|
||||||
#: intervention/templates/intervention/detail/related-objects.html:33
|
#: intervention/templates/intervention/detail/related-objects.html:33
|
||||||
#: intervention/templates/intervention/detail/view.html:62 konova/forms.py:180
|
#: intervention/templates/intervention/detail/view.html:60 konova/forms.py:181
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Bezeichnung"
|
msgstr "Bezeichnung"
|
||||||
|
|
||||||
#: compensation/tables.py:28 compensation/tables.py:81 konova/forms.py:185
|
#: compensation/tables.py:34 intervention/tables.py:33
|
||||||
msgid "Created on"
|
#: intervention/templates/intervention/detail/view.html:92
|
||||||
msgstr "Erstellt"
|
msgid "Checked"
|
||||||
|
msgstr "Geprüft"
|
||||||
|
|
||||||
#: compensation/tables.py:33 compensation/tables.py:86
|
#: compensation/tables.py:40 intervention/tables.py:39
|
||||||
msgid "Actions"
|
#: intervention/templates/intervention/detail/view.html:106
|
||||||
msgstr "Aktionen"
|
msgid "Recorded"
|
||||||
|
msgstr "Verzeichnet"
|
||||||
|
|
||||||
#: compensation/tables.py:44
|
#: compensation/tables.py:46 intervention/tables.py:45
|
||||||
|
msgid "Editable"
|
||||||
|
msgstr "Freigegeben"
|
||||||
|
|
||||||
|
#: compensation/tables.py:52 intervention/tables.py:51
|
||||||
|
msgid "Last edit"
|
||||||
|
msgstr "Zuletzt bearbeitet"
|
||||||
|
|
||||||
|
#: compensation/tables.py:61
|
||||||
#: intervention/templates/intervention/detail/related-objects.html:10
|
#: intervention/templates/intervention/detail/related-objects.html:10
|
||||||
msgid "Compensations"
|
msgid "Compensations"
|
||||||
msgstr "Kompensationen"
|
msgstr "Kompensationen"
|
||||||
|
|
||||||
#: compensation/tables.py:51 compensation/tables.py:104
|
#: compensation/tables.py:83 compensation/tables.py:200
|
||||||
|
#: intervention/tables.py:92 intervention/tables.py:175
|
||||||
|
msgid "Open {}"
|
||||||
|
msgstr "Öffne {}"
|
||||||
|
|
||||||
|
#: compensation/tables.py:83 compensation/tables.py:197
|
||||||
#: konova/templates/konova/home.html:49 templates/navbar.html:28
|
#: konova/templates/konova/home.html:49 templates/navbar.html:28
|
||||||
msgid "Compensation"
|
msgid "Compensation"
|
||||||
msgstr "Kompensation"
|
msgstr "Kompensation"
|
||||||
|
|
||||||
#: compensation/tables.py:54 compensation/tables.py:107
|
#: compensation/tables.py:104 intervention/tables.py:111
|
||||||
#: intervention/tables.py:92 intervention/tables.py:173
|
msgid "Not checked yet"
|
||||||
msgid "Open {}"
|
msgstr "Noch nicht geprüft"
|
||||||
msgstr "Öffne {}"
|
|
||||||
|
|
||||||
#: compensation/tables.py:59 compensation/tables.py:112
|
#: compensation/tables.py:109 intervention/tables.py:116
|
||||||
#: intervention/tables.py:177
|
msgid "Checked on {} by {}"
|
||||||
|
msgstr "Am {} von {} geprüft worden"
|
||||||
|
|
||||||
|
#: compensation/tables.py:128 intervention/tables.py:135
|
||||||
|
msgid "Not registered yet"
|
||||||
|
msgstr "Noch nicht verzeichnet"
|
||||||
|
|
||||||
|
#: compensation/tables.py:133 intervention/tables.py:140
|
||||||
|
msgid "Registered on {} by {}"
|
||||||
|
msgstr "Am {} von {} verzeichnet worden"
|
||||||
|
|
||||||
|
#: compensation/tables.py:156 intervention/tables.py:163
|
||||||
|
msgid "Full access granted"
|
||||||
|
msgstr "Für Sie freigegeben - Datensatz kann bearbeitet werden"
|
||||||
|
|
||||||
|
#: compensation/tables.py:156 intervention/tables.py:163
|
||||||
|
msgid "Access not granted"
|
||||||
|
msgstr "Nicht freigegeben - Datensatz nur lesbar"
|
||||||
|
|
||||||
|
#: compensation/tables.py:174 konova/forms.py:186
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Erstellt"
|
||||||
|
|
||||||
|
#: compensation/tables.py:179
|
||||||
|
msgid "Actions"
|
||||||
|
msgstr "Aktionen"
|
||||||
|
|
||||||
|
#: compensation/tables.py:190
|
||||||
|
msgid "Eco Accounts"
|
||||||
|
msgstr "Ökokonten"
|
||||||
|
|
||||||
|
#: compensation/tables.py:205 intervention/tables.py:179
|
||||||
msgid "Edit {}"
|
msgid "Edit {}"
|
||||||
msgstr "Bearbeite {}"
|
msgstr "Bearbeite {}"
|
||||||
|
|
||||||
#: compensation/tables.py:63 compensation/tables.py:116
|
#: compensation/tables.py:209 intervention/tables.py:183
|
||||||
#: intervention/tables.py:181
|
|
||||||
msgid "Delete {}"
|
msgid "Delete {}"
|
||||||
msgstr "Lösche {}"
|
msgstr "Lösche {}"
|
||||||
|
|
||||||
#: compensation/tables.py:97
|
|
||||||
msgid "Eco Accounts"
|
|
||||||
msgstr "Ökokonten"
|
|
||||||
|
|
||||||
#: compensation/views.py:136
|
#: compensation/views.py:136
|
||||||
msgid "Payment added"
|
msgid "Payment added"
|
||||||
msgstr "Zahlung hinzugefügt"
|
msgstr "Zahlung hinzugefügt"
|
||||||
@ -121,155 +161,127 @@ msgstr "Es gab einen Fehler im Formular."
|
|||||||
msgid "Payment removed"
|
msgid "Payment removed"
|
||||||
msgstr "Zahlung gelöscht"
|
msgstr "Zahlung gelöscht"
|
||||||
|
|
||||||
#: intervention/filters.py:24
|
#: intervention/filters.py:25
|
||||||
msgid "Show unshared"
|
msgid "Show unshared"
|
||||||
msgstr "Nicht freigegebene anzeigen"
|
msgstr "Nicht freigegebene anzeigen"
|
||||||
|
|
||||||
#: intervention/filters.py:30
|
#: intervention/filters.py:39
|
||||||
msgid "Show recorded"
|
msgid "Show recorded"
|
||||||
msgstr "Verzeichnete anzeigen"
|
msgstr "Verzeichnete anzeigen"
|
||||||
|
|
||||||
#: intervention/filters.py:42
|
#: intervention/filters.py:51
|
||||||
msgid "District"
|
msgid "District"
|
||||||
msgstr "Gemarkung"
|
msgstr "Gemarkung"
|
||||||
|
|
||||||
#: intervention/filters.py:43
|
#: intervention/filters.py:52
|
||||||
msgid "Search for district"
|
msgid "Search for district"
|
||||||
msgstr "Nach Gemarkung suchen"
|
msgstr "Nach Gemarkung suchen"
|
||||||
|
|
||||||
#: intervention/forms.py:29
|
#: intervention/forms.py:30
|
||||||
msgid "Generated automatically if none was given"
|
msgid "Generated automatically if none was given"
|
||||||
msgstr "Wird automatisch erzeugt, falls nicht angegeben"
|
msgstr "Wird automatisch erzeugt, falls nicht angegeben"
|
||||||
|
|
||||||
#: intervention/forms.py:38
|
#: intervention/forms.py:39
|
||||||
msgid "Type"
|
msgid "Type"
|
||||||
msgstr "Typ"
|
msgstr "Typ"
|
||||||
|
|
||||||
#: intervention/forms.py:41
|
#: intervention/forms.py:42
|
||||||
msgid "Which intervention type is this"
|
msgid "Which intervention type is this"
|
||||||
msgstr "Welcher Eingriffstyp"
|
msgstr "Welcher Eingriffstyp"
|
||||||
|
|
||||||
#: intervention/forms.py:44
|
#: intervention/forms.py:45
|
||||||
#: intervention/templates/intervention/detail/view.html:70
|
#: intervention/templates/intervention/detail/view.html:68
|
||||||
msgid "Law"
|
msgid "Law"
|
||||||
msgstr "Gesetz"
|
msgstr "Gesetz"
|
||||||
|
|
||||||
#: intervention/forms.py:47
|
#: intervention/forms.py:48
|
||||||
msgid "Based on which law"
|
msgid "Based on which law"
|
||||||
msgstr "Basiert auf welchem Recht"
|
msgstr "Basiert auf welchem Recht"
|
||||||
|
|
||||||
#: intervention/forms.py:50
|
#: intervention/forms.py:51
|
||||||
#: intervention/templates/intervention/detail/view.html:90
|
#: intervention/templates/intervention/detail/view.html:88
|
||||||
msgid "Intervention handler"
|
msgid "Intervention handler"
|
||||||
msgstr "Eingriffsverursacher"
|
msgstr "Eingriffsverursacher"
|
||||||
|
|
||||||
#: intervention/forms.py:53
|
#: intervention/forms.py:54
|
||||||
msgid "Who performs the intervention"
|
msgid "Who performs the intervention"
|
||||||
msgstr "Wer führt den Eingriff durch"
|
msgstr "Wer führt den Eingriff durch"
|
||||||
|
|
||||||
#: intervention/forms.py:56
|
#: intervention/forms.py:57
|
||||||
msgid "Data provider"
|
msgid "Data provider"
|
||||||
msgstr "Datenbereitsteller"
|
msgstr "Datenbereitsteller"
|
||||||
|
|
||||||
#: intervention/forms.py:58
|
#: intervention/forms.py:59
|
||||||
msgid "Who provides the data for the intervention"
|
msgid "Who provides the data for the intervention"
|
||||||
msgstr "Wer stellt die Daten für den Eingriff zur Verfügung"
|
msgstr "Wer stellt die Daten für den Eingriff zur Verfügung"
|
||||||
|
|
||||||
#: intervention/forms.py:63
|
#: intervention/forms.py:64
|
||||||
msgid "Organization"
|
msgid "Organization"
|
||||||
msgstr "Organisation"
|
msgstr "Organisation"
|
||||||
|
|
||||||
#: intervention/forms.py:69
|
#: intervention/forms.py:70
|
||||||
msgid "Data provider details"
|
msgid "Data provider details"
|
||||||
msgstr "Datenbereitsteller Details"
|
msgstr "Datenbereitsteller Details"
|
||||||
|
|
||||||
#: intervention/forms.py:72
|
#: intervention/forms.py:73
|
||||||
msgid "Further details"
|
msgid "Further details"
|
||||||
msgstr "Weitere Details"
|
msgstr "Weitere Details"
|
||||||
|
|
||||||
#: intervention/forms.py:85
|
#: intervention/forms.py:86
|
||||||
msgid "Map"
|
msgid "Map"
|
||||||
msgstr "Karte"
|
msgstr "Karte"
|
||||||
|
|
||||||
#: intervention/forms.py:87
|
#: intervention/forms.py:88
|
||||||
msgid "Where does the intervention take place"
|
msgid "Where does the intervention take place"
|
||||||
msgstr "Wo findet der Eingriff statt"
|
msgstr "Wo findet der Eingriff statt"
|
||||||
|
|
||||||
#: intervention/forms.py:95
|
#: intervention/forms.py:96
|
||||||
msgid "Files"
|
msgid "Files"
|
||||||
msgstr "Dateien"
|
msgstr "Dateien"
|
||||||
|
|
||||||
#: intervention/forms.py:102
|
#: intervention/forms.py:103
|
||||||
msgid "New intervention"
|
msgid "New intervention"
|
||||||
msgstr "Neuer Eingriff"
|
msgstr "Neuer Eingriff"
|
||||||
|
|
||||||
#: intervention/forms.py:145
|
#: intervention/forms.py:146
|
||||||
msgid "Edit intervention"
|
msgid "Edit intervention"
|
||||||
msgstr "Eingriff bearbeiten"
|
msgstr "Eingriff bearbeiten"
|
||||||
|
|
||||||
#: intervention/tables.py:33
|
#: intervention/forms.py:226
|
||||||
#: intervention/templates/intervention/detail/view.html:94
|
msgid "Share link"
|
||||||
msgid "Checked"
|
msgstr "Freigabelink"
|
||||||
msgstr "Geprüft"
|
|
||||||
|
|
||||||
#: intervention/tables.py:39
|
#: intervention/forms.py:239
|
||||||
#: intervention/templates/intervention/detail/view.html:108
|
#: intervention/templates/intervention/detail/view.html:27
|
||||||
msgid "Recorded"
|
msgid "Share"
|
||||||
msgstr "Verzeichnet"
|
msgstr "Freigabe"
|
||||||
|
|
||||||
#: intervention/tables.py:45
|
#: intervention/forms.py:240
|
||||||
msgid "Editable"
|
msgid ""
|
||||||
msgstr "Freigegeben"
|
"Send this link to users who you want to have writing access on the data."
|
||||||
|
msgstr ""
|
||||||
#: intervention/tables.py:51
|
|
||||||
msgid "Last edit"
|
|
||||||
msgstr "Zuletzt bearbeitet"
|
|
||||||
|
|
||||||
#: intervention/tables.py:70
|
#: intervention/tables.py:70
|
||||||
msgid "Interventions"
|
msgid "Interventions"
|
||||||
msgstr "Eingriffe"
|
msgstr "Eingriffe"
|
||||||
|
|
||||||
#: intervention/tables.py:92 intervention/tables.py:170
|
#: intervention/tables.py:92 intervention/tables.py:172
|
||||||
#: intervention/templates/intervention/detail/view.html:12
|
#: intervention/templates/intervention/detail/view.html:12
|
||||||
#: konova/templates/konova/home.html:11 templates/navbar.html:22
|
#: konova/templates/konova/home.html:11 templates/navbar.html:22
|
||||||
msgid "Intervention"
|
msgid "Intervention"
|
||||||
msgstr "Eingriff"
|
msgstr "Eingriff"
|
||||||
|
|
||||||
#: intervention/tables.py:111
|
|
||||||
msgid "Not checked yet"
|
|
||||||
msgstr "Noch nicht geprüft"
|
|
||||||
|
|
||||||
#: intervention/tables.py:115
|
|
||||||
msgid "Checked on {} by {}"
|
|
||||||
msgstr "Am {} von {} geprüft worden"
|
|
||||||
|
|
||||||
#: intervention/tables.py:134
|
|
||||||
msgid "Not registered yet"
|
|
||||||
msgstr "Noch nicht verzeichnet"
|
|
||||||
|
|
||||||
#: intervention/tables.py:138
|
|
||||||
msgid "Registered on {} by {}"
|
|
||||||
msgstr "Am {} von {} verzeichnet worden"
|
|
||||||
|
|
||||||
#: intervention/tables.py:161
|
|
||||||
msgid "Full access granted"
|
|
||||||
msgstr "Für Sie freigegeben - Datensatz kann bearbeitet werden"
|
|
||||||
|
|
||||||
#: intervention/tables.py:161
|
|
||||||
msgid "Access not granted"
|
|
||||||
msgstr "Nicht freigegeben - Datensatz nur lesbar"
|
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/related-documents.html:10
|
#: intervention/templates/intervention/detail/related-documents.html:10
|
||||||
msgid "Documents"
|
msgid "Documents"
|
||||||
msgstr "Dokumente"
|
msgstr "Dokumente"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/related-documents.html:15
|
#: intervention/templates/intervention/detail/related-documents.html:15
|
||||||
#: konova/forms.py:221
|
#: konova/forms.py:222
|
||||||
msgid "Add new document"
|
msgid "Add new document"
|
||||||
msgstr "Neues Dokument hinzufügen"
|
msgstr "Neues Dokument hinzufügen"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/related-documents.html:31
|
#: intervention/templates/intervention/detail/related-documents.html:31
|
||||||
#: konova/forms.py:208
|
#: konova/forms.py:209
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr "Kommentar"
|
msgstr "Kommentar"
|
||||||
|
|
||||||
@ -310,64 +322,70 @@ msgstr "In LANIS öffnen"
|
|||||||
msgid "Public report"
|
msgid "Public report"
|
||||||
msgstr "Öffentlicher Bericht"
|
msgstr "Öffentlicher Bericht"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:28
|
#: intervention/templates/intervention/detail/view.html:31
|
||||||
msgid "Share"
|
|
||||||
msgstr "Freigabe"
|
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:33
|
|
||||||
msgid "Run check"
|
msgid "Run check"
|
||||||
msgstr "Prüfung vornehmen"
|
msgstr "Prüfung vornehmen"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:38
|
#: intervention/templates/intervention/detail/view.html:36
|
||||||
msgid "Record"
|
msgid "Record"
|
||||||
msgstr "Verzeichnen"
|
msgstr "Verzeichnen"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:43
|
#: intervention/templates/intervention/detail/view.html:41
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Bearbeiten"
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:48
|
#: intervention/templates/intervention/detail/view.html:46
|
||||||
#: venv/lib/python3.7/site-packages/django/forms/formsets.py:391
|
#: venv/lib/python3.7/site-packages/django/forms/formsets.py:391
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr "Löschen"
|
msgstr "Löschen"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:66
|
#: intervention/templates/intervention/detail/view.html:64
|
||||||
msgid "Process type"
|
msgid "Process type"
|
||||||
msgstr "Verfahrenstyp"
|
msgstr "Verfahrenstyp"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:74
|
#: intervention/templates/intervention/detail/view.html:72
|
||||||
msgid "Registration office"
|
msgid "Registration office"
|
||||||
msgstr "Zulassungsbehörde"
|
msgstr "Zulassungsbehörde"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:78
|
#: intervention/templates/intervention/detail/view.html:76
|
||||||
msgid "Registration office file number"
|
msgid "Registration office file number"
|
||||||
msgstr "Aktenzeichen Zulassungsbehörde"
|
msgstr "Aktenzeichen Zulassungsbehörde"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:82
|
#: intervention/templates/intervention/detail/view.html:80
|
||||||
msgid "Conservation office"
|
msgid "Conservation office"
|
||||||
msgstr "Naturschutzbehörde"
|
msgstr "Naturschutzbehörde"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:86
|
#: intervention/templates/intervention/detail/view.html:84
|
||||||
msgid "Conversation office file number"
|
msgid "Conversation office file number"
|
||||||
msgstr "Aktenzeichen Naturschutzbehörde"
|
msgstr "Aktenzeichen Naturschutzbehörde"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:122
|
#: intervention/templates/intervention/detail/view.html:99
|
||||||
msgid "Registration date"
|
msgid "Checked on "
|
||||||
msgstr "Datum Zulassung bzw. Satzungsbeschluss"
|
msgstr "Geprüft am "
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:126
|
#: intervention/templates/intervention/detail/view.html:99
|
||||||
msgid "Binding on"
|
#: intervention/templates/intervention/detail/view.html:113
|
||||||
msgstr "Datum Bestandskraft"
|
#: intervention/templates/intervention/detail/view.html:132
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:130
|
|
||||||
msgid "Last modified"
|
|
||||||
msgstr "Zuletzt bearbeitet"
|
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:134
|
|
||||||
msgid "by"
|
msgid "by"
|
||||||
msgstr "von"
|
msgstr "von"
|
||||||
|
|
||||||
#: intervention/templates/intervention/detail/view.html:143
|
#: intervention/templates/intervention/detail/view.html:113
|
||||||
|
msgid "Recorded on "
|
||||||
|
msgstr "Verzeichnet am"
|
||||||
|
|
||||||
|
#: intervention/templates/intervention/detail/view.html:120
|
||||||
|
msgid "Registration date"
|
||||||
|
msgstr "Datum Zulassung bzw. Satzungsbeschluss"
|
||||||
|
|
||||||
|
#: intervention/templates/intervention/detail/view.html:124
|
||||||
|
msgid "Binding on"
|
||||||
|
msgstr "Datum Bestandskraft"
|
||||||
|
|
||||||
|
#: intervention/templates/intervention/detail/view.html:128
|
||||||
|
msgid "Last modified"
|
||||||
|
msgstr "Zuletzt bearbeitet"
|
||||||
|
|
||||||
|
#: intervention/templates/intervention/detail/view.html:141
|
||||||
msgid "No geometry added, yet."
|
msgid "No geometry added, yet."
|
||||||
msgstr "Keine Geometrie vorhanden"
|
msgstr "Keine Geometrie vorhanden"
|
||||||
|
|
||||||
@ -397,6 +415,18 @@ msgstr ""
|
|||||||
msgid "{} edited"
|
msgid "{} edited"
|
||||||
msgstr "{} bearbeitet"
|
msgstr "{} bearbeitet"
|
||||||
|
|
||||||
|
#: intervention/views.py:225
|
||||||
|
msgid "{} has already been shared with you"
|
||||||
|
msgstr "{} wurde bereits für Sie freigegeben"
|
||||||
|
|
||||||
|
#: intervention/views.py:230
|
||||||
|
msgid "{} has been shared with you"
|
||||||
|
msgstr "{} ist nun für Sie freigegeben"
|
||||||
|
|
||||||
|
#: intervention/views.py:237
|
||||||
|
msgid "Share link invalid"
|
||||||
|
msgstr "Freigabelink ungültig"
|
||||||
|
|
||||||
#: konova/decorators.py:29
|
#: konova/decorators.py:29
|
||||||
msgid "You need to be staff to perform this action!"
|
msgid "You need to be staff to perform this action!"
|
||||||
msgstr "Hierfür müssen Sie Mitarbeiter sein!"
|
msgstr "Hierfür müssen Sie Mitarbeiter sein!"
|
||||||
@ -413,11 +443,11 @@ msgstr "Hierfür müssen Sie einer anderen Nutzergruppe angehören!"
|
|||||||
msgid "Not editable"
|
msgid "Not editable"
|
||||||
msgstr "Nicht editierbar"
|
msgstr "Nicht editierbar"
|
||||||
|
|
||||||
#: konova/forms.py:77 konova/forms.py:153
|
#: konova/forms.py:77 konova/forms.py:154
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Bestätige"
|
msgstr "Bestätige"
|
||||||
|
|
||||||
#: konova/forms.py:89 konova/forms.py:162
|
#: konova/forms.py:89 konova/forms.py:163
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Löschen"
|
msgstr "Löschen"
|
||||||
|
|
||||||
@ -425,24 +455,24 @@ msgstr "Löschen"
|
|||||||
msgid "You are about to remove {} {}"
|
msgid "You are about to remove {} {}"
|
||||||
msgstr "Sie sind dabei {} {} zu löschen"
|
msgstr "Sie sind dabei {} {} zu löschen"
|
||||||
|
|
||||||
#: konova/forms.py:163
|
#: konova/forms.py:164
|
||||||
msgid "Are you sure?"
|
msgid "Are you sure?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: konova/forms.py:187
|
#: konova/forms.py:188
|
||||||
msgid "When has this file been created? Important for photos."
|
msgid "When has this file been created? Important for photos."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: konova/forms.py:197
|
#: konova/forms.py:198
|
||||||
#: venv/lib/python3.7/site-packages/django/db/models/fields/files.py:231
|
#: venv/lib/python3.7/site-packages/django/db/models/fields/files.py:231
|
||||||
msgid "File"
|
msgid "File"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: konova/forms.py:199
|
#: konova/forms.py:200
|
||||||
msgid "Must be smaller than 15 Mb"
|
msgid "Must be smaller than 15 Mb"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: konova/forms.py:210
|
#: konova/forms.py:211
|
||||||
msgid "Additional comment on this file"
|
msgid "Additional comment on this file"
|
||||||
msgstr "Zusätzlicher Kommentar"
|
msgstr "Zusätzlicher Kommentar"
|
||||||
|
|
||||||
@ -530,7 +560,39 @@ msgstr ""
|
|||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Kontakt"
|
msgstr "Kontakt"
|
||||||
|
|
||||||
#: templates/modal/modal_form.html:24
|
#: templates/generic_index.html:19
|
||||||
|
msgid "New entry"
|
||||||
|
msgstr "Neuer Eintrag"
|
||||||
|
|
||||||
|
#: templates/generic_index.html:21
|
||||||
|
msgid "New"
|
||||||
|
msgstr "Neu"
|
||||||
|
|
||||||
|
#: templates/generic_index.html:36
|
||||||
|
msgid "Search for keywords"
|
||||||
|
msgstr "Nach Schlagwörtern suchen"
|
||||||
|
|
||||||
|
#: templates/generic_index.html:36
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Suchen"
|
||||||
|
|
||||||
|
#: templates/generic_index.html:37
|
||||||
|
msgid "Start search"
|
||||||
|
msgstr "Starte Suche"
|
||||||
|
|
||||||
|
#: templates/generic_index.html:49
|
||||||
|
msgid "Results per page"
|
||||||
|
msgstr "Treffer pro Seite"
|
||||||
|
|
||||||
|
#: templates/generic_index.html:73 templates/generic_index.html:79
|
||||||
|
msgid "Filter"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/generic_index.html:81
|
||||||
|
msgid "Apply filter"
|
||||||
|
msgstr "Filter anwenden"
|
||||||
|
|
||||||
|
#: templates/modal/modal_form.html:25
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "Weiter"
|
msgstr "Weiter"
|
||||||
|
|
||||||
@ -574,38 +636,6 @@ msgstr "Einstellungen"
|
|||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr "Abmelden"
|
msgstr "Abmelden"
|
||||||
|
|
||||||
#: templates/table.html:15
|
|
||||||
msgid "New entry"
|
|
||||||
msgstr "Neuer Eintrag"
|
|
||||||
|
|
||||||
#: templates/table.html:17
|
|
||||||
msgid "New"
|
|
||||||
msgstr "Neu"
|
|
||||||
|
|
||||||
#: templates/table.html:32
|
|
||||||
msgid "Search for keywords"
|
|
||||||
msgstr "Nach Schlagwörtern suchen"
|
|
||||||
|
|
||||||
#: templates/table.html:32
|
|
||||||
msgid "Search"
|
|
||||||
msgstr "Suchen"
|
|
||||||
|
|
||||||
#: templates/table.html:33
|
|
||||||
msgid "Start search"
|
|
||||||
msgstr "Starte Suche"
|
|
||||||
|
|
||||||
#: templates/table.html:46
|
|
||||||
msgid "Results per page"
|
|
||||||
msgstr "Treffer pro Seite"
|
|
||||||
|
|
||||||
#: templates/table.html:70 templates/table.html:77
|
|
||||||
msgid "Filter"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/table.html:79
|
|
||||||
msgid "Apply filter"
|
|
||||||
msgstr "Filter anwenden"
|
|
||||||
|
|
||||||
#: templates/table/generic_table_form.html:23
|
#: templates/table/generic_table_form.html:23
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
</article>
|
</article>
|
||||||
{% include 'table/generic_table_form_body.html' %}
|
{% include 'table/generic_table_form_body.html' %}
|
||||||
</div>
|
</div>
|
||||||
|
{% if form.render_submit %}
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="submit" class="btn btn-default">{% trans 'Continue' %}</button>
|
<button type="submit" class="btn btn-default">{% trans 'Continue' %}</button>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
</form>
|
</form>
|
Loading…
Reference in New Issue
Block a user