ics permalink
This commit is contained in:
parent
fc0f59d2ec
commit
a057fa6774
|
@ -14,3 +14,4 @@ admin.site.register(Creneau)
|
||||||
admin.site.register(Rotation)
|
admin.site.register(Rotation)
|
||||||
admin.site.register(Amendement)
|
admin.site.register(Amendement)
|
||||||
admin.site.register(Profil)
|
admin.site.register(Profil)
|
||||||
|
admin.site.register(LienCalendrier)
|
||||||
|
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -362,3 +362,16 @@ class Profil(models.Model):
|
||||||
return profil.colleur
|
return profil.colleur
|
||||||
case _:
|
case _:
|
||||||
raise ValueError("profil non choisi")
|
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'
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
|
@ -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>
|
<p>Période actuelle : {{ periode }}. Votre groupe de colle est {{ groupe }}. <a href="table.html">Consulter le colloscope</a></p>
|
||||||
|
|
||||||
<h2>Mes colles</h2>
|
<h2>Mes colles</h2>
|
||||||
<a href="calendrier.ics">Exporter en .ics</a>
|
<a href="{{ lien_calendrier }}">Exporter en .ics</a>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
{% for n, lundi, colles in rotations %}
|
{% for n, lundi, colles in rotations %}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from datetime import date, timedelta
|
from datetime import date, timedelta
|
||||||
|
from uuid import uuid4
|
||||||
|
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
|
@ -51,6 +52,18 @@ def choix_profil(request):
|
||||||
}
|
}
|
||||||
return HttpResponse(template.render(context))
|
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
|
@login_required
|
||||||
def dashboard(request):
|
def dashboard(request):
|
||||||
user = request.user
|
user = request.user
|
||||||
|
@ -73,12 +86,14 @@ def dashboard(request):
|
||||||
groupe = etudiant.groupe_de_colle(periode)
|
groupe = etudiant.groupe_de_colle(periode)
|
||||||
rotations = groupe.get_colles_par_sem()
|
rotations = groupe.get_colles_par_sem()
|
||||||
template = loader.get_template("dashboard.html")
|
template = loader.get_template("dashboard.html")
|
||||||
|
lien_calendrier = get_lien_calendrier(etudiant, periode)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"etudiant": etudiant,
|
"etudiant": etudiant,
|
||||||
"periode": periode,
|
"periode": periode,
|
||||||
"groupe": groupe,
|
"groupe": groupe,
|
||||||
"rotations" : rotations,
|
"rotations" : rotations,
|
||||||
|
"lien_calendrier": lien_calendrier,
|
||||||
}
|
}
|
||||||
|
|
||||||
return HttpResponse(template.render(context, request))
|
return HttpResponse(template.render(context, request))
|
||||||
|
@ -155,29 +170,27 @@ def colloscope(request):
|
||||||
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
|
|
||||||
|
|
||||||
|
def get_lien_calendrier(etudiant, periode):
|
||||||
try:
|
try:
|
||||||
etudiant = Profil.from_request(
|
lien = LienCalendrier.objects.get(etudiant=etudiant, periode=periode)
|
||||||
request,
|
except LienCalendrier.DoesNotExist:
|
||||||
preprocess=lambda query: query \
|
code = uuid4().hex
|
||||||
.select_related("etudiant__classe") \
|
lien = LienCalendrier(code=code, etudiant=etudiant, periode=periode)
|
||||||
.prefetch_related("etudiant__classe__periode_set")
|
lien.save()
|
||||||
)
|
|
||||||
except ValueError:
|
|
||||||
return redirect("colloscope.choix_profil")
|
|
||||||
|
|
||||||
if not isinstance(etudiant, Etudiant):
|
return f"calendrier.ics?key={lien.code}"
|
||||||
return HttpResponse("pas encore supporté")
|
|
||||||
|
|
||||||
periode = etudiant.classe.periode_actuelle()
|
|
||||||
|
|
||||||
return HttpResponse(to_calendar(etudiant, periode).to_ical(), content_type="text/calendar")
|
|
||||||
|
|
||||||
|
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):
|
def data_dump(request):
|
||||||
template = loader.get_template("data_dump.html")
|
template = loader.get_template("data_dump.html")
|
||||||
|
|
Loading…
Reference in New Issue