fix group machinerie
[auf_rh_dae.git] / project / recrutement / models.py
1 # -=- encoding: utf-8 -=-
2
3 from auf.django.emploi import models as emploi
4 from django.contrib.auth.models import User, Group
5 from django.db import models
6 from django.db.models.signals import pre_save, pre_delete
7 from django.dispatch import receiver
8 from south.modelsinspector import add_introspection_rules
9 from tinymce import models as tinymce_models
10
11 from project.recrutement import groups as recrutement_groups
12
13 ### CONSTANTES
14
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_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
30 # Pour South
31 add_introspection_rules([], ["^tinymce.models.HTMLField"])
32
33
34 class Candidat(emploi.Candidat):
35
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
50
51 class OffreEmploiManager(models.Manager):
52
53 def get_query_set(self):
54 fkeys = ('region',)
55 return super(OffreEmploiManager, self).get_query_set().\
56 select_related(*fkeys).all()
57
58
59 class ProxyOffreEmploi(emploi.OffreEmploi):
60
61 class Meta:
62 proxy = True
63 verbose_name = u"offre d'emploi (visualisation)"
64 verbose_name_plural = u"offres d'emploi (visualisation)"
65
66 def __unicode__(self):
67 return '%s [%s] - View' % (self.nom, self.id)
68
69
70 class ProxyCandidat(emploi.Candidat):
71
72 class Meta:
73 proxy = True
74 verbose_name = u"candidat (visualisation)"
75 verbose_name_plural = u"candidats (visualisation)"
76
77 def __unicode__(self):
78 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
79
80
81 class Evaluateur(models.Model):
82 user = models.ForeignKey(User, unique=True, verbose_name=u"évaluateur")
83
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
90
91 # Synchro des objets évaluateurs pour mettre les users Django dans le groupe
92 # évaluateurs, afin d'y mettre des permissions
93 @receiver(pre_save, sender=Evaluateur)
94 def sync_add_groupe_evaluateur(sender, **kwargs):
95 instance = kwargs['instance']
96 user_groups = [g.name for g in instance.user.groups.all()]
97 if recrutement_groups.EVALUATEURS not in user_groups:
98 grp_evaluateurs = Group.objects.get(name=recrutement_groups.EVALUATEURS)
99 instance.user.groups.add(grp_evaluateurs)
100 instance.user.save()
101
102
103 @receiver(pre_delete, sender=Evaluateur)
104 def sync_delete_groupe_evaluateur(sender, **kwargs):
105 instance = kwargs['instance']
106 grp_evaluateurs = Group.objects.get(name=recrutement_groups.EVALUATEURS)
107 instance.user.groups.remove(grp_evaluateurs)
108 instance.user.save()
109
110
111 class CandidatEvaluation(models.Model):
112 candidat = models.ForeignKey(emploi.Candidat, db_column='candidat',
113 related_name='evaluations',)
114 evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
115 related_name='+', verbose_name=u'évaluateur')
116 note = models.IntegerField(choices=NOTES, blank=True, null=True)
117 commentaire = models.TextField(null=True, blank=True, default='Aucun')
118 date = models.DateField(auto_now_add=True,)
119
120 class Meta:
121 verbose_name = u'évaluation du candidat'
122 verbose_name_plural = u'évaluations des candidats'
123
124 def __unicode__(self):
125 return u"Évaluation de %s" % self.candidat
126
127 def get_appreciation(self,):
128 if self.note is None:
129 return u"non disponible"
130 return u"%s %s" % (self.note, self.commentaire,)
131
132
133 class MesCandidatEvaluation(CandidatEvaluation):
134
135 class Meta:
136 proxy = True
137 verbose_name = u"mon candidat à évaluer"
138 verbose_name_plural = u"mes candidats à évaluer"
139
140
141 #### TEMPLATE COURRIEL
142 TEMPLATE_CHOICES = (
143 ('SEL', 'Sélectionné'),
144 ('REF', 'Refusé'),
145 )
146
147
148 class CourrielTemplate(models.Model):
149 nom_modele = models.CharField(u'nom du modèle', max_length=100)
150 sujet = models.CharField(u'sujet du courriel', max_length=100)
151 plain_text = models.TextField(u'texte', help_text=HELP_TEXT_TAGS_ACCEPTES)
152
153 def __unicode__(self):
154 return self.nom_modele
155
156 class Meta:
157 ordering = ('nom_modele',)
158 verbose_name = u"modèle de courriel"
159 verbose_name_plural = u"modèles de courriel"
160
161
162 class CandidatCourriel(models.Model):
163 candidats = models.ManyToManyField(Candidat, verbose_name=u"candidats")
164 template = models.ForeignKey(
165 CourrielTemplate, db_column='template', related_name='+',
166 verbose_name=u"modèle de courriel"
167 )
168 sujet = models.CharField(
169 max_length=255, blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES
170 )
171 plain_text = models.TextField(
172 u'texte', blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES
173 )
174 html = tinymce_models.HTMLField(
175 verbose_name=u'texte en HTML', null=True, blank=True,
176 help_text=HELP_TEXT_TAGS_ACCEPTES
177 )
178
179 def __unicode__(self):
180 return self.titre
181
182 class Meta:
183 verbose_name = u"modèle de courriel"
184 verbose_name_plural = u"modèles de courriel"