Marketplace, CSS, iCal and a lot of things... #4
|
@ -1,7 +1,12 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from colloscope.models import *
|
from colloscope.models import *
|
||||||
|
|
||||||
admin.site.register(Lycee)
|
|
||||||
|
@admin.register(Lycee)
|
||||||
|
class LyceeAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('uai', 'libelle', 'vacances')
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(Classe)
|
admin.site.register(Classe)
|
||||||
admin.site.register(Periode)
|
admin.site.register(Periode)
|
||||||
admin.site.register(Matiere)
|
admin.site.register(Matiere)
|
||||||
|
@ -10,7 +15,18 @@ admin.site.register(Groupe)
|
||||||
admin.site.register(Etudiant)
|
admin.site.register(Etudiant)
|
||||||
admin.site.register(Appartenance)
|
admin.site.register(Appartenance)
|
||||||
admin.site.register(Colleur)
|
admin.site.register(Colleur)
|
||||||
admin.site.register(Creneau)
|
|
||||||
|
@admin.register(Creneau)
|
||||||
|
class CreneauAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('matiere', 'colleur', "periode", 'view_jour', "heure", "duree")
|
||||||
|
list_filter = ("matiere", "colleur", "periode")
|
||||||
|
|
||||||
|
def view_jour(self, obj):
|
||||||
|
jours = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"]
|
||||||
|
return jours[obj.jour]
|
||||||
|
|
||||||
|
view_jour.short_description = 'Jour'
|
||||||
|
|
||||||
admin.site.register(Rotation)
|
admin.site.register(Rotation)
|
||||||
admin.site.register(Amendement)
|
admin.site.register(Amendement)
|
||||||
admin.site.register(Profil)
|
admin.site.register(Profil)
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
from datetime import date, datetime, timedelta
|
from datetime import date, datetime, timedelta
|
||||||
|
|
||||||
|
from asgiref.sync import async_to_sync
|
||||||
from pytz import timezone
|
from pytz import timezone
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
@ -91,7 +93,7 @@ class Classe(models.Model):
|
||||||
|
|
||||||
return jour
|
return jour
|
||||||
|
|
||||||
async def periode(self, jour):
|
def periode(self, jour):
|
||||||
"""
|
"""
|
||||||
Entrées :
|
Entrées :
|
||||||
- self
|
- self
|
||||||
|
@ -104,9 +106,9 @@ class Classe(models.Model):
|
||||||
- Le jour n'est pas dans une période
|
- Le jour n'est pas dans une période
|
||||||
- Le jour est au chevauchement de deux périodes
|
- Le jour est au chevauchement de deux périodes
|
||||||
"""
|
"""
|
||||||
return Periode.objects.aget(classe=self, debut__lte=jour, fin__gte=jour)
|
return Periode.objects.get(classe=self, debut__lte=jour, fin__gte=jour)
|
||||||
|
|
||||||
async def periode_actuelle(self):
|
def periode_actuelle(self):
|
||||||
#return self.periode(date.today()) // ne fonctionne pas entre les périodes
|
#return self.periode(date.today()) // ne fonctionne pas entre les périodes
|
||||||
"""
|
"""
|
||||||
On prend la période non révolue la plus récente
|
On prend la période non révolue la plus récente
|
||||||
|
@ -115,7 +117,7 @@ class Classe(models.Model):
|
||||||
return Periode.objects \
|
return Periode.objects \
|
||||||
.filter(classe=self, fin__gte=date.today()) \
|
.filter(classe=self, fin__gte=date.today()) \
|
||||||
.order_by("-debut") \
|
.order_by("-debut") \
|
||||||
.afirst()
|
.first()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.libelle} ({self.lycee.libelle})"
|
return f"{self.libelle} ({self.lycee.libelle})"
|
||||||
|
@ -279,6 +281,9 @@ class Creneau(models.Model):
|
||||||
est_colle = models.BooleanField()
|
est_colle = models.BooleanField()
|
||||||
capacite = models.IntegerField()
|
capacite = models.IntegerField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name_plural = "Creneaux"
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
jours = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"]
|
jours = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"]
|
||||||
|
|
||||||
|
@ -356,6 +361,10 @@ class Rotation(models.Model):
|
||||||
amendement = Amendement(rotation=self, etudiant=etudiant, est_positif=est_positif)
|
amendement = Amendement(rotation=self, etudiant=etudiant, est_positif=est_positif)
|
||||||
amendement.save()
|
amendement.save()
|
||||||
|
|
||||||
|
if notifier:
|
||||||
|
func = async_to_sync(amendement.notifier)
|
||||||
|
func()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
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())}"
|
||||||
|
|
||||||
|
@ -387,16 +396,16 @@ class Profil(models.Model):
|
||||||
return f"Profil {self.utilisateur} : {self.etudiant} ; {self.colleur}"
|
return f"Profil {self.utilisateur} : {self.etudiant} ; {self.colleur}"
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def from_request(request, preprocess=lambda query: query):
|
def from_request(request, preprocess=lambda query: query):
|
||||||
user = request.user
|
user = request.user
|
||||||
session = request.session
|
session = request.session
|
||||||
|
|
||||||
match await session.aget("profil"):
|
match session.get("profil"):
|
||||||
case "etudiant":
|
case "etudiant":
|
||||||
profil = await preprocess(Profil.objects.filter(utilisateur=user)).aget()
|
profil = preprocess(Profil.objects.filter(utilisateur=user)).get()
|
||||||
return profil.etudiant
|
return profil.etudiant
|
||||||
case "colleur":
|
case "colleur":
|
||||||
profil = await preprocess(Profil.objects.filter(utilisateur=user)).aget()
|
profil = preprocess(Profil.objects.filter(utilisateur=user)).get()
|
||||||
return profil.colleur
|
return profil.colleur
|
||||||
case _:
|
case _:
|
||||||
raise ValueError("profil non choisi")
|
raise ValueError("profil non choisi")
|
||||||
|
|
|
@ -53,21 +53,21 @@ def choix_profil(request):
|
||||||
return HttpResponse(template.render(context))
|
return HttpResponse(template.render(context))
|
||||||
|
|
||||||
|
|
||||||
async def get_lien_calendrier(etudiant, periode):
|
def get_lien_calendrier(etudiant, periode):
|
||||||
try:
|
try:
|
||||||
lien = await LienCalendrier.objects.aget(etudiant=etudiant, periode=periode)
|
lien = LienCalendrier.objects.get(etudiant=etudiant, periode=periode)
|
||||||
except LienCalendrier.DoesNotExist:
|
except LienCalendrier.DoesNotExist:
|
||||||
code = uuid4().hex
|
code = uuid4().hex
|
||||||
lien = LienCalendrier(code=code, etudiant=etudiant, periode=periode)
|
lien = LienCalendrier(code=code, etudiant=etudiant, periode=periode)
|
||||||
await lien.asave()
|
lien.save()
|
||||||
|
|
||||||
return f"calendrier.ics?key={lien.code}"
|
return f"calendrier.ics?key={lien.code}"
|
||||||
|
|
||||||
|
|
||||||
#@login_required
|
#@login_required
|
||||||
async def dashboard(request):
|
def dashboard(request):
|
||||||
try:
|
try:
|
||||||
etudiant = await Profil.from_request(
|
etudiant = Profil.from_request(
|
||||||
request,
|
request,
|
||||||
preprocess=lambda query: (query
|
preprocess=lambda query: (query
|
||||||
.select_related("etudiant__classe")
|
.select_related("etudiant__classe")
|
||||||
|
@ -79,8 +79,8 @@ async def dashboard(request):
|
||||||
if not isinstance(etudiant, Etudiant):
|
if not isinstance(etudiant, Etudiant):
|
||||||
return HttpResponse("pas encore supporté")
|
return HttpResponse("pas encore supporté")
|
||||||
|
|
||||||
periode = await etudiant.classe.periode_actuelle()
|
periode = etudiant.classe.periode_actuelle()
|
||||||
groupe = await etudiant.groupe_de_colle(periode)
|
groupe = etudiant.groupe_de_colle(periode)
|
||||||
|
|
||||||
rotations = periode.query_rotations_etudiant(etudiant)
|
rotations = periode.query_rotations_etudiant(etudiant)
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ async def dashboard(request):
|
||||||
colles_par_sem[i] = n, lundi, colles
|
colles_par_sem[i] = n, lundi, colles
|
||||||
|
|
||||||
template = loader.get_template("dashboard.html")
|
template = loader.get_template("dashboard.html")
|
||||||
lien_calendrier = await get_lien_calendrier(etudiant, periode)
|
lien_calendrier = get_lien_calendrier(etudiant, periode)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"etudiant": etudiant,
|
"etudiant": etudiant,
|
||||||
|
@ -105,9 +105,9 @@ async def dashboard(request):
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
async def marketplace(request):
|
def marketplace(request):
|
||||||
try:
|
try:
|
||||||
etudiant = await Profil.from_request(
|
etudiant = Profil.from_request(
|
||||||
request,
|
request,
|
||||||
preprocess=lambda query: query \
|
preprocess=lambda query: query \
|
||||||
.select_related("etudiant__classe") \
|
.select_related("etudiant__classe") \
|
||||||
|
|
Loading…
Reference in New Issue