Permissions des groupes, affichage de listes selon permissions
[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)]
ee42ad96 20HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge"
596fe324 21
df59fcab 22# Abstracts
23class 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
4e8e178f 34class OffreEmploiManager(models.Manager):
35 def get_query_set(self):
61a4b478 36 fkeys = ('region',)
4e8e178f 37 return super(OffreEmploiManager, self).get_query_set().select_related(*fkeys).all()
38
47cf4908 39class ProxyPoste(Poste):
4e8e178f 40 class Meta:
41 proxy = True
42
43 def __unicode__(self):
44 return '%s [%s]' % (self.nom, self.id)
df59fcab 45
46class OffreEmploi(Metadata):
27c81d11 47 #objects = OffreEmploiManager()
df59fcab 48 nom = models.CharField(max_length=255)
b235ec9d 49 resume = models.TextField(verbose_name="Résumé")
ec517164 50 description = tinymce_models.HTMLField()
51 poste = models.ForeignKey(ProxyPoste, db_column='poste')
df59fcab 52 date_limite = models.DateField(verbose_name="Date limite")
b235ec9d 53 region = models.ForeignKey(ref.Region, db_column='region',
54 verbose_name="Région")
55 bureau = models.ForeignKey(ref.Bureau, db_column='bureau', )
ec517164 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")
b235ec9d 64
65 class Meta:
66 verbose_name_plural = "offres d'emploi"
4418c732 67
68 def __unicode__(self):
69 return '%s [%s]' % (self.nom, self.id)
df59fcab 70
f6724c20
NBV
71class 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)
df59fcab 79
80### CANDIDAT
81
82GENRE_CHOICES = (
83 ('M', 'Homme'),
84 ('F', 'Femme'),
85)
86SITUATION_CHOICES = (
87 ('C', 'Célibataire'),
88 ('F', 'Fiancé'),
89 ('M', 'Marié'),
90 ('D', 'Divorcé'),
91)
92STATUT_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
b235ec9d 100class Candidat(Metadata):
8ea41642 101 statut = models.CharField(max_length=4, choices=STATUT_CHOICES,
102 default='NOUV')
df59fcab 103 offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi',
7f9e891e 104 related_name='+')
3b4b948e 105 prenom = models.CharField(max_length=255, verbose_name='Prénom', )
df59fcab 106 nom = models.CharField(max_length=255)
107 genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
108 nationalite = models.ForeignKey(ref.Pays,
3b4b948e 109 db_column='nationalite', related_name='+',
110 verbose_name='Nationalité')
ee42ad96 111 date_naissance = models.DateField(verbose_name='Date de naissance')
df59fcab 112 situation_famille = models.CharField(max_length=1,
ec517164 113 choices=SITUATION_CHOICES,
114 verbose_name='Situation familiale')
ee42ad96 115 nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant',
116 help_text=HELP_TEXT_NB_DEPENDANT)
df59fcab 117 niveau_diplome = models.CharField(max_length=255,
3b4b948e 118 verbose_name='Niveau du diplôme')
df59fcab 119 employeur_actuel = models.CharField(max_length=255)
120 poste_actuel = models.CharField(max_length=255)
121 domaine_professionnel = models.CharField(max_length=255)
ec517164 122 telephone = models.CharField(max_length=255, verbose_name='Téléphone', )
123 email = models.EmailField(max_length=255, verbose_name = 'Courriel', )
df59fcab 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,
4418c732 129 verbose_name="État/Province")
ec517164 130 code_postal = models.CharField(max_length=255, blank=True)
df59fcab 131 pays = models.ForeignKey(ref.Pays, db_column='pays',
7f9e891e 132 related_name='+')
4418c732 133
134 def __unicode__(self):
135 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
136
f6724c20
NBV
137class 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
4418c732 146### PIECE CANDIDAT
ee42ad96 147
148TYPE_PIECE_CHOICES = (
149 ('CV','CV'),
150 ('LET','Lettre'),
151 ('AUT','Autre'),
152)
4418c732 153# Upload de fichiers
154storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
155 base_url=settings.PRIVE_MEDIA_URL)
156
157def 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
163class CandidatPiece(models.Model):
164 candidat = models.ForeignKey(Candidat, db_column='candidat',
2b3edf33 165 related_name='candidat_piece')
ee42ad96 166 nom = models.CharField(max_length=3, choices=TYPE_PIECE_CHOICES)
362a3534 167 #path = PrivateFileField("file", upload_to=candidat_piece_dispatch)
f6749f29 168 path = models.FileField(verbose_name="Fichier",
169 upload_to=candidat_piece_dispatch,
2b3edf33 170 storage=storage_prive, )
4418c732 171
b235ec9d 172 class Meta:
12767731 173 verbose_name = "pièce jointe"
174 verbose_name_plural = "pièces jointes"
b235ec9d 175
4418c732 176 def __unicode__(self):
177 return '%s' % (self.nom)
178
4e8340cf 179class Evaluateur(models.Model):
27c81d11 180 user = models.ForeignKey(User, unique=True,
d835c9f3 181 verbose_name="permission")
cced6a23 182 candidats = models.ManyToManyField(Candidat, verbose_name='candidats',
2adf9e0c 183 blank=True, null=True,related_name="evaluateurs")
4e8340cf 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
b89fef74 191class AdministrateurRegional(models.Model):
27c81d11 192 user = models.ForeignKey(User, unique=True,
4e8340cf 193 verbose_name="permission")
3b4bfad3 194 regions = models.ManyToManyField(ref.Region,
195 verbose_name="Régions", )
eb579d40 196
b235ec9d 197 class Meta:
27c81d11 198 verbose_name = "administrateur régional"
4e8340cf 199 verbose_name_plural = "administrateurs régionaux"
b235ec9d 200
2adf9e0c 201 def __unicode__(self):
202 return '%s %s' % (self.user.first_name, self.user.last_name)
203
4418c732 204
205class CandidatEvaluation(models.Model):
206 candidat = models.ForeignKey(Candidat, db_column='candidat',
3b4b948e 207 related_name='+',)
27c81d11 208 evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
cced6a23 209 related_name='+', verbose_name='Évaluateur')
596fe324 210 note = models.IntegerField(choices=NOTES, blank=True, null=True)
362a3534 211 commentaire = models.TextField(null=True, blank=True)
4418c732 212 date = models.DateField(auto_now_add=True)
b235ec9d 213
214 class Meta:
cced6a23 215 verbose_name = 'évaluation du candidat'
216 verbose_name_plural = 'évaluations des candidats'
ec517164 217
1df9fc7f 218#### TEMPLATE COURRIEL
d84c3a68 219TEMPLATE_CHOICES = (
220 ('SEL', 'Sélectionné'),
221 ('REF', 'Refusé'),
222)
223
224class CourrielTemplate(models.Model):
0b1bbb53 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', )
d84c3a68 229
230 def __unicode__(self):
0b1bbb53 231 return u'%s' % self.nom_modele
d84c3a68 232
233 class Meta:
0b1bbb53 234 ordering = ['nom_modele',]
d84c3a68 235
236class CandidatCourriel(models.Model):
ec517164 237 candidat = models.ForeignKey(Candidat, db_column='candidat',
d84c3a68 238 related_name='+', )
0b1bbb53 239 template = models.ForeignKey(CourrielTemplate, db_column='nom',
240 related_name='+', verbose_name="Modèle de courriel", )
ec517164 241 titre = models.CharField(max_length=255, )
d84c3a68 242 texte = models.TextField(null=True, blank=True, )
ec517164 243
244 def __unicode__(self):
245 return '%s' % (self.titre)
ec517164 246