Fetenzentrale/app.py

193 lines
6.9 KiB
Python

import json
import subprocess
from flask import flash, redirect, request, Flask, render_template, url_for
from datetime import datetime, timedelta
app = Flask(__name__)
activeAlarms = dict()
previousAlarms = dict()
logs = list()
todos_dict = dict()
preprocessed = False
alarmIndex = 0
def preprocess():
print('start init alarms and logs')
#versuch beide files zu laden, wenn das fehlschlägt, initiiere beide files als json
try:
alarmsFile = json.load(open('alarms.json'))
logsFile = json.load(open('logs.json'))
todoFile = json.load(open('todos.json'))
except:
alarmsFile = list()
logsFile = list()
todoFile = list()
json.dump(alarmsFile, open('alarms.json','w'), indent=2)
json.dump(logsFile, open('logs.json','w'), indent=2)
json.dump(todoFile, open('todos.json','w'), indent=2)
# schreib alle alarme im File in previousAlarms, wenn sie älter als 2 mins sind
# alle anderen in active alarms
for (alarm) in alarmsFile:
if datetime.strptime(alarmsFile[alarm]['datetime'],"%d.%m.%Y %H:%M") <= datetime.now()-timedelta(minutes=2):
previousAlarms[alarm] = alarmsFile[alarm]
else:
activeAlarms[alarm] = alarmsFile[alarm]
global alarmIndex
if(int(alarm)>alarmIndex):
alarmIndex = int(alarm)
for todo in todoFile:
todos_dict[todo] = todoFile[todo]
if todoFile[todo]['done'] and todo in activeAlarms:
previousAlarms[id] = activeAlarms[id]
activeAlarms.pop(id)
# lies alle log aus dem file ein
for log in logsFile:
logs.append(log)
global preprocessed
preprocessed = True
print("init of alarms and logs done")
@app.route("/", methods=('GET', 'POST'))
def index():
if not preprocessed:
preprocess()
return render_template('index.html', logs = logs, alarms = activeAlarms, previousAlarms=previousAlarms)
@app.route('/setAlarm', methods=('GET', 'POST'))
def setAlarm():
if request.method == 'POST':
# wenn Datum leer:
# default Datum ist heute
# wenn heute + angegebene Uhrzeit vor jetzt ist -> Alarm für morgen zu der Uhrzeit gesetzt
if request.form['date'] !="" and request.form['time']!="":
time = datetime.strptime(request.form['date']+' '+request.form['time'], "%Y-%m-%d %H:%M")
elif request.form['date'] == "":
time = datetime.combine(datetime.today(),datetime.strptime(request.form['time'], "%H:%M").time())
if time<datetime.now():
time = time + timedelta(days=1)
content = request.form['alarmMessage']
global alarmIndex
alarmIndex += 1
activeAlarms[alarmIndex]({'datetime':datetime.strftime(time,"%d.%m.%Y %H:%M"),'message':content})
allAlarms = activeAlarms+previousAlarms
with open('alarms.json', 'w') as f:
json.dump(allAlarms, f, indent=2)
f.close()
return redirect(url_for('index'))
@app.route('/sendLog', methods=('GET', 'POST'))
def sendLog():
if request.method == 'POST':
content = request.form['logMessage']
log = {'datetime':datetime.now().strftime("%d.%m.%Y %H:%M"),'message':content}
logs.append(log)
with open('logs.json', 'w') as f:
json.dump(logs, f, indent=2)
f.close()
return redirect(url_for('index'))
# sounds the alarm
@app.route('/alarms', methods=('GET','POST'))
def alarm():
if request.method == 'GET':
return json.dumps(activeAlarms)
if request.method == 'POST':
print('ALARM')
subprocess.call(['mpv','./alarm.mp3'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
data = json.loads(request.data.decode('UTF-8'))
previousAlarms[data] = activeAlarms[data]
activeAlarms.pop(data)
return redirect(url_for('index'))
@app.route('/deletealarm', methods=('GET','POST'))
def deleteAlarm():
if request.method == 'POST':
id = request.data.decode('UTF-8')
alarm = activeAlarms[id]
previousAlarms[id] = alarm
activeAlarms.pop(id)
return redirect(url_for('index'))
# invert todo checkbox
# if alarm attached to checkbox -> move to previous or active alarm accordingly
@app.route('/checktodo', methods=('GET','POST'))
def checktodo():
if request.method == 'POST':
id = request.data.decode('UTF-8')
todos_dict[id] = {'done': not todos_dict[id]['done'], 'message': todos_dict[id]['message']}
if id in activeAlarms:
previousAlarms[id] = activeAlarms[id]
activeAlarms.pop(id)
elif id in previousAlarms:
activeAlarms[id] = previousAlarms[id]
previousAlarms.pop(id)
with open('todos.json', 'w') as f:
json.dump(todos_dict, f, indent=2)
return render_template('todo.html', todos = todos_dict, alarms = activeAlarms)
@app.route('/upload', methods=('GET','POST'))
def upload():
# if upload successful back to index
# else show error und bleib auf der Seite
if request.method == 'POST':
data = json.load(request.files['alarmFile'].stream)
for alarm in data:
content = alarm["message"]
global alarmIndex
alarmIndex += 1
if alarm["type"] != "checkbox":
time = datetime.combine(datetime.today(),datetime.strptime(alarm["time"], "%H:%M").time())
if time<datetime.now():
time = time + timedelta(days=1)
activeAlarms[str(alarmIndex)] = {'datetime':datetime.strftime(time,"%d.%m.%Y %H:%M"),'message':content}
if(alarm["type"]=="both"):
todos_dict[str(alarmIndex)]= {'done':False, 'message':content}
else:
todos_dict[str(alarmIndex)]= {'done':False, 'message':content}
# ja, wir schreiben einfach das ganze File neu, ist aber einfacher
with open('alarms.json', 'w') as f:
json.dump(activeAlarms, f, indent=2)
with open('todos.json', 'w') as g:
json.dump(todos_dict, g, indent=2)
f.close()
g.close()
return redirect(url_for('index'))
return render_template('upload.html', uploadFailed=True)
# ab hier statisches gerendere, keine große Logik mehr :D
@app.route('/processAlarm')
def processAlarm():
return render_template('alarms.html', alarms=activeAlarms)
@app.route('/processpAlarm')
def processpAlarm():
return render_template('palarms.html', previousAlarms=previousAlarms)
@app.route('/reloadChecklist')
def reloadChecklist():
return render_template('todolist.html', todos=todos_dict)
@app.route('/todos')
def todos():
if not preprocessed:
preprocess()
return render_template('todo.html', todos = todos_dict, alarms = activeAlarms)
@app.route("/help")
def help():
return render_template('help.html')
@app.route("/about")
def about():
return render_template('about.html')