thread.py
144 lines
| 4.6 KiB
| text/x-python
|
PythonLexer
neko259
|
r542 | 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 | ||||
neko259
|
r633 | from django.views.generic.edit import FormMixin | ||
neko259
|
r690 | |||
neko259
|
r716 | from boards import utils, settings | ||
neko259
|
r542 | from boards.forms import PostForm, PlainErrorList | ||
neko259
|
r690 | from boards.models import Post, Ban | ||
neko259
|
r542 | from boards.views.banned import BannedView | ||
neko259
|
r722 | from boards.views.base import BaseBoardView, CONTEXT_FORM | ||
neko259
|
r542 | from boards.views.posting_mixin import PostMixin | ||
neko259
|
r722 | TEMPLATE_GALLERY = 'boards/thread_gallery.html' | ||
TEMPLATE_NORMAL = 'boards/thread.html' | ||||
CONTEXT_POSTS = 'posts' | ||||
CONTEXT_OP = 'opening_post' | ||||
CONTEXT_BUMPLIMIT_PRG = 'bumplimit_progress' | ||||
CONTEXT_POSTS_LEFT = 'posts_left' | ||||
CONTEXT_LASTUPDATE = "last_update" | ||||
CONTEXT_MAX_REPLIES = 'max_replies' | ||||
CONTEXT_THREAD = 'thread' | ||||
CONTEXT_BUMPABLE = 'bumpable' | ||||
FORM_TITLE = 'title' | ||||
FORM_TEXT = 'text' | ||||
FORM_IMAGE = 'image' | ||||
neko259
|
r690 | |||
neko259
|
r542 | MODE_GALLERY = 'gallery' | ||
MODE_NORMAL = 'normal' | ||||
neko259
|
r633 | |||
class ThreadView(BaseBoardView, PostMixin, FormMixin): | ||||
neko259
|
r542 | |||
neko259
|
r544 | def get(self, request, post_id, mode=MODE_NORMAL, form=None): | ||
neko259
|
r689 | try: | ||
opening_post = Post.objects.filter(id=post_id).only('thread_new')[0] | ||||
except IndexError: | ||||
raise Http404 | ||||
neko259
|
r542 | |||
# If this is not OP, don't show it as it is | ||||
neko259
|
r659 | if not opening_post or not opening_post.is_opening(): | ||
neko259
|
r542 | raise Http404 | ||
neko259
|
r544 | if not form: | ||
form = PostForm(error_class=PlainErrorList) | ||||
neko259
|
r542 | |||
neko259
|
r617 | thread_to_show = opening_post.get_thread() | ||
neko259
|
r542 | |||
context = self.get_context_data(request=request) | ||||
neko259
|
r722 | context[CONTEXT_FORM] = form | ||
context[CONTEXT_LASTUPDATE] = utils.datetime_to_epoch( | ||||
neko259
|
r542 | thread_to_show.last_edit_time) | ||
neko259
|
r722 | context[CONTEXT_THREAD] = thread_to_show | ||
context[CONTEXT_MAX_REPLIES] = settings.MAX_POSTS_PER_THREAD | ||||
neko259
|
r542 | |||
if MODE_NORMAL == mode: | ||||
neko259
|
r722 | bumpable = thread_to_show.can_bump() | ||
context[CONTEXT_BUMPABLE] = bumpable | ||||
if bumpable: | ||||
left_posts = settings.MAX_POSTS_PER_THREAD \ | ||||
- thread_to_show.get_reply_count() | ||||
context[CONTEXT_POSTS_LEFT] = left_posts | ||||
context[CONTEXT_BUMPLIMIT_PRG] = str( | ||||
float(left_posts) / settings.MAX_POSTS_PER_THREAD * 100) | ||||
neko259
|
r542 | |||
neko259
|
r722 | context[CONTEXT_OP] = opening_post | ||
neko259
|
r542 | |||
neko259
|
r722 | document = TEMPLATE_NORMAL | ||
neko259
|
r542 | elif MODE_GALLERY == mode: | ||
neko259
|
r722 | context[CONTEXT_POSTS] = thread_to_show.get_replies_with_images( | ||
neko259
|
r693 | view_fields_only=True) | ||
neko259
|
r542 | |||
neko259
|
r722 | document = TEMPLATE_GALLERY | ||
neko259
|
r542 | 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 | ||||
neko259
|
r617 | if not opening_post.get_thread().archived: | ||
neko259
|
r542 | 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) | ||||
neko259
|
r544 | return self.get(request, post_id, mode, form) | ||
neko259
|
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: | ||||
neko259
|
r640 | return None | ||
neko259
|
r542 | |||
data = form.cleaned_data | ||||
neko259
|
r722 | title = data[FORM_TITLE] | ||
text = data[FORM_TEXT] | ||||
neko259
|
r542 | |||
text = self._remove_invalid_links(text) | ||||
neko259
|
r722 | if FORM_IMAGE in data.keys(): | ||
image = data[FORM_IMAGE] | ||||
neko259
|
r542 | else: | ||
image = None | ||||
tags = [] | ||||
neko259
|
r617 | post_thread = opening_post.get_thread() | ||
neko259
|
r542 | |||
post = Post.objects.create_post(title=title, text=text, ip=ip, | ||||
thread=post_thread, image=image, | ||||
tags=tags, | ||||
neko259
|
r690 | user=utils.get_user(request)) | ||
neko259
|
r542 | |||
thread_to_show = (opening_post.id if opening_post else post.id) | ||||
if html_response: | ||||
if opening_post: | ||||
neko259
|
r722 | return redirect( | ||
reverse('thread', kwargs={'post_id': thread_to_show}) | ||||
+ '#' + str(post.id)) | ||||
neko259
|
r638 | else: | ||
neko259
|
r640 | return post | ||