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,18 @@
from .administre import *
from .calcul import *
from .commun import *
from .competence import *
from .decision import *
from .domaine import *
from .fichier_exporte import *
from .filiere import *
from .fmob import *
from .fonction import *
from .formation_emploi import *
from .garnison import *
from .grade import *
from .initial import *
from .poste import *
from .sous_vivier import *
from .pam import *
from .user import *

View File

@@ -0,0 +1,282 @@
from bulk_update_or_create import BulkUpdateOrCreateQuerySet
from django.db import models
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 .grade import Grade
from .sous_vivier import SousVivier
from .pam import PAM
class SuiviPrevisionnelMilitaire(models.TextChoices):
"""
[Administre] choix pour le gestionnaire PCP
"""
MOB_EXT = 'MOB_EXT', 'Mobilité externe'
MOB_INT = 'MOB_INT', 'Mobilité interne',
NRCT = 'NRCT', 'NRCT',
RDC = 'RDC', 'RDC',
LMT = 'LMT', 'Limite de contrat',
REC = 'REC', 'Reconversion',
REC_OE = 'REC_OE', 'Recrutement OE',
DFP = 'DFP', 'Détachement FP',
class StatutFuturChoices(models.TextChoices):
"""
[Administre] choix pour le statut futur
"""
CLDM = 'CLDM', 'CLDM'
CP = 'CP', 'CP'
DRJI = 'DRJI', 'DRJI'
NRCT = 'NRCT', 'NRCT'
DET = 'DET', 'DET'
RECONV = 'RECONV', 'RECONV'
class StatutPamChoices(models.TextChoices):
"""
[Administre] choix pour le statut PAM
attributs supplémentaires :
- calc_enabled : est-ce que ce statut permet le calcul ?
- dec_enabled : est-ce que ce statut permet de créer une décision ?
"""
# (valeur, calc_enabled, dec_enabled), libellé
A_ETUDIER = ('A_ETUDIER', True, True), 'A étudier'
A_ETUDIER_REC = ('A_ETUDIER_REC', True, True), 'A étudier REC'
A_MAINTENIR = ('A_MAINTENIR', False, True), 'A maintenir'
A_MUTER = ('A_MUTER', True, True), 'A muter'
A_TRAITER = ('A_TRAITER', False, False), 'A traiter'
NON_DISPONIBLE = ('NON_DISPONIBLE', False, False), 'Non disponible'
NON_ETUDIE = ('NON_ETUDIE', False, False), 'Non étudié'
PARTANT = ('PARTANT', False, False), 'Partant'
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 Administre(models.Model):
"""
Modèle des administrés
"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'a_id_sap'
CATEGORIE = 'a_categorie'
STATUT_CONCERTO = 'a_statut_concerto'
STATUT_CONCERTO_FUTUR = 'a_statut_concerto_futur'
DATE_STATUT_CONCERTO = 'a_date_statut_concerto'
DATE_STATUT_CONCERTO_FUTUR = 'a_date_statut_concerto_futur'
# relations many-to-many
M2M_COMPETENCES = 'a_liste_id_competences'
M2M_PAM = 'pam'
# relations one-to-many
O2M_FMOB = 'fmobs'
# relations one-to-one ou many-to-one
REL_DOMAINE = 'a_domaine'
REL_FILIERE = 'a_filiere'
REL_DECISION = 'decision'
REL_FONCTION = 'fonction'
REL_FORMATION_EMPLOI = 'formation_emploi'
REL_GRADE = 'grade'
REL_SOUS_VIVIER = 'sous_vivier'
STATUT_PAM = 'a_statut_pam'
REL_PAM_INTER = 'administre'
objects = BulkUpdateOrCreateQuerySet.as_manager()
a_id_sap = models.IntegerField(primary_key=True)
formation_emploi = models.ForeignKey(FormationEmploi, related_name="formation_emploi", on_delete=models.SET_NULL,
null=True, blank=True)
pam = models.ManyToManyField(PAM, through='Administres_Pams')
fonction = models.ForeignKey(Fonction, on_delete=models.SET_NULL, null=True, blank=True)
sous_vivier = models.ForeignKey(SousVivier, on_delete=models.SET_NULL, null=True, blank=True)
grade = models.ForeignKey(Grade, on_delete=models.SET_NULL, null=True, blank=True)
a_grade_date_debut = models.CharField(max_length=100, null=True, blank=True)
a_liste_id_marques = models.CharField(max_length=100, null=True, blank=True)
a_liste_id_competences = models.ManyToManyField(Competence, blank=True)
a_nom = models.CharField(max_length=100)
a_prenom = models.CharField(max_length=100)
a_sexe = models.CharField(max_length=100, null=True, blank=True)
a_id_def = models.CharField(max_length=100, null=True, blank=True)
a_eip = models.CharField(max_length=100, null=True, blank=True)
a_fonction = models.CharField(max_length=100, null=True, blank=True)
a_code_fonction = models.CharField(max_length=100, null=True, blank=True)
a_domaine = models.ForeignKey(Domaine, on_delete=models.SET_NULL, null=True, blank=True, db_constraint=False)
a_filiere = models.ForeignKey(Filiere, on_delete=models.SET_NULL, null=True, blank=True, db_constraint=False)
a_nf = models.CharField(max_length=100, null=True, blank=True, choices=NiveauFonctionnelChoices.choices)
a_domaine_poste = models.ForeignKey(Domaine, related_name="domaine_poste", on_delete=models.SET_NULL, null=True, blank=True)
a_filiere_poste = models.ForeignKey(Filiere, related_name="filiere_poste", on_delete=models.SET_NULL, null=True, blank=True)
a_nf_poste = models.CharField(max_length=100, null=True, blank=True, choices=NiveauFonctionnelChoices.choices)
a_categorie = models.CharField(max_length=5, null=True, blank=True)
a_domaine_futur = models.ForeignKey(Domaine, related_name="domaine_futur", on_delete=models.SET_NULL, null=True, blank=True)
a_filiere_futur = models.ForeignKey(Filiere, related_name="filiere_futur", on_delete=models.SET_NULL, null=True, blank=True)
a_nf_futur = models.CharField(max_length=100, null=True, blank=True, choices=NiveauFonctionnelChoices.choices)
a_domaine_gestion = models.CharField('Domaine de gestion (BVT)', max_length=100, null=True, blank=True)
a_date_entree_service = models.CharField(max_length=100, null=True, blank=True)
a_arme = models.CharField(max_length=100, null=True, blank=True)
a_rg_origine_recrutement = models.CharField(max_length=100, null=True, blank=True)
a_date_naissance = models.CharField(max_length=100, null=True, blank=True)
a_diplome_hl = models.CharField(max_length=100, null=True, blank=True)
a_dernier_diplome = models.CharField(max_length=100, null=True, blank=True)
a_credo_fe = models.CharField(max_length=100, null=True, blank=True)
a_date_arrivee_fe = models.CharField(max_length=100, null=True, blank=True)
a_pos_statuaire = models.CharField(max_length=100, null=True, blank=True)
a_date_pos_statuaire = models.CharField(max_length=100, null=True, blank=True)
a_interruption_service = models.CharField(max_length=100, null=True, blank=True)
a_situation_fam = models.CharField(max_length=100, null=True, blank=True)
a_date_mariage = models.CharField(max_length=100, null=True, blank=True)
a_nombre_enfants = models.IntegerField(null=True, blank=True)
a_enfants = models.CharField(max_length=100, null=True, blank=True)
a_date_rdc = models.DateField(null=True, blank=True)
a_date_dernier_acr = models.DateField(null=True, blank=True)
a_eis = models.CharField(max_length=100, null=True, blank=True)
a_sap_conjoint = models.IntegerField(null=True, blank=True)
a_flag_particulier = models.IntegerField(null=True, blank=True)
a_notes_partagees = models.TextField(null=True, blank=True)
a_eip_fiche_detaille = models.CharField(max_length=100, null=True, blank=True)
a_eip_futur = models.CharField(max_length=100, null=True, blank=True)
a_liste_depts_souhaites = models.CharField(max_length=100, null=True, blank=True)
a_liste_zones_geographiques_shm = models.CharField(max_length=100, null=True, blank=True)
a_pls_gb_max = models.IntegerField(null=True, blank=True)
a_marqueur_pn = models.BooleanField(default=False, null=True)
a_fonction1 = models.CharField(max_length=100, null=True, blank=True)
a_fonction2 = models.CharField(max_length=100, null=True, blank=True)
a_fonction3 = models.CharField(max_length=100, null=True, blank=True)
a_fonction4 = models.CharField(max_length=100, null=True, blank=True)
a_fonction5 = models.CharField(max_length=100, null=True, blank=True)
a_fonction6 = models.CharField(max_length=100, null=True, blank=True)
a_fonction7 = models.CharField(max_length=100, null=True, blank=True)
a_fonction8 = models.CharField(max_length=100, null=True, blank=True)
a_fonction9 = models.CharField(max_length=100, null=True, blank=True)
a_date_fonction1 = models.CharField(max_length=100, null=True, blank=True)
a_date_fonction2 = models.CharField(max_length=100, null=True, blank=True)
a_date_fonction3 = models.CharField(max_length=100, null=True, blank=True)
a_date_fonction4 = models.CharField(max_length=100, null=True, blank=True)
a_date_fonction5 = models.CharField(max_length=100, null=True, blank=True)
a_date_fonction6 = models.CharField(max_length=100, null=True, blank=True)
a_date_fonction7 = models.CharField(max_length=100, null=True, blank=True)
a_date_fonction8 = models.CharField(max_length=100, null=True, blank=True)
a_date_fonction9 = models.CharField(max_length=100, null=True, blank=True)
a_profession_conjoint = models.CharField(max_length=100, null=True, blank=True)
a_id_def_conjoint = models.CharField(max_length=100, null=True, blank=True)
a_notes_gestionnaire = models.TextField(null=True, blank=True)
a_statut_pam = models.CharField('statut PAM', max_length=100,choices=StatutPamChoices.choices, null=True, blank=True)
a_sexe_conjoint = models.CharField(max_length=100, null=True, blank=True)
a_lien_service = models.CharField(max_length=100, null=True, blank=True)
a_age_en_annees = models.CharField(max_length=100, null=True, blank=True)
a_origine_recrutement = models.CharField(max_length=100, null=True, blank=True)
statut_futur = models.CharField('statut futur', db_column='a_statut_futur', max_length=8, choices=StatutFuturChoices.choices, null=True, blank=True)
date_statut_futur = models.DateField('date du statut futur', db_column='a_date_statut_futur', null=True, blank=True)
a_statut_concerto = models.CharField('statut CONCERTO', max_length=1000, null=True, blank=True)
a_date_statut_concerto = models.CharField('date du statut CONCERTO', max_length=32, null=True, blank=True)
a_statut_concerto_futur = models.CharField('statut CONCERTO futur', max_length=100, null=True, blank=True)
a_date_statut_concerto_futur = models.CharField('date du statut CONCERTO futur', max_length=32, null=True, blank=True)
suivi_previsionnel_situation = models.CharField('suivi prévisionnel de la situation du militaire', max_length=100, choices=SuiviPrevisionnelMilitaire.choices, null=True, blank=True)
date_suivi_previsionnel_situation = models.DateField('date du suivi prévisionnel de la situation du militaire', db_column='a_date_suivi_previsionnel_situation', null=True, blank=True)
a_annee_previsible_mutation = models.PositiveIntegerField('année prévisible de mutation', null=True, blank=True)
a_fud = models.CharField('FUD de départ', max_length=32, null=True, blank=True)
a_date_fud = models.CharField('date du FUD', max_length=32, null=True, blank=True)
a_ciat = models.BooleanField('CIAT', default=False, null=True)
a_specifique = models.CharField('PPE / SHM / ITD', max_length=250, choices=SpecifiqueChoices.choices, null=True, blank=True)
a_date_affectation = models.DateField("Date d'affectation", null=True, blank=True)
class Meta:
verbose_name = "Administré"
verbose_name_plural = "Administrés"
constraints = [
models.CheckConstraint(
name='%(app_label)s_%(class)s_a_nf_valid',
check=models.Q(a_nf__in=NiveauFonctionnelChoices.values)
),
models.CheckConstraint(
name='%(app_label)s_%(class)s_a_nf_poste_valid',
check=models.Q(a_nf_poste__in=NiveauFonctionnelChoices.values)
),
models.CheckConstraint(
name='%(app_label)s_%(class)s_a_nf_futur_valid',
check=models.Q(a_nf_futur__in=NiveauFonctionnelChoices.values)
),
models.CheckConstraint(
name='%(app_label)s_%(class)s_statut_pam_valid',
check=models.Q(a_statut_pam__in=StatutPamChoices.values)
),
models.CheckConstraint(
name='%(app_label)s_%(class)s_statut_futur_valid',
check=models.Q(statut_futur__in=StatutFuturChoices.values)
),
models.CheckConstraint(
name='%(app_label)s_%(class)s_a_specifique',
check=models.Q(a_specifique__in=SpecifiqueChoices.values)
)
]
class Administres_Pams(models.Model):
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'id'
REL_PAM = 'pam'
REL_ADMINISTRE = 'administre'
O2M_FMOB = 'fmobs'
REL_DECISION = 'decision'
STATUT_PAM = 'a_statut_pam_annee'
objects = BulkUpdateOrCreateQuerySet.as_manager()
id = models.CharField(primary_key=True, max_length=100)
pam = models.ForeignKey(PAM, on_delete = models.CASCADE, related_name='pam')
administre = models.ForeignKey(Administre, on_delete=models.CASCADE, related_name=Administre.Cols.REL_PAM_INTER)
a_statut_pam_annee = models.CharField('statut PAM', max_length=100,choices=StatutPamChoices.choices, null=True, blank=True)
notes_pam = models.TextField(null=True, blank=True)
a_ciat_pam = models.BooleanField('CIAT', default=False, null=True)
a_specifique_pam = models.CharField('PPE / SHM / ITD', max_length=250, choices=SpecifiqueChoices.choices, null=True, blank=True)
a_liste_depts_souhaites_pam = models.CharField(max_length=100, null=True, blank=True)
a_liste_zones_geographiques_shm_pam = models.CharField(max_length=100, null=True, blank=True)
a_situationfuture_notes_fe = models.TextField(null=True, blank=True)
class Affectation(models.Model):
"""
Modèle pour les affectations
"""
administre = models.ForeignKey(Administre, on_delete=models.CASCADE, null=True, blank=True, related_name='adm_affec', db_constraint=False)
affect_libelle = models.CharField(max_length=100, null=True, blank=True)
affect_date = models.CharField(max_length=100, null=True, blank=True)
class Diplome(models.Model):
"""
Modèle pour les diplomes
"""
administre = models.ForeignKey(Administre, on_delete=models.CASCADE, null=True, blank=True, related_name='adm_dip', db_constraint=False)
diplome_libelle = models.CharField(max_length=100, null=True, blank=True)
diplome_date = models.CharField(max_length=100, null=True, blank=True)
diplome_note = models.CharField(max_length=100, null=True, blank=True)
diplome_niveau = models.CharField(max_length=100, null=True, blank=True)
class FUD(models.Model):
"""
Modèle pour les formulaires unitaires de demandes
"""
administre = models.ForeignKey(Administre, on_delete=models.CASCADE, null=True, blank=True, related_name='adm_fud', db_constraint=False)
fud_libelle = models.CharField(max_length=100, null=True, blank=True)
fud_date_debut = models.CharField(max_length=100, null=True, blank=True)
fud_date_fin = models.CharField(max_length=100, null=True, blank=True)

View File

@@ -0,0 +1,44 @@
from django.db import models
from django.db.models import Q
from .pam import PAM
from .sous_vivier import SousVivier
class StatutCalculChoices(models.TextChoices):
AUCUN = 'AUCUN', 'aucun'
EN_ATTENTE = 'EN_ATTENTE', 'en attente'
EN_ATTENTE_ARRET = 'EN_ATTENTE_ARRET', "en attente d'arrêt"
EN_COURS = 'EN_COURS', 'en cours'
TERMINE = 'TERMINE', 'terminé'
ERREUR_ADMINISTRE = 'ERREUR_ADMINISTRE','terminé en erreur administré',
ERREUR_POSTE = 'ERREUR_POSTE', 'terminé en erreur poste',
ERREUR = 'ERREUR', 'terminé en erreur'
TERMINE_DE_FORCE = 'TERMINE_DE_FORCE', 'terminé de force'
class Calcul(models.Model):
"""
Modèle pour le suivi des calculs
On y intègre également le statut du calcul
"""
id = models.CharField(max_length=100, primary_key=True, default="")
sous_vivier = models.ForeignKey(SousVivier, on_delete=models.CASCADE, verbose_name="Sous-vivier")
pam = models.ForeignKey(PAM, on_delete=models.CASCADE, null=True, blank=True)
ca_date_debut = models.DateTimeField('Date de début', null=True, blank=True)
ca_date_fin = models.DateTimeField('Date de fin', null=True, blank=True)
ca_statut = models.CharField('Statut', max_length=40, choices=StatutCalculChoices.choices)
ca_statut_pourcentage = models.FloatField('Avancement (%)',default=0)
class Meta:
constraints = [
models.CheckConstraint(
name='%(app_label)s_%(class)s_ca_statut_valid',
check=models.Q(ca_statut__in=StatutCalculChoices.values)
),
models.CheckConstraint(
name='%(app_label)s_%(class)s_ca_statut_pourcentage_valid',
check=Q(ca_statut_pourcentage__gte=0.0) & Q(ca_statut_pourcentage__lte=100.0)
),
]

View File

@@ -0,0 +1,31 @@
from django.db import models
class NiveauFonctionnelChoices(models.TextChoices):
"""
Choix pour les niveaux fonctionnels
"""
N1A = '1A', '1A'
N1B = '1B', '1B'
N1C = '1C', '1C'
N2 = '2.', '2.'
N3A = '3A', '3A'
N3B = '3B', '3B'
N3B_NFS = '3B NFS', '3B NFS'
N4 = '4.', '4.'
N5A = '5A', '5A'
N5B = '5B', '5B'
N5C = '5C', '5C'
N6A = '6A', '6A'
N6B = '6B', '6B'
class SpecifiqueChoices(models.TextChoices):
"""
Choix pour les propositions de CIAT
"""
SHM = 'SHM', 'SHM'
ITD = 'ITD', 'ITD'
PPE = 'PPE', 'PPE'

View File

@@ -0,0 +1,31 @@
from django.db import models
from .domaine import Domaine
from .filiere import Filiere
class Competence(models.Model):
"""Modèle Compétences"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'comp_id'
CATEGORIE = 'comp_categorie'
LIBELLE = 'comp_libelle'
# relations one-to-one ou many-to-one
REL_DOMAINE = 'comp_domaine'
REL_FILIERE = 'comp_filiere'
comp_id = models.CharField('ID', primary_key=True, max_length=100)
comp_libelle = models.CharField('libellé', null=True, blank=True, max_length=100)
comp_domaine = models.ForeignKey(Domaine, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='domaine')
comp_filiere = models.ForeignKey(Filiere, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='filière')
comp_categorie = models.CharField('catégorie', max_length=100, null=True, blank=True)
def as_dict(self):
return {
"id": self.comp_id,
"libelle": self.comp_libelle,
}

View File

@@ -0,0 +1,113 @@
from enum import Enum, auto
from django.db import models
from .administre import Administre, Administres_Pams
from .initial import PAM, Notation
from .poste import Poste, Postes_Pams
class DecisionTree(Enum):
""" enum pour les types d'arbres de décisions """
# métropole
ME = auto()
# hors métropole
HME = auto()
def __repr__(self):
return self.__str__()
class DecisionChoices(models.TextChoices):
"""
Choix pour les statuts de décisions
attributs supplémentaires :
- trees : Tuple[DecisionTree], permet de savoir à quel(s) arbre(s) appartient le statut
"""
# arbre de décision en métropole
PROPOSITION_FE = ('PROPOSITION_FE', DecisionTree.ME), 'Proposition de FE'
DIALOGUE_EN_COURS = ('DIALOGUE_EN_COURS', DecisionTree.ME), 'Dialogue en cours'
DIALOGUE_TERMINE = ('DIALOGUE_TERMINE', DecisionTree.ME), 'Dialogue terminé'
DIALOGUE_INFRUCTUEUX = ('DIALOGUE_INFRUCTUEUX', DecisionTree.ME), 'Dialogue infructueux'
FOREMP_EN_COURS = ('FOREMP_EN_COURS', DecisionTree.ME), 'FOREMP en cours'
FOREMP_TERMINE = ('FOREMP_TERMINE', DecisionTree.ME), 'FOREMP terminé'
PREPOSITIONNE = ('PREPOSITIONNE', DecisionTree.ME), 'Prépositionné'
POSITIONNE = ('POSITIONNE', DecisionTree.ME), 'Positionné'
OMIP_EN_COURS = ('OMIP_EN_COURS', DecisionTree.ME), 'OMIP en cours'
OMIP_TERMINE = ('OMIP_TERMINE', DecisionTree.ME), 'OMIP terminé'
ATTENTE_AVIONAGE = ('ATTENTE_AVIONAGE', DecisionTree.ME), "En attente d'avionage"
OMI_EN_COURS = ('OMI_EN_COURS', DecisionTree.ME), 'OMI en cours'
OMI_ACTIVE = ('OMI_ACTIVE', DecisionTree.ME), 'OMI terminé'
OMI_ANNULE = ('OMI_ANNULE', DecisionTree.ME), 'OMI annulation'
# arbre de décision hors métropole
HME_DIALOGUE_INITIE = ('HME_DIALOGUE_INITIE', DecisionTree.HME), 'Dialogue initié (HME)'
HME_DIALOGUE_EN_COURS = ('HME_DIALOGUE_EN_COURS', DecisionTree.HME), 'Dialogue en cours (HME)'
HME_DIALOGUE_INFRUCTUEUX = ('HME_DIALOGUE_INFRUCTUEUX', DecisionTree.HME), 'Dialogue infructueux (HME)'
HME_DIALOGUE_TERMINE = ('HME_DIALOGUE_TERMINE', DecisionTree.HME), 'Dialogue terminé (HME)'
HME_PROPOSITION_VIVIER = ('HME_PROPOSITION_VIVIER', DecisionTree.HME), 'Proposition vivier HME'
HME_ETUDE_DESISTEMENT = ('HME_ETUDE_DESISTEMENT', DecisionTree.HME), 'Etude désistement (HME)'
HME_DESISTEMENT = ('HME_DESISTEMENT', DecisionTree.HME), 'Désistement activé (HME)'
HME_PREPOSITIONNE = ('HME_PREPOSITIONNE', DecisionTree.HME), 'Prépositionné (HME)'
HME_VALIDATION_EXPERT = ('HME_VALIDATION_EXPERT', DecisionTree.HME), 'Validation HME (HME)'
HME_REFUS_EXPERT = ('HME_REFUS_EXPERT', DecisionTree.HME), 'Refus HME (HME)'
HME_POSITIONNE = ('HME_POSITIONNE', DecisionTree.HME), 'Positionné (HME)'
HME_FOREMP_EN_COURS = ('HME_FOREMP_EN_COURS', DecisionTree.HME), 'FOREMP en cours (HME)'
HME_FOREMP_TERMINE = ('HME_FOREMP_TERMINE', DecisionTree.HME), 'FOREMP terminé (HME)'
HME_OMIP_EN_COURS = ('HME_OMIP_EN_COURS', DecisionTree.HME), 'OMIP en cours (HME)'
HME_OMIP_TERMINE = ('HME_OMIP_TERMINE', DecisionTree.HME), 'OMIP terminé (HME)'
HME_ATTENTE_AVIONAGE = ('HME_ATTENTE_AVIONAGE', DecisionTree.HME), "En attente d'avionage (HME)"
HME_OMI_EN_COURS = ('HME_OMI_EN_COURS', DecisionTree.HME), 'OMI en cours (HME)'
HME_OMI_ACTIVE = ('HME_OMI_ACTIVE', DecisionTree.HME), 'OMI terminé (HME)'
HME_OMI_ANNULE = ('HME_OMI_ANNULE', DecisionTree.ME), 'OMI annulation'
REMIS_A_DISPOSITION = ('REMIS_A_DISPOSITION', (DecisionTree.ME, DecisionTree.HME)), 'Remis à disposition'
def __new__(cls, value):
obj = str.__new__(cls, value[0])
obj._value_ = value[0]
_trees = value[1]
obj.trees = _trees if isinstance(_trees, tuple) else (_trees,) if _trees else ()
return obj
def __repr__(self):
return "%s.%s" % (self.__class__.__name__, self._name_)
# Modèle pour les décisions
class Decision(models.Model):
"""
Modèle pour les décisions
"""
class Cols():
""" Constantes pour les noms de colonnes """
STATUT = 'de_decision'
DATE = 'de_date_decision'
# relations one-to-one ou many-to-one
REL_ADMINISTRE = 'administre'
REL_POSTE = 'poste'
administre_pam = models.OneToOneField(Administres_Pams, on_delete=models.CASCADE, related_name=Administres_Pams.Cols.REL_DECISION, primary_key=True, default="")
administre = models.ForeignKey(Administre, on_delete=models.CASCADE, related_name=Administres_Pams.Cols.REL_DECISION)
poste = models.ForeignKey(Poste, on_delete=models.CASCADE, related_name= Postes_Pams.Cols.O2M_DECISION)
poste_pam = models.OneToOneField(Postes_Pams, on_delete=models.CASCADE, related_name= Postes_Pams.Cols.O2M_DECISION, default="")
de_decision = models.CharField('Décision', max_length=50, choices=DecisionChoices.choices)
de_date_decision = models.DateTimeField('Date de décision', auto_now=True)
de_notes_gestionnaire = models.TextField(null=True, blank=True)
de_notes_partagees = models.TextField(null=True, blank=True)
notation = models.ForeignKey(Notation, on_delete=models.SET_NULL, null=True, blank=True)
class Meta:
constraints = [
models.CheckConstraint(
name='%(app_label)s_%(class)s_de_decision_valid',
check=models.Q(de_decision__in=DecisionChoices.values)
)
]
verbose_name = 'Décision'
verbose_name_plural = 'Décisions'

View File

@@ -0,0 +1,21 @@
from django.db import models
class Domaine(models.Model):
"""
Modèle des domaines
"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'd_code'
d_code = models.CharField('code', primary_key=True, max_length=100)
def as_dict(self):
return {
'id': self.d_code,
'code': self.d_code,
'libelle': self.d_code,
}

View File

@@ -0,0 +1,11 @@
from django.db import models
class FichiersExporte(models.Model):
"""Modèle de fichiers exportés"""
nom_fichier = models.CharField(null=True, blank=True, max_length=100)
date_export = models.DateTimeField(null=True, blank=True, auto_now=True)
class Meta:
verbose_name = 'Fichier exporté'
verbose_name_plural = 'Fichiers exportés'

View File

@@ -0,0 +1,28 @@
from django.db import models
from .domaine import Domaine
class Filiere(models.Model):
"""
Modèle des filières
"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'f_code'
# relations one-to-one ou many-to-one
REL_DOMAINE = 'domaine'
f_code = models.CharField('code', primary_key=True, max_length=100)
domaine = models.ForeignKey(Domaine, on_delete=models.SET_NULL, null=True, blank=True)
def as_dict(self):
return {
'id': self.f_code,
'domaineId': self.domaine_id,
'code': self.f_code,
'libelle': self.f_code,
}

View File

@@ -0,0 +1,71 @@
from bulk_update_or_create import BulkUpdateOrCreateQuerySet
from django.db import models
from .administre import Administre, Administres_Pams
class FMOB(models.Model):
"""Modèle de FMOB
"""
CHOICES_STATUT = [('Annulé', 'Annulé'), ('Classé sans suite', 'Classé sans suite'), ('Non réceptionné', 'Non réceptionné'),
('Réceptionné', 'Réceptionné')]
objects = BulkUpdateOrCreateQuerySet.as_manager()
fmob_id = models.CharField(max_length=100, primary_key=True)
administre = models.OneToOneField(Administres_Pams, on_delete=models.CASCADE, null=True, blank=True, related_name='fmobs')
#administre = models.ForeignKey(Administre, on_delete=models.CASCADE, null=True, blank=True, related_name=Administre.Cols.O2M_FMOB, db_constraint=False)
fmob_millesime = models.IntegerField(null=True, blank=True)
fmob_millesime_femp = models.IntegerField(null=True, blank=True)
fmob_reception_drhat_fmob = models.BooleanField(default=False)
fmob_annulation_fmob = models.BooleanField(default=False)
fmob_annulation_femp = models.BooleanField(default=False)
fmob_sans_suite_militaire_fmob = models.BooleanField(default=False)
fmob_sans_suite_militaire_femp = models.BooleanField(default=False)
fmob_date_visa_militaire = models.DateField(max_length=100, null=True, blank=True)
fmob_depart_institution_soff = models.BooleanField(default=False)
fmob_mobilite_bassin_externe = models.BooleanField(default=False)
fmob_mobilite_bassin_interne = models.BooleanField(default=False)
fmob_mobilite_centre_interet_adt = models.BooleanField(default=False)
fmob_mobilite_dans_specialite = models.BooleanField(default=False)
fmob_mobilite_hors_metropole = models.BooleanField(default=False)
fmob_mobilite_recrutement_particulier_administre = models.BooleanField(default=False)
fmob_motif_edition_la = models.CharField(max_length=100, null=True, blank=True)
fmob_motif_edition_ll = models.CharField(max_length=100, null=True, blank=True)
fmob_reception_drhat_fmob = models.BooleanField(default=False)
fmob_reconnaissance_parcours_pro_administre = models.BooleanField(default=False)
fmob_proposition_affectation_verrouille = models.CharField(max_length=100, null=True, blank=True)
fmob_reception_drhat_femp = models.BooleanField(default=False)
fmob_avis_cdc_mobilite_interne = models.BooleanField(default=False)
fmob_avis_cdc_mobilite_externe = models.BooleanField(default=False)
fmob_avis_cdc_mutation_administre = models.BooleanField(default=False)
fmob_avis_cdc_mobilite_centre_interet = models.BooleanField(default=False)
fmob_avis_cdc_mobilite_specialite = models.BooleanField(default=False)
fmob_avis_cdc_mobilite_hors_metropole = models.BooleanField(default=False)
fmob_avis_cdc_mobilite_recrutement_particulier_admin = models.BooleanField(default=False)
fmob_date_deb_fmob = models.CharField(max_length=100, null=True, blank=True)
fmob_date_fin_fmob = models.CharField(max_length=100, null=True, blank=True)
fmob_date_signature_admin_fmob = models.DateField(max_length=100, null=True, blank=True)
fmob_date_signature_admin_femp = models.DateField(max_length=100, null=True, blank=True)
fmob_date_signature_chef_de_corps = models.DateField(max_length=100, null=True, blank=True)
fmob_remarques_eventuelles_administres = models.TextField(null=True, blank=True)
fmob_avis_commandant_formation = models.TextField(null=True, blank=True)
fmob_fonction_1 = models.CharField(max_length=100, null=True, blank=True)
fmob_fonction_2 = models.CharField(max_length=100, null=True, blank=True)
fmob_fonction_3 = models.CharField(max_length=100, null=True, blank=True)
fmob_fonction_4 = models.CharField(max_length=100, null=True, blank=True)
fmob_fonction_5 = models.CharField(max_length=100, null=True, blank=True)
fmob_commune_1 = models.CharField(max_length=100, null=True, blank=True)
fmob_commune_2 = models.CharField(max_length=100, null=True, blank=True)
fmob_commune_3 = models.CharField(max_length=100, null=True, blank=True)
fmob_commune_4 = models.CharField(max_length=100, null=True, blank=True)
fmob_commune_5 = models.CharField(max_length=100, null=True, blank=True)
fmob_prio_1 = models.BooleanField(default=False)
fmob_prio_2 = models.BooleanField(default=False)
fmob_prio_3 = models.BooleanField(default=False)
fmob_prio_4 = models.BooleanField(default=False)
fmob_prio_5 = models.BooleanField(default=False)
fmob_avis_mutabilite = models.CharField(max_length=100, null=True, blank=True)
fmob_obs = models.CharField(max_length=100, null=True, blank=True)
fmob_fe_future = models.CharField(max_length=100, null=True, blank=True)
fmob_statut = models.CharField(max_length=100, null=True, blank=True, choices=CHOICES_STATUT)
fmob_commentaire_ac = models.TextField(null=True, blank=True)

View File

@@ -0,0 +1,15 @@
from django.db import models
class Fonction(models.Model):
"""
Modèle des fonctions
"""
fon_id = models.CharField(max_length=100, primary_key=True)
fon_libelle = models.CharField(max_length=100)
def as_dict(self):
return {
"id": self.fon_id,
"libelle": self.fon_libelle,
}

View File

@@ -0,0 +1,96 @@
from django.db import models
from .garnison import Garnison
from .user import CustomUser
class GroupeFe(models.Model):
"""
Modèle de groupes FE
"""
groupe_fe_nom = models.CharField(primary_key=True, max_length=100, verbose_name='Groupe de FE')
def __str__(self):
return self.groupe_fe_nom
class PcpFeGroupe(models.Model):
"""
Modèle d'association des groupes de FE aux gestionnaires PCP
"""
CATEGORIE_CHOICES = [('MDR', 'MDR'), ('OFF', 'OFF'), ('SOFF', 'SOFF'), ('OGX', 'OGX')]
pcp_fe_id = models.AutoField(primary_key=True)
pcp_fe_groupe = models.ForeignKey(GroupeFe, null=True, blank=True, on_delete=models.CASCADE,
verbose_name='Nom du groupe')
pcp_fe_categorie = models.CharField(max_length=5, choices=CATEGORIE_CHOICES, null=True, blank=True, verbose_name='Catégorie')
gestionnaire = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True, blank=True, db_constraint=False)
def __str__(self):
return str(self.gestionnaire.first_name) + ' ' + str(self.gestionnaire.last_name.upper()) + ' / ' + self.pcp_fe_groupe.groupe_fe_nom + ' / ' + self.pcp_fe_categorie
class Meta:
verbose_name = 'Lien gest PCP / groupe FE'
verbose_name_plural = 'Liens gest PCP / groupe FE'
class FormationEmploi(models.Model):
"""
Modèle des formations d'emplois
"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'fe_code'
LIBELLE = 'fe_libelle'
ZONE_DEFENSE = 'zone_defense'
REL_MERE = 'mere'
REL_POSTE = 'poste'
M2M_GESTIONNAIRE = 'gestionnaires'
fe_code = models.CharField(primary_key=True, max_length=100)
groupe_fe = models.ForeignKey(GroupeFe, blank=True, on_delete=models.SET_NULL, null=True)
gestionnaires = models.ManyToManyField(CustomUser, related_name=CustomUser.Cols.M2M_FORMATION_EMPLOIS, blank=True)
fe_code_postal = models.CharField(max_length=100, null=True, blank=True)
fe_garnison_lieu = models.CharField(max_length=100, null=True, blank=True)
fe_libelle = models.CharField(max_length=100, null=True, blank=True)
fe_taux_armement_cible_off = models.FloatField(null=True, blank=True, verbose_name="TA cible OFF")
fe_nb_poste_reo_off = models.IntegerField(null=True, blank=True)
fe_nb_poste_reevalue_off = models.IntegerField(null=True, blank=True)
fe_nb_poste_vacant_off = models.IntegerField(null=True, blank=True)
fe_nb_poste_occupe_off = models.IntegerField(null=True, blank=True)
fe_taux_armement_cible_soff = models.FloatField(null=True, blank=True, verbose_name="TA cible SOFF")
fe_nb_poste_reo_soff = models.IntegerField(null=True, blank=True)
fe_nb_poste_reevalue_soff = models.IntegerField(null=True, blank=True)
fe_nb_poste_vacant_soff = models.IntegerField(null=True, blank=True)
fe_nb_poste_occupe_soff = models.IntegerField(null=True, blank=True)
fe_taux_armement_cible_mdr = models.FloatField(null=True, blank=True, verbose_name="TA cible MDR")
fe_nb_poste_reo_mdr = models.IntegerField(null=True, blank=True)
fe_nb_poste_reevalue_mdr = models.IntegerField(null=True, blank=True)
fe_nb_poste_vacant_mdr = models.IntegerField(null=True, blank=True)
fe_nb_poste_occupe_mdr = models.IntegerField(null=True, blank=True)
fe_mere_credo = models.CharField('Code FE mère', max_length=100, null=True, blank=True)
fe_mere_la = models.CharField('Libelle FE mère', max_length=100, null=True, blank=True)
fe_fot = models.CharField(max_length=100, null=True, blank=True)
fe_abo_fe = models.CharField(max_length=100, null=True, blank=True)
fe_pilier_niv1 = models.CharField(max_length=100, null=True, blank=True)
fe_code_niv_org4 = models.CharField('Code niveau d\'org 4', max_length=100, null=True, blank=True)
fe_niv_org4 = models.CharField('Libelle niveau d\'org 4', max_length=100, null=True, blank=True)
fe_code_niv_org4_mdr = models.CharField('Code niveau d\'org 4 (MDR)', max_length=100, null=True, blank=True)
fe_niv_org4_mdr = models.CharField('Libelle niveau d\'org 4 (MDR)', max_length=100, null=True, blank=True)
zone_defense = models.CharField('zone de défense', db_column='fe_zone_defense', max_length=64, blank=True, null=True)
mere = models.ForeignKey('self', blank=True, null=True, on_delete=models.SET_NULL, verbose_name='FE mère', db_column='fe_mere_id')
def as_dict(self):
return {
"id": self.fe_code,
"code": self.fe_code,
"libelle": self.fe_libelle,
"mere_code": self.fe_mere_credo,
"mere_la": self.fe_mere_la,
"groupe_fe": self.groupe_fe_id,
"fe_garnison_lieu": self.fe_garnison_lieu,
"zone_defense": self.zone_defense
}

View File

@@ -0,0 +1,21 @@
from django.db import models
class Garnison(models.Model):
"""
Modèle des garnisons
"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'gar_id'
LIEU = 'gar_lieu'
CODE_POSTAL = 'gar_code_postal'
gar_id = models.CharField(max_length=100, primary_key=True)
gar_lieu = models.CharField(max_length=100, verbose_name="Garnison")
gar_code_postal = models.CharField(max_length=100, null=True, blank=True)
def __str__(self):
return self.gar_lieu

View File

@@ -0,0 +1,21 @@
from django.db import models
# FIXME le code grade et libellé sont inversés
class Grade(models.Model):
"""
Modèle des grades
"""
gr_code = models.CharField(max_length=100, primary_key=True)
gr_categorie = models.CharField(max_length=100, null=True, blank=True)
gr_ordre = models.IntegerField(null=True, blank=True)
def as_dict(self):
return {
"id": self.gr_code,
"code": self.gr_code,
# TODO corriger ci-dessous : catégorie (ex : "Sous-officiers"), libellé long (ex : "SERGENT CHEF") + ordre
"categorie": self.gr_categorie,
"ordre": self.gr_ordre
}

View File

@@ -0,0 +1,231 @@
"""
Ce dossier contient tous les modèles de la base de données d'OGURE
"""
from bulk_update_or_create import BulkUpdateOrCreateQuerySet
from django.db import models
from django.utils.translation import ugettext_lazy as _
from .administre import Administre, Administres_Pams
from .commun import NiveauFonctionnelChoices, SpecifiqueChoices
from .competence import Competence
from .domaine import Domaine
from .filiere import Filiere
from .garnison import Garnison
from .grade import Grade
from .poste import Poste, Postes_Pams
from .sous_vivier import SousVivier
from .pam import PAM
"""
Script de création des diffferentes tables de la base
OGURE NG utilisation de l'ORM de Django pour réaliser cette étape
"""
# TODO: supprimer ce modèle et le remplacer par le nouveau modèle des Sous-viviers
# Modèle de l'association des sous-viviers à la catégorie et la filière
class SousVivierAssociation(models.Model):
"""Modèle de l'association des sous-viviers à la catégorie et la filière
"""
CATEGORIE_CHOICES = [('MDR', 'MDR'), ('SOFF', 'SOFF'), ('OFF', 'OFF'), ('OGX', 'OGX')]
sva_id = models.IntegerField(primary_key=True)
sous_vivier = models.ForeignKey(SousVivier, on_delete=models.SET_NULL, null=True, blank=True)
filiere = models.ForeignKey(Filiere, on_delete=models.SET_NULL, null=True, blank=True)
sva_categorie = models.CharField(max_length=5, choices=CATEGORIE_CHOICES)
sva_arme = models.CharField(max_length=20, null=True, blank=True)
# Modèle des Groupes de marques
class MarquesGroupe(models.Model):
"""Modèle des Groupes de marques
"""
gm_id = models.IntegerField(primary_key=True)
gm_type = models.CharField(max_length=100)
gm_code = models.CharField(max_length=100)
gm_libelle = models.CharField(max_length=100)
gm_ordre = models.IntegerField(null=True, blank=True)
gm_selection_multiple = models.BooleanField(null=True, blank=True)
def as_dict(self):
return {
"id": self.gm_id,
"type": self.gm_type,
"code": self.gm_code,
"libelle": self.gm_libelle,
"selectionMultiple": self.gm_selection_multiple,
"ordre": self.gm_ordre
}
# Modèle des Marques
class Marque(models.Model):
"""Modèle des Marques
"""
mar_id = models.TextField(primary_key=True)
groupe_marques = models.ForeignKey(MarquesGroupe, on_delete=models.CASCADE)
mar_code = models.CharField(max_length=100)
mar_libelle = models.CharField(max_length=100)
mar_ordre = models.IntegerField(null=True, blank=True)
def as_dict(self):
return {
"id": self.mar_id,
"groupeMarquesId": self.groupe_marques_id,
"code": self.mar_code,
"libelle": self.mar_libelle,
"ordre": self.mar_ordre
}
class ZoneGeographique(models.Model):
"""Modèle des Zones Geographiques
"""
zone_id = models.CharField(max_length=100, primary_key=True)
zone_libelle = models.CharField(max_length=100)
def as_dict(self):
return {
"id": self.zone_id,
"libelle": self.zone_libelle
}
# Modèle Liste de Préference
class PreferencesListe(models.Model):
"""Modèle Liste de Préference
"""
lp_id = models.IntegerField(primary_key=True)
administre_pam = models.ForeignKey(Administres_Pams, on_delete=models.CASCADE, related_name= 'administre_pam_pref', default="")
administre = models.ForeignKey(Administre, on_delete=models.CASCADE, related_name= 'administre_pref', default="")
pam = models.ForeignKey(PAM, on_delete=models.CASCADE, default="")
poste = models.ForeignKey(Poste, on_delete=models.CASCADE)
lp_rang_poste = models.IntegerField()
# Modèle pour les notations
class Notation(models.Model):
"""Modèle pour les notations
"""
no_id = models.AutoField(primary_key=True)
administre = models.ForeignKey(Administre, on_delete=models.CASCADE)
poste = models.ForeignKey(Poste, on_delete=models.CASCADE)
administre_pam = models.ForeignKey(Administres_Pams, on_delete=models.CASCADE, default="", related_name='administre_pam')
poste_pam = models.ForeignKey(Postes_Pams, on_delete=models.CASCADE, default="", related_name='poste_pam')
pam = models.ForeignKey(PAM, on_delete=models.SET_NULL, null=True, blank=True)
no_rang_administre = models.IntegerField(null=True, blank=True)
no_rang_poste = models.IntegerField(null=True, blank=True)
no_date_execution = models.DateTimeField(auto_now=True)
no_score_administre = models.FloatField(null=True, blank=True)
no_score_poste = models.FloatField(null=True, blank=True)
no_flag_cple_ideal = models.BooleanField(default=False)
class Administre_Notation(models.Model):
"""Modèle le lien entre Notation et Administre
"""
id = models.CharField(max_length=100, primary_key=True)
administre = models.ForeignKey(Administre, on_delete=models.CASCADE, null=True, blank=True, related_name='adm_not', db_constraint=False)
no_annne_de_notation = models.CharField(max_length=100, null=True, blank=True)
no_nr_ou_iris = models.CharField(max_length=100, null=True, blank=True)
no_rac_ou_iris_cumule = models.CharField(max_length=100, null=True, blank=True)
no_rf_qsr = models.CharField(max_length=100, null=True, blank=True)
no_aptitude_emploie_sup = models.CharField(max_length=100, null=True, blank=True)
no_potentiel_responsabilite_sup = models.CharField(max_length=100, null=True, blank=True)
no_age_annees = models.CharField(max_length=100, null=True, blank=True)
# Modèle du référentiel organique
class RefOrg(models.Model):
"""Modèle de référentiel organique"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'ref_org_code'
# relations one-to-one ou many-to-one
REL_REF_GEST = 'ref_gest'
# TODO: ajouter la condition d'unicité des lignes (utiliser class Meta)
ref_org_code = models.CharField('Code niveau d\'org', max_length=100, primary_key=True)
ref_org_code_niv_org1 = models.CharField('Code niveau d\'org 1', max_length=100, null=True, blank=True)
ref_org_lib_niv_org1 = models.CharField('Livelle niveau d\'org 1', max_length=100, null=True, blank=True)
ref_org_code_niv_org2 = models.CharField('Code niveau d\'org 2', max_length=100, null=True, blank=True)
ref_org_lib_niv_org2 = models.CharField('Libelle niveau d\'org 2', max_length=100, null=True, blank=True)
ref_org_code_niv_org3 = models.CharField('Code niveau d\'org 3', max_length=100, null=True, blank=True)
ref_org_lib_niv_org3 = models.CharField('Libelle niveau d\'org 3', max_length=100, null=True, blank=True)
ref_org_code_niv_org4 = models.CharField('Code niveau d\'org 4', max_length=100, null=True, blank=True)
ref_org_lib_niv_org4 = models.CharField('Libell niveau d\'org 4', max_length=100, null=True, blank=True)
ref_org_niv_org = models.IntegerField('Niveau d\'org', null=True, blank=True)
ref_org_ref_fe = models.BooleanField('Pameur BMOB', default=False, null=True)
ref_org_ref_sv_fil = models.BooleanField('Gestionnaire BGCAT', default=False, null=True)
ref_org_droit_lect = models.BooleanField('Droit de lecture', default=False, null=True)
ref_org_droit_ecr = models.BooleanField("Droit d'écriture", default=False, null=True)
ref_org_expert_hme = models.BooleanField('Expert HME', default=False, null=True)
ref_org_bvt = models.BooleanField('Gestionnaire BVT', default=False, null=True)
ref_org_itd = models.BooleanField('Gestionnaire ITD', default=False, null=True)
class Meta:
verbose_name = 'Référentiel organique'
verbose_name_plural = 'Référentiels organiques'
# Modèle du référentiel gestionnaire
class RefGest(models.Model):
"""Modèle de référentiel gestionnaire"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'ref_gest_sap'
# relations one-to-one ou many-to-one
REL_ORG = 'ref_gest_org'
ref_gest_sap = models.IntegerField('Id SAP', primary_key=True)
ref_gest_username = models.CharField('Nom d\'utilisateur', max_length=100, null=True, blank=True)
ref_gest_email = models.CharField('Adresse mail', max_length=100, null=True, blank=True)
ref_gest_first_name = models.CharField('Prénom', max_length=100, null=True, blank=True)
ref_gest_last_name = models.CharField('Nom', max_length=100, null=True, blank=True)
ref_gest_grade = models.CharField('Grade', max_length=100, null=True, blank=True)
ref_gest_niv_org = models.CharField('Niveau d\'org', max_length=100, null=True, blank=True)
ref_gest_org = models.ForeignKey(RefOrg, verbose_name='Référentiel organique', related_name=RefOrg.Cols.REL_REF_GEST, on_delete=models.CASCADE,
db_column='ref_gest_org_id', null=True, blank=True)
class Meta:
verbose_name = 'Référentiel gestionnaire'
verbose_name_plural = 'Référentiels gestionnaires'
# Modèle du référentiel sous-vivier filière
class RefSvFil(models.Model):
"""Modèle de référentiel sous-vivier filière
"""
class Cols():
""" Constantes pour les noms de colonnes """
# relations one-to-one ou many-to-one
REL_SOUS_VIVIER = 'sous_vivier'
ref_sv_fil_code = models.CharField('Code niveau d\'org', max_length=100, null=True, blank=True)
ref_sv_fil_dom_gest = models.CharField('Domaine de gestion', max_length=100, null=True, blank=True)
ref_sv_fil_dom = models.CharField('Domaine', max_length=100, null=True, blank=True)
ref_sv_fil_fil = models.CharField('Filière', max_length=100, null=True, blank=True)
ref_sv_fil_cat = models.CharField('Catégorie', max_length=100, null=True, blank=True)
sous_vivier = models.ForeignKey(SousVivier, verbose_name='Sous-vivier', on_delete=models.SET_NULL, null=True, blank=True)
def as_dict(self):
return {
"ref_sv_fil_code": self.ref_sv_fil_code,
"ref_sv_fil_dom_gest": self.ref_sv_fil_dom_gest,
"ref_sv_fil_dom": self.ref_sv_fil_dom,
"ref_sv_fil_fil": self.ref_sv_fil_fil,
"ref_sv_fil_cat": self.ref_sv_fil_cat,
}
class Meta:
verbose_name = 'Référentiel sous-vivier/filière'
verbose_name_plural = 'Référentiels sous-viviers/filières'

View File

@@ -0,0 +1,18 @@
from django.db import models
class PAM(models.Model):
"""Modèle pour Le PAM
"""
pam_id = models.CharField(primary_key=True,max_length=100, default=False)
pam_date = models.CharField(max_length=100)
pam_libelle = models.CharField(max_length=100)
pam_statut = models.CharField(max_length=100)
def as_dict(self):
return {
"pam_id": self.pam_id,
"pam_libelle": self.pam_libelle,
"pam_statut": self.pam_statut,
}

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="")

View File

@@ -0,0 +1,39 @@
from django.conf import settings
from django.db import models
from .user import CustomUser
class SousVivier(models.Model):
"""
Modèle des sous-viviers de militaires et de postes
"""
class Cols():
""" Constantes pour les noms de colonnes """
PK = 'sv_id'
LIBELLE = 'sv_libelle'
DOMAINE = 'sv_dom'
FILIERE = 'sv_fil'
CATEGORIE = 'sv_cat'
# relations many-to-many
M2M_GESTIONNAIRES = 'gestionnaires'
M2M_POSTES = 'poste'
sv_id = models.CharField(max_length=100, primary_key=True)
sv_libelle = models.CharField(max_length=100)
gestionnaires = models.ManyToManyField(CustomUser, related_name=CustomUser.Cols.M2M_SOUS_VIVIERS, blank=True)
sv_dom = models.CharField(max_length=100, null=True, blank=True)
sv_fil = models.CharField(max_length=100, null=True, blank=True)
sv_cat = models.CharField(max_length=100, null=True, blank=True)
def as_dict(self):
mails = []
for i in self.gestionnaires.all() :
mails.append(i.email)
return {
"sv_id": self.sv_id,
"sv_libelle": self.sv_libelle,
"gestionnaires": mails,
}

View File

@@ -0,0 +1,36 @@
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.validators import UnicodeUsernameValidator
from django.db import models
from django.utils import timezone
class CustomUser(AbstractUser):
"""
Modèle de l'utilisateur de l'application
"""
class Cols():
""" Constantes pour les noms de colonnes """
# relations one-to-many
O2M_GROUPE_FE_PCP = 'pcpfegroupe_set'
O2M_SOUS_VIVIER = 'sousvivier_set'
M2M_SOUS_VIVIERS = 'sous_vivier'
# relations many-to-many
M2M_FORMATION_EMPLOIS = 'formation_emploi'
# id = models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
id = models.IntegerField(auto_created=True, primary_key=True, verbose_name='Id SAP')
password = models.CharField(max_length=128, verbose_name='password')
last_login = models.DateTimeField(blank=True, null=True, verbose_name='last login')
is_superuser = models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')
username = models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[UnicodeUsernameValidator()], verbose_name='username')
first_name = models.CharField(null=True, blank=True, max_length=150, verbose_name='first name')
last_name = models.CharField(null=True, blank=True, max_length=150, verbose_name='last name')
email = models.EmailField(null=True, blank=True, max_length=254, verbose_name='email address')
is_staff = models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')
is_active = models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')
date_joined = models.DateTimeField(default=timezone.now, verbose_name='date joined')
grade = models.CharField(blank=True, max_length=100, null=True)
REQUIRED_FIELDS = ['id']