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.db.models.signals import post_save, post_delete, m2m_changed
from django.dispatch import receiver from django.dispatch import receiver
from django.core.cache import cache from django.core.cache import cache
from GestionInscriptions.models import FicheInscription, Eleve, Responsable from GestionInscriptions.models import FicheInscription, Eleve, Responsable
from GestionLogin.models import Profil from GestionLogin.models import Profil
from N3wtSchool import settings from N3wtSchool import settings
from N3wtSchool.redis_client import redis_client from N3wtSchool.redis_client import redis_client
import logging
logger = logging.getLogger(__name__)
def clear_cache(): def clear_cache():
# Préfixes des clés à supprimer # Préfixes des clés à supprimer
@ -14,10 +15,10 @@ def clear_cache():
for prefix in prefixes: for prefix in prefixes:
# Utiliser le motif pour obtenir les clés correspondant au préfixe # Utiliser le motif pour obtenir les clés correspondant au préfixe
pattern = f'*{prefix}*' pattern = f'*{prefix}*'
print(f'pattern : {pattern}') logger.debug(f'pattern : {pattern}')
for key in redis_client.scan_iter(pattern): for key in redis_client.scan_iter(pattern):
redis_client.delete(key) redis_client.delete(key)
print(f'deleting : {key}') logger.debug(f'deleting : {key}')
@receiver(post_save, sender=FicheInscription) @receiver(post_save, sender=FicheInscription)
@receiver(post_delete, 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) @receiver(m2m_changed, sender=Eleve.responsables.through)
def check_orphan_reponsables(sender, **kwargs): def check_orphan_reponsables(sender, **kwargs):
action = kwargs.pop('action', None) action = kwargs.pop('action', None)
instance = kwargs.pop('instance', 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 action in ('post_remove', 'post_clear'):
if instance.responsables.all(): if instance.responsables.all():
Responsable.objects.filter(eleve=None).delete() Responsable.objects.filter(eleve=None).delete()
@ -37,7 +38,7 @@ def check_orphan_reponsables(sender, **kwargs):
def check_orphan_profils(sender, **kwargs): def check_orphan_profils(sender, **kwargs):
action = kwargs.pop('action', None) action = kwargs.pop('action', None)
instance = kwargs.pop('instance', 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 action in ('post_remove', 'post_clear'):
if instance.profils.all(): if instance.profils.all():
Profil.objects.filter(eleve=None).delete() Profil.objects.filter(eleve=None).delete()

View File

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

View File

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

View File

@ -55,7 +55,7 @@ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware', # Déplacez ici, avant CorsMiddleware 'django.middleware.common.CommonMiddleware', # Déplacez ici, avant CorsMiddleware
'corsheaders.middleware.CorsMiddleware', 'corsheaders.middleware.CorsMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
@ -92,6 +92,68 @@ SESSION_CACHE_ALIAS = 'default'
WSGI_APPLICATION = 'N3wtSchool.wsgi.application' 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 # Password validation
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators # 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 rest_framework import permissions
from drf_yasg.views import get_schema_view from drf_yasg.views import get_schema_view
from drf_yasg import openapi from drf_yasg import openapi
from __version__ import __version__
schema_view = get_schema_view( schema_view = get_schema_view(
openapi.Info( openapi.Info(
title="N3wtSchool API", title="N3wtSchool API",
default_version='v1', default_version=__version__,
description="Documentation de l'API de N3wtSchool", description="Documentation de l'API de N3wtSchool",
terms_of_service="https://www.google.com/policies/terms/", terms_of_service="https://www.google.com/policies/terms/",
contact=openapi.Contact(email="contact@example.com"), contact=openapi.Contact(email="contact@example.com"),