""" Les signaux permettent à certains expéditeurs d’avertir un ensemble de destinataires qu’une action a eu lieu. Dans ce projet, les signaux ont été utilisés pour mettre à jour les compteurs des postes appartenant à la FE lorsque le taux d'armement change en fonction de la catégorie. """ import numpy as np from . import constants from .models import FormationEmploi, Poste, SousVivierAssociation, Administre from django.db.models.signals import post_save def update_taux_mdr(sender, instance, **kwargs): """Met à jour les compteurs des postes appartenant à la FE dont on change le taux d'armement cible pour la catégorie MDR :type instance: objet du modèle FormationEmploi :param instance: FE dont on change le taux d'armement cible pour la catégorie MDR """ taux = instance.fe_taux_armement_cible_mdr fe_id = instance.fe_code postes = Poste.objects.filter(formation_emploi_id=fe_id, p_categorie='MDR') if (len(postes) > 0) and (taux is not None): taux = taux * 0.01 for poste in postes: new_nb_reevalue = poste.p_nb_reevalue * taux new_nb_vacant = new_nb_reevalue - poste.p_nb_occupe if new_nb_reevalue >= poste.p_nb_reevalue: new_nb_p4 = poste.p_nb_p4 + new_nb_vacant - poste.p_nb_vacant poste.p_nb_p4 = new_nb_p4 else: if new_nb_reevalue > poste.p_nb_occupe: new_nb_non_etudie = poste.p_nb_non_etudie + poste.p_nb_reevalue - new_nb_reevalue poste.p_nb_non_etudie = new_nb_non_etudie delta_vacant = new_nb_vacant - poste.p_nb_vacant if delta_vacant <= poste.p_nb_p4: new_poste_p4 = poste.p_nb_p4 - delta_vacant poste.p_nb_p4 = new_poste_p4 else: delta_vacant -= poste.p_nb_p4 poste.p_nb_p4 = 0 if delta_vacant <= poste.p_nb_p3: new_poste_p3 = poste.p_nb_p3 - delta_vacant poste.p_nb_p3 = new_poste_p3 else: delta_vacant -= poste.p_nb_p3 poste.p_nb_p3 = 0 if delta_vacant <= poste.p_nb_p2: new_poste_p2 = poste.p_nb_p2 - delta_vacant poste.p_nb_p2 = new_poste_p2 else: delta_vacant -= poste.p_nb_p2 poste.p_nb_p2 = 0 new_nb_p1 = poste.p_nb_p1 - delta_vacant poste.p_nb_p1 = new_nb_p1 else: poste.p_nb_p3 = 0 poste.p_nb_p2 = 0 poste.p_nb_p1 = 0 poste.p_nb_p4 = 0 poste.p_nb_reevalue = new_nb_reevalue poste.p_nb_vacant = new_nb_vacant poste.save( update_fields=['p_nb_reevalue', 'p_nb_vacant', 'p_nb_non_etudie', 'p_nb_p4', 'p_nb_p3', 'p_nb_p2', 'p_nb_p1']) post_save.connect(update_taux_mdr, sender=FormationEmploi) def update_taux_off(sender, instance, **kwargs): """Met à jour les compteurs des postes appartenant à la FE dont on change le taux d'armement cible pour la catégorie OFF :type instance: objet du modèle FormationEmploi :param instance: FE dont on change le taux d'armement cible pour la catégorie OFF """ taux = instance.fe_taux_armement_cible_off fe_id = instance.fe_code postes = Poste.objects.filter(formation_emploi_id=fe_id, p_categorie='OFF') if (len(postes) > 0) and (taux is not None): taux = taux * 0.01 for poste in postes: new_nb_reevalue = poste.p_nb_reevalue * taux new_nb_vacant = new_nb_reevalue - poste.p_nb_occupe if new_nb_reevalue >= poste.p_nb_reevalue: new_nb_p4 = poste.p_nb_p4 + new_nb_vacant - poste.p_nb_vacant poste.p_nb_p4 = new_nb_p4 else: if new_nb_reevalue > poste.p_nb_occupe: new_nb_non_etudie = poste.p_nb_non_etudie + poste.p_nb_reevalue - new_nb_reevalue poste.p_nb_non_etudie = new_nb_non_etudie delta_vacant = new_nb_vacant - poste.p_nb_vacant if delta_vacant <= poste.p_nb_p4: new_poste_p4 = poste.p_nb_p4 - delta_vacant poste.p_nb_p4 = new_poste_p4 else: delta_vacant -= poste.p_nb_p4 poste.p_nb_p4 = 0 if delta_vacant <= poste.p_nb_p3: new_poste_p3 = poste.p_nb_p3 - delta_vacant poste.p_nb_p3 = new_poste_p3 else: delta_vacant -= poste.p_nb_p3 poste.p_nb_p3 = 0 if delta_vacant <= poste.p_nb_p2: new_poste_p2 = poste.p_nb_p2 - delta_vacant poste.p_nb_p2 = new_poste_p2 else: delta_vacant -= poste.p_nb_p2 poste.p_nb_p2 = 0 new_nb_p1 = poste.p_nb_p1 - delta_vacant poste.p_nb_p1 = new_nb_p1 else: poste.p_nb_p3 = 0 poste.p_nb_p2 = 0 poste.p_nb_p1 = 0 poste.p_nb_p4 = 0 poste.p_nb_reevalue = new_nb_reevalue poste.p_nb_vacant = new_nb_vacant poste.save( update_fields=['p_nb_reevalue', 'p_nb_vacant', 'p_nb_non_etudie', 'p_nb_p4', 'p_nb_p3', 'p_nb_p2', 'p_nb_p1']) post_save.connect(update_taux_off, sender=FormationEmploi) def update_taux_soff(sender, instance, **kwargs): """Met à jour les compteurs des postes appartenant à la FE dont on change le taux d'armement cible pour la catégorie SOFF :type instance: objet du modèle FormationEmploi :param instance: FE dont on change le taux d'armement cible pour la catégorie SOFF """ taux = instance.fe_taux_armement_cible_soff fe_id = instance.fe_code postes = Poste.objects.filter(formation_emploi_id=fe_id, p_categorie='SOFF') if (len(postes) > 0) and (taux is not None): taux = taux * 0.01 for poste in postes: new_nb_reevalue = np.ceil(poste.p_nb_reo * taux) if new_nb_reevalue != poste.p_nb_reevalue: if new_nb_reevalue > poste.p_nb_reevalue: new_nb_p4 = poste.p_nb_p4 + new_nb_reevalue - poste.p_nb_reevalue new_nb_non_etudie = (new_nb_reevalue - new_nb_p4) if (new_nb_reevalue - new_nb_p4) > 0 else 0 elif new_nb_reevalue > poste.p_nb_occupe: new_nb_p4 = new_nb_reevalue - poste.p_nb_occupe new_nb_non_etudie = new_nb_reevalue - new_nb_p4 poste.p_nb_p3 = 0 poste.p_nb_p2 = 0 poste.p_nb_p1 = 0 else: new_nb_p4 = 0 new_nb_non_etudie = 0 poste.p_nb_p3 = 0 poste.p_nb_p2 = 0 poste.p_nb_p1 = 0 poste.p_nb_p4 = 0 new_nb_reevalue = poste.p_nb_occupe poste.p_nb_non_etudie = new_nb_non_etudie poste.p_nb_p4 = new_nb_p4 poste.p_nb_reevalue = new_nb_reevalue poste.save( update_fields=['p_nb_reevalue', 'p_nb_non_etudie', 'p_nb_p4', 'p_nb_p3', 'p_nb_p2', 'p_nb_p1']) post_save.connect(update_taux_soff, sender=FormationEmploi) def add_sva(sender, instance, **kwargs): """Met à jour les sous-viviers des militaires ayant la même filière de la nouvelle instance de SousVivierAssociation créée :param instance: La nouvelle instance de SousVivierAssociation créée :type instance: objet du modèle SousVivierAssociation """ filiere_id = instance.filiere_id sva_categorie = instance.sva_categorie sous_vivier_id = instance.sous_vivier_id administres = Administre.objects.filter(a_filiere_id=filiere_id, a_categorie=sva_categorie) administres.update(sous_vivier_id=sous_vivier_id) post_save.connect(add_sva, sender=SousVivierAssociation)