Commit | Line | Data |
---|---|---|
0d9e7dce NBV |
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 | from project.rh.models import Poste | |
12 | ||
13 | ### CONSTANTES ### | |
14 | # HELP_TEXT | |
15 | HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge" | |
16 | HELP_TEXT_FORMAT_DATE = "Le format de la date est AAAA-MM-JJ" | |
17 | HELP_TEXT_TAGS_ACCEPTES = "Pour le texte, les variables disponibles sont : \ | |
18 | {{ nom_candidat }} {{ prenom_candidat }} \ | |
19 | {{ offre_emploi }}. Ces champs seront \ | |
20 | automatiquement remplacés par les informations de \ | |
21 | chaque candidat." | |
22 | ||
23 | ||
24 | STATUT_OFFRE_EMPLOI_CHOICES = ( | |
25 | ('NOUV', 'Nouveau'), | |
26 | ('AFFI', 'Offre d\'emploi en affichage'), | |
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 ProxyPoste(Poste): | |
73 | class Meta: | |
74 | proxy = True | |
75 | ||
76 | def __unicode__(self): | |
77 | return '%s [%s]' % (self.nom, self.id) | |
78 | ||
79 | class OffreEmploi(Metadata): | |
80 | est_affiche = models.BooleanField(default=False, | |
81 | verbose_name="En affichage sur le site") | |
82 | statut = models.CharField(max_length=4, choices=STATUT_OFFRE_EMPLOI_CHOICES, | |
83 | default='NOUV') | |
84 | nom = models.CharField(max_length=255) | |
85 | resume = models.TextField(verbose_name="Résumé") | |
86 | description = tinymce_models.HTMLField() | |
87 | poste = models.ForeignKey(ProxyPoste, db_column='poste') | |
88 | date_limite = models.DateField(verbose_name="Date limite", | |
89 | help_text=HELP_TEXT_FORMAT_DATE,) | |
90 | region = models.ForeignKey(ref.Region, db_column='region', | |
91 | verbose_name="Région") | |
92 | bureau = models.ForeignKey(ref.Bureau, db_column='bureau', ) | |
93 | duree_affectation = models.CharField(max_length=255, | |
94 | verbose_name="Durée de l'affectation") | |
95 | renumeration = models.CharField(max_length=255, | |
96 | verbose_name='Rénumération') | |
97 | debut_affectation = models.DateField(verbose_name="Début de l'affectation", | |
98 | help_text=HELP_TEXT_FORMAT_DATE,) | |
99 | lieu_affectation = models.ForeignKey(ref.Implantation, | |
100 | db_column='implantation', | |
101 | verbose_name="Lieu d'affectation") | |
102 | ||
103 | class Meta: | |
104 | db_table = 'emploi_offreemploi' | |
105 | verbose_name_plural = "offres d'emploi" | |
106 | ||
107 | def __unicode__(self): | |
108 | return '%s [%s]' % (self.nom, self.id) | |
109 | ||
110 | class Candidat(Metadata): | |
111 | statut = models.CharField(max_length=4, choices=STATUT_CHOICES, | |
112 | default='NOUV') | |
113 | offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi', | |
114 | related_name='+') | |
115 | prenom = models.CharField(max_length=255, verbose_name='Prénom', ) | |
116 | nom = models.CharField(max_length=255) | |
117 | genre = models.CharField(max_length=1, choices=GENRE_CHOICES) | |
118 | nationalite = models.ForeignKey(ref.Pays, | |
119 | db_column='nationalite', related_name='+', | |
120 | verbose_name='Nationalité') | |
121 | situation_famille = models.CharField(max_length=1, | |
122 | choices=SITUATION_CHOICES, | |
123 | verbose_name='Situation familiale', ) | |
124 | nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant', | |
125 | help_text=HELP_TEXT_NB_DEPENDANT, ) | |
126 | niveau_diplome = models.CharField(max_length=255, | |
127 | verbose_name='Niveau du diplôme') | |
128 | employeur_actuel = models.CharField(max_length=255, ) | |
129 | poste_actuel = models.CharField(max_length=255, ) | |
130 | domaine_professionnel = models.CharField(max_length=255, ) | |
131 | telephone = models.CharField(max_length=255, verbose_name='Téléphone', ) | |
132 | email = models.EmailField(max_length=255, verbose_name = 'Courriel', ) | |
133 | ||
134 | # Adresse | |
135 | adresse = models.CharField(max_length=255) | |
136 | ville = models.CharField(max_length=255) | |
137 | etat_province = models.CharField(max_length=255, | |
138 | verbose_name="État/Province") | |
139 | code_postal = models.CharField(max_length=255, blank=True) | |
140 | pays = models.ForeignKey(ref.Pays, db_column='pays', | |
141 | related_name='+') | |
142 | ||
143 | def __unicode__(self): | |
144 | return '%s %s [%s]' % (self.prenom, self.nom, self.id) | |
145 | ||
146 | class Meta: | |
147 | db_table = 'emploi_candidat' | |
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 = "offre_emploi/%s_%s/%s/%s_%s" % (instance.candidat.nom, | |
155 | instance.candidat.prenom, instance.nom, instance.candidat.id, | |
156 | 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 = PrivateFileField("file", upload_to=candidat_piece_dispatch) | |
164 | path = models.FileField(verbose_name="Fichier", | |
165 | upload_to=candidat_piece_dispatch, | |
166 | storage=storage_prive, ) | |
167 | ||
168 | class Meta: | |
169 | db_table = 'emploi_evaluateur' | |
170 | verbose_name = "pièce jointe" | |
171 | verbose_name_plural = "pièces jointes" | |
172 | ||
173 | def __unicode__(self): | |
174 | return '%s' % (self.nom) |