1 # -=- encoding: utf-8 -=-
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
11 from project
.recrutement
import groups
as recrutement_groups
19 NOTES
= [(i
, i
) for i
in range(NOTE_MIN
, NOTE_MAX
, NOTE_RANGE
)]
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 \
31 add_introspection_rules([], ["^tinymce.models.HTMLField"])
34 class Candidat(emploi
.Candidat
):
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]
45 moyenne_votes
= float(sum(notes
)) / len(notes
)
47 moyenne_votes
= "Non disponible"
51 class OffreEmploiManager(models
.Manager
):
53 def get_query_set(self
):
55 return super(OffreEmploiManager
, self
).get_query_set().\
56 select_related(*fkeys
).all()
59 class ProxyOffreEmploi(emploi
.OffreEmploi
):
63 verbose_name
= u
"offre d'emploi (visualisation)"
64 verbose_name_plural
= u
"offres d'emploi (visualisation)"
66 def __unicode__(self
):
67 return '%s [%s] - View' % (self
.nom
, self
.id)
70 class ProxyCandidat(emploi
.Candidat
):
74 verbose_name
= u
"candidat (visualisation)"
75 verbose_name_plural
= u
"candidats (visualisation)"
77 def __unicode__(self
):
78 return '%s %s [%s]' % (self
.prenom
, self
.nom
, self
.id)
81 class Evaluateur(models
.Model
):
82 user
= models
.ForeignKey(User
, unique
=True, verbose_name
=u
"évaluateur")
85 verbose_name
= u
"évaluateur"
87 def __unicode__(self
):
88 return '%s %s' % (self
.user
.first_name
, self
.user
.last_name
)
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
)
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
)
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')
118 unique_together
= ('offre_emploi', 'evaluateur')
119 verbose_name
= 'Évaluateur - offre emploi'
120 verbose_name_plural
= 'Évaluateurs - offre emploi'
122 def __unicode__(self
):
123 return u
"%s - %s" % (self
.offre_emploi
, self
.evaluateur
)
128 candidats
= Candidat
.objects
.filter(offre_emploi
=self
.offre_emploi
)
129 for candidat
in candidats
:
130 candidat_evaluation
, created
= CandidatEvaluation
.objects
.get_or_create(candidat
=candidat
, evaluateur
=self
.evaluateur
)
132 super(OffreEmploiEvaluateur
, self
).save()
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()
139 super(OffreEmploiEvaluateur
, self
).delete()
142 class CandidatEvaluation(models
.Model
):
143 candidat
= models
.ForeignKey(emploi
.Candidat
, db_column
='candidat',
144 related_name
='evaluations',)
145 evaluateur
= models
.ForeignKey(Evaluateur
, db_column
='evaluateur',
146 related_name
='+', verbose_name
=u
'évaluateur')
147 note
= models
.IntegerField(choices
=NOTES
, blank
=True, null
=True)
148 commentaire
= models
.TextField(null
=True, blank
=True, default
='Aucun')
149 date
= models
.DateField(auto_now_add
=True,)
152 verbose_name
= u
'évaluation du candidat'
153 verbose_name_plural
= u
'évaluations des candidats'
155 def __unicode__(self
):
156 return u
"Évaluation de %s" % self
.candidat
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
,)
164 class MesCandidatEvaluation(CandidatEvaluation
):
168 verbose_name
= u
"mon candidat à évaluer"
169 verbose_name_plural
= u
"mes candidats à évaluer"
172 #### TEMPLATE COURRIEL
174 ('SEL', 'Sélectionné'),
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
)
184 def __unicode__(self
):
185 return self
.nom_modele
188 ordering
= ('nom_modele',)
189 verbose_name
= u
"modèle de courriel"
190 verbose_name_plural
= u
"modèles de courriel"
193 class CandidatCourriel(models
.Model
):
194 candidats
= models
.ManyToManyField(Candidat
, verbose_name
=u
"candidats")
195 template
= models
.ForeignKey(
196 CourrielTemplate
, db_column
='template', related_name
='+',
197 verbose_name
=u
"modèle de courriel"
199 sujet
= models
.CharField(
200 max_length
=255, blank
=True, help_text
=HELP_TEXT_TAGS_ACCEPTES
202 plain_text
= models
.TextField(
203 u
'texte', blank
=True, help_text
=HELP_TEXT_TAGS_ACCEPTES
205 html
= tinymce_models
.HTMLField(
206 verbose_name
=u
'texte en HTML', null
=True, blank
=True,
207 help_text
=HELP_TEXT_TAGS_ACCEPTES
210 def __unicode__(self
):
214 verbose_name
= u
"modèle de courriel"
215 verbose_name_plural
= u
"modèles de courriel"