| 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 datamaster_modeles.models as ref |
| 8 | import settings |
| 9 | |
| 10 | ### CONSTANTES ### |
| 11 | # HELP_TEXT |
| 12 | HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge" |
| 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." |
| 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." |
| 21 | |
| 22 | STATUT_OFFRE_EMPLOI_CHOICES = ( |
| 23 | ('NOUV', 'Nouveau'), |
| 24 | ('AFFI', 'En diffusion'), |
| 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 | ) |
| 35 | |
| 36 | SITUATION_CHOICES = ( |
| 37 | ('C', 'Célibataire'), |
| 38 | ('M', 'Marié'), |
| 39 | ('F', 'Conjoint de fait'), |
| 40 | ('P', 'Pacsé'), |
| 41 | ) |
| 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 | |
| 68 | class Meta: |
| 69 | abstract = True |
| 70 | |
| 71 | class OffreEmploi(Metadata): |
| 72 | est_affiche = models.BooleanField(default=False, |
| 73 | verbose_name="À afficher sur le site institutionnel", |
| 74 | help_text=HELP_TEXT_EN_AFFICHAGE) |
| 75 | statut = models.CharField(max_length=4, choices=STATUT_OFFRE_EMPLOI_CHOICES, |
| 76 | default='NOUV') |
| 77 | date_limite = models.DateField(verbose_name="Date limite",) |
| 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 | region = models.ForeignKey(ref.Region, db_column='region', |
| 84 | verbose_name="Région") |
| 85 | bureau = models.ForeignKey(ref.Bureau, db_column='bureau', ) |
| 86 | duree_affectation = models.CharField(max_length=255, |
| 87 | verbose_name="Durée de l'affectation") |
| 88 | renumeration = models.CharField(max_length=255, |
| 89 | verbose_name='Rénumération') |
| 90 | debut_affectation = models.DateField(verbose_name="Début de l'affectation",) |
| 91 | lieu_affectation = models.ForeignKey(ref.Implantation, |
| 92 | db_column='implantation', |
| 93 | verbose_name="Lieu d'affectation") |
| 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='+') |
| 107 | prenom = models.CharField(max_length=255, verbose_name='Prénom', ) |
| 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='+', |
| 112 | verbose_name='Nationalité') |
| 113 | situation_famille = models.CharField(max_length=1, |
| 114 | choices=SITUATION_CHOICES, |
| 115 | verbose_name='Situation familiale', ) |
| 116 | nombre_dependant = models.IntegerField(verbose_name='Nombre de dépendant', |
| 117 | help_text=HELP_TEXT_NB_DEPENDANT, ) |
| 118 | niveau_diplome = models.CharField(max_length=255, |
| 119 | verbose_name='Niveau du diplôme') |
| 120 | employeur_actuel = models.CharField(max_length=255, ) |
| 121 | poste_actuel = models.CharField(max_length=255, ) |
| 122 | domaine_professionnel = models.CharField(max_length=255, ) |
| 123 | telephone = models.CharField(max_length=255, verbose_name='Téléphone', ) |
| 124 | email = models.EmailField(max_length=255, verbose_name = 'Courriel', ) |
| 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, |
| 130 | verbose_name="État/Province", blank=True) |
| 131 | code_postal = models.CharField(max_length=255, blank=True) |
| 132 | pays = models.ForeignKey(ref.Pays, db_column='pays', |
| 133 | related_name='+') |
| 134 | |
| 135 | class Meta: |
| 136 | db_table = 'emploi_candidat' |
| 137 | |
| 138 | def pieces_jointes(self): |
| 139 | return CandidatPiece.objects.filter(candidat=self) |
| 140 | pieces_jointes.allow_tags = True |
| 141 | |
| 142 | def __unicode__(self): |
| 143 | return '%s %s [%s]' % (self.nom, self.prenom, self.id) |
| 144 | |
| 145 | |
| 146 | # Upload de fichiers |
| 147 | storage_prive = FileSystemStorage(settings.OE_PRIVE_MEDIA_ROOT, |
| 148 | base_url=settings.OE_PRIVE_MEDIA_URL) |
| 149 | |
| 150 | def candidat_piece_dispatch(instance, filename): |
| 151 | path = u'%s/%s/%s' % ('emplois', instance.candidat.id, filename) |
| 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) |
| 158 | path = models.FileField(verbose_name="Fichier", |
| 159 | upload_to=candidat_piece_dispatch, storage=storage_prive) |
| 160 | |
| 161 | class Meta: |
| 162 | db_table = 'emploi_pieces' |
| 163 | verbose_name = "pièce jointe" |
| 164 | verbose_name_plural = "pièces jointes" |
| 165 | |
| 166 | def __unicode__(self): |
| 167 | return '%s' % (self.nom) |