diff options
Diffstat (limited to 'pydis_site')
| -rw-r--r-- | pydis_site/apps/api/tests/test_reminders.py | 13 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/reminder.py | 18 | 
2 files changed, 28 insertions, 3 deletions
diff --git a/pydis_site/apps/api/tests/test_reminders.py b/pydis_site/apps/api/tests/test_reminders.py index 545ffff8..65f91411 100644 --- a/pydis_site/apps/api/tests/test_reminders.py +++ b/pydis_site/apps/api/tests/test_reminders.py @@ -114,7 +114,6 @@ class ReminderDeletionTests(AuthenticatedAPITestCase):          response = self.client.delete(url)          self.assertEqual(response.status_code, 204) -        self.assertRaises(Reminder.DoesNotExist, Reminder.objects.get, id=self.reminder.id)  class ReminderListTests(AuthenticatedAPITestCase): @@ -154,18 +153,26 @@ class ReminderListTests(AuthenticatedAPITestCase):          response = self.client.get(url)          self.assertEqual(response.status_code, 200) +        self.assertNotIn(self.rem_dict_two, response.json()) + +        response = self.client.get(f"{url}?include_inactive=true")          self.assertCountEqual(response.json(), [self.rem_dict_one, self.rem_dict_two])      def test_filter_search(self):          url = reverse('api:bot:reminder-list')          response = self.client.get(f'{url}?search={self.author.name}') +        self.assertEqual(response.status_code, 200) +        self.assertCountEqual(response.json(), [self.rem_dict_one]) +    def test_filter_search_with_inactive(self): +        url = reverse('api:bot:reminder-list') +        response = self.client.get(f'{url}?search={self.author.name}&include_inactive=true')          self.assertEqual(response.status_code, 200)          self.assertCountEqual(response.json(), [self.rem_dict_one, self.rem_dict_two]) -    def test_filter_field(self): +    def test_only_active_by_default(self):          url = reverse('api:bot:reminder-list') -        response = self.client.get(f'{url}?active=true') +        response = self.client.get(url)          self.assertEqual(response.status_code, 200)          self.assertEqual(response.json(), [self.rem_dict_one]) diff --git a/pydis_site/apps/api/viewsets/bot/reminder.py b/pydis_site/apps/api/viewsets/bot/reminder.py index 5f997052..bf398e45 100644 --- a/pydis_site/apps/api/viewsets/bot/reminder.py +++ b/pydis_site/apps/api/viewsets/bot/reminder.py @@ -1,4 +1,5 @@  from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.request import Request  from rest_framework.filters import SearchFilter  from rest_framework.mixins import (      CreateModelMixin, @@ -113,6 +114,7 @@ class ReminderViewSet(      ### DELETE /bot/reminders/<id:int>      Delete the reminder with the given `id`. +    This is a soft-delete by setting `active` to False.      #### Status codes      - 204: returned on success @@ -126,3 +128,19 @@ class ReminderViewSet(      queryset = Reminder.objects.prefetch_related('author')      filter_backends = (DjangoFilterBackend, SearchFilter)      filterset_fields = ('active', 'author__id') + +    def perform_destroy(self, instance: Reminder) -> None: +        """Soft-delete reminders when DELETE is called.""" +        instance.active = False +        instance.save() + +    def get_queryset(self) -> list[Reminder]: +        """Filter out soft-deleted reminders by default.""" +        queryset = Reminder.objects.prefetch_related('author') +        request: Request = self.request + +        include_inactive = request.query_params.get("include_inactive", "false") +        include_inactive = include_inactive.lower() == "true" +        if not include_inactive: +            queryset = queryset.filter(active=True) +        return queryset  |