This commit is contained in:
2022-11-08 21:19:51 +01:00
commit 4c456eafc3
160 changed files with 21472 additions and 0 deletions

View File

@@ -0,0 +1,580 @@
import time
import pandas as pd
import numpy as np
from django.utils import timezone
from django.db.transaction import atomic
from django.http import Http404, HttpResponse
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 ..utils_extraction import APP_NAN
from ..utils.alimentation import BOCols, ReoCols
from ..serializers import ExportationSerializer
from ..models import Administre, Affectation, Administre_Notation, Poste, FichiersExporte
from ..utils.alimentation_decorators import (data_perf_logger_factory,
get_data_logger)
from ..utils.decorators import execution_time, query_count
class ExportationFichiersView(APIView):
""" Vue pour exporter les données de la base dans des fichiers au format de ceux utilisés pour l'insertion"""
permission_classes = [IsAuthenticated, IsAdminUser]
serializer_class = ExportationSerializer
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.logger = get_data_logger(self)
def get(self, request):
resp = []
resp.append(["Formulaire d\'OGURE NG permettant d'exporter les données de la base au format des fichiers d'insertion."])
resp.append(["Selectionnez le fichier que vous souhaitez exporter puis appuyez sur le bouton 'POST' pour lancer l'exportation."])
resp = pd.DataFrame(resp)
return Response(resp[0])
def export_adm_bo_df(self):
self.logger.info("Lecture et traitement de la table des administrés... ")
start_time_adm = time.time()
Cols = Administre.Cols
administres = Administre.objects.all().values_list(
Cols.PK,
Cols.REL_GRADE,
'a_nom',
'a_prenom',
'a_id_def',
'a_eip',
'a_eis',
'a_domaine_gestion',
Cols.REL_DOMAINE,
Cols.REL_FILIERE,
'a_nf',
'a_arme',
'a_rg_origine_recrutement',
'a_date_entree_service',
'a_nombre_enfants',
'a_origine_recrutement',
'a_date_naissance',
'a_fonction',
'a_diplome_hl',
'a_dernier_diplome',
'a_date_rdc',
'a_credo_fe',
f'{Cols.REL_FORMATION_EMPLOI}__fe_garnison_lieu',
'a_date_arrivee_fe',
'a_date_dernier_acr',
'a_pos_statuaire',
'a_date_pos_statuaire',
'a_interruption_service',
'a_grade_date_debut',
'a_profession_conjoint',
'a_sap_conjoint',
'a_id_def_conjoint',
'a_sexe_conjoint',
'a_date_fonction1',
'a_fonction1',
'a_date_fonction2',
'a_fonction2',
'a_date_fonction3',
'a_fonction3',
'a_date_fonction4',
'a_fonction4',
'a_date_fonction5',
'a_fonction5',
'a_date_fonction6',
'a_fonction6',
'a_date_fonction7',
'a_fonction7',
'a_date_fonction8',
'a_fonction8',
'a_date_fonction9',
'a_fonction9',
'a_date_mariage',
'a_situation_fam',
'a_sexe',
'a_date_fud',
'a_fud',
Cols.DATE_STATUT_CONCERTO,
Cols.STATUT_CONCERTO,
Cols.DATE_STATUT_CONCERTO_FUTUR,
Cols.STATUT_CONCERTO_FUTUR,
'a_domaine_poste',
'a_filiere_poste',
'a_nf_poste',
'a_lien_service',
'a_marqueur_pn',
'a_pls_gb_max',
'a_enfants',
)
administres_df = pd.DataFrame.from_records(administres)
adm_bo_cols = BOCols.columns(
BOCols.ID_SAP, # A
BOCols.GRADE, # B
BOCols.NOM, # C
BOCols.PRENOM, # D
BOCols.ID_DEF, # E
BOCols.EIP, # F
BOCols.EIS, # G
BOCols.DOMAINE_GESTION, # H
BOCols.DOMAINE, # I
BOCols.FILIERE, # J
BOCols.NF, # K
BOCols.ARME, # L
BOCols.REGROUPEMENT_ORIGINE_RECRUTEMENT, # M
BOCols.DATE_ENTREE_SERVICE, # N
BOCols.NOMBRE_ENFANTS, # O
BOCols.ORIGINE_RECRUTEMENT, # Q
BOCols.DATE_NAISSANCE, # R
BOCols.FONCTION, # T
BOCols.DIPLOME_PLUS_HAUT_NIVEAU, # U
BOCols.DERNIER_DIPLOME, # V
BOCols.DATE_RDC, # W
BOCols.CREDO_FE, # X
BOCols.GARNISON, # Z (utilisé dans la table des garnisons)
BOCols.DATE_ARRIVEE_FE, # AA
BOCols.DATE_DERNIER_ACR, # AC
BOCols.POSITION_STATUTAIRE, # AE
BOCols.DATE_POSITION_STATUAIRE, # AF
BOCols.INTERRUPTION_SERVICE, # AG
BOCols.DATE_DEBUT_GRADE, # AH
BOCols.PROFESSION_CONJOINT, # AL
BOCols.ID_SAP_CONJOINT, # AM
BOCols.ID_DEF_CONJOINT, # AN
BOCols.SEXE_CONJOINT, # AT
BOCols.DATE_FONCTION_1, # BM
BOCols.FONCTION_1, # BN
BOCols.DATE_FONCTION_2, # BO
BOCols.FONCTION_2, # BP
BOCols.DATE_FONCTION_3, # BQ
BOCols.FONCTION_3, # BR
BOCols.DATE_FONCTION_4, # BS
BOCols.FONCTION_4, # BT
BOCols.DATE_FONCTION_5, # BU
BOCols.FONCTION_5, # BV
BOCols.DATE_FONCTION_6, # BW
BOCols.FONCTION_6, # BX
BOCols.DATE_FONCTION_7, # BY
BOCols.FONCTION_7, # BZ
BOCols.DATE_FONCTION_8, # CA
BOCols.FONCTION_8, # CB
BOCols.DATE_FONCTION_9, # CC
BOCols.FONCTION_9, # CD
BOCols.DATE_MARIAGE, # CH
BOCols.SITUATION_FAMILIALE, # CI
BOCols.SEXE, # CJ
BOCols.DATE_FUD, # DV
BOCols.FUD, # DW
BOCols.DATE_STATUT_CONCERTO, # DX
BOCols.STATUT_CONCERTO, # DY
BOCols.DATE_STATUT_CONCERTO_FUTUR, # DZ
BOCols.STATUT_CONCERTO_FUTUR, # EA
BOCols.DOMAINE_POSTE, # ED (non utilisé)
BOCols.FILIERE_POSTE, # EE (non utilisé)
BOCols.NF_POSTE, # EF (non utilisé)
BOCols.DATE_LIEN_SERVICE, # EG
BOCols.MARQUEUR_PN, # EH
BOCols.PLS_GB_MAX, # EI
BOCols.ENFANTS, # EK
)
administres_df.columns = adm_bo_cols
# Changement des types des colonnes dates
administres_df[BOCols.DATE_ARRIVEE_FE] = pd.to_datetime(administres_df[BOCols.DATE_ARRIVEE_FE], errors='coerce').dt.strftime('%d/%m/%Y') # AA
administres_df[BOCols.DATE_DEBUT_GRADE] = pd.to_datetime(administres_df[BOCols.DATE_DEBUT_GRADE], errors='coerce').dt.strftime('%d/%m/%Y') # AH
administres_df[BOCols.DATE_DERNIER_ACR] = pd.to_datetime(administres_df[BOCols.DATE_DERNIER_ACR], errors='coerce').dt.strftime('%d/%m/%Y') # AC
administres_df[BOCols.DATE_ENTREE_SERVICE] = pd.to_datetime(administres_df[BOCols.DATE_ENTREE_SERVICE], errors='coerce').dt.strftime('%d/%m/%Y') # N
administres_df[BOCols.DATE_FUD] = pd.to_datetime(administres_df[BOCols.DATE_FUD], errors='coerce').dt.strftime('%d/%m/%Y') # DV
administres_df[BOCols.DATE_LIEN_SERVICE] = pd.to_datetime(administres_df[BOCols.DATE_LIEN_SERVICE], errors='coerce').dt.strftime('%d/%m/%Y') # EG
administres_df[BOCols.DATE_NAISSANCE] = pd.to_datetime(administres_df[BOCols.DATE_NAISSANCE], errors='coerce').dt.strftime('%d/%m/%Y') # R
administres_df[BOCols.DATE_POSITION_STATUAIRE] = pd.to_datetime(administres_df[BOCols.DATE_POSITION_STATUAIRE], errors='coerce').dt.strftime('%d/%m/%Y') # AF
administres_df[BOCols.DATE_RDC] = pd.to_datetime(administres_df[BOCols.DATE_RDC], errors='coerce').dt.strftime('%d/%m/%Y') # W
administres_df[BOCols.DATE_STATUT_CONCERTO] = pd.to_datetime(administres_df[BOCols.DATE_STATUT_CONCERTO], errors='coerce').dt.strftime('%d/%m/%Y') # DX
administres_df[BOCols.DATE_STATUT_CONCERTO_FUTUR] = pd.to_datetime(administres_df[BOCols.DATE_STATUT_CONCERTO_FUTUR], errors='coerce').dt.strftime('%d/%m/%Y') # DZ
administres_df[BOCols.DATE_MARIAGE] = pd.to_datetime(administres_df[BOCols.DATE_MARIAGE], errors='coerce').dt.strftime('%d/%m/%Y') # CH
for i in range(1, 10):
administres_df[f'Fonction -{i} DD'] = pd.to_datetime(administres_df[f'Fonction -{i} DD']).dt.strftime('%d/%m/%Y')
# Changement des types des colonnes bool
administres_df[[BOCols.MARQUEUR_PN]] = administres_df[[BOCols.MARQUEUR_PN]].replace([True, False], ['X', None])
# CHangement des types des colonnes int
administres_df[BOCols.ID_SAP_CONJOINT] = administres_df[BOCols.ID_SAP_CONJOINT].fillna(0).astype(int).replace({0: None})
administres_df[BOCols.PLS_GB_MAX] = administres_df[BOCols.PLS_GB_MAX].fillna(0).astype(int).replace({0: None})
administres_df = (administres_df.fillna(APP_NAN)
.replace({APP_NAN: None})
.replace({np.nan: None})
.replace({'nan': None}))
self.logger.info("Table des administrés lue et traitée en %d secondes : %s lignes et %s colonnes extraites\n", time.time()-start_time_adm, administres_df.shape[0], administres_df.shape[1])
return administres_df
def export_aff_bo_df(self):
self.logger.info("Lecture et traitement de la table des affectations... ")
start_time_aff = time.time()
aff = pd.DataFrame.from_records(Affectation.objects.all().values()).sort_values('affect_date', ascending=False)
aff_grouped = aff.groupby(['administre_id']).agg(
affect_libelle=('affect_libelle', ',,,'.join),
affect_date=('affect_date', ',,,'.join),
)
aff_date_cols = [f'Affectation -{i} DD' for i in range(1,10)]
aff_libelle_cols = [f'Affectation -{i} L' for i in range(1,10)]
aff_date_df = aff_grouped['affect_date'].str.split(',,,', expand=True)
aff_libelle_df = aff_grouped['affect_libelle'].str.split(',,,', expand=True)
nb_cols_date = aff_date_df.shape[1]
nb_cols_libelle = aff_date_df.shape[1]
aff_date_cols_tronc = aff_date_cols[:nb_cols_date]
aff_libelle_cols_tronc = aff_libelle_cols[:nb_cols_libelle]
aff_grouped[aff_date_cols_tronc] = aff_date_df
aff_grouped[aff_libelle_cols_tronc] = aff_libelle_df
aff_grouped = (aff_grouped.drop(['affect_libelle', 'affect_date'], axis=1)
.reset_index())
# Changement des types des colonnes dates
for i in range(1, 10):
aff_grouped[f'Affectation -{i} DD'] = pd.to_datetime(aff_grouped[f'Affectation -{i} DD']).dt.strftime('%d/%m/%Y')
aff_grouped = (aff_grouped.fillna(APP_NAN)
.replace({APP_NAN: None})
.replace({np.nan: None})
.replace({'nan': None}))
self.logger.info("Table des affectations lue et traitée en %d secondes : %s lignes et %s colonnes extraites\n", time.time()-start_time_aff, aff_grouped.shape[0], aff_grouped.shape[1])
return aff_grouped
def export_no_bo_df(self):
self.logger.info("Lecture et traitement de la table des notations... ")
start_time_no = time.time()
no = pd.DataFrame.from_records(Administre_Notation.objects.all().values()).sort_values('no_age_annees', ascending=False)
no_grouped = no.groupby(["administre_id"]).agg(
no_annne_de_notation=("no_annne_de_notation", ",,,".join),
no_nr_ou_iris=("no_nr_ou_iris", ",,,".join),
no_rac_ou_iris_cumule=("no_rac_ou_iris_cumule", ",,,".join),
no_rf_qsr=("no_rf_qsr", ",,,".join),
no_aptitude_emploie_sup=("no_aptitude_emploie_sup", ",,,".join),
no_potentiel_responsabilite_sup=("no_potentiel_responsabilite_sup", ",,,".join),
no_age_annees=("no_age_annees", ",,,".join),
)
no_age_annees_cols = ['Age en années (au 31/12)']
no_annne_de_notation_cols = ['Année notation A'] + [f'Année notation A-{i}' for i in range(1,6)]
no_nr_ou_iris_cols = ['IRIS / RAC retenu A'] + [f'IRIS / RAC retenu A-{i}' for i in range(1,6)]
no_rac_ou_iris_cumule_cols = ['NR/NGC cumulé A'] + [f'NR/NGC cumulé A-{i}' for i in range(1,6)]
no_rf_qsr_cols = ['QSR A'] + [f'QSR A-{i}' for i in range(1,6)]
no_aptitude_emploie_sup_cols = ['Apt resp / Emp sup A'] + [f'Apt resp / Emp sup A-{i}' for i in range(1,6)]
no_potentiel_responsabilite_sup_cols = ['Potentiel responsabilités catégorie sup A'] + [f'Potentiel responsabilités catégorie sup A-{i}' for i in range(1,6)]
no_grouped[no_age_annees_cols] = no_grouped['no_age_annees'].str.split(',,,', expand=True)[0]
no_grouped[no_annne_de_notation_cols] = no_grouped['no_annne_de_notation'].str.split(',,,', expand=True)
no_grouped[no_nr_ou_iris_cols] = no_grouped['no_nr_ou_iris'].str.split(',,,', expand=True)
no_grouped[no_rac_ou_iris_cumule_cols] = no_grouped['no_rac_ou_iris_cumule'].str.split(',,,', expand=True)
no_grouped[no_rf_qsr_cols] = no_grouped['no_rf_qsr'].str.split(',,,', expand=True)
no_grouped[no_aptitude_emploie_sup_cols] = no_grouped['no_aptitude_emploie_sup'].str.split(',,,', expand=True)
no_grouped[no_potentiel_responsabilite_sup_cols] = no_grouped['no_potentiel_responsabilite_sup'].str.split(',,,', expand=True)
no_grouped = (no_grouped.drop(['no_annne_de_notation',
'no_nr_ou_iris',
'no_rac_ou_iris_cumule',
'no_rf_qsr',
'no_aptitude_emploie_sup',
'no_potentiel_responsabilite_sup',
'no_age_annees'], axis=1)
.reset_index())
# Changement des types des colonnes int
no_grouped[f'Année notation A'] = no_grouped[f'Année notation A'].astype(float).fillna(0).astype(int).replace({0: None})
no_grouped[f'IRIS / RAC retenu A'] = no_grouped[f'IRIS / RAC retenu A'].astype(float).fillna(0).astype(int).replace({0: None})
no_grouped[f'NR/NGC cumulé A'] = no_grouped[f'NR/NGC cumulé A'].astype(float).fillna(0).astype(int).replace({0: None})
for i in range(1, 6):
no_grouped[f'Année notation A-{i}'] = no_grouped[f'Année notation A-{i}'].astype(float).fillna(0).astype(int).replace({0: None})
no_grouped[f'IRIS / RAC retenu A-{i}'] = no_grouped[f'IRIS / RAC retenu A-{i}'].astype(float).fillna(0).astype(int).replace({0: None})
no_grouped[f'NR/NGC cumulé A-{i}'] = no_grouped[f'NR/NGC cumulé A-{i}'].astype(float).fillna(0).astype(int).replace({0: None})
no_grouped = (no_grouped.fillna(APP_NAN)
.replace({APP_NAN: None})
.replace({np.nan: None})
.replace({'nan': None}))
self.logger.info("Table des notations lue et traitée en %d secondes : %s lignes et %s colonnes extraites\n", time.time()-start_time_no, no_grouped.shape[0], no_grouped.shape[1])
return no_grouped
def export_pos_reo_df(self):
self.logger.info("Lecture et traitement de la table des postes... ")
start_time_pos = time.time()
Cols = Poste.Cols
postes = Poste.objects.all().values_list(
'p_annee',
Cols.REL_FORMATION_EMPLOI,
'p_dep',
Cols.CATEGORIE,
'p_eip',
Cols.REL_DOMAINE,
Cols.REL_FILIERE,
Cols.NIVEAU_FONCTIONNEL,
Cols.PK,
f'{Cols.REL_FONCTION}__fon_id',
f'{Cols.REL_FONCTION}__fon_libelle',
'p_nfs',
)
postes_df = pd.DataFrame.from_records(postes)
pos_reo_cols = ReoCols.columns(
ReoCols.ANNEE_PROJET, # B
ReoCols.FORMATION_EMPLOI, # F
ReoCols.CODE_POSTAL, # J
ReoCols.CATEGORIE, # P
ReoCols.EIP, # T
ReoCols.DOMAINE, # U
ReoCols.FILIERE, # V
ReoCols.CODE_NF, # W
ReoCols.ID_POSTE, # X
ReoCols.FONCTION_ID, # Y
ReoCols.FONCTION_LIBELLE, # Z
ReoCols.DOMAINE_GESTION, # AA
)
postes_df.columns = pos_reo_cols
postes_df = (postes_df.fillna(APP_NAN)
.replace({APP_NAN: None})
.replace({np.nan: None})
.replace({'nan': None}))
self.logger.info("Table des postes lue et traitée en %d secondes : %s lignes et %s colonnes extraites\n", time.time()-start_time_pos, postes_df.shape[0], postes_df.shape[1])
return postes_df
@atomic
# @execution_time(logger_factory=data_perf_logger_factory)
@query_count(logger_factory=data_perf_logger_factory)
def export_bo(self, request):
self.logger.info("--------- Début de l'exportation du fichier 'Données BO' --------- ")
start_time_export = time.time()
administres_df = self.export_adm_bo_df()
affectations_df = self.export_aff_bo_df()
notations_df = self.export_no_bo_df()
bo_df = administres_df.merge(affectations_df, how='left', left_on=BOCols.ID_SAP, right_on='administre_id')
bo_df = bo_df.drop(['administre_id'], axis=1)
bo_df = bo_df.merge(notations_df, how='left', left_on=BOCols.ID_SAP, right_on='administre_id')
bo_df = bo_df.drop(['administre_id'], axis=1)
bo_cols = BOCols.columns(
BOCols.ID_SAP, # A
BOCols.GRADE, # B
BOCols.NOM, # C
BOCols.PRENOM, # D
BOCols.ID_DEF, # E
BOCols.EIP, # F
BOCols.EIS, # G
BOCols.DOMAINE_GESTION, # H
BOCols.DOMAINE, # I
BOCols.FILIERE, # J
BOCols.NF, # K
BOCols.ARME, # L
BOCols.REGROUPEMENT_ORIGINE_RECRUTEMENT, # M
BOCols.DATE_ENTREE_SERVICE, # N
BOCols.NOMBRE_ENFANTS, # O
BOCols.ORIGINE_RECRUTEMENT, # Q
BOCols.DATE_NAISSANCE, # R
BOCols.FONCTION, # T
BOCols.DIPLOME_PLUS_HAUT_NIVEAU, # U
BOCols.DERNIER_DIPLOME, # V
BOCols.DATE_RDC, # W
BOCols.CREDO_FE, # X
BOCols.GARNISON, # Z (utilisé dans la table des garnisons)
BOCols.DATE_ARRIVEE_FE, # AA
BOCols.DATE_DERNIER_ACR, # AC
BOCols.POSITION_STATUTAIRE, # AE
BOCols.DATE_POSITION_STATUAIRE, # AF
BOCols.INTERRUPTION_SERVICE, # AG
BOCols.DATE_DEBUT_GRADE, # AH
BOCols.PROFESSION_CONJOINT, # AL
BOCols.ID_SAP_CONJOINT, # AM
BOCols.ID_DEF_CONJOINT, # AN
BOCols.SEXE_CONJOINT, # AT
BOCols.DATE_AFFECTATION_1, # AU
BOCols.AFFECTATION_1, # AV
BOCols.DATE_AFFECTATION_2, # AW
BOCols.AFFECTATION_2, # AX
BOCols.DATE_AFFECTATION_3, # AY
BOCols.AFFECTATION_3, # AZ
BOCols.DATE_AFFECTATION_4, # BA
BOCols.AFFECTATION_4, # BB
BOCols.DATE_AFFECTATION_5, # BC
BOCols.AFFECTATION_5, # BD
BOCols.DATE_AFFECTATION_6, # BE
BOCols.AFFECTATION_6, # BF
BOCols.DATE_AFFECTATION_7, # BG
BOCols.AFFECTATION_7, # BH
BOCols.DATE_AFFECTATION_8, # BI
BOCols.AFFECTATION_8, # BJ
BOCols.DATE_AFFECTATION_9, # BK
BOCols.AFFECTATION_9, # BL
BOCols.DATE_FONCTION_1, # BM
BOCols.FONCTION_1, # BN
BOCols.DATE_FONCTION_2, # BO
BOCols.FONCTION_2, # BP
BOCols.DATE_FONCTION_3, # BQ
BOCols.FONCTION_3, # BR
BOCols.DATE_FONCTION_4, # BS
BOCols.FONCTION_4, # BT
BOCols.DATE_FONCTION_5, # BU
BOCols.FONCTION_5, # BV
BOCols.DATE_FONCTION_6, # BW
BOCols.FONCTION_6, # BX
BOCols.DATE_FONCTION_7, # BY
BOCols.FONCTION_7, # BZ
BOCols.DATE_FONCTION_8, # CA
BOCols.FONCTION_8, # CB
BOCols.DATE_FONCTION_9, # CC
BOCols.FONCTION_9, # CD
BOCols.AGE_ANNEES, # CG
BOCols.DATE_MARIAGE, # CH
BOCols.SITUATION_FAMILIALE, # CI
BOCols.SEXE, # CJ
BOCols.ANNEE_NOTATION, # CL
BOCols.RAC_OU_IRIS_CUMULE, # CM
BOCols.NR_OU_IRIS, # CN
BOCols.RF_QSR, # CO
BOCols.APTITUDE_EMPLOI_SUP, # CP
BOCols.POTENTIEL_RESPONSABILITE_SUP, # CQ
BOCols.ANNEE_NOTATION_1, # CR
BOCols.RAC_OU_IRIS_CUMULE_1, # CS
BOCols.NR_OU_IRIS_1, # CT
BOCols.RF_QSR_1, # CU
BOCols.APTITUDE_EMPLOI_SUP_1, # CV
BOCols.POTENTIEL_RESPONSABILITE_SUP_1, # CW
BOCols.ANNEE_NOTATION_2, # CX
BOCols.RAC_OU_IRIS_CUMULE_2, # CY
BOCols.NR_OU_IRIS_2, # CZ
BOCols.RF_QSR_2, # DA
BOCols.APTITUDE_EMPLOI_SUP_2, # DB
BOCols.POTENTIEL_RESPONSABILITE_SUP_2, # DC
BOCols.ANNEE_NOTATION_3, # DD
BOCols.RAC_OU_IRIS_CUMULE_3, # DE
BOCols.NR_OU_IRIS_3, # DF
BOCols.RF_QSR_3, # DG
BOCols.APTITUDE_EMPLOI_SUP_3, # DH
BOCols.POTENTIEL_RESPONSABILITE_SUP_3, # DI
BOCols.ANNEE_NOTATION_4, # DJ
BOCols.RAC_OU_IRIS_CUMULE_4, # DK
BOCols.NR_OU_IRIS_4, # DL
BOCols.RF_QSR_4, # DM
BOCols.APTITUDE_EMPLOI_SUP_4, # DN
BOCols.POTENTIEL_RESPONSABILITE_SUP_4, # DO
BOCols.ANNEE_NOTATION_5, # DP
BOCols.RAC_OU_IRIS_CUMULE_5, # DQ
BOCols.NR_OU_IRIS_5, # DR
BOCols.RF_QSR_5, # DS
BOCols.APTITUDE_EMPLOI_SUP_5, # DT
BOCols.POTENTIEL_RESPONSABILITE_SUP_5, # DU
BOCols.DATE_FUD, # DV
BOCols.FUD, # DW
BOCols.DATE_STATUT_CONCERTO, # DX
BOCols.STATUT_CONCERTO, # DY
BOCols.DATE_STATUT_CONCERTO_FUTUR, # DZ
BOCols.STATUT_CONCERTO_FUTUR, # EA
BOCols.DOMAINE_POSTE, # ED (non utilisé)
BOCols.FILIERE_POSTE, # EE (non utilisé)
BOCols.NF_POSTE, # EF (non utilisé)
BOCols.DATE_LIEN_SERVICE, # EG
BOCols.MARQUEUR_PN, # EH
BOCols.PLS_GB_MAX, # EI
BOCols.ENFANTS, # EK
)
bo_df = bo_df.reindex(columns=bo_cols)
if bo_df.empty:
return Response("Aucune donnée à extraire.")
else:
try:
self.logger.info("Exportation du fichier 'Données BO'...")
start_time_export_bo = time.time()
now = timezone.now().date()
bo_df.to_excel(f'..\\fichiers_exportes\\{now}_donnees_BO_export.xlsx', index=False, header=True)
bo_obj = FichiersExporte(nom_fichier=f'{now}_donnees_BO_export.xlsx')
bo_obj.save()
self.logger.info("Exportation du fichier 'Données BO' réalisée en %d secondes : %s lignes et %s colonnes exportées", time.time()-start_time_export_bo, bo_df.shape[0], bo_df.shape[1])
self.logger.info("---- Exportation totale réalisée en : %d minutes et %d secondes ----\n", (time.time()-start_time_export)//60, (time.time()-start_time_export)%60)
return Response("Exportation terminée. Vous trouverez le fichier 'Données BO' exporté dans le dossier 'fichiers_exportes'.")
except (Http404, APIException):
raise
except BaseException:
message = "Imposible de réaliser l'exportation du fichier 'Données BO'. Vérifiez que les fichiers Excel d'exportation sont bien fermés."
self.logger.exception(message)
raise APIException(message)
@atomic
# @execution_time(logger_factory=data_perf_logger_factory)
@query_count(logger_factory=data_perf_logger_factory)
def export_reo(self, request):
self.logger.info("--------- Début de l'exportation du fichier 'REO' --------- ")
start_time_export = time.time()
postes_df = self.export_pos_reo_df()
reo_df = postes_df
if reo_df.empty:
return Response("Aucune donnée à extraire.")
else:
try:
self.logger.info("Exportation du fichier 'REO'...")
start_time_export_reo = time.time()
now = timezone.now().date()
reo_df.to_excel(f'..\\fichiers_exportes\\{now}_REO_export.xlsx', index=False, header=True)
reo_obj = FichiersExporte(nom_fichier=f'{now}_REO_export.xlsx')
reo_obj.save()
self.logger.info("Exportation du fichier 'REO' réalisée en %d secondes : %s lignes et %s colonnes exportées", time.time()-start_time_export_reo, reo_df.shape[0], reo_df.shape[1])
self.logger.info("------- Exportation totale réalisée en : %d secondes ------\n", time.time()-start_time_export)
return Response("Exportation terminée. Vous trouverez le fichier 'REO' exporté dans le dossier 'fichiers_exportes'.")
except (Http404, APIException):
raise
except BaseException:
message = "Imposible de réaliser l'exportation du fichier 'REO'. Vérifiez que les fichiers Excel d'exportation sont bien fermés."
self.logger.exception(message)
raise APIException(message)
def post(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
nom_fichier = serializer.validated_data.get('fichier_exporte')
if nom_fichier == '1':
resp = self.export_bo(request)
return resp
if nom_fichier == '2':
resp = self.export_reo(request)
return resp
return Response("Imposible de réaliser l'exportation.")