colles.mp2i-vms.fr/colloscope/views.py

273 lines
8.3 KiB
Python

from datetime import date, timedelta
from uuid import uuid4
from django.contrib.auth.models import User
from django.shortcuts import redirect
from django.http import HttpResponse
from django.template import loader
from django.contrib.auth.decorators import login_required
from colloscope.models import *
from colloscope.table import table_colloscope
from colloscope.pdfexport import handle
from colloscope.icalexport import to_calendar
def handler404(request):
template = loader.get_template("404.html")
#response.status_code = 404
context = {}
return HttpResponse(template.render(context))
def home_redirect(request):
return redirect("/colloscope/dashboard.html")
@login_required
def choix_profil(request):
user = request.user
session = request.session
if not Profil.objects.filter(utilisateur=user).exists():
profil = Profil(utilisateur=user)
profil.save()
else:
profil = Profil.objects.get(utilisateur=user)
if profil.etudiant is not None and profil.colleur is None:
session["profil"] = "etudiant"
return redirect("/colloscope/")
elif profil.colleur is not None and profil.etudiant is None:
session["profil"] = "colleur"
return redirect("/colloscope/")
else:
if profil.etudiant is not None:
template = loader.get_template("choix_profil.html")
else:
template = loader.get_template("profil_non_associe.html")
context = {
"profil": profil,
}
return HttpResponse(template.render(context))
def get_lien_calendrier(etudiant, periode):
try:
lien = LienCalendrier.objects.get(etudiant=etudiant, periode=periode)
except LienCalendrier.DoesNotExist:
code = uuid4().hex
lien = LienCalendrier(code=code, etudiant=etudiant, periode=periode)
lien.save()
return f"calendrier.ics?key={lien.code}"
@login_required
def dashboard(request):
try:
etudiant = Profil.from_request(
request,
preprocess=lambda query: query \
.select_related("etudiant__classe") \
.prefetch_related("etudiant__classe__periode_set")
)
except ValueError:
return redirect("colloscope.choix_profil")
if not isinstance(etudiant, Etudiant):
return HttpResponse("pas encore supporté")
periode = etudiant.classe.periode_actuelle()
groupe = etudiant.groupe_de_colle(periode)
rotations = periode.query_rotations_etudiant(etudiant)
colles_par_sem = [None] * len(periode.range_semaines())
for i, n in enumerate(periode.range_semaines()):
lundi = periode.classe.date_debut_sem(n)
colles = rotations.filter(date__gte=lundi, date__lt=lundi+timedelta(weeks=1))
colles_par_sem[i] = n, lundi, colles
template = loader.get_template("dashboard.html")
lien_calendrier = get_lien_calendrier(etudiant, periode)
context = {
"etudiant": etudiant,
"periode": periode,
"groupe": groupe,
"rotations": colles_par_sem,
"lien_calendrier": lien_calendrier,
}
return HttpResponse(template.render(context, request))
@login_required
def marketplace(request):
try:
etudiant = Profil.from_request(
request,
preprocess=lambda query: query \
.select_related("etudiant__classe") \
.prefetch_related("etudiant__classe__periode_set")
)
except ValueError:
return redirect("colloscope.choix_profil")
if not isinstance(etudiant, Etudiant):
return HttpResponse("pas encore supporté")
periode = etudiant.classe.periode_actuelle()
colles = periode.query_rotations_not_full()
template = loader.get_template("marketplace.html")
context = {
"colles" : colles
}
return HttpResponse(template.render(context, request))
@login_required
def colloscope(request):
try:
etudiant = Profil.from_request(
request,
preprocess=lambda query: query \
.select_related("etudiant__classe") \
.prefetch_related("etudiant__classe__periode_set")
)
except ValueError:
return redirect("colloscope.choix_profil")
if not isinstance(etudiant, Etudiant):
return HttpResponse("pas encore supporté")
periode_str = request.GET.get("periode")
if periode_str is None:
periode = etudiant.classe.periode_actuelle()
else:
try:
periode = Periode.objects.get(id=int(periode_str), classe=etudiant.classe)
except Periode.DoesNotExist:
template = loader.get_template("404.html")
context = {}
response = HttpResponse(template.render(context, request))
response.status_code = 404
creneaux = Creneau.objects \
.filter(periode=periode, est_colle=True) \
.prefetch_related("rotation_set")
semaines = periode.range_semaines()
rotations = [(c, []) for c in creneaux]
for c, l in rotations:
for sem in semaines:
lundi = periode.classe.date_debut_sem(sem)
rot = Rotation.objects.filter(creneau=c, date__gte=lundi, date__lt=lundi + timedelta(weeks=1))
exists = rot.exists()
if exists:
r = rot.first()
est_modifiee = r.est_modifiee()
groupes = (g.libelle for g in r.groupes.all())
else:
r = est_modifiee = groupes = None
l.append((sem, exists, r, est_modifiee, groupes))
template = loader.get_template("table.html")
context = {
"periode": periode,
"semaines": semaines,
"lundis": [periode.classe.date_debut_sem(n) for n in semaines],
"jours": ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"],
"rotations": rotations,
}
return HttpResponse(template.render(context, request))
@login_required
def export(request):
return HttpResponse(bytes(handle(request).output()), content_type="application/pdf")
def get_lien_calendrier(etudiant, periode):
try:
lien = LienCalendrier.objects.get(etudiant=etudiant, periode=periode)
except LienCalendrier.DoesNotExist:
code = uuid4().hex
lien = LienCalendrier(code=code, etudiant=etudiant, periode=periode)
lien.save()
return f"calendrier.ics?key={lien.code}"
def icalendar(request):
if request.GET.get("key") is not None:
try:
lien = LienCalendrier.objects.get(code=request.GET.get("key"))
if not request.GET.get("edt"):
return HttpResponse(to_calendar(lien.etudiant, lien.periode, include_EDT=True).to_ical(),
content_type="text/calendar")
return HttpResponse(to_calendar(lien.etudiant, lien.periode, include_EDT=True).to_ical(),
content_type="text/calendar")
except LienCalendrier.DoesNotExist:
return HttpResponse("Invalid key", status=404)
else:
return HttpResponse("Unspecified key", status=404)
@login_required
def amender(request, colle_id, est_positif):
try:
etudiant = Profil.from_request(
request,
preprocess=lambda query: query \
.select_related("etudiant__classe") \
.prefetch_related("etudiant__classe__periode_set")
)
except ValueError:
return redirect("colloscope.choix_profil")
if not isinstance(etudiant, Etudiant):
return HttpResponse("pas encore supporté")
#try:
if est_positif:
(Rotation.objects
.get(id=colle_id, creneau__periode__classe=etudiant.classe)
.amender(est_positif=True, etudiant=etudiant, notifier=True))
else:
(Rotation.objects
.get(id=colle_id, groupes__etudiant=etudiant)
.amender(est_positif=False, etudiant=etudiant, notifier=True))
return HttpResponse("ok")
#except Exception as e:
# return HttpResponse(f"aïe : {e}")
@login_required
def inscription(request, colle_id):
return amender(request, colle_id, True)
@login_required
def desinscription(request, colle_id):
return amender(request, colle_id, False)
def data_dump(request):
template = loader.get_template("data_dump.html")
return HttpResponse(template.render())