df59fcab |
1 | # -=- encoding: utf-8 -=- |
2 | |
3 | import datetime |
b235ec9d |
4 | from django.contrib.auth.models import User |
4418c732 |
5 | from django.core.files.storage import FileSystemStorage |
ec517164 |
6 | from tinymce import models as tinymce_models |
6f2d5d58 |
7 | from django.db import models |
4418c732 |
8 | import settings |
362a3534 |
9 | #from private_files import PrivateFileField |
6f2d5d58 |
10 | |
df59fcab |
11 | import datamaster_modeles.models as ref |
12 | from project.rh import models as rh |
13 | |
596fe324 |
14 | ### CONSTANTES |
15 | #NOTES |
16 | NOTE_MIN = 1 |
17 | NOTE_RANGE = 1 |
e34a2ae0 |
18 | NOTE_MAX = 11 |
596fe324 |
19 | NOTES = [(i, i) for i in range(NOTE_MIN, NOTE_MAX, NOTE_RANGE)] |
20 | |
df59fcab |
21 | # Abstracts |
22 | class Metadata(models.Model): |
23 | """Méta-données AUF. |
24 | Metadata.actif = flag remplaçant la suppression. |
25 | actif == False : objet réputé supprimé. |
26 | """ |
27 | actif = models.BooleanField(default=True) |
28 | date_creation = models.DateField(auto_now_add=True) |
29 | |
30 | class Meta: |
31 | abstract = True |
32 | |
4e8e178f |
33 | class OffreEmploiManager(models.Manager): |
34 | def get_query_set(self): |
61a4b478 |
35 | fkeys = ('region',) |
4e8e178f |
36 | return super(OffreEmploiManager, self).get_query_set().select_related(*fkeys).all() |
37 | |
38 | class ProxyPoste(rh.Poste): |
39 | class Meta: |
40 | proxy = True |
41 | |
42 | def __unicode__(self): |
43 | return '%s [%s]' % (self.nom, self.id) |
df59fcab |
44 | |
45 | class OffreEmploi(Metadata): |
4e8e178f |
46 | objects = OffreEmploiManager() |
df59fcab |
47 | nom = models.CharField(max_length=255) |
b235ec9d |
48 | resume = models.TextField(verbose_name="Résumé") |
ec517164 |
49 | description = tinymce_models.HTMLField() |
50 | poste = models.ForeignKey(ProxyPoste, db_column='poste') |
df59fcab |
51 | date_limite = models.DateField(verbose_name="Date limite") |
b235ec9d |
52 | region = models.ForeignKey(ref.Region, db_column='region', |
53 | verbose_name="Région") |
54 | bureau = models.ForeignKey(ref.Bureau, db_column='bureau', ) |
ec517164 |
55 | duree_affectation = models.CharField(max_length=255, |
56 | verbose_name="Durée de l'affectation") |
57 | renumeration = models.CharField(max_length=255, |
58 | verbose_name='Rénumération') |
59 | debut_affectation = models.DateField(verbose_name="Début de l'affectation") |
60 | lieu_affectation = models.ForeignKey(ref.Implantation, |
61 | db_column='implantation', |
62 | verbose_name="Lieu d'affectation") |
b235ec9d |
63 | |
64 | class Meta: |
65 | verbose_name_plural = "offres d'emploi" |
4418c732 |
66 | |
67 | def __unicode__(self): |
68 | return '%s [%s]' % (self.nom, self.id) |
df59fcab |
69 | |
70 | |
71 | ### CANDIDAT |
72 | |
73 | GENRE_CHOICES = ( |
74 | ('M', 'Homme'), |
75 | ('F', 'Femme'), |
76 | ) |
77 | SITUATION_CHOICES = ( |
78 | ('C', 'Célibataire'), |
79 | ('F', 'Fiancé'), |
80 | ('M', 'Marié'), |
81 | ('D', 'Divorcé'), |
82 | ) |
83 | STATUT_CHOICES = ( |
84 | ('NOUV', 'Nouveau'), |
85 | ('REF', 'Refusé'), |
86 | ('SEL', 'Sélectionné'), |
87 | ('ACC', 'Accepté'), |
88 | ('REC', 'Recevable'), # Trouver une lettre plus appropriée? |
89 | ) |
90 | |
b235ec9d |
91 | class Candidat(Metadata): |
8ea41642 |
92 | statut = models.CharField(max_length=4, choices=STATUT_CHOICES, |
93 | default='NOUV') |
df59fcab |
94 | offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi', |
7f9e891e |
95 | related_name='+') |
3b4b948e |
96 | prenom = models.CharField(max_length=255, verbose_name='Prénom', ) |
df59fcab |
97 | nom = models.CharField(max_length=255) |
98 | genre = models.CharField(max_length=1, choices=GENRE_CHOICES) |
99 | nationalite = models.ForeignKey(ref.Pays, |
3b4b948e |
100 | db_column='nationalite', related_name='+', |
101 | verbose_name='Nationalité') |
102 | date_naissance = models.DateField(verbose_name='Date de naissance') |
df59fcab |
103 | situation_famille = models.CharField(max_length=1, |
ec517164 |
104 | choices=SITUATION_CHOICES, |
105 | verbose_name='Situation familiale') |
3b4b948e |
106 | nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant') |
df59fcab |
107 | niveau_diplome = models.CharField(max_length=255, |
3b4b948e |
108 | verbose_name='Niveau du diplôme') |
df59fcab |
109 | employeur_actuel = models.CharField(max_length=255) |
110 | poste_actuel = models.CharField(max_length=255) |
111 | domaine_professionnel = models.CharField(max_length=255) |
ec517164 |
112 | telephone = models.CharField(max_length=255, verbose_name='Téléphone', ) |
113 | email = models.EmailField(max_length=255, verbose_name = 'Courriel', ) |
df59fcab |
114 | |
115 | # Adresse |
116 | adresse = models.CharField(max_length=255) |
117 | ville = models.CharField(max_length=255) |
118 | etat_province = models.CharField(max_length=255, |
4418c732 |
119 | verbose_name="État/Province") |
ec517164 |
120 | code_postal = models.CharField(max_length=255, blank=True) |
df59fcab |
121 | pays = models.ForeignKey(ref.Pays, db_column='pays', |
7f9e891e |
122 | related_name='+') |
4418c732 |
123 | |
124 | def __unicode__(self): |
125 | return '%s %s [%s]' % (self.prenom, self.nom, self.id) |
126 | |
127 | ### PIECE CANDIDAT |
128 | # Upload de fichiers |
129 | storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT, |
130 | base_url=settings.PRIVE_MEDIA_URL) |
131 | |
132 | def candidat_piece_dispatch(instance, filename): |
133 | path = "offre_emploi/%s_%s/%s/%s_%s" % (instance.candidat.nom, |
134 | instance.candidat.prenom, instance.nom, instance.candidat.id, |
135 | filename) |
136 | return path |
137 | |
138 | class CandidatPiece(models.Model): |
139 | candidat = models.ForeignKey(Candidat, db_column='candidat', |
2b3edf33 |
140 | related_name='candidat_piece') |
4418c732 |
141 | nom = models.CharField(max_length=255) |
362a3534 |
142 | #path = PrivateFileField("file", upload_to=candidat_piece_dispatch) |
f6749f29 |
143 | path = models.FileField(verbose_name="Fichier", |
144 | upload_to=candidat_piece_dispatch, |
2b3edf33 |
145 | storage=storage_prive, ) |
4418c732 |
146 | |
b235ec9d |
147 | class Meta: |
12767731 |
148 | verbose_name = "pièce jointe" |
149 | verbose_name_plural = "pièces jointes" |
b235ec9d |
150 | |
4418c732 |
151 | def __unicode__(self): |
152 | return '%s' % (self.nom) |
153 | |
f6749f29 |
154 | class UserProfile(models.Model): |
b235ec9d |
155 | user = models.ForeignKey("auth.User", unique=True, |
d835c9f3 |
156 | verbose_name="permission") |
cced6a23 |
157 | candidats = models.ManyToManyField(Candidat, verbose_name='candidats', |
2adf9e0c |
158 | blank=True, null=True,related_name="evaluateurs") |
3b4bfad3 |
159 | regions = models.ManyToManyField(ref.Region, |
160 | verbose_name="Régions", ) |
eb579d40 |
161 | |
b235ec9d |
162 | class Meta: |
cced6a23 |
163 | verbose_name = "évaluateur" |
b235ec9d |
164 | |
2adf9e0c |
165 | def __unicode__(self): |
166 | return '%s %s' % (self.user.first_name, self.user.last_name) |
167 | |
f6749f29 |
168 | UserProfile.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) |
4418c732 |
169 | |
170 | class CandidatEvaluation(models.Model): |
171 | candidat = models.ForeignKey(Candidat, db_column='candidat', |
3b4b948e |
172 | related_name='+',) |
f6749f29 |
173 | evaluateur = models.ForeignKey(UserProfile, db_column='evaluateur', |
cced6a23 |
174 | related_name='+', verbose_name='Évaluateur') |
596fe324 |
175 | note = models.IntegerField(choices=NOTES, blank=True, null=True) |
362a3534 |
176 | commentaire = models.TextField(null=True, blank=True) |
4418c732 |
177 | date = models.DateField(auto_now_add=True) |
b235ec9d |
178 | |
179 | class Meta: |
cced6a23 |
180 | verbose_name = 'évaluation du candidat' |
181 | verbose_name_plural = 'évaluations des candidats' |
ec517164 |
182 | |
183 | '''class CandidatLettre(models.Model): |
184 | candidat = models.ForeignKey(Candidat, db_column='candidat', |
185 | related_name='+',) |
186 | titre = models.CharField(max_length=255, ) |
187 | texte = models.TextField(null=True, blank=True) |
188 | |
189 | def __unicode__(self): |
190 | return '%s' % (self.titre) |
191 | ''' |
192 | |