Skip to content

Commit

Permalink
Implement editing of offensive message records (#1165)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jchristgit authored Dec 11, 2023
1 parent f33d353 commit f641746
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 22 deletions.
68 changes: 47 additions & 21 deletions pydis_site/apps/api/tests/test_offensive_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,17 @@
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')
Expand Down Expand Up @@ -111,13 +122,7 @@ def test_get_data(self):
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(
Expand All @@ -132,24 +137,45 @@ def test_delete_data(self):
)


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)
13 changes: 12 additions & 1 deletion pydis_site/apps/api/viewsets/bot/offensive_message.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from rest_framework.mixins import (
CreateModelMixin,
DestroyModelMixin,
UpdateModelMixin,
ListModelMixin
)
from rest_framework.viewsets import GenericViewSet
Expand All @@ -10,7 +11,7 @@


class OffensiveMessageViewSet(
CreateModelMixin, ListModelMixin, DestroyModelMixin, GenericViewSet
CreateModelMixin, ListModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet
):
"""
View providing CRUD access to offensive messages.
Expand Down Expand Up @@ -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`.
Expand Down

0 comments on commit f641746

Please sign in to comment.