Commit | Line | Data |
---|---|---|
8acb3cd3 | 1 | # -*- encoding: utf-8 -* |
184b84de NBV |
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 | |
184b84de | 7 | import datamaster_modeles.models as ref |
c3add7d3 | 8 | import settings |
184b84de NBV |
9 | |
10 | ### CONSTANTES ### | |
11 | # HELP_TEXT | |
12 | HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge" | |
184b84de NBV |
13 | HELP_TEXT_TAGS_ACCEPTES = "Pour le texte, les variables disponibles sont : \ |
14 | {{ nom_candidat }} {{ prenom_candidat }} \ | |
15 | {{ offre_emploi }}. Ces champs seront \ | |
16 | automatiquement remplacés par les informations de \ | |
17 | chaque candidat." | |
85049cc1 NBV |
18 | HELP_TEXT_EN_AFFICHAGE = "En cochant cette case, l'offre d'emploi sera affichée\ |
19 | sur le site institutionnel dès qu'elle aura le statut \ | |
20 | 'En diffusion' et ce, jusqu'à la date limite." | |
184b84de NBV |
21 | |
22 | STATUT_OFFRE_EMPLOI_CHOICES = ( | |
23 | ('NOUV', 'Nouveau'), | |
85049cc1 | 24 | ('AFFI', 'En diffusion'), |
184b84de NBV |
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 | ) | |
626a0f3a | 35 | |
184b84de NBV |
36 | SITUATION_CHOICES = ( |
37 | ('C', 'Célibataire'), | |
184b84de | 38 | ('M', 'Marié'), |
626a0f3a OL |
39 | ('F', 'Conjoint de fait'), |
40 | ('P', 'Pacsé'), | |
184b84de | 41 | ) |
626a0f3a | 42 | |
184b84de NBV |
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) | |
700671c2 | 66 | date_creation = models.DateField(auto_now_add=True, ) |
184b84de NBV |
67 | |
68 | class Meta: | |
69 | abstract = True | |
70 | ||
184b84de NBV |
71 | class OffreEmploi(Metadata): |
72 | est_affiche = models.BooleanField(default=False, | |
700671c2 | 73 | verbose_name="À afficher sur le site institutionnel", |
85049cc1 | 74 | help_text=HELP_TEXT_EN_AFFICHAGE) |
184b84de NBV |
75 | statut = models.CharField(max_length=4, choices=STATUT_OFFRE_EMPLOI_CHOICES, |
76 | default='NOUV') | |
700671c2 | 77 | date_limite = models.DateField(verbose_name="Date limite",) |
184b84de | 78 | nom = models.CharField(max_length=255) |
700671c2 | 79 | resume = models.TextField(verbose_name="Résumé", blank=True) |
10020264 | 80 | description = models.TextField() |
44accb6d NBV |
81 | poste = models.CharField(max_length=255) |
82 | poste_nom = models.CharField(max_length=255) | |
184b84de | 83 | region = models.ForeignKey(ref.Region, db_column='region', |
700671c2 | 84 | verbose_name="Région") |
184b84de NBV |
85 | bureau = models.ForeignKey(ref.Bureau, db_column='bureau', ) |
86 | duree_affectation = models.CharField(max_length=255, | |
700671c2 | 87 | verbose_name="Durée de l'affectation") |
184b84de | 88 | renumeration = models.CharField(max_length=255, |
700671c2 OL |
89 | verbose_name='Rénumération') |
90 | debut_affectation = models.DateField(verbose_name="Début de l'affectation",) | |
184b84de NBV |
91 | lieu_affectation = models.ForeignKey(ref.Implantation, |
92 | db_column='implantation', | |
700671c2 | 93 | verbose_name="Lieu d'affectation") |
184b84de NBV |
94 | |
95 | class Meta: | |
96 | db_table = 'emploi_offreemploi' | |
97 | verbose_name_plural = "offres d'emploi" | |
98 | ||
99 | def __unicode__(self): | |
100 | return '%s [%s]' % (self.nom, self.id) | |
101 | ||
102 | class Candidat(Metadata): | |
103 | statut = models.CharField(max_length=4, choices=STATUT_CHOICES, | |
104 | default='NOUV') | |
105 | offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi', | |
106 | related_name='+') | |
700671c2 | 107 | prenom = models.CharField(max_length=255, verbose_name='Prénom', ) |
184b84de NBV |
108 | nom = models.CharField(max_length=255) |
109 | genre = models.CharField(max_length=1, choices=GENRE_CHOICES) | |
110 | nationalite = models.ForeignKey(ref.Pays, | |
111 | db_column='nationalite', related_name='+', | |
700671c2 | 112 | verbose_name='Nationalité') |
184b84de NBV |
113 | situation_famille = models.CharField(max_length=1, |
114 | choices=SITUATION_CHOICES, | |
700671c2 OL |
115 | verbose_name='Situation familiale', ) |
116 | nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant', | |
184b84de NBV |
117 | help_text=HELP_TEXT_NB_DEPENDANT, ) |
118 | niveau_diplome = models.CharField(max_length=255, | |
700671c2 | 119 | verbose_name='Niveau du diplôme') |
184b84de NBV |
120 | employeur_actuel = models.CharField(max_length=255, ) |
121 | poste_actuel = models.CharField(max_length=255, ) | |
122 | domaine_professionnel = models.CharField(max_length=255, ) | |
700671c2 OL |
123 | telephone = models.CharField(max_length=255, verbose_name='Téléphone', ) |
124 | email = models.EmailField(max_length=255, verbose_name = 'Courriel', ) | |
184b84de NBV |
125 | |
126 | # Adresse | |
127 | adresse = models.CharField(max_length=255) | |
128 | ville = models.CharField(max_length=255) | |
129 | etat_province = models.CharField(max_length=255, | |
700671c2 | 130 | verbose_name="État/Province", blank=True) |
184b84de NBV |
131 | code_postal = models.CharField(max_length=255, blank=True) |
132 | pays = models.ForeignKey(ref.Pays, db_column='pays', | |
133 | related_name='+') | |
134 | ||
65ed0bde NBV |
135 | class Meta: |
136 | db_table = 'emploi_candidat' | |
137 | ||
8acb3cd3 NBV |
138 | def pieces_jointes(self): |
139 | return CandidatPiece.objects.filter(candidat=self) | |
140 | pieces_jointes.allow_tags = True | |
141 | ||
65ed0bde NBV |
142 | def __unicode__(self): |
143 | return '%s %s [%s]' % (self.nom, self.prenom, self.id) | |
144 | ||
184b84de NBV |
145 | |
146 | # Upload de fichiers | |
c3add7d3 OL |
147 | storage_prive = FileSystemStorage(settings.OE_PRIVE_MEDIA_ROOT, |
148 | base_url=settings.OE_PRIVE_MEDIA_URL) | |
184b84de NBV |
149 | |
150 | def candidat_piece_dispatch(instance, filename): | |
c3add7d3 | 151 | path = u'%s/%s/%s' % ('emplois', instance.candidat.id, filename) |
184b84de NBV |
152 | return path |
153 | ||
154 | class CandidatPiece(models.Model): | |
155 | candidat = models.ForeignKey(Candidat, db_column='candidat', | |
156 | related_name='candidat_piece') | |
157 | nom = models.CharField(max_length=3, choices=TYPE_PIECE_CHOICES) | |
700671c2 | 158 | path = models.FileField(verbose_name="Fichier", |
8acb3cd3 | 159 | upload_to=candidat_piece_dispatch, storage=storage_prive) |
184b84de NBV |
160 | |
161 | class Meta: | |
8acb3cd3 | 162 | db_table = 'emploi_pieces' |
700671c2 | 163 | verbose_name = "pièce jointe" |
184b84de NBV |
164 | verbose_name_plural = "pièces jointes" |
165 | ||
166 | def __unicode__(self): | |
167 | return '%s' % (self.nom) |