This repository has been archived by the owner on May 20, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 78
/
receivers.py
107 lines (84 loc) · 3.66 KB
/
receivers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
from datetime import timedelta
from django.conf import settings
from django.db.models.signals import pre_delete, post_save, post_delete, pre_save
from django.dispatch import receiver
from django.utils import timezone
from huey.contrib.djhuey import revoke_by_id
from karrot.activities import stats, tasks
from karrot.activities.models import Activity, Feedback, ActivityParticipant
from karrot.conversations.models import Conversation
from karrot.groups.models import GroupMembership
from karrot.places.models import Place, PlaceStatus
@receiver(pre_delete, sender=GroupMembership)
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):
activity.remove_participant(user)
@receiver(post_save, sender=Feedback)
def feedback_created(sender, instance, created, **kwargs):
if not created:
return
stats.feedback_given(instance)
@receiver(post_save, sender=Activity)
def activity_created(sender, instance, created, **kwargs):
"""Ensure every activity has a conversation with the participants in it."""
activity = instance
if not created:
return
conversation = Conversation.objects.get_or_create_for_target(activity)
conversation.sync_users(activity.participants.all())
@receiver(pre_delete, sender=Activity)
def activity_deleted(sender, instance, **kwargs):
"""Delete the conversation when the activity is deleted."""
activity = instance
conversation = Conversation.objects.get_for_target(activity)
if conversation:
conversation.delete()
@receiver(post_save, sender=ActivityParticipant)
def add_activity_participant_to_conversation(sender, instance, **kwargs):
"""Add participant to conversation when added."""
user = instance.user
activity = instance.activity
conversation = Conversation.objects.get_or_create_for_target(activity)
conversation.join(user)
@receiver(post_delete, sender=ActivityParticipant)
def remove_activity_participant_from_conversation(sender, instance, **kwargs):
"""Remove participant from conversation when removed."""
user = instance.user
activity = instance.activity
conversation = Conversation.objects.get_or_create_for_target(activity)
conversation.leave(user)
@receiver(post_save, sender=ActivityParticipant)
def schedule_activity_reminder(sender, instance, **kwargs):
participant = instance
if participant.reminder_task_id:
return
activity = participant.activity
remind_at = activity.date.start - timedelta(hours=settings.ACTIVITY_REMINDER_HOURS)
if remind_at > timezone.now():
task = tasks.activity_reminder.schedule(
(participant.id, ),
eta=remind_at,
)
participant.reminder_task_id = task.id
participant.save()
@receiver(post_delete, sender=ActivityParticipant)
def revoke_activity_reminder(sender, instance, **kwargs):
participant = instance
if participant.reminder_task_id:
revoke_by_id(participant.reminder_task_id)
@receiver(pre_save, sender=Place)
def update_activity_series_when_place_changes(sender, instance, **kwargs):
place = instance
if not place.id:
return
old = Place.objects.get(id=place.id)
place_became_active = old.status != place.status and place.status == PlaceStatus.ACTIVE.value
weeks_in_advance_changed = old.weeks_in_advance != place.weeks_in_advance
if place_became_active or weeks_in_advance_changed:
for series in place.series.all():
series.update_activities()