Geometry simplification

* simplifies geometries on SimpleGeomForm if threshold GEOM_MAX_VERTICES has been exceeded
    * geometry is iteratively simplified to find a proper tolerance value which satisfies the GEOM_MAX_VERTICES threshold
pull/339/head
mpeltriaux 1 year ago
parent 4d96afae1d
commit a571c28027

@ -26,7 +26,7 @@ from konova.settings import DEFAULT_GROUP, ZB_GROUP, ETS_GROUP
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.message_templates import COMPENSATION_REMOVED_TEMPLATE, DATA_CHECKED_PREVIOUSLY_TEMPLATE, \
RECORDED_BLOCKS_EDIT, CHECKED_RECORDED_RESET, FORM_INVALID, PARAMS_INVALID, IDENTIFIER_REPLACED, \
COMPENSATION_ADDED_TEMPLATE, DO_NOT_FORGET_TO_SHARE
COMPENSATION_ADDED_TEMPLATE, DO_NOT_FORGET_TO_SHARE, GEOMETRY_SIMPLIFIED
from konova.utils.user_checks import in_group
@ -103,6 +103,11 @@ def new_view(request: HttpRequest, intervention_id: str = None):
)
)
messages.success(request, COMPENSATION_ADDED_TEMPLATE.format(comp.identifier))
if geom_form.geometry_simplified:
messages.info(
request,
GEOMETRY_SIMPLIFIED
)
return redirect("compensation:detail", id=comp.id)
else:
messages.error(request, FORM_INVALID, extra_tags="danger",)
@ -175,6 +180,11 @@ def edit_view(request: HttpRequest, id: str):
if intervention_recorded or intervention_checked:
messages.info(request, CHECKED_RECORDED_RESET)
messages.success(request, _("Compensation {} edited").format(comp.identifier))
if geom_form.geometry_simplified:
messages.info(
request,
GEOMETRY_SIMPLIFIED
)
return redirect("compensation:detail", id=comp.id)
else:
messages.error(request, FORM_INVALID, extra_tags="danger",)
@ -218,6 +228,8 @@ def detail_view(request: HttpRequest, id: str):
_user = request.user
is_data_shared = comp.intervention.is_shared_with(_user)
# Order states according to surface
before_states = comp.before_states.all().prefetch_related("biotope_type").order_by("-surface")
after_states = comp.after_states.all().prefetch_related("biotope_type").order_by("-surface")

@ -22,7 +22,7 @@ from konova.forms import SimpleGeomForm
from konova.settings import ETS_GROUP, DEFAULT_GROUP, ZB_GROUP
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.message_templates import CANCEL_ACC_RECORDED_OR_DEDUCTED, RECORDED_BLOCKS_EDIT, FORM_INVALID, \
IDENTIFIER_REPLACED, DO_NOT_FORGET_TO_SHARE
IDENTIFIER_REPLACED, DO_NOT_FORGET_TO_SHARE, GEOMETRY_SIMPLIFIED
from konova.utils.user_checks import in_group
@ -84,6 +84,11 @@ def new_view(request: HttpRequest):
)
)
messages.success(request, _("Eco-Account {} added").format(acc.identifier))
if geom_form.geometry_simplified:
messages.info(
request,
GEOMETRY_SIMPLIFIED
)
return redirect("compensation:acc:detail", id=acc.id)
else:
messages.error(request, FORM_INVALID, extra_tags="danger",)
@ -149,6 +154,11 @@ def edit_view(request: HttpRequest, id: str):
# The data form takes the geom form for processing, as well as the performing user
acc = data_form.save(request.user, geom_form)
messages.success(request, _("Eco-Account {} edited").format(acc.identifier))
if geom_form.geometry_simplified:
messages.info(
request,
GEOMETRY_SIMPLIFIED
)
return redirect("compensation:acc:detail", id=acc.id)
else:
messages.error(request, FORM_INVALID, extra_tags="danger",)

@ -23,7 +23,7 @@ from konova.forms.modals import RemoveModalForm
from konova.settings import DEFAULT_GROUP, ZB_GROUP, ETS_GROUP
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.message_templates import RECORDED_BLOCKS_EDIT, IDENTIFIER_REPLACED, FORM_INVALID, \
DO_NOT_FORGET_TO_SHARE
DO_NOT_FORGET_TO_SHARE, GEOMETRY_SIMPLIFIED
from konova.utils.user_checks import in_group
@ -84,6 +84,12 @@ def new_view(request: HttpRequest):
)
)
messages.success(request, _("EMA {} added").format(ema.identifier))
if geom_form.geometry_simplified:
messages.info(
request,
GEOMETRY_SIMPLIFIED
)
return redirect("ema:detail", id=ema.id)
else:
messages.error(request, FORM_INVALID, extra_tags="danger",)
@ -208,6 +214,11 @@ def edit_view(request: HttpRequest, id: str):
# The data form takes the geom form for processing, as well as the performing user
ema = data_form.save(request.user, geom_form)
messages.success(request, _("EMA {} edited").format(ema.identifier))
if geom_form.geometry_simplified:
messages.info(
request,
GEOMETRY_SIMPLIFIED
)
return redirect("ema:detail", id=ema.id)
else:
messages.error(request, FORM_INVALID, extra_tags="danger",)

@ -22,7 +22,7 @@ from konova.forms.modals import RemoveModalForm
from konova.settings import DEFAULT_GROUP, ZB_GROUP, ETS_GROUP
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.message_templates import DATA_CHECKED_PREVIOUSLY_TEMPLATE, RECORDED_BLOCKS_EDIT, \
CHECKED_RECORDED_RESET, FORM_INVALID, IDENTIFIER_REPLACED, DO_NOT_FORGET_TO_SHARE
CHECKED_RECORDED_RESET, FORM_INVALID, IDENTIFIER_REPLACED, DO_NOT_FORGET_TO_SHARE, GEOMETRY_SIMPLIFIED
from konova.utils.user_checks import in_group
@ -88,6 +88,11 @@ def new_view(request: HttpRequest):
)
)
messages.success(request, _("Intervention {} added").format(intervention.identifier))
if geom_form.geometry_simplified:
messages.info(
request,
GEOMETRY_SIMPLIFIED
)
return redirect("intervention:detail", id=intervention.id)
else:
messages.error(request, FORM_INVALID, extra_tags="danger",)
@ -231,6 +236,11 @@ def edit_view(request: HttpRequest, id: str):
messages.success(request, _("Intervention {} edited").format(intervention.identifier))
if i_check or i_rec:
messages.info(request, CHECKED_RECORDED_RESET)
if geom_form.geometry_simplified:
messages.info(
request,
GEOMETRY_SIMPLIFIED
)
return redirect("intervention:detail", id=intervention.id)
else:
messages.error(request, FORM_INVALID, extra_tags="danger",)

@ -15,6 +15,7 @@ from django.utils.translation import gettext_lazy as _
from konova.forms.base_form import BaseForm
from konova.models import Geometry
from konova.settings import GEOM_MAX_VERTICES
from konova.tasks import celery_update_parcels, celery_check_for_geometry_conflicts
from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP
from user.models import UserActionLogEntry
@ -25,6 +26,7 @@ class SimpleGeomForm(BaseForm):
"""
read_only = True
geometry_simplified = False
geom = MultiPolygonField(
srid=DEFAULT_SRID_RLP,
label=_("Geometry"),
@ -124,6 +126,38 @@ class SimpleGeomForm(BaseForm):
return is_valid
def __is_vertices_num_valid(self):
""" Checks whether the number of vertices in the geometry is not too high
Returns:
"""
geom = self.cleaned_data.get("geom")
g = gdal.OGRGeometry(geom, srs=DEFAULT_SRID_RLP)
num_vertices = g.num_coords
return num_vertices <= GEOM_MAX_VERTICES
def __simplify_geometry(self, geom, max_vert: int):
""" Simplifies a geometry
Geometry will be simplified until a threshold of max vertices has been reached.
Args:
geom (MultiPolygon): The geometry
max_vert (int): Threshold of maximum vertices in geometry
Returns:
geom (MultiPolygon): The simplified geometry
"""
tolerance = 0.1
n = geom.num_coords
while(n > max_vert):
geom = geom.simplify(tolerance)
n = geom.num_coords
tolerance += 0.1
return geom
def save(self, action: UserActionLogEntry):
""" Saves the form's geometry
@ -149,6 +183,13 @@ class SimpleGeomForm(BaseForm):
geom=self.cleaned_data.get("geom", MultiPolygon(srid=DEFAULT_SRID_RLP)),
created=action,
)
is_vertices_num_valid = self.__is_vertices_num_valid()
if not is_vertices_num_valid:
geometry.geom = self.__simplify_geometry(geometry.geom, max_vert=GEOM_MAX_VERTICES)
geometry.save()
self.geometry_simplified = True
# Start parcel update and geometry conflict checking procedure in a background process
celery_update_parcels.delay(geometry.id)
celery_check_for_geometry_conflicts.delay(geometry.id)

@ -44,3 +44,5 @@ STRF_DATE_TIME = "%d.%m.%Y %H:%M:%S"
DEFAULT_GROUP = "Default"
ZB_GROUP = "Registration office"
ETS_GROUP = "Conservation office"
GEOM_MAX_VERTICES = 10000

@ -7,6 +7,8 @@ Created on: 02.08.21
"""
from django.utils.translation import gettext_lazy as _
from konova.settings import GEOM_MAX_VERTICES
NO_DETAILS = _("no further details")
UNKNOWN = _("Unknown")
UNGROUPED = _("Ungrouped")
@ -79,8 +81,9 @@ DOCUMENT_EDITED = _("Document edited")
EDITED_GENERAL_DATA = _("Edited general data")
ADDED_DEADLINE = _("Added deadline")
# Geometry conflicts
# Geometry
GEOMETRY_CONFLICT_WITH_TEMPLATE = _("Geometry conflict detected with {}")
GEOMETRY_SIMPLIFIED = _("The geometry contained more than {} vertices. It had to be simplified to match the allowed limit of {} vertices.").format(GEOM_MAX_VERTICES, GEOM_MAX_VERTICES)
# INTERVENTION
INTERVENTION_HAS_REVOCATIONS_TEMPLATE = _("This intervention has {} revocations")

Binary file not shown.

@ -6,14 +6,14 @@
#: compensation/filters/eco_account.py:21
#: compensation/forms/modals/compensation_action.py:82
#: compensation/forms/modals/deadline.py:52
#: compensation/forms/modals/payment.py:23
#: compensation/forms/modals/payment.py:34
#: compensation/forms/modals/payment.py:50
#: intervention/forms/intervention.py:56 intervention/forms/intervention.py:176
#: intervention/forms/intervention.py:188
#: intervention/forms/modals/revocation.py:20
#: intervention/forms/modals/revocation.py:33
#: intervention/forms/modals/revocation.py:46
#: compensation/forms/modals/payment.py:24
#: compensation/forms/modals/payment.py:35
#: compensation/forms/modals/payment.py:52
#: intervention/forms/intervention.py:57 intervention/forms/intervention.py:177
#: intervention/forms/intervention.py:190
#: intervention/forms/modals/revocation.py:21
#: intervention/forms/modals/revocation.py:35
#: intervention/forms/modals/revocation.py:48
#: konova/filters/mixins/file_number.py:17
#: konova/filters/mixins/file_number.py:18
#: konova/filters/mixins/geo_reference.py:25
@ -29,21 +29,21 @@
#: konova/filters/mixins/office.py:25 konova/filters/mixins/office.py:56
#: konova/filters/mixins/office.py:57 konova/filters/mixins/record.py:23
#: konova/filters/mixins/self_created.py:24 konova/filters/mixins/share.py:23
#: konova/forms/geometry_form.py:31 konova/forms/modals/document_form.py:25
#: konova/forms/modals/document_form.py:35
#: konova/forms/modals/document_form.py:48
#: konova/forms/modals/document_form.py:60
#: konova/forms/modals/document_form.py:78
#: konova/forms/geometry_form.py:33 konova/forms/modals/document_form.py:26
#: konova/forms/modals/document_form.py:36
#: konova/forms/modals/document_form.py:50
#: konova/forms/modals/document_form.py:62
#: konova/forms/modals/document_form.py:80
#: konova/forms/modals/remove_form.py:23
#: konova/forms/modals/resubmission_form.py:21
#: konova/forms/modals/resubmission_form.py:36 konova/forms/remove_form.py:19
#: konova/forms/modals/resubmission_form.py:22
#: konova/forms/modals/resubmission_form.py:38 konova/forms/remove_form.py:19
#: user/forms/user.py:39
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-17 12:42+0200\n"
"POT-Creation-Date: 2023-06-28 14:12+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,57 +53,58 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: analysis/forms.py:24 analysis/templates/analysis/reports/detail.html:8
#: analysis/forms.py:25 analysis/templates/analysis/reports/detail.html:8
msgid "From"
msgstr "Vom"
#: analysis/forms.py:25
#: analysis/forms.py:27
msgid "Entries created from..."
msgstr "Einträge erstellt seit..."
#: analysis/forms.py:37
#: analysis/forms.py:39
msgid "To"
msgstr "Bis"
#: analysis/forms.py:38
#: analysis/forms.py:41
msgid "Entries created until..."
msgstr "Einträge erstellt bis..."
#: analysis/forms.py:49 compensation/forms/mixins.py:21
#: analysis/forms.py:52 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: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/forms/intervention.py:105
#: intervention/templates/intervention/detail/view.html:56
#: intervention/templates/intervention/report/report.html:37
#: intervention/utils/quality.py:62 konova/filters/mixins/office.py:34
msgid "Conservation office"
msgstr "Eintragungsstelle"
#: analysis/forms.py:51 compensation/forms/mixins.py:23
#: analysis/forms.py:54 compensation/forms/mixins.py:23
msgid "Select the responsible office"
msgstr "Verantwortliche Stelle"
#: analysis/forms.py:60 compensation/forms/compensation.py:94
#: analysis/forms.py:63 compensation/forms/compensation.py:94
#: compensation/forms/mixins.py:32 compensation/forms/mixins.py:62
#: intervention/forms/intervention.py:66 intervention/forms/intervention.py:83
#: intervention/forms/intervention.py:99 intervention/forms/intervention.py:115
#: intervention/forms/intervention.py:156 intervention/forms/modals/share.py:41
#: intervention/forms/intervention.py:67 intervention/forms/intervention.py:84
#: intervention/forms/intervention.py:100
#: intervention/forms/intervention.py:116
#: intervention/forms/intervention.py:157 intervention/forms/modals/share.py:41
#: intervention/forms/modals/share.py:55 user/forms/modals/team.py:48
#: user/forms/modals/team.py:112
msgid "Click for selection"
msgstr "Auswählen..."
#: analysis/forms.py:67
#: analysis/forms.py:70
msgid "Generate report"
msgstr "Bericht generieren"
#: analysis/forms.py:68
#: analysis/forms.py:71
msgid "Select a timespan and the desired conservation office"
msgstr "Wählen Sie die Zeitspanne und die gewünschte Eintragungsstelle"
#: analysis/forms.py:71 konova/forms/modals/base_form.py:30
#: analysis/forms.py:74 konova/forms/modals/base_form.py:30
msgid "Continue"
msgstr "Weiter"
@ -286,7 +287,7 @@ msgid "Compensation"
msgstr "Kompensation"
#: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:21
#: compensation/forms/modals/payment.py:63
#: compensation/forms/modals/payment.py:65
msgid "Payment"
msgstr "Zahlung"
@ -309,7 +310,7 @@ msgstr ""
" "
#: analysis/templates/analysis/reports/includes/intervention/laws.html:14
#: intervention/forms/intervention.py:71
#: intervention/forms/intervention.py:72
#: intervention/templates/intervention/detail/view.html:39
#: intervention/templates/intervention/report/report.html:20
msgid "Law"
@ -358,12 +359,12 @@ msgstr "Nur unverzeichnete anzeigen"
#: compensation/forms/compensation.py:30 compensation/tables/compensation.py:23
#: compensation/tables/eco_account.py:24 ema/tables.py:26
#: intervention/forms/intervention.py:29 intervention/tables.py:23
#: intervention/forms/intervention.py:30 intervention/tables.py:23
#: intervention/templates/intervention/detail/includes/compensations.html:30
msgid "Identifier"
msgstr "Kennung"
#: compensation/forms/compensation.py:33 intervention/forms/intervention.py:32
#: compensation/forms/compensation.py:33 intervention/forms/intervention.py:33
#: user/forms/user.py:77
msgid "Generated automatically - not editable"
msgstr "Automatisch generiert - nicht bearbeitbar"
@ -379,16 +380,16 @@ msgstr "Automatisch generiert - nicht bearbeitbar"
#: ema/tables.py:31 ema/templates/ema/detail/includes/documents.html:28
#: ema/templates/ema/detail/view.html:31
#: ema/templates/ema/report/report.html:12
#: intervention/forms/intervention.py:42 intervention/tables.py:28
#: intervention/forms/intervention.py:43 intervention/tables.py:28
#: intervention/templates/intervention/detail/includes/compensations.html:33
#: intervention/templates/intervention/detail/includes/documents.html:33
#: intervention/templates/intervention/detail/view.html:31
#: intervention/templates/intervention/report/report.html:12
#: konova/forms/modals/document_form.py:24
#: konova/forms/modals/document_form.py:25
msgid "Title"
msgstr "Bezeichnung"
#: compensation/forms/compensation.py:45 intervention/forms/intervention.py:44
#: compensation/forms/compensation.py:45 intervention/forms/intervention.py:45
msgid "An explanatory name"
msgstr "Aussagekräftiger Titel"
@ -399,7 +400,7 @@ msgstr "Kompensation XY; Flur ABC"
#: compensation/forms/compensation.py:56
#: compensation/forms/modals/compensation_action.py:81
#: compensation/forms/modals/deadline.py:51
#: compensation/forms/modals/payment.py:49
#: compensation/forms/modals/payment.py:51
#: compensation/templates/compensation/detail/compensation/includes/actions.html:35
#: compensation/templates/compensation/detail/compensation/includes/deadlines.html:39
#: compensation/templates/compensation/detail/compensation/includes/documents.html:34
@ -409,21 +410,21 @@ msgstr "Kompensation XY; Flur ABC"
#: ema/templates/ema/detail/includes/actions.html:34
#: ema/templates/ema/detail/includes/deadlines.html:39
#: ema/templates/ema/detail/includes/documents.html:34
#: intervention/forms/intervention.py:200
#: intervention/forms/modals/revocation.py:45
#: intervention/forms/intervention.py:203
#: intervention/forms/modals/revocation.py:47
#: intervention/templates/intervention/detail/includes/documents.html:39
#: intervention/templates/intervention/detail/includes/payments.html:34
#: intervention/templates/intervention/detail/includes/revocation.html:38
#: konova/forms/modals/document_form.py:59
#: konova/forms/modals/resubmission_form.py:35
#: konova/forms/modals/document_form.py:61
#: konova/forms/modals/resubmission_form.py:37
#: konova/templates/konova/includes/comment_card.html:16
msgid "Comment"
msgstr "Kommentar"
#: compensation/forms/compensation.py:58
#: compensation/forms/modals/compensation_action.py:83
#: intervention/forms/intervention.py:202
#: konova/forms/modals/resubmission_form.py:37
#: intervention/forms/intervention.py:205
#: konova/forms/modals/resubmission_form.py:39
msgid "Additional comment"
msgstr "Zusätzlicher Kommentar"
@ -438,7 +439,7 @@ msgid "Select the intervention for which this compensation compensates"
msgstr "Wählen Sie den Eingriff, für den diese Kompensation bestimmt ist"
#: compensation/forms/compensation.py:114
#: compensation/views/compensation/compensation.py:115
#: compensation/views/compensation/compensation.py:120
msgid "New compensation"
msgstr "Neue Kompensation"
@ -446,38 +447,38 @@ msgstr "Neue Kompensation"
msgid "Edit compensation"
msgstr "Bearbeite Kompensation"
#: compensation/forms/eco_account.py:30 compensation/utils/quality.py:97
#: compensation/forms/eco_account.py:31 compensation/utils/quality.py:97
msgid "Available Surface"
msgstr "Verfügbare Fläche"
#: compensation/forms/eco_account.py:33
#: compensation/forms/eco_account.py:34
msgid "The amount that can be used for deductions"
msgstr "Die für Abbuchungen zur Verfügung stehende Menge"
#: compensation/forms/eco_account.py:42
#: compensation/forms/eco_account.py:43
#: compensation/templates/compensation/detail/eco_account/view.html:67
#: compensation/utils/quality.py:84
msgid "Agreement date"
msgstr "Vereinbarungsdatum"
#: compensation/forms/eco_account.py:44
#: compensation/forms/eco_account.py:45
msgid "When did the parties agree on this?"
msgstr "Wann wurde dieses Ökokonto offiziell vereinbart?"
#: compensation/forms/eco_account.py:70
#: compensation/views/eco_account/eco_account.py:96
#: compensation/forms/eco_account.py:72
#: compensation/views/eco_account/eco_account.py:101
msgid "New Eco-Account"
msgstr "Neues Ökokonto"
#: compensation/forms/eco_account.py:79
#: compensation/forms/eco_account.py:81
msgid "Eco-Account XY; Location ABC"
msgstr "Ökokonto XY; Flur ABC"
#: compensation/forms/eco_account.py:145
#: compensation/forms/eco_account.py:147
msgid "Edit Eco-Account"
msgstr "Ökokonto bearbeiten"
#: compensation/forms/eco_account.py:230
#: compensation/forms/eco_account.py:232
msgid "The account can not be removed, since there are still deductions."
msgstr ""
"Das Ökokonto kann nicht entfernt werden, da hierzu noch Abbuchungen "
@ -488,14 +489,14 @@ msgstr ""
#: compensation/templates/compensation/report/eco_account/report.html:20
#: 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/forms/intervention.py:133
#: intervention/templates/intervention/detail/view.html:60
#: intervention/templates/intervention/report/report.html:41
#: intervention/utils/quality.py:55
msgid "Conservation office file number"
msgstr "Aktenzeichen Eintragungsstelle"
#: compensation/forms/mixins.py:43 intervention/forms/intervention.py:138
#: compensation/forms/mixins.py:43 intervention/forms/intervention.py:139
msgid "ETS-123/ABC.456"
msgstr ""
@ -511,11 +512,11 @@ msgstr "Zu welcher Kategorie dieser Maßnahmenträger gehört"
msgid "Eco-Account handler detail"
msgstr "Detailangabe zum Maßnahmenträger"
#: compensation/forms/mixins.py:71 intervention/forms/intervention.py:165
#: compensation/forms/mixins.py:71 intervention/forms/intervention.py:166
msgid "Detail input on the handler"
msgstr "Name der Behörde, Stadt, Firma, ..."
#: compensation/forms/mixins.py:74 intervention/forms/intervention.py:168
#: compensation/forms/mixins.py:74 intervention/forms/intervention.py:169
msgid "Company Mustermann"
msgstr "Firma Mustermann"
@ -604,31 +605,31 @@ msgstr "Geben Sie die Daten der neuen Maßnahme ein"
msgid "Edit action"
msgstr "Maßnahme bearbeiten"
#: compensation/forms/modals/deadline.py:23
#: compensation/forms/modals/deadline.py:22
msgid "Deadline Type"
msgstr "Fristart"
#: compensation/forms/modals/deadline.py:26
#: compensation/forms/modals/deadline.py:25
msgid "Select the deadline type"
msgstr "Fristart wählen"
#: compensation/forms/modals/deadline.py:35
#: compensation/forms/modals/deadline.py:34
#: 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
#: intervention/forms/modals/revocation.py:19
#: konova/forms/modals/resubmission_form.py:22
#: intervention/forms/modals/revocation.py:20
#: konova/forms/modals/resubmission_form.py:23
msgid "Date"
msgstr "Datum"
#: compensation/forms/modals/deadline.py:38
#: compensation/forms/modals/deadline.py:37
msgid "Select date"
msgstr "Datum wählen"
#: 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
#: compensation/forms/modals/payment.py:53
#: intervention/forms/modals/revocation.py:49
#: konova/forms/modals/document_form.py:63
msgid "Additional comment, maximum {} letters"
msgstr "Zusätzlicher Kommentar, maximal {} Zeichen"
@ -640,39 +641,35 @@ msgstr "Neue Frist"
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/forms/modals/deadline.py:79
#: 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
msgid "Edit deadline"
msgstr "Frist/Termin bearbeiten"
#: compensation/forms/modals/payment.py:24
#: compensation/forms/modals/payment.py:25
msgid "in Euro"
msgstr "in Euro"
#: compensation/forms/modals/payment.py:33
#: compensation/forms/modals/payment.py:34
#: intervention/templates/intervention/detail/includes/payments.html:31
msgid "Due on"
msgstr "Fällig am"
#: compensation/forms/modals/payment.py:36
#: compensation/forms/modals/payment.py:38
msgid "Due on which date"
msgstr "Zahlung wird an diesem Datum erwartet"
#: compensation/forms/modals/payment.py:64
#: compensation/forms/modals/payment.py:66
msgid "Add a payment for intervention '{}'"
msgstr "Neue Ersatzzahlung zu Eingriff '{}' hinzufügen"
#: compensation/forms/modals/payment.py:84
#: compensation/forms/modals/payment.py:86
msgid "If there is no date you can enter, please explain why."
msgstr "Falls Sie kein Datum angeben können, erklären Sie bitte weshalb."
#: compensation/forms/modals/payment.py:103
#: compensation/forms/modals/payment.py:105
#: intervention/templates/intervention/detail/includes/payments.html:59
msgid "Edit payment"
msgstr "Zahlung bearbeiten"
@ -924,7 +921,7 @@ msgstr "Öffentlicher Bericht"
#: compensation/templates/compensation/detail/eco_account/includes/controls.html:15
#: ema/templates/ema/detail/includes/controls.html:15
#: intervention/templates/intervention/detail/includes/controls.html:15
#: konova/forms/modals/resubmission_form.py:49
#: konova/forms/modals/resubmission_form.py:51
#: templates/email/resubmission/resubmission.html:4
msgid "Resubmission"
msgstr "Wiedervorlage"
@ -987,7 +984,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/modals/document_form.py:77
#: konova/forms/modals/document_form.py:79
msgid "Add new document"
msgstr "Neues Dokument hinzufügen"
@ -995,7 +992,7 @@ msgstr "Neues Dokument hinzufügen"
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:31
#: ema/templates/ema/detail/includes/documents.html:31
#: intervention/templates/intervention/detail/includes/documents.html:36
#: konova/forms/modals/document_form.py:34
#: konova/forms/modals/document_form.py:35
msgid "Created on"
msgstr "Erstellt"
@ -1003,7 +1000,7 @@ msgstr "Erstellt"
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:61
#: ema/templates/ema/detail/includes/documents.html:61
#: intervention/templates/intervention/detail/includes/documents.html:70
#: konova/forms/modals/document_form.py:139
#: konova/forms/modals/document_form.py:141
msgid "Edit document"
msgstr "Dokument bearbeiten"
@ -1281,14 +1278,14 @@ msgstr "Daten zu den verantwortlichen Stellen"
msgid "Compensations - Overview"
msgstr "Kompensationen - Übersicht"
#: compensation/views/compensation/compensation.py:177
#: konova/utils/message_templates.py:38
#: compensation/views/compensation/compensation.py:182
#: konova/utils/message_templates.py:40
msgid "Compensation {} edited"
msgstr "Kompensation {} bearbeitet"
#: compensation/views/compensation/compensation.py:187
#: compensation/views/eco_account/eco_account.py:161 ema/views/ema.py:220
#: intervention/views/intervention.py:243
#: compensation/views/compensation/compensation.py:197
#: compensation/views/eco_account/eco_account.py:171 ema/views/ema.py:231
#: intervention/views/intervention.py:253
msgid "Edit {}"
msgstr "Bearbeite {}"
@ -1306,15 +1303,15 @@ msgstr "Ökokonten - Übersicht"
msgid "Eco-Account {} added"
msgstr "Ökokonto {} hinzugefügt"
#: compensation/views/eco_account/eco_account.py:151
#: compensation/views/eco_account/eco_account.py:156
msgid "Eco-Account {} edited"
msgstr "Ökokonto {} bearbeitet"
#: compensation/views/eco_account/eco_account.py:275
#: compensation/views/eco_account/eco_account.py:285
msgid "Eco-account removed"
msgstr "Ökokonto entfernt"
#: ema/forms.py:42 ema/views/ema.py:96
#: ema/forms.py:42 ema/views/ema.py:102
msgid "New EMA"
msgstr "Neue EMA hinzufügen"
@ -1350,78 +1347,78 @@ msgstr "EMAs - Übersicht"
msgid "EMA {} added"
msgstr "EMA {} hinzugefügt"
#: ema/views/ema.py:210
#: ema/views/ema.py:216
msgid "EMA {} edited"
msgstr "EMA {} bearbeitet"
#: ema/views/ema.py:244
#: ema/views/ema.py:255
msgid "EMA removed"
msgstr "EMA entfernt"
#: intervention/forms/intervention.py:48
#: intervention/forms/intervention.py:49
msgid "Construction XY; Location ABC"
msgstr "Bauvorhaben XY; Flur ABC"
#: intervention/forms/intervention.py:54
#: intervention/forms/intervention.py:55
#: intervention/templates/intervention/detail/view.html:35
#: intervention/templates/intervention/report/report.html:16
#: intervention/utils/quality.py:95
msgid "Process type"
msgstr "Verfahrenstyp"
#: intervention/forms/intervention.py:73
#: intervention/forms/intervention.py:74
msgid "Multiple selection possible"
msgstr "Mehrfachauswahl möglich"
#: intervention/forms/intervention.py:88
#: intervention/forms/intervention.py:89
#: intervention/templates/intervention/detail/view.html:48
#: intervention/templates/intervention/report/report.html:29
#: intervention/utils/quality.py:59 konova/filters/mixins/office.py:66
msgid "Registration office"
msgstr "Zulassungsbehörde"
#: intervention/forms/intervention.py:120
#: intervention/forms/intervention.py:121
#: intervention/templates/intervention/detail/view.html:52
#: intervention/templates/intervention/report/report.html:33
#: intervention/utils/quality.py:52
msgid "Registration office file number"
msgstr "Aktenzeichen Zulassungsbehörde"
#: intervention/forms/intervention.py:126
#: intervention/forms/intervention.py:127
msgid "ZB-123/ABC.456"
msgstr ""
#: intervention/forms/intervention.py:144
#: intervention/forms/intervention.py:145
msgid "Intervention handler type"
msgstr "Art des Eingriffsverursachers"
#: intervention/forms/intervention.py:146
#: intervention/forms/intervention.py:147
msgid "What type of handler is responsible for the intervention?"
msgstr "Zu welcher Kategorie dieser Eingriffsverursacher gehört"
#: intervention/forms/intervention.py:161
#: intervention/forms/intervention.py:162
msgid "Intervention handler detail"
msgstr "Detailangabe zum Eingriffsverursacher"
#: intervention/forms/intervention.py:175
#: intervention/forms/intervention.py:176
#: intervention/templates/intervention/detail/view.html:101
#: intervention/templates/intervention/report/report.html:81
#: intervention/utils/quality.py:86
msgid "Registration date"
msgstr "Datum Zulassung bzw. Satzungsbeschluss"
#: intervention/forms/intervention.py:187
#: intervention/forms/intervention.py:189
#: intervention/templates/intervention/detail/view.html:105
#: intervention/templates/intervention/report/report.html:85
msgid "Binding on"
msgstr "Datum Bestandskraft bzw. Rechtskraft"
#: intervention/forms/intervention.py:213
#: intervention/views/intervention.py:100
#: intervention/forms/intervention.py:216
#: intervention/views/intervention.py:105
msgid "New intervention"
msgstr "Neuer Eingriff"
#: intervention/forms/intervention.py:303
#: intervention/forms/intervention.py:306
msgid "Edit intervention"
msgstr "Eingriff bearbeiten"
@ -1486,25 +1483,25 @@ msgstr ""
"Das Ökokonto {} hat für eine Abbuchung von {} m² nicht ausreichend "
"Restfläche. Es stehen noch {} m² zur Verfügung."
#: intervention/forms/modals/revocation.py:21
#: intervention/forms/modals/revocation.py:22
msgid "Date of revocation"
msgstr "Datum des Widerspruchs"
#: intervention/forms/modals/revocation.py:32
#: intervention/forms/modals/revocation.py:34
#: intervention/templates/intervention/detail/includes/revocation.html:35
msgid "Document"
msgstr "Dokument"
#: intervention/forms/modals/revocation.py:35
#: intervention/forms/modals/revocation.py:37
msgid "Must be smaller than 15 Mb"
msgstr "Muss kleiner als 15 Mb sein"
#: intervention/forms/modals/revocation.py:60
#: intervention/forms/modals/revocation.py:62
#: intervention/templates/intervention/detail/includes/revocation.html:18
msgid "Add revocation"
msgstr "Widerspruch hinzufügen"
#: intervention/forms/modals/revocation.py:78
#: intervention/forms/modals/revocation.py:80
#: intervention/templates/intervention/detail/includes/revocation.html:69
msgid "Edit revocation"
msgstr "Widerspruch bearbeiten"
@ -1657,11 +1654,11 @@ msgstr "Eingriffe - Übersicht"
msgid "Intervention {} added"
msgstr "Eingriff {} hinzugefügt"
#: intervention/views/intervention.py:231
#: intervention/views/intervention.py:236
msgid "Intervention {} edited"
msgstr "Eingriff {} bearbeitet"
#: intervention/views/intervention.py:268
#: intervention/views/intervention.py:278
msgid "{} removed"
msgstr "{} entfernt"
@ -1779,30 +1776,30 @@ msgstr "Speichern"
msgid "Not editable"
msgstr "Nicht editierbar"
#: konova/forms/geometry_form.py:30 konova/utils/quality.py:44
#: konova/forms/geometry_form.py:32 konova/utils/quality.py:44
#: konova/utils/quality.py:46 templates/form/collapsable/form.html:45
msgid "Geometry"
msgstr "Geometrie"
#: konova/forms/geometry_form.py:99
#: konova/forms/geometry_form.py:101
msgid "Only surfaces allowed. Points or lines must be buffered."
msgstr ""
"Nur Flächen erlaubt. Punkte oder Linien müssen zu Flächen gepuffert werden."
#: konova/forms/modals/document_form.py:36
#: konova/forms/modals/document_form.py:37
msgid "When has this file been created? Important for photos."
msgstr "Wann wurde diese Datei erstellt oder das Foto aufgenommen?"
#: konova/forms/modals/document_form.py:47
#: konova/forms/modals/document_form.py:49
#: venv/lib/python3.7/site-packages/django/db/models/fields/files.py:231
msgid "File"
msgstr "Datei"
#: konova/forms/modals/document_form.py:49
#: konova/forms/modals/document_form.py:51
msgid "Allowed formats: pdf, jpg, png. Max size 15 MB."
msgstr "Formate: pdf, jpg, png. Maximal 15 MB."
#: konova/forms/modals/document_form.py:114
#: konova/forms/modals/document_form.py:116
msgid "Added document"
msgstr "Dokument hinzugefügt"
@ -1839,15 +1836,15 @@ msgstr "Löschen"
msgid "Are you sure?"
msgstr "Sind Sie sicher?"
#: konova/forms/modals/resubmission_form.py:23
#: konova/forms/modals/resubmission_form.py:24
msgid "When do you want to be reminded?"
msgstr "Wann wollen Sie erinnert werden?"
#: konova/forms/modals/resubmission_form.py:50
#: konova/forms/modals/resubmission_form.py:52
msgid "Set your resubmission for this entry."
msgstr "Setzen Sie eine Wiedervorlage für diesen Eintrag."
#: konova/forms/modals/resubmission_form.py:71
#: konova/forms/modals/resubmission_form.py:73
msgid "The date should be in the future"
msgstr "Das Datum sollte in der Zukunft liegen"
@ -2021,32 +2018,32 @@ msgstr "Anfrage für neuen API Token"
msgid "Resubmission - {}"
msgstr "Wiedervorlage - {}"
#: konova/utils/message_templates.py:10
#: konova/utils/message_templates.py:12
msgid "no further details"
msgstr "keine weitere Angabe"
#: konova/utils/message_templates.py:11
#: konova/utils/message_templates.py:13
#: venv/lib/python3.7/site-packages/django/forms/widgets.py:709
msgid "Unknown"
msgstr "Unbekannt"
#: konova/utils/message_templates.py:12
#: konova/utils/message_templates.py:14
msgid "Ungrouped"
msgstr "Ohne Zuordnung"
#: konova/utils/message_templates.py:13
#: konova/utils/message_templates.py:15
msgid "There was an error on this form."
msgstr "Es gab einen Fehler im Formular."
#: konova/utils/message_templates.py:14
#: konova/utils/message_templates.py:16
msgid "Invalid parameters"
msgstr "Parameter ungültig"
#: konova/utils/message_templates.py:15
#: konova/utils/message_templates.py:17
msgid "There are errors in this intervention."
msgstr "Es liegen Fehler in diesem Eingriff vor:"
#: konova/utils/message_templates.py:16
#: konova/utils/message_templates.py:18
msgid ""
"The identifier '{}' had to be changed to '{}' since another entry has been "
"added in the meanwhile, which uses this identifier"
@ -2054,33 +2051,33 @@ msgstr ""
"Die Kennung '{}' musste zu '{}' geändert werden, da ein anderer Eintrag in "
"der Zwischenzeit angelegt wurde, welcher diese Kennung nun bereits verwendet"
#: konova/utils/message_templates.py:17
#: konova/utils/message_templates.py:19
msgid ""
"Only conservation or registration office users are allowed to remove entries."
msgstr ""
"Nur Mitarbeiter der Naturschutz- oder Zulassungsbehördengruppe dürfen "
"Einträge entfernen"
#: konova/utils/message_templates.py:18
#: konova/utils/message_templates.py:20
msgid "You need to be part of another user group."
msgstr "Hierfür müssen Sie einer anderen Nutzergruppe angehören!"
#: konova/utils/message_templates.py:19
#: konova/utils/message_templates.py:21
msgid "Status of Checked and Recorded reseted"
msgstr "'Geprüft'/'Verzeichnet' wurde zurückgesetzt"
#: konova/utils/message_templates.py:20
#: konova/utils/message_templates.py:22
msgid ""
"Entry is recorded. To edit data, the entry first needs to be unrecorded."
msgstr ""
"Eintrag ist verzeichnet. Um Daten zu bearbeiten, muss der Eintrag erst "
"entzeichnet werden."
#: konova/utils/message_templates.py:23
#: konova/utils/message_templates.py:25
msgid "This data is not shared with you"
msgstr "Diese Daten sind für Sie nicht freigegeben"
#: konova/utils/message_templates.py:24
#: konova/utils/message_templates.py:26
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 "
@ -2090,11 +2087,11 @@ msgstr ""
"bedeutet, dass Sie nur lesenden Zugriff hierauf haben und weder bearbeiten, "
"noch Prüfungen durchführen oder verzeichnen können."
#: konova/utils/message_templates.py:25
#: konova/utils/message_templates.py:27
msgid "Share settings updated"
msgstr "Freigabe Einstellungen aktualisiert"
#: konova/utils/message_templates.py:26
#: konova/utils/message_templates.py:28
msgid ""
"Do not forget to share your entry! Currently you are the only one having "
"shared access."
@ -2102,15 +2099,15 @@ msgstr ""
"Denken Sie daran Ihren Eintrag freizugeben! Aktuell haben nur Sie eine "
"Freigabe hierauf."
#: konova/utils/message_templates.py:29
#: konova/utils/message_templates.py:31
msgid "Unsupported file type"
msgstr "Dateiformat nicht unterstützt"
#: konova/utils/message_templates.py:30
#: konova/utils/message_templates.py:32
msgid "File too large"
msgstr "Datei zu groß"
#: konova/utils/message_templates.py:33
#: konova/utils/message_templates.py:35
msgid ""
"Action canceled. Eco account is recorded or deductions exist. Only "
"conservation office member can perform this action."
@ -2118,136 +2115,144 @@ msgstr ""
"Aktion abgebrochen. Ökokonto ist bereits verzeichnet oder Abbuchungen liegen "
"vor. Nur Eintragungsstellennutzer können diese Aktion jetzt durchführen."
#: konova/utils/message_templates.py:36
#: konova/utils/message_templates.py:38
msgid "Compensation {} added"
msgstr "Kompensation {} hinzugefügt"
#: konova/utils/message_templates.py:37
#: konova/utils/message_templates.py:39
msgid "Compensation {} removed"
msgstr "Kompensation {} entfernt"
#: konova/utils/message_templates.py:39
#: konova/utils/message_templates.py:41
msgid "Added compensation action"
msgstr "Maßnahme hinzugefügt"
#: konova/utils/message_templates.py:40
#: konova/utils/message_templates.py:42
msgid "Added compensation state"
msgstr "Zustand hinzugefügt"
#: konova/utils/message_templates.py:43
#: konova/utils/message_templates.py:45
msgid "State removed"
msgstr "Zustand gelöscht"
#: konova/utils/message_templates.py:44
#: konova/utils/message_templates.py:46
msgid "State edited"
msgstr "Zustand bearbeitet"
#: konova/utils/message_templates.py:45
#: konova/utils/message_templates.py:47
msgid "State added"
msgstr "Zustand hinzugefügt"
#: konova/utils/message_templates.py:48
#: konova/utils/message_templates.py:50
msgid "Action added"
msgstr "Maßnahme hinzugefügt"
#: konova/utils/message_templates.py:49
#: konova/utils/message_templates.py:51
msgid "Action edited"
msgstr "Maßnahme bearbeitet"
#: konova/utils/message_templates.py:50
#: konova/utils/message_templates.py:52
msgid "Action removed"
msgstr "Maßnahme entfernt"
#: konova/utils/message_templates.py:53
#: konova/utils/message_templates.py:55
msgid "Deduction added"
msgstr "Abbuchung hinzugefügt"
#: konova/utils/message_templates.py:54
#: konova/utils/message_templates.py:56
msgid "Deduction edited"
msgstr "Abbuchung bearbeitet"
#: konova/utils/message_templates.py:55
#: konova/utils/message_templates.py:57
msgid "Deduction removed"
msgstr "Abbuchung entfernt"
#: konova/utils/message_templates.py:56
#: konova/utils/message_templates.py:58
msgid "Unknown deduction"
msgstr "Unbekannte Abbuchung"
#: konova/utils/message_templates.py:59
#: konova/utils/message_templates.py:61
msgid "Deadline added"
msgstr "Frist/Termin hinzugefügt"
#: konova/utils/message_templates.py:60
#: konova/utils/message_templates.py:62
msgid "Deadline edited"
msgstr "Frist/Termin bearbeitet"
#: konova/utils/message_templates.py:61
#: konova/utils/message_templates.py:63
msgid "Deadline removed"
msgstr "Frist/Termin gelöscht"
#: konova/utils/message_templates.py:64
#: konova/utils/message_templates.py:66
msgid "Payment added"
msgstr "Zahlung hinzugefügt"
#: konova/utils/message_templates.py:65
#: konova/utils/message_templates.py:67
msgid "Payment edited"
msgstr "Zahlung bearbeitet"
#: konova/utils/message_templates.py:66
#: konova/utils/message_templates.py:68
msgid "Payment removed"
msgstr "Zahlung gelöscht"
#: konova/utils/message_templates.py:69
#: konova/utils/message_templates.py:71
msgid "Revocation added"
msgstr "Widerspruch hinzugefügt"
#: konova/utils/message_templates.py:70
#: konova/utils/message_templates.py:72
msgid "Revocation edited"
msgstr "Widerspruch bearbeitet"
#: konova/utils/message_templates.py:71
#: konova/utils/message_templates.py:73
msgid "Revocation removed"
msgstr "Widerspruch entfernt"
#: konova/utils/message_templates.py:74
#: konova/utils/message_templates.py:76
msgid "Document '{}' deleted"
msgstr "Dokument '{}' gelöscht"
#: konova/utils/message_templates.py:75
#: konova/utils/message_templates.py:77
msgid "Document added"
msgstr "Dokument hinzugefügt"
#: konova/utils/message_templates.py:76
#: konova/utils/message_templates.py:78
msgid "Document edited"
msgstr "Dokument bearbeitet"
#: konova/utils/message_templates.py:79
#: konova/utils/message_templates.py:81
msgid "Edited general data"
msgstr "Allgemeine Daten bearbeitet"
#: konova/utils/message_templates.py:80
#: konova/utils/message_templates.py:82
msgid "Added deadline"
msgstr "Frist/Termin hinzugefügt"
#: konova/utils/message_templates.py:83
#: konova/utils/message_templates.py:85
msgid "Geometry conflict detected with {}"
msgstr "Geometriekonflikt mit folgenden Einträgen erkannt: {}"
#: konova/utils/message_templates.py:86
msgid ""
"The geometry contained more than {} vertices. It had to be simplified to "
"match the allowed limit of {} vertices."
msgstr ""
"Die Geometrie enthielt mehr als {} Eckpunkte. Sie musste vereinfacht werden um die Obergrenze von {} "
"erlaubten Eckpunkten einzuhalten."
#: konova/utils/message_templates.py:89
msgid "This intervention has {} revocations"
msgstr "Dem Eingriff liegen {} Widersprüche vor"
#: konova/utils/message_templates.py:89
#: konova/utils/message_templates.py:92
msgid "Checked on {} by {}"
msgstr "Am {} von {} geprüft worden"
#: konova/utils/message_templates.py:90
#: konova/utils/message_templates.py:93
msgid "Data has changed since last check on {} by {}"
msgstr ""
"Daten wurden nach der letzten Prüfung geändert. Letzte Prüfung am {} durch {}"
#: konova/utils/message_templates.py:91
#: konova/utils/message_templates.py:94
msgid "Current data not checked yet"
msgstr "Momentane Daten noch nicht geprüft"
@ -2275,6 +2280,12 @@ msgstr "Für Sie freigegeben - Datensatz kann bearbeitet werden"
msgid "Access not granted"
msgstr "Nicht freigegeben - Datensatz nur lesbar"
#: konova/utils/validators.py:26
msgid "This date is unrealistic. Please enter the correct date (>1950)."
msgstr ""
"Dieses Datum ist unrealistisch. Geben Sie bitte das korrekte Datum ein "
"(>1950)."
#: konova/views/home.py:74 templates/navbars/navbar.html:16
msgid "Home"
msgstr "Home"

Loading…
Cancel
Save