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