ics permalink

This commit is contained in:
Valentin Moguérou 2024-04-20 03:23:29 +02:00
parent 14f1ff841e
commit 42638a082b
8 changed files with 156 additions and 22 deletions

View File

@ -14,3 +14,4 @@ admin.site.register(Creneau)
admin.site.register(Rotation)
admin.site.register(Amendement)
admin.site.register(Profil)
admin.site.register(LienCalendrier)

View File

@ -0,0 +1,47 @@
# Generated by Django 5.0.4 on 2024-04-20 00:53
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('colloscope', '0007_profil_delete_utilisateur'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.RemoveField(
model_name='profil',
name='id',
),
migrations.AlterField(
model_name='profil',
name='colleur',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='colloscope.colleur'),
),
migrations.AlterField(
model_name='profil',
name='etudiant',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='colloscope.etudiant'),
),
migrations.AlterField(
model_name='profil',
name='utilisateur',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL),
),
migrations.CreateModel(
name='LienCalendrier',
fields=[
('code', models.CharField(max_length=50, primary_key=True, serialize=False)),
('etudiant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.etudiant')),
('periode', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.periode')),
],
),
migrations.AddConstraint(
model_name='liencalendrier',
constraint=models.UniqueConstraint(fields=('etudiant', 'periode'), name='unique_etudiant_periode_combination'),
),
]

View File

@ -0,0 +1,24 @@
# Generated by Django 5.0.4 on 2024-04-20 01:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('colloscope', '0008_remove_profil_id_alter_profil_colleur_and_more'),
]
operations = [
migrations.AddField(
model_name='liencalendrier',
name='id',
field=models.BigAutoField(auto_created=True, default=1, primary_key=True, serialize=False, verbose_name='ID'),
preserve_default=False,
),
migrations.AlterField(
model_name='liencalendrier',
name='code',
field=models.CharField(max_length=50),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 5.0.4 on 2024-04-20 01:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('colloscope', '0009_liencalendrier_id_alter_liencalendrier_code'),
]
operations = [
migrations.AlterField(
model_name='liencalendrier',
name='code',
field=models.CharField(max_length=50, unique=True),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 5.0.4 on 2024-04-20 01:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('colloscope', '0010_alter_liencalendrier_code'),
]
operations = [
migrations.AlterField(
model_name='liencalendrier',
name='code',
field=models.CharField(max_length=32, unique=True),
),
]

View File

@ -362,3 +362,16 @@ class Profil(models.Model):
return profil.colleur
case _:
raise ValueError("profil non choisi")
class LienCalendrier(models.Model):
code = models.CharField(max_length=32, unique=True)
etudiant = models.ForeignKey(Etudiant, on_delete=models.CASCADE)
periode = models.ForeignKey(Periode, on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['etudiant', 'periode'], name='unique_etudiant_periode_combination'
)
]

View File

@ -13,7 +13,7 @@ Bienvenue {{ etudiant }}. Votre lycée est {{ periode.classe.lycee.libelle }}, e
<p>Période actuelle : {{ periode }}. Votre groupe de colle est {{ groupe }}. <a href="table.html">Consulter le colloscope</a></p>
<h2>Mes colles</h2>
<a href="calendrier.ics">Exporter en .ics</a>
<a href="{{ lien_calendrier }}">Exporter en .ics</a>
<ul>
{% for n, lundi, colles in rotations %}

View File

@ -1,4 +1,5 @@
from datetime import date, timedelta
from uuid import uuid4
from django.shortcuts import redirect
from django.http import HttpResponse
@ -51,6 +52,18 @@ def choix_profil(request):
}
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):
user = request.user
@ -73,12 +86,14 @@ def dashboard(request):
groupe = etudiant.groupe_de_colle(periode)
rotations = groupe.get_colles_par_sem()
template = loader.get_template("dashboard.html")
lien_calendrier = get_lien_calendrier(etudiant, periode)
context = {
"etudiant": etudiant,
"periode": periode,
"groupe": groupe,
"rotations" : rotations,
"lien_calendrier": lien_calendrier,
}
return HttpResponse(template.render(context, request))
@ -155,29 +170,27 @@ def colloscope(request):
def export(request):
return HttpResponse(bytes(handle(request).output()), content_type="application/pdf")
@login_required
def icalendar(request):
user = request.user
session = request.session
def get_lien_calendrier(etudiant, periode):
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")
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"))
return HttpResponse(to_calendar(lien.etudiant, lien.periode).to_ical(), content_type="text/calendar")
except LienCalendrier.DoesNotExist:
return HttpResponse("Invalid key", status_code=404)
else:
return icalendar_aux(request)
def data_dump(request):
template = loader.get_template("data_dump.html")