Commit | Line | Data |
---|---|---|
9372250c OL |
1 | # -=- encoding: utf-8 -=- |
2 | ||
a0ee106d | 3 | from auf.django.emploi import models as emploi |
3383b2d1 | 4 | from django.contrib.auth.models import User, Group |
9372250c | 5 | from django.db import models |
c472b01a | 6 | from django.db.models.signals import pre_save, pre_delete |
3bc5ea42 | 7 | from django.dispatch import receiver |
9372250c | 8 | from south.modelsinspector import add_introspection_rules |
a0ee106d | 9 | from tinymce import models as tinymce_models |
75f0e87b | 10 | |
3383b2d1 | 11 | from project.recrutement import groups as recrutement_groups |
9372250c OL |
12 | |
13 | ### CONSTANTES | |
a0ee106d | 14 | |
9372250c OL |
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 | ||
a0ee106d EMS |
30 | # Pour South |
31 | add_introspection_rules([], ["^tinymce.models.HTMLField"]) | |
9372250c | 32 | |
b31ce2d7 | 33 | |
9372250c | 34 | class 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 | 51 | class 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 | 59 | class 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 | 70 | class 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 | 81 | class 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 |
94 | def sync_add_groupe_evaluateur(sender, **kwargs): |
95 | instance = kwargs['instance'] | |
3383b2d1 OL |
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) | |
86e4bb65 | 99 | instance.user.groups.add(grp_evaluateurs) |
3bc5ea42 OL |
100 | instance.user.save() |
101 | ||
b31ce2d7 | 102 | |
3bc5ea42 OL |
103 | @receiver(pre_delete, sender=Evaluateur) |
104 | def sync_delete_groupe_evaluateur(sender, **kwargs): | |
105 | instance = kwargs['instance'] | |
3383b2d1 | 106 | grp_evaluateurs = Group.objects.get(name=recrutement_groups.EVALUATEURS) |
86e4bb65 | 107 | instance.user.groups.remove(grp_evaluateurs) |
3bc5ea42 OL |
108 | instance.user.save() |
109 | ||
110 | ||
d6b00a65 PP |
111 | class OffreEmploiEvaluateur(models.Model): |
112 | offre_emploi = models.ForeignKey(emploi.OffreEmploi, db_column='offre_emploi', | |
113 | verbose_name=u'offre d\'emploi') | |
114 | evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur', | |
115 | verbose_name=u'évaluateur') | |
116 | ||
117 | class Meta: | |
118 | unique_together = ('offre_emploi', 'evaluateur') | |
119 | ||
120 | def __unicode__(self): | |
121 | return u"%s - %s" % (self.offre_emploi, self.evaluateur) | |
122 | ||
123 | def save(self): | |
124 | ||
125 | if self.pk is None: | |
126 | candidats = Candidat.objects.filter(offre_emploi=self.offre_emploi) | |
127 | for candidat in candidats: | |
128 | print candidat | |
129 | print self.evaluateur | |
130 | candidat_evaluation, created = CandidatEvaluation.objects.get_or_create(candidat=candidat, evaluateur=self.evaluateur) | |
131 | ||
132 | super(OffreEmploiEvaluateur, self).save() | |
133 | ||
134 | def delete(self): | |
135 | candidats = Candidat.objects.filter(offre_emploi=self.offre_emploi) | |
136 | for candidat in candidats: | |
137 | CandidatEvaluation.objects.filter(candidat=candidat, evaluateur=self.evaluateur).delete() | |
138 | ||
139 | super(OffreEmploiEvaluateur, self).delete() | |
140 | ||
141 | ||
9372250c | 142 | class CandidatEvaluation(models.Model): |
b31ce2d7 EMS |
143 | candidat = models.ForeignKey(emploi.Candidat, db_column='candidat', |
144 | related_name='evaluations',) | |
145 | evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur', | |
a0ee106d | 146 | related_name='+', verbose_name=u'évaluateur') |
9372250c OL |
147 | note = models.IntegerField(choices=NOTES, blank=True, null=True) |
148 | commentaire = models.TextField(null=True, blank=True, default='Aucun') | |
b31ce2d7 | 149 | date = models.DateField(auto_now_add=True,) |
9372250c OL |
150 | |
151 | class Meta: | |
152 | verbose_name = u'évaluation du candidat' | |
153 | verbose_name_plural = u'évaluations des candidats' | |
154 | ||
155 | def __unicode__(self): | |
156 | return u"Évaluation de %s" % self.candidat | |
157 | ||
bc4d0ce7 OL |
158 | def get_appreciation(self,): |
159 | if self.note is None: | |
160 | return u"non disponible" | |
161 | return u"%s %s" % (self.note, self.commentaire,) | |
3bc5ea42 | 162 | |
b31ce2d7 | 163 | |
3bc5ea42 OL |
164 | class MesCandidatEvaluation(CandidatEvaluation): |
165 | ||
166 | class Meta: | |
167 | proxy = True | |
a0ee106d EMS |
168 | verbose_name = u"mon candidat à évaluer" |
169 | verbose_name_plural = u"mes candidats à évaluer" | |
3bc5ea42 OL |
170 | |
171 | ||
9372250c OL |
172 | #### TEMPLATE COURRIEL |
173 | TEMPLATE_CHOICES = ( | |
174 | ('SEL', 'Sélectionné'), | |
175 | ('REF', 'Refusé'), | |
176 | ) | |
177 | ||
9372250c | 178 | |
b31ce2d7 EMS |
179 | class CourrielTemplate(models.Model): |
180 | nom_modele = models.CharField(u'nom du modèle', max_length=100) | |
181 | sujet = models.CharField(u'sujet du courriel', max_length=100) | |
182 | plain_text = models.TextField(u'texte', help_text=HELP_TEXT_TAGS_ACCEPTES) | |
9372250c OL |
183 | |
184 | def __unicode__(self): | |
b31ce2d7 | 185 | return self.nom_modele |
9372250c OL |
186 | |
187 | class Meta: | |
b31ce2d7 | 188 | ordering = ('nom_modele',) |
a0ee106d EMS |
189 | verbose_name = u"modèle de courriel" |
190 | verbose_name_plural = u"modèles de courriel" | |
9372250c | 191 | |
b31ce2d7 | 192 | |
9372250c | 193 | class CandidatCourriel(models.Model): |
a0ee106d | 194 | candidats = models.ManyToManyField(Candidat, verbose_name=u"candidats") |
b31ce2d7 EMS |
195 | template = models.ForeignKey( |
196 | CourrielTemplate, db_column='template', related_name='+', | |
a0ee106d | 197 | verbose_name=u"modèle de courriel" |
b31ce2d7 EMS |
198 | ) |
199 | sujet = models.CharField( | |
200 | max_length=255, blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES | |
201 | ) | |
202 | plain_text = models.TextField( | |
203 | u'texte', blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES | |
204 | ) | |
205 | html = tinymce_models.HTMLField( | |
206 | verbose_name=u'texte en HTML', null=True, blank=True, | |
207 | help_text=HELP_TEXT_TAGS_ACCEPTES | |
208 | ) | |
9372250c OL |
209 | |
210 | def __unicode__(self): | |
b31ce2d7 | 211 | return self.titre |
9372250c OL |
212 | |
213 | class Meta: | |
214 | verbose_name = u"modèle de courriel" | |
215 | verbose_name_plural = u"modèles de courriel" |