diff --git a/analysis/forms.py b/analysis/forms.py index c9a7995..ab16ac6 100644 --- a/analysis/forms.py +++ b/analysis/forms.py @@ -13,6 +13,7 @@ from django.utils.translation import gettext_lazy as _ from codelist.models import KonovaCode from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID from konova.forms import BaseForm +from konova.utils import validators class TimespanReportForm(BaseForm): @@ -22,6 +23,7 @@ class TimespanReportForm(BaseForm): date_from = forms.DateField( label_suffix="", label=_("From"), + validators=[validators.reasonable_date], help_text=_("Entries created from..."), widget=forms.DateInput( attrs={ @@ -35,6 +37,7 @@ class TimespanReportForm(BaseForm): date_to = forms.DateField( label_suffix="", label=_("To"), + validators=[validators.reasonable_date], help_text=_("Entries created until..."), widget=forms.DateInput( attrs={ diff --git a/compensation/forms/eco_account.py b/compensation/forms/eco_account.py index af5f63b..53ec207 100644 --- a/compensation/forms/eco_account.py +++ b/compensation/forms/eco_account.py @@ -15,6 +15,7 @@ from compensation.models import EcoAccount from intervention.models import Handler, Responsibility, Legal from konova.forms import SimpleGeomForm from konova.forms.modals import RemoveModalForm +from konova.utils import validators from user.models import User, UserActionLogEntry @@ -43,6 +44,7 @@ class NewEcoAccountForm(AbstractCompensationForm, CompensationResponsibleFormMix label_suffix="", help_text=_("When did the parties agree on this?"), required=False, + validators=[validators.reasonable_date], widget=forms.DateInput( attrs={ "type": "date", diff --git a/compensation/forms/modals/deadline.py b/compensation/forms/modals/deadline.py index 330c83c..0ec93a3 100644 --- a/compensation/forms/modals/deadline.py +++ b/compensation/forms/modals/deadline.py @@ -10,6 +10,7 @@ from django.utils.translation import gettext_lazy as _ from konova.forms.modals import BaseModalForm from konova.models import DeadlineType +from konova.utils import validators from konova.utils.message_templates import DEADLINE_EDITED @@ -34,6 +35,7 @@ class NewDeadlineModalForm(BaseModalForm): label_suffix="", required=True, help_text=_("Select date"), + validators=[validators.reasonable_date], widget=forms.DateInput( attrs={ "type": "date", diff --git a/compensation/forms/modals/payment.py b/compensation/forms/modals/payment.py index 4383a57..0046838 100644 --- a/compensation/forms/modals/payment.py +++ b/compensation/forms/modals/payment.py @@ -9,6 +9,7 @@ from django import forms from django.utils.translation import pgettext_lazy as _con, gettext_lazy as _ from konova.forms.modals import RemoveModalForm, BaseModalForm +from konova.utils import validators from konova.utils.message_templates import PAYMENT_EDITED @@ -33,6 +34,7 @@ class NewPaymentForm(BaseModalForm): label=_("Due on"), label_suffix=_(""), required=False, + validators=[validators.reasonable_date], help_text=_("Due on which date"), widget=forms.DateInput( attrs={ diff --git a/intervention/forms/intervention.py b/intervention/forms/intervention.py index 88bff07..72986ad 100644 --- a/intervention/forms/intervention.py +++ b/intervention/forms/intervention.py @@ -9,6 +9,7 @@ from dal import autocomplete from django import forms from konova.forms.base_form import BaseForm +from konova.utils import validators from konova.utils.message_templates import EDITED_GENERAL_DATA from user.models import User from django.db import transaction @@ -175,6 +176,7 @@ class NewInterventionForm(BaseForm): label=_("Registration date"), label_suffix=_(""), required=False, + validators=[validators.reasonable_date], widget=forms.DateInput( attrs={ "type": "date", @@ -187,6 +189,7 @@ class NewInterventionForm(BaseForm): label=_("Binding on"), label_suffix=_(""), required=False, + validators=[validators.reasonable_date], widget=forms.DateInput( attrs={ "type": "date", diff --git a/intervention/forms/modals/revocation.py b/intervention/forms/modals/revocation.py index b738efe..03a0ebe 100644 --- a/intervention/forms/modals/revocation.py +++ b/intervention/forms/modals/revocation.py @@ -11,6 +11,7 @@ from django.utils.translation import gettext_lazy as _ from intervention.models import RevocationDocument from konova.forms.modals import BaseModalForm, RemoveModalForm +from konova.utils import validators from konova.utils.message_templates import REVOCATION_ADDED, REVOCATION_EDITED @@ -19,6 +20,7 @@ class NewRevocationModalForm(BaseModalForm): label=_("Date"), label_suffix=_(""), help_text=_("Date of revocation"), + validators=[validators.reasonable_date], widget=forms.DateInput( attrs={ "type": "date", diff --git a/konova/forms/modals/document_form.py b/konova/forms/modals/document_form.py index 96b4f8e..427ef9f 100644 --- a/konova/forms/modals/document_form.py +++ b/konova/forms/modals/document_form.py @@ -12,6 +12,7 @@ from django.utils.translation import gettext_lazy as _ from konova.forms.modals.base_form import BaseModalForm from konova.models import AbstractDocument +from konova.utils import validators from konova.utils.message_templates import DOCUMENT_EDITED, FILE_SIZE_TOO_LARGE, FILE_TYPE_UNSUPPORTED from user.models import UserActionLogEntry @@ -34,6 +35,7 @@ class NewDocumentModalForm(BaseModalForm): label=_("Created on"), label_suffix=_(""), help_text=_("When has this file been created? Important for photos."), + validators=[validators.reasonable_date], widget=forms.DateInput( attrs={ "type": "date", diff --git a/konova/forms/modals/resubmission_form.py b/konova/forms/modals/resubmission_form.py index 97a52dc..d23fb8a 100644 --- a/konova/forms/modals/resubmission_form.py +++ b/konova/forms/modals/resubmission_form.py @@ -14,6 +14,7 @@ from django.utils.translation import gettext_lazy as _ from konova.forms.modals.base_form import BaseModalForm from konova.models import Resubmission +from konova.utils import validators class ResubmissionModalForm(BaseModalForm): @@ -21,6 +22,7 @@ class ResubmissionModalForm(BaseModalForm): label_suffix=_(""), label=_("Date"), help_text=_("When do you want to be reminded?"), + validators=[validators.reasonable_date], widget=forms.DateInput( attrs={ "type": "date", diff --git a/konova/utils/validators.py b/konova/utils/validators.py new file mode 100644 index 0000000..a081364 --- /dev/null +++ b/konova/utils/validators.py @@ -0,0 +1,28 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 17.05.23 + +""" +from datetime import datetime + +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ + + +def reasonable_date(value): + """ Validator which checks that no dates like "01.01.1" can be entered + + Args: + value (): + + Returns: + + """ + min_date = datetime.fromisoformat("1950-01-01").date() + if value < min_date: + raise ValidationError( + _("This date is unrealistic. Please enter the correct date (>1950)."), + params={"value": value}, + ) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 8d33b5b..2b61c22 100644 Binary files a/locale/de/LC_MESSAGES/django.mo and b/locale/de/LC_MESSAGES/django.mo differ diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index b32d547..daf4623 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ # #: compensation/filters/eco_account.py:21 #: compensation/forms/modals/compensation_action.py:82 -#: compensation/forms/modals/deadline.py:50 +#: compensation/forms/modals/deadline.py:52 #: compensation/forms/modals/payment.py:23 #: compensation/forms/modals/payment.py:34 #: compensation/forms/modals/payment.py:50 @@ -43,7 +43,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-07 07:09+0100\n" +"POT-Creation-Date: 2023-05-17 12:42+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -72,7 +72,7 @@ msgstr "Einträge erstellt bis..." #: analysis/forms.py:49 compensation/forms/mixins.py:21 #: compensation/templates/compensation/detail/eco_account/view.html:59 #: compensation/templates/compensation/report/eco_account/report.html:16 -#: compensation/utils/quality.py:112 ema/templates/ema/detail/view.html:49 +#: compensation/utils/quality.py:113 ema/templates/ema/detail/view.html:49 #: ema/templates/ema/report/report.html:16 ema/utils/quality.py:26 #: intervention/forms/intervention.py:104 #: intervention/templates/intervention/detail/view.html:56 @@ -398,7 +398,7 @@ msgstr "Kompensation XY; Flur ABC" #: compensation/forms/compensation.py:56 #: compensation/forms/modals/compensation_action.py:81 -#: compensation/forms/modals/deadline.py:49 +#: compensation/forms/modals/deadline.py:51 #: compensation/forms/modals/payment.py:49 #: compensation/templates/compensation/detail/compensation/includes/actions.html:35 #: compensation/templates/compensation/detail/compensation/includes/deadlines.html:39 @@ -446,7 +446,7 @@ msgstr "Neue Kompensation" msgid "Edit compensation" msgstr "Bearbeite Kompensation" -#: compensation/forms/eco_account.py:30 compensation/utils/quality.py:96 +#: compensation/forms/eco_account.py:30 compensation/utils/quality.py:97 msgid "Available Surface" msgstr "Verfügbare Fläche" @@ -486,7 +486,7 @@ msgstr "" #: compensation/forms/mixins.py:37 #: compensation/templates/compensation/detail/eco_account/view.html:63 #: compensation/templates/compensation/report/eco_account/report.html:20 -#: compensation/utils/quality.py:114 ema/templates/ema/detail/view.html:53 +#: compensation/utils/quality.py:115 ema/templates/ema/detail/view.html:53 #: ema/templates/ema/report/report.html:20 ema/utils/quality.py:28 #: intervention/forms/intervention.py:132 #: intervention/templates/intervention/detail/view.html:60 @@ -604,15 +604,15 @@ msgstr "Geben Sie die Daten der neuen Maßnahme ein" msgid "Edit action" msgstr "Maßnahme bearbeiten" -#: compensation/forms/modals/deadline.py:21 +#: compensation/forms/modals/deadline.py:23 msgid "Deadline Type" msgstr "Fristart" -#: compensation/forms/modals/deadline.py:24 +#: compensation/forms/modals/deadline.py:26 msgid "Select the deadline type" msgstr "Fristart wählen" -#: compensation/forms/modals/deadline.py:33 +#: compensation/forms/modals/deadline.py:35 #: compensation/templates/compensation/detail/compensation/includes/deadlines.html:36 #: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:36 #: ema/templates/ema/detail/includes/deadlines.html:36 @@ -621,26 +621,30 @@ msgstr "Fristart wählen" msgid "Date" msgstr "Datum" -#: compensation/forms/modals/deadline.py:36 +#: compensation/forms/modals/deadline.py:38 msgid "Select date" msgstr "Datum wählen" -#: compensation/forms/modals/deadline.py:51 +#: compensation/forms/modals/deadline.py:53 #: compensation/forms/modals/payment.py:51 #: intervention/forms/modals/revocation.py:47 #: konova/forms/modals/document_form.py:61 msgid "Additional comment, maximum {} letters" msgstr "Zusätzlicher Kommentar, maximal {} Zeichen" -#: compensation/forms/modals/deadline.py:63 +#: compensation/forms/modals/deadline.py:65 msgid "New deadline" msgstr "Neue Frist" -#: compensation/forms/modals/deadline.py:64 +#: compensation/forms/modals/deadline.py:66 msgid "Insert data for the new deadline" msgstr "Geben Sie die Daten der neuen Frist ein" #: compensation/forms/modals/deadline.py:77 +msgid "This date is unrealistic. Please enter the correct date (>1950)." +msgstr "Dieses Datum ist unrealistisch. Geben Sie bitte das korrekte Datum ein (>1950)." + +#: compensation/forms/modals/deadline.py:95 #: compensation/templates/compensation/detail/compensation/includes/deadlines.html:64 #: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:62 #: ema/templates/ema/detail/includes/deadlines.html:62 @@ -1262,13 +1266,13 @@ msgstr "Umsetzungstermin" msgid "Legal data" msgstr "Rechtliche Daten" -#: compensation/utils/quality.py:100 +#: compensation/utils/quality.py:101 msgid "Deductable surface can not be larger than state surface" msgstr "" "Die abbuchbare Fläche darf die Gesamtfläche der Zielzustände nicht " "überschreiten" -#: compensation/utils/quality.py:116 ema/utils/quality.py:30 +#: compensation/utils/quality.py:117 ema/utils/quality.py:30 #: intervention/utils/quality.py:68 msgid "Responsible data" msgstr "Daten zu den verantwortlichen Stellen" @@ -1283,7 +1287,7 @@ msgid "Compensation {} edited" msgstr "Kompensation {} bearbeitet" #: compensation/views/compensation/compensation.py:187 -#: compensation/views/eco_account/eco_account.py:161 ema/views/ema.py:212 +#: compensation/views/eco_account/eco_account.py:161 ema/views/ema.py:220 #: intervention/views/intervention.py:243 msgid "Edit {}" msgstr "Bearbeite {}" @@ -1306,11 +1310,11 @@ msgstr "Ökokonto {} hinzugefügt" msgid "Eco-Account {} edited" msgstr "Ökokonto {} bearbeitet" -#: compensation/views/eco_account/eco_account.py:268 +#: compensation/views/eco_account/eco_account.py:275 msgid "Eco-account removed" msgstr "Ökokonto entfernt" -#: ema/forms.py:42 ema/views/ema.py:95 +#: ema/forms.py:42 ema/views/ema.py:96 msgid "New EMA" msgstr "Neue EMA hinzufügen" @@ -1338,19 +1342,19 @@ msgstr "" msgid "Payment funded compensation" msgstr "Ersatzzahlungsmaßnahme" -#: ema/views/ema.py:52 +#: ema/views/ema.py:53 msgid "EMAs - Overview" msgstr "EMAs - Übersicht" -#: ema/views/ema.py:85 +#: ema/views/ema.py:86 msgid "EMA {} added" msgstr "EMA {} hinzugefügt" -#: ema/views/ema.py:202 +#: ema/views/ema.py:210 msgid "EMA {} edited" msgstr "EMA {} bearbeitet" -#: ema/views/ema.py:236 +#: ema/views/ema.py:244 msgid "EMA removed" msgstr "EMA entfernt" @@ -2095,7 +2099,8 @@ msgid "" "Do not forget to share your entry! Currently you are the only one having " "shared access." msgstr "" -"Denken Sie daran Ihren Eintrag freizugeben! Aktuell haben nur Sie eine Freigabe hierauf." +"Denken Sie daran Ihren Eintrag freizugeben! Aktuell haben nur Sie eine " +"Freigabe hierauf." #: konova/utils/message_templates.py:29 msgid "Unsupported file type" @@ -2270,7 +2275,7 @@ msgstr "Für Sie freigegeben - Datensatz kann bearbeitet werden" msgid "Access not granted" msgstr "Nicht freigegeben - Datensatz nur lesbar" -#: konova/views/home.py:80 templates/navbars/navbar.html:16 +#: konova/views/home.py:74 templates/navbars/navbar.html:16 msgid "Home" msgstr "Home" @@ -2306,15 +2311,15 @@ msgstr "{} ist nun für Sie freigegeben" msgid "Share link invalid" msgstr "Freigabelink ungültig" -#: news/models.py:12 +#: news/models.py:13 msgid "Default" msgstr "Standard" -#: news/models.py:13 +#: news/models.py:14 msgid "Info" msgstr "" -#: news/models.py:14 +#: news/models.py:15 msgid "Warning" msgstr "Warnung" @@ -2330,7 +2335,7 @@ msgstr "Ältere ..." msgid "All" msgstr "Alle" -#: news/templates/news/index.html:9 news/views.py:34 +#: news/templates/news/index.html:9 news/views.py:27 msgid "News" msgstr "Neuigkeiten"