thread.py
121 lines
| 3.9 KiB
| text/x-python
|
PythonLexer
|
r542 | import string | ||
from django.core.urlresolvers import reverse | ||||
from django.db import transaction | ||||
from django.http import Http404 | ||||
from django.shortcuts import get_object_or_404, render, redirect | ||||
from boards import utils | ||||
from boards.forms import PostForm, PlainErrorList | ||||
from boards.models import Post, Ban, Tag | ||||
from boards.views.banned import BannedView | ||||
from boards.views.base import BaseBoardView, PARAMETER_FORM | ||||
from boards.views.posting_mixin import PostMixin | ||||
import neboard | ||||
MODE_GALLERY = 'gallery' | ||||
MODE_NORMAL = 'normal' | ||||
class ThreadView(BaseBoardView, PostMixin): | ||||
|
r544 | def get(self, request, post_id, mode=MODE_NORMAL, form=None): | ||
|
r542 | opening_post = get_object_or_404(Post, id=post_id) | ||
# If this is not OP, don't show it as it is | ||||
if not opening_post.is_opening(): | ||||
raise Http404 | ||||
|
r544 | if not form: | ||
form = PostForm(error_class=PlainErrorList) | ||||
|
r542 | |||
thread_to_show = opening_post.thread_new | ||||
context = self.get_context_data(request=request) | ||||
context[PARAMETER_FORM] = form | ||||
context["last_update"] = utils.datetime_to_epoch( | ||||
thread_to_show.last_edit_time) | ||||
context["thread"] = thread_to_show | ||||
if MODE_NORMAL == mode: | ||||
context['bumpable'] = thread_to_show.can_bump() | ||||
if context['bumpable']: | ||||
|
r569 | context['posts_left'] = neboard.settings.MAX_POSTS_PER_THREAD \ | ||
- thread_to_show.get_reply_count() | ||||
|
r542 | context['bumplimit_progress'] = str( | ||
float(context['posts_left']) / | ||||
neboard.settings.MAX_POSTS_PER_THREAD * 100) | ||||
|
r569 | context['opening_post'] = thread_to_show.get_opening_post() | ||
|
r542 | |||
document = 'boards/thread.html' | ||||
elif MODE_GALLERY == mode: | ||||
|
r569 | posts = thread_to_show.get_replies() | ||
|
r542 | context['posts'] = posts.filter(image_width__gt=0) | ||
document = 'boards/thread_gallery.html' | ||||
else: | ||||
raise Http404 | ||||
return render(request, document, context) | ||||
def post(self, request, post_id, mode=MODE_NORMAL): | ||||
opening_post = get_object_or_404(Post, id=post_id) | ||||
# If this is not OP, don't show it as it is | ||||
if not opening_post.is_opening(): | ||||
raise Http404 | ||||
if not opening_post.thread_new.archived: | ||||
form = PostForm(request.POST, request.FILES, | ||||
error_class=PlainErrorList) | ||||
form.session = request.session | ||||
if form.is_valid(): | ||||
return self.new_post(request, form, opening_post) | ||||
if form.need_to_ban: | ||||
# Ban user because he is suspected to be a bot | ||||
self._ban_current_user(request) | ||||
|
r544 | return self.get(request, post_id, mode, form) | ||
|
r542 | |||
@transaction.atomic | ||||
def new_post(self, request, form, opening_post=None, html_response=True): | ||||
"""Add a new post (in thread or as a reply).""" | ||||
ip = utils.get_client_ip(request) | ||||
is_banned = Ban.objects.filter(ip=ip).exists() | ||||
if is_banned: | ||||
if html_response: | ||||
return redirect(BannedView().as_view()) | ||||
else: | ||||
return | ||||
data = form.cleaned_data | ||||
title = data['title'] | ||||
text = data['text'] | ||||
text = self._remove_invalid_links(text) | ||||
if 'image' in data.keys(): | ||||
image = data['image'] | ||||
else: | ||||
image = None | ||||
tags = [] | ||||
post_thread = opening_post.thread_new | ||||
post = Post.objects.create_post(title=title, text=text, ip=ip, | ||||
thread=post_thread, image=image, | ||||
tags=tags, | ||||
user=self._get_user(request)) | ||||
thread_to_show = (opening_post.id if opening_post else post.id) | ||||
if html_response: | ||||
if opening_post: | ||||
|
r561 | return redirect(reverse( | ||
'thread', | ||||
kwargs={'post_id': thread_to_show}) + '#' + str(post.id)) | ||||