aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site
diff options
context:
space:
mode:
authorGravatar jchristgit <[email protected]>2023-12-11 16:33:16 +0100
committerGravatar GitHub <[email protected]>2023-12-11 15:33:16 +0000
commitf64174645de751075a00380c292b2eea96c687c4 (patch)
treec0d5cc5db41b9bc9c3364dc40a7023cd9e31e508 /pydis_site
parentMention READMEs for app dirs in contributing guide (#1168) (diff)
Implement editing of offensive message records (#1165)
Allow changing the deletion date of offensive message records in case the bot encounters an error during deletion attempts. Fixes #364. Unblocks python-discord/bot#1013.
Diffstat (limited to 'pydis_site')
-rw-r--r--pydis_site/apps/api/tests/test_offensive_message.py68
-rw-r--r--pydis_site/apps/api/viewsets/bot/offensive_message.py13
2 files changed, 59 insertions, 22 deletions
diff --git a/pydis_site/apps/api/tests/test_offensive_message.py b/pydis_site/apps/api/tests/test_offensive_message.py
index f45b5a66..d01231f1 100644
--- a/pydis_site/apps/api/tests/test_offensive_message.py
+++ b/pydis_site/apps/api/tests/test_offensive_message.py
@@ -6,6 +6,17 @@ from .base import AuthenticatedAPITestCase
from pydis_site.apps.api.models import OffensiveMessage
+def create_offensive_message() -> OffensiveMessage:
+ """Creates and returns an `OffensiveMessgage` record for tests."""
+ delete_at = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=1)
+
+ return OffensiveMessage.objects.create(
+ id=602951077675139072,
+ channel_id=291284109232308226,
+ delete_date=delete_at,
+ )
+
+
class CreationTests(AuthenticatedAPITestCase):
def test_accept_valid_data(self):
url = reverse('api:bot:offensivemessage-list')
@@ -111,13 +122,7 @@ class ListTests(AuthenticatedAPITestCase):
class DeletionTests(AuthenticatedAPITestCase):
@classmethod
def setUpTestData(cls):
- delete_at = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=1)
-
- cls.valid_offensive_message = OffensiveMessage.objects.create(
- id=602951077675139072,
- channel_id=291284109232308226,
- delete_date=delete_at.isoformat()
- )
+ cls.valid_offensive_message = create_offensive_message()
def test_delete_data(self):
url = reverse(
@@ -132,24 +137,45 @@ class DeletionTests(AuthenticatedAPITestCase):
)
-class NotAllowedMethodsTests(AuthenticatedAPITestCase):
+class UpdateOffensiveMessageTestCase(AuthenticatedAPITestCase):
@classmethod
def setUpTestData(cls):
- delete_at = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=1)
+ cls.message = create_offensive_message()
+ cls.in_one_week = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=7)
- cls.valid_offensive_message = OffensiveMessage.objects.create(
- id=602951077675139072,
- channel_id=291284109232308226,
- delete_date=delete_at.isoformat()
+ def test_updating_message(self):
+ url = reverse('api:bot:offensivemessage-detail', args=(self.message.id,))
+ data = {'delete_date': self.in_one_week.isoformat()}
+ update_response = self.client.patch(url, data=data)
+ self.assertEqual(update_response.status_code, 200)
+
+ self.message.refresh_from_db()
+ self.assertAlmostEqual(
+ self.message.delete_date,
+ self.in_one_week,
+ delta=datetime.timedelta(seconds=1),
)
- def test_returns_405_for_patch_and_put_requests(self):
- url = reverse(
- 'api:bot:offensivemessage-detail', args=(self.valid_offensive_message.id,)
+ def test_updating_nonexistent_message(self):
+ url = reverse('api:bot:offensivemessage-detail', args=(self.message.id + 1,))
+ data = {'delete_date': self.in_one_week}
+
+ response = self.client.patch(url, data=data)
+ self.assertEqual(response.status_code, 404)
+ self.message.refresh_from_db()
+ self.assertNotAlmostEqual(
+ self.message.delete_date,
+ self.in_one_week,
+ delta=datetime.timedelta(seconds=1),
)
- not_allowed_methods = (self.client.patch, self.client.put)
- for method in not_allowed_methods:
- with self.subTest(method=method):
- response = method(url, {})
- self.assertEqual(response.status_code, 405)
+
+class NotAllowedMethodsTests(AuthenticatedAPITestCase):
+ @classmethod
+ def setUpTestData(cls):
+ cls.message = create_offensive_message()
+
+ def test_returns_405_for_get(self):
+ url = reverse('api:bot:offensivemessage-detail', args=(self.message.id,))
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 405)
diff --git a/pydis_site/apps/api/viewsets/bot/offensive_message.py b/pydis_site/apps/api/viewsets/bot/offensive_message.py
index 54cb3a38..fc8837e0 100644
--- a/pydis_site/apps/api/viewsets/bot/offensive_message.py
+++ b/pydis_site/apps/api/viewsets/bot/offensive_message.py
@@ -1,6 +1,7 @@
from rest_framework.mixins import (
CreateModelMixin,
DestroyModelMixin,
+ UpdateModelMixin,
ListModelMixin
)
from rest_framework.viewsets import GenericViewSet
@@ -10,7 +11,7 @@ from pydis_site.apps.api.serializers import OffensiveMessageSerializer
class OffensiveMessageViewSet(
- CreateModelMixin, ListModelMixin, DestroyModelMixin, GenericViewSet
+ CreateModelMixin, ListModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet
):
"""
View providing CRUD access to offensive messages.
@@ -46,6 +47,16 @@ class OffensiveMessageViewSet(
- 201: returned on success
- 400: if the body format is invalid
+ ### PATCH /bot/offensive-messages/<id:int>
+ Perform a partial update of the offensive message with the given `id`.
+ Intended to allow rescheduling the deletion date in case the bot's attempt
+ to delete the message failed due to another error than the message already
+ being deleted.
+
+ #### Status codes
+ - 200: returned on success
+ - 404: if a offensive message object with the given `id` does not exist
+
### DELETE /bot/offensive-messages/<id:int>
Delete the offensive message object with the given `id`.