Marketplace, CSS, iCal and a lot of things... #4
|
@ -0,0 +1,50 @@
|
||||||
|
from datetime import date, time, datetime, timedelta
|
||||||
|
from pytz import timezone
|
||||||
|
|
||||||
|
from icalendar import Calendar, Event, vCalAddress, vText
|
||||||
|
|
||||||
|
from colloscope.models import *
|
||||||
|
|
||||||
|
|
||||||
|
def to_calendar(etudiant, periode):
|
||||||
|
cal = Calendar()
|
||||||
|
|
||||||
|
cal.add("prodid", "-//Colloscope//colles.mp2i-vms.fr//")
|
||||||
|
cal.add("version", "2.0")
|
||||||
|
|
||||||
|
rotations = Rotation.objects \
|
||||||
|
.filter(groupes__membres=etudiant) \
|
||||||
|
.select_related("creneau__periode__classe__lycee") \
|
||||||
|
.select_related("creneau__matiere") \
|
||||||
|
.select_related("creneau__colleur") \
|
||||||
|
|
||||||
|
for rotation in rotations:
|
||||||
|
event = Event()
|
||||||
|
event.add("name", "Colle")
|
||||||
|
event.add("summary", str(rotation))
|
||||||
|
|
||||||
|
start = rotation.datetime()
|
||||||
|
fin = start + rotation.creneau.duree
|
||||||
|
|
||||||
|
event.add("dtstart", start)
|
||||||
|
event.add("dtend", fin)
|
||||||
|
event.add("dtstamp", datetime.now())
|
||||||
|
|
||||||
|
event.add("location", f"{rotation.creneau.salle} ({rotation.creneau.periode.classe.lycee})")
|
||||||
|
event.add("matiere", str(rotation.creneau.matiere))
|
||||||
|
|
||||||
|
organizer = vCalAddress("mailto:unknown@mp2i-vms.fr")
|
||||||
|
organizer.params["cn"] = vText(str(rotation.creneau.colleur))
|
||||||
|
organizer.params["role"] = vText("Colleur")
|
||||||
|
event.add("organizer", organizer)
|
||||||
|
|
||||||
|
for e in rotation.groupe_effectif():
|
||||||
|
attendee = vCalAddress("mailto:unknown@mp2i-vms.fr")
|
||||||
|
attendee.params["cn"] = vText(str(e))
|
||||||
|
attendee.params["role"] = vText("Etudiant")
|
||||||
|
|
||||||
|
event.add("attendee", attendee, encode=0)
|
||||||
|
|
||||||
|
cal.add_component(event)
|
||||||
|
|
||||||
|
return cal
|
|
@ -1,4 +1,5 @@
|
||||||
from datetime import date, datetime, timedelta
|
from datetime import date, datetime, timedelta
|
||||||
|
from pytz import timezone
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models import F, Q
|
from django.db.models import F, Q
|
||||||
|
@ -21,8 +22,8 @@ class Lycee(models.Model):
|
||||||
libelle = models.CharField(max_length=100)
|
libelle = models.CharField(max_length=100)
|
||||||
vacances = models.CharField(max_length=1)
|
vacances = models.CharField(max_length=1)
|
||||||
|
|
||||||
def __self__(self):
|
def __str__(self):
|
||||||
return self.uai
|
return self.libelle
|
||||||
|
|
||||||
|
|
||||||
class Classe(models.Model):
|
class Classe(models.Model):
|
||||||
|
@ -329,6 +330,10 @@ class Rotation(models.Model):
|
||||||
return f"{self.creneau} le {self.date} avec groupes {'+'.join(str(groupe) for groupe in self.groupes.all())}"
|
return f"{self.creneau} le {self.date} avec groupes {'+'.join(str(groupe) for groupe in self.groupes.all())}"
|
||||||
|
|
||||||
|
|
||||||
|
def datetime(self):
|
||||||
|
return datetime.combine( self.date, self.creneau.heure, tzinfo=timezone("Europe/Paris") )
|
||||||
|
|
||||||
|
|
||||||
class Amendement(models.Model):
|
class Amendement(models.Model):
|
||||||
est_positif = models.BooleanField()
|
est_positif = models.BooleanField()
|
||||||
rotation = models.ForeignKey(Rotation, on_delete=models.CASCADE)
|
rotation = models.ForeignKey(Rotation, on_delete=models.CASCADE)
|
||||||
|
|
|
@ -6,5 +6,6 @@ urlpatterns = [
|
||||||
path("table.html", views.colloscope, name="colloscope.table"),
|
path("table.html", views.colloscope, name="colloscope.table"),
|
||||||
path("dashboard.html", views.dashboard, name="colloscope.dashboard"),
|
path("dashboard.html", views.dashboard, name="colloscope.dashboard"),
|
||||||
path("export.pdf", views.export, name="colloscope.export"),
|
path("export.pdf", views.export, name="colloscope.export"),
|
||||||
|
path("calendrier.ics", views.icalendar, name="colloscope.calendrier"),
|
||||||
path("choix_profil", views.choix_profil, name="colloscope.choix_profil"),
|
path("choix_profil", views.choix_profil, name="colloscope.choix_profil"),
|
||||||
]
|
]
|
||||||
|
|
|
@ -8,6 +8,7 @@ from django.contrib.auth.decorators import login_required
|
||||||
from colloscope.models import *
|
from colloscope.models import *
|
||||||
from colloscope.table import table_colloscope
|
from colloscope.table import table_colloscope
|
||||||
from colloscope.pdfexport import handle
|
from colloscope.pdfexport import handle
|
||||||
|
from colloscope.icalexport import to_calendar
|
||||||
|
|
||||||
|
|
||||||
def handler404(request):
|
def handler404(request):
|
||||||
|
@ -150,9 +151,34 @@ def colloscope(request):
|
||||||
return HttpResponse(template.render(context, request))
|
return HttpResponse(template.render(context, request))
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
def export(request):
|
def export(request):
|
||||||
return HttpResponse(bytes(handle(request).output()), content_type="application/pdf")
|
return HttpResponse(bytes(handle(request).output()), content_type="application/pdf")
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def icalendar(request):
|
||||||
|
user = request.user
|
||||||
|
session = request.session
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
return HttpResponse(to_calendar(etudiant, periode).to_ical(), content_type="text/calendar")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def data_dump(request):
|
def data_dump(request):
|
||||||
template = loader.get_template("data_dump.html")
|
template = loader.get_template("data_dump.html")
|
||||||
return HttpResponse(template.render())
|
return HttpResponse(template.render())
|
||||||
|
|
Loading…
Reference in New Issue