diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-08-10 16:00:44 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-08-10 16:00:44 -0400 |
commit | 72210f4fef0b81decc90738b0fe5ac407455eaa0 (patch) | |
tree | 6f8dab769b57e499792d38b3b602381fd72d4d68 /askbot/tasks.py | |
parent | 460d32a4cc2cd77ea95d7eab1d08daafd7638dd9 (diff) | |
download | askbot-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.py | 133 |
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, |