summaryrefslogtreecommitdiffstats
path: root/askbot/tasks.py
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-08-10 16:00:44 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-08-10 16:00:44 -0400
commit72210f4fef0b81decc90738b0fe5ac407455eaa0 (patch)
tree6f8dab769b57e499792d38b3b602381fd72d4d68 /askbot/tasks.py
parent460d32a4cc2cd77ea95d7eab1d08daafd7638dd9 (diff)
downloadaskbot-72210f4fef0b81decc90738b0fe5ac407455eaa0.tar.gz
askbot-72210f4fef0b81decc90738b0fe5ac407455eaa0.tar.bz2
askbot-72210f4fef0b81decc90738b0fe5ac407455eaa0.zip
merged with the user-groups branch
Diffstat (limited to 'askbot/tasks.py')
-rw-r--r--askbot/tasks.py133
1 files changed, 23 insertions, 110 deletions
diff --git a/askbot/tasks.py b/askbot/tasks.py
index 5b695a8c..4aa11798 100644
--- a/askbot/tasks.py
+++ b/askbot/tasks.py
@@ -27,8 +27,7 @@ from celery.decorators import task
from askbot.conf import settings as askbot_settings
from askbot import const
from askbot import mail
-from askbot.models import Activity, Post, Thread, User, ReplyAddress
-from askbot.models import send_instant_notifications_about_activity_in_post
+from askbot.models import Post, Thread, User, ReplyAddress
from askbot.models.badges import award_badges_signal
# TODO: Make exceptions raised inside record_post_update_celery_task() ...
@@ -102,122 +101,36 @@ def record_post_update_celery_task(
diff = None,
):
#reconstitute objects from the database
- updated_by = User.objects.get(id = updated_by_id)
- post_content_type = ContentType.objects.get(id = post_content_type_id)
- post = post_content_type.get_object_for_this_type(id = post_id)
+ updated_by = User.objects.get(id=updated_by_id)
+ post_content_type = ContentType.objects.get(id=post_content_type_id)
+ post = post_content_type.get_object_for_this_type(id=post_id)
newly_mentioned_users = User.objects.filter(
- id__in = newly_mentioned_user_id_list
+ id__in=newly_mentioned_user_id_list
)
try:
- record_post_update(
- post = post,
- updated_by = updated_by,
- newly_mentioned_users = newly_mentioned_users,
- timestamp = timestamp,
- created = created,
- diff = diff
+ notify_sets = post.get_notify_sets(
+ mentioned_users=newly_mentioned_users,
+ exclude_list=[updated_by,]
+ )
+ #todo: take into account created == True case
+ #update_object is not used
+ (activity_type, update_object) = post.get_updated_activity_data(created)
+
+ post.issue_update_notifications(
+ updated_by=updated_by,
+ notify_sets=notify_sets,
+ activity_type=activity_type,
+ timestamp=timestamp,
+ diff=diff
)
+
except Exception:
- # HACK: exceptions from Celery job don;t propagate upwards to Django test runner
- # so at least le't sprint tracebacks
+ # HACK: exceptions from Celery job don't propagate upwards
+ # to the Django test runner
+ # so at least let's print tracebacks
print >>sys.stderr, traceback.format_exc()
raise
-def record_post_update(
- post = None,
- updated_by = None,
- newly_mentioned_users = None,
- timestamp = None,
- created = False,
- diff = None
- ):
- """Called when a post is updated. Arguments:
-
- * ``newly_mentioned_users`` - users who are mentioned in the
- post for the first time
- * ``created`` - a boolean. True when ``post`` has just been created
- * remaining arguments are self - explanatory
-
- The method does two things:
-
- * records "red envelope" recipients of the post
- * sends email alerts to all subscribers to the post
- """
- #todo: take into account created == True case
- (activity_type, update_object) = post.get_updated_activity_data(created)
-
- if post.is_comment():
- #it's just a comment!
- summary = post.text
- else:
- #summary = post.get_latest_revision().summary
- summary = diff
-
- update_activity = Activity(
- user = updated_by,
- active_at = timestamp,
- content_object = post,
- activity_type = activity_type,
- question = post.get_origin_post(),
- summary = summary
- )
- update_activity.save()
-
- #what users are included depends on the post type
- #for example for question - all Q&A contributors
- #are included, for comments only authors of comments and parent
- #post are included
- recipients = post.get_response_receivers(
- exclude_list = [updated_by, ]
- )
-
- update_activity.add_recipients(recipients)
-
- #create new mentions
- for u in newly_mentioned_users:
- #todo: a hack - some users will not have record of a mention
- #may need to fix this in the future. Added this so that
- #recipients of the response who are mentioned as well would
- #not get two notifications in the inbox for the same post
- if u in recipients:
- continue
- Activity.objects.create_new_mention(
- mentioned_whom = u,
- mentioned_in = post,
- mentioned_by = updated_by,
- mentioned_at = timestamp
- )
-
- assert(updated_by not in recipients)
-
- for user in (set(recipients) | set(newly_mentioned_users)):
- user.update_response_counts()
-
- #shortcircuit if the email alerts are disabled
- if askbot_settings.ENABLE_EMAIL_ALERTS == False:
- return
-
- #todo: weird thing is that only comments need the recipients
- #todo: debug these calls and then uncomment in the repo
- #argument to this call
- notification_subscribers = post.get_instant_notification_subscribers(
- potential_subscribers = recipients,
- mentioned_users = newly_mentioned_users,
- exclude_list = [updated_by, ]
- )
- #todo: fix this temporary spam protection plug
- #if created:
- # if not (updated_by.is_administrator() or updated_by.is_moderator()):
- # if updated_by.reputation < 15:
- # notification_subscribers = \
- # [u for u in notification_subscribers if u.is_administrator()]
- send_instant_notifications_about_activity_in_post(
- update_activity = update_activity,
- post = post,
- recipients = notification_subscribers,
- )
-
-
@task(ignore_result = True)
def record_question_visit(
question_post = None,