X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=influences%2Fviews.py;h=2dbd5c990ec692fa3ccf99b454f74fbab3d32492;hb=ff1befea16180a016a807b975fb4bee0bc53d662;hp=ba8e280aaa0a2bf177fe4af2e062d17e65f98d5a;hpb=d031025352fb6c00f0db767405dcf2f39f976cd8;p=matthijs%2Fprojects%2Fxerxes.git diff --git a/influences/views.py b/influences/views.py index ba8e280..2dbd5c9 100644 --- a/influences/views.py +++ b/influences/views.py @@ -7,9 +7,11 @@ from django.contrib.auth.models import User from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect, HttpResponseForbidden from django.views.generic.list_detail import object_detail, object_list -from ee.influences.models import Character -from ee.influences.models import Influence -from ee.tools.forms import ContextModelForm +from threadedcomments.models import ThreadedComment +from threadedcomments.forms import ThreadedCommentForm +from xerxes.influences.models import Character +from xerxes.influences.models import Influence +from xerxes.tools.forms import ContextModelForm @@ -24,33 +26,36 @@ class CharacterForm(ContextModelForm): fields = ('name') @login_required -def add(request, character_id=None): +def add_influence(request, character_id=None): initial = {} # Get the current user's characters chars = request.user.character_set.all() + # If a character_id was specified in the url, or there is only one + # character, preselect it. if (character_id): initial['character'] = character_id elif (chars.count() == 1): initial['character'] = chars[0].id + f = InfluenceForm(request=request, initial=initial) - if (f.is_valid()): - influence = f.save(commit=False) - if (influence.character.player == request.user): - influence.save() - return HttpResponseRedirect(reverse('influences_influence_detail', args=[influence.id])) - else: - # TODO: Make this a bit more pretty. Perhaps throw an exception here and add some middleware to catch it? - return HttpResponseForbidden("Forbidden -- Trying to submit influence for somebody else's character") - - # Only allow characters of the current user + + # Only allow characters of the current user. Putting this here also + # ensures that a form will not validate when any other choice was + # selected (perhaps through URL crafting). f.fields['character']._set_queryset(chars) - return render_to_response('influences/add.html', {'form' : f}, RequestContext(request)) + if (f.is_valid()): + # The form was submitted, let's save it. + influence = f.save() + # Redirect to the just saved influence + return HttpResponseRedirect(reverse('influences_influence_detail', args=[influence.id])) + + return render_to_response('influences/add_influence.html', {'form' : f}, RequestContext(request)) @login_required -def addCharacter(request): +def add_character(request): f = CharacterForm(request=request) if (f.is_valid()): character = f.save(commit=False) @@ -62,23 +67,57 @@ def addCharacter(request): @login_required def index(request): + # Only show this player's characters and influences characters = request.user.character_set.all() - influences = Influence.objects.filter(character__in=characters) + influences = Influence.objects.filter(character__player=request.user) return render_to_response('influences/index.html', {'characters' : characters, 'influences' : influences}, RequestContext(request)) +# +# The views below are very similar to django's generic views (in fact, +# they used to be generic views before). However, since they all depend +# on the currently logged in user (for limiting the show list or +# performing access control), we won't actually use the generic views +# here. + @login_required def character_list(request): + # Only show this player's characters os = request.user.character_set.all() return render_to_response('influences/character_list.html', {'object_list' : os}, RequestContext(request)) @login_required def character_detail(request, object_id): o = Character.objects.get(pk=object_id) + # Don't show other player's characters + if (o.player != request.user): + return HttpResponseForbidden("Forbidden -- Trying to view somebody else's character") return render_to_response('influences/character_detail.html', {'object' : o}, RequestContext(request)) +@login_required +def influence_list(request): + # Only show this player's influences + os = Influence.objects.filter(character__player=request.user) + return render_to_response('influences/influence_list.html', {'object_list' : os}, RequestContext(request)) + @login_required def influence_detail(request, object_id): o = Influence.objects.get(pk=object_id) - return render_to_response('influences/influence_detail.html', {'object' : o}, RequestContext(request)) + # Don't show other player's influences + if (o.character.player != request.user): + return HttpResponseForbidden("Forbidden -- Trying to view influences of somebody else's character") + + # Show all comments to staff, but only public comments to other + # users + if request.user.is_staff: + comments = ThreadedComment.objects.get_tree(o) + else: + comments = ThreadedComment.public.get_tree(o) + + context = { + 'object' : o, + 'comments' : comments, + 'comment_form' : ThreadedCommentForm(), + } + return render_to_response('influences/influence_detail.html', context, RequestContext(request)) # vim: set sts=4 sw=4 expandtab: