def send_new_question_notification(specific_question, created, **kwargs): context = specific_question.context_object if created \ and hasattr(context, 'get_members') \ and hasattr(context, 'mail_auto_subscription') \ and context.mail_auto_subscription: post = specific_question.thread.question try: activity = Activity.objects.get(content_type=ContentType.objects.get_for_model(Post), object_id=post.id, activity_type=TYPE_ACTIVITY_ASK_QUESTION) except Activity.DoesNotExist: send_new_question_notification.retry() recipients = [] for member in context.get_members(): if not isinstance(member, User): member = member.user recipients.append(member) send_instant_notifications_about_activity_in_post(activity, post=post, recipients=recipients)
def send_new_question_notification(specific_question, created, **kwargs): context = specific_question.context_object if created \ and hasattr(context, 'get_members') \ and hasattr(context, 'mail_auto_subscription') \ and context.mail_auto_subscription: post = specific_question.thread.question try: activity = Activity.objects.get( content_type=ContentType.objects.get_for_model(Post), object_id=post.id, activity_type=TYPE_ACTIVITY_ASK_QUESTION) except Activity.DoesNotExist: send_new_question_notification.retry() recipients = [] for member in context.get_members(): if not isinstance(member, User): member = member.user recipients.append(member) send_instant_notifications_about_activity_in_post( activity, post=post, recipients=recipients)
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() #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, )
def record_post_update( post = None, updated_by = None, newly_mentioned_users = None, timestamp = None, created = False ): """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) update_activity = Activity( user = updated_by, active_at = timestamp, content_object = post, activity_type = activity_type, question = post.get_origin_post() ) 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) assert(updated_by not in recipients) for user in set(recipients) | set(newly_mentioned_users): user.increment_response_count() user.save() #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, )
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.post_type != 'comment': #summary = post.get_latest_revision().summary summary = diff else: #it's just a comment! summary = post.comment 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() #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, )
def record_post_update( post = None, updated_by = None, newly_mentioned_users = None, timestamp = None, created = False ): """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 """ start_time = time.time() #todo: take into account created == True case (activity_type, update_object) = post.get_updated_activity_data(created) update_activity = Activity( user = updated_by, active_at = timestamp, content_object = post, activity_type = activity_type, question = post.get_origin_post() ) 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) assert(updated_by not in recipients) for user in (set(recipients) | set(newly_mentioned_users)): user.update_response_counts() #todo: weird thing is that only comments need the recipients #todo: debug these calls and then uncomment in the repo #argument to this call pre_notif_time = time.time() 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 False: 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()] #Updater always gets an email notification_subscribers.append(updated_by) pre_email_time = time.time() send_instant_notifications_about_activity_in_post( update_activity = update_activity, post = post, recipients = notification_subscribers, ) debug_str = "\nTitle: %s" % post.get_origin_post().title debug_str += "\nEmailed%s\n" % get_subs_email(notification_subscribers) #debug_str += " Pre-notif Time: %8.3f\n" % float(pre_notif_time - start_time) #debug_str += " Sub Search Time: %8.3f\n" % float(pre_email_time - pre_notif_time) #debug_str += " Email Time: %8.3f\n" % float(time.time() - pre_email_time) debug_str += "Total Elapsed Time: %8.3f" % float(time.time() - start_time) logging.critical(debug_str)
def record_post_update( post = None, updated_by = None, newly_mentioned_users = None, timestamp = None, created = False ): """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) update_activity = Activity( user = updated_by, active_at = timestamp, content_object = post, activity_type = activity_type, question = post.get_origin_post() ) 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) assert(updated_by not in recipients) for user in (set(recipients) | set(newly_mentioned_users)): user.update_response_counts() #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, )
def record_post_update_task( post_id, post_content_type_id, newly_mentioned_user_id_list = None, updated_by_id = None, timestamp = None, created = False, ): 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) #todo: take into account created == True case (activity_type, update_object) = post.get_updated_activity_data(created) update_activity = Activity( user = updated_by, active_at = timestamp, content_object = post, activity_type = activity_type, question = post.get_origin_post() ) 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) assert(updated_by not in recipients) newly_mentioned_users = User.objects.filter( id__in = newly_mentioned_user_id_list ) for user in set(recipients) | set(newly_mentioned_users): user.increment_response_count() user.save() #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, )