better handling of the accepting answers workflow
[osqa.git] / forum / activity.py
1 import datetime\r
2 from django.db.models.signals import post_save\r
3 from forum.models import *\r
4 from forum.models.base import marked_deleted\r
5 from forum.models.meta import vote_canceled\r
6 from forum.models.answer import answer_accepted\r
7 from forum.authentication import user_updated\r
8 from forum.const import *\r
9 \r
10 def record_ask_event(instance, created, **kwargs):\r
11     if created:\r
12         activity = Activity(user=instance.author, active_at=instance.added_at, content_object=instance, activity_type=TYPE_ACTIVITY_ASK_QUESTION)\r
13         activity.save()\r
14 \r
15 post_save.connect(record_ask_event, sender=Question)\r
16 \r
17 \r
18 def record_answer_event(instance, created, **kwargs):\r
19     if created:\r
20         activity = Activity(user=instance.author, active_at=instance.added_at, content_object=instance, activity_type=TYPE_ACTIVITY_ANSWER)\r
21         activity.save()\r
22 \r
23 post_save.connect(record_answer_event, sender=Answer)\r
24 \r
25 \r
26 def record_comment_event(instance, created, **kwargs):\r
27     if created:\r
28         act_type = (instance.content_object.__class__ is Question) and TYPE_ACTIVITY_COMMENT_QUESTION or TYPE_ACTIVITY_COMMENT_ANSWER\r
29         activity = Activity(user=instance.user, active_at=instance.added_at, content_object=instance, activity_type=act_type)\r
30         activity.save()\r
31 \r
32 post_save.connect(record_comment_event, sender=Comment)\r
33 \r
34 \r
35 def record_revision_event(instance, created, **kwargs):\r
36     if created and instance.revision <> 1 and instance.node.node_type in ('question', 'answer',):\r
37         activity_type = instance.node.node_type == 'question' and TYPE_ACTIVITY_UPDATE_QUESTION or TYPE_ACTIVITY_UPDATE_ANSWER\r
38         activity = Activity(user=instance.author, active_at=instance.revised_at, content_object=instance, activity_type=activity_type)\r
39         activity.save()\r
40 \r
41 post_save.connect(record_revision_event, sender=NodeRevision)\r
42 \r
43 \r
44 def record_award_event(instance, created, **kwargs):\r
45     if created:\r
46         activity = Activity(user=instance.user, active_at=instance.awarded_at, content_object=instance,\r
47             activity_type=TYPE_ACTIVITY_PRIZE)\r
48         activity.save()\r
49 \r
50 post_save.connect(record_award_event, sender=Award)\r
51 \r
52 \r
53 def record_answer_accepted(answer, user, **kwargs):\r
54     activity = Activity(user=user, active_at=datetime.datetime.now(), content_object=answer, activity_type=TYPE_ACTIVITY_MARK_ANSWER)\r
55     activity.save()\r
56 \r
57 answer_accepted.connect(record_answer_accepted)\r
58 \r
59 \r
60 def update_last_seen(instance, **kwargs):\r
61     user = instance.user\r
62     user.last_seen = datetime.datetime.now()\r
63     user.save()\r
64 \r
65 post_save.connect(update_last_seen, sender=Activity)\r
66 \r
67 \r
68 def record_vote(instance, created, **kwargs):\r
69     if created:\r
70         act_type = (instance.vote == 1) and TYPE_ACTIVITY_VOTE_UP or TYPE_ACTIVITY_VOTE_DOWN\r
71 \r
72         activity = Activity(user=instance.user, active_at=instance.voted_at, content_object=instance, activity_type=act_type)\r
73         activity.save()\r
74 \r
75 post_save.connect(record_vote, sender=Vote)\r
76 \r
77 \r
78 def record_cancel_vote(instance, **kwargs):\r
79     act_type = (instance.vote == 1) and TYPE_ACTIVITY_CANCEL_VOTE_UP or TYPE_ACTIVITY_CANCEL_VOTE_DOWN\r
80     activity = Activity(user=instance.user, active_at=datetime.datetime.now(), content_object=instance, activity_type=act_type)\r
81     activity.save()\r
82 \r
83 vote_canceled.connect(record_cancel_vote)\r
84 \r
85 \r
86 def record_delete_post(instance, **kwargs):\r
87     act_type = (instance.__class__ is Question) and TYPE_ACTIVITY_DELETE_QUESTION or TYPE_ACTIVITY_DELETE_ANSWER\r
88     activity = Activity(user=instance.deleted_by, active_at=datetime.datetime.now(), content_object=instance, activity_type=act_type)\r
89     activity.save()\r
90 \r
91 marked_deleted.connect(record_delete_post, sender=Question)\r
92 marked_deleted.connect(record_delete_post, sender=Answer)\r
93 \r
94 \r
95 def record_update_tags(instance, created, **kwargs):\r
96     if not created and 'tagnames' in instance.get_dirty_fields():\r
97         activity = Activity(user=instance.author, active_at=datetime.datetime.now(), content_object=instance, activity_type=TYPE_ACTIVITY_UPDATE_TAGS)\r
98         activity.save()\r
99 \r
100 post_save.connect(record_update_tags, sender=Question)\r
101 \r
102 \r
103 def record_mark_offensive(instance, created, **kwargs):\r
104     if created:\r
105         activity = Activity(user=instance.user, active_at=datetime.datetime.now(), content_object=instance.content_object, activity_type=TYPE_ACTIVITY_MARK_OFFENSIVE)\r
106         activity.save()\r
107 \r
108 post_save.connect(record_mark_offensive, sender=FlaggedItem)\r
109 \r
110 \r
111 def record_favorite_question(instance, created, **kwargs):\r
112     if created:\r
113         activity = Activity(user=instance.user, active_at=datetime.datetime.now(), content_object=instance, activity_type=TYPE_ACTIVITY_FAVORITE)\r
114         activity.save()\r
115 \r
116 post_save.connect(record_favorite_question, sender=FavoriteQuestion)\r
117 \r
118 \r
119 def record_user_full_updated(instance, **kwargs):\r
120     activity = Activity(user=instance, active_at=datetime.datetime.now(), content_object=instance, activity_type=TYPE_ACTIVITY_USER_FULL_UPDATED)\r
121     activity.save()\r
122 \r
123 user_updated.connect(record_user_full_updated, sender=User)\r
124 \r