144 lines
4.2 KiB
Python
144 lines
4.2 KiB
Python
|
|
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 = os.getenv('DEBUG', 'False') == "True" # Debug to log
|
|
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/<key>')
|
|
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/<key>/<token>')
|
|
@app.route('/vote/<key>')
|
|
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 is_voter(key, token):
|
|
return render_template('blank.html', message = "Token invalid")
|
|
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 is_voter(key, token):
|
|
return render_template('blank.html', message = "Token invalid")
|
|
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/<key>/<token>')
|
|
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)
|