Commit | Line | Data |
---|---|---|
9372250c OL |
1 | # -=- encoding: utf-8 -=- |
2 | ||
9372250c | 3 | from django.contrib.auth.models import User |
9372250c OL |
4 | from tinymce import models as tinymce_models |
5 | from django.db import models | |
c472b01a | 6 | from django.db.models.signals import pre_save, pre_delete |
3bc5ea42 OL |
7 | from django.dispatch import receiver |
8 | ||
9372250c OL |
9 | |
10 | from south.modelsinspector import add_introspection_rules | |
11 | add_introspection_rules([], ["^tinymce.models.HTMLField"]) | |
9372250c | 12 | |
9372250c | 13 | from auf.django.emploi import models as emploi |
3bc5ea42 | 14 | from recrutement.workflow import grp_evaluateurs_recrutement |
9372250c OL |
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 | ||
b31ce2d7 | 32 | |
9372250c OL |
33 | # Abstracts |
34 | class Metadata(models.Model): | |
b31ce2d7 EMS |
35 | """ |
36 | Méta-données AUF. | |
9372250c OL |
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, ) | |
b31ce2d7 | 42 | |
9372250c OL |
43 | class Meta: |
44 | abstract = True | |
45 | ||
b31ce2d7 | 46 | |
9372250c OL |
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 | ||
b31ce2d7 | 62 | |
9372250c OL |
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 | ||
b31ce2d7 | 72 | |
9372250c OL |
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 | ||
b31ce2d7 | 79 | |
9372250c OL |
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 | ||
b31ce2d7 | 89 | |
9372250c OL |
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 | ||
b31ce2d7 | 99 | |
9372250c OL |
100 | class Evaluateur(models.Model): |
101 | user = models.ForeignKey(User, unique=True, verbose_name=u"Évaluateur") | |
940c9dd8 | 102 | |
9372250c OL |
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 | ||
b31ce2d7 | 109 | |
3bc5ea42 OL |
110 | # Synchro des objets évaluateurs pour mettre les users Django dans le groupe |
111 | # évaluateurs, afin d'y mettre des permissions | |
c472b01a | 112 | @receiver(pre_save, sender=Evaluateur) |
3bc5ea42 OL |
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 | ||
b31ce2d7 | 119 | |
3bc5ea42 OL |
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 | ||
9372250c | 127 | class CandidatEvaluation(models.Model): |
b31ce2d7 EMS |
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') | |
9372250c OL |
132 | note = models.IntegerField(choices=NOTES, blank=True, null=True) |
133 | commentaire = models.TextField(null=True, blank=True, default='Aucun') | |
b31ce2d7 | 134 | date = models.DateField(auto_now_add=True,) |
9372250c OL |
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 | ||
bc4d0ce7 OL |
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,) | |
3bc5ea42 | 147 | |
b31ce2d7 | 148 | |
3bc5ea42 OL |
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 | ||
9372250c OL |
157 | #### TEMPLATE COURRIEL |
158 | TEMPLATE_CHOICES = ( | |
159 | ('SEL', 'Sélectionné'), | |
160 | ('REF', 'Refusé'), | |
161 | ) | |
162 | ||
9372250c | 163 | |
b31ce2d7 EMS |
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) | |
9372250c OL |
168 | |
169 | def __unicode__(self): | |
b31ce2d7 | 170 | return self.nom_modele |
9372250c OL |
171 | |
172 | class Meta: | |
b31ce2d7 | 173 | ordering = ('nom_modele',) |
9372250c OL |
174 | verbose_name = "Modèle de courriel" |
175 | verbose_name_plural = "Modèles de courriel" | |
176 | ||
b31ce2d7 | 177 | |
9372250c | 178 | class CandidatCourriel(models.Model): |
b31ce2d7 EMS |
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 | ) | |
9372250c OL |
194 | |
195 | def __unicode__(self): | |
b31ce2d7 | 196 | return self.titre |
9372250c OL |
197 | |
198 | class Meta: | |
199 | verbose_name = u"modèle de courriel" | |
200 | verbose_name_plural = u"modèles de courriel" |