diff --git a/compensation/admin.py b/compensation/admin.py index 6519a1e8..5f792f76 100644 --- a/compensation/admin.py +++ b/compensation/admin.py @@ -3,6 +3,8 @@ from django.contrib import admin from compensation.models import Compensation, CompensationAction, CompensationState, Payment, \ EcoAccountDeduction, EcoAccount from konova.admin import BaseObjectAdmin, BaseResourceAdmin +from konova.utils.message_templates import COMPENSATION_REMOVED_TEMPLATE +from user.models import UserAction class AbstractCompensationAdmin(BaseObjectAdmin): @@ -42,6 +44,17 @@ class CompensationAdmin(AbstractCompensationAdmin): "intervention", ] + def restore_deleted_data(self, request, queryset): + super().restore_deleted_data(request, queryset) + + for entry in queryset: + # Remove delete log entry from related intervention log history + logs = entry.intervention.log.filter( + action=UserAction.EDITED, + comment=COMPENSATION_REMOVED_TEMPLATE.format(entry.identifier) + ) + logs.delete() + class EcoAccountAdmin(AbstractCompensationAdmin): list_display = [ diff --git a/compensation/models/compensation.py b/compensation/models/compensation.py index 082131c3..f50553f0 100644 --- a/compensation/models/compensation.py +++ b/compensation/models/compensation.py @@ -20,7 +20,8 @@ from compensation.utils.quality import CompensationQualityChecker from konova.models import BaseObject, AbstractDocument, Deadline, generate_document_file_upload_path, \ GeoReferencedMixin from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE -from konova.utils.message_templates import DATA_UNSHARED_EXPLANATION, COMPENSATION_REMOVED_TEMPLATE +from konova.utils.message_templates import DATA_UNSHARED_EXPLANATION, COMPENSATION_REMOVED_TEMPLATE, \ + DOCUMENT_REMOVED_TEMPLATE from user.models import UserActionLogEntry @@ -358,7 +359,7 @@ class CompensationDocument(AbstractDocument): max_length=1000, ) - def delete(self, *args, **kwargs): + def delete(self, user=None, *args, **kwargs): """ Custom delete functionality for CompensationDocuments. Removes the folder from the file system if there are no further documents for this entry. @@ -380,6 +381,9 @@ class CompensationDocument(AbstractDocument): folder_path = self.file.path.split("/")[:-1] folder_path = "/".join(folder_path) + if user: + self.instance.mark_as_edited(user, edit_comment=DOCUMENT_REMOVED_TEMPLATE.format(self.title)) + # Remove the file itself super().delete(*args, **kwargs) diff --git a/compensation/models/eco_account.py b/compensation/models/eco_account.py index 26ac44d7..af660615 100644 --- a/compensation/models/eco_account.py +++ b/compensation/models/eco_account.py @@ -9,7 +9,7 @@ import shutil from django.urls import reverse -from konova.utils.message_templates import DEDUCTION_REMOVED +from konova.utils.message_templates import DEDUCTION_REMOVED, DOCUMENT_REMOVED_TEMPLATE from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator from django.db import models @@ -199,7 +199,7 @@ class EcoAccountDocument(AbstractDocument): max_length=1000, ) - def delete(self, *args, **kwargs): + def delete(self, user=None, *args, **kwargs): """ Custom delete functionality for EcoAccountDocuments. Removes the folder from the file system if there are no further documents for this entry. @@ -221,6 +221,9 @@ class EcoAccountDocument(AbstractDocument): folder_path = self.file.path.split("/")[:-1] folder_path = "/".join(folder_path) + if user: + self.instance.mark_as_edited(user, edit_comment=DOCUMENT_REMOVED_TEMPLATE.format(self.title)) + # Remove the file itself super().delete(*args, **kwargs) diff --git a/compensation/views/compensation.py b/compensation/views/compensation.py index aa2151fe..f6176e03 100644 --- a/compensation/views/compensation.py +++ b/compensation/views/compensation.py @@ -18,7 +18,7 @@ from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.documents import get_document, remove_document from konova.utils.generators import generate_qr_code from konova.utils.message_templates import FORM_INVALID, IDENTIFIER_REPLACED, DATA_UNSHARED_EXPLANATION, \ - CHECKED_RECORDED_RESET, COMPENSATION_ADDED_TEMPLATE, COMPENSATION_REMOVED_TEMPLATE + CHECKED_RECORDED_RESET, COMPENSATION_ADDED_TEMPLATE, COMPENSATION_REMOVED_TEMPLATE, DOCUMENT_ADDED from konova.utils.user_checks import in_group @@ -277,7 +277,7 @@ def new_document_view(request: HttpRequest, id: str): form = NewCompensationDocumentForm(request.POST or None, request.FILES or None, instance=comp, request=request) return form.process_request( request, - msg_success=_("Document added"), + msg_success=DOCUMENT_ADDED, redirect_url=reverse("compensation:detail", args=(id,)) + "#related_data" ) diff --git a/compensation/views/eco_account.py b/compensation/views/eco_account.py index 479e66f8..d04359ef 100644 --- a/compensation/views/eco_account.py +++ b/compensation/views/eco_account.py @@ -30,7 +30,7 @@ from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.documents import get_document, remove_document from konova.utils.generators import generate_qr_code from konova.utils.message_templates import IDENTIFIER_REPLACED, FORM_INVALID, DATA_UNSHARED, DATA_UNSHARED_EXPLANATION, \ - CANCEL_ACC_RECORDED_OR_DEDUCTED, DEDUCTION_REMOVED, DEDUCTION_ADDED + CANCEL_ACC_RECORDED_OR_DEDUCTED, DEDUCTION_REMOVED, DEDUCTION_ADDED, DOCUMENT_ADDED from konova.utils.user_checks import in_group @@ -493,7 +493,7 @@ def new_document_view(request: HttpRequest, id: str): form = NewEcoAccountDocumentForm(request.POST or None, request.FILES or None, instance=acc, request=request) return form.process_request( request, - msg_success=_("Document added"), + msg_success=DOCUMENT_ADDED, redirect_url=reverse("compensation:acc:detail", args=(id,)) + "#related_data", ) diff --git a/ema/models/ema.py b/ema/models/ema.py index de67ed8e..b145acba 100644 --- a/ema/models/ema.py +++ b/ema/models/ema.py @@ -18,7 +18,7 @@ from ema.managers import EmaManager from ema.utils.quality import EmaQualityChecker from konova.models import AbstractDocument, generate_document_file_upload_path, RecordableObjectMixin, ShareableObjectMixin from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE -from konova.utils.message_templates import DATA_UNSHARED_EXPLANATION +from konova.utils.message_templates import DATA_UNSHARED_EXPLANATION, DOCUMENT_REMOVED_TEMPLATE class Ema(AbstractCompensation, ShareableObjectMixin, RecordableObjectMixin): @@ -143,7 +143,7 @@ class EmaDocument(AbstractDocument): max_length=1000, ) - def delete(self, *args, **kwargs): + def delete(self, user=None, *args, **kwargs): """ Custom delete functionality for EcoAccountDocuments. Removes the folder from the file system if there are no further documents for this entry. @@ -165,6 +165,9 @@ class EmaDocument(AbstractDocument): folder_path = self.file.path.split("/")[:-1] folder_path = "/".join(folder_path) + if user: + self.instance.mark_as_edited(user, edit_comment=DOCUMENT_REMOVED_TEMPLATE.format(self.title)) + # Remove the file itself super().delete(*args, **kwargs) diff --git a/ema/views.py b/ema/views.py index 01d8ea24..ff372170 100644 --- a/ema/views.py +++ b/ema/views.py @@ -20,7 +20,8 @@ from konova.settings import DEFAULT_GROUP, ZB_GROUP, ETS_GROUP from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.documents import get_document, remove_document from konova.utils.generators import generate_qr_code -from konova.utils.message_templates import IDENTIFIER_REPLACED, FORM_INVALID, DATA_UNSHARED, DATA_UNSHARED_EXPLANATION +from konova.utils.message_templates import IDENTIFIER_REPLACED, FORM_INVALID, DATA_UNSHARED, DATA_UNSHARED_EXPLANATION, \ + DOCUMENT_ADDED from konova.utils.user_checks import in_group @@ -356,7 +357,7 @@ def document_new_view(request: HttpRequest, id: str): form = NewEmaDocumentForm(request.POST or None, request.FILES or None, instance=ema, request=request) return form.process_request( request, - msg_success=_("Document added"), + msg_success=DOCUMENT_ADDED, redirect_url=reverse("ema:detail", args=(id,)) + "#related_data" ) diff --git a/intervention/models/intervention.py b/intervention/models/intervention.py index 9bb229fb..06b9174d 100644 --- a/intervention/models/intervention.py +++ b/intervention/models/intervention.py @@ -26,7 +26,7 @@ from konova.models import generate_document_file_upload_path, AbstractDocument, ShareableObjectMixin, \ RecordableObjectMixin, CheckableObjectMixin, GeoReferencedMixin from konova.settings import LANIS_LINK_TEMPLATE, LANIS_ZOOM_LUT, DEFAULT_SRID_RLP -from konova.utils.message_templates import DATA_UNSHARED_EXPLANATION, DEDUCTION_ADDED +from konova.utils.message_templates import DATA_UNSHARED_EXPLANATION, DEDUCTION_ADDED, DOCUMENT_REMOVED_TEMPLATE from user.models import UserActionLogEntry @@ -302,7 +302,7 @@ class InterventionDocument(AbstractDocument): max_length=1000, ) - def delete(self, *args, **kwargs): + def delete(self, user=None, *args, **kwargs): """ Custom delete functionality for InterventionDocuments. Removes the folder from the file system if there are no further documents for this entry. @@ -324,6 +324,9 @@ class InterventionDocument(AbstractDocument): folder_path = self.file.path.split("/")[:-1] folder_path = "/".join(folder_path) + if user: + self.instance.mark_as_edited(user, edit_comment=DOCUMENT_REMOVED_TEMPLATE.format(self.title)) + # Remove the file itself super().delete(*args, **kwargs) diff --git a/intervention/models/revocation.py b/intervention/models/revocation.py index 66318735..da39b001 100644 --- a/intervention/models/revocation.py +++ b/intervention/models/revocation.py @@ -9,6 +9,8 @@ Created on: 15.11.21 import shutil from django.contrib.gis.db import models +from django.core.exceptions import ObjectDoesNotExist + from konova.models import BaseResource, AbstractDocument, generate_document_file_upload_path from konova.utils.message_templates import REVOCATION_REMOVED @@ -21,10 +23,13 @@ class Revocation(BaseResource): legal = models.ForeignKey("Legal", null=False, blank=False, on_delete=models.CASCADE, help_text="Refers to 'Widerspruch am'", related_name="revocations") comment = models.TextField(null=True, blank=True) - def delete(self, user = None, *args, **kwargs): + def delete(self, user=None, *args, **kwargs): # Make sure related objects are being removed as well - if self.document: + try: self.document.delete(*args, **kwargs) + except ObjectDoesNotExist: + # No file to delete + pass if user is not None: self.legal.intervention.mark_as_edited(user, edit_comment=REVOCATION_REMOVED) diff --git a/intervention/views.py b/intervention/views.py index 98654411..a518a9da 100644 --- a/intervention/views.py +++ b/intervention/views.py @@ -17,7 +17,7 @@ from konova.utils.documents import remove_document, get_document from konova.utils.generators import generate_qr_code from konova.utils.message_templates import INTERVENTION_INVALID, FORM_INVALID, IDENTIFIER_REPLACED, \ CHECKED_RECORDED_RESET, DEDUCTION_REMOVED, DEDUCTION_ADDED, REVOCATION_ADDED, REVOCATION_REMOVED, \ - COMPENSATION_REMOVED_TEMPLATE + COMPENSATION_REMOVED_TEMPLATE, DOCUMENT_ADDED from konova.utils.user_checks import in_group @@ -131,7 +131,7 @@ def new_document_view(request: HttpRequest, id: str): form = NewInterventionDocumentForm(request.POST or None, request.FILES or None, instance=intervention, request=request) return form.process_request( request, - msg_success=_("Document added"), + msg_success=DOCUMENT_ADDED, redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data" ) diff --git a/konova/admin.py b/konova/admin.py index 5970b020..81db8fe2 100644 --- a/konova/admin.py +++ b/konova/admin.py @@ -99,13 +99,6 @@ class BaseObjectAdmin(BaseResourceAdmin): for entry in queryset: entry.deleted.delete() - # Remove delete log entry from related intervention log history - logs = entry.intervention.log.filter( - action=UserAction.EDITED, - comment=COMPENSATION_REMOVED_TEMPLATE.format(entry.identifier) - ) - logs.delete() - # Outcommented for a cleaner admin backend on production diff --git a/konova/utils/documents.py b/konova/utils/documents.py index 2ce1fee6..63a7d328 100644 --- a/konova/utils/documents.py +++ b/konova/utils/documents.py @@ -10,6 +10,7 @@ from django.utils.translation import gettext_lazy as _ from konova.forms import RemoveModalForm from konova.models import AbstractDocument +from konova.utils.message_templates import DOCUMENT_REMOVED_TEMPLATE def get_document(doc: AbstractDocument): @@ -49,5 +50,5 @@ def remove_document(request: HttpRequest, doc: AbstractDocument): form = RemoveModalForm(request.POST or None, instance=doc, request=request) return form.process_request( request=request, - msg_success=_("Document '{}' deleted").format(title) + msg_success=DOCUMENT_REMOVED_TEMPLATE.format(title) ) \ No newline at end of file diff --git a/konova/utils/message_templates.py b/konova/utils/message_templates.py index 43cdcfbd..79a190ca 100644 --- a/konova/utils/message_templates.py +++ b/konova/utils/message_templates.py @@ -37,6 +37,10 @@ PAYMENT_REMOVED = _("Payment removed") REVOCATION_ADDED = _("Revocation added") REVOCATION_REMOVED = _("Revocation removed") +# DOCUMENTS +DOCUMENT_REMOVED_TEMPLATE = _("Document '{}' deleted") +DOCUMENT_ADDED = _("Document added") + # Edited EDITED_GENERAL_DATA = _("Edited general data") ADDED_COMPENSATION_STATE = _("Added compensation state")