diff --git a/compensation/models/compensation.py b/compensation/models/compensation.py index b65d259e..ef4654ec 100644 --- a/compensation/models/compensation.py +++ b/compensation/models/compensation.py @@ -52,6 +52,28 @@ class AbstractCompensation(BaseObject, class Meta: abstract = True + def delete(self, *args, **kwargs): + """ + Custom delete logic. + Make sure no artefacts are left on the database + + Args: + + Returns: + + """ + self.before_states.all().delete() + self.after_states.all().delete() + self.actions.all().delete() + self.resubmissions.all().delete() + self.deadlines.all().delete() + self.log.all().delete() + if self.geometry: + self.geometry.delete() + if self.responsible: + self.responsible.delete() + super().delete(*args, **kwargs) + def add_deadline(self, form) -> Deadline: """ Adds a new deadline to the abstract compensation diff --git a/intervention/models/intervention.py b/intervention/models/intervention.py index 95491f2e..0bad3738 100644 --- a/intervention/models/intervention.py +++ b/intervention/models/intervention.py @@ -89,7 +89,10 @@ class Intervention(BaseObject, self.legal, self.responsible, self.geometry, - self.log.all() + self.recorded, + self.checked, + self.log.all(), + self.resubmissions.all(), ] for entry in to_delete: try: diff --git a/konova/management/commands/sanitize_db.py b/konova/management/commands/sanitize_db.py index b296b2a7..d13f7c99 100644 --- a/konova/management/commands/sanitize_db.py +++ b/konova/management/commands/sanitize_db.py @@ -5,6 +5,10 @@ Contact: michel.peltriaux@sgdnord.rlp.de Created on: 16.11.21 """ +import datetime + +from django.utils.timezone import now + from compensation.models import CompensationState, Compensation, EcoAccount, CompensationAction from ema.models import Ema from intervention.models import Intervention @@ -16,8 +20,13 @@ from user.models import UserActionLogEntry, UserAction class Command(BaseKonovaCommand): help = "Checks the database' sanity and removes unused entries" + __DELETE_AFTER_DAYS = 30 + def handle(self, *args, **options): try: + self.sanitize_deleted_interventions() + self.sanitize_deleted_eco_accounts() + self.sanitize_deleted_ema() self.sanitize_log_entries() self.sanitize_compensation_states() self.sanitize_actions() @@ -310,4 +319,81 @@ class Command(BaseKonovaCommand): for sub_type in sub_types: self.__sanitize_parcel_sub_type(sub_type) - self._break_line() \ No newline at end of file + self._break_line() + + def sanitize_deleted_interventions(self): + """ Removes as deleted marked interventions + + Also deletes compensations + + Returns: + + """ + self._write_warning("=== Sanitize deleted marked interventions ===") + _today = now() + _today_month_ago = _today - datetime.timedelta(days=self.__DELETE_AFTER_DAYS) + deleted_entries = Intervention.objects.filter( + deleted__timestamp__lte=_today_month_ago + ) + deleted_interventions_c = deleted_entries.count() + deleted_compensations_c = 0 + for entry in deleted_entries: + comps = entry.compensations.all() + deleted_compensations_c += comps.count() + for comp in comps: + comp.delete() + entry.delete() + + if deleted_interventions_c > 0: + self._write_error(f"Found {deleted_interventions_c} interventions and {deleted_compensations_c} compensations.") + self._write_success("As deleted marked interventions deleted.") + else: + self._write_success("No such entries found.") + self._break_line() + + def sanitize_deleted_eco_accounts(self): + """ Removes as deleted marked eco accounts + + Returns: + + """ + self._write_warning("=== Sanitize deleted marked eco accounts ===") + _today = now() + _today_month_ago = _today - datetime.timedelta(days=self.__DELETE_AFTER_DAYS) + deleted_entries = EcoAccount.objects.filter( + deleted__timestamp__lte=_today_month_ago + ) + deleted_entries_c = deleted_entries.count() + for entry in deleted_entries: + entry.delete() + + if deleted_entries_c > 0: + self._write_error(f"Found {deleted_entries_c} eco accounts.") + self._write_success("As deleted marked eco accounts deleted.") + else: + self._write_success("No such entries found.") + self._break_line() + + def sanitize_deleted_ema(self): + """ Removes as deleted marked EMA + + Returns: + + """ + self._write_warning("=== Sanitize deleted marked EMA ===") + _today = now() + _today_month_ago = _today - datetime.timedelta(days=self.__DELETE_AFTER_DAYS) + deleted_entries = Ema.objects.filter( + deleted__timestamp__lte=_today_month_ago + ) + deleted_entries_c = deleted_entries.count() + for entry in deleted_entries: + entry.delete() + + if deleted_entries_c > 0: + self._write_error(f"Found {deleted_entries_c} EMA.") + self._write_success("As deleted marked EMA deleted.") + else: + self._write_success("No such entries found.") + self._break_line() + diff --git a/konova/models/object.py b/konova/models/object.py index a1c8c9c2..1d56004d 100644 --- a/konova/models/object.py +++ b/konova/models/object.py @@ -81,6 +81,7 @@ class BaseResource(UuidModel): """ try: self.created.delete() + self.modified.delete() except (ObjectDoesNotExist, AttributeError): # Object does not exist anymore - we can skip this pass