Lors de l'ajout d'un candidat, créer automatiquement une EvaluationCandidat, si l...
[auf_django_emploi.git] / auf / django / emploi / models.py
1 # -*- encoding: utf-8 -*
2
3 import datetime
4 from django.core.files.storage import FileSystemStorage
5 from tinymce import models as tinymce_models
6 from django.db import models
7 import settings
8
9 import datamaster_modeles.models as ref
10
11 ### CONSTANTES ###
12 # HELP_TEXT
13 HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge"
14 HELP_TEXT_FORMAT_DATE = "Le format de la date est AAAA-MM-JJ"
15 HELP_TEXT_TAGS_ACCEPTES = "Pour le texte, les variables disponibles sont : \
16 {{ nom_candidat }} {{ prenom_candidat }} \
17 {{ offre_emploi }}. Ces champs seront \
18 automatiquement remplacés par les informations de \
19 chaque candidat."
20
21
22 STATUT_OFFRE_EMPLOI_CHOICES = (
23 ('NOUV', 'Nouveau'),
24 ('AFFI', 'Offre d\'emploi en affichage'),
25 ('EVAL', 'En évaluation des candidatures'),
26 ('ENTR', 'En entrevue'),
27 ('TERM', 'Terminé'),
28 )
29
30 # CANDIDAT
31 GENRE_CHOICES = (
32 ('M', 'Homme'),
33 ('F', 'Femme'),
34 )
35 SITUATION_CHOICES = (
36 ('C', 'Célibataire'),
37 ('F', 'Conjoint de fait'),
38 ('M', 'Marié'),
39 ('D', 'Divorcé'),
40 )
41 STATUT_CHOICES = (
42 ('NOUV', 'Nouveau'),
43 ('REC', 'Recevable'),
44 ('SEL', 'Sélectionné'),
45 ('REF', 'Refusé'),
46 ('ACC', 'Accepté'),
47 )
48
49 # PIECE CANDIDAT
50 TYPE_PIECE_CHOICES = (
51 ('CV','CV'),
52 ('LET','Lettre'),
53 ('AUT','Autre'),
54 )
55
56 # Abstracts
57 class Metadata(models.Model):
58 """
59 Méta-données AUF.
60 Metadata.actif = flag remplaçant la suppression.
61 actif == False : objet réputé supprimé.
62 """
63 actif = models.BooleanField(default=True)
64 date_creation = models.DateField(auto_now_add=True,
65 help_text=HELP_TEXT_FORMAT_DATE, )
66
67 class Meta:
68 abstract = True
69
70 class OffreEmploi(Metadata):
71 est_affiche = models.BooleanField(default=False,
72 verbose_name="En affichage sur le site")
73 statut = models.CharField(max_length=4, choices=STATUT_OFFRE_EMPLOI_CHOICES,
74 default='NOUV')
75 nom = models.CharField(max_length=255)
76 resume = models.TextField(verbose_name="Résumé")
77 description = models.TextField()
78 #poste_id = models.IntegerField(verbose_name="Nombre de dépendant")
79 #poste_nom = models.CharField(max_length=255, verbose_name="Nom du poste")
80 #poste = models.ForeignKey('rh.Poste', db_column='poste')
81 date_limite = models.DateField(verbose_name="Date limite",
82 help_text=HELP_TEXT_FORMAT_DATE,)
83 region = models.ForeignKey(ref.Region, db_column='region',
84 verbose_name="Région")
85 bureau = models.ForeignKey(ref.Bureau, db_column='bureau', )
86 duree_affectation = models.CharField(max_length=255,
87 verbose_name="Durée de l'affectation")
88 renumeration = models.CharField(max_length=255,
89 verbose_name='Rénumération')
90 debut_affectation = models.DateField(verbose_name="Début de l'affectation",
91 help_text=HELP_TEXT_FORMAT_DATE,)
92 lieu_affectation = models.ForeignKey(ref.Implantation,
93 db_column='implantation',
94 verbose_name="Lieu d'affectation")
95
96 class Meta:
97 db_table = 'emploi_offreemploi'
98 verbose_name_plural = "offres d'emploi"
99
100 def __unicode__(self):
101 return '%s [%s]' % (self.nom, self.id)
102
103 class Candidat(Metadata):
104 statut = models.CharField(max_length=4, choices=STATUT_CHOICES,
105 default='NOUV')
106 offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi',
107 related_name='+')
108 prenom = models.CharField(max_length=255, verbose_name='Prénom', )
109 nom = models.CharField(max_length=255)
110 genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
111 nationalite = models.ForeignKey(ref.Pays,
112 db_column='nationalite', related_name='+',
113 verbose_name='Nationalité')
114 situation_famille = models.CharField(max_length=1,
115 choices=SITUATION_CHOICES,
116 verbose_name='Situation familiale', )
117 nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant',
118 help_text=HELP_TEXT_NB_DEPENDANT, )
119 niveau_diplome = models.CharField(max_length=255,
120 verbose_name='Niveau du diplôme')
121 employeur_actuel = models.CharField(max_length=255, )
122 poste_actuel = models.CharField(max_length=255, )
123 domaine_professionnel = models.CharField(max_length=255, )
124 telephone = models.CharField(max_length=255, verbose_name='Téléphone', )
125 email = models.EmailField(max_length=255, verbose_name = 'Courriel', )
126
127 # Adresse
128 adresse = models.CharField(max_length=255)
129 ville = models.CharField(max_length=255)
130 etat_province = models.CharField(max_length=255,
131 verbose_name="État/Province")
132 code_postal = models.CharField(max_length=255, blank=True)
133 pays = models.ForeignKey(ref.Pays, db_column='pays',
134 related_name='+')
135
136 class Meta:
137 db_table = 'emploi_candidat'
138
139 def save(self, *args, **kwargs):
140 """
141 Créer automatiquement des CandidatEvaluation, si des évaluateurs sont
142 déjà assignés à des offres d'emploi
143 """
144 evaluateurs = OffreEmploi.objects.filter(id=self.offre_emploi.id)
145
146 for evaluateur in evaluateurs:
147 candidat_evaluation = CandidatEvaluation()
148 candidat_evaluation.candidat = self
149 candidat_evaluation.evaluateur = evaluateur
150 candidat_evaluation.save()
151 super(Candidat, self).save(*args, **kwargs)
152
153
154 def pieces_jointes(self):
155 return CandidatPiece.objects.filter(candidat=self)
156 pieces_jointes.allow_tags = True
157
158 def __unicode__(self):
159 return '%s %s [%s]' % (self.nom, self.prenom, self.id)
160
161
162 # Upload de fichiers
163 storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
164 base_url=settings.PRIVE_MEDIA_URL)
165
166 def candidat_piece_dispatch(instance, filename):
167 path = u'%s/%s/%s_%s_%s/%s/%s' % ('emplois', instance.candidat.offre_emploi.id,
168 instance.candidat.nom, instance.candidat.prenom, instance.candidat.id,
169 instance.nom, filename)
170 return path
171
172 class CandidatPiece(models.Model):
173 candidat = models.ForeignKey(Candidat, db_column='candidat',
174 related_name='candidat_piece')
175 nom = models.CharField(max_length=3, choices=TYPE_PIECE_CHOICES)
176 path = models.FileField(verbose_name="Fichier",
177 upload_to=candidat_piece_dispatch, storage=storage_prive)
178
179 class Meta:
180 db_table = 'emploi_pieces'
181 verbose_name = "pièce jointe"
182 verbose_name_plural = "pièces jointes"
183
184 def __unicode__(self):
185 return '%s' % (self.nom)