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