Sanitize command extension

* adds proper removing of related entries for compensation and intervention models
* adds sanitizing of intervention, compensation, ecoaccount and ema to sanitize_db
This commit is contained in:
mpeltriaux 2022-12-12 14:32:30 +01:00
parent 66f7341cb5
commit bbe1b24d4c
4 changed files with 114 additions and 2 deletions

View File

@ -52,6 +52,28 @@ class AbstractCompensation(BaseObject,
class Meta: class Meta:
abstract = True 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: def add_deadline(self, form) -> Deadline:
""" Adds a new deadline to the abstract compensation """ Adds a new deadline to the abstract compensation

View File

@ -89,7 +89,10 @@ class Intervention(BaseObject,
self.legal, self.legal,
self.responsible, self.responsible,
self.geometry, self.geometry,
self.log.all() self.recorded,
self.checked,
self.log.all(),
self.resubmissions.all(),
] ]
for entry in to_delete: for entry in to_delete:
try: try:

View File

@ -5,6 +5,10 @@ Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 16.11.21 Created on: 16.11.21
""" """
import datetime
from django.utils.timezone import now
from compensation.models import CompensationState, Compensation, EcoAccount, CompensationAction from compensation.models import CompensationState, Compensation, EcoAccount, CompensationAction
from ema.models import Ema from ema.models import Ema
from intervention.models import Intervention from intervention.models import Intervention
@ -16,8 +20,13 @@ from user.models import UserActionLogEntry, UserAction
class Command(BaseKonovaCommand): class Command(BaseKonovaCommand):
help = "Checks the database' sanity and removes unused entries" help = "Checks the database' sanity and removes unused entries"
__DELETE_AFTER_DAYS = 30
def handle(self, *args, **options): def handle(self, *args, **options):
try: try:
self.sanitize_deleted_interventions()
self.sanitize_deleted_eco_accounts()
self.sanitize_deleted_ema()
self.sanitize_log_entries() self.sanitize_log_entries()
self.sanitize_compensation_states() self.sanitize_compensation_states()
self.sanitize_actions() self.sanitize_actions()
@ -310,4 +319,81 @@ class Command(BaseKonovaCommand):
for sub_type in sub_types: for sub_type in sub_types:
self.__sanitize_parcel_sub_type(sub_type) self.__sanitize_parcel_sub_type(sub_type)
self._break_line() 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()

View File

@ -81,6 +81,7 @@ class BaseResource(UuidModel):
""" """
try: try:
self.created.delete() self.created.delete()
self.modified.delete()
except (ObjectDoesNotExist, AttributeError): except (ObjectDoesNotExist, AttributeError):
# Object does not exist anymore - we can skip this # Object does not exist anymore - we can skip this
pass pass