2020-12-22 11:10:20 +01:00

486 lines
21 KiB
Python

from oxyapp import app
# Import de tous les modules utiles
import os
from datetime import timedelta
from flask import abort, session, request, render_template, url_for, redirect, Response, send_from_directory
from flask import flash
# Fonctions persos
from oxyapp.database import getLocalisation, confirm_user
from oxyapp.database import add_user, delete_user_from_db, list_users, list_patient
from oxyapp.bdd_login import *
from oxyapp.utils import localisationUser
from oxyapp.utils_link import generate_charts, generate_data_health
# Configure les variables globales - A SUPPRIMER RAPIDEMENT
app.TOWN = ""
app.COUNTRY = ""
app.NAMEMANAGE = ""
app.PRENOMMANAGE = ""
app.IDMANAGE = ""
# A chaque requête on set la session a 1min et on modifie la session
# Le test peut être effectué en attendant 1 min dans une page autre que index pour qu'elle soit expirée
@app.before_request
def refresh_session():
session.modified = True
app.permanent_session_lifetime = timedelta(minutes=1)
# Page index
@app.route("/")
@app.route("/index")
def index():
# Si on est pas connecté alors on retourne vers login
if not session.get('logged_in'):
return redirect(url_for('login'))
else:
# Si la session a expiré alors on retourne vers login avec un message
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
# Sinon on affiche la page index
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank'],
'town': app.TOWN}
return render_template('index.html', **templateData, title='Index', sidebar=0)
# Page de chargement avant index
@app.route('/preloader')
def preloader():
if not session.get('logged_in'):
return redirect(url_for('login'))
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
# On execute la requête pour localiser
row = getLocalisation(session['ID'])
# Si on trouve des valeurs alors
if row:
# Définition de lat et lon
lat = row[0]
lon = row[1]
# Si lat et lon sont à 0 car l'application reçoit 0 données alors on affiche sans la ville
if lat == 0 and lon == 0:
app.TOWN = "null"
return render_template('preloader.html', title='Preloader')
# Sinon on continue de chercher la localisation
else:
app.TOWN = localisationUser(lat, lon)
return render_template('preloader.html', title='Preloader')
# Sinon on ne fait rien et on affiche le preloader
else:
return render_template('preloader.html', title='Preloader')
# Page profil utilisateur - A FAIRE A LA FIN
@app.route('/user_profil')
def user_profil():
if not session.get('logged_in'):
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank'],
'patient': "Josh", 'age': 18}
return render_template('user/user_profil.html', **templateData, title='Profil')
# Page pour fréquence cardiaque
@app.route('/charts_coeur')
def charts_coeur():
if not session.get('logged_in'):
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('user/charts_coeur.html', **templateData, title='Graphique coeur', sidebar=1)
# Page pour taux oxygène
@app.route('/charts_oxy')
def charts_oxy():
if not session.get('logged_in'):
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('user/charts_oxy.html', **templateData, title='Graphique oxygène', sidebar=2)
# Page localisation - modifier pour que ce soit plus efficace
@app.route('/localisation')
def page_localisation():
if not session.get('logged_in'):
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
# On execute la requête
row = getLocalisation(session['ID'])
# Affection des variables sur lat et lon
if row:
lat = row[0]
lon = row[1]
else:
lat = 0
lon = 0
# Si lat et lon sur 0 alors on en cherche pas sa localisation et on affiche la page
if lat == 0 and lon == 0:
templateData = {'town': app.TOWN, 'prenom': session['prenom'], 'nom': session['nom'],
'rank': session['rank']}
return render_template('user/localisation.html', **templateData, title='Localisation', loc=1, sidebar=3)
# Sinon on cherche sa localisation avec localisationUser
else:
app.TOWN = localisationUser(lat, lon)
templateData = {'lat': lat, 'lon': lon, 'town': app.TOWN, 'prenom': session['prenom'],
'nom': session['nom'], 'rank': session['rank']}
return render_template('user/localisation.html', **templateData, title='Localisation', loc=0, sidebar=3)
# Page monitoring pour médecins MED - PROCHAINE MAJ
@app.route('/monitoring')
def monitoring():
if not session.get('logged_in'):
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
if session.get('rank') != 3 and session.get('rank') != 2:
abort(404)
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('med/monitoring.html', **templateData, title='Mono-Monitoring', sidebar=4)
# Page monitoring pour médecins MED - PROCHAINE MAJ
@app.route('/multimonitoring')
def multimonitoring():
if not session.get('logged_in'):
return redirect(url_for('login'))
if session.get('rank') != 3 and session.get('rank') != 2:
abort(404)
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('med/multimonitoring.html', **templateData, title='Multi-Monitoring', sidebar=12)
# Page table de tous les patients MED
@app.route('/patients')
def tables_patients():
if not session.get('logged_in'):
return redirect(url_for('login'))
if session.get('rank') != 3 and session.get('rank') != 2:
abort(404)
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('med/tables_patients.html', **templateData, title='Table patients',
accounts=list_patient(app.IDMANAGE), sidebar=5)
# Page pour modifier les différents utilisateurs ADMIN
@app.route('/utilisateurs')
def tables_admin():
if not session.get('logged_in'):
return redirect(url_for('login'))
if session.get('rank') != 3:
abort(404)
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('admin/tables_admin.html', **templateData, title='Table utilisateurs',
accounts=list_users(), sidebar=8)
# Page manage utilisateur MED
@app.route('/user_manage')
def user_manage():
if not session.get('logged_in'):
return redirect(url_for('login'))
if session.get('rank') != 3:
abort(404)
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('admin/user_manage.html', **templateData, title='Gestion utilisateurs', sidebar=7)
# Page ajout utilisateur ADMIN
@app.route('/user_add')
def user_add():
if not session.get('logged_in'):
return redirect(url_for('login'))
if session.get('rank') != 3 and session.get('rank') != 2:
abort(404)
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
if session.get('rank') == 2:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('admin/user_add.html', **templateData, title='Ajout utilisateur', sidebar=9)
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('admin/user_add.html', **templateData, title='Ajout utilisateur', sidebar=6,
admin_option=0)
# Page ajout utilisateur MED
@app.route('/user_delmed')
def user_delmed():
if not session.get('logged_in'):
return redirect(url_for('login'))
if session.get('rank') != 3 and session.get('rank') != 2:
abort(404)
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('med/user_deletemed.html', **templateData, title='Suppression patients',
accounts=list_patient(app.IDMANAGE), sidebar=10)
# Page suppression utilisateur ADMIN
@app.route('/user_del')
def user_del():
if not session.get('logged_in'):
return redirect(url_for('login'))
if session.get('rank') != 3:
abort(404)
else:
if session['prenom'] is None:
flash('Votre session a expirée', 'warning')
return redirect(url_for('login'))
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
return render_template('admin/user_delete.html', **templateData, title='Suppression utilisateurs',
accounts=list_users(), sidebar=11)
# Création données graphique au format json pour html
@app.route('/chart-data')
def chart_data():
return Response(generate_charts(session['ID']), mimetype='text/event-stream')
# Création données pour la div index au format json pour html
@app.route('/data-health')
def data_health():
return Response(generate_data_health(session['ID']), mimetype='text/event-stream')
# Fonction enregistrement des utilisateur ADMIN
@app.route('/user_addbdd', methods=['POST'])
def user_add_bdd():
# On récupére les données POST
POST_NAME = str(request.form['nom'])
POST_PRENOM = str(request.form['prenom'])
POST_NUMBER = str(request.form['number'])
POST_PASSWORD = str(request.form['password'])
POST_RANK = str(request.form['rank'])
# On ajoute l'utilisateur grâce à add_user()
result = add_user(POST_NAME, POST_PRENOM, POST_NUMBER, POST_PASSWORD, POST_RANK)
# Si on réussi alors on affiche la page user_add avec un message succès
if result:
flash("L'utilisateur a été ajouté avec succès", 'success')
return redirect(url_for('user_add'))
# Sinon on affiche la page user_add avec un message erreur
else:
flash("L'utilisateur n'a pas pu être ajouté", 'danger')
return redirect(url_for('user_add'))
# Fonction pour supprimer des utilisateurs dans la catégorie admin sur bdd ADMIN
@app.route('/user_deletebdd', methods=['POST'])
def user_delete_bdd():
# On récupére les données POST
POST_NAME = str(request.form['nom'])
POST_PRENOM = str(request.form['prenom'])
POST_ID = str(request.form['id'])
# On vérifie que l'utilisateur existe
result = confirm_user(POST_NAME, POST_PRENOM, POST_ID)
# S'il existe alors ...
if result:
# On supprime l'utilisateur avec delete_user_from_db()
delete_user_from_db(POST_ID)
# On redirige vers user_del et on affiche message succès
flash("L'utilisateur " + POST_PRENOM + " " + POST_NAME + " a bien été supprimé", 'success')
return redirect(url_for('user_del'))
# Sinon on redirige vers user_del et on affiche message erreur
else:
flash("L'utilisateur " + POST_PRENOM + " " + POST_NAME +
" n'a pas été supprimé car les données ne correspondent pas ou n'existe pas", 'danger')
return redirect(url_for('user_del'))
# Fonction pour supprimer des patients dans la catégorie médical sur bdd MED
@app.route('/user_deletemedbdd', methods=['POST'])
def user_deletemed_bdd():
# On récupére les données POST
POST_NAME = str(request.form['nom'])
POST_PRENOM = str(request.form['prenom'])
POST_ID = str(request.form['id'])
# On vérifie que l'utilisateur existe
result = confirm_user(POST_NAME, POST_PRENOM, POST_ID)
# S'il existe alors ...
if result:
# On supprime l'utilisateur avec delete_user_from_db()
delete_user_from_db(POST_ID)
# On redirige vers user_del et on affiche message succès
flash("L'utilisateur " + POST_PRENOM + " " + POST_NAME + " a bien été supprimé", 'success')
return redirect(url_for('user_delmed'))
# Sinon on redirige vers user_del et on affiche message erreur
else:
flash("L'utilisateur " + POST_PRENOM + " " + POST_NAME +
" n'a pas été supprimé car les données ne correspondent pas ou n'existe pas", 'danger')
return redirect(url_for('user_delmed'))
# Fonction gestion accès utilisateur pour obtenir tableau des patients ADMIN - A MODIFIER VRAIMENT RAPIDEMENT
@app.route('/user_manageinput', methods=['POST'])
def user_manage_input():
if not session.get('logged_in'):
return redirect(url_for('login'))
else:
if session['prenom'] is None:
return render_template('auth/login.html')
else:
row = []
app.NAMEMANAGE = str(request.form['nom'])
app.PRENOMMANAGE = str(request.form['prenom'])
# Requête SQL
var = "SELECT id, nom, prenom, privilege FROM users WHERE nom = '" + app.NAMEMANAGE + "' AND prenom = '" \
+ app.PRENOMMANAGE + "'"
try:
cur = bdd_login()
except pymysql.Error as e:
return abort(e)
result = cur.execute(var)
for row in cur:
print(row)
app.IDMANAGE = row[0]
app.PRENOMMANAGE = row[2]
app.NAMEMANAGE = row[1]
RANK = row[3]
cur.close()
if RANK != 'proche':
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
'prenom_user': app.PRENOMMANAGE, 'rank': session['rank']}
return render_template('admin/user_manage.html', **templateData, sidebar=7, usermanage_div=3)
else:
if result:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
'prenom_user': app.PRENOMMANAGE, 'rank': session['rank']}
return render_template('admin/user_manage.html', **templateData,
accounts=list_patient(app.IDMANAGE), sidebar=7,
datatable=1)
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
'prenom_user': app.PRENOMMANAGE, 'rank': session['rank']}
return render_template('admin/user_manage.html', **templateData,
accounts=list_patient(app.IDMANAGE), sidebar=7,
usermanage_div=2)
# Fonction pour gérer les accès de proches à patients ADMIN - A MODIFIER VRAIMENT RAPIDEMENT
@app.route('/user_manageaccount', methods=['POST'])
def user_manage_account():
if not session.get('logged_in'):
return redirect(url_for('login'))
else:
if session['prenom'] is None:
return render_template('auth/login.html')
else:
POST_NAME = str(request.form['nom'])
POST_PRENOM = str(request.form['prenom'])
POST_ID = str(request.form['id'])
# Requête SQL
var = "SELECT id, nom, prenom FROM users WHERE nom = '" + POST_NAME + "' AND prenom = '" \
+ POST_PRENOM + "' AND id = '" + POST_ID + "'"
try:
cur = bdd_login()
except pymysql.Error as e:
return abort(e)
result = cur.execute(var)
print(result)
if result:
if request.form['askDelete'] == "Oui":
var = "DELETE FROM `access` WHERE `access`.`UserAccess` = '" + str(
app.IDMANAGE) + "' AND `access`.`AccessedUser` = '" + str(POST_ID) + "'"
print(var)
result = cur.execute(var)
if result:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
'prenom_user': app.PRENOMMANAGE,
'rank': session['rank']}
return render_template('admin/user_manage.html', **templateData,
accounts=list_patient(app.IDMANAGE),
sidebar=7,
usermanage_div=0)
else:
return 'error'
else:
var = "INSERT INTO `access` (`ID`, `UserAccess`, `AccessedUser`) VALUES (NULL, '" + str(
app.IDMANAGE) + "', '" + str(POST_ID) + "');"
result = cur.execute(var)
if result:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
'prenom_user': app.PRENOMMANAGE,
'rank': session['rank']}
return render_template('admin/user_manage.html', **templateData,
accounts=list_patient(app.IDMANAGE),
sidebar=7,
usermanage_div=0)
else:
return 'error'
else:
templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
'prenom_user': app.PRENOMMANAGE,
'rank': session['rank']}
return render_template('admin/user_manage.html', **templateData, accounts=list_patient(app.IDMANAGE),
sidebar=7,
usermanage_div=2)
# Route pour ico qui génère une erreur - FIX mais régler erreur est mieux
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static/img'),
'favicon.ico', mimetype='image/vnd.microsoft.icon')