greffe recrutement en PROD
[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
14 from recrutement.workflow import grp_evaluateurs_recrutement
15 from auf.django.emploi import models as emploi
16 from auf.django.emploi.models import TYPE_PIECE_CHOICES
17
18 from recrutement.workflow import grp_evaluateurs_recrutement
19
20 ### CONSTANTES
21 #NOTES
22 NOTE_MIN = 1
23 NOTE_RANGE = 1
24 NOTE_MAX = 11
25 NOTES = [(i, i) for i in range(NOTE_MIN, NOTE_MAX, NOTE_RANGE)]
26
27 #HELP_TEXT
28 HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge"
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
45 class Meta:
46 abstract = True
47
48 class Candidat(emploi.Candidat):
49 class Meta:
50 proxy = True
51
52 def moyenne_notes(self):
53 evaluations = CandidatEvaluation.objects.filter(candidat=self)
54 notes = [evaluation.note for evaluation in evaluations.all() \
55 if evaluation.note is not None]
56
57 if len(notes) > 0:
58 moyenne_votes = float(sum(notes)) / len(notes)
59 else:
60 moyenne_votes = "Non disponible"
61 return moyenne_votes
62
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
72 class OffreEmploiManager(models.Manager):
73 def get_query_set(self):
74 fkeys = ('region',)
75 return super(OffreEmploiManager, self).get_query_set().\
76 select_related(*fkeys).all()
77
78 class ProxyOffreEmploi(emploi.OffreEmploi):
79 class Meta:
80 proxy = True
81 verbose_name = u"Offre d'emploi (visualisation)"
82 verbose_name_plural = u"Offres d'emploi (visualisation)"
83
84 def __unicode__(self):
85 return '%s [%s] - View' % (self.nom, self.id)
86
87 class ProxyCandidat(emploi.Candidat):
88 class Meta:
89 proxy = True
90 verbose_name = u"Candidat (visualisation)"
91 verbose_name_plural = u"Candidats (visualisation)"
92
93 def __unicode__(self):
94 return '%s %s [%s]' % (self.prenom, self.nom, self.id)
95
96 class Evaluateur(models.Model):
97 user = models.ForeignKey(User, unique=True, verbose_name=u"Évaluateur")
98 offres_emploi = models.ManyToManyField(emploi.OffreEmploi,
99 related_name="evaluateurs", blank=True)
100
101 def save(self, *args, **kwargs):
102 """
103 Assigner automatiquement l'évaluateurs d'une offre d'emploi à un
104 nouveau candidat.
105 """
106 self.user.groups.add(grp_evaluateurs_recrutement)
107 super(Evaluateur, self).save(*args, **kwargs)
108
109 class Meta:
110 verbose_name = u"évaluateur"
111
112 def __unicode__(self):
113 return '%s %s' % (self.user.first_name, self.user.last_name)
114
115 class CandidatEvaluation(models.Model):
116 candidat = models.ForeignKey(emploi.Candidat, db_column='candidat',
117 related_name='+',)
118 evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
119 related_name='+', verbose_name=u'Évaluateur')
120 note = models.IntegerField(choices=NOTES, blank=True, null=True)
121 commentaire = models.TextField(null=True, blank=True, default='Aucun')
122 date = models.DateField(auto_now_add=True,)
123
124 class Meta:
125 verbose_name = u'évaluation du candidat'
126 verbose_name_plural = u'évaluations des candidats'
127
128 def __unicode__(self):
129 return u"Évaluation de %s" % self.candidat
130
131 #### TEMPLATE COURRIEL
132 TEMPLATE_CHOICES = (
133 ('SEL', 'Sélectionné'),
134 ('REF', 'Refusé'),
135 )
136
137 class CourrielTemplate(models.Model):
138 nom_modele = models.CharField(max_length=100, verbose_name=u'Nom du modèle',)
139 sujet = models.CharField(max_length=100, verbose_name=u'Sujet du courriel')
140 plain_text = models.TextField(verbose_name=u'Texte',
141 help_text=HELP_TEXT_TAGS_ACCEPTES, )
142 html = tinymce_models.HTMLField(verbose_name=u'Texte en HTML',
143 help_text=HELP_TEXT_TAGS_ACCEPTES, )
144
145
146 def __unicode__(self):
147 return u'%s' % self.nom_modele
148
149 class Meta:
150 ordering = ['nom_modele',]
151 verbose_name = "Modèle de courriel"
152 verbose_name_plural = "Modèles de courriel"
153
154 class CandidatCourriel(models.Model):
155 candidats = models.ManyToManyField(Candidat, verbose_name=u"Candidats", )
156 template = models.ForeignKey(CourrielTemplate, db_column='template',
157 related_name='+', verbose_name=u"Modèle de courriel", )
158 sujet = models.CharField(max_length=255, blank=True,
159 help_text=HELP_TEXT_TAGS_ACCEPTES, )
160 plain_text = models.TextField(verbose_name=u'Texte', blank=True,
161 help_text=HELP_TEXT_TAGS_ACCEPTES, )
162 html = tinymce_models.HTMLField(verbose_name=u'Texte en HTML', null=True,
163 blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES, )
164
165 def __unicode__(self):
166 return '%s' % (self.titre)
167
168 class Meta:
169 verbose_name = u"modèle de courriel"
170 verbose_name_plural = u"modèles de courriel"