fix package
[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
21 #HELP_TEXT
22 HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge"
23 HELP_TEXT_FORMAT_DATE = "Le format de la date est AAAA-MM-JJ"
24 HELP_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."
29
30 # Abstracts
31 class 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)
37 date_creation = models.DateField(auto_now_add=True,
38 help_text=HELP_TEXT_FORMAT_DATE, )
39
40 class Meta:
41 abstract = True
42
43 class OffreEmploiManager(models.Manager):
44 def get_query_set(self):
45 fkeys = ('region',)
46 return super(OffreEmploiManager, self).get_query_set().\
47 select_related(*fkeys).all()
48
49 class ProxyPoste(Poste):
50 class Meta:
51 proxy = True
52
53 def __unicode__(self):
54 return '%s [%s]' % (self.nom, self.id)
55
56 STATUT_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
64 class OffreEmploi(Metadata):
65 #objects = OffreEmploiManager()
66 est_affiche = models.BooleanField(default=False,
67 verbose_name="En affichage sur le site")
68 statut = models.CharField(max_length=4, choices=STATUT_OFFRE_EMPLOI_CHOICES,
69 default='NOUV')
70 nom = models.CharField(max_length=255)
71 resume = models.TextField(verbose_name="Résumé")
72 description = tinymce_models.HTMLField()
73 poste = models.ForeignKey(ProxyPoste, db_column='poste')
74 date_limite = models.DateField(verbose_name="Date limite",
75 help_text=HELP_TEXT_FORMAT_DATE,)
76 region = models.ForeignKey(ref.Region, db_column='region',
77 verbose_name="Région")
78 bureau = models.ForeignKey(ref.Bureau, db_column='bureau', )
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')
83 debut_affectation = models.DateField(verbose_name="Début de l'affectation",
84 help_text=HELP_TEXT_FORMAT_DATE,)
85 lieu_affectation = models.ForeignKey(ref.Implantation,
86 db_column='implantation',
87 verbose_name="Lieu d'affectation")
88
89 class Meta:
90 verbose_name_plural = "offres d'emploi"
91
92 def __unicode__(self):
93 return '%s [%s]' % (self.nom, self.id)
94
95 class 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)
103
104 ### CANDIDAT
105
106 GENRE_CHOICES = (
107 ('M', 'Homme'),
108 ('F', 'Femme'),
109 )
110 SITUATION_CHOICES = (
111 ('C', 'Célibataire'),
112 ('F', 'Conjoint de fait'),
113 ('M', 'Marié'),
114 ('D', 'Divorcé'),
115 )
116 STATUT_CHOICES = (
117 ('NOUV', 'Nouveau'),
118 ('REC', 'Recevable'),
119 ('SEL', 'Sélectionné'),
120 ('REF', 'Refusé'),
121 ('ACC', 'Accepté'),
122 )
123
124 class Candidat(Metadata):
125 statut = models.CharField(max_length=4, choices=STATUT_CHOICES,
126 default='NOUV')
127 offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi',
128 related_name='+')
129 prenom = models.CharField(max_length=255, verbose_name='Prénom', )
130 nom = models.CharField(max_length=255)
131 genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
132 nationalite = models.ForeignKey(ref.Pays,
133 db_column='nationalite', related_name='+',
134 verbose_name='Nationalité')
135 situation_famille = models.CharField(max_length=1,
136 choices=SITUATION_CHOICES,
137 verbose_name='Situation familiale', )
138 nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant',
139 help_text=HELP_TEXT_NB_DEPENDANT, )
140 niveau_diplome = models.CharField(max_length=255,
141 verbose_name='Niveau du diplôme')
142 employeur_actuel = models.CharField(max_length=255, )
143 poste_actuel = models.CharField(max_length=255, )
144 domaine_professionnel = models.CharField(max_length=255, )
145 telephone = models.CharField(max_length=255, verbose_name='Téléphone', )
146 email = models.EmailField(max_length=255, verbose_name = 'Courriel', )
147
148 # Adresse
149 adresse = models.CharField(max_length=255)
150 ville = models.CharField(max_length=255)
151 etat_province = models.CharField(max_length=255,
152 verbose_name="État/Province")
153 code_postal = models.CharField(max_length=255, blank=True)
154 pays = models.ForeignKey(ref.Pays, db_column='pays',
155 related_name='+')
156
157 def __unicode__(self):
158 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
159
160 class ProxyCandidat(Candidat):
161 class Meta:
162 proxy = True
163 verbose_name = "Candidat (visualisation)"
164 verbose_name_plural = "Candidats (visualisation)"
165
166 def __unicode__(self):
167 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
168
169 ### PIECE CANDIDAT
170
171 TYPE_PIECE_CHOICES = (
172 ('CV','CV'),
173 ('LET','Lettre'),
174 ('AUT','Autre'),
175 )
176 # Upload de fichiers
177 storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
178 base_url=settings.PRIVE_MEDIA_URL)
179
180 def candidat_piece_dispatch(instance, filename):
181 path = "offre_emploi/%s_%s/%s/%s_%s" % (instance.candidat.nom,
182 instance.candidat.prenom, instance.nom, instance.candidat.id,
183 filename)
184 return path
185
186 class CandidatPiece(models.Model):
187 candidat = models.ForeignKey(Candidat, db_column='candidat',
188 related_name='candidat_piece')
189 nom = models.CharField(max_length=3, choices=TYPE_PIECE_CHOICES)
190 #path = PrivateFileField("file", upload_to=candidat_piece_dispatch)
191 path = models.FileField(verbose_name="Fichier",
192 upload_to=candidat_piece_dispatch,
193 storage=storage_prive, )
194
195 class Meta:
196 verbose_name = "pièce jointe"
197 verbose_name_plural = "pièces jointes"
198
199 def __unicode__(self):
200 return '%s' % (self.nom)
201
202 class Evaluateur(models.Model):
203 user = models.ForeignKey(User, unique=True, verbose_name="Évaluateur")
204 candidats = models.ManyToManyField(Candidat, through='CandidatEvaluation',
205 related_name="evaluateurs")
206
207 class Meta:
208 verbose_name = "évaluateur"
209
210 def __unicode__(self):
211 return '%s %s' % (self.user.first_name, self.user.last_name)
212
213 class AdministrateurRegional(models.Model):
214 user = models.ForeignKey(User, unique=True,
215 verbose_name="Administrateur régionnal")
216 regions = models.ManyToManyField(ref.Region,
217 verbose_name="Régions", )
218
219 class Meta:
220 verbose_name = "administrateur régional"
221 verbose_name_plural = "administrateurs régionaux"
222
223 def __unicode__(self):
224 return '%s %s' % (self.user.first_name, self.user.last_name)
225
226 class CandidatEvaluation(models.Model):
227 candidat = models.ForeignKey(Candidat, db_column='candidat',
228 related_name='+',)
229 evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
230 related_name='+', verbose_name='Évaluateur')
231 note = models.IntegerField(choices=NOTES, blank=True, null=True)
232 commentaire = models.TextField(null=True, blank=True)
233 date = models.DateField(auto_now_add=True,
234 help_text=HELP_TEXT_FORMAT_DATE, )
235
236 class Meta:
237 verbose_name = 'évaluation du candidat'
238 verbose_name_plural = 'évaluations des candidats'
239
240 #### TEMPLATE COURRIEL
241 TEMPLATE_CHOICES = (
242 ('SEL', 'Sélectionné'),
243 ('REF', 'Refusé'),
244 )
245
246 class CourrielTemplate(models.Model):
247 nom_modele = models.CharField(max_length=100, verbose_name='Nom du modèle',)
248 sujet = models.CharField(max_length=100, verbose_name='Sujet du courriel')
249 plain_text = models.TextField(verbose_name='Texte',
250 help_text=HELP_TEXT_TAGS_ACCEPTES, )
251 html = tinymce_models.HTMLField(verbose_name='Texte en HTML',
252 help_text=HELP_TEXT_TAGS_ACCEPTES, )
253
254 def __unicode__(self):
255 return u'%s' % self.nom_modele
256
257 class Meta:
258 ordering = ['nom_modele',]
259
260 class CandidatCourriel(models.Model):
261 candidats = models.ManyToManyField(Candidat, verbose_name="Candidats", )
262 template = models.ForeignKey(CourrielTemplate, db_column='template',
263 related_name='+', verbose_name="Modèle de courriel", )
264 sujet = models.CharField(max_length=255, blank=True,
265 help_text=HELP_TEXT_TAGS_ACCEPTES, )
266 plain_text = models.TextField(verbose_name='Texte', blank=True,
267 help_text=HELP_TEXT_TAGS_ACCEPTES, )
268 html = tinymce_models.HTMLField(verbose_name='Texte en HTML', null=True,
269 blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES, )
270
271 def __unicode__(self):
272 return '%s' % (self.titre)
273