#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:
		
							parent
							
								
									951477c58f
								
							
						
					
					
						commit
						9b728e5d10
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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")
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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 %}
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
        self.initialize_form_field("geom", geom)
 | 
			
		||||
        self.area = geom.area
 | 
			
		||||
        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")
 | 
			
		||||
 | 
			
		||||
@ -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):
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
}
 | 
			
		||||
@ -219,4 +229,7 @@ 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.
										
									
								
							@ -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"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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">
 | 
			
		||||
                    {% include 'form/generic_table_form_body.html' %}
 | 
			
		||||
                    {% 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>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user