369 lines
10 KiB
Python
369 lines
10 KiB
Python
from flask import (
|
|
Flask,
|
|
Response,
|
|
flash,
|
|
jsonify,
|
|
redirect,
|
|
render_template,
|
|
request,
|
|
url_for,
|
|
)
|
|
from flask_jwt_extended import (
|
|
JWTManager,
|
|
create_access_token,
|
|
get_jwt_identity,
|
|
jwt_required,
|
|
set_access_cookies,
|
|
unset_jwt_cookies,
|
|
)
|
|
|
|
from bdd.User import (
|
|
afficherNotes,
|
|
ajouterNote,
|
|
ajouterNoteById,
|
|
calculerMoyennesParUE,
|
|
creerEleve,
|
|
creerMatiere,
|
|
creerUE,
|
|
creerUtilisateur,
|
|
getNotesEleve,
|
|
getUserByLogin,
|
|
isLoginAvalaible,
|
|
listerEleves,
|
|
listerMatieres,
|
|
listerUE,
|
|
verifierUtilisateur,
|
|
)
|
|
|
|
# les truc importants
|
|
app = Flask(__name__)
|
|
jwt = JWTManager(app)
|
|
|
|
app.config["JWT_SECRET_KEY"] = "super-secret"
|
|
app.config["JWT_TOKEN_LOCATION"] = ["cookies"]
|
|
app.config["JWT_COOKIE_CSRF_PROTECT"] = False
|
|
app.secret_key = "super-secret-flash-key"
|
|
|
|
|
|
@app.route("/login", methods=["GET", "POST"])
|
|
def pageConnection():
|
|
if request.method == "GET":
|
|
return render_template("login.html")
|
|
else:
|
|
login = request.form["login"]
|
|
passw = request.form["pass"]
|
|
|
|
user = verifierUtilisateur(login, passw)
|
|
if user:
|
|
access_token = create_access_token(identity=login)
|
|
|
|
# Rediriger selon le rôle
|
|
if user["role"] == "prof":
|
|
resp = redirect(url_for("dashboardProf"))
|
|
else:
|
|
resp = redirect(url_for("pageNotes"))
|
|
|
|
set_access_cookies(resp, access_token)
|
|
return resp
|
|
else:
|
|
return render_template("login.html", message="Identifiants incorrects")
|
|
|
|
|
|
@app.route("/register", methods=["GET", "POST"])
|
|
def pageInscription():
|
|
if request.method == "GET":
|
|
return render_template("register.html")
|
|
else:
|
|
login = request.form["login"]
|
|
passw = request.form["pass"]
|
|
nom = request.form.get("nom", "")
|
|
prenom = request.form.get("prenom", "")
|
|
|
|
if isLoginAvalaible(login):
|
|
# Par défaut, les inscriptions publiques créent des élèves
|
|
creerUtilisateur(login, passw, "eleve", nom, prenom)
|
|
return render_template("register.html", message="Compte créé")
|
|
else:
|
|
return render_template("register.html", message="Login existe déjà")
|
|
|
|
|
|
##############################
|
|
# #
|
|
# Pages Élèves #
|
|
# #
|
|
##############################
|
|
|
|
|
|
@app.route("/notes", methods=["GET"])
|
|
@jwt_required()
|
|
def pageNotes():
|
|
"""Page de visualisation des notes pour un élève"""
|
|
login = get_jwt_identity()
|
|
user = getUserByLogin(login)
|
|
|
|
# Vérifier que c'est bien un élève
|
|
if not user or user["role"] != "eleve":
|
|
return redirect(url_for("dashboardProf"))
|
|
|
|
notes = afficherNotes(login)
|
|
moyennes_ue = calculerMoyennesParUE(login)
|
|
|
|
return render_template(
|
|
"notes_eleve.html", notes=notes, moyennes_ue=moyennes_ue, user=user
|
|
)
|
|
|
|
|
|
##############################
|
|
# #
|
|
# Pages Professeurs #
|
|
# #
|
|
##############################
|
|
|
|
|
|
@app.route("/prof/dashboard")
|
|
@jwt_required()
|
|
def dashboardProf():
|
|
"""Dashboard principal pour les professeurs"""
|
|
login = get_jwt_identity()
|
|
user = getUserByLogin(login)
|
|
|
|
# Vérifier que c'est bien un prof
|
|
if not user or user["role"] != "prof":
|
|
return redirect(url_for("pageNotes"))
|
|
|
|
return render_template("prof_dashboard.html", user=user)
|
|
|
|
|
|
@app.route("/prof/eleves", methods=["GET"])
|
|
@jwt_required()
|
|
def listeEleves():
|
|
"""Liste et recherche d'élèves"""
|
|
login = get_jwt_identity()
|
|
user = getUserByLogin(login)
|
|
|
|
if not user or user["role"] != "prof":
|
|
return redirect(url_for("pageNotes"))
|
|
|
|
search = request.args.get("search", "")
|
|
eleves = listerEleves(search)
|
|
|
|
return render_template("prof_eleves.html", eleves=eleves, search=search, user=user)
|
|
|
|
|
|
@app.route("/prof/eleves/creer", methods=["GET", "POST"])
|
|
@jwt_required()
|
|
def creerEleveForm():
|
|
"""Formulaire de création d'élève"""
|
|
login = get_jwt_identity()
|
|
user = getUserByLogin(login)
|
|
|
|
if not user or user["role"] != "prof":
|
|
return redirect(url_for("pageNotes"))
|
|
|
|
if request.method == "GET":
|
|
return render_template("prof_creer_eleve.html", user=user)
|
|
|
|
# POST - créer l'élève
|
|
login_eleve = request.form.get("login")
|
|
password = request.form.get("password")
|
|
nom = request.form.get("nom")
|
|
prenom = request.form.get("prenom")
|
|
|
|
if not login_eleve or not password:
|
|
flash("Login et mot de passe requis", "error")
|
|
return render_template("prof_creer_eleve.html", user=user)
|
|
|
|
if not isLoginAvalaible(login_eleve):
|
|
flash("Ce login existe déjà", "error")
|
|
return render_template("prof_creer_eleve.html", user=user)
|
|
|
|
if creerEleve(login_eleve, password, nom or "", prenom or ""):
|
|
flash("Élève créé avec succès", "success")
|
|
return redirect(url_for("listeEleves"))
|
|
else:
|
|
flash("Erreur lors de la création", "error")
|
|
return render_template("prof_creer_eleve.html", user=user)
|
|
|
|
|
|
@app.route("/prof/matieres", methods=["GET"])
|
|
@jwt_required()
|
|
def listeMatieres():
|
|
"""Liste et recherche de matières"""
|
|
login = get_jwt_identity()
|
|
user = getUserByLogin(login)
|
|
|
|
if not user or user["role"] != "prof":
|
|
return redirect(url_for("pageNotes"))
|
|
|
|
search = request.args.get("search", "")
|
|
matieres = listerMatieres(search)
|
|
|
|
return render_template(
|
|
"prof_matieres.html", matieres=matieres, search=search, user=user
|
|
)
|
|
|
|
|
|
@app.route("/prof/ue/creer", methods=["GET", "POST"])
|
|
@jwt_required()
|
|
def creerUEForm():
|
|
"""Formulaire de création d'UE"""
|
|
login = get_jwt_identity()
|
|
user = getUserByLogin(login)
|
|
|
|
if not user or user["role"] != "prof":
|
|
return redirect(url_for("pageNotes"))
|
|
|
|
if request.method == "GET":
|
|
return render_template("prof_creer_ue.html", user=user)
|
|
|
|
code = request.form.get("code")
|
|
nom = request.form.get("nom")
|
|
description = request.form.get("description", "")
|
|
|
|
if not code or not nom:
|
|
flash("Code et nom requis", "error")
|
|
return render_template("prof_creer_ue.html", user=user)
|
|
|
|
if creerUE(code, nom, description):
|
|
flash("UE créée avec succès", "success")
|
|
return redirect(url_for("listeMatieres"))
|
|
else:
|
|
flash("Erreur lors de la création (code déjà existant?)", "error")
|
|
return render_template("prof_creer_ue.html", user=user)
|
|
|
|
|
|
@app.route("/prof/matieres/creer", methods=["GET", "POST"])
|
|
@jwt_required()
|
|
def creerMatiereForm():
|
|
"""Formulaire de création de matière"""
|
|
login = get_jwt_identity()
|
|
user = getUserByLogin(login)
|
|
|
|
if not user or user["role"] != "prof":
|
|
return redirect(url_for("pageNotes"))
|
|
|
|
ues = listerUE()
|
|
|
|
if request.method == "GET":
|
|
return render_template("prof_creer_matiere.html", ues=ues, user=user)
|
|
|
|
code = request.form.get("code")
|
|
nom = request.form.get("nom")
|
|
ue_id = request.form.get("ue_id")
|
|
coefficient = request.form.get("coefficient", 1.0)
|
|
|
|
if not code or not nom or not ue_id:
|
|
flash("Code, nom et UE requis", "error")
|
|
return render_template("prof_creer_matiere.html", ues=ues, user=user)
|
|
|
|
try:
|
|
coefficient = float(coefficient)
|
|
ue_id = int(ue_id)
|
|
except:
|
|
flash("Coefficient ou UE invalide", "error")
|
|
return render_template("prof_creer_matiere.html", ues=ues, user=user)
|
|
|
|
if creerMatiere(code, nom, ue_id, coefficient):
|
|
flash("Matière créée avec succès", "success")
|
|
return redirect(url_for("listeMatieres"))
|
|
else:
|
|
flash("Erreur lors de la création (code déjà existant?)", "error")
|
|
return render_template("prof_creer_matiere.html", ues=ues, user=user)
|
|
|
|
|
|
@app.route("/prof/notes/ajouter", methods=["GET", "POST"])
|
|
@jwt_required()
|
|
def ajouterNoteForm():
|
|
"""Formulaire d'ajout de note"""
|
|
login = get_jwt_identity()
|
|
user = getUserByLogin(login)
|
|
|
|
if not user or user["role"] != "prof":
|
|
return redirect(url_for("pageNotes"))
|
|
|
|
eleves = listerEleves()
|
|
matieres = listerMatieres()
|
|
|
|
if request.method == "GET":
|
|
return render_template(
|
|
"prof_ajouter_note.html", eleves=eleves, matieres=matieres, user=user
|
|
)
|
|
|
|
eleve_id = request.form.get("eleve_id")
|
|
matiere_id = request.form.get("matiere_id")
|
|
note = request.form.get("note")
|
|
|
|
if not eleve_id or not matiere_id or not note:
|
|
flash("Tous les champs sont requis", "error")
|
|
return render_template(
|
|
"prof_ajouter_note.html", eleves=eleves, matieres=matieres, user=user
|
|
)
|
|
|
|
try:
|
|
eleve_id = int(eleve_id)
|
|
matiere_id = int(matiere_id)
|
|
note = float(note)
|
|
except:
|
|
flash("Valeurs invalides", "error")
|
|
return render_template(
|
|
"prof_ajouter_note.html", eleves=eleves, matieres=matieres, user=user
|
|
)
|
|
|
|
if ajouterNoteById(eleve_id, matiere_id, note):
|
|
flash("Note ajoutée avec succès", "success")
|
|
return redirect(url_for("ajouterNoteForm"))
|
|
else:
|
|
flash("Erreur lors de l'ajout de la note", "error")
|
|
return render_template(
|
|
"prof_ajouter_note.html", eleves=eleves, matieres=matieres, user=user
|
|
)
|
|
|
|
|
|
@app.route("/prof/eleves/<int:eleve_id>/notes")
|
|
@jwt_required()
|
|
def voirNotesEleve(eleve_id):
|
|
"""Voir les notes d'un élève spécifique"""
|
|
login = get_jwt_identity()
|
|
user = getUserByLogin(login)
|
|
|
|
if not user or user["role"] != "prof":
|
|
return redirect(url_for("pageNotes"))
|
|
|
|
from bdd.User import getUserById
|
|
|
|
eleve = getUserById(eleve_id)
|
|
|
|
if not eleve or eleve["role"] != "eleve":
|
|
flash("Élève non trouvé", "error")
|
|
return redirect(url_for("listeEleves"))
|
|
|
|
notes = getNotesEleve(eleve_id)
|
|
|
|
return render_template(
|
|
"prof_voir_notes_eleve.html", eleve=eleve, notes=notes, user=user
|
|
)
|
|
|
|
|
|
##############################
|
|
# #
|
|
# Routes communes #
|
|
# #
|
|
##############################
|
|
|
|
|
|
@app.route("/logout", methods=["GET", "POST"])
|
|
@jwt_required()
|
|
def logout():
|
|
resp = Response(render_template("login.html", message="Déconnecté"))
|
|
unset_jwt_cookies(resp)
|
|
return resp
|
|
|
|
|
|
@app.route("/")
|
|
def accueil():
|
|
return render_template("index.html")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app.run(debug=True, host="0.0.0.0")
|