all_threads.py
133 lines
| 3.8 KiB
| text/x-python
|
PythonLexer
neko259
|
r542 | import string | |
from django.core.urlresolvers import reverse | |||
from django.db import transaction | |||
from django.shortcuts import render, redirect | |||
from boards import utils | |||
neko259
|
r596 | from boards.abstracts.paginator import get_paginator | |
neko259
|
r542 | from boards.forms import ThreadForm, PlainErrorList | |
from boards.models import Post, Thread, 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 | |||
neko259
|
r634 | TAG_DELIMITER = ' ' | |
neko259
|
r542 | PARAMETER_CURRENT_PAGE = 'current_page' | |
PARAMETER_PAGINATOR = 'paginator' | |||
PARAMETER_THREADS = 'threads' | |||
TEMPLATE = 'boards/posting_general.html' | |||
DEFAULT_PAGE = 1 | |||
class AllThreadsView(PostMixin, BaseBoardView): | |||
neko259
|
r635 | user = None | |
neko259
|
r544 | def get(self, request, page=DEFAULT_PAGE, form=None): | |
neko259
|
r542 | context = self.get_context_data(request=request) | |
neko259
|
r635 | self.user = context['user'] | |
neko259
|
r544 | if not form: | |
form = ThreadForm(error_class=PlainErrorList) | |||
neko259
|
r542 | ||
neko259
|
r596 | paginator = get_paginator(self.get_threads(), | |
neboard.settings.THREADS_PER_PAGE) | |||
paginator.current_page = int(page) | |||
neko259
|
r542 | ||
threads = paginator.page(page).object_list | |||
context[PARAMETER_THREADS] = threads | |||
context[PARAMETER_FORM] = form | |||
self._get_page_context(paginator, context, page) | |||
return render(request, TEMPLATE, context) | |||
def post(self, request, page=DEFAULT_PAGE): | |||
form = ThreadForm(request.POST, request.FILES, | |||
error_class=PlainErrorList) | |||
form.session = request.session | |||
if form.is_valid(): | |||
neko259
|
r634 | return self.create_thread(request, form) | |
neko259
|
r542 | 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, page, form) | |
neko259
|
r542 | ||
@staticmethod | |||
def _get_page_context(paginator, context, page): | |||
""" | |||
Get pagination context variables | |||
""" | |||
context[PARAMETER_PAGINATOR] = paginator | |||
context[PARAMETER_CURRENT_PAGE] = paginator.page(int(page)) | |||
neko259
|
r634 | def parse_tags_string(self, tag_strings): | |
""" | |||
Parses tag list string and returns tag object list. | |||
""" | |||
tags = [] | |||
if tag_strings: | |||
tag_strings = tag_strings.split(TAG_DELIMITER) | |||
for tag_name in tag_strings: | |||
tag_name = string.lower(tag_name.strip()) | |||
if len(tag_name) > 0: | |||
tag, created = Tag.objects.get_or_create(name=tag_name) | |||
tags.append(tag) | |||
return tags | |||
neko259
|
r542 | @transaction.atomic | |
neko259
|
r634 | def create_thread(self, request, form, html_response=True): | |
neko259
|
r542 | """ | |
neko259
|
r634 | Creates a new thread with an opening post. | |
neko259
|
r542 | """ | |
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 | |||
tag_strings = data['tags'] | |||
neko259
|
r634 | tags = self.parse_tags_string(tag_strings) | |
neko259
|
r542 | ||
post = Post.objects.create_post(title=title, text=text, ip=ip, | |||
image=image, tags=tags, | |||
user=self._get_user(request)) | |||
if html_response: | |||
neko259
|
r634 | return redirect(post.get_url()) | |
neko259
|
r542 | ||
def get_threads(self): | |||
neko259
|
r634 | """ | |
Gets list of threads that will be shown on a page. | |||
""" | |||
neko259
|
r635 | return Thread.objects.filter(archived=False).order_by('-bump_time')\ | |
.exclude(tags__in=self.user.hidden_tags.all()) |