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