1 """Decorators for zinnia.views"""
2 from django.template import RequestContext
3 from django.contrib.auth.views import login
4 from django.shortcuts import redirect
5 from django.shortcuts import get_object_or_404
6 from django.shortcuts import render_to_response
7 from django.views.decorators.csrf import csrf_protect
8 from django.views.decorators.cache import never_cache
9
10 from zinnia.models import Entry
11
12
13 -def update_queryset(view, queryset,
14 queryset_parameter='queryset'):
15 """Decorator around views based on a queryset
16 passed in parameter, who will force the update
17 of the queryset before executing the view.
18 Related to issue http://code.djangoproject.com/ticket/8378"""
19
20 def wrap(*args, **kwargs):
21 """Regenerate the queryset before passing it to the view."""
22 kwargs[queryset_parameter] = queryset()
23 return view(*args, **kwargs)
24
25 return wrap
26
27
28 @csrf_protect
29 @never_cache
30 -def password(request, entry):
31 """Displays the password form and handle validation
32 by setting the valid password in a cookie."""
33 error = False
34 if request.method == 'POST':
35 if request.POST.get('password') == entry.password:
36 request.session[
37 'zinnia_entry_%s_password' % entry.pk] = entry.password
38 return redirect(entry)
39 error = True
40 return render_to_response('zinnia/password.html', {'error': error},
41 context_instance=RequestContext(request))
42
43
44 -def protect_entry(view):
45 """Decorator performing a security check if needed
46 around the generic.date_based.entry_detail view
47 and specify the template used to render the entry"""
48
49 def wrap(*ka, **kw):
50 """Do security check and retrieve the template"""
51 request = ka[0]
52 entry = get_object_or_404(Entry, slug=kw['slug'],
53 creation_date__year=kw['year'],
54 creation_date__month=kw['month'],
55 creation_date__day=kw['day'])
56
57 if entry.login_required and not request.user.is_authenticated():
58 return login(request, 'zinnia/login.html')
59 if entry.password and entry.password != \
60 request.session.get('zinnia_entry_%s_password' % entry.pk):
61 return password(request, entry)
62 kw['template_name'] = entry.template
63 return view(*ka, **kw)
64
65 return wrap
66