diff --git a/Back-End/GestionInscriptions/signals.py b/Back-End/GestionInscriptions/signals.py index b1d2bcc..909148f 100644 --- a/Back-End/GestionInscriptions/signals.py +++ b/Back-End/GestionInscriptions/signals.py @@ -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() diff --git a/Back-End/GestionInscriptions/tasks.py b/Back-End/GestionInscriptions/tasks.py index cae2266..b43ef68 100644 --- a/Back-End/GestionInscriptions/tasks.py +++ b/Back-End/GestionInscriptions/tasks.py @@ -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" } diff --git a/Back-End/N3wtSchool/bdd.py b/Back-End/N3wtSchool/bdd.py index ef24b59..50ffbe8 100644 --- a/Back-End/N3wtSchool/bdd.py +++ b/Back-End/N3wtSchool/bdd.py @@ -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, _excludeState=None): @@ -82,5 +84,5 @@ def searchObjects(_objectName, _searchTerm, _excludeState=None): return query.order_by('eleve__nom', 'eleve__prenom') except _objectName.DoesNotExist: - logging.error(f"Aucun résultat n'a été trouvé - {_objectName.__name__} (recherche: {_searchTerm})") + logger.error(f"Aucun résultat n'a été trouvé - {_objectName.__name__} (recherche: {_searchTerm})") return None \ No newline at end of file diff --git a/Back-End/N3wtSchool/settings.py b/Back-End/N3wtSchool/settings.py index 24e93e4..75c2b88 100644 --- a/Back-End/N3wtSchool/settings.py +++ b/Back-End/N3wtSchool/settings.py @@ -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 diff --git a/Back-End/N3wtSchool/urls.py b/Back-End/N3wtSchool/urls.py index 3754cd8..639494f 100644 --- a/Back-End/N3wtSchool/urls.py +++ b/Back-End/N3wtSchool/urls.py @@ -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"),