merge regionalisation
[auf_rh_dae.git] / project / recrutement / models.py
CommitLineData
9372250c
OL
1# -=- encoding: utf-8 -=-
2
a0ee106d 3from auf.django.emploi import models as emploi
9372250c 4from django.contrib.auth.models import User
9372250c 5from django.db import models
c472b01a 6from django.db.models.signals import pre_save, pre_delete
3bc5ea42 7from django.dispatch import receiver
9372250c 8from south.modelsinspector import add_introspection_rules
a0ee106d 9from tinymce import models as tinymce_models
75f0e87b 10
86e4bb65 11from project.recrutement.groups import grp_evaluateurs
9372250c
OL
12
13### CONSTANTES
a0ee106d 14
9372250c
OL
15#NOTES
16NOTE_MIN = 1
17NOTE_RANGE = 1
18NOTE_MAX = 11
19NOTES = [(i, i) for i in range(NOTE_MIN, NOTE_MAX, NOTE_RANGE)]
20
21#HELP_TEXT
22HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge"
23HELP_TEXT_TAGS_ACCEPTES = "Pour le texte, les variables disponibles sont : \
24 {{ nom_candidat }} {{ prenom_candidat }} \
25 {{ offre_emploi }} et {{ genre_candidat }} \
26 (Pour Monsieur/Madame). Ces champs seront \
27 automatiquement remplacés par les informations de \
28 chaque candidat."
29
a0ee106d
EMS
30# Pour South
31add_introspection_rules([], ["^tinymce.models.HTMLField"])
9372250c 32
b31ce2d7 33
9372250c 34class Candidat(emploi.Candidat):
a0ee106d 35
9372250c
OL
36 class Meta:
37 proxy = True
38
39 def moyenne_notes(self):
40 evaluations = CandidatEvaluation.objects.filter(candidat=self)
41 notes = [evaluation.note for evaluation in evaluations.all() \
42 if evaluation.note is not None]
43
44 if len(notes) > 0:
45 moyenne_votes = float(sum(notes)) / len(notes)
46 else:
47 moyenne_votes = "Non disponible"
48 return moyenne_votes
49
b31ce2d7 50
9372250c 51class OffreEmploiManager(models.Manager):
a0ee106d 52
9372250c
OL
53 def get_query_set(self):
54 fkeys = ('region',)
55 return super(OffreEmploiManager, self).get_query_set().\
56 select_related(*fkeys).all()
57
b31ce2d7 58
9372250c 59class ProxyOffreEmploi(emploi.OffreEmploi):
a0ee106d 60
9372250c
OL
61 class Meta:
62 proxy = True
a0ee106d
EMS
63 verbose_name = u"offre d'emploi (visualisation)"
64 verbose_name_plural = u"offres d'emploi (visualisation)"
9372250c
OL
65
66 def __unicode__(self):
67 return '%s [%s] - View' % (self.nom, self.id)
68
b31ce2d7 69
9372250c 70class ProxyCandidat(emploi.Candidat):
a0ee106d 71
9372250c
OL
72 class Meta:
73 proxy = True
a0ee106d
EMS
74 verbose_name = u"candidat (visualisation)"
75 verbose_name_plural = u"candidats (visualisation)"
9372250c
OL
76
77 def __unicode__(self):
78 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
79
b31ce2d7 80
9372250c 81class Evaluateur(models.Model):
a0ee106d 82 user = models.ForeignKey(User, unique=True, verbose_name=u"évaluateur")
940c9dd8 83
9372250c
OL
84 class Meta:
85 verbose_name = u"évaluateur"
86
87 def __unicode__(self):
88 return '%s %s' % (self.user.first_name, self.user.last_name)
89
b31ce2d7 90
3bc5ea42
OL
91# Synchro des objets évaluateurs pour mettre les users Django dans le groupe
92# évaluateurs, afin d'y mettre des permissions
c472b01a 93@receiver(pre_save, sender=Evaluateur)
3bc5ea42
OL
94def sync_add_groupe_evaluateur(sender, **kwargs):
95 instance = kwargs['instance']
86e4bb65
DB
96 if grp_evaluateurs not in instance.user.groups.all():
97 instance.user.groups.add(grp_evaluateurs)
3bc5ea42
OL
98 instance.user.save()
99
b31ce2d7 100
3bc5ea42
OL
101@receiver(pre_delete, sender=Evaluateur)
102def sync_delete_groupe_evaluateur(sender, **kwargs):
103 instance = kwargs['instance']
86e4bb65 104 instance.user.groups.remove(grp_evaluateurs)
3bc5ea42
OL
105 instance.user.save()
106
107
9372250c 108class CandidatEvaluation(models.Model):
b31ce2d7
EMS
109 candidat = models.ForeignKey(emploi.Candidat, db_column='candidat',
110 related_name='evaluations',)
111 evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
a0ee106d 112 related_name='+', verbose_name=u'évaluateur')
9372250c
OL
113 note = models.IntegerField(choices=NOTES, blank=True, null=True)
114 commentaire = models.TextField(null=True, blank=True, default='Aucun')
b31ce2d7 115 date = models.DateField(auto_now_add=True,)
9372250c
OL
116
117 class Meta:
118 verbose_name = u'évaluation du candidat'
119 verbose_name_plural = u'évaluations des candidats'
120
121 def __unicode__(self):
122 return u"Évaluation de %s" % self.candidat
123
bc4d0ce7
OL
124 def get_appreciation(self,):
125 if self.note is None:
126 return u"non disponible"
127 return u"%s %s" % (self.note, self.commentaire,)
3bc5ea42 128
b31ce2d7 129
3bc5ea42
OL
130class MesCandidatEvaluation(CandidatEvaluation):
131
132 class Meta:
133 proxy = True
a0ee106d
EMS
134 verbose_name = u"mon candidat à évaluer"
135 verbose_name_plural = u"mes candidats à évaluer"
3bc5ea42
OL
136
137
9372250c
OL
138#### TEMPLATE COURRIEL
139TEMPLATE_CHOICES = (
140 ('SEL', 'Sélectionné'),
141 ('REF', 'Refusé'),
142)
143
9372250c 144
b31ce2d7
EMS
145class CourrielTemplate(models.Model):
146 nom_modele = models.CharField(u'nom du modèle', max_length=100)
147 sujet = models.CharField(u'sujet du courriel', max_length=100)
148 plain_text = models.TextField(u'texte', help_text=HELP_TEXT_TAGS_ACCEPTES)
9372250c
OL
149
150 def __unicode__(self):
b31ce2d7 151 return self.nom_modele
9372250c
OL
152
153 class Meta:
b31ce2d7 154 ordering = ('nom_modele',)
a0ee106d
EMS
155 verbose_name = u"modèle de courriel"
156 verbose_name_plural = u"modèles de courriel"
9372250c 157
b31ce2d7 158
9372250c 159class CandidatCourriel(models.Model):
a0ee106d 160 candidats = models.ManyToManyField(Candidat, verbose_name=u"candidats")
b31ce2d7
EMS
161 template = models.ForeignKey(
162 CourrielTemplate, db_column='template', related_name='+',
a0ee106d 163 verbose_name=u"modèle de courriel"
b31ce2d7
EMS
164 )
165 sujet = models.CharField(
166 max_length=255, blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES
167 )
168 plain_text = models.TextField(
169 u'texte', blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES
170 )
171 html = tinymce_models.HTMLField(
172 verbose_name=u'texte en HTML', null=True, blank=True,
173 help_text=HELP_TEXT_TAGS_ACCEPTES
174 )
9372250c
OL
175
176 def __unicode__(self):
b31ce2d7 177 return self.titre
9372250c
OL
178
179 class Meta:
180 verbose_name = u"modèle de courriel"
181 verbose_name_plural = u"modèles de courriel"