##// END OF EJS Templates
Removed the image height hardcoded in the CSS. It is useless now because of...
Removed the image height hardcoded in the CSS. It is useless now because of the refmaps that move the focus on page loading. Fixed validation in the thread id.

File last commit:

r130:2cca92a8 default
r134:23ff671e default
Show More
views.py
261 lines | 7.5 KiB | text/x-python | PythonLexer
from django.core.urlresolvers import reverse
from django.template import RequestContext
from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponseRedirect
from boards import forms
import boards
from boards import utils
from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \
ThreadCaptchaForm, PostCaptchaForm
from boards.models import Post, Admin, Tag, Ban
from boards import authors
import neboard
def index(request, page=0):
context = _init_default_context(request)
if utils.need_include_captcha(request):
threadFormClass = ThreadCaptchaForm
kwargs = {'request': request}
else:
threadFormClass = ThreadForm
kwargs = {}
if request.method == 'POST':
form = threadFormClass(request.POST, request.FILES,
error_class=PlainErrorList, **kwargs)
if form.is_valid():
return _new_post(request, form)
else:
form = threadFormClass(error_class=PlainErrorList, **kwargs)
threads = Post.objects.get_threads(page=int(page))
context['threads'] = None if len(threads) == 0 else threads
context['form'] = form
context['pages'] = range(Post.objects.get_thread_page_count())
return render(request, 'boards/posting_general.html',
context)
def _new_post(request, form, thread_id=boards.models.NO_PARENT):
"""Add a new post (in thread or as a reply)."""
ip = _get_client_ip(request)
is_banned = Ban.objects.filter(ip=ip).count() > 0
if is_banned:
return redirect(you_are_banned)
data = form.cleaned_data
title = data['title']
text = data['text']
if 'image' in data.keys():
image = data['image']
else:
image = None
tags = []
new_thread = thread_id == boards.models.NO_PARENT
if new_thread:
tag_strings = data['tags']
if tag_strings:
tag_strings = tag_strings.split(' ')
for tag_name in tag_strings:
tag_name = tag_name.strip()
if len(tag_name) > 0:
tag, created = Tag.objects.get_or_create(name=tag_name)
tags.append(tag)
# TODO Add a possibility to define a link image instead of an image file.
# If a link is given, download the image automatically.
post = Post.objects.create_post(title=title, text=text, ip=ip,
parent_id=thread_id, image=image,
tags=tags)
thread_to_show = (post.id if new_thread else thread_id)
if new_thread:
return redirect(thread, post_id=thread_to_show)
else:
return redirect(reverse(thread,
kwargs={'post_id': thread_to_show}) + '#'
+ str(post.id))
def tag(request, tag_name, page=0):
"""Get all tag threads (posts without a parent)."""
tag = get_object_or_404(Tag, name=tag_name)
threads = Post.objects.get_threads(tag=tag, page=int(page))
if request.method == 'POST':
form = ThreadForm(request.POST, request.FILES,
error_class=PlainErrorList)
if form.is_valid():
return _new_post(request, form)
else:
form = forms.ThreadForm(initial={'tags': tag_name},
error_class=PlainErrorList)
context = _init_default_context(request)
context['threads'] = None if len(threads) == 0 else threads
context['tag'] = tag_name
context['pages'] = range(Post.objects.get_thread_page_count(tag=tag))
context['form'] = form
return render(request, 'boards/posting_general.html',
context)
def thread(request, post_id):
"""Get all thread posts"""
if utils.need_include_captcha(request):
postFormClass = PostCaptchaForm
kwargs = {'request': request}
else:
postFormClass = PostForm
kwargs = {}
if request.method == 'POST':
form = postFormClass(request.POST, request.FILES,
error_class=PlainErrorList, **kwargs)
if form.is_valid():
return _new_post(request, form, post_id)
else:
form = postFormClass(error_class=PlainErrorList, **kwargs)
posts = Post.objects.get_thread(post_id)
context = _init_default_context(request)
context['posts'] = posts
context['form'] = form
return render(request, 'boards/thread.html', context)
def login(request):
"""Log in as admin"""
if 'name' in request.POST and 'password' in request.POST:
request.session['admin'] = False
isAdmin = len(Admin.objects.filter(name=request.POST['name'],
password=request.POST[
'password'])) > 0
if isAdmin:
request.session['admin'] = True
response = HttpResponseRedirect('/')
else:
response = render(request, 'boards/login.html', {'error': 'Login error'})
else:
response = render(request, 'boards/login.html', {})
return response
def logout(request):
request.session['admin'] = False
return HttpResponseRedirect('/')
def settings(request):
"""User's settings"""
context = RequestContext(request)
if request.method == 'POST':
form = SettingsForm(request.POST)
if form.is_valid():
selected_theme = form.cleaned_data['theme']
request.session['theme'] = selected_theme
return redirect(settings)
else:
selected_theme = _get_theme(request)
form = SettingsForm(initial={'theme': selected_theme})
context['form'] = form
context['tags'] = Tag.objects.get_popular_tags()
context['theme'] = _get_theme(request)
return render(request, 'boards/settings.html', context)
def all_tags(request):
"""All tags list"""
context = _init_default_context(request)
context['all_tags'] = Tag.objects.get_not_empty_tags()
return render(request, 'boards/tags.html', context)
def jump_to_post(request, post_id):
"""Determine thread in which the requested post is and open it's page"""
post = get_object_or_404(Post, id=post_id)
if boards.models.NO_PARENT == post.parent:
return redirect(thread, post_id=post.id)
else:
parent_thread = get_object_or_404(Post, id=post.parent)
return redirect(reverse(thread, kwargs={'post_id': parent_thread.id})
+ '#' + str(post.id))
def authors(request):
context = _init_default_context(request)
context['authors'] = boards.authors.authors
return render(request, 'boards/authors.html', context)
def you_are_banned(request):
context = _init_default_context(request)
return render(request, 'boards/banned.html', context)
def page_404(request):
context = _init_default_context(request)
return render(request, 'boards/404.html', context)
def _get_theme(request):
"""Get user's CSS theme"""
return request.session.get('theme', neboard.settings.DEFAULT_THEME)
def _get_client_ip(request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[-1].strip()
else:
ip = request.META.get('REMOTE_ADDR')
return ip
def _init_default_context(request):
"""Create context with default values that are used in most views"""
context = RequestContext(request)
context['tags'] = Tag.objects.get_popular_tags()
context['theme'] = _get_theme(request)
return context