From 9df38198be6df2b12513f4d54fb3dd0279da253e Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Tue, 2 Apr 2024 16:50:21 -0400
Subject: [PATCH] refactor: avoid repetition(s)

---
 program/management/commands/addpermissions.py | 84 ++++++-------------
 1 file changed, 25 insertions(+), 59 deletions(-)

diff --git a/program/management/commands/addpermissions.py b/program/management/commands/addpermissions.py
index 9dacb9da..f67c366c 100644
--- a/program/management/commands/addpermissions.py
+++ b/program/management/commands/addpermissions.py
@@ -1,83 +1,49 @@
 from django.conf import settings
 from django.contrib.auth.models import Group, Permission
 from django.core.management.base import BaseCommand
+from django.db.models import QuerySet
 
 
 class Command(BaseCommand):
     help = "add permissions"
 
+    def add_permissions(self, group: Group, permissions: QuerySet, name: str):
+        self.stdout.write(f"Adding {name} permissions to the '{group.name}' group... ", ending="")
+        self.stdout.flush()
+        group.permissions.add(*permissions)
+        self.stdout.write(self.style.SUCCESS(str(len(permissions))))
+
     def handle(self, *args, **options):
-        program_group = Group.objects.get(name=settings.PRIVILEGED_GROUP)
+        privileged_group = Group.objects.get(name=settings.PRIVILEGED_GROUP)
+        host_group = Group.objects.get(name=settings.ENTITLED_GROUPS[0])
+        host_plus_group = Group.objects.get(name=settings.ENTITLED_GROUPS[1])
+
         app_permissions = Permission.objects.filter(content_type__app_label="program").exclude(
             codename__startswith="edit"
         )
-        self.stdout.write(
-            f"Adding app permissions to the '{program_group}' group... ",
-            ending="",
-        )
-        self.stdout.flush()
-        program_group.permissions.add(*app_permissions)
-        self.stdout.write(self.style.SUCCESS(str(len(app_permissions))))
-
-        host_group = Group.objects.get(name=settings.ENTITLED_GROUPS[0])
-        model_permissions = Permission.objects.filter(
-            content_type__model__in=["note", "notelink"]
-        ).exclude(codename__startswith="edit")
-        self.stdout.write(
-            f"Adding model permissions on note & notelink to the '{host_group}' group... ",
-            ending="",
+        default_model_permissions = (
+            Permission.objects.filter(content_type__model__in=["note", "notelink"])
+            .exclude(codename__startswith="edit")
+            .exclude(codename__startswith="create")
+            .exclude(codename__startswith="update")
         )
-        self.stdout.flush()
-        host_group.permissions.add(*model_permissions)
-        self.stdout.write(self.style.SUCCESS(str(len(model_permissions))))
-
-        host_plus_group = Group.objects.get(name=settings.ENTITLED_GROUPS[1])
         change_permissions = Permission.objects.filter(
             codename__startswith="change", content_type__model__in=["host", "note", "show"]
         )
-        self.stdout.write(
-            f"Adding change permissions on host, note & show to the '{host_plus_group}' group... ",
-            ending="",
-        )
-        host_plus_group.permissions.add(*change_permissions)
-        self.stdout.write(self.style.SUCCESS(str(len(change_permissions))))
-        self.stdout.flush()
         edit_permissions = Permission.objects.filter(
             codename__startswith="edit", content_type__model__in=["host", "note", "show"]
         )
-        self.stdout.write(
-            f"Adding edit permissions on host, note & show to the '{host_plus_group}' group... ",
-            ending="",
-        )
-        self.stdout.flush()
-        host_plus_group.permissions.add(*edit_permissions)
-        self.stdout.write(self.style.SUCCESS(str(len(edit_permissions))))
-
-        self.stdout.write(
-            f"Adding edit permissions on host, note & show to the '{program_group}' group... ",
-            ending="",
+        create_permissions = Permission.objects.filter(
+            codename__startswith="create", content_type__model__in=["note"]
         )
-        self.stdout.flush()
-        program_group.permissions.add(*edit_permissions)
-        self.stdout.write(self.style.SUCCESS(str(len(edit_permissions))))
-
         update_permissions = Permission.objects.filter(
             codename__startswith="update", content_type__model__in=["host", "note", "show"]
         )
-        self.stdout.write(
-            f"Adding update permissions on host, note & show to the '{program_group}' group... ",
-            ending="",
-        )
-        self.stdout.flush()
-        program_group.permissions.add(*update_permissions)
-        self.stdout.write(self.style.SUCCESS(str(len(update_permissions))))
 
-        create_permissions = Permission.objects.filter(
-            codename__startswith="create", content_type__model__in=["note"]
-        )
-        self.stdout.write(
-            f"Adding create permissions on note to the '{program_group}' group... ", ending=""
-        )
-        self.stdout.flush()
-        program_group.permissions.add(*create_permissions)
-        self.stdout.write(self.style.SUCCESS(str(len(update_permissions))))
+        self.add_permissions(privileged_group, app_permissions, "default app level")
+        self.add_permissions(privileged_group, edit_permissions, "custom edit field")
+        self.add_permissions(privileged_group, create_permissions, "custom create")
+        self.add_permissions(privileged_group, update_permissions, "custom update")
+        self.add_permissions(host_group, default_model_permissions, "default model")
+        self.add_permissions(host_plus_group, change_permissions, "default change")
+        self.add_permissions(host_plus_group, edit_permissions, "custom edit field")
-- 
GitLab