1908: Cleaning code
[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 from south.modelsinspector import add_introspection_rules
11 add_introspection_rules([], ["^tinymce.models.HTMLField"])
12 import datamaster_modeles.models as ref
13 from recrutement.workflow import grp_evaluateurs_recrutement
14 from auf.django.emploi import models as emploi
15 from auf.django.emploi.models import TYPE_PIECE_CHOICES
16
17 from recrutement.workflow import grp_evaluateurs_recrutement
18
19 ### CONSTANTES
20 #NOTES
21 NOTE_MIN = 1
22 NOTE_RANGE = 1
23 NOTE_MAX = 11
24 NOTES = [(i, i) for i in range(NOTE_MIN, NOTE_MAX, NOTE_RANGE)]
25
26 #HELP_TEXT
27 HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge"
28 HELP_TEXT_FORMAT_DATE = "Le format de la date est AAAA-MM-JJ"
29 HELP_TEXT_TAGS_ACCEPTES = "Pour le texte, les variables disponibles sont : \
30 {{ nom_candidat }} {{ prenom_candidat }} \
31 {{ offre_emploi }} et {{ genre_candidat }} \
32 (Pour Monsieur/Madame). Ces champs seront \
33 automatiquement remplacés par les informations de \
34 chaque candidat."
35
36 # Abstracts
37 class Metadata(models.Model):
38 """Méta-données AUF.
39 Metadata.actif = flag remplaçant la suppression.
40 actif == False : objet réputé supprimé.
41 """
42 actif = models.BooleanField(default=True)
43 date_creation = models.DateField(auto_now_add=True,
44 help_text=HELP_TEXT_FORMAT_DATE, )
45
46 class Meta:
47 abstract = True
48
49 class Candidat(emploi.Candidat):
50 class Meta:
51 proxy = True
52
53 def moyenne_notes(self):
54 evaluations = CandidatEvaluation.objects.filter(candidat=self)
55 notes = [evaluation.note for evaluation in evaluations.all() \
56 if evaluation.note is not None]
57
58 if len(notes) > 0:
59 moyenne_votes = float(sum(notes)) / len(notes)
60 else:
61 moyenne_votes = "Non disponible"
62 return moyenne_votes
63
64 class OffreEmploi(emploi.OffreEmploi):
65 class Meta:
66 proxy = True
67
68
69 class CandidatPiece(emploi.CandidatPiece):
70 class Meta:
71 proxy = True
72
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
79 class ProxyOffreEmploi(emploi.OffreEmploi):
80 class Meta:
81 proxy = True
82 verbose_name = "Offre d'emploi (visualisation)"
83 verbose_name_plural = "Offres d'emploi (visualisation)"
84
85 def __unicode__(self):
86 return '%s [%s] - View' % (self.nom, self.id)
87
88 class ProxyCandidat(emploi.Candidat):
89 class Meta:
90 proxy = True
91 verbose_name = "Candidat (visualisation)"
92 verbose_name_plural = "Candidats (visualisation)"
93
94 def __unicode__(self):
95 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
96
97 class Evaluateur(models.Model):
98 user = models.ForeignKey(User, unique=True, verbose_name="Évaluateur")
99 offres_emploi = models.ManyToManyField(emploi.OffreEmploi,
100 related_name="evaluateurs", blank=True)
101
102 def save(self, *args, **kwargs):
103 """
104 Assigner automatiquement l'évaluateurs d'une offre d'emploi à un
105 nouveau candidat.
106 """
107 self.user.groups.add(grp_evaluateurs_recrutement)
108 super(Evaluateur, self).save(*args, **kwargs)
109
110 class Meta:
111 verbose_name = "évaluateur"
112
113 def __unicode__(self):
114 return '%s %s' % (self.user.first_name, self.user.last_name)
115
116 class AdministrateurRegional(models.Model):
117 user = models.ForeignKey(User, unique=True,
118 verbose_name="Administrateur régionnal")
119 regions = models.ManyToManyField(ref.Region,
120 verbose_name="Régions", )
121
122 class Meta:
123 verbose_name = "administrateur régional"
124 verbose_name_plural = "administrateurs régionaux"
125
126 def __unicode__(self):
127 return '%s %s' % (self.user.first_name, self.user.last_name)
128
129 class CandidatEvaluation(models.Model):
130 candidat = models.ForeignKey(emploi.Candidat, db_column='candidat',
131 related_name='+',)
132 evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
133 related_name='+', verbose_name='Évaluateur')
134 note = models.IntegerField(choices=NOTES, blank=True, null=True)
135 commentaire = models.TextField(null=True, blank=True, default='Aucun')
136 date = models.DateField(auto_now_add=True,
137 help_text=HELP_TEXT_FORMAT_DATE, )
138
139 class Meta:
140 verbose_name = 'évaluation du candidat'
141 verbose_name_plural = 'évaluations des candidats'
142
143 #### TEMPLATE COURRIEL
144 TEMPLATE_CHOICES = (
145 ('SEL', 'Sélectionné'),
146 ('REF', 'Refusé'),
147 )
148
149 class CourrielTemplate(models.Model):
150 nom_modele = models.CharField(max_length=100, verbose_name='Nom du modèle',)
151 sujet = models.CharField(max_length=100, verbose_name='Sujet du courriel')
152 plain_text = models.TextField(verbose_name='Texte',
153 help_text=HELP_TEXT_TAGS_ACCEPTES, )
154 html = tinymce_models.HTMLField(verbose_name='Texte en HTML',
155 help_text=HELP_TEXT_TAGS_ACCEPTES, )
156
157
158 def __unicode__(self):
159 return u'%s' % self.nom_modele
160
161 class Meta:
162 ordering = ['nom_modele',]
163 verbose_name = "Modèle de courriel"
164 verbose_name_plural = "Modèles de courriel"
165
166 class CandidatCourriel(models.Model):
167 candidats = models.ManyToManyField(Candidat, verbose_name="Candidats", )
168 template = models.ForeignKey(CourrielTemplate, db_column='template',
169 related_name='+', verbose_name="Modèle de courriel", )
170 sujet = models.CharField(max_length=255, blank=True,
171 help_text=HELP_TEXT_TAGS_ACCEPTES, )
172 plain_text = models.TextField(verbose_name='Texte', blank=True,
173 help_text=HELP_TEXT_TAGS_ACCEPTES, )
174 html = tinymce_models.HTMLField(verbose_name='Texte en HTML', null=True,
175 blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES, )
176
177 def __unicode__(self):
178 return '%s' % (self.titre)
179
180 class Meta:
181 verbose_name = "modèle de courriel"
182 verbose_name_plural = "modèles de courriel"
183