示例#1
0
def mobile_reply(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    if not request.user.is_authenticated or post.topic.closed and not (request.user.is_superuser or request.user in forum.moderators.all()):
        raise Http404
    ip = get_client_ip(request)
    post_form_kwargs = {
        "topic":post.topic,
        "user":request.user,
        "ip":ip,
        'is_ip_banned': request.is_ip_banned,
    }
    if AddPostForm.FORM_NAME in request.POST:
        reply_form = AddPostForm(request.POST, request.FILES, **post_form_kwargs)
        if reply_form.is_valid():
            post = reply_form.save()
            messages.success(request, _("Reply saved."))
            return HttpResponseRedirect(post.get_mobile_url())
    else:
        reply_form = AddPostForm(
            initial={
                'markup': request.user.forum_profile.markup,
                'subscribe': False,
                'body':'[quote=' + post.user.username + ']' + post.body + '[/quote]\n',
            },
            **post_form_kwargs
        )
    return render(request, 'djangobb_forum/mobile/reply.html', {
        'form': reply_form,
        'post': post
        })
示例#2
0
def add_topic(request, forum_id):
    """
    create a new topic, with or without poll
    """
    forum = get_object_or_404(Forum, pk=forum_id)
    if not forum.category.has_access(request.user):
        raise PermissionDenied

    ip = request.META.get('REMOTE_ADDR', None)
    post_form_kwargs = {
        "forum": forum,
        "user": request.user,
        "ip": ip,
    }

    poll_form = None
    if request.method == 'POST':
        form = AddPostForm(request.POST, request.FILES, **post_form_kwargs)
        if form.is_valid():
            all_valid = True
        else:
            all_valid = False

        if forum_settings.ENABLE_POLLS:
            poll_form = PollForm(request.POST)
            if not poll_form.has_data():
                # All poll fields are empty: User didn't want to create a poll
                # Don't run validation and remove all form error messages
                poll_form = PollForm()  # create clean form without form errors
            elif not poll_form.is_valid():
                all_valid = False

        if all_valid:
            post = form.save()
            if poll_form and poll_form.has_data():
                poll_form.save(post)
                messages.success(request, _("Topic with poll saved."))
            else:
                messages.success(request, _("Topic saved."))
            return HttpResponseRedirect(post.get_absolute_url())
    else:
        form = AddPostForm(initial={
            'markup':
            request.user.forum_profile.markup,
            'subscribe':
            request.user.forum_profile.auto_subscribe,
        },
                           **post_form_kwargs)
        if forum_settings.ENABLE_POLLS and forum_id:  # Create a new topic
            poll_form = PollForm()

    context = {
        'forum': forum,
        'create_poll_form': poll_form,
        'form': form,
        'form_url': request.path,
        'back_url': forum.get_absolute_url(),
        'forum_settings': forum_settings,
    }
    return render(request, 'djangobb_forum/add_topic.html', context)
示例#3
0
文件: views.py 项目: TRocket/DjangoBB
def add_topic(request, forum_id, full=True):
    """
    create a new topic, with or without poll
    """
    forum = get_object_or_404(Forum, pk=forum_id)
    if not forum.category.has_access(request.user) or (forum.moderator_only and not (request.user.is_superuser or request.user in forum.moderators.all())):
        return HttpResponseForbidden()

    ip = request.META.get('REMOTE_ADDR', None)
    post_form_kwargs = {"forum":forum, "user":request.user, "ip":ip, }

    if request.method == 'POST':
        form = AddPostForm(request.POST, request.FILES, **post_form_kwargs)
        if form.is_valid():
            all_valid = True
        else:
            all_valid = False

        poll_form = PollForm(request.POST)
        create_poll = poll_form.create_poll()
        if not create_poll:
            # All poll fields are empty: User didn't want to create a poll
            # Don't run validation and remove all form error messages
            poll_form = PollForm() # create clean form without form errors
        elif not poll_form.is_valid():
            all_valid = False

        if all_valid:
            post = form.save()
            if create_poll:
                poll_form.save(post)
                messages.success(request, _("Topic with poll saved."))
            else:
                messages.success(request, _("Topic saved."))
            return HttpResponseRedirect(post.get_absolute_url() if full else post.get_mobile_url())
    else:
        form = AddPostForm(
            initial={
                'markup': request.user.forum_profile.markup,
                'subscribe': request.user.forum_profile.auto_subscribe,
            },
            **post_form_kwargs
        )

    # if creating a new topic and allowed
    create_poll_form = forum_id and forum_settings.ALLOW_POLLS

    poll_form = PollForm()

    context = {
        'forum': forum,
        'create_poll_form': create_poll_form,
        'poll_form': poll_form,
        'form': form,
        'form_url': request.path,
        'back_url': forum.get_absolute_url(),
    }
    return render(request, 'djangobb_forum/add_topic.html' if full else 'djangobb_forum/mobile/add_topic.html', context)
示例#4
0
def add_topic(request, forum_id):
    """
    create a new topic, with or without poll
    """
    forum = get_object_or_404(Forum, pk=forum_id)
    if not forum.category.has_access(request.user):
        raise PermissionDenied

    ip = request.META.get('REMOTE_ADDR', None)
    post_form_kwargs = {"forum":forum, "user":request.user, "ip":ip, }

    poll_form = None
    if request.method == 'POST':
        form = AddPostForm(request.POST, request.FILES, **post_form_kwargs)
        if form.is_valid():
            all_valid = True
        else:
            all_valid = False

        if forum_settings.ENABLE_POLLS:
            poll_form = PollForm(request.POST)
            if not poll_form.has_data():
                # All poll fields are empty: User didn't want to create a poll
                # Don't run validation and remove all form error messages
                poll_form = PollForm() # create clean form without form errors
            elif not poll_form.is_valid():
                all_valid = False

        if all_valid:
            post = form.save()
            if poll_form and poll_form.has_data():
                poll_form.save(post)
                messages.success(request, _("Topic with poll saved."))
            else:
                messages.success(request, _("Topic saved."))
            return HttpResponseRedirect(post.get_absolute_url())
    else:
        form = AddPostForm(
            initial={
                'markup': request.user.forum_profile.markup,
                'subscribe': request.user.forum_profile.auto_subscribe,
            },
            **post_form_kwargs
        )
        if forum_settings.ENABLE_POLLS and forum_id: # Create a new topic
            poll_form = PollForm()

    context = {
        'forum': forum,
        'create_poll_form': poll_form,
        'form': form,
        'form_url': request.path,
        'back_url': forum.get_absolute_url(),
    }
    return render(request, 'djangobb_forum/add_topic.html', context)
示例#5
0
def add_topic(request, forum_id):
    """
    create a new topic, with or without poll
    """
    forum = get_object_or_404(Forum, pk=forum_id)
    if not forum.category.has_access(request.user):
        return HttpResponseForbidden()

    ip = request.META.get("REMOTE_ADDR", None)
    post_form_kwargs = {"forum": forum, "user": request.user, "ip": ip}

    if request.method == "POST":
        form = AddPostForm(request.POST, request.FILES, **post_form_kwargs)
        if form.is_valid():
            all_valid = True
        else:
            all_valid = False

        poll_form = PollForm(request.POST)
        if not poll_form.has_data():
            # All poll fields are empty: User didn't want to create a poll
            # Don't run validation and remove all form error messages
            poll_form = PollForm()  # create clean form without form errors
        elif not poll_form.is_valid():
            all_valid = False

        if all_valid:
            post = form.save()
            if poll_form.has_data():
                poll_form.save(post)
                messages.success(request, _("Topic with poll saved."))
            else:
                messages.success(request, _("Topic saved."))
            return HttpResponseRedirect(post.get_absolute_url())
    else:
        form = AddPostForm(
            initial={
                "markup": request.user.forum_profile.markup,
                "subscribe": request.user.forum_profile.auto_subscribe,
            },
            **post_form_kwargs
        )
        if forum_id:  # Create a new topic
            poll_form = PollForm()

    context = {
        "forum": forum,
        "create_poll_form": poll_form,
        "form": form,
        "form_url": request.path,
        "back_url": forum.get_absolute_url(),
    }
    return render(request, "djangobb_forum/add_topic.html", context)
示例#6
0
def mobile_reply(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    if not request.user.is_authenticated or post.topic.closed and not (
            request.user.is_superuser
            or request.user in forum.moderators.all()):
        raise Http404
    ip = get_client_ip(request)
    post_form_kwargs = {
        "topic": post.topic,
        "user": request.user,
        "ip": ip,
        'is_ip_banned': request.is_ip_banned,
        "request_data": request.META,
        "url": "http://scratch.mit.edu%s" % post.get_absolute_url(),
    }
    if AddPostForm.FORM_NAME in request.POST:
        reply_form = AddPostForm(request.POST, request.FILES,
                                 **post_form_kwargs)
        if reply_form.is_valid():
            post = reply_form.save()
            messages.success(request, _("Reply saved."))
            return HttpResponseRedirect(post.get_mobile_url())
    else:
        reply_form = AddPostForm(initial={
            'markup':
            request.user.forum_profile.markup,
            'subscribe':
            False,
            'body':
            '[quote=' + post.user.username + ']' + post.body + '[/quote]\n',
        },
                                 **post_form_kwargs)
    return render(request, 'djangobb_forum/mobile/reply.html', {
        'form': reply_form,
        'post': post
    })
示例#7
0
文件: views.py 项目: psi29a/DjangoBB
def show_topic(request, topic_id, full=True):
    """
    * Display a topic
    * save a reply
    * save a poll vote

    TODO: Add reply in lofi mode
    """
    post_request = request.method == "POST"
    user_is_authenticated = request.user.is_authenticated()
    if post_request and not user_is_authenticated:
        # Info: only user that are logged in should get forms in the page.
        raise PermissionDenied

    topic = get_object_or_404(Topic.objects.select_related(), pk=topic_id)
    if not topic.forum.category.has_access(request.user):
        raise PermissionDenied
    Topic.objects.filter(pk=topic.id).update(views=F('views') + 1)

    last_post = topic.last_post

    if request.user.is_authenticated():
        topic.update_read(request.user)
    posts = topic.posts.all().select_related()

    moderator = request.user.is_superuser or request.user in topic.forum.moderators.all()
    if user_is_authenticated and request.user in topic.subscribers.all():
        subscribed = True
    else:
        subscribed = False

    # reply form
    reply_form = None
    form_url = None
    back_url = None
    if user_is_authenticated and not topic.closed:
        form_url = request.path + "#reply" # if form validation failed: browser should scroll down to reply form ;)
        back_url = request.path
        ip = request.META.get('REMOTE_ADDR', None)
        post_form_kwargs = {"topic":topic, "user":request.user, "ip":ip}
        if post_request and AddPostForm.FORM_NAME in request.POST:
            reply_form = AddPostForm(request.POST, request.FILES, **post_form_kwargs)
            if reply_form.is_valid():
                post = reply_form.save()
                messages.success(request, _("Your reply saved."))
                return HttpResponseRedirect(post.get_absolute_url())
        else:
            reply_form = AddPostForm(
                initial={
                    'markup': request.user.forum_profile.markup,
                    'subscribe': request.user.forum_profile.auto_subscribe,
                },
                **post_form_kwargs
            )

    # handle poll, if exists
    poll_form = None
    polls = topic.poll_set.all()
    if not polls:
        poll = None
    else:
        poll = polls[0]
        if user_is_authenticated: # Only logged in users can vote
            poll.deactivate_if_expired()
            has_voted = request.user in poll.users.all()
            if not post_request or not VotePollForm.FORM_NAME in request.POST:
                # It's not a POST request or: The reply form was send and not a poll vote
                if poll.active and not has_voted:
                    poll_form = VotePollForm(poll)
            else:
                if not poll.active:
                    messages.error(request, _("This poll is not active!"))
                    return HttpResponseRedirect(topic.get_absolute_url())
                elif has_voted:
                    messages.error(request, _("You have already vote to this poll in the past!"))
                    return HttpResponseRedirect(topic.get_absolute_url())

                poll_form = VotePollForm(poll, request.POST)
                if poll_form.is_valid():
                    ids = poll_form.cleaned_data["choice"]
                    queryset = poll.choices.filter(id__in=ids)
                    queryset.update(votes=F('votes') + 1)
                    poll.users.add(request.user) # save that this user has vote
                    messages.success(request, _("Your votes are saved."))
                    return HttpResponseRedirect(topic.get_absolute_url())

    highlight_word = request.GET.get('hl', '')
    if full:
        return render(request, 'djangobb_forum/topic.html', {'categories': Category.objects.all(),
                'topic': topic,
                'last_post': last_post,
                'form_url': form_url,
                'reply_form': reply_form,
                'back_url': back_url,
                'moderator': moderator,
                'subscribed': subscribed,
                'posts': posts,
                'highlight_word': highlight_word,
                'poll': poll,
                'poll_form': poll_form,
                })
    else:
        return render(request, 'djangobb_forum/lofi/topic.html', {'categories': Category.objects.all(),
                'topic': topic,
                'posts': posts,
                'poll': poll,
                'poll_form': poll_form,
                })
示例#8
0
文件: views.py 项目: emidln/DjangoBB
def show_topic(request, topic_id, full=True):
    """
    * Display a topic
    * save a reply
    * save a poll vote
    
    TODO: Add reply in lofi mode
    """
    post_request = request.method == "POST"
    user_is_authenticated = request.user.is_authenticated()
    if post_request and not user_is_authenticated:
        # Info: only user that are logged in should get forms in the page.
        return HttpResponseForbidden()

    topic = get_object_or_404(Topic.objects.select_related(), pk=topic_id)
    if not topic.forum.category.has_access(request.user):
        return HttpResponseForbidden()
    Topic.objects.filter(pk=topic.id).update(views=F('views') + 1)

    last_post = topic.last_post

    if request.user.is_authenticated():
        topic.update_read(request.user)
    posts = topic.posts.all().select_related()

    moderator = request.user.is_superuser or request.user in topic.forum.moderators.all(
    )
    if user_is_authenticated and request.user in topic.subscribers.all():
        subscribed = True
    else:
        subscribed = False

    # reply form
    reply_form = None
    form_url = None
    back_url = None
    if user_is_authenticated and not topic.closed:
        form_url = request.path + "#reply"  # if form validation failed: browser should scroll down to reply form ;)
        back_url = request.path
        ip = request.META.get('REMOTE_ADDR', None)
        post_form_kwargs = {"topic": topic, "user": request.user, "ip": ip}
        if post_request and AddPostForm.FORM_NAME in request.POST:
            reply_form = AddPostForm(request.POST, request.FILES,
                                     **post_form_kwargs)
            if reply_form.is_valid():
                post = reply_form.save()
                messages.success(request, _("Your reply saved."))
                return HttpResponseRedirect(post.get_absolute_url())
        else:
            reply_form = AddPostForm(initial={
                'markup':
                request.user.forum_profile.markup,
                'subscribe':
                request.user.forum_profile.auto_subscribe,
            },
                                     **post_form_kwargs)

    # handle poll, if exists
    poll_form = None
    polls = topic.poll_set.all()
    if not polls:
        poll = None
    else:
        poll = polls[0]
        if user_is_authenticated:  # Only logged in users can vote
            poll.auto_deactivate()
            has_voted = request.user in poll.users.all()
            if not post_request or not VotePollForm.FORM_NAME in request.POST:
                # It's not a POST request or: The reply form was send and not a poll vote
                if poll.active and not has_voted:
                    poll_form = VotePollForm(poll)
            else:
                if not poll.active:
                    messages.error(request, _("This poll is not active!"))
                    return HttpResponseRedirect(topic.get_absolute_url())
                elif has_voted:
                    messages.error(
                        request,
                        _("You have already vote to this poll in the past!"))
                    return HttpResponseRedirect(topic.get_absolute_url())

                poll_form = VotePollForm(poll, request.POST)
                if poll_form.is_valid():
                    ids = poll_form.cleaned_data["choice"]
                    queryset = poll.choices.filter(id__in=ids)
                    queryset.update(votes=F('votes') + 1)
                    poll.users.add(
                        request.user)  # save that this user has vote
                    messages.success(request, _("Your votes are saved."))
                    return HttpResponseRedirect(topic.get_absolute_url())

    highlight_word = request.GET.get('hl', '')
    if full:
        return render(
            request, 'djangobb_forum/topic.html', {
                'categories': Category.objects.all(),
                'topic': topic,
                'last_post': last_post,
                'form_url': form_url,
                'reply_form': reply_form,
                'back_url': back_url,
                'moderator': moderator,
                'subscribed': subscribed,
                'posts': posts,
                'highlight_word': highlight_word,
                'poll': poll,
                'poll_form': poll_form,
            })
    else:
        return render(
            request, 'djangobb_forum/lofi/topic.html', {
                'categories': Category.objects.all(),
                'topic': topic,
                'posts': posts,
                'poll': poll,
                'poll_form': poll_form,
            })
示例#9
0
def show_topic(request, topic_id, full=True):
    """
    * Display a topic
    * save a reply
    * save a poll vote
    """
    post_request = request.method == "POST"
    user_is_authenticated = request.user.is_authenticated()
    if post_request and not user_is_authenticated:
        # Info: only user that are logged in should get forms in the page.
        return HttpResponseForbidden()

    topic = get_object_or_404(Topic.objects.select_related(), pk=topic_id)
    if not topic.forum.category.has_access(request.user):
        return HttpResponseForbidden()
    Topic.objects.filter(pk=topic.id).update(views=F('views') + 1)
    last_post = topic.last_post

    if request.user.is_authenticated():
        topic.update_read(request.user)
    # without specifying, following query wouldn't select related properly
    posts = topic.posts.select_related('user__userprofile',
        'user__forum_profile',
        'updated_by', 'user').prefetch_related('user__groups').all()
    edit_start = timezone.now() - timedelta(minutes=1)
    edit_end = timezone.now()
    editable = posts.filter(created__range=(edit_start, edit_end)).filter(user_id=request.user.id)
    can_edit = request.user.has_perm('djangobb_forum.change_post')
    try:
        page_url_parameter = int(request.GET.get('page') or 1)
    except:
        page_url_parameter = 1
    first_post_number = int(forum_settings.TOPIC_PAGE_SIZE) * (page_url_parameter - 1)
    can_close = can_close_topic(request.user, topic)

    moderator = request.user.is_superuser or request.user in topic.forum.moderators.all()
    if user_is_authenticated and request.user in topic.subscribers.all():
        subscribed = True
    else:
        subscribed = False

    # reply form
    reply_form = None
    form_url = None
    back_url = None
    if user_is_authenticated and (not topic.closed or moderator):
        form_url = request.path + '?' + request.META['QUERY_STRING'] + '#reply' # if form validation failed: browser should scroll down to reply form ;)
        back_url = request.path
        ip = get_client_ip(request)
        post_form_kwargs = {
            "topic":topic,
            "user":request.user,
            "ip":ip,
            'is_ip_banned': request.is_ip_banned,
        }
        if post_request and AddPostForm.FORM_NAME in request.POST:

            reply_form = AddPostForm(request.POST, request.FILES, **post_form_kwargs)
            if reply_form.is_valid():
                post = reply_form.save()
                messages.success(request, _("Reply saved."))
                return HttpResponseRedirect(post.get_absolute_url() if full else post.get_mobile_url())
        else:
            reply_form = AddPostForm(
                initial={
                    'markup': request.user.forum_profile.markup,
                    'subscribe': False,
                },
                **post_form_kwargs
            )

    group_titles = {}
    
    for post in posts:
        
        if post.user.is_superuser:
            group_titles[post.user] = "Scratch Team"
            
        else: 
            temp_names = [group.name for group in post.user.groups.all()]
            if "Forum Moderators" in temp_names:
                group_titles[post.user] = "Forum Moderator"
            elif "Scratchers" in temp_names:
                group_titles[post.user] = "Scratcher"
            elif "New Scratchers" in temp_names:
                group_titles[post.user] = "New to Scratch"
            else:
                group_titles[post.user] = "Ungrouped"
    
        
    # handle poll, if exists
    poll_form = None
    polls = topic.poll_set.all()
    if not polls:
        poll = None
    else:
        poll = polls[0]
        if user_is_authenticated: # Only logged in users can vote
            poll.auto_deactivate()
            has_voted = request.user in poll.users.all()
            if not post_request or not VotePollForm.FORM_NAME in request.POST:
                # It's not a POST request or: The reply form was send and not a poll vote
                if poll.active and not has_voted:
                    poll_form = VotePollForm(poll)
            else:
                if not poll.active:
                    messages.error(request, _("This poll is not active."))
                    return HttpResponseRedirect(topic.get_absolute_url())
                elif has_voted:
                    messages.error(request, _("You already voted on this poll."))
                    return HttpResponseRedirect(topic.get_absolute_url())

                poll_form = VotePollForm(poll, request.POST)
                if poll_form.is_valid():
                    ids = poll_form.cleaned_data["choice"]
                    queryset = poll.choices.filter(id__in=ids)
                    queryset.update(votes=F('votes') + 1)
                    poll.users.add(request.user) # save that this user has vote
                    messages.success(request, _("Vote saved."))
                    return HttpResponseRedirect(topic.get_absolute_url())

    highlight_word = request.GET.get('hl', '')
    if full:
        return render(request, 'djangobb_forum/topic.html', {'categories': Category.objects.all(),
                'topic': topic,
                'last_post': last_post,
                'form_url': form_url,
                'reply_form': reply_form,
                'back_url': back_url,
                'moderator': moderator,
                'subscribed': subscribed,
                'posts': posts,
                'first_post_number': first_post_number,
                'highlight_word': highlight_word,
                'poll': poll,
                'poll_form': poll_form,
                'editable': editable,
                'can_edit': can_edit,
                'can_close': can_close,
                'group_titles': group_titles,
                'simple_user_agent': simple_user_agent(request),
                })
    else:
        return render(request, 'djangobb_forum/mobile/topic.html', {'categories': Category.objects.all(),
                'topic': topic,
                'posts': posts,
                'poll': poll,
                'poll_form': poll_form,
                'reply_form': reply_form,
                })
示例#10
0
def add_topic(request, forum_id, full=True):
    """
    create a new topic, with or without poll
    """
    forum = get_object_or_404(Forum, pk=forum_id)
    if not forum.category.has_access(request.user) or (
            forum.moderator_only
            and not (request.user.is_superuser
                     or request.user in forum.moderators.all())):
        return HttpResponseForbidden()

    ip = get_client_ip(request)
    post_form_kwargs = {
        "forum": forum,
        "user": request.user,
        "ip": ip,
        "is_ip_banned": request.is_ip_banned,
        "request_data": request.META
    }

    if request.method == 'POST':
        form = AddPostForm(request.POST, request.FILES, **post_form_kwargs)
        if form.is_valid():
            all_valid = True
        else:
            all_valid = False

        poll_form = PollForm(request.POST)
        create_poll = poll_form.create_poll()
        if not create_poll:
            # All poll fields are empty: User didn't want to create a poll
            # Don't run validation and remove all form error messages
            poll_form = PollForm()  # create clean form without form errors
        elif not poll_form.is_valid():
            all_valid = False

        if all_valid:
            post = form.save()
            if create_poll:
                poll_form.save(post)
                messages.success(request, _("Topic with poll saved."))
            else:
                messages.success(request, _("Topic saved."))
            return HttpResponseRedirect(
                post.get_absolute_url() if full else post.get_mobile_url())
    else:
        form = AddPostForm(initial={
            'markup': request.user.forum_profile.markup,
            'subscribe': True,
        },
                           **post_form_kwargs)

    # if creating a new topic and allowed
    create_poll_form = forum_id and forum_settings.ALLOW_POLLS

    poll_form = PollForm()

    context = {
        'forum': forum,
        'create_poll_form': create_poll_form,
        'poll_form': poll_form,
        'form': form,
        'form_url': request.path,
        'back_url': forum.get_absolute_url(),
        'simple_user_agent': simple_user_agent(request),
    }
    return render(
        request, 'djangobb_forum/add_topic.html'
        if full else 'djangobb_forum/mobile/add_topic.html', context)
示例#11
0
def show_topic(request, topic_id, full=True):
    """
    * Display a topic
    * save a reply
    * save a poll vote
    """
    post_request = request.method == "POST"
    user_is_authenticated = request.user.is_authenticated()
    if post_request and (not user_is_authenticated or
                         not request.user.has_perm('userprofiles.is_social')):
        # Info: only user that are logged in should get forms in the page.
        return HttpResponseForbidden()

    topic = get_object_or_404(Topic.objects.select_related(), pk=topic_id)
    if not topic.forum.category.has_access(request.user):
        return HttpResponseForbidden()
    last_post = topic.last_post

    update_topic_on_view.delay(user_id=request.user.id,
                               topic_id=topic.id,
                               is_authenticated=user_is_authenticated)

    # without specifying, following query wouldn't select related properly
    posts = topic.posts.select_related(
        'user__userprofile', 'user__forum_profile', 'updated_by', 'user',
        'poststatus').prefetch_related('user__groups').all()
    edit_start = timezone.now() - timedelta(minutes=1)
    edit_end = timezone.now()
    editable = posts.filter(created__range=(edit_start, edit_end)).filter(
        user_id=request.user.id)
    can_edit = request.user.has_perm('djangobb_forum.change_post')
    try:
        page_url_parameter = int(request.GET.get('page') or 1)
    except:
        page_url_parameter = 1
    first_post_number = int(
        forum_settings.TOPIC_PAGE_SIZE) * (page_url_parameter - 1)
    can_close = can_close_topic(request.user, topic)

    moderator = request.user.is_superuser or request.user in topic.forum.moderators.all(
    )
    if user_is_authenticated and request.user in topic.subscribers.all():
        subscribed = True
    else:
        subscribed = False

    # reply form
    reply_form = None
    form_url = None
    back_url = None
    if user_is_authenticated and (not topic.closed or moderator):
        form_url = request.path + '?' + request.META[
            'QUERY_STRING'] + '#reply'  # if form validation failed: browser should scroll down to reply form ;)
        back_url = request.path
        ip = get_client_ip(request)
        post_form_kwargs = {
            "topic": topic,
            "user": request.user,
            "ip": ip,
            'is_ip_banned': request.is_ip_banned,
            "request_data": request.META,
            "url": "http://scratch.mit.edu%s" % back_url,
        }
        if post_request and AddPostForm.FORM_NAME in request.POST:

            reply_form = AddPostForm(request.POST, request.FILES,
                                     **post_form_kwargs)
            if reply_form.is_valid():
                post = reply_form.save()
                messages.success(request, _("Reply saved."))
                return HttpResponseRedirect(
                    post.get_absolute_url() if full else post.get_mobile_url())
        else:
            reply_form = AddPostForm(initial={
                'markup': request.user.forum_profile.markup,
                'subscribe': False,
            },
                                     **post_form_kwargs)

    group_titles = {}

    for post in posts:

        if post.user.is_superuser:
            group_titles[post.user] = "Scratch Team"

        else:
            temp_names = [group.name for group in post.user.groups.all()]
            if "Forum Moderators" in temp_names:
                group_titles[post.user] = "Forum Moderator"
            elif "Scratchers" in temp_names:
                group_titles[post.user] = "Scratcher"
            elif "New Scratchers" in temp_names:
                group_titles[post.user] = "New to Scratch"
            else:
                group_titles[post.user] = "Ungrouped"

    # handle poll, if exists
    poll_form = None
    polls = topic.poll_set.all()
    if not polls:
        poll = None
    else:
        poll = polls[0]
        if user_is_authenticated:  # Only logged in users can vote
            poll.auto_deactivate()
            has_voted = request.user in poll.users.all()
            if not post_request or not VotePollForm.FORM_NAME in request.POST:
                # It's not a POST request or: The reply form was send and not a poll vote
                if poll.active and not has_voted:
                    poll_form = VotePollForm(poll)
            else:
                if not poll.active:
                    messages.error(request, _("This poll is not active."))
                    return HttpResponseRedirect(topic.get_absolute_url())
                elif has_voted:
                    messages.error(request,
                                   _("You already voted on this poll."))
                    return HttpResponseRedirect(topic.get_absolute_url())

                poll_form = VotePollForm(poll, request.POST)
                if poll_form.is_valid():
                    ids = poll_form.cleaned_data["choice"]
                    queryset = poll.choices.filter(id__in=ids)
                    queryset.update(votes=F('votes') + 1)
                    poll.users.add(
                        request.user)  # save that this user has vote
                    messages.success(request, _("Vote saved."))
                    return HttpResponseRedirect(topic.get_absolute_url())

    highlight_word = request.GET.get('hl', '')
    if full:
        return render(
            request, 'djangobb_forum/topic.html', {
                'categories': Category.objects.all(),
                'topic': topic,
                'last_post': last_post,
                'form_url': form_url,
                'reply_form': reply_form,
                'back_url': back_url,
                'moderator': moderator,
                'subscribed': subscribed,
                'posts': posts,
                'first_post_number': first_post_number,
                'highlight_word': highlight_word,
                'poll': poll,
                'poll_form': poll_form,
                'editable': editable,
                'can_edit': can_edit,
                'can_close': can_close,
                'group_titles': group_titles,
                'simple_user_agent': simple_user_agent(request),
            })
    else:
        return render(
            request, 'djangobb_forum/mobile/topic.html', {
                'categories': Category.objects.all(),
                'topic': topic,
                'posts': posts,
                'poll': poll,
                'poll_form': poll_form,
                'reply_form': reply_form,
            })
示例#12
0
def add_topic(request, forum_id):
    """
    create a new topic, with or without poll
    """
    forum = get_object_or_404(Forum, pk=forum_id)
    if not forum.category.has_access(request.user):
        raise PermissionDenied

    ip = request.META.get('REMOTE_ADDR', None)

    contest = True if 'contest' in request.GET else False
    id = request.GET.get('id')
    if contest and id != '':
        try:
            ban = bans.Ban.objects.get(bid=request.GET.get('id'))
        except bans.Ban.DoesNotExist:
            ban = False
            messages.error(request, "No ban with this ID found.")
    else:
        ban = False
    post_form_kwargs = {
        "forum": forum,
        "user": request.user,
        "ip": ip,
        'contest': contest
    }

    poll_form = None
    if request.method == 'POST':
        form = AddPostForm(request.POST, request.FILES, **post_form_kwargs)
        if form.is_valid():
            all_valid = True
        else:
            all_valid = False

        if forum_settings.ENABLE_POLLS:
            poll_form = PollForm(request.POST)
            if not poll_form.has_data():
                # All poll fields are empty: User didn't want to create a poll
                # Don't run validation and remove all form error messages
                poll_form = PollForm()  # create clean form without form errors
            elif not poll_form.is_valid():
                all_valid = False

        if all_valid:
            post = form.save()
            if poll_form and poll_form.has_data():
                poll_form.save(post)
                messages.success(request, _("Topic with poll saved."))
            else:
                messages.success(request, _("Topic saved."))
            return HttpResponseRedirect(post.get_absolute_url())
    else:
        form = AddPostForm(initial={
            'contest':
            True if 'contest' in request.GET else False,
            'markup':
            request.user.forum_profile.markup,
            'subscribe':
            request.user.forum_profile.auto_subscribe,
        },
                           **post_form_kwargs)
        if forum_settings.ENABLE_POLLS and forum_id:  # Create a new topic
            poll_form = PollForm()

    context = {
        'contest': True if 'contest' in request.GET else False,
        'forum': forum,
        'create_poll_form': poll_form,
        'form': form,
        'form_url': request.path,
        'back_url': forum.get_absolute_url(),
        'ban': ban,
    }
    if contest:
        messages.warning(
            request,
            "Please complete the template below to submit your ban appeal to the forums.\n\
         Any alteration of the template will get your request denied and locked. You may attach your proof to the post \
        or link to Youtube for video proof. Links to other external sites will get your appeal denied and locked."
        )
    return render(request, 'djangobb_forum/add_topic.html', context)