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