import random import operator import json import datetime from functools import wraps from flask import Flask, Response, redirect, url_for, request, session, abort, render_template from flask_login import LoginManager import sqlalchemy from sqlalchemy.sql import select, text from dateutil.parser import parse app = Flask(__name__) #config app.config.update( DEBUG = True, SECRET_KEY = 'secret_xxx', SESSION_TYPE = 'memcached' ) db_engine = {} db_metadata = {} meals = {} def connect(user, password, db, host='localhost', port=5432): url = 'postgresql://{}:{}@{}:{}/{}' url = url.format(user, password, host, port, db) con = sqlalchemy.create_engine(url, client_encoding='utf8') meta = sqlalchemy.MetaData(bind=con, reflect=True) return con, meta def check_auth(username, password): query = "select id, password from users where username=:usrnm;" r = db_engine.execute(text(query), usrnm=username) results = [] for row in r: results.append(dict(row)) r.close() if len(results)!=1: return False; #TODO: REMOVE TEMPORARY PASSWORD OVERRIDE VECTOR 1==1. if results[0]['password']==password or 1==1: session['uid'] = results[0]['id'] print (session['uid']) return True else: return False def authenticate(): return Response('Could not verify access level. Please retry', 401, {'WWW-Authenticate' : 'Basic realm="Login Required"'}) def requires_auth(f): @wraps(f) def decorated(*args, **kwargs): auth = request.authorization if not auth or not check_auth(auth.username, auth.password): return authenticate() return f(*args, **kwargs) return decorated def getLeaderboard(): s = 'select u.username as name, u.score as score, max(m.meal_date) as last_meal from users as u left join meals as m on m.kuk = u.id group by u.id order by score, last_meal;' r = db_engine.execute(text(s)) leaders=[] for row in r: leaders.append(dict(row)) r.close() return leaders def getUpcomingMeals(): # meals = [] # meals.append({'id':1, 'kuk':'davide', 'eaters':['marek','sven','wille'], 'flavor_text':'Pizza', 'date':'Tuesday 21st of November', 'selection_deadline':'23 hours 14 minutes', 'status':0}) # meals.append({'id':2, 'kuk':'marek', 'eaters':['davide','sven','david', 'wille'], 'flavor_text':'Grzybowa', 'date':'Friday 23rd of November', 'selection_deadline':'3 Days 23 hours', 'status':0}) # meals.append({'id':2, 'kuk':'marek', 'eaters':['davide','sven','david', 'wille'], 'flavor_text':'Grzybowa', 'date':'Friday 23rd of November', 'selection_deadline':'3 Days 23 hours', 'status':0}) # meals.append({'id':2, 'kuk':'marek', 'eaters':['davide','sven','david', 'wille'], 'flavor_text':'Grzybowa', 'date':'Sunday 25rd of November', 'selection_deadline':'3 Days 23 hours', 'status':0}) # meals.append({'id':2, 'kuk':'marek', 'eaters':['davide','sven','david', 'wille'], 'flavor_text':'Grzybowa', 'date':'Sunday 25rd of November', 'selection_deadline':'3 Days 23 hours', 'status':0}) # meals.append({'id':2, 'kuk':'marek', 'eaters':['davide','sven','david', 'wille'], 'flavor_text':'Grzybowa', 'date':'Monday 26rd of November', 'selection_deadline':'3 Days 23 hours', 'status':0}) query = 'select username as kuk, meal_date, array_agg as eaters, selection_deadline from (select kuk, meal_date, selection_deadline, array_agg(username) from meals join users on users.id = any(meals.eaters) where meals.status=0 group by meals.id order by meal_date) as foo join users on kuk=users.id;' r = db_engine.execute(text(query)) meals = [] for row in r: meals.append(dict(row)) seconds_to_deadline = (meals[-1]['selection_deadline'] - datetime.datetime.now()).total_seconds() if seconds_to_deadline < 0: meals[-1]['selection_deadline'] = 'Deadline passed' elif seconds_to_deadline > 3600: hours_td = round(seconds_to_deadline / 3600) days_td = int(hours_td / 24) hours_td = hours_td % 24 meals[-1]['selection_deadline'] = str(days_td) + ' days ' + str(hours_td) + ' hours' else: meals[-1]['selection_deadline'] = str(round(seconds_to_deadline / 60)) + ' minutes' meals[-1]['meal_time'] = meals[-1]['meal_date'].strftime('%H:%M') meals[-1]['meal_date'] = meals[-1]['meal_date'].strftime('%A %d %B') r.close() return meals # adding to meal @app.route("/addme") @requires_auth def addme(): meal_id = request.args.get('meal') query = 'select :user_id = any (eaters) from meals where id =:meal_id;' r = db_engine.execute(text(query), user_id=session['uid'], meal_id = meal_id) results = [] for row in r: results.append(dict(row)) if 1==1: return render_template('appresponse.html', message='Have a nice meal ' + meal_id + " mister " + str(session['uid']) ) else: return render_template('appresponse.html', message='Only one meal per person!') @app.route('/') def index(): print (getUpcomingMeals()) return render_template('meal_list.html', leaderboard=getLeaderboard(), meals=getUpcomingMeals(), current_user_name='Wille') with open('admin.json') as f: postgres_credentials = json.load(f) db_engine, db_metadata = connect(postgres_credentials['username'], postgres_credentials['password'], 'kuk_app') meals = sqlalchemy.Table('meals', db_metadata) if __name__ == '__main__': app.run('0.0.0.0')