init
This commit is contained in:
18
backend-django/backend/models/__init__.py
Normal file
18
backend-django/backend/models/__init__.py
Normal 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 *
|
||||
282
backend-django/backend/models/administre.py
Normal file
282
backend-django/backend/models/administre.py
Normal 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)
|
||||
44
backend-django/backend/models/calcul.py
Normal file
44
backend-django/backend/models/calcul.py
Normal 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)
|
||||
),
|
||||
]
|
||||
31
backend-django/backend/models/commun.py
Normal file
31
backend-django/backend/models/commun.py
Normal 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'
|
||||
31
backend-django/backend/models/competence.py
Normal file
31
backend-django/backend/models/competence.py
Normal 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,
|
||||
}
|
||||
113
backend-django/backend/models/decision.py
Normal file
113
backend-django/backend/models/decision.py
Normal 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'
|
||||
21
backend-django/backend/models/domaine.py
Normal file
21
backend-django/backend/models/domaine.py
Normal 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,
|
||||
}
|
||||
11
backend-django/backend/models/fichier_exporte.py
Normal file
11
backend-django/backend/models/fichier_exporte.py
Normal 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'
|
||||
28
backend-django/backend/models/filiere.py
Normal file
28
backend-django/backend/models/filiere.py
Normal 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,
|
||||
}
|
||||
71
backend-django/backend/models/fmob.py
Normal file
71
backend-django/backend/models/fmob.py
Normal 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)
|
||||
15
backend-django/backend/models/fonction.py
Normal file
15
backend-django/backend/models/fonction.py
Normal 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,
|
||||
}
|
||||
96
backend-django/backend/models/formation_emploi.py
Normal file
96
backend-django/backend/models/formation_emploi.py
Normal 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
|
||||
}
|
||||
21
backend-django/backend/models/garnison.py
Normal file
21
backend-django/backend/models/garnison.py
Normal 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
|
||||
21
backend-django/backend/models/grade.py
Normal file
21
backend-django/backend/models/grade.py
Normal 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
|
||||
}
|
||||
231
backend-django/backend/models/initial.py
Normal file
231
backend-django/backend/models/initial.py
Normal 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'
|
||||
18
backend-django/backend/models/pam.py
Normal file
18
backend-django/backend/models/pam.py
Normal 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,
|
||||
}
|
||||
189
backend-django/backend/models/poste.py
Normal file
189
backend-django/backend/models/poste.py
Normal 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="")
|
||||
39
backend-django/backend/models/sous_vivier.py
Normal file
39
backend-django/backend/models/sous_vivier.py
Normal 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,
|
||||
}
|
||||
36
backend-django/backend/models/user.py
Normal file
36
backend-django/backend/models/user.py
Normal 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']
|
||||
Reference in New Issue
Block a user