from flask import Flask, request, g, url_for, render_template from revprox import ReverseProxied from utils import * import manager import os import sqlite3 DATABASE = os.getenv('DATABASE', 'abot.sqlite') # database file DEBUG = False QUESTIONS = os.getenv('QUESTIONS', 'questions') # path to questions GIT_COMMIT = os.getenv('GIT_COMMIT', False) app = Flask(__name__) app.config.from_object(__name__) app.wsgi_app = ReverseProxied(app.wsgi_app) @app.before_request def before_request(): g.db = connect_db() @app.teardown_request def teardown_request(exception): db = getattr(g, 'db', None) if db is not None: db.close() @app.route('/') def index(): return render_template('index.html') @app.route('/preview/') def preview(key): if not is_key(key): return render_template('blank.html', message = "Unknown key") form = parse_form(key) if not form: return render_template('blank.html', message = "Error creating form") if not is_draft(form): return render_template('blank.html', message = "Preview not enabled") valid_for = time_to_expiry(form) return render_template( 'preview.html', key = key, form = form, valid_for = valid_for ) @app.route('/vote//') @app.route('/vote/') def vote(key, token = None): if not is_key(key): return render_template('blank.html', message = "Unknown key") form = parse_form(key) if not form: return render_template('blank.html', message = "Error creating form") if is_draft(form): return render_template('blank.html', message = "Not published") if is_expired(form): return render_template('blank.html', message = "Voting has closed") if is_closed_vote(form): if has_voted(key, token): return render_template('blank.html', message = "Token already used") valid_for = time_to_expiry(form) return render_template('vote.html', form = form, key = key, token = token, valid_for = valid_for) @app.route('/save', methods=['POST']) def save_vote(): key = request.form['key'] token = request.form['token'] if not is_key(key): return render_template('blank.html', message = "Unknown key") form = parse_form(key) if not form: return render_template('blank.html', message = "Error creating form") if is_draft(form): return render_template('blank.html', message = "Not published") if is_expired(form): return render_template('blank.html', message = "Voting has closed") if is_closed_vote(form): if has_voted(key, token): return render_template('blank.html', message = "Token already used") write_vote(key, token, request.form, form) # using request. tokens = False summary = False questions = [] answers = [] if is_show_results(form): summary = True questions, answers = sort_summary(*get_summary(g.db, key)) tokens = get_token_counts(g.db, key) return render_template( 'thank_you.html', summary = summary, tokens = tokens, qa = zip(questions, answers) ) @app.route('/observe//') def observe(key, token): if not is_key(key): return render_template('blank.html', message = "Unknown key") if not is_observer(key, token): return render_template('blank.html', message = "Token not valid") tokens = get_token_counts(g.db, key) summary = False questions = [] answers = [] form = parse_form(key) if not form: return render_template('blank.html', message = "Error creating form") if is_show_results(form): summary = True questions, answers = sort_summary(*get_summary(g.db, key)) return render_template( 'observe.html', summary = summary, tokens = tokens, qa = zip(questions, answers) ) create_db(DATABASE) if __name__ == "__main__": manager.main(DATABASE, QUESTIONS)