Skip to content
This repository has been archived by the owner on May 20, 2024. It is now read-only.

Commit

Permalink
Simplify conversation leaving code
Browse files Browse the repository at this point in the history
  • Loading branch information
nicksellen committed Jul 25, 2023
1 parent b499423 commit dd20653
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 48 deletions.
9 changes: 2 additions & 7 deletions karrot/activities/receivers.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,10 @@ def leave_group_handler(sender, instance, **kwargs):
group = instance.group
user = instance.user
for activity in Activity.objects. \
filter(date__startswith__gte=timezone.now()). \
filter(participants__in=[user, ]). \
filter(place__group=group):
if activity.date.start >= timezone.now():
# for future activities, remove from entire activity
# (will also remove them from the chat)
activity.remove_participant(user)
else:
# for past ones just remove from the chat
activity.conversation.leave(user)
activity.remove_participant(user)


@receiver(post_save, sender=Feedback)
Expand Down
27 changes: 17 additions & 10 deletions karrot/conversations/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1187,20 +1187,27 @@ def setUp(self):
self.activity = ActivityFactory(place=self.place)
self.membership = GroupMembership.objects.get(group=self.group, user=self.user)

def test_leaves_all_conversations_when_leaving_group(self):
def test_leaves_group_wall_conversation(self):
self.client.force_login(user=self.user)
self.assertTrue(self.group.conversation.participants.filter(pk=self.user.id).exists())
self.assertTrue(self.place.conversation.participants.filter(pk=self.user.id).exists())

self.activity.add_participant(self.user)
self.assertTrue(self.activity.conversation.participants.filter(pk=self.user.id).exists())
query = self.group.conversation.participants.filter(pk=self.user.id)
self.assertTrue(query.exists())
self.membership.delete()
self.assertFalse(query.exists())

def test_leaves_place_wall_conversation(self):
self.client.force_login(user=self.user)
query = self.place.conversation.participants.filter(pk=self.user.id)
self.assertTrue(query.exists())
self.membership.delete()
self.assertFalse(query.exists())

self.assertFalse(self.group.members.filter(pk=self.user.id).exists())
self.assertFalse(self.group.conversation.participants.filter(pk=self.user.id).exists())
self.assertFalse(self.place.conversation.participants.filter(pk=self.user.id).exists())
self.assertFalse(self.activity.conversation.participants.filter(pk=self.user.id).exists())
def test_leaves_activity_conversation(self):
self.client.force_login(user=self.user)
self.activity.add_participant(self.user)
query = self.activity.conversation.participants.filter(pk=self.user.id)
self.assertTrue(query.exists())
self.membership.delete()
self.assertFalse(query.exists())

def test_leaves_past_activity_conversations(self):
self.client.force_login(user=self.user)
Expand Down
5 changes: 3 additions & 2 deletions karrot/groups/receivers.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,9 @@ def group_member_added(sender, instance, created, **kwargs):
def group_member_removed(sender, instance, **kwargs):
group = instance.group
user = instance.user
conversation = Conversation.objects.get_for_target(group)
if conversation:

# leave all conversations related to this group
for conversation in Conversation.objects.filter(group=group, participants__in=[user]):
conversation.leave(user)

stats.group_left(group)
Expand Down
19 changes: 1 addition & 18 deletions karrot/offers/receivers.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
from django.contrib.contenttypes.models import ContentType
from django.db.models.signals import post_save, post_delete, pre_delete
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver

from karrot.conversations.models import Conversation
from karrot.groups.models import GroupMembership
from karrot.offers.models import Offer, OfferImage
from karrot.offers.tasks import notify_members_about_new_offer
from karrot.utils.misc import on_transaction_commit
Expand All @@ -23,18 +21,3 @@ def offer_saved(sender, instance, created, **kwargs):
def delete_offer_image_files(sender, instance, **kwargs):
instance.image.delete_all_created_images()
instance.image.delete(save=False)


@receiver(pre_delete, sender=GroupMembership)
def group_member_removed(sender, instance, **kwargs):
membership = instance
group = membership.group
user = membership.user

# remove from offer conversations
for conversation in Conversation.objects.filter(
target_type=ContentType.objects.get_for_model(Offer),
target_id__in=Offer.objects.filter(group=group),
participants__in=[user],
):
conversation.leave(user)
13 changes: 2 additions & 11 deletions karrot/places/receivers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from django.contrib.contenttypes.models import ContentType
from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver

Expand Down Expand Up @@ -48,16 +47,8 @@ def subscription_removed(sender, instance, **kwargs):
@receiver(pre_delete, sender=GroupMembership)
def group_member_removed(sender, instance, **kwargs):
membership = instance
group = membership.group
user = membership.user
membership.group
membership.user

for subscription in PlaceSubscription.objects.filter(place__group=membership.group, user=membership.user):
subscription.delete()

# ... also remove from place conversations which they were part of, but maybe not subscribed
for conversation in Conversation.objects.filter(
target_type=ContentType.objects.get_for_model(Place),
target_id__in=Place.objects.filter(group=group),
participants__in=[user],
):
conversation.leave(user)

0 comments on commit dd20653

Please sign in to comment.