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