Show only public comments to non-staff.
[matthijs/projects/xerxes.git] / influences / views.py
1 from django.contrib.auth.decorators import login_required
2 from django.shortcuts import render_to_response
3 from django.shortcuts import get_object_or_404
4 from django.template import RequestContext
5 from django.utils.translation import ugettext as _
6 from django.contrib.auth.models import User
7 from django.core.urlresolvers import reverse
8 from django.http import HttpResponseRedirect, HttpResponseForbidden
9 from django.views.generic.list_detail import object_detail, object_list
10 from threadedcomments.models import ThreadedComment
11 from threadedcomments.forms import ThreadedCommentForm
12 from xerxes.influences.models import Character
13 from xerxes.influences.models import Influence
14 from xerxes.tools.forms import ContextModelForm
15
16
17
18 class InfluenceForm(ContextModelForm):
19     class Meta:
20         model = Influence
21         fields = ('character', 'contact', 'summary', 'description')
22
23 class CharacterForm(ContextModelForm):
24     class Meta:
25         model = Character
26         fields = ('name')
27
28 @login_required
29 def add_influence(request, character_id=None):
30     initial = {}
31     # Get the current user's characters
32     chars = request.user.character_set.all()
33
34     # If a character_id was specified in the url, or there is only one
35     # character, preselect it.
36     if (character_id):
37         initial['character'] = character_id
38     elif (chars.count() == 1):
39         initial['character'] = chars[0].id
40
41
42     f = InfluenceForm(request=request, initial=initial)
43
44     # Only allow characters of the current user. Putting this here also
45     # ensures that a form will not validate when any other choice was
46     # selected (perhaps through URL crafting).
47     f.fields['character']._set_queryset(chars)
48
49     if (f.is_valid()):
50         # The form was submitted, let's save it.
51         influence = f.save()
52         # Redirect to the just saved influence
53         return HttpResponseRedirect(reverse('influences_influence_detail', args=[influence.id]))
54
55     return render_to_response('influences/add_influence.html', {'form' : f}, RequestContext(request))
56
57 @login_required
58 def add_character(request):
59     f = CharacterForm(request=request)
60     if (f.is_valid()):
61         character = f.save(commit=False)
62         character.player = request.user
63         character.save()
64         return HttpResponseRedirect(reverse('influences_character_detail', args=[character.id]))
65
66     return render_to_response('influences/add_character.html', {'form' : f}, RequestContext(request))
67
68 @login_required
69 def index(request):
70     # Only show this player's characters and influences
71     characters = request.user.character_set.all()
72     influences = Influence.objects.filter(character__player=request.user)
73     return render_to_response('influences/index.html', {'characters' : characters, 'influences' : influences}, RequestContext(request))
74
75 #
76 # The views below are very similar to django's generic views (in fact,
77 # they used to be generic views before). However, since they all depend
78 # on the currently logged in user (for limiting the show list or
79 # performing access control), we won't actually use the generic views
80 # here.
81
82 @login_required
83 def character_list(request):
84     # Only show this player's characters
85     os = request.user.character_set.all()
86     return render_to_response('influences/character_list.html', {'object_list' : os}, RequestContext(request))
87
88 @login_required
89 def character_detail(request, object_id):
90     o = Character.objects.get(pk=object_id)
91     # Don't show other player's characters
92     if (o.player != request.user):
93         return HttpResponseForbidden("Forbidden -- Trying to view somebody else's character")
94     return render_to_response('influences/character_detail.html', {'object' : o}, RequestContext(request))
95
96 @login_required
97 def influence_list(request):
98     # Only show this player's influences
99     os = Influence.objects.filter(character__player=request.user)
100     return render_to_response('influences/influence_list.html', {'object_list' : os}, RequestContext(request))
101
102 @login_required
103 def influence_detail(request, object_id):
104     o = Influence.objects.get(pk=object_id)
105     # Don't show other player's influences
106     if (o.character.player != request.user):
107         return HttpResponseForbidden("Forbidden -- Trying to view influences of somebody else's character")
108
109     # Show all comments to staff, but only public comments to other
110     # users
111     if request.user.is_staff:
112         comments = ThreadedComment.objects.get_tree(o)
113     else:
114         comments = ThreadedComment.public.get_tree(o)
115     
116     context  = {
117         'object' : o,
118         'comments' : comments,
119         'comment_form' : ThreadedCommentForm(),
120     }
121     return render_to_response('influences/influence_detail.html', context, RequestContext(request))
122
123 # vim: set sts=4 sw=4 expandtab: