1819: Voir moyenne des notes d'un candidat lors de la visualisation d'un candidat
[auf_rh_dae.git] / project / recrutement / models.py
1 # -=- encoding: utf-8 -=-
2
3 import datetime
4 from django.contrib.auth.models import User
5 from django.core.files.storage import FileSystemStorage
6 from tinymce import models as tinymce_models
7 from django.db import models
8 import settings
9
10 import datamaster_modeles.models as ref
11 from recrutement.workflow import grp_evaluateurs_recrutement
12 from auf.django.emploi import models as emploi
13 from auf.django.emploi.models import TYPE_PIECE_CHOICES
14
15 from recrutement.workflow import grp_evaluateurs_recrutement
16
17 ### CONSTANTES
18 #NOTES
19 NOTE_MIN = 1
20 NOTE_RANGE = 1
21 NOTE_MAX = 11
22 NOTES = [(i, i) for i in range(NOTE_MIN, NOTE_MAX, NOTE_RANGE)]
23
24 #HELP_TEXT
25 HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge"
26 HELP_TEXT_FORMAT_DATE = "Le format de la date est AAAA-MM-JJ"
27 HELP_TEXT_TAGS_ACCEPTES = "Pour le texte, les variables disponibles sont : \
28 {{ nom_candidat }} {{ prenom_candidat }} \
29 {{ offre_emploi }} et {{ genre_candidat }} \
30 (Pour Monsieur/Madame). Ces champs seront \
31 automatiquement remplacés par les informations de \
32 chaque candidat."
33
34 # Abstracts
35 class Metadata(models.Model):
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 help_text=HELP_TEXT_FORMAT_DATE, )
43
44 class Meta:
45 abstract = True
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 and offre_emploi.date_limite <= datetime.date.today():
57 moyenne_votes = float(sum(notes)) / len(notes)
58 else:
59 moyenne_votes = "Non disponible"
60 return moyenne_votes
61
62 class OffreEmploi(emploi.OffreEmploi):
63 class Meta:
64 proxy = True
65
66
67 class CandidatPiece(emploi.CandidatPiece):
68 class Meta:
69 proxy = True
70
71 class OffreEmploiManager(models.Manager):
72 def get_query_set(self):
73 fkeys = ('region',)
74 return super(OffreEmploiManager, self).get_query_set().\
75 select_related(*fkeys).all()
76
77 class ProxyOffreEmploi(emploi.OffreEmploi):
78 class Meta:
79 proxy = True
80 verbose_name = "Offre d'emploi (visualisation)"
81 verbose_name_plural = "Offres d'emploi (visualisation)"
82
83 def __unicode__(self):
84 return '%s [%s] - View' % (self.nom, self.id)
85
86 class ProxyCandidat(emploi.Candidat):
87 class Meta:
88 proxy = True
89 verbose_name = "Candidat (visualisation)"
90 verbose_name_plural = "Candidats (visualisation)"
91
92 def __unicode__(self):
93 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
94
95 class Evaluateur(models.Model):
96 user = models.ForeignKey(User, unique=True, verbose_name="Évaluateur")
97 offres_emploi = models.ManyToManyField(emploi.OffreEmploi,
98 related_name="evaluateurs", blank=True)
99
100 def save(self, *args, **kwargs):
101 """
102 Assigner automatiquement l'évaluateurs d'une offre d'emploi à un
103 nouveau candidat.
104 """
105 self.user.groups.add(grp_evaluateurs_recrutement)
106 super(Evaluateur, self).save(*args, **kwargs)
107
108 class Meta:
109 verbose_name = "évaluateur"
110
111 def __unicode__(self):
112 return '%s %s' % (self.user.first_name, self.user.last_name)
113
114 class AdministrateurRegional(models.Model):
115 user = models.ForeignKey(User, unique=True,
116 verbose_name="Administrateur régionnal")
117 regions = models.ManyToManyField(ref.Region,
118 verbose_name="Régions", )
119
120 class Meta:
121 verbose_name = "administrateur régional"
122 verbose_name_plural = "administrateurs régionaux"
123
124 def __unicode__(self):
125 return '%s %s' % (self.user.first_name, self.user.last_name)
126
127 class CandidatEvaluation(models.Model):
128 candidat = models.ForeignKey(emploi.Candidat, db_column='candidat',
129 related_name='+',)
130 evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
131 related_name='+', verbose_name='É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 help_text=HELP_TEXT_FORMAT_DATE, )
136
137 class Meta:
138 verbose_name = 'évaluation du candidat'
139 verbose_name_plural = 'évaluations des candidats'
140
141 #### TEMPLATE COURRIEL
142 TEMPLATE_CHOICES = (
143 ('SEL', 'Sélectionné'),
144 ('REF', 'Refusé'),
145 )
146
147 class CourrielTemplate(models.Model):
148 nom_modele = models.CharField(max_length=100, verbose_name='Nom du modèle',)
149 sujet = models.CharField(max_length=100, verbose_name='Sujet du courriel')
150 plain_text = models.TextField(verbose_name='Texte',
151 help_text=HELP_TEXT_TAGS_ACCEPTES, )
152 html = tinymce_models.HTMLField(verbose_name='Texte en HTML',
153 help_text=HELP_TEXT_TAGS_ACCEPTES, )
154
155 def __unicode__(self):
156 return u'%s' % self.nom_modele
157
158 class Meta:
159 ordering = ['nom_modele',]
160
161 class CandidatCourriel(models.Model):
162 candidats = models.ManyToManyField(Candidat, verbose_name="Candidats", )
163 template = models.ForeignKey(CourrielTemplate, db_column='template',
164 related_name='+', verbose_name="Modèle de courriel", )
165 sujet = models.CharField(max_length=255, blank=True,
166 help_text=HELP_TEXT_TAGS_ACCEPTES, )
167 plain_text = models.TextField(verbose_name='Texte', blank=True,
168 help_text=HELP_TEXT_TAGS_ACCEPTES, )
169 html = tinymce_models.HTMLField(verbose_name='Texte en HTML', null=True,
170 blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES, )
171
172 def __unicode__(self):
173 return '%s' % (self.titre)
174
175 class Meta:
176 verbose_name = "modèle de courriel"
177 verbose_name_plural = "modèles de courriel"
178