Skip to content

Commit 053d43e

Browse files
authored
Merge pull request #572 from D0rs4n/pr/deleterolesignal
Create a signal to unassign roles from user when the role is deleted
2 parents e859efe + f34a520 commit 053d43e

File tree

4 files changed

+45
-4
lines changed

4 files changed

+45
-4
lines changed

pydis_site/apps/api/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
default_app_config = 'pydis_site.apps.api.apps.ApiConfig'

pydis_site/apps/api/apps.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,12 @@
44
class ApiConfig(AppConfig):
55
"""Django AppConfig for the API app."""
66

7-
name = 'api'
7+
name = 'pydis_site.apps.api'
8+
9+
def ready(self) -> None:
10+
"""
11+
Gets called as soon as the registry is fully populated.
12+
13+
https://docs.djangoproject.com/en/3.2/ref/applications/#django.apps.AppConfig.ready
14+
"""
15+
import pydis_site.apps.api.signals # noqa: F401

pydis_site/apps/api/signals.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from django.db.models.signals import post_delete
2+
from django.dispatch import receiver
3+
4+
from pydis_site.apps.api.models.bot import Role, User
5+
6+
7+
@receiver(signal=post_delete, sender=Role)
8+
def delete_role_from_user(sender: Role, instance: Role, **kwargs) -> None:
9+
"""Unassigns the Role (instance) that is being deleted from every user that has it."""
10+
for user in User.objects.filter(roles__contains=[instance.id]):
11+
del user.roles[user.roles.index(instance.id)]
12+
user.save()

pydis_site/apps/api/tests/test_roles.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.urls import reverse
22

33
from .base import AuthenticatedAPITestCase
4-
from ..models import Role
4+
from ..models import Role, User
55

66

77
class CreationTests(AuthenticatedAPITestCase):
@@ -35,6 +35,20 @@ def setUpTestData(cls):
3535
permissions=6,
3636
position=0,
3737
)
38+
cls.role_to_delete = Role.objects.create(
39+
id=7,
40+
name="role to delete",
41+
colour=7,
42+
permissions=7,
43+
position=0,
44+
)
45+
cls.role_unassigned_test_user = User.objects.create(
46+
id=8,
47+
name="role_unassigned_test_user",
48+
discriminator="0000",
49+
roles=[cls.role_to_delete.id],
50+
in_guild=True
51+
)
3852

3953
def _validate_roledict(self, role_dict: dict) -> None:
4054
"""Helper method to validate a dict representing a role."""
@@ -81,11 +95,11 @@ def test_role_list(self):
8195
url = reverse('api:bot:role-list')
8296

8397
response = self.client.get(url)
84-
self.assertContains(response, text="id", count=4, status_code=200)
98+
self.assertContains(response, text="id", count=5, status_code=200)
8599

86100
roles = response.json()
87101
self.assertIsInstance(roles, list)
88-
self.assertEqual(len(roles), 4)
102+
self.assertEqual(len(roles), 5)
89103

90104
for role in roles:
91105
self._validate_roledict(role)
@@ -181,6 +195,12 @@ def test_role_delete_200(self):
181195
response = self.client.delete(url)
182196
self.assertEqual(response.status_code, 204)
183197

198+
def test_role_delete_unassigned(self):
199+
"""Tests if the deleted Role gets unassigned from the user."""
200+
self.role_to_delete.delete()
201+
self.role_unassigned_test_user.refresh_from_db()
202+
self.assertEqual(self.role_unassigned_test_user.roles, [])
203+
184204
def test_role_detail_404_all_methods(self):
185205
"""Tests detail view with non-existing ID."""
186206
url = reverse('api:bot:role-detail', args=(20190815,))

0 commit comments

Comments
 (0)