Skip to content
Snippets Groups Projects
Commit e888b19c authored by grollicus's avatar grollicus
Browse files

api: delete message

parent fdde989e
Branches
No related tags found
No related merge requests found
......@@ -318,3 +318,54 @@ class MessagesTestCase(TestCase):
self.assertEqual(DirectMessage.objects.all().count(), 3)
dm3 = DirectMessage.objects.get(pk=resp.json()['id'])
self.assertTrue(dm3.deleted_by_recipient)
def test_DirectMessageDelete(self):
c = Client()
resp = c.delete(reverse('api:my-delete-message', kwargs={'pk': str(uuid.uuid4())}))
self.assertEqual(resp.status_code, 403)
c.force_login(self.human_user1)
dm = DirectMessage(
conference=self.conference1,
sender=self.human_user1,
recipient=self.human_user2,
timestamp=datetime(2020, 5, 4, 3, 2, 1, tzinfo=UTC),
subject='Test Message',
body='Message Body',
)
dm.save()
resp = c.delete(reverse('api:my-delete-message', kwargs={'pk': str(dm.pk)}))
self.assertEqual(resp.status_code, 204)
dm.refresh_from_db()
self.assertTrue(dm.deleted_by_sender)
self.assertFalse(dm.deleted_by_recipient)
dm = DirectMessage(
conference=self.conference1,
sender=self.human_user2,
recipient=self.human_user1,
timestamp=datetime(2020, 1, 2, 3, 4, 5, tzinfo=UTC),
subject='Test Message2',
body='Message Body2',
)
dm.save()
resp = c.delete(reverse('api:my-delete-message', kwargs={'pk': str(dm.pk)}))
self.assertEqual(resp.status_code, 204)
dm.refresh_from_db()
self.assertFalse(dm.deleted_by_sender)
self.assertTrue(dm.deleted_by_recipient)
dm = DirectMessage(
conference=self.conference1,
sender=self.human_user2,
recipient=self.human_user1,
timestamp=datetime(2020, 2, 2, 2, 2, 2, tzinfo=UTC),
deleted_by_sender=True,
subject='Test Message3',
body='Message Body3',
)
dm.save()
resp = c.delete(reverse('api:my-delete-message', kwargs={'pk': str(dm.pk)}))
self.assertEqual(resp.status_code, 204)
self.assertEqual(DirectMessage.objects.filter(pk=dm.pk).count(), 0)
......@@ -20,6 +20,7 @@ urlpatterns = [
path('me/received-messages/<uuid:pk>', messages.DirectMessageReceived.as_view(), name='my-message-received'),
path('me/sent-messages/<uuid:pk>', messages.DirectMessageSent.as_view(), name='my-message-sent'),
path('me/send-message', messages.DirectMessageSend.as_view(), name='my-send-message'),
path('me/delete-message/<uuid:pk>', messages.DirectMessageDelete.as_view(), name='my-delete-message'),
path('me/friends', users.friends, name='friends'),
path('me/timeline', users.UserTimelineList.as_view(), name='timeline-list'),
# conference-specific views
......
from django.conf import settings
from rest_framework import generics, permissions
from django.db.models import Q
from core.models.messages import DirectMessage
from ..serializers import DirectMessageSerializerReceived, DirectMessageSerializerReceivedShort, DirectMessageSerializerSent, DirectMessageSerializerSentShort, DirectMessageSendSerializer
from ..serializers import (
DirectMessageSendSerializer,
DirectMessageSerializerReceived,
DirectMessageSerializerReceivedShort,
DirectMessageSerializerSent,
DirectMessageSerializerSentShort,
)
from .mixins import ConferenceSlugMixin
......@@ -65,3 +72,30 @@ class DirectMessageSend(ConferenceSlugMixin, generics.CreateAPIView):
sender=self.request.user,
deleted_by_recipient=self.request.user != serializer.validated_data['recipient'] and self.request.user.shadow_banned,
)
class DirectMessageDelete(ConferenceSlugMixin, generics.DestroyAPIView):
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
return DirectMessage.objects.filter(
Q(conference=self.conference, recipient=self.request.user, deleted_by_recipient=False)
| Q(conference=self.conference, sender=self.request.user, deleted_by_sender=False)
)
def perform_destroy(self, instance: DirectMessage):
if instance.sender == self.request.user:
if instance.deleted_by_recipient:
instance.delete()
return
instance.deleted_by_sender = True
instance.save(update_fields=['deleted_by_sender'])
elif instance.recipient == self.request.user:
if instance.deleted_by_sender:
instance.delete()
return
instance.deleted_by_recipient = True
instance.save(update_fields=['deleted_by_recipient'])
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment