#35 Sanity command

* adds sanity check for deadlines and geometries
This commit is contained in:
mpeltriaux 2021-11-17 09:40:07 +01:00
parent 60d7a8d7d1
commit f62dd76d94

View File

@ -9,6 +9,7 @@ from compensation.models import CompensationState, Compensation, EcoAccount, Com
from ema.models import Ema from ema.models import Ema
from intervention.models import Intervention from intervention.models import Intervention
from konova.management.commands.setup import BaseKonovaCommand from konova.management.commands.setup import BaseKonovaCommand
from konova.models import Deadline, Geometry
from user.models import UserActionLogEntry from user.models import UserActionLogEntry
@ -20,6 +21,8 @@ class Command(BaseKonovaCommand):
self.sanitize_log_entries() self.sanitize_log_entries()
self.sanitize_compensation_states() self.sanitize_compensation_states()
self.sanitize_actions() self.sanitize_actions()
self.sanitize_deadlines()
self.sanitize_geometries()
except KeyboardInterrupt: except KeyboardInterrupt:
self._break_line() self._break_line()
exit(-1) exit(-1)
@ -64,7 +67,7 @@ class Command(BaseKonovaCommand):
num_entries = unattached_log_entries.count() num_entries = unattached_log_entries.count()
if num_entries > 0: if num_entries > 0:
self._write_warning(f"Found {num_entries} log entries not attached to anything. Delete now...") self._write_error(f"Found {num_entries} log entries not attached to anything. Delete now...")
unattached_log_entries.delete() unattached_log_entries.delete()
self._write_success("Log entries deleted.") self._write_success("Log entries deleted.")
else: else:
@ -92,7 +95,7 @@ class Command(BaseKonovaCommand):
return all_ids return all_ids
def sanitize_actions(self): def sanitize_actions(self):
""" Removes log entries which are not attached to any logs """ Removes actions which are not attached to any entries
Returns: Returns:
@ -110,13 +113,106 @@ class Command(BaseKonovaCommand):
num_entries = unattached_actions.count() num_entries = unattached_actions.count()
if num_entries > 0: if num_entries > 0:
self._write_warning(f"Found {num_entries} actions not attached to anything. Delete now...") self._write_error(f"Found {num_entries} actions not attached to anything. Delete now...")
unattached_actions.delete() unattached_actions.delete()
self._write_success("Actions deleted.") self._write_success("Actions deleted.")
else: else:
self._write_success("No unattached actions found.") self._write_success("No unattached actions found.")
self._break_line() self._break_line()
def get_all_deadline_ids(self, cls):
""" Getter for all deadline ids of a model
Args:
cls (Compensation|Ema|EcoAccount): The model class
Returns:
"""
all_objects = cls.objects.all().prefetch_related(
"deadlines",
)
all_ids = all_objects.exclude(
deadlines__isnull=True,
).values_list(
"deadlines__id",
flat=True,
)
return all_ids
def sanitize_deadlines(self):
""" Removes deadlines which are not attached to any entries
Returns:
"""
self._write_warning("=== Sanitize deadlines ===")
all_deadlines = Deadline.objects.all()
compensation_deadline_ids = self.get_all_deadline_ids(Compensation)
attached_deadline_ids = compensation_deadline_ids.union(
self.get_all_deadline_ids(EcoAccount),
self.get_all_deadline_ids(Ema),
)
unattached_deadlines = all_deadlines.exclude(id__in=attached_deadline_ids)
num_entries = unattached_deadlines.count()
if num_entries > 0:
self._write_error(f"Found {num_entries} deadlines not attached to anything. Delete now...")
unattached_deadlines.delete()
self._write_success("Deadlines deleted.")
else:
self._write_success("No unattached deadlines found.")
self._break_line()
def get_all_geometry_ids(self, cls):
""" Getter for all geometry ids of a model
Args:
cls (Intervention|Compensation|Ema|EcoAccount): The model class
Returns:
"""
all_objects = cls.objects.all().prefetch_related(
"geometry",
)
all_ids = all_objects.exclude(
geometry__isnull=True,
).values_list(
"geometry__id",
flat=True,
)
return all_ids
def sanitize_geometries(self):
""" Removes geometries which are not attached to any entries
Returns:
"""
self._write_warning("=== Sanitize geometries ===")
all_geometries = Geometry.objects.all()
compensation_geometry_ids = self.get_all_geometry_ids(Compensation)
attached_geometry_ids = compensation_geometry_ids.union(
self.get_all_geometry_ids(Intervention),
self.get_all_geometry_ids(EcoAccount),
self.get_all_geometry_ids(Ema),
)
unattached_geometries = all_geometries.exclude(id__in=attached_geometry_ids)
num_entries = unattached_geometries.count()
if num_entries > 0:
self._write_error(f"Found {num_entries} geometries not attached to anything. Delete now...")
unattached_geometries.delete()
self._write_success("Deadlines deleted.")
else:
self._write_success("No unattached geometries found.")
self._break_line()
def get_all_state_ids(self, cls): def get_all_state_ids(self, cls):
""" Getter for all states (before and after) of a class """ Getter for all states (before and after) of a class
@ -163,7 +259,7 @@ class Command(BaseKonovaCommand):
) )
num_unattached_states = unattached_states.count() num_unattached_states = unattached_states.count()
if num_unattached_states > 0: if num_unattached_states > 0:
self._write_warning(f"Found {num_unattached_states} unused compensation states. Delete now...") self._write_error(f"Found {num_unattached_states} unused compensation states. Delete now...")
unattached_states.delete() unattached_states.delete()
self._write_success("Unused states deleted.") self._write_success("Unused states deleted.")
else: else: