X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=influences%2Fviews.py;h=ea07c70c03f86c668562ced31549d3673d8bd72c;hb=6e0ad555b25c2d9f3f28726f797edb3a51783af2;hp=50ce60001996f26b82db32c2f8372aab70db8f5a;hpb=69974d5dca02a99311dd5d97ae9907c31f500892;p=matthijs%2Fprojects%2Fxerxes.git diff --git a/influences/views.py b/influences/views.py index 50ce600..ea07c70 100644 --- a/influences/views.py +++ b/influences/views.py @@ -1,46 +1,115 @@ +from django.contrib.auth.decorators import login_required from django.shortcuts import render_to_response from django.shortcuts import get_object_or_404 +from django.template import RequestContext from django.utils.translation import ugettext as _ -from ee.influences.models import Character -from ee.influences.models import Influence -from ee.tools.forms import ContextModelForm +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 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 + + class InfluenceForm(ContextModelForm): - class Meta: - model = Influence - fields = ('character', 'contact', 'description') + class Meta: + model = Influence + fields = ('character', 'contact', 'summary', 'description') class CharacterForm(ContextModelForm): class Meta: model = Character fields = ('name') -def add(request, character_id): - message = None - - if (request.method == "POST"): - f = InfluenceForm(request.POST) - if (f.is_valid()): - f.save() - message = _("Influence added.") - f = None - else: - f = InfluenceForm() - - if f: - # Only allow characters of the current user - f.fields['character']._set_queryset(request.user.character_set.all()) - - return render_to_response('influences/character_addinfluence.html', {'message' : message, 'form' : f}) - -def addCharacter(request): - message = None +@login_required +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) + + # 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) + + 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 add_character(request): f = CharacterForm(request=request) if (f.is_valid()): - c = f.save(commit=False) - c.player = request.user - c.save() - message = _("Character added.") - f = None + character = f.save(commit=False) + character.player = request.user + character.save() + return HttpResponseRedirect(reverse('influences_character_detail', args=[character.id])) + + return render_to_response('influences/add_character.html', {'form' : f}, RequestContext(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__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) + # 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") + context = { + 'object' : o, + 'comments' : ThreadedComment.public.get_tree(o), + 'comment_form' : ThreadedCommentForm(), + } + return render_to_response('influences/influence_detail.html', context, RequestContext(request)) - return render_to_response('influences/add_character.html', {'message' : message, 'form' : f}) +# vim: set sts=4 sw=4 expandtab: