From e8f277e379b6db085da8d0e9c1e720d80416cfd3 Mon Sep 17 00:00:00 2001 From: slav0nic Date: Wed, 21 Jan 2009 01:13:46 +0200 Subject: [PATCH] replace render_to; code refactoring --- apps/forum/util.py | 51 ++++++---- apps/forum/views.py | 229 +++++++++++++++++++------------------------- 2 files changed, 130 insertions(+), 150 deletions(-) diff --git a/apps/forum/util.py b/apps/forum/util.py index f3612df..135603b 100644 --- a/apps/forum/util.py +++ b/apps/forum/util.py @@ -15,28 +15,41 @@ from django.template.defaultfilters import urlize as django_urlize from apps.forum import settings as forum_settings -def render_to(template_path): - """ - Expect the dict from view. Render returned dict with - RequestContext. +def render_to(template): """ + Decorator for Django views that sends returned dict to render_to_response function + with given template and RequestContext as context instance. - def decorator(func): - def wrapper(request, *args, **kwargs): - output = func(request, *args, **kwargs) - if not isinstance(output, dict): - return output - kwargs = {'context_instance': RequestContext(request)} - if 'MIME_TYPE' in output: - kwargs['mimetype'] = output.pop('MIME_TYPE') - if 'TEMPLATE' in output: - template = output.pop('TEMPLATE') - else: - template = template_path - return render_to_response(template, output, **kwargs) + If view doesn't return dict then decorator simply returns output. + Additionally view can return two-tuple, which must contain dict as first + element and string with template name as second. This string will + override template name, given as parameter + + Parameters: + + - template: template name to use + + Examples:: + + @render_to('some/tmpl.html') + def view(request): + if smth: + return {'context': 'dict'} + else: + return {'context': 'dict'}, 'other/tmpl.html' + + 2006-2009 Alexander Solovyov, new BSD License + """ + def renderer(func): + def wrapper(request, *args, **kw): + output = func(request, *args, **kw) + if isinstance(output, (list, tuple)): + return render_to_response(output[1], output[0], RequestContext(request)) + elif isinstance(output, dict): + return render_to_response(template, output, RequestContext(request)) + return output return wrapper - - return decorator + return renderer def absolute_url(path): return 'http://%s%s' % (forum_settings.HOST, path) diff --git a/apps/forum/views.py b/apps/forum/views.py index 502c0fc..9446f82 100644 --- a/apps/forum/views.py +++ b/apps/forum/views.py @@ -2,8 +2,7 @@ import math import re import datetime -from django.shortcuts import get_object_or_404, render_to_response -from django.template import RequestContext +from django.shortcuts import get_object_or_404 from django.http import Http404, HttpResponse, HttpResponseRedirect from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required @@ -48,7 +47,7 @@ def index(request): 'online_count': len(users_online), 'guest_count': guest_count, 'last_user': User.objects.order_by('-date_joined')[0], - } + } @render_to('forum/moderate.html') @paged('topics', forum_settings.FORUM_PAGE_SIZE) @@ -63,12 +62,12 @@ def moderate(request, forum_id): if topic_match: topic_id = topic_match.group(1) reverse('move_topic', args=[topic_id]) - + return HttpResponseRedirect(reverse('index')) elif 'delete_topics' in request.POST: for topic in request.POST: topic_match = re.match('topic_id\[(\d+)\]', reputation) - + if topic_match: topic_id = topic_match.group(1) topic = get_object_or_404(Topic, pk=topic_id) @@ -78,22 +77,22 @@ def moderate(request, forum_id): elif 'open_topics' in request.POST: for topic in request.POST: topic_match = re.match('topic_id\[(\d+)\]', topic) - + if topic_match: topic_id = topic_match.group(1) open_topic(request, topic_id) - + return HttpResponseRedirect(reverse('index')) elif 'close_topics' in request.POST: for topic in request.POST: topic_match = re.match('topic_id\[(\d+)\]', topic) - + if topic_match: topic_id = topic_match.group(1) close_topic(request, topic_id) return HttpResponseRedirect(reverse('index')) - + return {'forum': forum, 'topics': topics, 'sticky_topics': forum.topics.filter(sticky=True), @@ -103,62 +102,46 @@ def moderate(request, forum_id): else: raise Http404 +@render_to('forum/search_topics.html') def search(request): if 'action' in request.GET: - if 'show_24h' in request.GET['action']: + action = request.GET['action'] + if action == 'show_24h': date = datetime.datetime.today() - datetime.timedelta(1) topics = Topic.objects.filter(created__gte=date).order_by('created') - return render_to_response('forum/search_topics.html', - {'topics': topics, - }, RequestContext(request)) - elif 'show_new' in request.GET['action']: + elif action == 'show_new': topics = Topic.objects.all().order_by('created') topics = [topic for topic in topics if forum_extras.has_unreads(topic, request.user)] - return render_to_response('forum/search_topics.html', - {'topics': topics, - }, RequestContext(request)) - elif 'show_unanswered' in request.GET['action']: + elif action == 'show_unanswered': topics = Topic.objects.filter(post_count=1) - return render_to_response('forum/search_topics.html', - {'topics': topics, - }, RequestContext(request)) - elif 'show_subscriptions' in request.GET['action']: + elif action == 'show_subscriptions': topics = Topic.objects.filter(subscribers=request.user) - return render_to_response('forum/search_topics.html', - {'topics': topics, - }, RequestContext(request)) - elif 'show_user' in request.GET['action']: + elif action == 'show_user': user_id = request.GET['user_id'] posts = Post.objects.filter(user__id=user_id) topics = [post.topic for post in posts] - return render_to_response('forum/search_topics.html', - {'topics': topics, - }, RequestContext(request)) - elif 'search' in request.GET['action']: + elif action == 'search': posts = Post.objects.all() form = PostSearchForm(request.GET) posts = form.filter(posts) topics = [post.topic for post in posts] - if 'topics' in request.GET['show_as']: - return render_to_response('forum/search_topics.html', - {'topics': topics, - }, RequestContext(request)) + if action == 'topics': + return {'topics': topics} elif 'posts' in request.GET['show_as']: - return render_to_response('forum/search_posts.html', - {'posts': posts, - }, RequestContext(request)) - else: + return {'posts': posts}, 'forum/search_posts.html' + return {'topics': topics} + else: form = PostSearchForm() + return {'categories': Category.objects.all(), + 'form': form, + }, 'forum/search_form.html' - return render_to_response('forum/search_form.html', - {'categories': Category.objects.all(), - 'form': form, - }, RequestContext(request)) - @login_required +@render_to('forum/report.html') def misc(request): if 'action' in request.GET: - if 'markread' in request.GET['action']: + action = request.GET['action'] + if action =='markread': for category in Category.objects.all(): for topic in category.topics: read, new = Read.objects.get_or_create(user=request.user, topic=topic) @@ -167,17 +150,15 @@ def misc(request): read.save() return HttpResponseRedirect(reverse('index')) - elif 'report' in request.GET['action']: - if request.GET['post_id']: + elif action == 'report': + if request.GET.get('post_id', ''): post_id = request.GET['post_id'] post = get_object_or_404(Post, id=post_id) form = build_form(ReportForm, request, reported_by=request.user, post=post_id) - if request.POST and form.is_valid(): + if request.method == 'POST' and form.is_valid(): form.save() return HttpResponseRedirect(post.get_absolute_url()) - return render_to_response('forum/report.html', - {'form':form, - }, RequestContext(request)) + return {'form':form} elif 'submit' in request.POST and 'mail_to' in request.GET: form = MailToForm(request.POST) @@ -191,10 +172,9 @@ def misc(request): elif 'mail_to' in request.GET: user = get_object_or_404(User, username=request.GET['mail_to']) form = MailToForm() - return render_to_response('forum/mail_to.html', - {'form':form, - 'user': user, - }, RequestContext(request)) + return {'form':form, + 'user': user, + }, 'forum/mail_to.html' @render_to('forum/forum.html') @paged('topics', forum_settings.FORUM_PAGE_SIZE) @@ -292,7 +272,7 @@ def add_post(request, forum_id, topic_id): 'forum': forum, } - +@render_to('forum/user.html') def user(request, username): user = get_object_or_404(User, username=username) if request.user.is_authenticated() and user == request.user or request.user.is_superuser: @@ -307,73 +287,68 @@ def user(request, username): # #'form': form, # 'reports': reports, # }, RequestContext(request)) - if 'privacy' in request.GET['section']: + section = request.GET['section'] + if section == 'privacy': form = build_form(PrivacyProfileForm, request, instance=user.forum_profile) - if request.POST and form.is_valid(): + if request.method == 'POST' and form.is_valid(): form.save() - return render_to_response('forum/profile/profile_privacy.html', - {'active_menu':'privacy', - 'profile': user, - 'form': form, - }, RequestContext(request)) - elif 'display' in request.GET['section']: + return {'active_menu':'privacy', + 'profile': user, + 'form': form, + }, 'forum/profile/profile_privacy.html' + elif section == 'display': form = build_form(DisplayProfileForm, request, instance=user.forum_profile) - if request.POST and form.is_valid(): + if request.method == 'POST' and form.is_valid(): form.save() - return render_to_response('forum/profile/profile_display.html', - {'active_menu':'display', - 'profile': user, - 'form': form, - }, RequestContext(request)) - elif 'personality' in request.GET['section']: + return {'active_menu':'display', + 'profile': user, + 'form': form, + }, 'forum/profile/profile_display.html' + elif section == 'personality': form = build_form(PersonalityProfileForm, request, instance=user.forum_profile) - if request.POST and form.is_valid(): + if request.method == 'POST' and form.is_valid(): form.save() - return render_to_response('forum/profile/profile_personality.html', - {'active_menu':'personality', - 'profile': user, - 'form': form, - }, RequestContext(request)) - elif 'messaging' in request.GET['section']: + return {'active_menu':'personality', + 'profile': user, + 'form': form, + }, 'forum/profile/profile_personality.html' + elif section == 'messaging': form = build_form(MessagingProfileForm, request, instance=user.forum_profile) - if request.POST and form.is_valid(): + if request.method == 'POST' and form.is_valid(): form.save() - return render_to_response('forum/profile/profile_messaging.html', - {'active_menu':'messaging', - 'profile': user, - 'form': form, - }, RequestContext(request)) - elif 'personal' in request.GET['section']: + return {'active_menu':'messaging', + 'profile': user, + 'form': form, + }, 'forum/profile/profile_messaging.html' + elif section == 'personal': form = build_form(PersonalProfileForm, request, instance=user.forum_profile, user=user) - if request.POST and form.is_valid(): + if request.method == 'POST' and form.is_valid(): form.save() - return render_to_response('forum/profile/profile_personal.html', - {'active_menu':'personal', - 'profile': user, - 'form': form, - }, RequestContext(request)) - elif 'essentials' in request.GET['section']: + return {'active_menu':'personal', + 'profile': user, + 'form': form, + }, 'forum/profile/profile_personal.html' + elif section == 'essentials': form = build_form(EssentialsProfileForm, request, instance=user.forum_profile, user=user) - if request.POST and form.is_valid(): + if request.method == 'POST' and form.is_valid(): form.save() - return render_to_response('forum/profile/profile_essentials.html', - {'active_menu':'essentials', - 'profile': user, - 'form': form, - }, RequestContext(request)) + return {'active_menu':'essentials', + 'profile': user, + 'form': form, + }, 'forum/profile/profile_essentials.html' elif 'action' in request.GET: - if 'upload_avatar' in request.GET['action']: + action = request.GET['action'] + if action == 'upload_avatar': form = build_form(UploadAvatarForm, request, instance=user.forum_profile) - if request.POST and form.is_valid(): + if request.method == 'POST' and form.is_valid(): form.save() return HttpResponseRedirect(reverse('forum_profile', args=[user.username])) - return render_to_response('forum/upload_avatar.html', - {'form': form, - 'avatar_width': forum_settings.FORUM_AVATAR_WIDTH, - 'avatar_height': forum_settings.FORUM_AVATAR_HEIGHT, - }, RequestContext(request)) - elif 'delete_avatar' in request.GET['action']: + return {'form': form, + 'avatar_width': forum_settings.FORUM_AVATAR_WIDTH, + 'avatar_height': forum_settings.FORUM_AVATAR_HEIGHT, + }, 'forum/upload_avatar.html' + elif action == 'delete_avatar': profile = get_object_or_404(Profile, user=request.user) profile.avatar = None profile.save() @@ -381,23 +356,21 @@ def user(request, username): else: form = build_form(EssentialsProfileForm, request, instance=user.forum_profile, user=user) - if request.POST and form.is_valid(): + if request.method == 'POST' and form.is_valid(): form.save() - return render_to_response('forum/profile/profile_essentials.html', - {'active_menu':'essentials', - 'profile': user, - 'form': form, - }, RequestContext(request)) + return {'active_menu':'essentials', + 'profile': user, + 'form': form, + }, 'forum/profile/profile_essentials.html' else: topic_count = Topic.objects.filter(user=user).count() - return render_to_response('forum/user.html', - {'profile': user, - 'topic_count': topic_count, - 'reports': reports, - }, RequestContext(request)) + return {'profile': user, + 'topic_count': topic_count, + 'reports': reports, + } - +@render_to('forum/reputation.html') def reputation(request, username): user = get_object_or_404(User, username=username) form = build_form(ReputationForm, request, from_user=request.user, to_user=user) @@ -412,13 +385,11 @@ def reputation(request, username): elif request.GET['action'] == 'minus': form.fields['sign'].initial = -1 - return render_to_response('forum/reputation_form.html', - {'form': form, - }, RequestContext(request)) + return {'form': form}, 'forum/reputation_form.html' else: raise Http404 - - elif request.POST: + + elif request.method == 'POST': if 'del_reputation' in request.POST: for reputation in request.POST: reputation_match = re.match('reputation_id\[(\d+)\]', reputation) @@ -436,15 +407,13 @@ def reputation(request, username): return HttpResponseRedirect(topic.get_absolute_url()) else: raise Http404 - + else: reputations = Reputation.objects.filter(to_user=user).order_by('-time').select_related() - return render_to_response('forum/reputation.html', - {'reputations': reputations, + return {'reputations': reputations, 'profile': user.forum_profile, - }, RequestContext(request)) - + } def show_post(request, post_id): post = get_object_or_404(Post, pk=post_id) @@ -452,7 +421,7 @@ def show_post(request, post_id): page = math.ceil(count / float(forum_settings.TOPIC_PAGE_SIZE)) url = '%s?page=%d#post-%d' % (reverse('topic', args=[post.topic.id]), page, post.id) return HttpResponseRedirect(url) - + @login_required @render_to('forum/edit_post.html') def edit_post(request, post_id): @@ -480,7 +449,7 @@ def delete_posts(request, topic_id): topic = Topic.objects.select_related().get(pk=topic_id) topic.views += 1 topic.save() - + if forum_moderated_by(topic, request.user): deleted = False for post in request.POST: @@ -686,7 +655,6 @@ def show_pm(request, pm_id): 'post_user': post_user, } - @login_required def delete_subscription(request, topic_id): topic = get_object_or_404(Topic, pk=topic_id) @@ -696,7 +664,6 @@ def delete_subscription(request, topic_id): else: return HttpResponseRedirect(reverse('edit_profile')) - @login_required def add_subscription(request, topic_id): topic = get_object_or_404(Topic, pk=topic_id)