__init__.py
172 lines
| 4.5 KiB
| text/x-python
|
PythonLexer
neko259
|
r443 | __author__ = 'neko259' | ||
import hashlib | ||||
from django.core import serializers | ||||
from django.core.urlresolvers import reverse | ||||
neko259
|
r542 | from django.http import HttpResponseRedirect | ||
neko259
|
r443 | from django.http.response import HttpResponse | ||
from django.template import RequestContext | ||||
from django.shortcuts import render, redirect, get_object_or_404 | ||||
from django.utils import timezone | ||||
from django.db import transaction | ||||
from django.views.decorators.cache import cache_page | ||||
from django.views.i18n import javascript_catalog | ||||
import boards | ||||
neko259
|
r547 | from boards.forms import PlainErrorList | ||
neko259
|
r542 | from boards.models import Post, Tag, Ban, User | ||
neko259
|
r544 | from boards.models.post import SETTING_MODERATE | ||
neko259
|
r443 | from boards.models.user import RANK_USER | ||
from boards import authors | ||||
import neboard | ||||
neko259
|
r542 | |||
neko259
|
r443 | |||
BAN_REASON_SPAM = 'Autoban: spam bot' | ||||
neko259
|
r493 | DEFAULT_PAGE = 1 | ||
neko259
|
r443 | |||
neko259
|
r493 | |||
neko259
|
r443 | |||
@transaction.atomic | ||||
def tag_subscribe(request, tag_name): | ||||
"""Add tag to favorites""" | ||||
user = _get_user(request) | ||||
tag = get_object_or_404(Tag, name=tag_name) | ||||
if not tag in user.fav_tags.all(): | ||||
user.add_tag(tag) | ||||
return _redirect_to_next(request) | ||||
@transaction.atomic | ||||
def tag_unsubscribe(request, tag_name): | ||||
"""Remove tag from favorites""" | ||||
user = _get_user(request) | ||||
tag = get_object_or_404(Tag, name=tag_name) | ||||
if tag in user.fav_tags.all(): | ||||
user.remove_tag(tag) | ||||
return _redirect_to_next(request) | ||||
def static_page(request, name): | ||||
"""Show a static page that needs only tags list and a CSS""" | ||||
context = _init_default_context(request) | ||||
return render(request, 'boards/staticpages/' + name + '.html', context) | ||||
neko259
|
r546 | # TODO This has to be moved under the api module | ||
neko259
|
r443 | def api_get_post(request, post_id): | ||
""" | ||||
Get the JSON of a post. This can be | ||||
used as and API for external clients. | ||||
""" | ||||
post = get_object_or_404(Post, id=post_id) | ||||
json = serializers.serialize("json", [post], fields=( | ||||
"pub_time", "_text_rendered", "title", "text", "image", | ||||
"image_width", "image_height", "replies", "tags" | ||||
)) | ||||
return HttpResponse(content=json) | ||||
@cache_page(86400) | ||||
def cached_js_catalog(request, domain='djangojs', packages=None): | ||||
return javascript_catalog(request, domain, packages) | ||||
neko259
|
r542 | # TODO This method is deprecated and should be removed after switching to | ||
# class-based view | ||||
neko259
|
r443 | def _get_theme(request, user=None): | ||
"""Get user's CSS theme""" | ||||
if not user: | ||||
user = _get_user(request) | ||||
theme = user.get_setting('theme') | ||||
if not theme: | ||||
theme = neboard.settings.DEFAULT_THEME | ||||
return theme | ||||
neko259
|
r542 | # TODO This method is deprecated and should be removed after switching to | ||
# class-based view | ||||
neko259
|
r443 | def _init_default_context(request): | ||
"""Create context with default values that are used in most views""" | ||||
context = RequestContext(request) | ||||
user = _get_user(request) | ||||
context['user'] = user | ||||
context['tags'] = user.get_sorted_fav_tags() | ||||
context['posts_per_day'] = float(Post.objects.get_posts_per_day()) | ||||
theme = _get_theme(request, user) | ||||
context['theme'] = theme | ||||
context['theme_css'] = 'css/' + theme + '/base_page.css' | ||||
# This shows the moderator panel | ||||
moderate = user.get_setting(SETTING_MODERATE) | ||||
if moderate == 'True': | ||||
context['moderator'] = user.is_moderator() | ||||
else: | ||||
context['moderator'] = False | ||||
return context | ||||
neko259
|
r542 | # TODO This method is deprecated and should be removed after switching to | ||
# class-based view | ||||
neko259
|
r443 | def _get_user(request): | ||
""" | ||||
Get current user from the session. If the user does not exist, create | ||||
a new one. | ||||
""" | ||||
session = request.session | ||||
if not 'user_id' in session: | ||||
request.session.save() | ||||
md5 = hashlib.md5() | ||||
md5.update(session.session_key) | ||||
new_id = md5.hexdigest() | ||||
neko259
|
r485 | while User.objects.filter(user_id=new_id).exists(): | ||
md5.update(str(timezone.now())) | ||||
new_id = md5.hexdigest() | ||||
neko259
|
r443 | time_now = timezone.now() | ||
user = User.objects.create(user_id=new_id, rank=RANK_USER, | ||||
registration_time=time_now) | ||||
neko259
|
r542 | # TODO This is just a test. This method should be removed | ||
# _delete_old_users() | ||||
neko259
|
r486 | |||
neko259
|
r443 | session['user_id'] = user.id | ||
else: | ||||
user = User.objects.get(id=session['user_id']) | ||||
return user | ||||
def _redirect_to_next(request): | ||||
""" | ||||
If a 'next' parameter was specified, redirect to the next page. This is | ||||
used when the user is required to return to some page after the current | ||||
view has finished its work. | ||||
""" | ||||
if 'next' in request.GET: | ||||
next_page = request.GET['next'] | ||||
return HttpResponseRedirect(next_page) | ||||
else: | ||||
neko259
|
r546 | return redirect('index') | ||