1878: modification du modèle OffreEmploi
[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 HELP_TEXT_EN_AFFICHAGE = "En cochant cette case, l'offre d'emploi sera affichée\
21 sur le site institutionnel dès qu'elle aura le statut \
22 'En diffusion' et ce, jusqu'à la date limite."
23
24 STATUT_OFFRE_EMPLOI_CHOICES = (
25 ('NOUV', 'Nouveau'),
26 ('AFFI', 'En diffusion'),
27 ('EVAL', 'En évaluation des candidatures'),
28 ('ENTR', 'En entrevue'),
29 ('TERM', 'Terminé'),
30 )
31
32 # CANDIDAT
33 GENRE_CHOICES = (
34 ('M', 'Homme'),
35 ('F', 'Femme'),
36 )
37 SITUATION_CHOICES = (
38 ('C', 'Célibataire'),
39 ('F', 'Conjoint de fait'),
40 ('M', 'Marié'),
41 ('D', 'Divorcé'),
42 )
43 STATUT_CHOICES = (
44 ('NOUV', 'Nouveau'),
45 ('REC', 'Recevable'),
46 ('SEL', 'Sélectionné'),
47 ('REF', 'Refusé'),
48 ('ACC', 'Accepté'),
49 )
50
51 # PIECE CANDIDAT
52 TYPE_PIECE_CHOICES = (
53 ('CV','CV'),
54 ('LET','Lettre'),
55 ('AUT','Autre'),
56 )
57
58 # Abstracts
59 class Metadata(models.Model):
60 """
61 Méta-données AUF.
62 Metadata.actif = flag remplaçant la suppression.
63 actif == False : objet réputé supprimé.
64 """
65 actif = models.BooleanField(default=True)
66 date_creation = models.DateField(auto_now_add=True,
67 help_text=HELP_TEXT_FORMAT_DATE, )
68
69 class Meta:
70 abstract = True
71
72 class OffreEmploi(Metadata):
73 est_affiche = models.BooleanField(default=False,
74 verbose_name="À afficher sur le site institutionnel",
75 help_text=HELP_TEXT_EN_AFFICHAGE)
76 statut = models.CharField(max_length=4, choices=STATUT_OFFRE_EMPLOI_CHOICES,
77 default='NOUV')
78 nom = models.CharField(max_length=255)
79 resume = models.TextField(verbose_name="Résumé", blank=True)
80 description = models.TextField()
81 poste = models.CharField(max_length=255)
82 poste_nom = models.CharField(max_length=255)
83 date_limite = models.DateField(verbose_name="Date limite",
84 help_text=HELP_TEXT_FORMAT_DATE,)
85 region = models.ForeignKey(ref.Region, db_column='region',
86 verbose_name="Région")
87 bureau = models.ForeignKey(ref.Bureau, db_column='bureau', )
88 duree_affectation = models.CharField(max_length=255,
89 verbose_name="Durée de l'affectation")
90 renumeration = models.CharField(max_length=255,
91 verbose_name='Rénumération')
92 debut_affectation = models.DateField(verbose_name="Début de l'affectation",
93 help_text=HELP_TEXT_FORMAT_DATE,)
94 lieu_affectation = models.ForeignKey(ref.Implantation,
95 db_column='implantation',
96 verbose_name="Lieu d'affectation")
97
98 class Meta:
99 db_table = 'emploi_offreemploi'
100 verbose_name_plural = "offres d'emploi"
101
102 def __unicode__(self):
103 return '%s [%s]' % (self.nom, self.id)
104
105 class Candidat(Metadata):
106 statut = models.CharField(max_length=4, choices=STATUT_CHOICES,
107 default='NOUV')
108 offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi',
109 related_name='+')
110 prenom = models.CharField(max_length=255, verbose_name='Prénom', )
111 nom = models.CharField(max_length=255)
112 genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
113 nationalite = models.ForeignKey(ref.Pays,
114 db_column='nationalite', related_name='+',
115 verbose_name='Nationalité')
116 situation_famille = models.CharField(max_length=1,
117 choices=SITUATION_CHOICES,
118 verbose_name='Situation familiale', )
119 nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant',
120 help_text=HELP_TEXT_NB_DEPENDANT, )
121 niveau_diplome = models.CharField(max_length=255,
122 verbose_name='Niveau du diplôme')
123 employeur_actuel = models.CharField(max_length=255, )
124 poste_actuel = models.CharField(max_length=255, )
125 domaine_professionnel = models.CharField(max_length=255, )
126 telephone = models.CharField(max_length=255, verbose_name='Téléphone', )
127 email = models.EmailField(max_length=255, verbose_name = 'Courriel', )
128
129 # Adresse
130 adresse = models.CharField(max_length=255)
131 ville = models.CharField(max_length=255)
132 etat_province = models.CharField(max_length=255,
133 verbose_name="État/Province", blank=True)
134 code_postal = models.CharField(max_length=255, blank=True)
135 pays = models.ForeignKey(ref.Pays, db_column='pays',
136 related_name='+')
137
138 class Meta:
139 db_table = 'emploi_candidat'
140
141 def pieces_jointes(self):
142 return CandidatPiece.objects.filter(candidat=self)
143 pieces_jointes.allow_tags = True
144
145 def __unicode__(self):
146 return '%s %s [%s]' % (self.nom, self.prenom, self.id)
147
148
149 # Upload de fichiers
150 storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
151 base_url=settings.PRIVE_MEDIA_URL)
152
153 def candidat_piece_dispatch(instance, filename):
154 path = u'%s/%s/%s_%s_%s/%s/%s' % ('emplois', instance.candidat.offre_emploi.id,
155 instance.candidat.nom, instance.candidat.prenom, instance.candidat.id,
156 instance.nom, filename)
157 return path
158
159 class CandidatPiece(models.Model):
160 candidat = models.ForeignKey(Candidat, db_column='candidat',
161 related_name='candidat_piece')
162 nom = models.CharField(max_length=3, choices=TYPE_PIECE_CHOICES)
163 path = models.FileField(verbose_name="Fichier",
164 upload_to=candidat_piece_dispatch, storage=storage_prive)
165
166 class Meta:
167 db_table = 'emploi_pieces'
168 verbose_name = "pièce jointe"
169 verbose_name_plural = "pièces jointes"
170
171 def __unicode__(self):
172 return '%s' % (self.nom)