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')