from django.core.urlresolvers import reverse from django.template import RequestContext from boards import forms import boards from boards.forms import ThreadForm, PostForm, SettingsForm from boards.models import Post, Admin, Tag from django.shortcuts import render, get_list_or_404, redirect from django.http import HttpResponseRedirect, Http404 import neboard def index(request, page=0): context = RequestContext(request) if request.method == 'POST': return new_post(request) else: threads = Post.objects.get_threads(page=int(page)) # TODO Get rid of the duplicate code in index and tag views context['threads'] = None if len(threads) == 0 else threads context['form'] = forms.ThreadForm() context['tags'] = Tag.objects.get_popular_tags() context['theme'] = _get_theme(request) context['pages'] = range(Post.objects.get_thread_page_count()) return render(request, 'posting_general.html', context) def new_post(request, thread_id=boards.models.NO_PARENT): """Add a new post (in thread or as a reply).""" if thread_id == boards.models.NO_PARENT: form = ThreadForm(request.POST, request.FILES) else: form = PostForm(request.POST, request.FILES) if form.is_valid(): data = form.cleaned_data else: return redirect(index) title = data['title'] text = data['text'] if 'image' in data.keys(): image = data['image'] else: image = None ip = request.META['REMOTE_ADDR'] 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 = Tag.objects.get(name=tag_name) threads = Post.objects.get_threads(tag=tag, page=int(page)) if request.method == 'POST': return new_post(request) else: context = RequestContext(request) context['threads'] = None if len(threads) == 0 else threads context['tag'] = tag_name context['tags'] = Tag.objects.get_popular_tags() context['theme'] = _get_theme(request) context['pages'] = range(Post.objects.get_thread_page_count(tag=tag)) context['form'] = forms.ThreadForm(initial={'tags': tag_name}) return render(request, 'posting_general.html', context) def thread(request, post_id): """Get all thread posts""" if request.method == 'POST': return new_post(request, post_id) else: # TODO Show 404 if there is no such thread posts = Post.objects.get_thread(post_id) context = RequestContext(request) context['posts'] = posts context['form'] = forms.PostForm() context['tags'] = Tag.objects.get_popular_tags() context['theme'] = _get_theme(request) return render(request, '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, 'login.html', {'error': 'Login error'}) else: response = render(request, 'login.html', {}) return response def logout(request): request.session['admin'] = False return HttpResponseRedirect('/') def settings(request): 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, 'settings.html', context) def all_tags(request): context = RequestContext(request) context['tags'] = Tag.objects.get_popular_tags() context['theme'] = _get_theme(request) context['all_tags'] = Tag.objects.get_not_empty_tags() return render(request, 'tags.html', context) def _get_theme(request): return request.session.get('theme', neboard.settings.DEFAULT_THEME)