Esempio n. 1
0
def add_subscription(request, topic_id):
    topic = get_object_or_404(perms.filter_topics(request.user,
                                                  Topic.objects.all()),
                              pk=topic_id)
    if not perms.may_subscribe_topic(request.user, topic):
        raise PermissionDenied
    topic.subscribers.add(request.user)
    return HttpResponseRedirect(topic.get_absolute_url())
Esempio n. 2
0
def add_subscription(request, topic_id): # VERIFIED
    topic = get_object_or_404(perms.filter_topics(request.user, Topic.objects.all()), pk=topic_id)
    if not perms.may_access_topic(request, topic):
        raise PermissionDenied
    if not perms.may_subscribe_topic(request.user, topic):
        raise PermissionDenied
    topic.subscribers.add(request.user)
    return HttpResponseRedirect(topic.get_absolute_url())
Esempio n. 3
0
def add_subscription(request, topic_id):
    topic = get_object_or_404(perms.filter_topics(request.user, Topic.objects.all()), pk=topic_id)
    if not perms.may_subscribe_topic(request.user, topic):
        raise PermissionDenied
    topic.subscribers.add(request.user)
    msg = _('Subscription added. You will receive email notifications for replies to this topic.')
    messages.success(request, msg, fail_silently=True)
    return HttpResponseRedirect(topic.get_absolute_url())
Esempio n. 4
0
def add_subscription(request, topic_id):
    topic = get_object_or_404(perms.filter_topics(request.user,
                                                  Topic.objects.all()),
                              pk=topic_id)
    if not perms.may_subscribe_topic(request.user, topic):
        raise PermissionDenied
    topic.subscribers.add(request.user)
    msg = _(
        'Subscription added. You will receive email notifications for replies to this topic.'
    )
    messages.success(request, msg, fail_silently=True)
    return HttpResponseRedirect(topic.get_absolute_url())
Esempio n. 5
0
def post_saved(instance, **kwargs):
    if not defaults.PYBB_DISABLE_NOTIFICATIONS:
        notify_topic_subscribers(instance)

        if util.get_pybb_profile(instance.user).autosubscribe and \
            perms.may_subscribe_topic(instance.user, instance.topic):
            instance.topic.subscribers.add(instance.user)

    if kwargs['created']:
        profile = util.get_pybb_profile(instance.user)
        profile.post_count = instance.user.posts.count()
        profile.save()
Esempio n. 6
0
def post_saved(instance, **kwargs):
    if not defaults.PYBB_DISABLE_NOTIFICATIONS:
        notify_topic_subscribers(instance)

        if util.get_pybb_profile(instance.user).autosubscribe and \
            perms.may_subscribe_topic(instance.user, instance.topic):
            instance.topic.subscribers.add(instance.user)

    if kwargs['created']:
        profile = util.get_pybb_profile(instance.user)
        profile.post_count = instance.user.posts.count()
        profile.save()
Esempio n. 7
0
def post_saved(instance, **kwargs):

    if getattr(instance, '_post_saved_done', False):
        #Do not spam users when post is saved more than once in a same request.
        #For eg, when we parse attachments.
        return

    instance._post_saved_done = True
    if not defaults.PYBB_DISABLE_NOTIFICATIONS:
        notify_topic_subscribers(instance)

    if util.get_pybb_profile(instance.user).autosubscribe and \
        perms.may_subscribe_topic(instance.user, instance.topic):
        instance.topic.subscribers.add(instance.user)

    if kwargs['created']:
        profile = util.get_pybb_profile(instance.user)
        profile.post_count = instance.user.posts.count()
        profile.save()
Esempio n. 8
0
def post_saved(instance, **kwargs):

    if getattr(instance, '_post_saved_done', False):
        #Do not spam users when post is saved more than once in a same request.
        #For eg, when we parse attachments.
        return

    instance._post_saved_done = True
    if not defaults.PYBB_DISABLE_NOTIFICATIONS:
        notify_topic_subscribers(instance)

        if util.get_pybb_profile(instance.user).autosubscribe and \
            perms.may_subscribe_topic(instance.user, instance.topic):
            instance.topic.subscribers.add(instance.user)

    if kwargs['created']:
        profile = util.get_pybb_profile(instance.user)
        profile.post_count = instance.user.posts.count()
        profile.save()
Esempio n. 9
0
def forum_post_post_save(sender, instance, created, **kwargs):
    def notify_subscribers(mentions):
        # type: (List[str]) -> None
        recipients = list(
            instance.topic.subscribers.exclude(pk__in=list(
                set([instance.user.pk] + [
                    x.pk for x in MentionsService.
                    get_mentioned_users_with_notification_enabled(
                        mentions, 'new_forum_post_mention')
                ]))))

        if recipients:
            push_notification(
                recipients, instance.user, 'new_forum_reply', {
                    'user':
                    instance.user.userprofile.get_display_name(),
                    'user_url':
                    settings.BASE_URL + reverse_url(
                        'user_page', kwargs={'username': instance.user}),
                    'post_url':
                    build_notification_url(
                        settings.BASE_URL + instance.get_absolute_url(),
                        instance.user),
                    'topic_url':
                    build_notification_url(
                        settings.BASE_URL + instance.topic.get_absolute_url(),
                        instance.user),
                    'topic_name':
                    instance.topic.name,
                    'unsubscribe_url':
                    build_notification_url(
                        settings.BASE_URL +
                        reverse_url('pybb:delete_subscription',
                                    args=[instance.topic.id]), instance.user)
                })

    def notify_mentioned(mentions):
        # type: (List[str]) -> None
        for username in mentions:
            user = get_object_or_None(User, username=username)
            if user is None:
                try:
                    profile = get_object_or_None(UserProfile,
                                                 real_name=username)
                    if profile:
                        user = profile.user
                except MultipleObjectsReturned:
                    user = None
            if user:
                push_notification(
                    [user], instance.user, 'new_forum_post_mention', {
                        'url':
                        build_notification_url(
                            settings.BASE_URL + instance.get_absolute_url(),
                            instance.user),
                        'user':
                        instance.user.userprofile.get_display_name(),
                        'user_url':
                        settings.BASE_URL + reverse_url(
                            'user_page', kwargs={'username': instance.user}),
                        'post':
                        instance.topic.name,
                    })

    if created:
        if hasattr(instance.topic.forum, 'group'):
            instance.topic.forum.group.save()  # trigger date_updated update

        if get_pybb_profile(instance.user).autosubscribe and \
                perms.may_subscribe_topic(instance.user, instance.topic):
            instance.topic.subscribers.add(instance.user)

        mentions = MentionsService.get_mentions(instance.body)
        if not instance.on_moderation:
            notify_subscribers(mentions)
            notify_mentioned(mentions)
        else:
            NotificationsService.email_superusers(
                'New forum post needs moderation',
                '%s%s' % (settings.BASE_URL, instance.get_absolute_url()))

    else:
        mentions = cache.get(
            "post.%d.forum_post_pre_save_mentions" % instance.pk, [])
        cache.delete("post.%d.forum_post_pre_save_mentions" % instance.pk)
        if cache.get("post.%d.forum_post_pre_save_approved" % instance.pk):
            push_notification(
                [instance.user], None, 'forum_post_approved', {
                    'url':
                    build_notification_url(settings.BASE_URL +
                                           instance.get_absolute_url())
                })
            notify_subscribers(mentions)
            notify_mentioned(mentions)
            cache.delete("post.%d.forum_post_pre_save_approved" % instance.pk)

    cache_key = make_template_fragment_key(
        'home_page_latest_from_forums',
        (instance.user.pk, instance.user.userprofile.language))
    cache.delete(cache_key)
Esempio n. 10
0
def forum_post_post_save(sender, instance, created, **kwargs):
    def notify_subscribers():
        push_notification(
            list(instance.topic.subscribers.exclude(pk=instance.user.pk)),
            instance.user, 'new_forum_reply', {
                'user':
                instance.user.userprofile.get_display_name(),
                'user_url':
                settings.BASE_URL +
                reverse_url('user_page', kwargs={'username': instance.user}),
                'post_url':
                build_notification_url(
                    settings.BASE_URL + instance.get_absolute_url(),
                    instance.user),
                'topic_url':
                build_notification_url(
                    settings.BASE_URL + instance.topic.get_absolute_url(),
                    instance.user),
                'topic_name':
                instance.topic.name,
                'unsubscribe_url':
                build_notification_url(
                    settings.BASE_URL + reverse_url('pybb:delete_subscription',
                                                    args=[instance.topic.id]),
                    instance.user)
            })

    if created:
        mentions = MentionsService.get_mentions(instance.body)

        if hasattr(instance.topic.forum, 'group'):
            instance.topic.forum.group.save()  # trigger date_updated update

        if get_pybb_profile(instance.user).autosubscribe and \
                perms.may_subscribe_topic(instance.user, instance.topic):
            instance.topic.subscribers.add(instance.user)

        if not instance.on_moderation:
            notify_subscribers()
        else:
            NotificationsService.email_superusers(
                'New forum post needs moderation',
                '%s%s' % (settings.BASE_URL, instance.get_absolute_url()))

    else:
        mentions = cache.get(
            "user.%d.forum_post_pre_save_mentions" % instance.user.pk, [])

        if cache.get("user.%d.forum_post_pre_save_approved" %
                     instance.user.pk):
            notify_subscribers()

    for username in mentions:
        try:
            user = User.objects.get(username=username)
            push_notification(
                [user], instance.user, 'new_forum_post_mention', {
                    'url':
                    build_notification_url(
                        settings.BASE_URL + instance.get_absolute_url(),
                        instance.user),
                    'user':
                    instance.user.userprofile.get_display_name(),
                    'user_url':
                    settings.BASE_URL + reverse_url(
                        'user_page', kwargs={'username': instance.user}),
                    'post':
                    instance.topic.name,
                })
        except User.DoesNotExist:
            pass

    cache_key = make_template_fragment_key(
        'home_page_latest_from_forums',
        (instance.user.pk, instance.user.userprofile.language))
    cache.delete(cache_key)