You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
3.5 KiB
74 lines
3.5 KiB
import random
|
|
import operator
|
|
import json
|
|
import datetime
|
|
from flask import Flask, Response, redirect, url_for, request, session, abort, render_template
|
|
from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user, current_user
|
|
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 getLeaderboard():
|
|
s = 'select u.username as name, u.score as score, max(m.meal_date) as last_meal from users as u inner join meals as m on u.id = m.kuk where m.kuk>0 and m.status>0 group by u.id order by u.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 = (parse(meals[-1]['selection_deadline']) - datetime.datetime.now()).seconds
|
|
if seconds_to_deadline < 0:
|
|
meals[-1]['selection_deadline'] = 'Deadline passed'
|
|
else:
|
|
hours_td = round(seconds_to_deadline / 60 / 60)
|
|
days_td = hours_td / 24
|
|
hours_td = hours_td % 24
|
|
meals[-1]['selection_deadline'] = str(days_td) + ' days ' + str(hours_td)
|
|
r.close()
|
|
return meals
|
|
|
|
@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') |