# -*- 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//') 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///') 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))