def test_get_mentioned_users_with_notification_enabled_users_with_notifications_enabled(self): user = Generators.user() notice_type = NoticeType.objects.create( label='new_forum_post_mention', display='', description='', default=2) NoticeSetting.for_user(user, notice_type, 1) self.assertEqual( [user], MentionsService.get_mentioned_users_with_notification_enabled([user.username], 'new_forum_post_mention'))
def test_get_mentioned_users_with_notification_enabled_no_users(self): self.assertEqual([], MentionsService.get_mentioned_users_with_notification_enabled( [], 'new_forum_post_mention'))
def test_get_mentioned_users_with_notification_enabled_no_users_with_notifications_enabled(self): user = Generators.user() self.assertEqual([], MentionsService.get_mentioned_users_with_notification_enabled( [user.username], 'new_forum_post_mention'))
def send_notifications(self, force=False): if self.comment.pending_moderation and not force: return instance = self.comment model_class = instance.content_type.model_class() obj = instance.content_type.get_object_for_this_type(id=instance.object_id) object_owner = None notification = None mentions = MentionsService.get_mentions(instance.text) url = None if model_class == Image: object_owner = obj.user notification = 'new_comment' url = settings.BASE_URL + instance.get_absolute_url() elif hasattr(model_class, 'edit_proposal_by'): object_owner = obj.edit_proposal_by notification = 'new_comment_to_edit_proposal' url = instance.get_absolute_url() elif model_class == Iotd: object_owner = obj.judge notification = 'new_comment_to_scheduled_iotd' url = AppRedirectionService.redirect(f'/iotd/judgement-queue#comments-{obj.pk}-{instance.pk}') if UserService(object_owner).shadow_bans(instance.author): log.info("Skipping notification for comment because %d shadow-bans %d" % ( object_owner.pk, instance.author.pk)) return exclude = MentionsService.get_mentioned_users_with_notification_enabled(mentions, 'new_comment_mention') if instance.parent and \ instance.parent.author != instance.author and \ not instance.pending_moderation: recipients = [x for x in [instance.parent.author] if x not in exclude] if recipients: push_notification( recipients, instance.author, 'new_comment_reply', { 'url': build_notification_url(url, instance.author), 'user': instance.author.userprofile.get_display_name(), 'user_url': settings.BASE_URL + reverse( 'user_page', kwargs={'username': instance.author.username} ), } ) if model_class == Image: if (force or not instance.pending_moderation) and not obj.is_wip: add_story(instance.author, verb='VERB_COMMENTED_IMAGE', action_object=instance, target=obj) if object_owner and notification: if instance.author != object_owner and \ (instance.parent is None or instance.parent.author != object_owner) and \ not instance.pending_moderation: recipients = [x for x in [object_owner] if x not in exclude] if recipients: push_notification( recipients, instance.author, notification, { 'url': build_notification_url(url, instance.author), 'user': instance.author.userprofile.get_display_name(), 'user_url': settings.BASE_URL + reverse( 'user_page', kwargs={'username': instance.author.username} ), } )