]> git.openstreetmap.org Git - osqa.git/blob - forum/subscriptions.py
Converted the new question notification template.
[osqa.git] / forum / subscriptions.py
1 import os\r
2 import re\r
3 import datetime\r
4 from forum.models import User, Question, Comment, QuestionSubscription, SubscriptionSettings, Answer\r
5 from forum.utils.mail import send_email, send_template_email\r
6 from django.utils.translation import ugettext as _\r
7 from forum.actions import AskAction, AnswerAction, CommentAction, AcceptAnswerAction, UserJoinsAction, QuestionViewAction\r
8 from forum import settings\r
9 from django.db.models import Q, F\r
10 \r
11 def create_subscription_if_not_exists(question, user):\r
12     try:\r
13         subscription = QuestionSubscription.objects.get(question=question, user=user)\r
14     except:\r
15         subscription = QuestionSubscription(question=question, user=user)\r
16         subscription.save()\r
17 \r
18 def apply_default_filters(queryset, excluded_id):\r
19     return queryset.values('email', 'username').exclude(id=excluded_id)\r
20 \r
21 def create_recipients_dict(usr_list):\r
22     return [(s['username'], s['email'], {'username': s['username']}) for s in usr_list]\r
23 \r
24 def question_posted(action, new):\r
25     question = action.node\r
26 \r
27     subscribers = User.objects.filter(\r
28             Q(subscription_settings__enable_notifications=True, subscription_settings__new_question='i') |\r
29             (Q(subscription_settings__new_question_watched_tags='i') &\r
30               Q(marked_tags__name__in=question.tagnames.split(' ')) &\r
31               Q(tag_selections__reason='good'))\r
32     ).exclude(id=question.author.id).distinct()\r
33 \r
34     #recipients = create_recipients_dict(subscribers)\r
35 \r
36     send_template_email(subscribers, "notifications/newquestion.html", {'question': question})\r
37 \r
38     #send_email(settings.EMAIL_SUBJECT_PREFIX + _("New question on %(app_name)s") % dict(app_name=settings.APP_SHORT_NAME),\r
39     #           recipients, "notifications/newquestion.html", {\r
40     #    'question': question,\r
41     #})\r
42 \r
43     if question.author.subscription_settings.questions_asked:\r
44         subscription = QuestionSubscription(question=question, user=question.author)\r
45         subscription.save()\r
46 \r
47     new_subscribers = User.objects.filter(\r
48             Q(subscription_settings__all_questions=True) |\r
49             Q(subscription_settings__all_questions_watched_tags=True,\r
50                     marked_tags__name__in=question.tagnames.split(' '),\r
51                     tag_selections__reason='good'))\r
52 \r
53     for user in new_subscribers:\r
54         create_subscription_if_not_exists(question, user)\r
55 \r
56 AskAction.hook(question_posted)\r
57 \r
58 \r
59 def answer_posted(action, new):\r
60     answer = action.node\r
61     question = answer.question\r
62 \r
63     subscribers = question.subscribers.values('email', 'username').filter(\r
64             subscription_settings__enable_notifications=True,\r
65             subscription_settings__notify_answers=True,\r
66             subscription_settings__subscribed_questions='i'\r
67     ).exclude(id=answer.author.id).distinct()\r
68     recipients = create_recipients_dict(subscribers)\r
69 \r
70     send_email(settings.EMAIL_SUBJECT_PREFIX + _("New answer to '%(question_title)s'") % dict(question_title=question.title),\r
71                recipients, "notifications/newanswer.html", {\r
72         'question': question,\r
73         'answer': answer\r
74     }, threaded=False)\r
75 \r
76     if answer.author.subscription_settings.questions_answered:\r
77         create_subscription_if_not_exists(question, answer.author)\r
78 \r
79 AnswerAction.hook(answer_posted)\r
80 \r
81 \r
82 def comment_posted(action, new):\r
83     comment = action.node\r
84     post = comment.content_object\r
85 \r
86     if post.__class__ == Question:\r
87         question = post\r
88     else:\r
89         question = post.question\r
90 \r
91     subscribers = question.subscribers.values('email', 'username')\r
92 \r
93     q_filter = Q(subscription_settings__notify_comments=True) | Q(subscription_settings__notify_comments_own_post=True, id=post.author.id)\r
94 \r
95     #inreply = re.search('@\w+', comment.comment)\r
96     #if inreply is not None:\r
97     #    q_filter = q_filter | Q(subscription_settings__notify_reply_to_comments=True,\r
98     #                            username__istartswith=inreply.group(0)[1:],\r
99     ##                            comments__object_id=post.id,\r
100     #                            comments__content_type=ContentType.objects.get_for_model(post.__class__)\r
101     #                            )\r
102 \r
103     subscribers = subscribers.filter(\r
104             q_filter, subscription_settings__subscribed_questions='i', subscription_settings__enable_notifications=True\r
105     ).exclude(id=comment.user.id).distinct()\r
106 \r
107     recipients = create_recipients_dict(subscribers)\r
108 \r
109     send_email(settings.EMAIL_SUBJECT_PREFIX + _("New comment on %(question_title)s") % dict(question_title=question.title),\r
110                recipients, "notifications/newcomment.html", {\r
111                 'comment': comment,\r
112                 'post': post,\r
113                 'question': question,\r
114     }, threaded=False)\r
115 \r
116     if comment.user.subscription_settings.questions_commented:\r
117         create_subscription_if_not_exists(question, comment.user)\r
118 \r
119 CommentAction.hook(comment_posted)\r
120 \r
121 \r
122 def answer_accepted(action, new):\r
123     question = action.node.question\r
124 \r
125     subscribers = question.subscribers.values('email', 'username').filter(\r
126             subscription_settings__enable_notifications=True,\r
127             subscription_settings__notify_accepted=True,\r
128             subscription_settings__subscribed_questions='i'\r
129     ).exclude(id=action.node.nstate.accepted.by.id).distinct()\r
130     recipients = create_recipients_dict(subscribers)\r
131 \r
132     send_email(settings.EMAIL_SUBJECT_PREFIX + _("An answer to '%(question_title)s' was accepted") % dict(question_title=question.title),\r
133                recipients, "notifications/answeraccepted.html", {\r
134         'question': question,\r
135         'answer': action.node\r
136     }, threaded=False)\r
137 \r
138 AcceptAnswerAction.hook(answer_accepted)\r
139 \r
140 \r
141 def member_joined(action, new):\r
142     subscribers = User.objects.values('email', 'username').filter(\r
143             subscription_settings__enable_notifications=True,\r
144             subscription_settings__member_joins='i'\r
145     ).exclude(id=action.user.id).distinct()\r
146 \r
147     recipients = create_recipients_dict(subscribers)\r
148 \r
149     send_email(settings.EMAIL_SUBJECT_PREFIX + _("%(username)s is a new member on %(app_name)s") % dict(username=action.user.username, app_name=settings.APP_SHORT_NAME),\r
150                recipients, "notifications/newmember.html", {\r
151         'newmember': action.user,\r
152     }, threaded=False)\r
153 \r
154 UserJoinsAction.hook(member_joined)\r
155 \r
156 def question_viewed(action, new):\r
157     if not action.viewuser.is_authenticated():\r
158         return\r
159 \r
160     try:\r
161         subscription = QuestionSubscription.objects.get(question=action.node, user=action.viewuser)\r
162         subscription.last_view = datetime.datetime.now()\r
163         subscription.save()\r
164     except:\r
165         if action.viewuser.subscription_settings.questions_viewed:\r
166             subscription = QuestionSubscription(question=action.node, user=action.viewuser)\r
167             subscription.save()\r
168 \r
169 QuestionViewAction.hook(question_viewed)\r
170 \r
171 \r
172 #todo: translate this\r
173 #record_answer_event_re = re.compile("You have received (a|\d+) .*new response.*")\r
174 #def record_answer_event(instance, created, **kwargs):\r
175 #    if created:\r
176 #        q_author = instance.question.author\r
177 #        found_match = False\r
178 #        #print 'going through %d messages' % q_author.message_set.all().count()\r
179 #        for m in q_author.message_set.all():\r
180 ##            #print m.message\r
181 # #           match = record_answer_event_re.search(m.message)\r
182 #            if match:\r
183 #                found_match = True\r
184 #                try:\r
185 #                    cnt = int(match.group(1))\r
186 #                except:\r
187 #                    cnt = 1\r
188 ##                m.message = u"You have received %d <a href=\"%s?sort=responses\">new responses</a>."\\r
189 # #                           % (cnt+1, q_author.get_profile_url())\r
190 #\r
191 #                m.save()\r
192 #                break\r
193 #        if not found_match:\r
194 #            msg = u"You have received a <a href=\"%s?sort=responses\">new response</a>."\\r
195 #                    % q_author.get_profile_url()\r
196 #\r
197 #            q_author.message_set.create(message=msg)\r
198 #\r
199 #post_save.connect(record_answer_event, sender=Answer)