diff options
| author | 2021-11-26 21:15:42 +0100 | |
|---|---|---|
| committer | 2021-11-26 21:15:42 +0100 | |
| commit | 053d43e4cecdf60fbd11b4bccac6dbeb28e834d5 (patch) | |
| tree | 358f03d4735a91391272070c9eb27c60318be70c /pydis_site | |
| parent | Merge pull request #619 from hedyhli/patch-1 (diff) | |
| parent | Patch signals to use post_delete, instead of pre_delete (diff) | |
Merge pull request #572 from D0rs4n/pr/deleterolesignal
Create a signal to unassign roles from user when the role is deleted
Diffstat (limited to 'pydis_site')
| -rw-r--r-- | pydis_site/apps/api/__init__.py | 1 | ||||
| -rw-r--r-- | pydis_site/apps/api/apps.py | 10 | ||||
| -rw-r--r-- | pydis_site/apps/api/signals.py | 12 | ||||
| -rw-r--r-- | pydis_site/apps/api/tests/test_roles.py | 26 | 
4 files changed, 45 insertions, 4 deletions
diff --git a/pydis_site/apps/api/__init__.py b/pydis_site/apps/api/__init__.py index e69de29b..afa5b4d5 100644 --- a/pydis_site/apps/api/__init__.py +++ b/pydis_site/apps/api/__init__.py @@ -0,0 +1 @@ +default_app_config = 'pydis_site.apps.api.apps.ApiConfig' diff --git a/pydis_site/apps/api/apps.py b/pydis_site/apps/api/apps.py index 76810b2e..18eda9e3 100644 --- a/pydis_site/apps/api/apps.py +++ b/pydis_site/apps/api/apps.py @@ -4,4 +4,12 @@ from django.apps import AppConfig  class ApiConfig(AppConfig):      """Django AppConfig for the API app.""" -    name = 'api' +    name = 'pydis_site.apps.api' + +    def ready(self) -> None: +        """ +        Gets called as soon as the registry is fully populated. + +        https://docs.djangoproject.com/en/3.2/ref/applications/#django.apps.AppConfig.ready +        """ +        import pydis_site.apps.api.signals  # noqa: F401 diff --git a/pydis_site/apps/api/signals.py b/pydis_site/apps/api/signals.py new file mode 100644 index 00000000..5c26bfb6 --- /dev/null +++ b/pydis_site/apps/api/signals.py @@ -0,0 +1,12 @@ +from django.db.models.signals import post_delete +from django.dispatch import receiver + +from pydis_site.apps.api.models.bot import Role, User + + +@receiver(signal=post_delete, sender=Role) +def delete_role_from_user(sender: Role, instance: Role, **kwargs) -> None: +    """Unassigns the Role (instance) that is being deleted from every user that has it.""" +    for user in User.objects.filter(roles__contains=[instance.id]): +        del user.roles[user.roles.index(instance.id)] +        user.save() diff --git a/pydis_site/apps/api/tests/test_roles.py b/pydis_site/apps/api/tests/test_roles.py index d39cea4d..73c80c77 100644 --- a/pydis_site/apps/api/tests/test_roles.py +++ b/pydis_site/apps/api/tests/test_roles.py @@ -1,7 +1,7 @@  from django.urls import reverse  from .base import AuthenticatedAPITestCase -from ..models import Role +from ..models import Role, User  class CreationTests(AuthenticatedAPITestCase): @@ -35,6 +35,20 @@ class CreationTests(AuthenticatedAPITestCase):              permissions=6,              position=0,          ) +        cls.role_to_delete = Role.objects.create( +            id=7, +            name="role to delete", +            colour=7, +            permissions=7, +            position=0, +        ) +        cls.role_unassigned_test_user = User.objects.create( +            id=8, +            name="role_unassigned_test_user", +            discriminator="0000", +            roles=[cls.role_to_delete.id], +            in_guild=True +        )      def _validate_roledict(self, role_dict: dict) -> None:          """Helper method to validate a dict representing a role.""" @@ -81,11 +95,11 @@ class CreationTests(AuthenticatedAPITestCase):          url = reverse('api:bot:role-list')          response = self.client.get(url) -        self.assertContains(response, text="id", count=4, status_code=200) +        self.assertContains(response, text="id", count=5, status_code=200)          roles = response.json()          self.assertIsInstance(roles, list) -        self.assertEqual(len(roles), 4) +        self.assertEqual(len(roles), 5)          for role in roles:              self._validate_roledict(role) @@ -181,6 +195,12 @@ class CreationTests(AuthenticatedAPITestCase):          response = self.client.delete(url)          self.assertEqual(response.status_code, 204) +    def test_role_delete_unassigned(self): +        """Tests if the deleted Role gets unassigned from the user.""" +        self.role_to_delete.delete() +        self.role_unassigned_test_user.refresh_from_db() +        self.assertEqual(self.role_unassigned_test_user.roles, []) +      def test_role_detail_404_all_methods(self):          """Tests detail view with non-existing ID."""          url = reverse('api:bot:role-detail', args=(20190815,))  |