4 from forum.models import User, Question, Comment, QuestionSubscription, SubscriptionSettings, Answer
\r
5 from forum.models.user import activity_record
\r
6 from forum.utils.mail import send_email
\r
7 from forum.views.readers import question_view
\r
8 from django.utils.translation import ugettext as _
\r
9 from django.conf import settings
\r
10 from django.db.models import Q, F
\r
11 from django.db.models.signals import post_save
\r
12 from django.contrib.contenttypes.models import ContentType
\r
15 def create_subscription_if_not_exists(question, user):
\r
17 subscription = QuestionSubscription.objects.get(question=question, user=user)
\r
19 subscription = QuestionSubscription(question=question, user=user)
\r
22 def apply_default_filters(queryset, excluded_id):
\r
23 return queryset.values('email', 'username').exclude(id=excluded_id)
\r
25 def create_recipients_dict(usr_list):
\r
26 return [(s['username'], s['email'], {'username': s['username']}) for s in usr_list]
\r
28 def question_posted(sender, instance, **kwargs):
\r
29 question = instance.content_object
\r
31 subscribers = User.objects.values('email', 'username').filter(
\r
32 Q(subscription_settings__enable_notifications=True, subscription_settings__new_question='i') |
\r
33 (Q(subscription_settings__new_question_watched_tags='i') &
\r
34 Q(marked_tags__name__in=question.tagnames.split(' ')) &
\r
35 Q(tag_selections__reason='good'))
\r
36 ).exclude(id=question.author.id).distinct()
\r
38 recipients = create_recipients_dict(subscribers)
\r
40 send_email(settings.EMAIL_SUBJECT_PREFIX + _("New question on %(app_name)s") % dict(app_name=settings.APP_SHORT_NAME),
\r
41 recipients, "notifications/newquestion.html", {
\r
42 'question': question,
\r
45 if question.author.subscription_settings.questions_asked:
\r
46 subscription = QuestionSubscription(question=question, user=question.author)
\r
49 new_subscribers = User.objects.filter(
\r
50 Q(subscription_settings__all_questions=True) |
\r
51 Q(subscription_settings__all_questions_watched_tags=True,
\r
52 marked_tags__name__in=question.tagnames.split(' '),
\r
53 tag_selections__reason='good'))
\r
55 for user in new_subscribers:
\r
56 create_subscription_if_not_exists(question, user)
\r
58 activity_record.connect(question_posted, sender=const.TYPE_ACTIVITY_ASK_QUESTION, weak=False)
\r
61 def answer_posted(sender, instance, **kwargs):
\r
62 answer = instance.content_object
\r
63 question = answer.question
\r
65 subscribers = question.subscribers.values('email', 'username').filter(
\r
66 subscription_settings__enable_notifications=True,
\r
67 subscription_settings__notify_answers=True,
\r
68 subscription_settings__subscribed_questions='i'
\r
69 ).exclude(id=answer.author.id).distinct()
\r
70 recipients = create_recipients_dict(subscribers)
\r
72 send_email(settings.EMAIL_SUBJECT_PREFIX + _("New answer to '%(question_title)s'") % dict(question_title=question.title),
\r
73 recipients, "notifications/newanswer.html", {
\r
74 'question': question,
\r
78 if answer.author.subscription_settings.questions_answered:
\r
79 create_subscription_if_not_exists(question, answer.author)
\r
81 activity_record.connect(answer_posted, sender=const.TYPE_ACTIVITY_ANSWER, weak=False)
\r
84 def comment_posted(sender, instance, **kwargs):
\r
85 comment = instance.content_object
\r
86 post = comment.content_object
\r
88 if post.__class__ == Question:
\r
91 question = post.question
\r
93 subscribers = question.subscribers.values('email', 'username')
\r
95 q_filter = Q(subscription_settings__notify_comments=True) | Q(subscription_settings__notify_comments_own_post=True, id=post.author.id)
\r
97 inreply = re.search('@\w+', comment.comment)
\r
98 if inreply is not None:
\r
99 q_filter = q_filter | Q(subscription_settings__notify_reply_to_comments=True,
\r
100 username__istartswith=inreply.group(0)[1:],
\r
101 comments__object_id=post.id,
\r
102 comments__content_type=ContentType.objects.get_for_model(post.__class__)
\r
105 subscribers = subscribers.filter(
\r
106 q_filter, subscription_settings__subscribed_questions='i', subscription_settings__enable_notifications=True
\r
107 ).exclude(id=comment.user.id).distinct()
\r
109 recipients = create_recipients_dict(subscribers)
\r
111 send_email(settings.EMAIL_SUBJECT_PREFIX + _("New comment on %(question_title)s") % dict(question_title=question.title),
\r
112 recipients, "notifications/newcomment.html", {
\r
113 'comment': comment,
\r
115 'question': question,
\r
118 if comment.user.subscription_settings.questions_commented:
\r
119 create_subscription_if_not_exists(question, comment.user)
\r
121 activity_record.connect(comment_posted, sender=const.TYPE_ACTIVITY_COMMENT_QUESTION, weak=False)
\r
122 activity_record.connect(comment_posted, sender=const.TYPE_ACTIVITY_COMMENT_ANSWER, weak=False)
\r
125 def answer_accepted(instance, created, **kwargs):
\r
126 if not created and 'accepted' in instance.get_dirty_fields() and instance.accepted:
\r
127 question = instance.question
\r
129 subscribers = question.subscribers.values('email', 'username').filter(
\r
130 subscription_settings__enable_notifications=True,
\r
131 subscription_settings__notify_accepted=True,
\r
132 subscription_settings__subscribed_questions='i'
\r
133 ).exclude(id=instance.accepted_by.id).distinct()
\r
134 recipients = create_recipients_dict(subscribers)
\r
136 send_email(settings.EMAIL_SUBJECT_PREFIX + _("An answer to '%(question_title)s' was accepted") % dict(question_title=question.title),
\r
137 recipients, "notifications/answeraccepted.html", {
\r
138 'question': question,
\r
142 post_save.connect(answer_accepted, sender=Answer)
\r
145 def member_joined(sender, instance, created, **kwargs):
\r
149 subscribers = User.objects.values('email', 'username').filter(
\r
150 subscription_settings__enable_notifications=True,
\r
151 subscription_settings__member_joins='i'
\r
152 ).exclude(id=instance.id).distinct()
\r
154 recipients = create_recipients_dict(subscribers)
\r
156 send_email(settings.EMAIL_SUBJECT_PREFIX + _("%(username)s is a new member on %(app_name)s") % dict(username=instance.username, app_name=settings.APP_SHORT_NAME),
\r
157 recipients, "notifications/newmember.html", {
\r
158 'newmember': instance,
\r
161 sub_settings = SubscriptionSettings(user=instance)
\r
162 sub_settings.save()
\r
164 post_save.connect(member_joined, sender=User, weak=False)
\r
166 def question_viewed(instance, user, **kwargs):
\r
167 if not user.is_authenticated():
\r
171 subscription = QuestionSubscription.objects.get(question=instance, user=user)
\r
172 subscription.last_view = datetime.datetime.now()
\r
173 subscription.save()
\r
175 if user.subscription_settings.questions_viewed:
\r
176 subscription = QuestionSubscription(question=instance, user=user)
\r
177 subscription.save()
\r
179 question_view.connect(question_viewed)
\r
181 #todo: this stuff goes temporarily here
\r
182 from forum.models import Award, Answer
\r
184 def notify_award_message(instance, created, **kwargs):
\r
186 user = instance.user
\r
188 msg = (u"Congratulations, you have received a badge '%s'. " \
\r
189 + u"Check out <a href=\"%s\">your profile</a>.") \
\r
190 % (instance.badge.name, user.get_profile_url())
\r
192 user.message_set.create(message=msg)
\r
194 post_save.connect(notify_award_message, sender=Award)
\r
196 #todo: translate this
\r
197 record_answer_event_re = re.compile("You have received (a|\d+) .*new response.*")
\r
198 def record_answer_event(instance, created, **kwargs):
\r
200 q_author = instance.question.author
\r
201 found_match = False
\r
202 #print 'going through %d messages' % q_author.message_set.all().count()
\r
203 for m in q_author.message_set.all():
\r
205 match = record_answer_event_re.search(m.message)
\r
209 cnt = int(match.group(1))
\r
212 m.message = u"You have received %d <a href=\"%s?sort=responses\">new responses</a>."\
\r
213 % (cnt+1, q_author.get_profile_url())
\r
217 if not found_match:
\r
218 msg = u"You have received a <a href=\"%s?sort=responses\">new response</a>."\
\r
219 % q_author.get_profile_url()
\r
221 q_author.message_set.create(message=msg)
\r
223 post_save.connect(record_answer_event, sender=Answer)