From 18c96c33e7a5162d474653b3fd411eca3f4af7ff Mon Sep 17 00:00:00 2001
From: Marte Fossum <myf@uio.no>
Date: Mon, 20 Nov 2023 10:52:34 +0100
Subject: [PATCH] Add visible field to RoleType

---
 greg/admin.py                            |  2 +-
 greg/migrations/0031_roletype_visible.py | 17 +++++++
 greg/models.py                           |  1 +
 gregui/api/views/roletypes.py            |  6 +++
 gregui/tests/api/views/test_roletypes.py | 28 +++++++++++
 gregui/tests/conftest.py                 | 60 +++++++++++++++++++++++-
 6 files changed, 112 insertions(+), 2 deletions(-)
 create mode 100644 greg/migrations/0031_roletype_visible.py
 create mode 100644 gregui/tests/api/views/test_roletypes.py

diff --git a/greg/admin.py b/greg/admin.py
index ad5e6a56..829e807d 100644
--- a/greg/admin.py
+++ b/greg/admin.py
@@ -82,7 +82,7 @@ class RoleAdmin(VersionAdmin):
 
 
 class RoleTypeAdmin(VersionAdmin):
-    list_display = ("id", "identifier", "name_nb", "name_en")
+    list_display = ("id", "identifier", "name_nb", "name_en", "visible")
     readonly_fields = ("id", "created", "updated")
 
 
diff --git a/greg/migrations/0031_roletype_visible.py b/greg/migrations/0031_roletype_visible.py
new file mode 100644
index 00000000..8b465151
--- /dev/null
+++ b/greg/migrations/0031_roletype_visible.py
@@ -0,0 +1,17 @@
+# Generated by Django 4.1.4 on 2023-11-08 17:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("greg", "0030_remove_identity_identity_type_value_unique_and_more"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="roletype",
+            name="visible",
+            field=models.BooleanField(default=False),
+        ),
+    ]
diff --git a/greg/models.py b/greg/models.py
index 75ac0e72..e80e3b1d 100644
--- a/greg/models.py
+++ b/greg/models.py
@@ -185,6 +185,7 @@ class RoleType(BaseModel):
     default_duration_days = models.IntegerField(null=True)
     # Max days into the future this role can be assigned
     max_days = models.IntegerField(default=365)
+    visible = models.BooleanField(default=False)
 
     def __str__(self):
         return f"{str(self.name_en or self.name_nb)} ({self.identifier})"
diff --git a/gregui/api/views/roletypes.py b/gregui/api/views/roletypes.py
index 1e20cb26..21bc0576 100644
--- a/gregui/api/views/roletypes.py
+++ b/gregui/api/views/roletypes.py
@@ -1,5 +1,6 @@
 from rest_framework import permissions
 from rest_framework.generics import ListAPIView
+from rest_framework.response import Response
 
 from greg.models import RoleType
 from gregui.api.serializers.roletype import RoleTypeSerializerUi
@@ -9,3 +10,8 @@ class RoleTypeViewSet(ListAPIView):
     queryset = RoleType.objects.all().order_by("id")
     permission_classes = [permissions.AllowAny]
     serializer_class = RoleTypeSerializerUi
+
+    def get(self, request, *args, **kwargs):
+        roletypes = self.queryset.filter(visible=True)
+        serializer = self.serializer_class(roletypes, many=True)
+        return Response(serializer.data)
diff --git a/gregui/tests/api/views/test_roletypes.py b/gregui/tests/api/views/test_roletypes.py
new file mode 100644
index 00000000..1219a588
--- /dev/null
+++ b/gregui/tests/api/views/test_roletypes.py
@@ -0,0 +1,28 @@
+import pytest
+
+from rest_framework.reverse import reverse
+from rest_framework import status
+
+from greg.models import RoleType
+
+
+@pytest.mark.django_db
+def test_get_roletypes(
+    client,
+    role_type_1,
+    role_type_2,
+    role_type_3,
+    role_type_4,
+    role_type_5,
+):
+    response = client.get(reverse("gregui-v1:role-types"), data={})
+    response_body = response.json()
+    assert response.status_code == status.HTTP_200_OK
+    assert len(response_body) == 5
+
+    RoleType.objects.filter(id=role_type_1.id).update(visible=False)
+    RoleType.objects.filter(id=role_type_3.id).update(visible=False)
+    response = client.get(reverse("gregui-v1:role-types"), data={})
+    response_body = response.json()
+    assert response.status_code == status.HTTP_200_OK
+    assert len(response_body) == 3
diff --git a/gregui/tests/conftest.py b/gregui/tests/conftest.py
index 27107892..2014ae53 100644
--- a/gregui/tests/conftest.py
+++ b/gregui/tests/conftest.py
@@ -99,7 +99,65 @@ def unit_foo3() -> OrganizationalUnit:
 @pytest.fixture
 def role_type_foo() -> RoleType:
     rt = RoleType.objects.create(
-        identifier="role_foo", name_en="Role Foo EN", name_nb="Role Foo NB"
+        identifier="role_foo",
+        name_en="Role Foo EN",
+        name_nb="Role Foo NB",
+        visible=True,
+    )
+    return RoleType.objects.get(id=rt.id)
+
+
+@pytest.fixture
+def role_type_1() -> RoleType:
+    rt = RoleType.objects.create(
+        identifier="role1",
+        name_en="Role1 EN",
+        name_nb="Role1 NB",
+        visible=True,
+    )
+    return RoleType.objects.get(id=rt.id)
+
+
+@pytest.fixture
+def role_type_2() -> RoleType:
+    rt = RoleType.objects.create(
+        identifier="role2",
+        name_en="Role2 EN",
+        name_nb="Role2 NB",
+        visible=True,
+    )
+    return RoleType.objects.get(id=rt.id)
+
+
+@pytest.fixture
+def role_type_3() -> RoleType:
+    rt = RoleType.objects.create(
+        identifier="role3",
+        name_en="Role3 EN",
+        name_nb="Role3 NB",
+        visible=True,
+    )
+    return RoleType.objects.get(id=rt.id)
+
+
+@pytest.fixture
+def role_type_4() -> RoleType:
+    rt = RoleType.objects.create(
+        identifier="role4",
+        name_en="Role4 EN",
+        name_nb="Role4 NB",
+        visible=True,
+    )
+    return RoleType.objects.get(id=rt.id)
+
+
+@pytest.fixture
+def role_type_5() -> RoleType:
+    rt = RoleType.objects.create(
+        identifier="role5",
+        name_en="Role5 EN",
+        name_nb="Role5 NB",
+        visible=True,
     )
     return RoleType.objects.get(id=rt.id)
 
-- 
GitLab