Compare commits

..

No commits in common. "1fc1b533cd1b2b9c5cbc69ff0c030cb6ce34c80f" and "d5accb214359bea5afc2098de4071dcbdd607671" have entirely different histories.

19 changed files with 372 additions and 268 deletions

View File

@ -6,27 +6,12 @@ Created on: 18.08.22
""" """
from compensation.models import CompensationDocument, EcoAccountDocument from compensation.models import CompensationDocument, EcoAccountDocument
from konova.forms.modals import NewDocumentModalForm, EditDocumentModalForm, RemoveDocumentModalForm from konova.forms.modals import NewDocumentModalForm
class NewCompensationDocumentModalForm(NewDocumentModalForm): class NewCompensationDocumentModalForm(NewDocumentModalForm):
_DOCUMENT_CLS = CompensationDocument document_model = CompensationDocument
class EditCompensationDocumentModalForm(EditDocumentModalForm):
_DOCUMENT_CLS = CompensationDocument
class RemoveCompensationDocumentModalForm(RemoveDocumentModalForm):
_DOCUMENT_CLS = CompensationDocument
class NewEcoAccountDocumentModalForm(NewDocumentModalForm): class NewEcoAccountDocumentModalForm(NewDocumentModalForm):
_DOCUMENT_CLS = EcoAccountDocument document_model = EcoAccountDocument
class EditEcoAccountDocumentModalForm(EditDocumentModalForm):
_DOCUMENT_CLS = EcoAccountDocument
class RemoveEcoAccountDocumentModalForm(RemoveDocumentModalForm):
_DOCUMENT_CLS = EcoAccountDocument

View File

@ -5,33 +5,62 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from compensation.forms.modals.document import NewCompensationDocumentModalForm, EditCompensationDocumentModalForm, \ from django.contrib.auth.decorators import login_required
RemoveCompensationDocumentModalForm from django.utils.decorators import method_decorator
from compensation.forms.modals.document import NewCompensationDocumentModalForm
from compensation.models import Compensation, CompensationDocument from compensation.models import Compensation, CompensationDocument
from konova.decorators import shared_access_required, default_group_required, login_required_modal
from konova.forms.modals import EditDocumentModalForm
from konova.views.document import AbstractNewDocumentView, AbstractGetDocumentView, AbstractRemoveDocumentView, \ from konova.views.document import AbstractNewDocumentView, AbstractGetDocumentView, AbstractRemoveDocumentView, \
AbstractEditDocumentView AbstractEditDocumentView
class NewCompensationDocumentView(AbstractNewDocumentView): class NewCompensationDocumentView(AbstractNewDocumentView):
_MODEL_CLS = Compensation model = Compensation
_FORM_CLS = NewCompensationDocumentModalForm form = NewCompensationDocumentModalForm
_REDIRECT_URL = "compensation:detail" redirect_url = "compensation:detail"
@method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Compensation, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
class GetCompensationDocumentView(AbstractGetDocumentView): class GetCompensationDocumentView(AbstractGetDocumentView):
_MODEL_CLS = Compensation model = Compensation
_DOCUMENT_CLS = CompensationDocument document_model = CompensationDocument
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Compensation, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
class RemoveCompensationDocumentView(AbstractRemoveDocumentView): class RemoveCompensationDocumentView(AbstractRemoveDocumentView):
_MODEL_CLS = Compensation model = Compensation
_DOCUMENT_CLS = CompensationDocument document_model = CompensationDocument
_FORM_CLS = RemoveCompensationDocumentModalForm
_REDIRECT_URL = "compensation:detail" @method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Compensation, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
class EditCompensationDocumentView(AbstractEditDocumentView): class EditCompensationDocumentView(AbstractEditDocumentView):
_MODEL_CLS = Compensation model = Compensation
_DOCUMENT_CLS = CompensationDocument document_model = CompensationDocument
_FORM_CLS = EditCompensationDocumentModalForm form = EditDocumentModalForm
_REDIRECT_URL = "compensation:detail" redirect_url = "compensation:detail"
@method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Compensation, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)

View File

@ -5,11 +5,20 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from compensation.models import Compensation from compensation.models import Compensation
from konova.decorators import shared_access_required, default_group_required, login_required_modal
from konova.views.log import AbstractLogView from konova.views.log import AbstractLogView
class CompensationLogView(LoginRequiredMixin, AbstractLogView): class CompensationLogView(AbstractLogView):
_MODEL_CLS = Compensation model = Compensation
@method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Compensation, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)

View File

@ -5,33 +5,65 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from compensation.forms.modals.document import NewEcoAccountDocumentModalForm, RemoveEcoAccountDocumentModalForm, \ from django.contrib.auth.decorators import login_required
EditEcoAccountDocumentModalForm from django.http import HttpRequest
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.utils.decorators import method_decorator
from compensation.forms.modals.document import NewEcoAccountDocumentModalForm
from compensation.models import EcoAccount, EcoAccountDocument from compensation.models import EcoAccount, EcoAccountDocument
from konova.decorators import shared_access_required, default_group_required, login_required_modal
from konova.forms.modals import EditDocumentModalForm
from konova.views.document import AbstractNewDocumentView, AbstractGetDocumentView, AbstractRemoveDocumentView, \ from konova.views.document import AbstractNewDocumentView, AbstractGetDocumentView, AbstractRemoveDocumentView, \
AbstractEditDocumentView AbstractEditDocumentView
class NewEcoAccountDocumentView(AbstractNewDocumentView): class NewEcoAccountDocumentView(AbstractNewDocumentView):
_MODEL_CLS = EcoAccount model = EcoAccount
_FORM_CLS = NewEcoAccountDocumentModalForm form = NewEcoAccountDocumentModalForm
_REDIRECT_URL = "compensation:acc:detail" redirect_url = "compensation:acc:detail"
@method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(EcoAccount, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
class GetEcoAccountDocumentView(AbstractGetDocumentView): class GetEcoAccountDocumentView(AbstractGetDocumentView):
_MODEL_CLS = EcoAccount model = EcoAccount
_DOCUMENT_CLS = EcoAccountDocument document_model = EcoAccountDocument
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(EcoAccount, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
class RemoveEcoAccountDocumentView(AbstractRemoveDocumentView): class RemoveEcoAccountDocumentView(AbstractRemoveDocumentView):
_MODEL_CLS = EcoAccount model = EcoAccount
_DOCUMENT_CLS = EcoAccountDocument document_model = EcoAccountDocument
_FORM_CLS = RemoveEcoAccountDocumentModalForm
_REDIRECT_URL = "compensation:acc:detail" @method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(EcoAccount, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
class EditEcoAccountDocumentView(AbstractEditDocumentView): class EditEcoAccountDocumentView(AbstractEditDocumentView):
_MODEL_CLS = EcoAccount model = EcoAccount
_DOCUMENT_CLS = EcoAccountDocument document_model = EcoAccountDocument
_FORM_CLS = EditEcoAccountDocumentModalForm form = EditDocumentModalForm
_REDIRECT_URL = "compensation:acc:detail" redirect_url = "compensation:acc:detail"
@method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(EcoAccount, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)

View File

@ -5,11 +5,20 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from compensation.models import EcoAccount from compensation.models import EcoAccount
from konova.decorators import shared_access_required, default_group_required, login_required_modal
from konova.views.log import AbstractLogView from konova.views.log import AbstractLogView
class EcoAccountLogView(LoginRequiredMixin, AbstractLogView): class EcoAccountLogView(AbstractLogView):
_MODEL_CLS = EcoAccount model = EcoAccount
@method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(EcoAccount, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)

View File

@ -15,7 +15,7 @@ from compensation.forms.compensation import AbstractCompensationForm
from ema.models import Ema, EmaDocument from ema.models import Ema, EmaDocument
from intervention.models import Responsibility, Handler from intervention.models import Responsibility, Handler
from konova.forms import SimpleGeomForm from konova.forms import SimpleGeomForm
from konova.forms.modals import NewDocumentModalForm, EditDocumentModalForm, RemoveDocumentModalForm from konova.forms.modals import NewDocumentModalForm
from user.models import UserActionLogEntry from user.models import UserActionLogEntry
@ -170,10 +170,4 @@ class EditEmaForm(NewEmaForm):
class NewEmaDocumentModalForm(NewDocumentModalForm): class NewEmaDocumentModalForm(NewDocumentModalForm):
_DOCUMENT_CLS = EmaDocument document_model = EmaDocument
class EditEmaDocumentModalForm(EditDocumentModalForm):
_DOCUMENT_CLS = EmaDocument
class RemoveEmaDocumentModalForm(RemoveDocumentModalForm):
_DOCUMENT_CLS = EmaDocument

View File

@ -5,41 +5,62 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from ema.forms import NewEmaDocumentModalForm, RemoveEmaDocumentModalForm, EditEmaDocumentModalForm from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from ema.forms import NewEmaDocumentModalForm
from ema.models import Ema, EmaDocument from ema.models import Ema, EmaDocument
from konova.decorators import shared_access_required, conservation_office_group_required, login_required_modal
from konova.forms.modals import EditDocumentModalForm
from konova.views.document import AbstractEditDocumentView, AbstractRemoveDocumentView, AbstractGetDocumentView, \ from konova.views.document import AbstractEditDocumentView, AbstractRemoveDocumentView, AbstractGetDocumentView, \
AbstractNewDocumentView AbstractNewDocumentView
class NewEmaDocumentView(AbstractNewDocumentView): class NewEmaDocumentView(AbstractNewDocumentView):
_MODEL_CLS = Ema model = Ema
_FORM_CLS = NewEmaDocumentModalForm form = NewEmaDocumentModalForm
_REDIRECT_URL = "ema:detail" redirect_url = "ema:detail"
@method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(conservation_office_group_required)
@method_decorator(shared_access_required(Ema, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def _user_has_permission(self, user):
return user.is_ets_user()
class GetEmaDocumentView(AbstractGetDocumentView): class GetEmaDocumentView(AbstractGetDocumentView):
_MODEL_CLS = Ema model = Ema
_DOCUMENT_CLS = EmaDocument document_model = EmaDocument
@method_decorator(login_required)
@method_decorator(conservation_office_group_required)
@method_decorator(shared_access_required(Ema, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def _user_has_permission(self, user):
return user.is_ets_user()
class RemoveEmaDocumentView(AbstractRemoveDocumentView): class RemoveEmaDocumentView(AbstractRemoveDocumentView):
_MODEL_CLS = Ema model = Ema
_DOCUMENT_CLS = EmaDocument document_model = EmaDocument
_FORM_CLS = RemoveEmaDocumentModalForm
_REDIRECT_URL = "ema:detail" @method_decorator(login_required_modal)
@method_decorator(login_required)
@method_decorator(conservation_office_group_required)
@method_decorator(shared_access_required(Ema, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def _user_has_permission(self, user):
return user.is_ets_user()
class EditEmaDocumentView(AbstractEditDocumentView): class EditEmaDocumentView(AbstractEditDocumentView):
_MODEL_CLS = Ema model = Ema
_FORM_CLS = EditEmaDocumentModalForm document_model = EmaDocument
_DOCUMENT_CLS = EmaDocument form = EditDocumentModalForm
_REDIRECT_URL = "ema:detail" redirect_url = "ema:detail"
def _user_has_permission(self, user): @method_decorator(login_required_modal)
return user.is_ets_user() @method_decorator(login_required)
@method_decorator(conservation_office_group_required)
@method_decorator(shared_access_required(Ema, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)

View File

@ -5,14 +5,20 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from ema.models import Ema from ema.models import Ema
from konova.decorators import shared_access_required, conservation_office_group_required, login_required_modal
from konova.views.log import AbstractLogView from konova.views.log import AbstractLogView
class EmaLogView(LoginRequiredMixin, AbstractLogView): class EmaLogView(AbstractLogView):
_MODEL_CLS = Ema model = Ema
def _user_has_permission(self, user): @method_decorator(login_required_modal)
return user.is_ets_user() @method_decorator(login_required)
@method_decorator(conservation_office_group_required)
@method_decorator(shared_access_required(Ema, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)

View File

@ -6,11 +6,11 @@ Created on: 18.08.22
""" """
from intervention.models import InterventionDocument from intervention.models import InterventionDocument
from konova.forms.modals import NewDocumentModalForm, EditDocumentModalForm, RemoveDocumentModalForm from konova.forms.modals import NewDocumentModalForm
class NewInterventionDocumentModalForm(NewDocumentModalForm): class NewInterventionDocumentModalForm(NewDocumentModalForm):
_DOCUMENT_CLS = InterventionDocument document_model = InterventionDocument
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
""" Extension of regular NewDocumentModalForm """ Extension of regular NewDocumentModalForm
@ -28,31 +28,3 @@ class NewInterventionDocumentModalForm(NewDocumentModalForm):
self.instance.send_data_to_egon() self.instance.send_data_to_egon()
return doc return doc
class EditInterventionDocumentModalForm(EditDocumentModalForm):
_DOCUMENT_CLS = InterventionDocument
def save(self, *args, **kwargs):
""" Extension of regular EditDocumentModalForm
Checks whether payments exist on the intervention and sends the data to EGON
Args:
*args ():
**kwargs ():
Returns:
"""
doc = super().save(*args, **kwargs)
self.instance.send_data_to_egon()
return doc
class RemoveInterventionDocumentModalForm(RemoveDocumentModalForm):
_DOCUMENT_CLS = InterventionDocument
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.instance.send_data_to_egon()

View File

@ -5,33 +5,59 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from intervention.forms.modals.document import NewInterventionDocumentModalForm, EditInterventionDocumentModalForm, \ from django.contrib.auth.decorators import login_required
RemoveInterventionDocumentModalForm from django.utils.decorators import method_decorator
from intervention.forms.modals.document import NewInterventionDocumentModalForm
from intervention.models import Intervention, InterventionDocument from intervention.models import Intervention, InterventionDocument
from konova.decorators import default_group_required, shared_access_required
from konova.forms.modals import EditDocumentModalForm
from konova.views.document import AbstractNewDocumentView, AbstractGetDocumentView, AbstractRemoveDocumentView, \ from konova.views.document import AbstractNewDocumentView, AbstractGetDocumentView, AbstractRemoveDocumentView, \
AbstractEditDocumentView AbstractEditDocumentView
class NewInterventionDocumentView(AbstractNewDocumentView): class NewInterventionDocumentView(AbstractNewDocumentView):
_MODEL_CLS = Intervention model = Intervention
_DOCUMENT_MODEL = InterventionDocument form = NewInterventionDocumentModalForm
_FORM_CLS = NewInterventionDocumentModalForm redirect_url = "intervention:detail"
_REDIRECT_URL = "intervention:detail"
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Intervention, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
class GetInterventionDocumentView(AbstractGetDocumentView): class GetInterventionDocumentView(AbstractGetDocumentView):
_MODEL_CLS = Intervention model = Intervention
_DOCUMENT_CLS = InterventionDocument document_model = InterventionDocument
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Intervention, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
class RemoveInterventionDocumentView(AbstractRemoveDocumentView): class RemoveInterventionDocumentView(AbstractRemoveDocumentView):
_MODEL_CLS = Intervention model = Intervention
_DOCUMENT_CLS = InterventionDocument document_model = InterventionDocument
_FORM_CLS = RemoveInterventionDocumentModalForm
_REDIRECT_URL = "intervention:detail" @method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Intervention, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
class EditInterventionDocumentView(AbstractEditDocumentView): class EditInterventionDocumentView(AbstractEditDocumentView):
_MODEL_CLS = Intervention model = Intervention
_DOCUMENT_CLS = InterventionDocument document_model = InterventionDocument
_FORM_CLS = EditInterventionDocumentModalForm form = EditDocumentModalForm
_REDIRECT_URL = "intervention:detail" redirect_url = "intervention:detail"
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Intervention, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)

View File

@ -5,11 +5,19 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from intervention.models import Intervention from intervention.models import Intervention
from konova.decorators import shared_access_required, default_group_required
from konova.views.log import AbstractLogView from konova.views.log import AbstractLogView
class InterventionLogView(LoginRequiredMixin, AbstractLogView): class InterventionLogView(AbstractLogView):
_MODEL_CLS = Intervention model = Intervention
@method_decorator(login_required)
@method_decorator(default_group_required)
@method_decorator(shared_access_required(Intervention, "id"))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)

View File

@ -8,10 +8,10 @@ Created on: 15.08.22
from django import forms from django import forms
from django.db import transaction from django.db import transaction
from django.db.models.fields.files import FieldFile from django.db.models.fields.files import FieldFile
from django.shortcuts import get_object_or_404
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from konova.forms.modals.base_form import BaseModalForm from konova.forms.modals.base_form import BaseModalForm
from konova.models import AbstractDocument
from konova.utils import validators from konova.utils import validators
from konova.utils.message_templates import DOCUMENT_EDITED, FILE_SIZE_TOO_LARGE, FILE_TYPE_UNSUPPORTED from konova.utils.message_templates import DOCUMENT_EDITED, FILE_SIZE_TOO_LARGE, FILE_TYPE_UNSUPPORTED
from user.models import UserActionLogEntry from user.models import UserActionLogEntry
@ -69,7 +69,7 @@ class NewDocumentModalForm(BaseModalForm):
} }
) )
) )
_DOCUMENT_CLS = None document_model = None
class Meta: class Meta:
abstract = True abstract = True
@ -81,7 +81,7 @@ class NewDocumentModalForm(BaseModalForm):
self.form_attrs = { self.form_attrs = {
"enctype": "multipart/form-data", # important for file upload "enctype": "multipart/form-data", # important for file upload
} }
if not self._DOCUMENT_CLS: if not self.document_model:
raise NotImplementedError("Unsupported document type for {}".format(self.instance.__class__)) raise NotImplementedError("Unsupported document type for {}".format(self.instance.__class__))
def is_valid(self): def is_valid(self):
@ -93,14 +93,14 @@ class NewDocumentModalForm(BaseModalForm):
# FieldFile declares that no new file has been uploaded and we do not need to check on the file again # FieldFile declares that no new file has been uploaded and we do not need to check on the file again
return super_valid return super_valid
mime_type_valid = self._DOCUMENT_CLS.is_mime_type_valid(_file) mime_type_valid = self.document_model.is_mime_type_valid(_file)
if not mime_type_valid: if not mime_type_valid:
self.add_error( self.add_error(
"file", "file",
FILE_TYPE_UNSUPPORTED FILE_TYPE_UNSUPPORTED
) )
file_size_valid = self._DOCUMENT_CLS.is_file_size_valid(_file) file_size_valid = self.document_model.is_file_size_valid(_file)
if not file_size_valid: if not file_size_valid:
self.add_error( self.add_error(
"file", "file",
@ -115,7 +115,7 @@ class NewDocumentModalForm(BaseModalForm):
action = UserActionLogEntry.get_created_action(self.user) action = UserActionLogEntry.get_created_action(self.user)
edited_action = UserActionLogEntry.get_edited_action(self.user, _("Added document")) edited_action = UserActionLogEntry.get_edited_action(self.user, _("Added document"))
doc = self._DOCUMENT_CLS.objects.create( doc = self.document_model.objects.create(
created=action, created=action,
title=self.cleaned_data["title"], title=self.cleaned_data["title"],
comment=self.cleaned_data["comment"], comment=self.cleaned_data["comment"],
@ -133,12 +133,10 @@ class NewDocumentModalForm(BaseModalForm):
class EditDocumentModalForm(NewDocumentModalForm): class EditDocumentModalForm(NewDocumentModalForm):
document = None document = None
_DOCUMENT_CLS = None document_model = AbstractDocument
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
doc_id = kwargs.pop("doc_id", None) self.document = kwargs.pop("document", None)
self.document = get_object_or_404(self._DOCUMENT_CLS, id=doc_id)
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.form_title = _("Edit document") self.form_title = _("Edit document")
form_data = { form_data = {

View File

@ -57,14 +57,4 @@ class RemoveDeadlineModalForm(RemoveModalForm):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def save(self): def save(self):
self.instance.remove_deadline(self) self.instance.remove_deadline(self)
class RemoveDocumentModalForm(RemoveModalForm):
instance = None
_DOCUMENT_CLS = None
def __init__(self, *args, **kwargs):
document_id = kwargs.pop("doc_id", None)
super().__init__(*args, **kwargs)
self.instance = get_object_or_404(self._DOCUMENT_CLS, id=document_id)

View File

@ -17,9 +17,9 @@ from django.utils.timezone import now
from compensation.forms.modals.document import NewEcoAccountDocumentModalForm, NewCompensationDocumentModalForm from compensation.forms.modals.document import NewEcoAccountDocumentModalForm, NewCompensationDocumentModalForm
from compensation.models import Payment from compensation.models import Payment
from ema.forms import NewEmaDocumentModalForm from ema.forms import NewEmaDocumentModalForm
from intervention.forms.modals.document import NewInterventionDocumentModalForm, EditInterventionDocumentModalForm from intervention.forms.modals.document import NewInterventionDocumentModalForm
from intervention.models import InterventionDocument from intervention.models import InterventionDocument
from konova.forms.modals import NewDocumentModalForm, RecordModalForm, RemoveModalForm, \ from konova.forms.modals import EditDocumentModalForm, NewDocumentModalForm, RecordModalForm, RemoveModalForm, \
RemoveDeadlineModalForm, ResubmissionModalForm RemoveDeadlineModalForm, ResubmissionModalForm
from konova.models import Resubmission from konova.models import Resubmission
from konova.tests.test_views import BaseTestCase from konova.tests.test_views import BaseTestCase
@ -106,12 +106,12 @@ class EditDocumentModalFormTestCase(NewDocumentModalFormTestCase):
InterventionDocument, InterventionDocument,
instance=self.intervention instance=self.intervention
) )
self.form = EditInterventionDocumentModalForm( self.form = EditDocumentModalForm(
self.data, self.data,
dummy_file_dict, dummy_file_dict,
request=self.request, request=self.request,
instance=self.intervention, instance=self.intervention,
doc_id=self.doc.id document=self.doc
) )
def test_init(self): def test_init(self):
@ -122,6 +122,7 @@ class EditDocumentModalFormTestCase(NewDocumentModalFormTestCase):
self.assertEqual(self.form.fields["title"].initial, self.doc.title) self.assertEqual(self.form.fields["title"].initial, self.doc.title)
self.assertEqual(self.form.fields["comment"].initial, self.doc.comment) self.assertEqual(self.form.fields["comment"].initial, self.doc.comment)
self.assertEqual(self.form.fields["creation_date"].initial, self.doc.date_of_creation) self.assertEqual(self.form.fields["creation_date"].initial, self.doc.date_of_creation)
self.assertEqual(self.form.fields["file"].initial, self.doc.file)
def test_save(self): def test_save(self):
self.assertTrue(self.form.is_valid(), msg=self.form.errors) self.assertTrue(self.form.is_valid(), msg=self.form.errors)

View File

@ -7,7 +7,9 @@ Created on: 01.09.21
""" """
from django.http import FileResponse, HttpRequest, Http404 from django.http import FileResponse, HttpRequest, Http404
from konova.forms.modals import RemoveModalForm
from konova.models import AbstractDocument from konova.models import AbstractDocument
from konova.utils.message_templates import DOCUMENT_REMOVED_TEMPLATE
def get_document(doc: AbstractDocument): def get_document(doc: AbstractDocument):
@ -24,3 +26,28 @@ def get_document(doc: AbstractDocument):
return FileResponse(doc.file, as_attachment=True) return FileResponse(doc.file, as_attachment=True)
except FileNotFoundError: except FileNotFoundError:
raise Http404() raise Http404()
def remove_document(request: HttpRequest, doc: AbstractDocument):
""" Renders a form for uploading new documents
This function works using a modal. We are not using the regular way, the django bootstrap modal forms are
intended to be used. Instead of View classes we work using the classic way of dealing with forms (see below).
It is important to mention, that modal forms, which should reload the page afterwards, must provide a
'reload_page' bool in the context. This way, the modal may reload the page or not.
For further details see the comments in templates/modal or
https://github.com/trco/django-bootstrap-modal-forms
Args:
request (HttpRequest): The incoming request
Returns:
"""
title = doc.title
form = RemoveModalForm(request.POST or None, instance=doc, request=request)
return form.process_request(
request=request,
msg_success=DOCUMENT_REMOVED_TEMPLATE.format(title),
)

View File

@ -89,13 +89,7 @@ class BaseModalFormView(BaseView):
def get(self, request: HttpRequest, id: str, *args, **kwargs): def get(self, request: HttpRequest, id: str, *args, **kwargs):
obj = self._MODEL_CLS.objects.get(id=id) obj = self._MODEL_CLS.objects.get(id=id)
form = self._FORM_CLS( form = self._FORM_CLS(request.POST or None, instance=obj, request=request, **kwargs)
request.POST or None,
request.FILES or None,
instance=obj,
request=request,
**kwargs
)
context = { context = {
"form": form, "form": form,
} }
@ -104,25 +98,18 @@ class BaseModalFormView(BaseView):
def post(self, request: HttpRequest, id: str, *args, **kwargs): def post(self, request: HttpRequest, id: str, *args, **kwargs):
obj = self._MODEL_CLS.objects.get(id=id) obj = self._MODEL_CLS.objects.get(id=id)
form = self._FORM_CLS( form = self._FORM_CLS(request.POST or None, instance=obj, request=request, **kwargs)
request.POST or None,
request.FILES or None,
instance=obj,
request=request,
**kwargs
)
redirect_url = self._get_redirect_url(obj=obj) redirect_url = self._get_redirect_url(obj=obj)
if form.is_valid(): if form.is_valid():
if not is_ajax(request.META): if not is_ajax(request.META):
# Modal forms send one POST for checking on data validity. This can be used to return possible errors # Modal forms send one POST for checking on data validity. This can be used to return possible errors
# on the form. A second POST (if no errors occurs) is sent afterward and needs to process the # on the form. A second POST (if no errors occured) is sent afterwards and needs to process the
# saving/commiting of the data to the database. is_ajax() performs this check. The first request is # saving/commiting of the data to the database. is_ajax() performs this check. The first request is
# an ajax call, the second is a regular form POST. # an ajax call, the second is a regular form POST.
msg_success = self._get_msg_success(obj=obj, *args, **kwargs)
form.save() form.save()
messages.success( messages.success(
request, request,
msg_success self._get_msg_success(obj=obj)
) )
return HttpResponseRedirect(redirect_url) return HttpResponseRedirect(redirect_url)
else: else:

View File

@ -5,35 +5,46 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 22.08.22 Created on: 22.08.22
""" """
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpRequest
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.views import View
from konova.forms.modals import EditDocumentModalForm from konova.utils.documents import get_document, remove_document
from konova.utils.documents import get_document from konova.utils.message_templates import DOCUMENT_ADDED, DOCUMENT_EDITED
from konova.utils.message_templates import DOCUMENT_ADDED, DOCUMENT_EDITED, DOCUMENT_REMOVED_TEMPLATE
from konova.views.base import BaseModalFormView, BaseView
class AbstractNewDocumentView(LoginRequiredMixin, BaseModalFormView): class AbstractNewDocumentView(View):
_MODEL_CLS = None model = None
_FORM_CLS = None form = None
_REDIRECT_URL = None redirect_url = None
_MSG_SUCCESS = DOCUMENT_ADDED
class Meta: class Meta:
abstract = True abstract = True
def _get_redirect_url(self, *args, **kwargs): def get(self, request, id: str):
return super()._get_redirect_url(*args, **kwargs) + "#related_data" """ Renders a form for uploading new documents
def _user_has_permission(self, user): Args:
return user.is_default_user() request (HttpRequest): The incoming request
id (str): The object's id to which the new document will be related
Returns:
"""
intervention = get_object_or_404(self.model, id=id)
form = self.form(request.POST or None, request.FILES or None, instance=intervention, request=request)
return form.process_request(
request,
msg_success=DOCUMENT_ADDED,
redirect_url=reverse(self.redirect_url, args=(id,)) + "#related_data"
)
def post(self, request, id: str):
return self.get(request, id)
class AbstractGetDocumentView(LoginRequiredMixin, BaseView): class AbstractGetDocumentView(View):
_MODEL_CLS = None model = None
_DOCUMENT_CLS = None document_model = None
class Meta: class Meta:
abstract = True abstract = True
@ -51,57 +62,77 @@ class AbstractGetDocumentView(LoginRequiredMixin, BaseView):
Returns: Returns:
""" """
get_object_or_404(self._MODEL_CLS, id=id) get_object_or_404(self.model, id=id)
doc = get_object_or_404(self._DOCUMENT_CLS, id=doc_id) doc = get_object_or_404(self.document_model, id=doc_id)
return get_document(doc) return get_document(doc)
def post(self, request, id: str, doc_id: str): def post(self, request, id: str, doc_id: str):
return self.get(request, id, doc_id) return self.get(request, id, doc_id)
def _user_has_permission(self, user):
return user.is_default_user()
def _user_has_shared_access(self, user, **kwargs): class AbstractRemoveDocumentView(View):
obj = kwargs.get("id", None) model = None
assert obj is not None document_model = None
obj = get_object_or_404(self._MODEL_CLS, id=obj)
return obj.is_shared_with(user)
class AbstractRemoveDocumentView(LoginRequiredMixin, BaseModalFormView):
_MODEL_CLS = None
_DOCUMENT_CLS = None
_FORM_CLS = None
_MSG_SUCCESS = DOCUMENT_REMOVED_TEMPLATE
class Meta: class Meta:
abstract = True abstract = True
def _get_redirect_url(self, *args, **kwargs): def get(self, request, id: str, doc_id: str):
return super()._get_redirect_url(*args, **kwargs) + "#related_data" """ Removes the document from the database and file system
def _user_has_permission(self, user): Wraps the generic functionality from konova.utils.
return user.is_default_user()
def _get_msg_success(self, *args, **kwargs): Args:
doc_id = kwargs.get("doc_id", None) request (HttpRequest): The incoming request
assert doc_id is not None id (str): The intervention id
doc = get_object_or_404(self._DOCUMENT_CLS, id=doc_id) doc_id (str): The document id
return self._MSG_SUCCESS.format(doc.title)
Returns:
"""
get_object_or_404(self.model, id=id)
doc = get_object_or_404(self.document_model, id=doc_id)
return remove_document(
request,
doc
)
def post(self, request, id: str, doc_id: str):
return self.get(request, id, doc_id)
class AbstractEditDocumentView(LoginRequiredMixin, BaseModalFormView): class AbstractEditDocumentView(View):
_MODEL_CLS = None model = None
_DOCUMENT_CLS = None document_model = None
_FORM_CLS = EditDocumentModalForm form = None
_REDIRECT_URL = None redirect_url = None
_MSG_SUCCESS = DOCUMENT_EDITED
class Meta: class Meta:
abstract = True abstract = True
def _user_has_permission(self, user): def get(self, request, id: str, doc_id: str):
return user.is_default_user() """ GET handling for editing of existing document
Wraps the generic functionality from konova.utils.
Args:
request (HttpRequest): The incoming request
id (str): The intervention id
doc_id (str): The document id
Returns:
"""
obj = get_object_or_404(self.model, id=id)
doc = get_object_or_404(self.document_model, id=doc_id)
form = self.form(request.POST or None, request.FILES or None, instance=obj, document=doc,
request=request)
return form.process_request(
request,
DOCUMENT_EDITED,
redirect_url=reverse(self.redirect_url, args=(obj.id,)) + "#related_data"
)
def post(self, request, id: str, doc_id: str):
return self.get(request, id, doc_id)
def _get_redirect_url(self, *args, **kwargs):
return super()._get_redirect_url(*args, **kwargs) + "#related_data"

View File

@ -10,16 +10,15 @@ from django.http import HttpResponse, HttpRequest
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone from django.utils import timezone
from django.views import View
from konova.models import Geometry from konova.models import Geometry
from konova.settings import GEOM_THRESHOLD_RECALCULATION_SECONDS from konova.settings import GEOM_THRESHOLD_RECALCULATION_SECONDS
from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP
from konova.tasks import celery_update_parcels from konova.tasks import celery_update_parcels
from konova.views.base import BaseView
class GeomParcelsView(BaseView): class GeomParcelsView(View):
_TEMPLATE = "konova/includes/parcels/parcel_table_frame.html"
def get(self, request: HttpRequest, id: str): def get(self, request: HttpRequest, id: str):
""" Getter for HTMX """ Getter for HTMX
@ -33,6 +32,7 @@ class GeomParcelsView(BaseView):
Returns: Returns:
A rendered piece of HTML A rendered piece of HTML
""" """
template = "konova/includes/parcels/parcel_table_frame.html"
geom = get_object_or_404(Geometry, id=id) geom = get_object_or_404(Geometry, id=id)
geos_geom = geom.geom or MultiPolygon(srid=DEFAULT_SRID_RLP) geos_geom = geom.geom or MultiPolygon(srid=DEFAULT_SRID_RLP)
@ -85,7 +85,7 @@ class GeomParcelsView(BaseView):
"geom_id": str(id), "geom_id": str(id),
"next_page": next_page, "next_page": next_page,
} }
html = render_to_string(self._TEMPLATE, context, request) html = render_to_string(template, context, request)
return HttpResponse(html, status=status_code) return HttpResponse(html, status=status_code)
else: else:
return HttpResponse(None, status=404) return HttpResponse(None, status=404)
@ -107,15 +107,8 @@ class GeomParcelsView(BaseView):
waiting_too_long = (pcs_diff >= wait_for_seconds) waiting_too_long = (pcs_diff >= wait_for_seconds)
return waiting_too_long return waiting_too_long
def _user_has_shared_access(self, user, **kwargs):
return True
def _user_has_permission(self, user): class GeomParcelsContentView(View):
return True
class GeomParcelsContentView(BaseView):
_TEMPLATE = "konova/includes/parcels/parcel_table_content.html"
def get(self, request: HttpRequest, id: str, page: int): def get(self, request: HttpRequest, id: str, page: int):
""" Getter for infinite scroll of HTMX """ Getter for infinite scroll of HTMX
@ -137,6 +130,7 @@ class GeomParcelsContentView(BaseView):
# HTTP code 286 states that the HTMX should stop polling for updates # HTTP code 286 states that the HTMX should stop polling for updates
# https://htmx.org/docs/#polling # https://htmx.org/docs/#polling
status_code = 286 status_code = 286
template = "konova/includes/parcels/parcel_table_content.html"
geom = get_object_or_404(Geometry, id=id) geom = get_object_or_404(Geometry, id=id)
parcels = geom.get_underlying_parcels() parcels = geom.get_underlying_parcels()
@ -154,11 +148,5 @@ class GeomParcelsContentView(BaseView):
"geom_id": str(id), "geom_id": str(id),
"next_page": next_page, "next_page": next_page,
} }
html = render_to_string(self._TEMPLATE, context, request) html = render_to_string(template, context, request)
return HttpResponse(html, status=status_code) return HttpResponse(html, status=status_code)
def _user_has_shared_access(self, user, **kwargs):
return True
def _user_has_permission(self, user):
return True

View File

@ -6,15 +6,14 @@ Created on: 19.08.22
""" """
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from django.views import View
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from konova.contexts import BaseContext from konova.contexts import BaseContext
from konova.views.base import BaseView
class AbstractLogView(BaseView): class AbstractLogView(View):
_MODEL_CLS = None model = None
_TEMPLATE = "modal/modal_generic.html"
class Meta: class Meta:
abstract = True abstract = True
@ -29,22 +28,14 @@ class AbstractLogView(BaseView):
Returns: Returns:
""" """
intervention = get_object_or_404(self._MODEL_CLS, id=id) intervention = get_object_or_404(self.model, id=id)
template = "modal/modal_generic.html"
body_template = "log.html" body_template = "log.html"
context = { context = {
"modal_body_template": body_template, "modal_body_template": body_template,
"log": intervention.log.iterator(), "log": intervention.log.all(),
"modal_title": _("Log"), "modal_title": _("Log"),
} }
context = BaseContext(request, context).context context = BaseContext(request, context).context
return render(request, self._TEMPLATE, context) return render(request, template, context)
def _user_has_shared_access(self, user, **kwargs):
obj_id = kwargs.get('id', None)
assert obj_id is not None
obj = get_object_or_404(self._MODEL_CLS, id=obj_id)
return obj.is_shared_with(user)
def _user_has_permission(self, user):
return user.is_default_user()