ics permalink
This commit is contained in:
parent
14f1ff841e
commit
42638a082b
|
@ -14,3 +14,4 @@ admin.site.register(Creneau)
|
|||
admin.site.register(Rotation)
|
||||
admin.site.register(Amendement)
|
||||
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
|
||||
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'
|
||||
)
|
||||
]
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue