From e1a7b1269795d27ede72372f369f46afb17c871e Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Tue, 17 Nov 2020 20:01:29 +0100
Subject: [PATCH] Write data check NoGroupsOfPersonsSetInPersonalNotesDataCheck

---
 aleksis/apps/alsijil/data_checks.py | 45 ++++++++++++++++++++++++++++-
 1 file changed, 44 insertions(+), 1 deletion(-)

diff --git a/aleksis/apps/alsijil/data_checks.py b/aleksis/apps/alsijil/data_checks.py
index 6ec93f80e..b4d115d9c 100644
--- a/aleksis/apps/alsijil/data_checks.py
+++ b/aleksis/apps/alsijil/data_checks.py
@@ -6,7 +6,12 @@ from django.utils.translation import gettext as _
 
 from calendarweek import CalendarWeek
 
-from aleksis.core.data_checks import DATA_CHECK_REGISTRY, DataCheck, IgnoreSolveOption, SolveOption
+from aleksis.core.data_checks import (
+    DATA_CHECK_REGISTRY,
+    DataCheck,
+    IgnoreSolveOption,
+    SolveOption,
+)
 
 
 class DeleteRelatedObjectSolveOption(SolveOption):
@@ -19,6 +24,17 @@ class DeleteRelatedObjectSolveOption(SolveOption):
         check_result.delete()
 
 
+class SetGroupsOfPersonWithCurrentGroupsOfPersonSolveOption(SolveOption):
+    name = "set_groups_of_person"
+    verbose_name = _("Set current groups")
+
+    @classmethod
+    def solve(cls, check_result: "DataCheckResult"):
+        person = check_result.related_object.person
+        check_result.related_object.groups_of_person.set(person.member_of.all())
+        check_result.delete()
+
+
 @DATA_CHECK_REGISTRY.register
 class NoPersonalNotesInCancelledLessonsDataCheck(DataCheck):
     name = "no_personal_notes_in_cancelled_lessons"
@@ -50,3 +66,30 @@ class NoPersonalNotesInCancelledLessonsDataCheck(DataCheck):
             result = DataCheckResult.objects.get_or_create(
                 check=cls.name, content_type=ct, object_id=note.id
             )
+
+
+@DATA_CHECK_REGISTRY.register
+class NoGroupsOfPersonsSetInPersonalNotesDataCheck(DataCheck):
+    name = "no_groups_of_persons_set_in_personal_notes"
+    verbose_name = _("Ensure that 'groups_of_person' is set for every personal note")
+    problem_name = _("The personal note has no group in 'groups_of_person'.")
+    solve_options = {
+        SetGroupsOfPersonWithCurrentGroupsOfPersonSolveOption.name: SetGroupsOfPersonWithCurrentGroupsOfPersonSolveOption,
+        DeleteRelatedObjectSolveOption.name: DeleteRelatedObjectSolveOption,
+        IgnoreSolveOption.name: IgnoreSolveOption,
+    }
+
+    @classmethod
+    def check_data(cls):
+        from aleksis.core.models import DataCheckResult
+        from .models import PersonalNote
+
+        ct = ContentType.objects.get_for_model(PersonalNote)
+
+        personal_notes = PersonalNote.objects.filter(groups_of_person__isnull=True)
+
+        for note in personal_notes:
+            logging.info(f"Check personal note {note}")
+            result = DataCheckResult.objects.get_or_create(
+                check=cls.name, content_type=ct, object_id=note.id
+            )
-- 
GitLab