diff options
-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 |