aboutsummaryrefslogtreecommitdiff
blob: b426cc82157dd462bde46761380a4a006ad61405 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# -*- coding: utf-8 -*-
"""
    grumpy.webapp
    ~~~~~~~~~~~~~

    This module contains web application data.

    :copyright: (c) by 2010 Priit Laes.
    :license: BSD, see LICENSE for details.
"""
from . import app
from .models import db, Category, Package, User
from .utils import requires_auth_basic

from flask import (flash, g, jsonify, redirect, render_template, request, \
                   session, url_for)
from flaskext.openid import OpenID

# OpenID support
oid = OpenID(app)

@app.before_request
def before_request():
    g.user = None
    if 'openid' in session:
        g.user = User.query.filter_by(openid=session['openid']).first()

@app.route('/')
@app.route('/browse/')
def index():
    cats = Category.query.order_by(Category.cat.asc()).all()
    return render_template('index.html', cats=cats)

@app.route('/browse/<cat>/')
def browse_cat(cat):
    if cat:
        pkgs = Package.query.filter_by(cat=cat) \
                            .order_by(Package.pkg.asc()).all()
        if pkgs:
            return render_template('browse_cat.html', cat=cat, pkgs=pkgs)
    flash('Category "%s" does not exist' % cat)
    return redirect(url_for('index'))

@app.route('/browse/<cat>/<pkg>/')
def browse_pkg(cat, pkg):
    if cat and pkg:
        package = Package.query.filter_by(cat=cat) \
                               .filter_by(pkg=pkg).first()
        if package:
            return render_template('browse_pkg.html', cat=cat, pkg=package, \
                                   qa=package.qaissues)
    flash('Package "%s/%s" does not exist' % (cat, pkg))
    return redirect(url_for('browse_cat', cat=cat))

@app.route('/login', methods=['GET', 'POST'])
@oid.loginhandler
def login():
    if g.user is not None:
        return redirect(oid.get_next_url())
    if request.method == 'POST':
        openid = request.form.get('openid')
        if openid:
            return oid.try_login(openid, ask_for=['email'])
    return render_template('login.html', next=oid.get_next_url(),
                           error=oid.fetch_error())

@app.route('/logout')
def logout():
    session.pop('openid', None)
    flash(u'You have been signed out')
    return redirect(oid.get_next_url())

@oid.after_login
def create_or_login(resp):
    session['openid'] = resp.identity_url
    user = User.query.filter_by(openid=resp.identity_url).first()
    if user is not None:
        flash(u'Successfully logged in')
        g.user = user
        return redirect(oid.get_next_url())
    return redirect(url_for('create_profile', next=oid.get_next_url(),
                    email=resp.email))

@app.route('/create-profile', methods=['GET', 'POST'])
def create_profile():
    if g.user is not None or 'openid' not in session:
        return redirect(url_for('index'))
    if request.method == 'POST':
        email = request.form['email'].strip()
        if not email:
            flash(u'Error: you need to provide @gentoo.org email')
        # XXX: remove plaes.org, that's for testing purposes ;)
        elif not email.endswith(('@gentoo.org', '@plaes.org')):
            flash(u'You need to be a valid Gentoo developer to sign up')
        else:
            flash(u'Profile successfully created')
            db.session.add(User(email, session['openid']))
            # TODO: send confirmation token with email
            db.session.commit()
    return render_template('create_profile.html', next=oid.get_next_url())

@app.route('/_api/1.0/tinderbox/')
@requires_auth_basic
def tinderbox_api():
    return jsonify(dict(success=False))