from django.db.transaction import atomic from django.http import Http404 from rest_framework.exceptions import APIException from rest_framework.permissions import IsAdminUser, IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from django.db.models import Q import datetime from typing import Any, List, Tuple, Union from ..utils_extraction import to_table_pam from ..utils.alimentation_decorators import (data_perf_logger_factory, get_data_logger) from ..utils.decorators import execution_time, query_count from ..utils_insertion import insert_PAM from ..models import Administres_Pams, Postes_Pams,Calcul, Poste, PAM, StatutPamChoices as StatutPam, AvisPosteChoices from ..utils.insertion.commun import batch_iterator class AlimentationPamView(APIView): """ Vue pour charger un nouveau PAM """ permission_classes = [IsAuthenticated, IsAdminUser] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.logger = get_data_logger(self) def get(self, request): try: self.logger.debug('Début de la mise à jour de la table PAM, veuillez patienter...') # today = datetime.date(2023,1,1) today = datetime.datetime.now() insert_PAM(to_table_pam(today)) self.logger.debug('Insertion/Mise à jour de la table PAM --------------------------------------------> Success') annee_pam = PAM.objects.filter(pam_statut='PAM en cours')[0].pam_id annee_pam_suivant = PAM.objects.filter(pam_statut='PAM A+1')[0].pam_id self.logger.debug('Mise à jour des données des administrés pour les PAM A et A+1, veuillez patienter ...') dict_create_administres = {} dict_update_administres = {} qs = Administres_Pams.objects.all().filter(pam_id=annee_pam).values('administre_id') batch_size = 50 admin_suivant = dict((f"{o.administre_id}", o) for o in Administres_Pams.objects.all().filter(pam_id=annee_pam_suivant)) for a_id_sap in qs: administre_id=a_id_sap['administre_id'] pk = str(administre_id) + str(annee_pam_suivant) model_administre = Administres_Pams(**{ 'id' :pk, 'pam_id' :annee_pam_suivant, 'administre_id' :administre_id, 'a_statut_pam_annee' :StatutPam.NON_ETUDIE, 'notes_pam' :None, 'a_ciat_pam' :False, 'a_specifique_pam' :None, 'a_liste_depts_souhaites_pam' :None, 'a_liste_zones_geographiques_shm_pam' :None, 'a_situationfuture_notes_fe' :None, }) if str(administre_id) not in admin_suivant : dict_create_administres.setdefault(pk, model_administre) else: dict_update_administres.setdefault(pk, model_administre) if dict_create_administres: self.logger.debug("Nombre d'administrés à créer dans l'année %s : %s'",annee_pam_suivant,len(dict_create_administres)) for idx, data_batch in enumerate(batch_iterator(list(dict_create_administres.values()), batch_size)): try: Administres_Pams.objects.bulk_create(data_batch) except Exception as e: self.logger.exception("Cet administré existe déjà dans la base : %s", e) self.logger.debug('Mise à jour des liens Administres/Pams terminés.') self.logger.debug('Mise à jour des données des postes pour les PAM A et A+1, veuillez patienter ...') dict_create_postes = {} dict_update_postes = {} # def mise_a_jour_info_reo(info_reo, annee_pam): # if "SUREFF" in info_reo: # model.info_reo=info_reo # else: # model.info_reo=f'REO {annee_pam}' # return model.info_reo qs = Postes_Pams.objects.all().filter(p_pam_id=annee_pam).values_list('poste_id','info_reo') batch_size = 50 poste_suivant = dict((f"{o.poste_id}", o) for o in Postes_Pams.objects.all().filter(p_pam_id=annee_pam_suivant)) for poste in qs: poste_id=poste[0] info_reo= poste[1] pk = str(poste_id) + str(annee_pam_suivant) model_poste = Postes_Pams(**{ 'id' :pk, 'p_pam_id' :annee_pam_suivant, 'poste_id' :poste_id, 'p_avis_pam' :StatutPam.NON_ETUDIE, 'p_avis_fe_pam' :StatutPam.NON_ETUDIE, 'p_direct_commissionne_pam' :None, 'p_notes_gestionnaire_pam' :None, 'p_priorisation_pcp_pam' :None, 'info_reo' :info_reo if "SUREFF" in info_reo else f'REO {annee_pam}', }) if str(poste_id) not in poste_suivant : dict_create_postes.setdefault(pk, model_poste) else: dict_update_postes.setdefault(pk, model_poste) if dict_create_postes: self.logger.debug("Nombre de postes à créer dans l'année %s : %s'",annee_pam_suivant,len(dict_create_postes)) for idx, data_batch in enumerate(batch_iterator(list(dict_create_postes.values()), batch_size)): try: Postes_Pams.objects.bulk_create(data_batch) except Exception as e: self.logger.exception("Ce poste existe déjà dans la base : %s", e) self.logger.debug('Mise à jour des liens Postes/Pams terminés.') self.logger.debug(f'Début de la suppression des données du PAM {int(annee_pam)-1}, veuillez patienter ...') PAM.objects.filter(pam_id=int(annee_pam)-1).delete() self.logger.debug("Fin de l'initialisation/Mise à jour du PAM") return Response({'Initialisation/Mise à jour du Pam réussie'}) except (Http404, APIException): message = "Impossible de mettre à jour ce PAM" self.logger.exception(message) raise APIException(message) class NettoyagePamView(APIView): """ Vue pour nettoyer les postes tagués en SUP REO """ permission_classes = [IsAuthenticated, IsAdminUser] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.logger = get_data_logger(self) def get(self, request): try: self.logger.debug("Suppression des postes tagués en SUP REO de l'année A --------------------------------------------> Success") annee_pam = PAM.objects.filter(pam_statut='PAM en cours')[0].pam_id qs = Postes_Pams.objects.all().filter(p_pam_id=annee_pam).values('poste_id') for p_id in qs: poste_id=p_id['poste_id'] if Postes_Pams.objects.filter(Q(info_reo='SUP REO') & Q(poste_id=poste_id)): self.logger.debug(f'Suppression du poste {poste_id}') Poste.objects.filter(p_id=poste_id).delete() #Mise à jour des postes tagues CREE REO A en REO A if not Postes_Pams.objects.filter(Q(p_pam_id=annee_pam) & Q(poste_id=poste_id) & Q(info_reo__contains='SUREFF')): Postes_Pams.objects.filter(Q(p_pam_id=annee_pam) & Q(poste_id=poste_id)).update(info_reo=f'REO {annee_pam}') self.logger.debug(f'Début de la suppression des administrés du PAM {int(annee_pam)-1}') Administres_Pams.objects.filter(pam_id=int(annee_pam)-1).delete() self.logger.debug(f'Début de la suppression des postes du PAM {int(annee_pam)-1}') Postes_Pams.objects.filter(p_pam_id=int(annee_pam)-1).delete() Calcul.objects.filter(pam_id=int(annee_pam)-1).delete() self.logger.debug(f'Fin de la suppression des données du PAM {int(annee_pam)-1}') return Response({'Mise à jour du Pam réussie'}) except (Http404, APIException): message = "Impossible de mettre à jour ce PAM" self.logger.exception(message) raise APIException(message)