~isagalaev/scipio/trunk

« back to all changes in this revision

Viewing changes to views.py

  • Committer: Ivan Sagalaev
  • Date: 2009-08-02 22:28:19 UTC
  • Revision ID: maniac@softwaremaniacs.org-20090802222819-fwmxb8soh1ezo9n3
Scipio. Initial commit.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding:utf-8 -*-
 
2
from django.views.decorators.http import require_POST
 
3
from django import http
 
4
from django.utils.translation import ugettext as _
 
5
from django.utils import simplejson
 
6
from django.shortcuts import redirect
 
7
from django.contrib import auth
 
8
 
 
9
from scipio import models, forms, signals, mimeparse
 
10
 
 
11
def _post_redirect(request):
 
12
    return request.POST.get('redirect', request.META.get('HTTP_REFERER', '/'))
 
13
 
 
14
def login(request):
 
15
    if request.method == 'POST':
 
16
        form = forms.AuthForm(request.session, request.POST)
 
17
        if form.is_valid():
 
18
            after_auth_redirect = form.auth_redirect(_post_redirect(request))
 
19
            return redirect(after_auth_redirect)
 
20
        return_url = _post_redirect(request)
 
21
    else:
 
22
        form = forms.AuthForm(request.session)
 
23
        return_url = request.GET.get('redirect', '/')
 
24
    return render_to_response(request, 'scipio/login.html', {'form': form, 'redirect': return_url})
 
25
 
 
26
def complete(request, message=_('Authentication failed')):
 
27
    user = auth.authenticate(session=request.session, query=request.GET, return_path=request.path)
 
28
    if not user:
 
29
        return http.HttpResponseForbidden(message)
 
30
    auth.login(request, user)
 
31
    data = dict((k[7:], v) for k, v in request.GET.items() if k.startswith('scipio.'))
 
32
    results = signals.authenticated.send(request, profile=user.scipio_profile, **data)
 
33
    for r in results:
 
34
        if isinstance(r, http.HttpResponse):
 
35
            response = r
 
36
            break
 
37
    else:
 
38
        response = None
 
39
    return response or redirect(request.GET.get('redirect', '/'))
 
40
 
 
41
@require_POST
 
42
def logout(request):
 
43
    auth.logout(request)
 
44
    return redirect(_post_redirect(request))
 
45
 
 
46
def openid_whitelist(request):
 
47
    if request.method == 'POST':
 
48
        try:
 
49
            profile = models.Profile.objects.get(pk=int(request.POST['id']))
 
50
            profile.spamer = False
 
51
            profile.save()
 
52
            return redirect(_post_redirect(request))
 
53
        except (Profile.DoesNotExist, ValueError, KeyError):
 
54
            return http.HttpResponseBadRequest()
 
55
    else:
 
56
        openids = (p.openid for p in Profile.objects.filter(spamer=False) if p.openid)
 
57
        MIMETYPES = ['application/xml', 'text/xml', 'application/json', 'text/plain']
 
58
        accept = request.META.get('HTTP_ACCEPT', '')
 
59
        try:
 
60
            mimetype = mimeparse.best_match(MIMETYPES, accept)
 
61
        except ValueError:
 
62
            mimetype = 'text/plain'
 
63
        if mimetype.endswith('/xml'):
 
64
            try:
 
65
                import xml.etree.ElementTree as ET
 
66
            except ImportError:
 
67
                import elementtree.ElementTree as ET
 
68
            root = ET.Element('whitelist')
 
69
            for openid in openids:
 
70
                ET.SubElement(root, 'openid').text = openid
 
71
            xml = ET.ElementTree(root)
 
72
            response = http.HttpResponse(mimetype=mimetype)
 
73
            xml.write(response, encoding='utf-8')
 
74
            return response
 
75
        if mimetype == 'application/json':
 
76
            response = http.HttpResponse(mimetype=mimetype)
 
77
            simplejson.dump(list(openids), response)
 
78
            return response
 
79
        if mimetype == 'text/plain':
 
80
            return http.HttpResponse((o + '\n' for o in openids), mimetype=mimetype)
 
81
        return http.HttpResponse('Can accept only: %s' % ', '.join(MIMETYPES), status=406)