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,189 @@
from bulk_update_or_create import BulkUpdateOrCreateQuerySet
from django.db import models
from .administre import Administre
from .commun import NiveauFonctionnelChoices, SpecifiqueChoices
from .competence import Competence
from .domaine import Domaine
from .filiere import Filiere
from .fonction import Fonction
from .formation_emploi import FormationEmploi
from .sous_vivier import SousVivier
from .pam import PAM
class AvisPosteChoices(models.TextChoices):
"""
[Poste] choix pour les avis
attributs supplémentaires :
- calc_enabled : est-ce que cet avis permet le calcul ?
- dec_enabled : est-ce que cet avis permet de créer une décision ?
"""
# (valeur, calc_enabled, dec_enabled), libellé
P1 = ('P1', True, True), 'Priorité 1'
P2 = ('P2', True, True), 'Priorité 2'
P3 = ('P3', True, True), 'Priorité 3'
P4 = ('P4', True, True), 'Priorité 4'
GELE = ('GELE', False, False), 'Gelé'
NON_ETUDIE = ('NON_ETUDIE', False, False), 'Non étudié'
def __new__(cls, value):
obj = str.__new__(cls, value[0])
obj._value_ = value[0]
obj.calc_enabled = value[1]
obj.dec_enabled = value[2]
return obj
class DirectCommissionneChoices(models.TextChoices):
"""
[Poste] choix pour direct/commissionné
"""
DIRECT = 'DIRECT', 'Direct'
COMMISSIONNE = 'COMMISSIONNE', 'Commissionné'
class PropositionsArmementChoices(models.TextChoices):
"""
[Poste] choix pour les propositions d'armement
"""
PROPOSE = 'PROPOSE', 'Propositions'
VALIDE = 'VALIDE', 'Propositions validées'
class Poste(models.Model):
"""
Modèle des postes
"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'p_id'
CATEGORIE = 'p_categorie'
FONCTION = 'p_code_fonction'
NIVEAU_FONCTIONNEL = 'p_nf'
# relations many-to-many
M2M_COMPETENCES = 'competences'
M2M_SOUS_VIVIERS = 'sous_viviers'
M2M_PAM = 'p_pam'
# relations one-to-many
O2M_DECISION = 'decisions'
# relations one-to-one ou many-to-one
REL_ADMINISTRE = 'p_administre'
REL_DOMAINE = 'p_domaine'
REL_FILIERE = 'p_filiere'
REL_FONCTION = 'fonction'
REL_FORMATION_EMPLOI = 'formation_emploi'
objects = BulkUpdateOrCreateQuerySet.as_manager()
p_id = models.CharField(max_length=100, primary_key=True)
p_pam = models.ManyToManyField(PAM, through='Postes_Pams')
p_annee = models.CharField(max_length=100, default=False)
p_administre = models.ForeignKey(Administre, on_delete=models.SET_NULL, null=True, blank=True)
fonction = models.ForeignKey(Fonction, on_delete=models.SET_NULL, null=True, blank=True)
sous_viviers = models.ManyToManyField(SousVivier, related_name=SousVivier.Cols.M2M_POSTES, blank=True)
formation_emploi = models.ForeignKey(FormationEmploi, on_delete=models.SET_NULL, related_name=FormationEmploi.Cols.REL_POSTE, null=True, blank=True)
competences = models.ManyToManyField(Competence, blank=True)
p_domaine = models.ForeignKey(Domaine, on_delete=models.SET_NULL, null=True, blank=True)
p_filiere = models.ForeignKey(Filiere, on_delete=models.SET_NULL, null=True, blank=True)
p_fonction = models.CharField(max_length=100, null=True, blank=True)
p_code_fonction = models.CharField(max_length=100, null=True, blank=True)
p_nf = models.CharField(max_length=100, null=True, blank=True, choices=NiveauFonctionnelChoices.choices)
p_categorie = models.CharField(max_length=100, null=True, blank=True)
p_dep = models.CharField('Département', max_length=2, null=True, blank=True)
p_liste_id_marques = models.CharField('Marques PAM en cours', max_length=100, null=True, blank=True)
p_eip = models.CharField(max_length=100, null=True, blank=True)
p_avis = models.CharField(max_length=100, choices=AvisPosteChoices.choices, null=True, default=AvisPosteChoices.NON_ETUDIE)
p_avis_fe = models.CharField(max_length=100, choices=AvisPosteChoices.choices, null=True, default=AvisPosteChoices.NON_ETUDIE)
p_notes_gestionnaire = models.TextField(null=True, blank=True)
p_notes_partagees = models.TextField(null=True, blank=True)
p_ciat = models.BooleanField('CIAT', default=False, null=True)
p_specifique = models.CharField('PPE / SHM / ITD', max_length=250, choices=SpecifiqueChoices.choices, null=True, blank=True)
p_direct_commissionne = models.CharField('Direct Commissionne', max_length=100, choices=DirectCommissionneChoices.choices, null=True, blank=True)
propositions_armement = models.CharField("propositions d'armement", db_column='p_propositions_armement', max_length=10, choices=PropositionsArmementChoices.choices, null=True, blank=True)
p_priorisation_pcp = models.TextField('Priorisation PCP', null=True, blank=True)
p_nfs = models.CharField('Domaine de gestion (BVT)', max_length=100, null=True, blank=True)
p_itd_cellule = models.CharField(max_length=100, null=True, blank=True)
p_itd_affecte = models.BooleanField(null=True, blank=True)
@property
def p_poids_competences(self):
"le poids des competences"
if self.p_specifique:
return 65 if self.competences.exists() else 0
else:
return 60 if self.competences.exists() else 0
@property
def p_poids_filiere(self):
"le poids des filieres"
if self.p_specifique:
return 0 if self.competences.exists() else 20
else:
return 10 if self.competences.exists() else 75
@property
def p_poids_nf(self):
"le poids des niveaux fonctionnels"
if self.p_specifique:
return 35 if self.competences.exists() else 80
else:
return 30 if self.competences.exists() else 25
@property
def p_poids_filiere_nf_competences(self):
"le poids des filieres, nf et competences"
if self.p_specifique:
return (0, 35, 65) if self.competences.exists() else (20, 80, 0)
else:
return (10, 30, 60) if self.competences.exists() else (75, 25, 0)
class Meta:
constraints = [
models.CheckConstraint(
name='%(app_label)s_%(class)s_p_direct_commissionne_valid',
check=models.Q(p_direct_commissionne__in=DirectCommissionneChoices.values)
),
models.CheckConstraint(
name='%(app_label)s_%(class)s_p_nf_valid',
check=models.Q(p_nf__in=NiveauFonctionnelChoices.values)
),
models.CheckConstraint(
name='%(app_label)s_%(class)s_p_specifique_valid',
check=models.Q(p_specifique__in=SpecifiqueChoices.values)
),
models.CheckConstraint(
name='%(app_label)s_%(class)s_propositions_armement_valid',
check=models.Q(propositions_armement__in=PropositionsArmementChoices.values)
),
]
class Postes_Pams(models.Model):
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'id'
REL_PAM = 'p_pam'
REL_POSTE = 'poste'
O2M_DECISION = 'decisions'
objects = BulkUpdateOrCreateQuerySet.as_manager()
id = models.CharField(primary_key=True, max_length=100)
p_pam = models.ForeignKey(PAM, on_delete = models.CASCADE, related_name='p_pam')
poste = models.ForeignKey(Poste, on_delete=models.CASCADE, related_name='poste')
p_avis_pam = models.CharField(max_length=100, choices=AvisPosteChoices.choices, null=True, default=AvisPosteChoices.NON_ETUDIE)
p_avis_fe_pam = models.CharField(max_length=100, choices=AvisPosteChoices.choices, null=True, default=AvisPosteChoices.NON_ETUDIE)
p_direct_commissionne_pam = models.CharField('Direct Commissionne', max_length=100, choices=DirectCommissionneChoices.choices, null=True, blank=True)
p_notes_gestionnaire_pam = models.TextField(null=True, blank=True)
p_priorisation_pcp_pam = models.TextField('Priorisation PCP', null=True, blank=True)
info_reo = models.CharField(max_length=100, default="")