aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar jchristgit <[email protected]>2024-05-11 11:29:54 +0200
committerGravatar GitHub <[email protected]>2024-05-11 11:29:54 +0200
commitf0b3a9bf790835c5e9190732f1df799dd46fb9b1 (patch)
tree2d04146c9df6ed652eb6f356cb816523a27b3bcf
parentMerge pull request #1314 from python-discord/dependabot/github_actions/covera... (diff)
parentUpdate reminder tests for new soft-deleted behaviour (diff)
Merge pull request #1315 from python-discord/soft-delete-reminders
Soft-delete reminders on DELETE instead of removing entirely
-rw-r--r--pydis_site/apps/api/tests/test_reminders.py13
-rw-r--r--pydis_site/apps/api/viewsets/bot/reminder.py18
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