Merge branch 'develop'

This commit is contained in:
Luc SORIGNET
2024-12-16 10:20:17 +01:00
5 changed files with 81 additions and 17 deletions

View File

@ -1,11 +1,12 @@
from django.db.models.signals import post_save, post_delete, m2m_changed
from django.dispatch import receiver
from django.core.cache import cache
from GestionInscriptions.models import FicheInscription, Eleve, Responsable
from GestionLogin.models import Profil
from N3wtSchool import settings
from N3wtSchool.redis_client import redis_client
import logging
logger = logging.getLogger(__name__)
def clear_cache():
# Préfixes des clés à supprimer
@ -14,10 +15,10 @@ def clear_cache():
for prefix in prefixes:
# Utiliser le motif pour obtenir les clés correspondant au préfixe
pattern = f'*{prefix}*'
print(f'pattern : {pattern}')
logger.debug(f'pattern : {pattern}')
for key in redis_client.scan_iter(pattern):
redis_client.delete(key)
print(f'deleting : {key}')
logger.debug(f'deleting : {key}')
@receiver(post_save, sender=FicheInscription)
@receiver(post_delete, sender=FicheInscription)
@ -26,9 +27,9 @@ def clear_cache_after_change(sender, instance, **kwargs):
@receiver(m2m_changed, sender=Eleve.responsables.through)
def check_orphan_reponsables(sender, **kwargs):
action = kwargs.pop('action', None)
action = kwargs.pop('action', None)
instance = kwargs.pop('instance', None)
# pre_clear : lors de la suppression d'une FI (on fait un "clear" sur chaque relation)
# pre_clear : lors de la suppression d'une FI (on fait un "clear" sur chaque relation)
if action in ('post_remove', 'post_clear'):
if instance.responsables.all():
Responsable.objects.filter(eleve=None).delete()
@ -37,7 +38,7 @@ def check_orphan_reponsables(sender, **kwargs):
def check_orphan_profils(sender, **kwargs):
action = kwargs.pop('action', None)
instance = kwargs.pop('instance', None)
# pre_clear : lors de la suppression d'une FI (on fait un "clear" sur chaque relation)
# pre_clear : lors de la suppression d'une FI (on fait un "clear" sur chaque relation)
if action in ('post_remove', 'post_clear'):
if instance.profils.all():
Profil.objects.filter(eleve=None).delete()

View File

@ -8,7 +8,6 @@ from N3wtSchool import settings, bdd
import requests
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
@shared_task
def check_for_signature_deadlines():
@ -17,12 +16,12 @@ def check_for_signature_deadlines():
# deadline = now - timezone.timedelta(seconds=settings.EXPIRATION_DI_NB_DAYS)
dossiers_en_attente = FicheInscription.objects.filter(etat=FicheInscription.EtatDossierInscription.DI_ENVOYE, dateMAJ__lt=deadline)
for dossier in dossiers_en_attente:
send_notification(dossier)
def send_notification(dossier):
print(f'Dossier en attente.... {dossier} - Positionnement à l\'état A_RELANCER')
logger.debug(f'Dossier en attente.... {dossier} - Positionnement à l\'état A_RELANCER')
# Changer l'état de l'automate
updateStateMachine(dossier, 'relanceDI')
@ -32,7 +31,7 @@ def send_notification(dossier):
destinataires = dossier.eleve.profils.all()
for destinataire in destinataires:
message = {
"objet": "[RELANCE]",
"objet": "[RELANCE]",
"destinataire" : destinataire.id,
"corpus": "RELANCE pour le dossier d'inscription"
}

View File

@ -2,10 +2,12 @@ import logging
from django.db.models import Q
from GestionInscriptions.models import FicheInscription, Profil, Eleve
logger = logging.getLogger('N3wtSchool')
def getAllObjects(_objectName):
result = _objectName.objects.all()
if not result:
logging.warning("Aucun résultat n'a été trouvé - " + _objectName.__name__)
logger.warning("Aucun résultat n'a été trouvé - " + _objectName.__name__)
return result
def getObject(_objectName, _columnName, _value):
@ -13,7 +15,7 @@ def getObject(_objectName, _columnName, _value):
try :
result = _objectName.objects.get(**{_columnName: _value})
except _objectName.DoesNotExist:
logging.error("Aucun résultat n'a été trouvé - " + _objectName.__name__ + " (" + _columnName + "=" + str(_value) + ")")
logger.error("Aucun résultat n'a été trouvé - " + _objectName.__name__ + " (" + _columnName + "=" + str(_value) + ")")
return result
@ -22,7 +24,7 @@ def getObjects(_objectName, _columnName, _value, _reverseCondition=False):
try :
results = _objectName.objects.filter(**{_columnName: _value}) if _reverseCondition == False else _objectName.objects.filter(~Q(**{_columnName: _value}))
except _objectName.DoesNotExist:
logging.error("Aucun résultat n'a été trouvé - " + _objectName.__name__ + " (" + _columnName + "=" + str(_value) + ")")
logger.error("Aucun résultat n'a été trouvé - " + _objectName.__name__ + " (" + _columnName + "=" + str(_value) + ")")
return results
@ -53,7 +55,7 @@ def getLastId(_object):
try:
result = _object.objects.latest('id').id
except:
logging.warning("Aucun résultat n'a été trouvé - ")
logger.warning("Aucun résultat n'a été trouvé - ")
return result
def searchObjects(_objectName, _searchTerm=None, _excludeStates=None):

View File

@ -55,7 +55,7 @@ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware', # Déplacez ici, avant CorsMiddleware
'corsheaders.middleware.CorsMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
@ -92,6 +92,68 @@ SESSION_CACHE_ALIAS = 'default'
WSGI_APPLICATION = 'N3wtSchool.wsgi.application'
#LOGGING
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": { # Ajout des formateurs
"verbose": {
"format": "{asctime} [{levelname}] [{name}] {module}.{funcName} - {message}",
"style": "{",
"datefmt": "%Y-%m-%d %H:%M:%S"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "verbose", # Utilisation du formateur
},
},
"root": {
"handlers": ["console"],
"level": os.getenv("ROOT_LOG_LEVEL", "INFO"),
},
"loggers": {
"celery": {
"handlers": ["console"],
"level": os.getenv("CELERY_LOG_LEVEL", "INFO"),
"propagate": False,
},
"N3wtSchool": {
"handlers": ["console"],
"level": os.getenv("N3WTSCHOOL_LOG_LEVEL", "INFO"),
"propagate": False,
},
"GestionNotification": {
"handlers": ["console"],
"level": os.getenv("GESTION_NOTIFICATION_LOG_LEVEL", "INFO"),
"propagate": False,
},
"GestionLogin": {
"handlers": ["console"],
"level": os.getenv("GESTION_LOGIN_LOG_LEVEL", "INFO"),
"propagate": False,
},
"GestionInscriptions": {
"handlers": ["console"],
"level": os.getenv("GESTION_INSCRIPTIONS_LOG_LEVEL", "DEBUG"),
"propagate": False,
},
"GestionMessagerie": {
"handlers": ["console"],
"level": os.getenv("GESTION_MESSAGERIE_LOG_LEVEL", "INFO"),
"propagate": False,
},
"GestionEnseignants": {
"handlers": ["console"],
"level": os.getenv("GESTION_ENSEIGNANTS_LOG_LEVEL", "INFO"),
"propagate": False,
},
},
}
# Password validation
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators

View File

@ -19,12 +19,12 @@ from django.urls import include, path, re_path
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from __version__ import __version__
schema_view = get_schema_view(
openapi.Info(
title="N3wtSchool API",
default_version='v1',
default_version=__version__,
description="Documentation de l'API de N3wtSchool",
terms_of_service="https://www.google.com/policies/terms/",
contact=openapi.Contact(email="contact@example.com"),