thread.py
131 lines
| 3.9 KiB
| text/x-python
|
PythonLexer
|
r1014 | from django.core.exceptions import ObjectDoesNotExist | ||
|
r951 | from django.http import Http404 | ||
from django.shortcuts import get_object_or_404, render, redirect | ||||
from django.views.generic.edit import FormMixin | ||||
|
r1086 | from django.utils import timezone | ||
from django.utils.dateformat import format | ||||
|
r951 | |||
from boards import utils, settings | ||||
from boards.forms import PostForm, PlainErrorList | ||||
|
r1040 | from boards.models import Post | ||
|
r951 | from boards.views.base import BaseBoardView, CONTEXT_FORM | ||
from boards.views.posting_mixin import PostMixin | ||||
|
r1086 | |||
|
r951 | import neboard | ||
|
r1040 | |||
|
r951 | CONTEXT_LASTUPDATE = "last_update" | ||
CONTEXT_THREAD = 'thread' | ||||
CONTEXT_WS_TOKEN = 'ws_token' | ||||
CONTEXT_WS_PROJECT = 'ws_project' | ||||
CONTEXT_WS_HOST = 'ws_host' | ||||
CONTEXT_WS_PORT = 'ws_port' | ||||
|
r1086 | CONTEXT_WS_TIME = 'ws_token_time' | ||
|
r951 | |||
FORM_TITLE = 'title' | ||||
FORM_TEXT = 'text' | ||||
FORM_IMAGE = 'image' | ||||
|
r1077 | FORM_THREADS = 'threads' | ||
|
r951 | |||
class ThreadView(BaseBoardView, PostMixin, FormMixin): | ||||
|
r954 | def get(self, request, post_id, form: PostForm=None): | ||
|
r951 | try: | ||
|
r1013 | opening_post = Post.objects.get(id=post_id) | ||
|
r1014 | except ObjectDoesNotExist: | ||
|
r951 | raise Http404 | ||
# If this is not OP, don't show it as it is | ||||
|
r1013 | if not opening_post.is_opening(): | ||
|
r1160 | return redirect(opening_post.get_thread().get_opening_post() | ||
.get_absolute_url()) | ||||
|
r951 | |||
if not form: | ||||
form = PostForm(error_class=PlainErrorList) | ||||
thread_to_show = opening_post.get_thread() | ||||
params = dict() | ||||
params[CONTEXT_FORM] = form | ||||
|
r1086 | params[CONTEXT_LASTUPDATE] = str(thread_to_show.last_edit_time) | ||
|
r951 | params[CONTEXT_THREAD] = thread_to_show | ||
|
r1153 | if settings.get_bool('External', 'WebsocketsEnabled'): | ||
|
r1086 | token_time = format(timezone.now(), u'U') | ||
params[CONTEXT_WS_TIME] = token_time | ||||
|
r951 | params[CONTEXT_WS_TOKEN] = utils.get_websocket_token( | ||
|
r1086 | timestamp=token_time) | ||
|
r951 | params[CONTEXT_WS_PROJECT] = neboard.settings.CENTRIFUGE_PROJECT_ID | ||
params[CONTEXT_WS_HOST] = request.get_host().split(':')[0] | ||||
params[CONTEXT_WS_PORT] = neboard.settings.CENTRIFUGE_PORT | ||||
params.update(self.get_data(thread_to_show)) | ||||
return render(request, self.get_template(), params) | ||||
def post(self, request, post_id): | ||||
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.get_thread().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) | ||||
return self.get(request, post_id, form) | ||||
|
r954 | def new_post(self, request, form: PostForm, opening_post: Post=None, | ||
html_response=True): | ||||
|
r951 | """ | ||
Adds a new post (in thread or as a reply). | ||||
""" | ||||
ip = utils.get_client_ip(request) | ||||
data = form.cleaned_data | ||||
title = data[FORM_TITLE] | ||||
text = data[FORM_TEXT] | ||||
|
r954 | image = form.get_image() | ||
|
r1077 | threads = data[FORM_THREADS] | ||
|
r951 | |||
text = self._remove_invalid_links(text) | ||||
post_thread = opening_post.get_thread() | ||||
post = Post.objects.create_post(title=title, text=text, image=image, | ||||
|
r1091 | thread=post_thread, ip=ip, | ||
threads=threads) | ||||
post.notify_clients() | ||||
|
r951 | |||
if html_response: | ||||
if opening_post: | ||||
|
r1160 | return redirect(post.get_absolute_url()) | ||
|
r951 | else: | ||
return post | ||||
def get_data(self, thread): | ||||
""" | ||||
Returns context params for the view. | ||||
""" | ||||
pass | ||||
def get_template(self): | ||||
""" | ||||
Gets template to show the thread mode on. | ||||
""" | ||||
pass | ||||