# Constantes
-HELP_TEXT_DATE = u"format: aaaa-mm-jj"
+HELP_TEXT_DATE = "format: aaaa-mm-jj"
REGIME_TRAVAIL_DEFAULT = 100.00
REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT = 35.00
"""
# Identification
nom = models.CharField(max_length=255,
- verbose_name=u"Titre du poste", )
+ verbose_name="Titre du poste", )
nom_feminin = models.CharField(max_length=255,
- verbose_name=u"Titre du poste (au féminin)",
+ verbose_name="Titre du poste (au féminin)",
null=True)
implantation = models.ForeignKey(ref.Implantation,
db_column='implantation', related_name='+')
null=True)
service = models.ForeignKey('Service', db_column='service',
related_name='+',
- verbose_name=u"Direction/Service/Pôle support",
+ verbose_name="Direction/Service/Pôle support",
default=1) # default = Rectorat
responsable = models.ForeignKey('Poste', db_column='responsable',
related_name='+',
- verbose_name=u"Poste du responsable",
+ verbose_name="Poste du responsable",
default=149) # default = Recteur
# Contrat
regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
default=REGIME_TRAVAIL_DEFAULT,
- verbose_name=u"Temps de travail",
- help_text=u"% du temps complet")
+ verbose_name="Temps de travail",
+ help_text="% du temps complet")
regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
decimal_places=2,
default=REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT,
- verbose_name=u"Nb. heures par semaine")
+ verbose_name="Nb. heures par semaine")
# Recrutement
- local = models.BooleanField(verbose_name=u"Local", default=True,
+ local = models.BooleanField(verbose_name="Local", default=True,
blank=True)
- expatrie = models.BooleanField(verbose_name=u"Expatrié", default=False,
+ expatrie = models.BooleanField(verbose_name="Expatrié", default=False,
blank=True)
mise_a_disposition = models.BooleanField(
- verbose_name=u"Mise à disposition",
+ verbose_name="Mise à disposition",
default=False)
appel = models.CharField(max_length=10,
- verbose_name=u"Appel à candidature",
+ verbose_name="Appel à candidature",
choices=POSTE_APPEL_CHOICES,
default='interne')
# Autres Metadata
date_validation = models.DateTimeField(null=True, blank=True) # de dae
- date_debut = models.DateField(verbose_name=u"Date de début",
+ date_debut = models.DateField(verbose_name="Date de début",
help_text=HELP_TEXT_DATE)
- date_fin = models.DateField(verbose_name=u"Date de fin",
+ date_fin = models.DateField(verbose_name="Date de fin",
help_text=HELP_TEXT_DATE,
null=True, blank=True)
class Meta:
abstract = True
ordering = ['implantation__nom', 'nom']
+ verbose_name = "Poste"
+ verbose_name_plural = "Postes"
def __unicode__(self):
- # TODO : gérer si poste est vacant ou non dans affichage
- # TODO : gérer le nom_feminin (autre méthode appelée par __unicode__ ?)
- return u'%s - %s [%s]' % (self.implantation, self.nom, self.id)
+ representation = u'%s - %s [%s]' % (self.implantation, self.nom,
+ self.id)
+ if self.is_vacant():
+ representation = representation + u' (vacant)'
+ return representation
+
+ def is_vacant(self):
+ # TODO : si existe un dossier actif pour ce poste, return False
+ # self.dossier_set.all() fonctionne pas
+ return False
class Poste(Poste_):
related_name='%(app_label)s_financements')
type = models.CharField(max_length=1, choices=POSTE_FINANCEMENT_CHOICES)
pourcentage = models.DecimalField(max_digits=12, decimal_places=2,
- help_text=u"ex.: 33.33 % (décimale avec point)")
+ help_text="ex.: 33.33 % (décimale avec point)")
commentaire = models.TextField(
- help_text=u"Spécifiez la source de financement.")
+ help_text="Spécifiez la source de financement.")
class Meta:
abstract = True
"""Documents relatifs au Poste.
Ex.: Description de poste
"""
- poste = models.ForeignKey("Poste", db_column='poste',
+ poste = models.ForeignKey('Poste', db_column='poste',
related_name='pieces')
- nom = models.CharField(verbose_name=u"Nom", max_length=255)
- fichier = models.FileField(verbose_name=u"Fichier",
+ nom = models.CharField(verbose_name="Nom", max_length=255)
+ fichier = models.FileField(verbose_name="Fichier",
upload_to=poste_piece_dispatch,
storage=storage_prive)
return u'%s' % (self.nom)
class PosteCommentaire(Commentaire):
- poste = models.ForeignKey("Poste", db_column='poste', related_name='+')
+ poste = models.ForeignKey('Poste', db_column='poste', related_name='+')
### EMPLOYÉ/PERSONNE
"""
# Identification
nom = models.CharField(max_length=255)
- prenom = models.CharField(max_length=255, verbose_name=u"Prénom")
- # TODO : nom_affichage doit être obligatoire, pas nom et prenom
+ prenom = models.CharField(max_length=255, verbose_name="Prénom")
nom_affichage = models.CharField(max_length=255,
- verbose_name=u"Nom d'affichage",
+ verbose_name="Nom d'affichage",
null=True, blank=True)
nationalite = models.ForeignKey(ref.Pays, to_field='code',
db_column='nationalite',
- related_name='employes_nationalite')
+ related_name='employes_nationalite',
+ verbose_name="Nationalité")
date_naissance = models.DateField(help_text=HELP_TEXT_DATE,
+ verbose_name="Date de naissance",
null=True, blank=True)
genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
# Infos personnelles
situation_famille = models.CharField(max_length=1,
choices=SITUATION_CHOICES,
+ verbose_name="Situation familiale",
null=True, blank=True)
- date_entree = models.DateField(verbose_name=u"Date d'entrée à l'AUF",
+ date_entree = models.DateField(verbose_name="Date d'entrée à l'AUF",
help_text=HELP_TEXT_DATE,
null=True, blank=True)
# Coordonnées
- tel_domicile = models.CharField(max_length=255, null=True, blank=True)
- tel_cellulaire = models.CharField(max_length=255, null=True, blank=True)
+ tel_domicile = models.CharField(max_length=255,
+ verbose_name="Tél. domicile",
+ null=True, blank=True)
+ tel_cellulaire = models.CharField(max_length=255,
+ verbose_name="Tél. cellulaire",
+ null=True, blank=True)
adresse = models.CharField(max_length=255, null=True, blank=True)
ville = models.CharField(max_length=255, null=True, blank=True)
province = models.CharField(max_length=255, null=True, blank=True)
class Meta:
ordering = ['nom_affichage','nom','prenom']
+ verbose_name = "Employé"
+ verbose_name_plural = "Employés"
def __unicode__(self):
- # TODO : gérer nom d'affichage
+ return u'%s' % (self.get_nom())
+
+ def get_nom(self):
nom_affichage = self.nom_affichage
if not nom_affichage:
nom_affichage = u'%s %s' % (self.nom.upper(), self.prenom)
- return u'%s' % (nom_affichage)
+ return nom_affichage
class EmployePiece(models.Model):
"""Documents relatifs à un employé.
Ex.: CV...
"""
- employe = models.ForeignKey("Employe", db_column='employe',
+ employe = models.ForeignKey('Employe', db_column='employe',
related_name='+')
- nom = models.CharField(verbose_name=u"Nom", max_length=255)
- fichier = models.FileField(verbose_name=u"Fichier",
+ nom = models.CharField(verbose_name="Nom", max_length=255)
+ fichier = models.FileField(verbose_name="Fichier",
upload_to=dossier_piece_dispatch,
storage=storage_prive)
return u'%s' % (self.nom)
class EmployeCommentaire(Commentaire):
- employe = models.ForeignKey("Employe", db_column='employe',
+ employe = models.ForeignKey('Employe', db_column='employe',
related_name='+')
"""
# Identification
nom = models.CharField(max_length=255)
- prenom = models.CharField(max_length=255)
- # TODO : nom_affichage doit être obligatoire, pas nom et prenom
+ prenom = models.CharField(max_length=255,
+ verbose_name="Prénom",)
nom_affichage = models.CharField(max_length=255,
- verbose_name=u"Nom d'affichage",
+ verbose_name="Nom d'affichage",
null=True, blank=True)
nationalite = models.ForeignKey(ref.Pays, to_field='code',
db_column='nationalite',
- related_name='ayantdroits_nationalite')
+ related_name='ayantdroits_nationalite',
+ verbose_name="Nationalité")
date_naissance = models.DateField(help_text=HELP_TEXT_DATE,
+ verbose_name="Date de naissance",
null=True, blank=True)
genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
# Relation
employe = models.ForeignKey('Employe', db_column='employe',
- related_name='ayantdroits')
+ related_name='ayantdroits',
+ verbose_name="Employé")
lien_parente = models.CharField(max_length=10,
choices=LIEN_PARENTE_CHOICES,
+ verbose_name="Lien de parenté",
null=True, blank=True)
class Meta:
ordering = ['nom_affichage']
+ verbose_name = "Ayant droit"
+ verbose_name_plural = "Ayants droit"
+
def __unicode__(self):
- # TODO : gérer nom d'affichage
- return u'%s %s' % (self.prenom, self.nom.upper())
+ return u'%s' % (self.get_nom())
+
+ def get_nom(self):
+ nom_affichage = self.nom_affichage
+ if not nom_affichage:
+ nom_affichage = u'%s %s' % (self.nom.upper(), self.prenom)
+ return nom_affichage
class AyantDroitCommentaire(Commentaire):
- ayant_droit = models.ForeignKey("AyantDroit", db_column='ayant_droit',
+ ayant_droit = models.ForeignKey('AyantDroit', db_column='ayant_droit',
related_name='+')
"""
# Identification
employe = models.ForeignKey('Employe', db_column='employe',
- related_name='+')
+ related_name='+',
+ verbose_name="Employé")
poste = models.ForeignKey('Poste', db_column='poste',
related_name='+', editable=False)
statut = models.ForeignKey('Statut', related_name='+', default=3)
organisme_bstg = models.ForeignKey('OrganismeBstg',
db_column='organisme_bstg',
related_name='+',
- verbose_name=u"Organisme",
- help_text=u"Si détaché (DET) ou \
+ verbose_name="Organisme",
+ help_text="Si détaché (DET) ou \
mis à disposition (MAD), \
préciser l'organisme.",
null=True, blank=True)
# Recrutement
remplacement = models.BooleanField(default=False)
statut_residence = models.CharField(max_length=10, default='local',
- verbose_name=u"Statut",
+ verbose_name="Statut",
choices=STATUT_RESIDENCE_CHOICES)
# Rémunération
regime_travail = models.DecimalField(max_digits=12,
decimal_places=2,
default=REGIME_TRAVAIL_DEFAULT,
- verbose_name=u"Régime de travail",
- help_text=u"% du temps complet")
+ verbose_name="Régime de travail",
+ help_text="% du temps complet")
regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
decimal_places=2,
default=REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT,
- verbose_name=u"Nb. heures par semaine")
+ verbose_name="Nb. heures par semaine")
# Occupation du Poste par cet Employe (anciennement "mandat")
- date_debut = models.DateField(verbose_name=u"Date de début d'occupation \
+ date_debut = models.DateField(verbose_name="Date de début d'occupation \
de poste",
help_text=HELP_TEXT_DATE)
- date_fin = models.DateField(verbose_name=u"Date de fin d'occupation \
+ date_fin = models.DateField(verbose_name="Date de fin d'occupation \
de poste",
help_text=HELP_TEXT_DATE,
null=True, blank=True)
class Meta:
abstract = True
ordering = ['employe__nom_affichage', 'employe__nom', 'poste__nom']
+ verbose_name = "Dossier"
+ verbose_name_plural = "Dossiers"
def __unicode__(self):
- return u'%s - %s' % (self.employe, self.poste.nom)
+ poste = self.poste.nom
+ if self.employe.genre == 'F':
+ poste = self.poste.nom_feminin
+ return u'%s - %s' % (self.employe, poste)
class Dossier(Dossier_):
"""Documents relatifs au Dossier (à l'occupation de ce poste par employé).
Ex.: Lettre de motivation.
"""
- dossier = models.ForeignKey("Dossier", db_column='dossier',
+ dossier = models.ForeignKey('Dossier', db_column='dossier',
related_name='+')
- nom = models.CharField(verbose_name=u"Nom", max_length=255)
- fichier = models.FileField(verbose_name=u"Fichier",
+ nom = models.CharField(verbose_name="Nom", max_length=255)
+ fichier = models.FileField(verbose_name="Fichier",
upload_to=dossier_piece_dispatch,
storage=storage_prive)
return u'%s' % (self.nom)
class DossierCommentaire(Commentaire):
- dossier = models.ForeignKey("Dossier", db_column='dossier',
+ dossier = models.ForeignKey('Dossier', db_column='dossier',
related_name='+')
dossier = models.ForeignKey('Dossier', db_column='dossier',
related_name='%(app_label)s_%(class)s_remunerations')
type = models.ForeignKey('TypeRemuneration', db_column='type',
- related_name='+')
+ related_name='+',
+ verbose_name="Type de rémunération")
type_revalorisation = models.ForeignKey('TypeRevalorisation',
db_column='type_revalorisation',
related_name='+',
+ verbose_name="Type de revalorisation",
null=True, blank=True)
montant = models.FloatField(null=True, blank=True,
default=0)
# commentaire = precision
commentaire = models.CharField(max_length=255, null=True, blank=True)
# date_debut = anciennement date_effectif
- date_debut = models.DateField(help_text=HELP_TEXT_DATE,
+ date_debut = models.DateField(help_text=HELP_TEXT_DATE,
+ verbose_name="Date de début",
null=True, blank=True)
date_fin = models.DateField(help_text=HELP_TEXT_DATE,
+ verbose_name="Date de fin",
null=True, blank=True)
class Meta:
class Meta:
abstract = True
+ verbose_name = "Rémunération"
+ verbose_name_plural = "Rémunérations"
class Remuneration(Remuneration_):
dossier = models.ForeignKey('Dossier', db_column='dossier',
related_name='+')
type_contrat = models.ForeignKey('TypeContrat', db_column='type_contrat',
- related_name='+')
- date_debut = models.DateField(help_text=HELP_TEXT_DATE)
+ related_name='+',
+ verbose_name="Type de contrat")
+ date_debut = models.DateField(help_text=HELP_TEXT_DATE,
+ verbose_name="Date de début")
date_fin = models.DateField(help_text=HELP_TEXT_DATE,
+ verbose_name="Date de fin",
null=True, blank=True)
class Meta:
ordering = ['dossier__employe__nom_affichage']
+ verbose_name = "Contrat"
+ verbose_name_plural = "Contrats"
def __unicode__(self):
- return u'%s - %s' % (self.dossier.employe.nom_affichage, self.id)
+ return u'%s - %s' % (self.dossier, self.id)
# TODO? class ContratPiece(models.Model):
conserver le Dossier intact afin d'éviter une re-saisie des données lors
du retour à la normale.
"""
- dossier = models.ForeignKey("Dossier", db_column='dossier',
+ dossier = models.ForeignKey('Dossier', db_column='dossier',
related_name='+')
nom = models.CharField(max_length=255)
- date_debut = models.DateField(help_text=HELP_TEXT_DATE)
- date_fin = models.DateField(help_text=HELP_TEXT_DATE,
+ date_debut = models.DateField(help_text=HELP_TEXT_DATE,
+ verbose_name="Date de début")
+ date_fin = models.DateField(help_text=HELP_TEXT_DATE,
+ verbose_name="Date de fin",
null=True, blank=True)
class Meta:
abstract = True
ordering = ['nom']
+ verbose_name = "Évènement"
+ verbose_name_plural = "Évènements"
def __unicode__(self):
return u'%s' % (self.nom)
de l'Evenement.
"""
evenement = models.ForeignKey("Evenement", db_column='evenement',
- related_name='+')
+ related_name='+',
+ verbose_name="Évènement")
+ # TODO : le champ dossier hérité de Remuneration doit être dérivé
+ # de l'Evenement associé
class Meta:
abstract = True
+ ordering = ['evenement', 'type__nom', '-date_fin']
+ verbose_name = "Évènement - rémunération"
+ verbose_name_plural = "Évènements - rémunérations"
class EvenementRemuneration(EvenementRemuneration_):
"""
nom = models.CharField(max_length=255)
+ class Meta:
+ ordering = ['nom']
+ verbose_name = "Famille d'emploi"
+ verbose_name_plural = "Familles d'emploi"
+
def __unicode__(self):
return u'%s' % (self.nom)
"""Catégorie de Poste.
"""
nom = models.CharField(max_length=255)
- nom_feminin = models.CharField(max_length=255)
+ nom_feminin = models.CharField(max_length=255,
+ verbose_name="Nom féminin")
- is_responsable = models.BooleanField(default=False)
+ is_responsable = models.BooleanField(default=False,
+ verbose_name="Poste de responsabilité")
famille_emploi = models.ForeignKey('FamilleEmploi',
db_column='famille_emploi',
- related_name='+')
+ related_name='+',
+ verbose_name="Famille d'emploi")
class Meta:
ordering = ['nom']
+ verbose_name = "Type de poste"
+ verbose_name_plural = "Types de poste"
def __unicode__(self):
- # TODO : gérer nom féminin
return u'%s' % (self.nom)
"""
nom = models.CharField(max_length=255)
type_paiement = models.CharField(max_length=30,
- choices=TYPE_PAIEMENT_CHOICES)
+ choices=TYPE_PAIEMENT_CHOICES,
+ verbose_name="Type de paiement")
nature_remuneration = models.CharField(max_length=30,
- choices=NATURE_REMUNERATION_CHOICES)
+ choices=NATURE_REMUNERATION_CHOICES,
+ verbose_name="Nature de la rémunération")
+
+ class Meta:
+ ordering = ['nom']
+ verbose_name = "Type de rémunération"
+ verbose_name_plural = "Types de rémunération"
def __unicode__(self):
return u'%s' % (self.nom)
(Actuellement utilisé dans aucun traitement informatique.)
"""
nom = models.CharField(max_length=255)
+
+ class Meta:
+ ordering = ['nom']
+ verbose_name = "Type de revalorisation"
+ verbose_name_plural = "Types de revalorisation"
def __unicode__(self):
return u'%s' % (self.nom)
class Meta:
ordering = ['nom']
+ verbose_name = "Service"
+ verbose_name_plural = "Services"
def __unicode__(self):
return u'%s' % (self.nom)
class Meta:
ordering = ['type', 'nom']
+ verbose_name = "Organisme BSTG"
+ verbose_name_plural = "Organismes BSTG"
def __unicode__(self):
- return u'%s (%s)' % (self.nom, self.type)
+ return u'%s (%s)' % (self.nom, self.get_type_display())
class Statut(Metadata):
"""Statut de l'Employe dans le cadre d'un Dossier particulier.
class Meta:
ordering = ['code']
+ verbose_name = "Statut d'employé"
+ verbose_name_plural = "Statuts d'employé"
def __unicode__(self):
return u'%s : %s' % (self.code, self.nom)
"""
# Identification
type = models.CharField(max_length=10, choices=TYPE_CLASSEMENT_CHOICES)
- echelon = models.IntegerField()
- degre = models.IntegerField()
- coefficient = models.FloatField(default=0)
+ echelon = models.IntegerField(verbose_name="Échelon")
+ degre = models.IntegerField(verbose_name="Degré")
+ coefficient = models.FloatField(default=0, verbose_name="Coéfficient")
# Méta
# annee # au lieu de date_debut et date_fin
commentaire = models.TextField(null=True, blank=True)
class Meta:
abstract = True
ordering = ['type','echelon','degre','coefficient']
+ verbose_name = "Classement"
+ verbose_name_plural = "Classements"
def __unicode__(self):
return u'%s.%s.%s (%s)' % (self.type, self.echelon, self.degre,
pour chaque année budgétaire.
"""
# Identification
- devise = models.ForeignKey('Devise', to_field='code', db_column='devise',
+ devise = models.ForeignKey('Devise', db_column='devise',
related_name='+')
- annee = models.IntegerField()
- taux = models.FloatField()
+ annee = models.IntegerField(verbose_name="Année")
+ taux = models.FloatField(verbose_name="Taux vers l'euro")
class Meta:
abstract = True
- ordering = ['annee', 'devise__code']
+ ordering = ['-annee', 'devise__code']
+ verbose_name = "Taux de change"
+ verbose_name_plural = "Taux de change"
def __unicode__(self):
- return u'%s : %s €' % (self.devise.code, self.taux)
+ return u'%s : %s € (%s)' % (self.devise, self.taux, self.annee)
class TauxChange(TauxChange_):
class ValeurPoint_(Metadata):
"""Utile pour connaître, pour un Dossier, le salaire de base théorique lié
au classement dans la grille. La ValeurPoint s'obtient par l'implantation
- du POste de ce Dossier : dossier.poste.implantation (pseudo code).
+ du Poste de ce Dossier : dossier.poste.implantation (pseudo code).
salaire de base = coefficient * valeur du point de l'Implantation du Poste
"""
# Méta
annee = models.IntegerField()
- # Stockage de tous les taux de change
- # pour optimiser la recherche de la devise associée
- annee_courante = datetime.datetime.now().year
- tauxchange = TauxChange.objects.select_related('devise') \
- .filter(annee=annee_courante)
-
class Meta:
abstract = True
- ordering = ['valeur']
-
- def get_tauxchange_courant(self):
- """
- Recherche le taux courant associé à la valeur d'un point.
- Tous les taux de l'année courante sont chargés, pour optimiser un
- affichage en liste. (On pourrait probablement améliorer le manager pour
- lui greffer le taux courant sous forme de JOIN)
- """
- for tauxchange in self.tauxchange:
- if tauxchange.implantation_id == self.implantation_id:
- return tauxchange
- return None
+ ordering = ['annee']
+ verbose_name = "Valeur du point"
+ verbose_name_plural = "Valeurs du point"
def __unicode__(self):
- tx = self.get_tauxchange_courant()
- if tx:
- devise_code = tx.devise.code
- else:
- devise_code = "??"
- return u'%s %s (%s-%s)' % (self.valeur, devise_code,
- self.implantation_id, self.annee)
+ return u'%s %s (%s)' % (self.valeur, self.devise, self.annee)
class ValeurPoint(ValeurPoint_):
class Meta:
ordering = ['code']
+ verbose_name = "Devise"
+ verbose_name_plural = "Devises"
def __unicode__(self):
return u'%s - %s' % (self.code, self.nom)
nom = models.CharField(max_length=255)
nom_long = models.CharField(max_length=255)
+ class Meta:
+ ordering = ['nom']
+ verbose_name = "Type de contrat"
+ verbose_name_plural = "Types de contrat"
+
def __unicode__(self):
return u'%s' % (self.nom)
class Meta:
ordering = ['implantation__nom']
+ verbose_name = "Responsable d'implantation"
+ verbose_name_plural = "Responsables d'implantation"