1697: Statut pour une offre d'emploi (ergonomie) et est_affiché
[auf_rh_dae.git] / project / recrutement / models.py
CommitLineData
df59fcab 1# -=- encoding: utf-8 -=-
2
3import datetime
b235ec9d 4from django.contrib.auth.models import User
4418c732 5from django.core.files.storage import FileSystemStorage
ec517164 6from tinymce import models as tinymce_models
6f2d5d58 7from django.db import models
4418c732 8import settings
362a3534 9#from private_files import PrivateFileField
6f2d5d58 10
df59fcab 11import datamaster_modeles.models as ref
d0a50c0a 12from project.rh.models import Poste
df59fcab 13
596fe324 14### CONSTANTES
15#NOTES
16NOTE_MIN = 1
17NOTE_RANGE = 1
e34a2ae0 18NOTE_MAX = 11
596fe324 19NOTES = [(i, i) for i in range(NOTE_MIN, NOTE_MAX, NOTE_RANGE)]
b903198b
NBV
20
21#HELP_TEXT
ee42ad96 22HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge"
b903198b 23HELP_TEXT_FORMAT_DATE = "Le format de la date est AAAA-MM-JJ"
596fe324 24
df59fcab 25# Abstracts
26class Metadata(models.Model):
27 """Méta-données AUF.
28 Metadata.actif = flag remplaçant la suppression.
29 actif == False : objet réputé supprimé.
30 """
31 actif = models.BooleanField(default=True)
b903198b
NBV
32 date_creation = models.DateField(auto_now_add=True,
33 help_text=HELP_TEXT_FORMAT_DATE, )
df59fcab 34
35 class Meta:
36 abstract = True
37
4e8e178f 38class OffreEmploiManager(models.Manager):
39 def get_query_set(self):
61a4b478 40 fkeys = ('region',)
720c3ad5
NBV
41 return super(OffreEmploiManager, self).get_query_set().\
42 select_related(*fkeys).all()
4e8e178f 43
47cf4908 44class ProxyPoste(Poste):
4e8e178f 45 class Meta:
46 proxy = True
47
48 def __unicode__(self):
49 return '%s [%s]' % (self.nom, self.id)
df59fcab 50
514db699
NBV
51STATUT_OFFRE_EMPLOI_CHOICES = (
52 ('NOUV', 'Nouveau'),
53 ('AFFI', 'Offre d\'emploi en affichage'),
54 ('EVAL', 'En évaluation des candidatures'),
55 ('ENTR', 'En entrevue'),
56 ('TERM', 'Terminé'),
57)
58
df59fcab 59class OffreEmploi(Metadata):
27c81d11 60 #objects = OffreEmploiManager()
514db699
NBV
61 est_affiche = models.BooleanField(default=False,
62 verbose_name="Afficher l'offre d'emploi")
63 statut = models.CharField(max_length=4, choices=STATUT_OFFRE_EMPLOI_CHOICES,
64 default='NOUV')
df59fcab 65 nom = models.CharField(max_length=255)
b235ec9d 66 resume = models.TextField(verbose_name="Résumé")
ec517164 67 description = tinymce_models.HTMLField()
68 poste = models.ForeignKey(ProxyPoste, db_column='poste')
b903198b
NBV
69 date_limite = models.DateField(verbose_name="Date limite",
70 help_text=HELP_TEXT_FORMAT_DATE,)
b235ec9d 71 region = models.ForeignKey(ref.Region, db_column='region',
72 verbose_name="Région")
73 bureau = models.ForeignKey(ref.Bureau, db_column='bureau', )
ec517164 74 duree_affectation = models.CharField(max_length=255,
75 verbose_name="Durée de l'affectation")
76 renumeration = models.CharField(max_length=255,
77 verbose_name='Rénumération')
b903198b
NBV
78 debut_affectation = models.DateField(verbose_name="Début de l'affectation",
79 help_text=HELP_TEXT_FORMAT_DATE,)
ec517164 80 lieu_affectation = models.ForeignKey(ref.Implantation,
81 db_column='implantation',
82 verbose_name="Lieu d'affectation")
b235ec9d 83
84 class Meta:
85 verbose_name_plural = "offres d'emploi"
4418c732 86
87 def __unicode__(self):
88 return '%s [%s]' % (self.nom, self.id)
df59fcab 89
f6724c20
NBV
90class ProxyOffreEmploi(OffreEmploi):
91 class Meta:
92 proxy = True
93 verbose_name = "Offre d'emploi (visualisation)"
94 verbose_name_plural = "Offres d'emploi (visualisation)"
95
96 def __unicode__(self):
97 return '%s [%s] - View' % (self.nom, self.id)
df59fcab 98
99### CANDIDAT
100
101GENRE_CHOICES = (
102 ('M', 'Homme'),
103 ('F', 'Femme'),
104)
105SITUATION_CHOICES = (
106 ('C', 'Célibataire'),
b903198b 107 ('F', 'Conjoint de fait'),
df59fcab 108 ('M', 'Marié'),
109 ('D', 'Divorcé'),
110)
111STATUT_CHOICES = (
112 ('NOUV', 'Nouveau'),
65c4cbd9 113 ('REC', 'Recevable'),
df59fcab 114 ('SEL', 'Sélectionné'),
65c4cbd9 115 ('REF', 'Refusé'),
df59fcab 116 ('ACC', 'Accepté'),
df59fcab 117)
118
b235ec9d 119class Candidat(Metadata):
8ea41642 120 statut = models.CharField(max_length=4, choices=STATUT_CHOICES,
121 default='NOUV')
df59fcab 122 offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi',
7f9e891e 123 related_name='+')
3b4b948e 124 prenom = models.CharField(max_length=255, verbose_name='Prénom', )
df59fcab 125 nom = models.CharField(max_length=255)
126 genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
127 nationalite = models.ForeignKey(ref.Pays,
3b4b948e 128 db_column='nationalite', related_name='+',
129 verbose_name='Nationalité')
b903198b
NBV
130 date_naissance = models.DateField(verbose_name='Date de naissance',
131 help_text=HELP_TEXT_FORMAT_DATE, )
df59fcab 132 situation_famille = models.CharField(max_length=1,
ec517164 133 choices=SITUATION_CHOICES,
b903198b 134 verbose_name='Situation familiale', )
ee42ad96 135 nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant',
b903198b 136 help_text=HELP_TEXT_NB_DEPENDANT, )
df59fcab 137 niveau_diplome = models.CharField(max_length=255,
3b4b948e 138 verbose_name='Niveau du diplôme')
b903198b
NBV
139 employeur_actuel = models.CharField(max_length=255, )
140 poste_actuel = models.CharField(max_length=255, )
141 domaine_professionnel = models.CharField(max_length=255, )
ec517164 142 telephone = models.CharField(max_length=255, verbose_name='Téléphone', )
143 email = models.EmailField(max_length=255, verbose_name = 'Courriel', )
df59fcab 144
145 # Adresse
146 adresse = models.CharField(max_length=255)
147 ville = models.CharField(max_length=255)
148 etat_province = models.CharField(max_length=255,
4418c732 149 verbose_name="État/Province")
ec517164 150 code_postal = models.CharField(max_length=255, blank=True)
df59fcab 151 pays = models.ForeignKey(ref.Pays, db_column='pays',
7f9e891e 152 related_name='+')
4418c732 153
154 def __unicode__(self):
155 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
156
f6724c20
NBV
157class ProxyCandidat(Candidat):
158 class Meta:
159 proxy = True
160 verbose_name = "Candidat (visualisation)"
161 verbose_name_plural = "Candidats (visualisation)"
162
163 def __unicode__(self):
164 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
165
4418c732 166### PIECE CANDIDAT
ee42ad96 167
168TYPE_PIECE_CHOICES = (
169 ('CV','CV'),
170 ('LET','Lettre'),
171 ('AUT','Autre'),
172)
4418c732 173# Upload de fichiers
174storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
175 base_url=settings.PRIVE_MEDIA_URL)
176
177def candidat_piece_dispatch(instance, filename):
178 path = "offre_emploi/%s_%s/%s/%s_%s" % (instance.candidat.nom,
179 instance.candidat.prenom, instance.nom, instance.candidat.id,
180 filename)
181 return path
182
183class CandidatPiece(models.Model):
184 candidat = models.ForeignKey(Candidat, db_column='candidat',
2b3edf33 185 related_name='candidat_piece')
ee42ad96 186 nom = models.CharField(max_length=3, choices=TYPE_PIECE_CHOICES)
362a3534 187 #path = PrivateFileField("file", upload_to=candidat_piece_dispatch)
f6749f29 188 path = models.FileField(verbose_name="Fichier",
189 upload_to=candidat_piece_dispatch,
2b3edf33 190 storage=storage_prive, )
4418c732 191
b235ec9d 192 class Meta:
12767731 193 verbose_name = "pièce jointe"
194 verbose_name_plural = "pièces jointes"
b235ec9d 195
4418c732 196 def __unicode__(self):
197 return '%s' % (self.nom)
198
4e8340cf 199class Evaluateur(models.Model):
720c3ad5
NBV
200 user = models.ForeignKey(User, unique=True, verbose_name="permission")
201 candidats = models.ManyToManyField(Candidat, through='CandidatEvaluation',
202 #verbose_name='candidats', blank=True, null=True,
203 related_name="evaluateurs")
4e8340cf 204
205 class Meta:
206 verbose_name = "évaluateur"
207
208 def __unicode__(self):
209 return '%s %s' % (self.user.first_name, self.user.last_name)
210
b89fef74 211class AdministrateurRegional(models.Model):
27c81d11 212 user = models.ForeignKey(User, unique=True,
4e8340cf 213 verbose_name="permission")
3b4bfad3 214 regions = models.ManyToManyField(ref.Region,
215 verbose_name="Régions", )
eb579d40 216
b235ec9d 217 class Meta:
27c81d11 218 verbose_name = "administrateur régional"
4e8340cf 219 verbose_name_plural = "administrateurs régionaux"
b235ec9d 220
2adf9e0c 221 def __unicode__(self):
222 return '%s %s' % (self.user.first_name, self.user.last_name)
223
4418c732 224class CandidatEvaluation(models.Model):
225 candidat = models.ForeignKey(Candidat, db_column='candidat',
3b4b948e 226 related_name='+',)
27c81d11 227 evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
cced6a23 228 related_name='+', verbose_name='Évaluateur')
596fe324 229 note = models.IntegerField(choices=NOTES, blank=True, null=True)
362a3534 230 commentaire = models.TextField(null=True, blank=True)
b903198b
NBV
231 date = models.DateField(auto_now_add=True,
232 help_text=HELP_TEXT_FORMAT_DATE, )
b235ec9d 233
234 class Meta:
cced6a23 235 verbose_name = 'évaluation du candidat'
236 verbose_name_plural = 'évaluations des candidats'
ec517164 237
1df9fc7f 238#### TEMPLATE COURRIEL
d84c3a68 239TEMPLATE_CHOICES = (
240 ('SEL', 'Sélectionné'),
241 ('REF', 'Refusé'),
242)
243
244class CourrielTemplate(models.Model):
0b1bbb53 245 nom_modele = models.CharField(max_length=100, verbose_name='Nom modèle', )
246 sujet = models.CharField(max_length=100, )
247 plain_text = models.TextField(verbose_name='Texte', )
248 html = tinymce_models.HTMLField(verbose_name='Texte HTML', )
d84c3a68 249
250 def __unicode__(self):
0b1bbb53 251 return u'%s' % self.nom_modele
d84c3a68 252
253 class Meta:
0b1bbb53 254 ordering = ['nom_modele',]
d84c3a68 255
256class CandidatCourriel(models.Model):
ec517164 257 candidat = models.ForeignKey(Candidat, db_column='candidat',
d84c3a68 258 related_name='+', )
0b1bbb53 259 template = models.ForeignKey(CourrielTemplate, db_column='nom',
260 related_name='+', verbose_name="Modèle de courriel", )
ec517164 261 titre = models.CharField(max_length=255, )
d84c3a68 262 texte = models.TextField(null=True, blank=True, )
ec517164 263
264 def __unicode__(self):
265 return '%s' % (self.titre)
ec517164 266