Compare commits

..

No commits in common. "52600c9a164d5a44a3a98ef32f4ad78cb58ceff1" and "b7ab9f6f553e649ed889a3672e48bccac70826c7" have entirely different histories.

11 changed files with 147 additions and 415 deletions

View File

@ -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, BaseModalForm from konova.forms import BaseForm
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
@ -227,81 +227,4 @@ class DummyFilterInput(forms.HiddenInput):
filter widget being rendered to the template. filter widget being rendered to the template.
""" """
template_name = "konova/custom_widgets/dummy-filter-input.html" template_name = "intervention/dummy-filter-input.html"
class TextToClipboardInput(forms.TextInput):
template_name = "konova/custom_widgets/text-to-clipboard-input.html"
class ShareInterventionForm(BaseModalForm):
url = forms.CharField(
label=_("Share link"),
label_suffix="",
help_text=_("Send this link to users who you want to have writing access on the data"),
required=False,
widget=TextToClipboardInput(
attrs={
"readonly": True
}
)
)
users = forms.MultipleChoiceField(
label=_("Shared with"),
label_suffix="",
required=True,
help_text=_("Remove check to remove access for this user"),
widget=forms.CheckboxSelectMultiple(
attrs={
"class": "list-unstyled",
}
),
choices=[]
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form_title = _("Share")
self.form_caption = _("Share settings for {}").format(self.instance.identifier)
self.template = "modal/modal_form.html"
# Make sure an access_token is set
if self.instance.access_token is None:
self.instance.generate_access_token()
self._init_fields()
def _init_fields(self):
""" Wraps initializing of fields
Returns:
"""
# Initialize share_link field
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
)
# Initialize users field
users = self.instance.users.all()
choices = []
for n in users:
choices.append(
(n.id, n.username)
)
self.fields["users"].choices = choices
u_ids = list(users.values_list("id", flat=True))
self.initialize_form_field(
"users",
u_ids
)
def save(self):
accessing_users = User.objects.filter(
id__in=self.cleaned_data["users"]
)
self.instance.users.set(accessing_users)

View File

@ -13,7 +13,6 @@ 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
@ -93,12 +92,6 @@ 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)
@ -146,40 +139,6 @@ 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

View File

@ -24,9 +24,11 @@
</button> </button>
</a> </a>
{% if has_access %} {% if has_access %}
<button class="btn btn-default btn-modal mr-2" title="{% trans 'Share' %}" data-form-url="{% url 'intervention:share-create' intervention.id %}"> <a href="{% url 'home' %}" class="mr-2">
{% fa5_icon 'share-alt' %} <button class="btn btn-default" title="{% trans 'Share' %}">
</button> {% fa5_icon 'share-alt' %}
</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' %}

View File

@ -7,8 +7,7 @@ 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, share_view, \ from intervention.views import index_view, new_view, open_view, edit_view, remove_view, new_document_view
create_share_view
app_name = "intervention" app_name = "intervention"
urlpatterns = [ urlpatterns = [
@ -18,6 +17,4 @@ 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'),
] ]

View File

@ -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, ShareInterventionForm from intervention.forms import NewInterventionForm, EditInterventionForm
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,77 +198,3 @@ 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 == "POST":
if form.is_valid():
form.save()
messages.info(
request,
_("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

View File

@ -109,7 +109,6 @@ class BaseModalForm(BaseForm, BSModalForm):
""" """
is_modal_form = True is_modal_form = True
render_submit = True
class SimpleGeomForm(BaseForm): class SimpleGeomForm(BaseForm):

View File

@ -1,18 +0,0 @@
{% load i18n fontawesome_5 %}
<div class="input-group" title="{{ widget.value|stringformat:'s' }}">
<input aria-describedby="copy-btn" type="{{ widget.type }}" name="{{ widget.name }}"{% if widget.value != None %} value="{{ widget.value|stringformat:'s' }}"{% endif %}{% include "django/forms/widgets/attrs.html" %}>
<div class="input-group-append" onclick="copyClipboard()">
<span id="copy-btn" class="btn btn-default" value="{% trans 'Copy to clipboard' %}" title="{% trans 'Copy to clipboard' %}">{% fa5_icon 'clipboard' 'far' %}</span>
</div>
</div>
<script>
function copyClipboard() {
var copyText = document.getElementById("id_{{ widget.name }}");
copyText.select();
copyText.setSelectionRange(0, 99999); /* For mobile devices */
document.execCommand("copy");
alert("{% trans 'Copied to clipboard' %}");
}
</script>

Binary file not shown.

View File

@ -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:26 intervention/filters.py:40 #: intervention/filters.py:25 intervention/filters.py:31
#: intervention/filters.py:47 intervention/filters.py:48 konova/forms.py:78 #: intervention/filters.py:38 intervention/filters.py:39 konova/forms.py:78
#: konova/forms.py:155 konova/forms.py:182 konova/forms.py:187 #: konova/forms.py:154 konova/forms.py:181 konova/forms.py:186
#: konova/forms.py:199 konova/forms.py:210 konova/forms.py:223 user/forms.py:38 #: konova/forms.py:198 konova/forms.py:209 konova/forms.py:222 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-30 15:00+0200\n" "POT-Creation-Date: 2021-07-28 08:51+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,97 +57,57 @@ 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:24 compensation/tables.py:164 #: compensation/tables.py:18 compensation/tables.py:71 intervention/forms.py:26
#: intervention/forms.py:26 intervention/tables.py:23 #: 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:29 compensation/tables.py:169 #: compensation/tables.py:23 compensation/tables.py:76 intervention/forms.py:33
#: intervention/forms.py:33 intervention/tables.py:28 #: 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:60 konova/forms.py:181 #: intervention/templates/intervention/detail/view.html:62 konova/forms.py:180
msgid "Title" msgid "Title"
msgstr "Bezeichnung" msgstr "Bezeichnung"
#: compensation/tables.py:34 intervention/tables.py:33 #: compensation/tables.py:28 compensation/tables.py:81 konova/forms.py:185
#: intervention/templates/intervention/detail/view.html:92 msgid "Created on"
msgid "Checked" msgstr "Erstellt"
msgstr "Geprüft"
#: compensation/tables.py:40 intervention/tables.py:39 #: compensation/tables.py:33 compensation/tables.py:86
#: intervention/templates/intervention/detail/view.html:106 msgid "Actions"
msgid "Recorded" msgstr "Aktionen"
msgstr "Verzeichnet"
#: compensation/tables.py:46 intervention/tables.py:45 #: compensation/tables.py:44
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:83 compensation/tables.py:200 #: compensation/tables.py:51 compensation/tables.py:104
#: 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:104 intervention/tables.py:111 #: compensation/tables.py:54 compensation/tables.py:107
msgid "Not checked yet" #: intervention/tables.py:92 intervention/tables.py:173
msgstr "Noch nicht geprüft" msgid "Open {}"
msgstr "Öffne {}"
#: compensation/tables.py:109 intervention/tables.py:116 #: compensation/tables.py:59 compensation/tables.py:112
msgid "Checked on {} by {}" #: intervention/tables.py:177
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:209 intervention/tables.py:183 #: compensation/tables.py:63 compensation/tables.py:116
#: 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"
@ -161,19 +121,19 @@ msgstr "Es gab einen Fehler im Formular."
msgid "Payment removed" msgid "Payment removed"
msgstr "Zahlung gelöscht" msgstr "Zahlung gelöscht"
#: intervention/filters.py:25 #: intervention/filters.py:24
msgid "Show unshared" msgid "Show unshared"
msgstr "Nicht freigegebene anzeigen" msgstr "Nicht freigegebene anzeigen"
#: intervention/filters.py:39 #: intervention/filters.py:30
msgid "Show recorded" msgid "Show recorded"
msgstr "Verzeichnete anzeigen" msgstr "Verzeichnete anzeigen"
#: intervention/filters.py:51 #: intervention/filters.py:42
msgid "District" msgid "District"
msgstr "Gemarkung" msgstr "Gemarkung"
#: intervention/filters.py:52 #: intervention/filters.py:43
msgid "Search for district" msgid "Search for district"
msgstr "Nach Gemarkung suchen" msgstr "Nach Gemarkung suchen"
@ -190,7 +150,7 @@ msgid "Which intervention type is this"
msgstr "Welcher Eingriffstyp" msgstr "Welcher Eingriffstyp"
#: intervention/forms.py:44 #: intervention/forms.py:44
#: intervention/templates/intervention/detail/view.html:68 #: intervention/templates/intervention/detail/view.html:70
msgid "Law" msgid "Law"
msgstr "Gesetz" msgstr "Gesetz"
@ -199,7 +159,7 @@ msgid "Based on which law"
msgstr "Basiert auf welchem Recht" msgstr "Basiert auf welchem Recht"
#: intervention/forms.py:50 #: intervention/forms.py:50
#: intervention/templates/intervention/detail/view.html:88 #: intervention/templates/intervention/detail/view.html:90
msgid "Intervention handler" msgid "Intervention handler"
msgstr "Eingriffsverursacher" msgstr "Eingriffsverursacher"
@ -247,53 +207,69 @@ msgstr "Neuer Eingriff"
msgid "Edit intervention" msgid "Edit intervention"
msgstr "Eingriff bearbeiten" msgstr "Eingriff bearbeiten"
#: intervention/forms.py:239 #: intervention/tables.py:33
msgid "Share link" #: intervention/templates/intervention/detail/view.html:94
msgstr "Freigabelink" msgid "Checked"
msgstr "Geprüft"
#: intervention/forms.py:241 #: intervention/tables.py:39
msgid "Send this link to users who you want to have writing access on the data" #: intervention/templates/intervention/detail/view.html:108
msgstr "" msgid "Recorded"
"Andere Nutzer erhalten über diesen Link Zugriff auf die Daten" msgstr "Verzeichnet"
#: intervention/forms.py:250 #: intervention/tables.py:45
msgid "Shared with" msgid "Editable"
msgstr "Freigegeben für" msgstr "Freigegeben"
#: intervention/forms.py:253 #: intervention/tables.py:51
msgid "Remove check to remove access for this user" msgid "Last edit"
msgstr "Wählen Sie die Nutzer ab, die keinen Zugriff mehr haben sollen" msgstr "Zuletzt bearbeitet"
#: intervention/forms.py:264
#: intervention/templates/intervention/detail/view.html:27
msgid "Share"
msgstr "Freigabe"
#: intervention/forms.py:265
msgid "Share settings for {}"
msgstr "Freigabe Einstellungen für {}"
#: intervention/tables.py:70 #: intervention/tables.py:70
msgid "Interventions" msgid "Interventions"
msgstr "Eingriffe" msgstr "Eingriffe"
#: intervention/tables.py:92 intervention/tables.py:172 #: intervention/tables.py:92 intervention/tables.py:170
#: 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:222 #: konova/forms.py:221
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:209 #: konova/forms.py:208
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
@ -334,70 +310,64 @@ msgstr "In LANIS öffnen"
msgid "Public report" msgid "Public report"
msgstr "Öffentlicher Bericht" msgstr "Öffentlicher Bericht"
#: intervention/templates/intervention/detail/view.html:31 #: intervention/templates/intervention/detail/view.html:28
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:36 #: intervention/templates/intervention/detail/view.html:38
msgid "Record" msgid "Record"
msgstr "Verzeichnen" msgstr "Verzeichnen"
#: intervention/templates/intervention/detail/view.html:41 #: intervention/templates/intervention/detail/view.html:43
msgid "Edit" msgid "Edit"
msgstr "Bearbeiten" msgstr "Bearbeiten"
#: intervention/templates/intervention/detail/view.html:46 #: intervention/templates/intervention/detail/view.html:48
#: 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:64 #: intervention/templates/intervention/detail/view.html:66
msgid "Process type" msgid "Process type"
msgstr "Verfahrenstyp" msgstr "Verfahrenstyp"
#: intervention/templates/intervention/detail/view.html:72 #: intervention/templates/intervention/detail/view.html:74
msgid "Registration office" msgid "Registration office"
msgstr "Zulassungsbehörde" msgstr "Zulassungsbehörde"
#: intervention/templates/intervention/detail/view.html:76 #: intervention/templates/intervention/detail/view.html:78
msgid "Registration office file number" msgid "Registration office file number"
msgstr "Aktenzeichen Zulassungsbehörde" msgstr "Aktenzeichen Zulassungsbehörde"
#: intervention/templates/intervention/detail/view.html:80 #: intervention/templates/intervention/detail/view.html:82
msgid "Conservation office" msgid "Conservation office"
msgstr "Naturschutzbehörde" msgstr "Naturschutzbehörde"
#: intervention/templates/intervention/detail/view.html:84 #: intervention/templates/intervention/detail/view.html:86
msgid "Conversation office file number" msgid "Conversation office file number"
msgstr "Aktenzeichen Naturschutzbehörde" msgstr "Aktenzeichen Naturschutzbehörde"
#: intervention/templates/intervention/detail/view.html:99 #: intervention/templates/intervention/detail/view.html:122
msgid "Checked on "
msgstr "Geprüft am "
#: intervention/templates/intervention/detail/view.html:99
#: intervention/templates/intervention/detail/view.html:113
#: intervention/templates/intervention/detail/view.html:132
msgid "by"
msgstr "von"
#: intervention/templates/intervention/detail/view.html:113
msgid "Recorded on "
msgstr "Verzeichnet am"
#: intervention/templates/intervention/detail/view.html:120
msgid "Registration date" msgid "Registration date"
msgstr "Datum Zulassung bzw. Satzungsbeschluss" msgstr "Datum Zulassung bzw. Satzungsbeschluss"
#: intervention/templates/intervention/detail/view.html:124 #: intervention/templates/intervention/detail/view.html:126
msgid "Binding on" msgid "Binding on"
msgstr "Datum Bestandskraft" msgstr "Datum Bestandskraft"
#: intervention/templates/intervention/detail/view.html:128 #: intervention/templates/intervention/detail/view.html:130
msgid "Last modified" msgid "Last modified"
msgstr "Zuletzt bearbeitet" msgstr "Zuletzt bearbeitet"
#: intervention/templates/intervention/detail/view.html:141 #: intervention/templates/intervention/detail/view.html:134
msgid "by"
msgstr "von"
#: intervention/templates/intervention/detail/view.html:143
msgid "No geometry added, yet." msgid "No geometry added, yet."
msgstr "Keine Geometrie vorhanden" msgstr "Keine Geometrie vorhanden"
@ -427,22 +397,6 @@ 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"
#: intervention/views.py:262
msgid "Share settings updated"
msgstr "Freigabe Einstellungen aktualisiert"
#: 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!"
@ -459,11 +413,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:154 #: konova/forms.py:77 konova/forms.py:153
msgid "Confirm" msgid "Confirm"
msgstr "Bestätige" msgstr "Bestätige"
#: konova/forms.py:89 konova/forms.py:163 #: konova/forms.py:89 konova/forms.py:162
msgid "Remove" msgid "Remove"
msgstr "Löschen" msgstr "Löschen"
@ -471,24 +425,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:164 #: konova/forms.py:163
msgid "Are you sure?" msgid "Are you sure?"
msgstr "" msgstr ""
#: konova/forms.py:188 #: konova/forms.py:187
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:198 #: konova/forms.py:197
#: 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:200 #: konova/forms.py:199
msgid "Must be smaller than 15 Mb" msgid "Must be smaller than 15 Mb"
msgstr "" msgstr ""
#: konova/forms.py:211 #: konova/forms.py:210
msgid "Additional comment on this file" msgid "Additional comment on this file"
msgstr "Zusätzlicher Kommentar" msgstr "Zusätzlicher Kommentar"
@ -516,14 +470,6 @@ msgstr "Wenn meine freigegebenen Daten gelöscht wurden"
msgid "On registered data edited" msgid "On registered data edited"
msgstr "Wenn meine freigegebenen Daten bearbeitet wurden" msgstr "Wenn meine freigegebenen Daten bearbeitet wurden"
#: konova/templates/konova/custom_widgets/text-to-clipboard-input.html:6
msgid "Copy to clipboard"
msgstr "In Zwischenablage kopieren"
#: konova/templates/konova/custom_widgets/text-to-clipboard-input.html:16
msgid "Copied to clipboard"
msgstr "In Zwischenablage kopiert"
#: konova/templates/konova/home.html:23 konova/templates/konova/home.html:61 #: konova/templates/konova/home.html:23 konova/templates/konova/home.html:61
#: konova/templates/konova/home.html:100 #: konova/templates/konova/home.html:100
msgid "Total" msgid "Total"
@ -584,39 +530,7 @@ msgstr ""
msgid "Contact" msgid "Contact"
msgstr "Kontakt" msgstr "Kontakt"
#: templates/generic_index.html:19 #: templates/modal/modal_form.html:24
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"
@ -660,6 +574,38 @@ 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"

View File

@ -20,9 +20,7 @@
</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>