Changement de l'ordre des status d'un Candidat, Changement de nom du fieldset Options...
[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().\
38 select_related(*fkeys).all()
39
40 class ProxyPoste(Poste):
41 class Meta:
42 proxy = True
43
44 def __unicode__(self):
45 return '%s [%s]' % (self.nom, self.id)
46
47 class OffreEmploi(Metadata):
48 #objects = OffreEmploiManager()
49 nom = models.CharField(max_length=255)
50 resume = models.TextField(verbose_name="Résumé")
51 description = tinymce_models.HTMLField()
52 poste = models.ForeignKey(ProxyPoste, db_column='poste')
53 date_limite = models.DateField(verbose_name="Date limite")
54 region = models.ForeignKey(ref.Region, db_column='region',
55 verbose_name="Région")
56 bureau = models.ForeignKey(ref.Bureau, db_column='bureau', )
57 duree_affectation = models.CharField(max_length=255,
58 verbose_name="Durée de l'affectation")
59 renumeration = models.CharField(max_length=255,
60 verbose_name='Rénumération')
61 debut_affectation = models.DateField(verbose_name="Début de l'affectation")
62 lieu_affectation = models.ForeignKey(ref.Implantation,
63 db_column='implantation',
64 verbose_name="Lieu d'affectation")
65
66 class Meta:
67 verbose_name_plural = "offres d'emploi"
68
69 def __unicode__(self):
70 return '%s [%s]' % (self.nom, self.id)
71
72 class ProxyOffreEmploi(OffreEmploi):
73 class Meta:
74 proxy = True
75 verbose_name = "Offre d'emploi (visualisation)"
76 verbose_name_plural = "Offres d'emploi (visualisation)"
77
78 def __unicode__(self):
79 return '%s [%s] - View' % (self.nom, self.id)
80
81 ### CANDIDAT
82
83 GENRE_CHOICES = (
84 ('M', 'Homme'),
85 ('F', 'Femme'),
86 )
87 SITUATION_CHOICES = (
88 ('C', 'Célibataire'),
89 ('F', 'Fiancé'),
90 ('M', 'Marié'),
91 ('D', 'Divorcé'),
92 )
93 STATUT_CHOICES = (
94 ('NOUV', 'Nouveau'),
95 ('REC', 'Recevable'),
96 ('SEL', 'Sélectionné'),
97 ('REF', 'Refusé'),
98 ('ACC', 'Accepté'),
99 )
100
101 class Candidat(Metadata):
102 statut = models.CharField(max_length=4, choices=STATUT_CHOICES,
103 default='NOUV')
104 offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi',
105 related_name='+')
106 prenom = models.CharField(max_length=255, verbose_name='Prénom', )
107 nom = models.CharField(max_length=255)
108 genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
109 nationalite = models.ForeignKey(ref.Pays,
110 db_column='nationalite', related_name='+',
111 verbose_name='Nationalité')
112 date_naissance = models.DateField(verbose_name='Date de naissance')
113 situation_famille = models.CharField(max_length=1,
114 choices=SITUATION_CHOICES,
115 verbose_name='Situation familiale')
116 nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant',
117 help_text=HELP_TEXT_NB_DEPENDANT)
118 niveau_diplome = models.CharField(max_length=255,
119 verbose_name='Niveau du diplôme')
120 employeur_actuel = models.CharField(max_length=255)
121 poste_actuel = models.CharField(max_length=255)
122 domaine_professionnel = models.CharField(max_length=255)
123 telephone = models.CharField(max_length=255, verbose_name='Téléphone', )
124 email = models.EmailField(max_length=255, verbose_name = 'Courriel', )
125
126 # Adresse
127 adresse = models.CharField(max_length=255)
128 ville = models.CharField(max_length=255)
129 etat_province = models.CharField(max_length=255,
130 verbose_name="État/Province")
131 code_postal = models.CharField(max_length=255, blank=True)
132 pays = models.ForeignKey(ref.Pays, db_column='pays',
133 related_name='+')
134
135 def __unicode__(self):
136 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
137
138 class ProxyCandidat(Candidat):
139 class Meta:
140 proxy = True
141 verbose_name = "Candidat (visualisation)"
142 verbose_name_plural = "Candidats (visualisation)"
143
144 def __unicode__(self):
145 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
146
147 ### PIECE CANDIDAT
148
149 TYPE_PIECE_CHOICES = (
150 ('CV','CV'),
151 ('LET','Lettre'),
152 ('AUT','Autre'),
153 )
154 # Upload de fichiers
155 storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
156 base_url=settings.PRIVE_MEDIA_URL)
157
158 def candidat_piece_dispatch(instance, filename):
159 path = "offre_emploi/%s_%s/%s/%s_%s" % (instance.candidat.nom,
160 instance.candidat.prenom, instance.nom, instance.candidat.id,
161 filename)
162 return path
163
164 class CandidatPiece(models.Model):
165 candidat = models.ForeignKey(Candidat, db_column='candidat',
166 related_name='candidat_piece')
167 nom = models.CharField(max_length=3, choices=TYPE_PIECE_CHOICES)
168 #path = PrivateFileField("file", upload_to=candidat_piece_dispatch)
169 path = models.FileField(verbose_name="Fichier",
170 upload_to=candidat_piece_dispatch,
171 storage=storage_prive, )
172
173 class Meta:
174 verbose_name = "pièce jointe"
175 verbose_name_plural = "pièces jointes"
176
177 def __unicode__(self):
178 return '%s' % (self.nom)
179
180 class Evaluateur(models.Model):
181 user = models.ForeignKey(User, unique=True, verbose_name="permission")
182 candidats = models.ManyToManyField(Candidat, through='CandidatEvaluation',
183 #verbose_name='candidats', blank=True, null=True,
184 related_name="evaluateurs")
185
186 class Meta:
187 verbose_name = "évaluateur"
188
189 def __unicode__(self):
190 return '%s %s' % (self.user.first_name, self.user.last_name)
191
192 class AdministrateurRegional(models.Model):
193 user = models.ForeignKey(User, unique=True,
194 verbose_name="permission")
195 regions = models.ManyToManyField(ref.Region,
196 verbose_name="Régions", )
197
198 class Meta:
199 verbose_name = "administrateur régional"
200 verbose_name_plural = "administrateurs régionaux"
201
202 def __unicode__(self):
203 return '%s %s' % (self.user.first_name, self.user.last_name)
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