thread.py
135 lines
| 4.4 KiB
| text/x-python
|
PythonLexer
neko259
|
r2089 | import json | ||
neko259
|
r1014 | from django.core.exceptions import ObjectDoesNotExist | ||
neko259
|
r2089 | from django.http import Http404, HttpResponse | ||
neko259
|
r951 | from django.shortcuts import get_object_or_404, render, redirect | ||
neko259
|
r1986 | from django.urls import reverse | ||
neko259
|
r1422 | from django.utils.decorators import method_decorator | ||
from django.views.decorators.csrf import csrf_protect | ||||
neko259
|
r951 | from django.views.generic.edit import FormMixin | ||
neko259
|
r2088 | from boards.abstracts.settingsmanager import get_settings_manager, \ | ||
SETTING_SUBSCRIBE_BY_DEFAULT | ||||
neko259
|
r951 | from boards.forms import PostForm, PlainErrorList | ||
neko259
|
r1040 | from boards.models import Post | ||
neko259
|
r951 | from boards.views.base import BaseBoardView, CONTEXT_FORM | ||
neko259
|
r1366 | from boards.views.mixins import DispatcherMixin, PARAMETER_METHOD | ||
neko259
|
r951 | |||
neko259
|
r1366 | REQ_POST_ID = 'post_id' | ||
neko259
|
r1040 | |||
neko259
|
r951 | CONTEXT_LASTUPDATE = "last_update" | ||
CONTEXT_THREAD = 'thread' | ||||
neko259
|
r1180 | CONTEXT_MODE = 'mode' | ||
neko259
|
r1185 | CONTEXT_OP = 'opening_post' | ||
neko259
|
r1323 | CONTEXT_FAVORITE = 'is_favorite' | ||
neko259
|
r1399 | CONTEXT_RSS_URL = 'rss_url' | ||
neko259
|
r951 | |||
neko259
|
r1997 | class ThreadView(BaseBoardView, FormMixin, DispatcherMixin): | ||
neko259
|
r951 | |||
neko259
|
r1422 | @method_decorator(csrf_protect) | ||
neko259
|
r954 | def get(self, request, post_id, form: PostForm=None): | ||
neko259
|
r951 | try: | ||
neko259
|
r1013 | opening_post = Post.objects.get(id=post_id) | ||
neko259
|
r1014 | except ObjectDoesNotExist: | ||
neko259
|
r951 | raise Http404 | ||
neko259
|
r1323 | # If the tag is favorite, update the counter | ||
settings_manager = get_settings_manager(request) | ||||
favorite = settings_manager.thread_is_fav(opening_post) | ||||
if favorite: | ||||
settings_manager.add_or_read_fav_thread(opening_post) | ||||
neko259
|
r951 | # If this is not OP, don't show it as it is | ||
neko259
|
r1013 | if not opening_post.is_opening(): | ||
neko259
|
r1803 | return redirect('{}#{}'.format(opening_post.get_thread().get_opening_post() | ||
.get_absolute_url(), opening_post.id)) | ||||
neko259
|
r951 | |||
if not form: | ||||
neko259
|
r2088 | subscribe_by_default = settings_manager.get_setting( | ||
SETTING_SUBSCRIBE_BY_DEFAULT, False) | ||||
form = PostForm(error_class=PlainErrorList, | ||||
initial={'subscribe': subscribe_by_default}) | ||||
neko259
|
r951 | |||
thread_to_show = opening_post.get_thread() | ||||
params = dict() | ||||
params[CONTEXT_FORM] = form | ||||
neko259
|
r1086 | params[CONTEXT_LASTUPDATE] = str(thread_to_show.last_edit_time) | ||
neko259
|
r951 | params[CONTEXT_THREAD] = thread_to_show | ||
neko259
|
r1180 | params[CONTEXT_MODE] = self.get_mode() | ||
neko259
|
r1185 | params[CONTEXT_OP] = opening_post | ||
neko259
|
r1323 | params[CONTEXT_FAVORITE] = favorite | ||
neko259
|
r1399 | params[CONTEXT_RSS_URL] = self.get_rss_url(post_id) | ||
neko259
|
r951 | |||
params.update(self.get_data(thread_to_show)) | ||||
return render(request, self.get_template(), params) | ||||
neko259
|
r1422 | @method_decorator(csrf_protect) | ||
neko259
|
r951 | 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 | ||||
neko259
|
r1366 | if PARAMETER_METHOD in request.POST: | ||
neko259
|
r2089 | result = self.dispatch_method(request, opening_post) | ||
neko259
|
r1324 | |||
neko259
|
r2089 | ajax = 'ajax' in request.GET | ||
if ajax: | ||||
return HttpResponse(content=json.dumps(result)) | ||||
else: | ||||
return redirect('thread', post_id) # FIXME Different for different modes | ||||
neko259
|
r1324 | |||
neko259
|
r1414 | if not opening_post.get_thread().is_archived(): | ||
neko259
|
r951 | form = PostForm(request.POST, request.FILES, | ||
neko259
|
r2069 | error_class=PlainErrorList, | ||
session=request.session) | ||||
neko259
|
r951 | |||
if form.is_valid(): | ||||
neko259
|
r1997 | return Post.objects.create_from_form(request, form, opening_post) | ||
neko259
|
r951 | 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) | ||||
neko259
|
r1185 | def get_data(self, thread) -> dict: | ||
neko259
|
r951 | """ | ||
Returns context params for the view. | ||||
""" | ||||
neko259
|
r1185 | return dict() | ||
neko259
|
r951 | |||
neko259
|
r1185 | def get_template(self) -> str: | ||
neko259
|
r951 | """ | ||
Gets template to show the thread mode on. | ||||
""" | ||||
pass | ||||
neko259
|
r1180 | |||
neko259
|
r1185 | def get_mode(self) -> str: | ||
neko259
|
r1180 | pass | ||
neko259
|
r1323 | |||
def subscribe(self, request, opening_post): | ||||
settings_manager = get_settings_manager(request) | ||||
settings_manager.add_or_read_fav_thread(opening_post) | ||||
neko259
|
r2089 | return { | ||
'status': 'success', | ||||
'fav': 'true' | ||||
} | ||||
neko259
|
r1323 | def unsubscribe(self, request, opening_post): | ||
settings_manager = get_settings_manager(request) | ||||
settings_manager.del_fav_thread(opening_post) | ||||
neko259
|
r1366 | |||
neko259
|
r2089 | return { | ||
'status': 'success', | ||||
'fav': 'false' | ||||
} | ||||
neko259
|
r1399 | def get_rss_url(self, opening_id): | ||
neko259
|
r1400 | return reverse('thread', kwargs={'post_id': opening_id}) + 'rss/' | ||