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))
|