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