#7 New forms WIP

* adds saving functionality for new intervention form
* refactors new identifier generating, so a pre-generated identifier from a new element form will be checked again before saving
* adds css fixes for disturbing input field:focus bugs
* adds missing csrf token to new collapsible form
* adds/updates translations
* introduces mark_as_deleted as only marking instead of using delete() which will really delete from the db
This commit is contained in:
mipel 2021-09-23 15:05:17 +02:00
parent 951477c58f
commit 9b728e5d10
11 changed files with 375 additions and 182 deletions

View File

@ -74,6 +74,9 @@ class NewPaymentForm(BaseModalForm):
)
)
# Define w-100 for all form fields
full_width_fields = True
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.intervention = self.instance

View File

@ -8,23 +8,21 @@ Created on: 02.12.20
from dal import autocomplete
from django import forms
from django.contrib.auth.models import User
from django.contrib.gis import forms as gis_forms
from django.contrib.gis.geos import Polygon
from django.db import transaction
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from codelist.models import KonovaCode
from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_PROCESS_TYPE_ID, CODELIST_LAW_ID, \
from codelist.settings import CODELIST_PROCESS_TYPE_ID, CODELIST_LAW_ID, \
CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID
from compensation.models import EcoAccountDeduction, EcoAccount
from intervention.models import Intervention, Revocation, RevocationDocument
from konova.forms import BaseForm, BaseModalForm
from konova.settings import DEFAULT_LAT, DEFAULT_LON, DEFAULT_ZOOM, ZB_GROUP, ETS_GROUP
from intervention.models import Intervention, Revocation, RevocationDocument, LegalData, ResponsibilityData
from konova.forms import BaseForm, BaseModalForm, SimpleGeomForm
from konova.settings import ZB_GROUP, ETS_GROUP
from konova.utils.general import format_german_float
from konova.utils.messenger import Messenger
from konova.utils.user_checks import in_group
from organisation.models import Organisation
from user.models import UserActionLogEntry, UserAction
@ -40,10 +38,16 @@ class NewInterventionForm(BaseForm):
label_suffix="",
help_text=_("An explanatory name"),
max_length=255,
widget=forms.TextInput(
attrs={
"placeholder": _("Construction XY; Location ABC")
}
)
)
type = forms.ModelChoiceField(
label=_("Process type"),
label_suffix="",
help_text=_(""),
required=False,
queryset=KonovaCode.objects.filter(
is_archived=False,
@ -107,12 +111,22 @@ class NewInterventionForm(BaseForm):
label_suffix="",
max_length=255,
required=False,
widget=forms.TextInput(
attrs={
"placeholder": _("ZB-123/ABC.456")
}
)
)
conservation_office_file_number = forms.CharField(
label=_("Conservation office file number"),
label_suffix="",
max_length=255,
required=False,
widget=forms.TextInput(
attrs={
"placeholder": _("ETS-123/ABC.456")
}
)
)
handler = forms.CharField(
label=_("Intervention handler"),
@ -120,20 +134,45 @@ class NewInterventionForm(BaseForm):
max_length=255,
required=False,
help_text=_("Who performs the intervention"),
)
geometry = gis_forms.MultiPolygonField(
widget=gis_forms.OSMWidget(
widget=forms.TextInput(
attrs={
"default_lat": DEFAULT_LAT,
"default_lon": DEFAULT_LON,
"default_zoom": DEFAULT_ZOOM,
'map_width': 800,
'map_height': 500
"placeholder": _("Company Mustermann")
}
)
)
registration_date = forms.DateField(
label=_("Registration date"),
label_suffix=_(""),
required=False,
widget=forms.DateInput(
attrs={
"type": "date",
},
),
label=_("Map"),
format="%d.%m.%Y"
)
)
binding_date = forms.DateField(
label=_("Binding on"),
label_suffix=_(""),
required=False,
widget=forms.DateInput(
attrs={
"type": "date",
},
format="%d.%m.%Y"
)
)
comment = forms.CharField(
label_suffix="",
help_text=_("Where does the intervention take place")
label=_("Comment"),
required=False,
help_text=_("Additional comment"),
widget=forms.Textarea(
attrs={
"rows": 5,
"class": "w-100"
}
)
)
def __init__(self, *args, **kwargs):
@ -142,30 +181,69 @@ class NewInterventionForm(BaseForm):
self.action_url = reverse("intervention:new")
self.cancel_redirect = reverse("intervention:index")
def save(self, user: User):
tmp_intervention = Intervention()
identifier = tmp_intervention._generate_new_identifier()
self.initialize_form_field("identifier", identifier)
def save(self, user: User, geom_form: SimpleGeomForm):
with transaction.atomic():
# Fetch data from cleaned POST values
identifier = self.cleaned_data.get("identifier", None)
title = self.cleaned_data.get("title", None)
_type = self.cleaned_data.get("type", None)
laws = self.cleaned_data.get("laws", None)
handler = self.cleaned_data.get("handler", None)
geometry = self.cleaned_data.get("geometry", Polygon())
registration_office = self.cleaned_data.get("registration_office", None)
conservation_office = self.cleaned_data.get("conservation_office", None)
conservation_office_file_number = self.cleaned_data.get("conservation_office_file_number", None)
registration_office_file_number = self.cleaned_data.get("registration_office_file_number", None)
binding_date = self.cleaned_data.get("binding_date", None)
registration_date = self.cleaned_data.get("registration_date", None)
comment = self.cleaned_data.get("comment", None)
# Create log entry
action = UserActionLogEntry.objects.create(
user=user,
action=UserAction.CREATED,
)
intervention = Intervention(
# Create legal data object (without M2M laws first)
legal_data = LegalData.objects.create(
registration_date=registration_date,
binding_date=binding_date,
process_type=_type,
)
# Then add the M2M laws to the object
legal_data.laws.set(laws)
# Create responsible data object
responsibility_data = ResponsibilityData.objects.create(
registration_office=registration_office,
conservation_office=conservation_office,
registration_file_number=registration_office_file_number,
conservation_file_number=conservation_office_file_number,
handler=handler,
)
# Process the geometry form
geometry = geom_form.save(action)
# Finally create main object, holding the other objects
intervention = Intervention.objects.create(
identifier=identifier,
title=title,
type=_type,
laws=laws,
handler=handler,
geometry=geometry,
responsible=responsibility_data,
legal=legal_data,
created=action,
geometry=geometry,
comment=comment,
)
intervention.save()
# Add the log entry to the main objects log list
intervention.log.add(action)
# Add the performing user as the first user having access to the data
intervention.users.add(user)
return intervention
@ -384,6 +462,9 @@ class NewRevocationForm(BaseModalForm):
)
)
# Define w-100 for all form fields
full_width_fields = True
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form_title = _("Add revocation")
@ -532,6 +613,9 @@ class NewDeductionForm(BaseModalForm):
),
)
# Define w-100 for all form fields
full_width_fields = True
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form_title = _("New Deduction")

View File

@ -260,14 +260,41 @@ class Intervention(BaseObject):
self.save()
def save(self, *args, **kwargs):
""" Custom save functionality
Performs some pre-save checks:
1. Checking for existing identifiers
Args:
*args ():
**kwargs ():
Returns:
"""
if self.identifier is None or len(self.identifier) == 0:
# Create new identifier
new_id = self._generate_new_identifier()
while Intervention.objects.filter(identifier=new_id).exists():
new_id = self._generate_new_identifier()
self.identifier = new_id
# No identifier given
self.identifier = self._generate_new_identifier()
# Before saving, make sure the set identifier is not used, yet
while Intervention.objects.filter(identifier=self.identifier).exists():
self.identifier = self._generate_new_identifier()
super().save(*args, **kwargs)
def delete(self, using=None, keep_parents=False):
to_delete = [
self.legal,
self.responsible,
self.geometry,
self.log.all()
]
for entry in to_delete:
try:
entry.delete()
except AttributeError:
pass
super().delete(using, keep_parents)
def quality_check(self) -> list:
""" Quality check

View File

@ -1,6 +1,17 @@
{% extends 'base.html' %}
{% load i18n l10n %}
{% block head %}
{% comment %}
dal documentation (django-autocomplete-light) states using form.media for adding needed scripts.
This does not work properly with modal forms, as the scripts are not loaded properly inside the modal.
Therefore the script linkages from form.media have been extracted and put inside dal/scripts.html to ensure
these scripts are loaded when needed.
{% endcomment %}
{% include 'dal/scripts.html' %}
{% endblock %}
{% block body %}
<h2>{{data_form.form_title}}</h2>
{% include 'form/main_data_collapse_form.html' %}
{% endblock %}

View File

@ -59,11 +59,18 @@ def new_view(request: HttpRequest):
"""
template = "intervention/new/view.html"
form = NewInterventionForm(request.POST or None)
data_form = NewInterventionForm(request.POST or None)
geom_form = SimpleGeomForm(request.POST or None, read_only=False)
if request.method == "POST":
if form.is_valid():
intervention = form.save(request.user)
messages.success(request, _("Intervention {} added").format(intervention.title))
if data_form.is_valid() and geom_form.is_valid():
generated_identifier = data_form.cleaned_data.get("identifier", None)
intervention = data_form.save(request.user, geom_form)
if generated_identifier != intervention.identifier:
messages.info(
request,
_("The identifier '{}' had to be changed to '{}' since another entry has been added in the meanwhile, which uses this identifier")
)
messages.success(request, _("Intervention {} added").format(intervention.identifier))
return redirect("intervention:index")
else:
messages.error(request, _("Invalid input"))
@ -71,7 +78,8 @@ def new_view(request: HttpRequest):
# For clarification: nothing in this case
pass
context = {
"form": form,
"data_form": data_form,
"geom_form": geom_form,
}
context = BaseContext(request, context).context
return render(request, template, context)

View File

@ -13,8 +13,8 @@ from bootstrap_modal_forms.utils import is_ajax
from django import forms
from django.contrib import messages
from django.contrib.auth.models import User
from django.contrib.gis.forms import GeometryField, OSMWidget
from django.contrib.gis.geos import Polygon
from django.contrib.gis.forms import OSMWidget, MultiPolygonField
from django.contrib.gis.geos import Polygon, MultiPolygon
from django.db import transaction
from django.http import HttpRequest, HttpResponseRedirect
from django.shortcuts import render
@ -25,7 +25,8 @@ from compensation.models import EcoAccount, Compensation, EcoAccountDocument, Co
from ema.models import Ema, EmaDocument
from intervention.models import Intervention, Revocation, RevocationDocument, InterventionDocument
from konova.contexts import BaseContext
from konova.models import BaseObject
from konova.models import BaseObject, Geometry
from konova.settings import DEFAULT_SRID
from konova.utils.message_templates import FORM_INVALID
from user.models import UserActionLogEntry, UserAction
@ -187,8 +188,7 @@ class BaseModalForm(BaseForm, BSModalForm):
full_width_fields = False
template = "modal/modal_form.html"
def __init__(self, full_width_fields: bool = True, *args, **kwargs):
self.full_width_fields = full_width_fields
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.full_width_fields:
# Automatically add bootstrap w-100 class for maximum width of form fields in modals
@ -243,18 +243,26 @@ class SimpleGeomForm(BaseForm):
""" A geometry form for rendering geometry read-only using a widget
"""
geom = GeometryField(
geom = MultiPolygonField(
srid=DEFAULT_SRID,
label=_("Geometry"),
help_text=_(""),
label_suffix="",
required=False,
disabled=True,
disabled=False,
widget=OSMWidget(
attrs={
"map_width": 600,
"map_height": 400,
# default_zoom defines the nearest possible zoom level from which the JS automatically
# zooms out if geometry requires a larger view port. So define a larger range for smaller geometries
"default_zoom": 25,
}
)
)
def __init__(self, *args, **kwargs):
read_only = kwargs.pop("read_only", True)
super().__init__(*args, **kwargs)
# Initialize geometry
@ -267,8 +275,17 @@ class SimpleGeomForm(BaseForm):
geom = Polygon.from_bbox([0, 0, 0, 0])
# Zoom out to a very high level, so the user can see directly that there is no geometry for this entry
self.fields["geom"].widget.attrs["default_zoom"] = 1
if read_only:
self.initialize_form_field("geom", geom)
self.area = geom.area
self.fields["geom"].disabled = True
def save(self, action: UserActionLogEntry):
geometry = Geometry.objects.create(
geom=self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID)),
created=action,
)
return geometry
class RemoveModalForm(BaseModalForm):
@ -294,15 +311,7 @@ class RemoveModalForm(BaseModalForm):
def save(self):
if isinstance(self.instance, BaseObject):
with transaction.atomic():
action = UserActionLogEntry.objects.create(
user=self.user,
timestamp=timezone.now(),
action=UserAction.DELETED,
)
self.instance.deleted = action
self.instance.log.add(action)
self.instance.save()
self.instance.mark_as_deleted(self.user)
else:
# If the class does not provide restorable delete functionality, we must delete the entry finally
self.instance.delete()
@ -360,6 +369,9 @@ class NewDocumentForm(BaseModalForm):
Ema: EmaDocument,
}
# Define w-100 for all form fields
full_width_fields = True
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form_title = _("Add new document")

View File

@ -9,6 +9,8 @@ import os
import uuid
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.utils import timezone
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from django.contrib.gis.db.models import MultiPolygonField
@ -61,8 +63,20 @@ class BaseResource(UuidModel):
abstract = True
def delete(self, using=None, keep_parents=False):
if self.created:
""" Base deletin of a resource
Args:
using ():
keep_parents ():
Returns:
"""
try:
self.created.delete()
except ObjectDoesNotExist:
# Object does not exist anymore - we can skip this
pass
super().delete()
@ -81,14 +95,13 @@ class BaseObject(BaseResource):
class Meta:
abstract = True
def delete(self, *args, **kwargs):
""" Custom delete functionality
def mark_as_deleted(self, user: User):
""" Mark an entry as deleted
Does not delete from database but sets a timestamp for being deleted on and which user deleted the object
Args:
*args ():
**kwargs ():
user (User): The performing user
Returns:
@ -97,13 +110,14 @@ class BaseObject(BaseResource):
# Nothing to do here
return
_user = kwargs.get("user", None)
with transaction.atomic():
action = UserActionLogEntry.objects.create(
user=_user,
action=UserAction.DELETED
user=user,
action=UserAction.DELETED,
timestamp=timezone.now()
)
self.deleted = action
self.log.add(action)
self.save()
def add_log_entry(self, action: UserAction, user: User, comment: str):

View File

@ -60,8 +60,18 @@ a {
color: var(--rlp-red);
}
input[type=text] {
width: 100%;
input[type=text], input[type=date] {
border: 1px solid gray;
border-radius: 0.2rem;
padding: 0.3rem 0.5rem;
}
input:focus, textarea:focus, select:focus{
outline: none;
border-color: var(--rlp-red);
box-shadow: 0 0 3px var(--rlp-red);
-moz-box-shadow: 0 0 3px var(--rlp-red);
-webkit-box-shadow: 0 0 3px var(--rlp-red);
}
.body-content{
@ -137,6 +147,13 @@ input[type=text] {
height: 8rem;
}
/**
Overwrites bootstrap .btn:focus box shadow color
*/
.btn:focus{
box-shadow: 0 0 5px .2rem var(--rlp-gray-light);
}
.btn-default{
color: white;
background-color: var(--rlp-red);
@ -175,13 +192,6 @@ input[type=text] {
background-color: var(--rlp-gray-light);
}
input:focus, textarea:focus, select:focus{
border-color: var(--rlp-red) !important;
box-shadow: 0 0 3px var(--rlp-red) !important;
-moz-box-shadow: 0 0 3px var(--rlp-red) !important;
-webkit-box-shadow: 0 0 3px var(--rlp-red) !important;
}
.check-star{
color: goldenrod;
}
@ -220,3 +230,6 @@ No other approach worked to get the autocomplete fields to full width of parent
.select2-container{
width: 100% !important;
}
.select2-results__option--highlighted{
background-color: var(--rlp-red) !important;
}

Binary file not shown.

View File

@ -7,16 +7,17 @@
#: compensation/forms.py:67 compensation/forms.py:264 compensation/forms.py:345
#: intervention/filters.py:26 intervention/filters.py:40
#: intervention/filters.py:47 intervention/filters.py:48
#: intervention/forms.py:352 intervention/forms.py:364
#: intervention/forms.py:377 konova/forms.py:139 konova/forms.py:282
#: konova/forms.py:317 konova/forms.py:322 konova/forms.py:334
#: konova/forms.py:346 konova/forms.py:366 user/forms.py:38
#: intervention/forms.py:56 intervention/forms.py:151 intervention/forms.py:162
#: intervention/forms.py:422 intervention/forms.py:434
#: intervention/forms.py:447 konova/forms.py:140 konova/forms.py:250
#: konova/forms.py:296 konova/forms.py:331 konova/forms.py:336
#: konova/forms.py:348 konova/forms.py:360 konova/forms.py:380 user/forms.py:38
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-21 14:24+0200\n"
"POT-Creation-Date: 2021-09-23 12:46+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"
@ -53,16 +54,16 @@ msgstr "Zahlung wird an diesem Datum erwartet"
#: ema/templates/ema/detail/includes/actions.html:34
#: ema/templates/ema/detail/includes/deadlines.html:34
#: ema/templates/ema/detail/includes/documents.html:31
#: intervention/forms.py:376
#: intervention/forms.py:446
#: intervention/templates/intervention/detail/includes/documents.html:31
#: intervention/templates/intervention/detail/includes/payments.html:34
#: intervention/templates/intervention/detail/includes/revocation.html:38
#: konova/forms.py:345
#: konova/forms.py:359
msgid "Comment"
msgstr "Kommentar"
#: compensation/forms.py:68 compensation/forms.py:265 compensation/forms.py:346
#: intervention/forms.py:378 konova/forms.py:347
#: intervention/forms.py:448 konova/forms.py:361
msgid "Additional comment, maximum {} letters"
msgstr "Zusätzlicher Kommentar, maximal {} Zeichen"
@ -97,11 +98,11 @@ msgstr "Biotoptyp wählen"
#: compensation/templates/compensation/detail/eco_account/includes/states-before.html:36
#: ema/templates/ema/detail/includes/states-after.html:36
#: ema/templates/ema/detail/includes/states-before.html:36
#: intervention/forms.py:517
#: intervention/forms.py:587
msgid "Surface"
msgstr "Fläche"
#: compensation/forms.py:155 intervention/forms.py:519
#: compensation/forms.py:155 intervention/forms.py:589
msgid "in m²"
msgstr ""
@ -117,7 +118,7 @@ msgstr "Geben Sie die Daten des neuen Zustandes ein"
msgid "Added state"
msgstr "Zustand hinzugefügt"
#: compensation/forms.py:185 konova/forms.py:198
#: compensation/forms.py:185 konova/forms.py:199
msgid "Object removed"
msgstr "Objekt entfernt"
@ -133,7 +134,7 @@ msgstr "Fristart wählen"
#: compensation/templates/compensation/detail/compensation/includes/deadlines.html:31
#: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:31
#: ema/templates/ema/detail/includes/deadlines.html:31
#: intervention/forms.py:351
#: intervention/forms.py:421
msgid "Date"
msgstr "Datum"
@ -257,7 +258,7 @@ msgstr ""
"wollen. Kontaktieren Sie die für die Abbuchungen verantwortlichen Nutzer!"
#: compensation/tables.py:24 compensation/tables.py:164 ema/tables.py:28
#: intervention/forms.py:33 intervention/tables.py:23
#: intervention/forms.py:37 intervention/tables.py:23
#: intervention/templates/intervention/detail/includes/compensations.html:30
msgid "Identifier"
msgstr "Kennung"
@ -268,11 +269,11 @@ msgstr "Kennung"
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:28
#: compensation/templates/compensation/detail/eco_account/view.html:31
#: ema/tables.py:33 ema/templates/ema/detail/includes/documents.html:28
#: ema/templates/ema/detail/view.html:24 intervention/forms.py:39
#: ema/templates/ema/detail/view.html:24 intervention/forms.py:43
#: 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:316
#: intervention/templates/intervention/detail/view.html:31 konova/forms.py:330
msgid "Title"
msgstr "Bezeichnung"
@ -363,7 +364,7 @@ msgstr "Ökokonten"
#: compensation/tables.py:222
#: compensation/templates/compensation/detail/eco_account/view.html:19
#: intervention/forms.py:501 intervention/forms.py:508
#: intervention/forms.py:571 intervention/forms.py:578
#: konova/templates/konova/home.html:88 templates/navbar.html:34
msgid "Eco-account"
msgstr "Ökokonto"
@ -476,7 +477,7 @@ msgstr "Dokumente"
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:14
#: ema/templates/ema/detail/includes/documents.html:14
#: intervention/templates/intervention/detail/includes/documents.html:14
#: konova/forms.py:365
#: konova/forms.py:379
msgid "Add new document"
msgstr "Neues Dokument hinzufügen"
@ -581,7 +582,7 @@ msgstr "Zuletzt bearbeitet"
#: compensation/templates/compensation/detail/compensation/view.html:92
#: compensation/templates/compensation/detail/eco_account/view.html:91
#: ema/templates/ema/detail/view.html:82 intervention/forms.py:285
#: ema/templates/ema/detail/view.html:82 intervention/forms.py:355
#: intervention/templates/intervention/detail/view.html:116
msgid "Shared with"
msgstr "Freigegeben für"
@ -642,19 +643,19 @@ msgid "Missing"
msgstr "Fehlt"
#: compensation/templates/compensation/detail/eco_account/view.html:58
#: ema/templates/ema/detail/view.html:42 intervention/forms.py:91
#: ema/templates/ema/detail/view.html:42 intervention/forms.py:101
#: intervention/templates/intervention/detail/view.html:56
msgid "Conservation office"
msgstr "Eintragungsstelle"
#: compensation/templates/compensation/detail/eco_account/view.html:62
#: ema/templates/ema/detail/view.html:46 intervention/forms.py:112
#: ema/templates/ema/detail/view.html:46 intervention/forms.py:127
#: intervention/templates/intervention/detail/view.html:60
msgid "Conservation office file number"
msgstr "Aktenzeichen Eintragungsstelle"
#: compensation/templates/compensation/detail/eco_account/view.html:66
#: ema/templates/ema/detail/view.html:50 intervention/forms.py:118
#: ema/templates/ema/detail/view.html:50 intervention/forms.py:138
#: intervention/templates/intervention/detail/view.html:64
msgid "Intervention handler"
msgstr "Eingriffsverursacher"
@ -666,7 +667,7 @@ msgstr ""
#: compensation/views/compensation_views.py:123
#: compensation/views/eco_account_views.py:190 ema/views.py:128
#: intervention/views.py:391
#: intervention/views.py:393
msgid "Log"
msgstr "Log"
@ -676,7 +677,7 @@ msgstr "Kompensation entfernt"
#: compensation/views/compensation_views.py:163
#: compensation/views/eco_account_views.py:289 ema/views.py:250
#: intervention/views.py:94
#: intervention/views.py:96
msgid "Document added"
msgstr "Dokument hinzugefügt"
@ -712,16 +713,16 @@ msgid "Deduction removed"
msgstr "Abbuchung entfernt"
#: compensation/views/eco_account_views.py:210 ema/views.py:171
#: intervention/views.py:431
#: intervention/views.py:433
msgid "{} unrecorded"
msgstr "{} entzeichnet"
#: compensation/views/eco_account_views.py:210 ema/views.py:171
#: intervention/views.py:431
#: intervention/views.py:433
msgid "{} recorded"
msgstr "{} verzeichnet"
#: compensation/views/eco_account_views.py:346 intervention/views.py:413
#: compensation/views/eco_account_views.py:346 intervention/views.py:415
msgid "Deduction added"
msgstr "Abbuchung hinzugefügt"
@ -773,111 +774,129 @@ msgstr "Gemarkung"
msgid "Search for district"
msgstr "Nach Gemarkung suchen"
#: intervention/forms.py:36
#: intervention/forms.py:40
msgid "Generated automatically"
msgstr "Automatisch generiert"
#: intervention/forms.py:41
#: intervention/forms.py:45
msgid "An explanatory name"
msgstr "Aussagekräftiger Titel"
#: intervention/forms.py:45
#: intervention/forms.py:49
msgid "Construction XY; Location ABC"
msgstr "Bauvorhaben XY; Flur ABC"
#: intervention/forms.py:54
#: intervention/templates/intervention/detail/view.html:35
msgid "Process type"
msgstr "Verfahrenstyp"
#: intervention/forms.py:60
#: intervention/forms.py:70
#: intervention/templates/intervention/detail/view.html:39
msgid "Law"
msgstr "Gesetz"
#: intervention/forms.py:62
#: intervention/forms.py:72
msgid "Multiple selection possible"
msgstr "Mehrfachauswahl möglich"
#: intervention/forms.py:76
#: intervention/forms.py:86
#: intervention/templates/intervention/detail/view.html:48
msgid "Registration office"
msgstr "Zulassungsbehörde"
#: intervention/forms.py:106
#: intervention/forms.py:116
#: intervention/templates/intervention/detail/view.html:52
msgid "Registration office file number"
msgstr "Aktenzeichen Zulassungsbehörde"
#: intervention/forms.py:122
msgid "ZB-123/ABC.456"
msgstr ""
#: intervention/forms.py:133
msgid "ETS-123/ABC.456"
msgstr ""
#: intervention/forms.py:142
msgid "Who performs the intervention"
msgstr "Wer führt den Eingriff durch"
#: intervention/forms.py:134
msgid "Map"
msgstr "Karte"
#: intervention/forms.py:145
msgid "Company Mustermann"
msgstr "Firma Mustermann"
#: intervention/forms.py:136
msgid "Where does the intervention take place"
msgstr "Wo findet der Eingriff statt"
#: intervention/forms.py:150
#: intervention/templates/intervention/detail/view.html:96
msgid "Registration date"
msgstr "Datum Zulassung bzw. Satzungsbeschluss"
#: intervention/forms.py:141
#: intervention/forms.py:161
#: intervention/templates/intervention/detail/view.html:100
msgid "Binding on"
msgstr "Datum Bestandskraft"
#: intervention/forms.py:174
msgid "New intervention"
msgstr "Neuer Eingriff"
#: intervention/forms.py:178
#: intervention/forms.py:248
msgid "Edit intervention"
msgstr "Eingriff bearbeiten"
#: intervention/forms.py:274
#: intervention/forms.py:344
msgid "Share link"
msgstr "Freigabelink"
#: intervention/forms.py:276
#: intervention/forms.py:346
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:288
#: intervention/forms.py:358
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:299
#: intervention/forms.py:369
#: intervention/templates/intervention/detail/includes/controls.html:15
msgid "Share"
msgstr "Freigabe"
#: intervention/forms.py:300
#: intervention/forms.py:370
msgid "Share settings for {}"
msgstr "Freigabe Einstellungen für {}"
#: intervention/forms.py:353
#: intervention/forms.py:423
msgid "Date of revocation"
msgstr "Datum des Widerspruchs"
#: intervention/forms.py:363
#: intervention/forms.py:433
#: intervention/templates/intervention/detail/includes/revocation.html:35
msgid "Document"
msgstr "Dokument"
#: intervention/forms.py:366 konova/forms.py:335
#: intervention/forms.py:436 konova/forms.py:349
msgid "Must be smaller than 15 Mb"
msgstr "Muss kleiner als 15 Mb sein"
#: intervention/forms.py:389
#: intervention/forms.py:459
#: intervention/templates/intervention/detail/includes/revocation.html:18
msgid "Add revocation"
msgstr "Widerspruch hinzufügen"
#: intervention/forms.py:429
#: intervention/forms.py:499
msgid "Checked intervention data"
msgstr "Eingriffsdaten geprüft"
#: intervention/forms.py:435
#: intervention/forms.py:505
msgid "Checked compensations data and payments"
msgstr "Kompensationen und Zahlungen geprüft"
#: intervention/forms.py:443
#: intervention/forms.py:513
#: intervention/templates/intervention/detail/includes/controls.html:19
msgid "Run check"
msgstr "Prüfung vornehmen"
#: intervention/forms.py:444 konova/forms.py:419
#: intervention/forms.py:514 konova/forms.py:433
msgid ""
"I, {} {}, confirm that all necessary control steps have been performed by "
"myself."
@ -885,30 +904,30 @@ msgstr ""
"Ich, {} {}, bestätige, dass die notwendigen Kontrollschritte durchgeführt "
"wurden:"
#: intervention/forms.py:503
#: intervention/forms.py:573
msgid "Only recorded accounts can be selected for deductions"
msgstr "Nur verzeichnete Ökokonten können für Abbuchungen verwendet werden."
#: intervention/forms.py:522 intervention/forms.py:529
#: intervention/forms.py:592 intervention/forms.py:599
#: intervention/tables.py:88
#: intervention/templates/intervention/detail/view.html:19
#: konova/templates/konova/home.html:11 templates/navbar.html:22
msgid "Intervention"
msgstr "Eingriff"
#: intervention/forms.py:524
#: intervention/forms.py:594
msgid "Only shared interventions can be selected"
msgstr "Nur freigegebene Eingriffe können gewählt werden"
#: intervention/forms.py:537
#: intervention/forms.py:607
msgid "New Deduction"
msgstr "Neue Abbuchung"
#: intervention/forms.py:538
#: intervention/forms.py:608
msgid "Enter the information for a new deduction from a chosen eco-account"
msgstr "Geben Sie die Informationen für eine neue Abbuchung ein."
#: intervention/forms.py:574
#: intervention/forms.py:644
msgid ""
"Eco-account {} is not recorded yet. You can only deduct from recorded "
"accounts."
@ -916,7 +935,7 @@ msgstr ""
"Ökokonto {} ist noch nicht verzeichnet. Abbuchungen können nur von "
"verzeichneten Ökokonten erfolgen."
#: intervention/forms.py:587
#: intervention/forms.py:657
msgid ""
"The account {} has not enough surface for a deduction of {} m². There are "
"only {} m² left"
@ -1017,31 +1036,23 @@ msgstr "Vom"
msgid "Remove revocation"
msgstr "Widerspruch entfernen"
#: intervention/templates/intervention/detail/view.html:96
msgid "Registration date"
msgstr "Datum Zulassung bzw. Satzungsbeschluss"
#: intervention/templates/intervention/detail/view.html:100
msgid "Binding on"
msgstr "Datum Bestandskraft"
#: intervention/templates/intervention/detail/view.html:103
msgid "Exists"
msgstr "vorhanden"
#: intervention/views.py:66
#: intervention/views.py:67
msgid "Intervention {} added"
msgstr "Eingriff {} hinzugefügt"
#: intervention/views.py:69 intervention/views.py:224
#: intervention/views.py:70 intervention/views.py:226
msgid "Invalid input"
msgstr "Eingabe fehlerhaft"
#: intervention/views.py:182
#: intervention/views.py:184
msgid "This intervention has a revocation from {}"
msgstr "Es existiert ein Widerspruch vom {}"
#: intervention/views.py:198
#: intervention/views.py:200
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 "
@ -1051,43 +1062,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:221
#: intervention/views.py:223
msgid "{} edited"
msgstr "{} bearbeitet"
#: intervention/views.py:250
#: intervention/views.py:252
msgid "{} removed"
msgstr "{} entfernt"
#: intervention/views.py:271
#: intervention/views.py:273
msgid "Revocation removed"
msgstr "Widerspruch entfernt"
#: intervention/views.py:297
#: intervention/views.py:299
msgid "{} has already been shared with you"
msgstr "{} wurde bereits für Sie freigegeben"
#: intervention/views.py:302
#: intervention/views.py:304
msgid "{} has been shared with you"
msgstr "{} ist nun für Sie freigegeben"
#: intervention/views.py:309
#: intervention/views.py:311
msgid "Share link invalid"
msgstr "Freigabelink ungültig"
#: intervention/views.py:330
#: intervention/views.py:332
msgid "Share settings updated"
msgstr "Freigabe Einstellungen aktualisiert"
#: intervention/views.py:349
#: intervention/views.py:351
msgid "Check performed"
msgstr "Prüfung durchgeführt"
#: intervention/views.py:369
#: intervention/views.py:371
msgid "Revocation added"
msgstr "Widerspruch hinzugefügt"
#: intervention/views.py:436
#: intervention/views.py:438
msgid "There are errors on this intervention:"
msgstr "Es liegen Fehler in diesem Eingriff vor:"
@ -1112,60 +1123,64 @@ 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:68
#: konova/forms.py:69
msgid "Not editable"
msgstr "Nicht editierbar"
#: konova/forms.py:138 konova/forms.py:281
#: konova/forms.py:139 konova/forms.py:295
msgid "Confirm"
msgstr "Bestätige"
#: konova/forms.py:150 konova/forms.py:290
#: konova/forms.py:151 konova/forms.py:304
msgid "Remove"
msgstr "Löschen"
#: konova/forms.py:152
#: konova/forms.py:153
msgid "You are about to remove {} {}"
msgstr "Sie sind dabei {} {} zu löschen"
#: konova/forms.py:291
#: konova/forms.py:249 templates/form/main_data_collapse_form.html:47
msgid "Geometry"
msgstr "Geometrie"
#: konova/forms.py:305
msgid "Are you sure?"
msgstr "Sind Sie sicher?"
#: konova/forms.py:321
#: konova/forms.py:335
msgid "Created on"
msgstr "Erstellt"
#: konova/forms.py:323
#: konova/forms.py:337
msgid "When has this file been created? Important for photos."
msgstr "Wann wurde diese Datei erstellt oder das Foto aufgenommen?"
#: konova/forms.py:333
#: konova/forms.py:347
#: venv/lib/python3.7/site-packages/django/db/models/fields/files.py:231
msgid "File"
msgstr "Datei"
#: konova/forms.py:396
#: konova/forms.py:410
msgid "Added document"
msgstr "Dokument hinzugefügt"
#: konova/forms.py:410
#: konova/forms.py:424
msgid "Confirm record"
msgstr "Verzeichnen bestätigen"
#: konova/forms.py:418
#: konova/forms.py:432
msgid "Record data"
msgstr "Daten verzeichnen"
#: konova/forms.py:425
#: konova/forms.py:439
msgid "Confirm unrecord"
msgstr "Entzeichnen bestätigen"
#: konova/forms.py:426
#: konova/forms.py:440
msgid "Unrecord data"
msgstr "Daten entzeichnen"
#: konova/forms.py:427
#: konova/forms.py:441
msgid "I, {} {}, confirm that this data must be unrecorded."
msgstr ""
"Ich, {} {}, bestätige, dass diese Daten wieder entzeichnet werden müssen."
@ -1311,12 +1326,12 @@ msgid "Contact"
msgstr "Kontakt"
#: templates/form/generic_table_form.html:23
#: templates/form/main_data_collapse_form.html:58
#: templates/form/main_data_collapse_form.html:61
msgid "Cancel"
msgstr "Abbrechen"
#: templates/form/generic_table_form.html:27
#: templates/form/main_data_collapse_form.html:62
#: templates/form/main_data_collapse_form.html:65
msgid "Save"
msgstr "Speichern"
@ -1324,7 +1339,7 @@ msgstr "Speichern"
msgid "Fields with * are required."
msgstr "* sind Pflichtfelder."
#: templates/form/main_data_collapse_form.html:13
#: templates/form/main_data_collapse_form.html:14
msgid ""
"\n"
" First enter the most basic data. Of course you can "
@ -1335,23 +1350,20 @@ msgid ""
" "
msgstr ""
"\n"
"Geben Sie zunächst die grundlegenden Daten ein. Sie können diese später immer noch ändern.\n"
"Alle weiteren Daten, wie Dokumente oder weitere Details, können nach dem Speichern des neuen Eintrags hinzugefügt "
"werden.\n"
"Geben Sie zunächst die grundlegenden Daten ein. Sie können diese später "
"immer noch ändern.\n"
"Alle weiteren Daten, wie Dokumente oder weitere Details, können nach dem "
"Speichern des neuen Eintrags hinzugefügt werden.\n"
" "
#: templates/form/main_data_collapse_form.html:19
#: templates/form/main_data_collapse_form.html:20
msgid "Open the input topic with a simple click."
msgstr "Mit einem Linksklick öffnen Sie den jeweiligen Formularbereich."
#: templates/form/main_data_collapse_form.html:29
#: templates/form/main_data_collapse_form.html:30
msgid "General data"
msgstr "Allgemeine Daten"
#: templates/form/main_data_collapse_form.html:44
msgid "Geometry"
msgstr "Geometrie"
#: templates/generic_index.html:28
msgid "New entry"
msgstr "Neuer Eintrag"
@ -2708,6 +2720,12 @@ msgstr ""
msgid "A fontawesome icon field"
msgstr ""
#~ msgid "Map"
#~ msgstr "Karte"
#~ msgid "Where does the intervention take place"
#~ msgstr "Wo findet der Eingriff statt"
#~ msgid "Which intervention type is this"
#~ msgstr "Welcher Eingriffstyp"

View File

@ -1,5 +1,6 @@
{% load i18n l10n fontawesome_5 %}
<form method="post" action="{{ form.action_url }}" {% for attr_key, attr_val in form.form_attrs.items %} {{attr_key}}="{{attr_val}}"{% endfor %}>
{% csrf_token %}
<h2>{{form.form_title}}</h2>
<div id="help" class="col">
<div class="row rlp-gd-outline p-2">
@ -31,7 +32,9 @@
</div>
<div id="dataCard" class="collapse" aria-labelledby="dataCardHeader">
<div class="card-body">
{% with data_form as form %}
{% include 'form/generic_table_form_body.html' %}
{% endwith %}
</div>
</div>
</div>
@ -44,9 +47,9 @@
{% trans 'Geometry' %}
</h5>
</div>
<div id="geometryCard" class="collapse" aria-labelledby="geometryCardHeader">
<div id="geometryCard" class="collapse show" aria-labelledby="geometryCardHeader">
<div class="card-body">
ToDo
{% include 'map/geom_form.html' %}
</div>
</div>
</div>