| 1 | # -=- encoding: utf-8 -=- |
| 2 | |
| 3 | import datetime |
| 4 | |
| 5 | from django.core.files.storage import FileSystemStorage |
| 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 import models as rh |
| 12 | |
| 13 | ### CONSTANTES |
| 14 | #NOTES |
| 15 | NOTE_MIN = 1 |
| 16 | NOTE_RANGE = 1 |
| 17 | NOTE_MAX = 10 |
| 18 | NOTES = [(i, i) for i in range(NOTE_MIN, NOTE_MAX, NOTE_RANGE)] |
| 19 | |
| 20 | # Abstracts |
| 21 | class Metadata(models.Model): |
| 22 | """Méta-données AUF. |
| 23 | Metadata.actif = flag remplaçant la suppression. |
| 24 | actif == False : objet réputé supprimé. |
| 25 | """ |
| 26 | actif = models.BooleanField(default=True) |
| 27 | date_creation = models.DateField(auto_now_add=True) |
| 28 | |
| 29 | class Meta: |
| 30 | abstract = True |
| 31 | |
| 32 | |
| 33 | class OffreEmploi(Metadata): |
| 34 | nom = models.CharField(max_length=255) |
| 35 | resume = models.TextField() |
| 36 | description = models.TextField() |
| 37 | poste = models.ForeignKey(rh.Poste, db_column='poste') |
| 38 | date_limite = models.DateField(verbose_name="Date limite") |
| 39 | region = models.ForeignKey(ref.Region, db_column='region') |
| 40 | bureau = models.ForeignKey(ref.Bureau, db_column='bureau') |
| 41 | |
| 42 | def __unicode__(self): |
| 43 | return '%s [%s]' % (self.nom, self.id) |
| 44 | |
| 45 | |
| 46 | ### CANDIDAT |
| 47 | |
| 48 | GENRE_CHOICES = ( |
| 49 | ('M', 'Homme'), |
| 50 | ('F', 'Femme'), |
| 51 | ) |
| 52 | SITUATION_CHOICES = ( |
| 53 | ('C', 'Célibataire'), |
| 54 | ('F', 'Fiancé'), |
| 55 | ('M', 'Marié'), |
| 56 | ('D', 'Divorcé'), |
| 57 | ) |
| 58 | STATUT_CHOICES = ( |
| 59 | ('NOUV', 'Nouveau'), |
| 60 | ('REF', 'Refusé'), |
| 61 | ('SEL', 'Sélectionné'), |
| 62 | ('ACC', 'Accepté'), |
| 63 | ('REC', 'Recevable'), # Trouver une lettre plus appropriée? |
| 64 | ) |
| 65 | |
| 66 | class Candidat(Metadata): |
| 67 | # TODO : Automatiser le statut à la création à Nouveau |
| 68 | statut = models.CharField(max_length=4, choices=STATUT_CHOICES, |
| 69 | default='NOUV') |
| 70 | offre_emploi = models.ForeignKey('OffreEmploi', db_column='offre_emploi', |
| 71 | related_name='+') |
| 72 | prenom = models.CharField(max_length=255) |
| 73 | nom = models.CharField(max_length=255) |
| 74 | genre = models.CharField(max_length=1, choices=GENRE_CHOICES) |
| 75 | nationalite = models.ForeignKey(ref.Pays, |
| 76 | db_column='nationalite', |
| 77 | related_name='+') |
| 78 | date_naissance = models.DateField(verbose_name="Date de naissance") |
| 79 | situation_famille = models.CharField(max_length=1, |
| 80 | choices=SITUATION_CHOICES) |
| 81 | nombre_dependant = models.IntegerField(verbose_name="Nombre de dépendant") |
| 82 | niveau_diplome = models.CharField(max_length=255, |
| 83 | verbose_name="Niveau du diplôme") |
| 84 | employeur_actuel = models.CharField(max_length=255) |
| 85 | poste_actuel = models.CharField(max_length=255) |
| 86 | domaine_professionnel = models.CharField(max_length=255) |
| 87 | |
| 88 | # Adresse |
| 89 | adresse = models.CharField(max_length=255) |
| 90 | ville = models.CharField(max_length=255) |
| 91 | etat_province = models.CharField(max_length=255, |
| 92 | verbose_name="État/Province") |
| 93 | pays = models.ForeignKey(ref.Pays, db_column='pays', |
| 94 | related_name='+') |
| 95 | |
| 96 | def __unicode__(self): |
| 97 | return '%s %s [%s]' % (self.prenom, self.nom, self.id) |
| 98 | |
| 99 | ### PIECE CANDIDAT |
| 100 | # Upload de fichiers |
| 101 | storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT, |
| 102 | base_url=settings.PRIVE_MEDIA_URL) |
| 103 | |
| 104 | def candidat_piece_dispatch(instance, filename): |
| 105 | path = "offre_emploi/%s_%s/%s/%s_%s" % (instance.candidat.nom, |
| 106 | instance.candidat.prenom, instance.nom, instance.candidat.id, |
| 107 | filename) |
| 108 | return path |
| 109 | |
| 110 | class CandidatPiece(models.Model): |
| 111 | candidat = models.ForeignKey(Candidat, db_column='candidat', |
| 112 | related_name='candidat_piece') |
| 113 | nom = models.CharField(max_length=255) |
| 114 | #path = PrivateFileField("file", upload_to=candidat_piece_dispatch) |
| 115 | path = models.FileField(verbose_name="Fichier", |
| 116 | upload_to=candidat_piece_dispatch, |
| 117 | storage=storage_prive, ) |
| 118 | |
| 119 | def __unicode__(self): |
| 120 | return '%s' % (self.nom) |
| 121 | |
| 122 | class UserProfile(models.Model): |
| 123 | user = models.ForeignKey("auth.User", unique=True) |
| 124 | candidats = models.ManyToManyField(Candidat, verbose_name='Candidats', |
| 125 | blank=True, null=True,related_name="evaluateurs") |
| 126 | regions = models.ManyToManyField(ref.Region, |
| 127 | verbose_name="Régions", ) |
| 128 | |
| 129 | def __unicode__(self): |
| 130 | return '%s %s' % (self.user.first_name, self.user.last_name) |
| 131 | |
| 132 | UserProfile.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) |
| 133 | |
| 134 | class CandidatEvaluation(models.Model): |
| 135 | candidat = models.ForeignKey(Candidat, db_column='candidat', |
| 136 | related_name='+') |
| 137 | evaluateur = models.ForeignKey(UserProfile, db_column='evaluateur', |
| 138 | related_name='+') |
| 139 | note = models.IntegerField(choices=NOTES, blank=True, null=True) |
| 140 | commentaire = models.TextField(null=True, blank=True) |
| 141 | date = models.DateField(auto_now_add=True) |