# NewEcoAccount EditEcoAccount view

* refactors new and edit eco account views from function to class based
* removes info message if checked intervention is altered and loses the current checked state
* updates comments/documentation
* removes code duplicates
* fixes display error where modal form was hidden behind menu bar of map client
* fixes bug where compensation could not be created directly from intervention
This commit is contained in:
mpeltriaux 2025-10-20 09:49:18 +02:00
parent 73178b3fd2
commit a86d86b731
8 changed files with 56 additions and 33 deletions

View File

@ -510,12 +510,6 @@ class Compensation(AbstractCompensation, CEFMixin, CoherenceMixin, PikMixin):
return retval
@property
def checked(self):
if self.intervention:
return self.intervention.checked
return None
class CompensationDocument(AbstractDocument):
"""

View File

@ -8,8 +8,9 @@ Created on: 24.08.21
from django.urls import path
from compensation.autocomplete.eco_account import EcoAccountAutocomplete
from compensation.views.eco_account.eco_account import new_view, edit_view, remove_view, \
EcoAccountIndexView, EcoAccountIdentifierGeneratorView, EcoAccountDetailView
from compensation.views.eco_account.eco_account import remove_view, \
EcoAccountIndexView, EcoAccountIdentifierGeneratorView, EcoAccountDetailView, NewEcoAccountFormView, \
EditEcoAccountFormView
from compensation.views.eco_account.log import EcoAccountLogView
from compensation.views.eco_account.record import EcoAccountRecordView
from compensation.views.eco_account.report import EcoAccountReportView
@ -29,13 +30,13 @@ from compensation.views.eco_account.deduction import NewEcoAccountDeductionView,
app_name = "acc"
urlpatterns = [
path("", EcoAccountIndexView.as_view(), name="index"),
path('new/', new_view, name='new'),
path('new/', NewEcoAccountFormView.as_view(), name='new'),
path('new/id', EcoAccountIdentifierGeneratorView.as_view(), name='new-id'),
path('<id>', EcoAccountDetailView.as_view(), name='detail'),
path('<id>/log', EcoAccountLogView.as_view(), name='log'),
path('<id>/record', EcoAccountRecordView.as_view(), name='record'),
path('<id>/report', EcoAccountReportView.as_view(), name='report'),
path('<id>/edit', edit_view, name='edit'),
path('<id>/edit', EditEcoAccountFormView.as_view(), name='edit'),
path('<id>/remove', remove_view, name='remove'),
path('<id>/resub', EcoAccountResubmissionView.as_view(), name='resubmission-create'),

View File

@ -88,7 +88,7 @@ class EditCompensationFormView(BaseEditSpatialLocatedObjectFormView):
_REDIRECT_URL = "compensation:detail"
def _user_has_permission(self, user):
# User has to be an ets user
# User has to be a default user
return user.is_default_user()

View File

@ -23,7 +23,8 @@ from konova.settings import ETS_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, GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE
from konova.views.base import BaseIndexView, BaseIdentifierGeneratorView
from konova.views.base import BaseIndexView, BaseIdentifierGeneratorView, BaseNewSpatialLocatedObjectFormView, \
BaseEditSpatialLocatedObjectFormView
from konova.views.detail import BaseDetailView
@ -40,6 +41,29 @@ class EcoAccountIndexView(LoginRequiredMixin, BaseIndexView):
return qs
class NewEcoAccountFormView(BaseNewSpatialLocatedObjectFormView):
_FORM_CLS = NewEcoAccountForm
_MODEL_CLS = EcoAccount
_TEMPLATE = "compensation/form/view.html"
_TAB_TITLE = _("New Eco-Account")
_REDIRECT_URL = "compensation:acc:detail"
def _user_has_permission(self, user):
# User has to be a default user
return user.is_default_user()
class EditEcoAccountFormView(BaseEditSpatialLocatedObjectFormView):
_FORM_CLS = EditEcoAccountForm
_MODEL_CLS = EcoAccount
_TEMPLATE = "compensation/form/view.html"
_REDIRECT_URL = "compensation:acc:detail"
def _user_has_permission(self, user):
# User has to be a default user
return user.is_default_user()
@login_required
@default_group_required
def new_view(request: HttpRequest):

View File

@ -46,10 +46,6 @@ class NewEmaFormView(BaseNewSpatialLocatedObjectFormView):
# User has to be an ets user
return user.is_ets_user()
def _user_has_shared_access(self, user, **kwargs):
# No specific share constraint for creatin EMA entries
return True
class EditEmaFormView(BaseEditSpatialLocatedObjectFormView):
_MODEL_CLS = Ema

View File

@ -48,7 +48,7 @@ class BaseForm(forms.Form):
self.__check_valid_label_input_ratio()
@abstractmethod
def save(self):
def save(self, *arg, **kwargs):
# To be implemented in subclasses!
pass

View File

@ -288,4 +288,8 @@ Overwrites netgis.css attributes
Overwrites gradient used on default css of netgis map client
*/
background: var(--rlp-red) !important;
}
.modal{
z-index: 100000;
}

View File

@ -18,7 +18,7 @@ from konova.forms import BaseForm, SimpleGeomForm
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.general import check_user_is_in_any_group
from konova.utils.message_templates import MISSING_GROUP_PERMISSION, DATA_UNSHARED, IDENTIFIER_REPLACED, \
GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE, RECORDED_BLOCKS_EDIT, CHECK_STATE_RESET
GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE, RECORDED_BLOCKS_EDIT, CHECK_STATE_RESET, FORM_INVALID
class BaseView(View):
@ -152,7 +152,15 @@ class BaseFormView(BaseView):
class Meta:
abstract = True
def _get_additional_context_data(self, **kwargs):
def _get_additional_context(self, **kwargs):
"""
Args:
**kwargs ():
Returns:
"""
return {}
@ -173,11 +181,11 @@ class BaseNewSpatialLocatedObjectFormView(BaseSpatialLocatedObjectFormView):
# There is no shared access control since nothing exists yet
return True
def get(self, request: HttpRequest):
form: BaseForm = self._FORM_CLS(None, user=request.user)
def get(self, request: HttpRequest, **kwargs):
form: BaseForm = self._FORM_CLS(None, **kwargs, user=request.user)
geom_form: SimpleGeomForm = self._GEOMETRY_FORM_CLS(None, user=request.user, read_only=False)
context = self._get_additional_context_data()
context = self._get_additional_context()
context = BaseContext(request, additional_context=context).context
context.update(
{
@ -188,8 +196,8 @@ class BaseNewSpatialLocatedObjectFormView(BaseSpatialLocatedObjectFormView):
)
return render(request, self._TEMPLATE, context)
def post(self, request: HttpRequest):
form: BaseForm = self._FORM_CLS(request.POST or None, user=request.user)
def post(self, request: HttpRequest, **kwargs):
form: BaseForm = self._FORM_CLS(request.POST or None, **kwargs, user=request.user)
geom_form: SimpleGeomForm = self._GEOMETRY_FORM_CLS(request.POST or None, user=request.user, read_only=False)
if form.is_valid() and geom_form.is_valid():
@ -222,7 +230,8 @@ class BaseNewSpatialLocatedObjectFormView(BaseSpatialLocatedObjectFormView):
return redirect(obj_redirect_url)
else:
context = self._get_additional_context_data()
context = self._get_additional_context()
messages.error(request, FORM_INVALID, extra_tags="danger",)
context = BaseContext(request, additional_context=context).context
context.update(
@ -255,7 +264,7 @@ class BaseEditSpatialLocatedObjectFormView(BaseSpatialLocatedObjectFormView):
form: BaseForm = self._FORM_CLS(None, instance=obj, user=request.user)
geom_form: SimpleGeomForm = self._GEOMETRY_FORM_CLS(None, instance=obj, read_only=False)
context = self._get_additional_context_data()
context = self._get_additional_context()
context = BaseContext(request, additional_context=context).context
context.update(
{
@ -280,12 +289,6 @@ class BaseEditSpatialLocatedObjectFormView(BaseSpatialLocatedObjectFormView):
obj = form.save(request.user, geom_form)
messages.success(request, _("{} edited").format(obj.identifier))
# The data form takes the geom form for processing, as well as the performing user
# Save the current state of recorded|checked to inform the user in case of a status reset due to editing
obj_is_checked = obj.checked is not None
if obj_is_checked:
messages.info(request, CHECK_STATE_RESET)
if geom_form.has_geometry_simplified():
messages.info(
request,
@ -301,7 +304,8 @@ class BaseEditSpatialLocatedObjectFormView(BaseSpatialLocatedObjectFormView):
return redirect(obj_redirect_url)
else:
context = self._get_additional_context_data()
context = self._get_additional_context()
messages.error(request, FORM_INVALID, extra_tags="danger",)
context = BaseContext(request, additional_context=context).context
context.update(