diff --git a/candidats/__init__.py b/candidats/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/candidats/admin.py b/candidats/admin.py new file mode 100644 index 0000000..0485ca0 --- /dev/null +++ b/candidats/admin.py @@ -0,0 +1,55 @@ +from django import forms +from django.contrib import admin + +from .models import Candidate + + +class CandidateAdminForm(forms.ModelForm): + class Meta: + model = Candidate + widgets = { + 'comment': forms.Textarea(attrs={'cols': 100, 'rows': 1}), + 'pcode': forms.TextInput(attrs={'size': 10}), + } + fields = '__all__' + + +class CandidateAdmin(admin.ModelAdmin): + form = CandidateAdminForm + list_display = ('last_name', 'first_name', 'section', 'confirm_email') + list_filter = ('section', 'option') + readonly_fields = ('total_result_points', 'total_result_mark', 'date_confirmation_mail') + fieldsets = ( + (None, { + 'fields': (('first_name', 'last_name', 'gender'), + ('street', 'pcode', 'city', 'district'), + ('mobile', 'email'), + ('birth_date', 'avs', 'handicap'), + ('section', 'option'), + ('corporation', 'instructor'), + ('deposite_date', 'date_confirmation_mail', 'canceled_file'), + 'comment', + ), + }), + ("FE", { + 'classes': ('collapse',), + 'fields': (('exemption_ecg', 'integration_second_year', 'validation_sfpo'),), + }), + ("EDE/EDS", { + 'classes': ('collapse',), + 'fields': (('registration_form', 'certificate_of_payement', 'cv', 'certif_of_cfc', + 'police_record', 'certif_of_800h', 'reflexive_text', 'work_certificate', + 'marks_certificate', 'proc_admin_ext', 'promise', 'contract'), + 'comment', + ('interview_date', 'interview_room'), + ('examination_result', 'interview_result', 'file_result', 'total_result_points', + 'total_result_mark') + ), + }), + ) + + def confirm_email(self, obj): + return obj.date_confirmation_mail is not None + confirm_email.boolean = True + +admin.site.register(Candidate, CandidateAdmin) diff --git a/candidats/migrations/0001_initial.py b/candidats/migrations/0001_initial.py new file mode 100644 index 0000000..e834e2a --- /dev/null +++ b/candidats/migrations/0001_initial.py @@ -0,0 +1,69 @@ +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('stages', '0002_add_student_option_ase'), + ] + + operations = [ + migrations.CreateModel( + name='Candidate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=40, verbose_name='Prénom')), + ('last_name', models.CharField(max_length=40, verbose_name='Nom')), + ('gender', models.CharField(choices=[('M', 'Masculin'), ('F', 'Féminin'), ('I', 'Inconnu')], max_length=1, verbose_name='Genre')), + ('birth_date', models.DateField(blank=True, null=True, verbose_name='Date de naissance')), + ('street', models.CharField(blank=True, max_length=150, verbose_name='Rue')), + ('pcode', models.CharField(max_length=4, verbose_name='Code postal')), + ('city', models.CharField(max_length=40, verbose_name='Localité')), + ('district', models.CharField(blank=True, max_length=2, verbose_name='Canton')), + ('mobile', models.CharField(blank=True, max_length=40, verbose_name='Portable')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='Courriel')), + ('avs', models.CharField(blank=True, max_length=15, verbose_name='No AVS')), + ('handicap', models.BooleanField(default=False)), + ('section', models.CharField(choices=[('ASA', 'Aide en soin et accompagnement AFP'), ('ASE', 'Assist. socio-éducatif-ve CFC'), ('ASSC', 'Assist. en soin et santé communautaire CFC'), ('EDE', "Educ. de l'enfance, dipl. ES"), ('EDS', 'Educ. social-e, dipl. ES')], max_length=10, verbose_name='Filière')), + ('option', models.CharField(blank=True, choices=[('GEN', 'Généraliste'), ('ENF', 'Enfance'), ('PAG', 'Personnes âgées'), ('HAN', 'Handicap'), ('PE-5400h', 'Parcours Emploi 5400h.'), ('PE-3600h', 'Parcours Emploi 3600h.'), ('PS', 'Parcours stage')], max_length=20, verbose_name='Option')), + ('exemption_ecg', models.BooleanField(default=False)), + ('validation_sfpo', models.DateField(blank=True, null=True, verbose_name='Confirmation SFPO')), + ('integration_second_year', models.BooleanField(default=False, verbose_name='Intégration')), + ('date_confirmation_mail', models.DateField(blank=True, null=True, verbose_name='Mail de confirmation')), + ('canceled_file', models.BooleanField(default=False, verbose_name='Dossier retiré')), + ('has_photo', models.BooleanField(default=False)), + ('registration_form', models.BooleanField(default=False, verbose_name="Formulaire d'inscription")), + ('certificate_of_payement', models.BooleanField(default=False, verbose_name='Attest. paiement')), + ('police_record', models.BooleanField(default=False, verbose_name='Casier judic.')), + ('cv', models.BooleanField(default=False, verbose_name='CV')), + ('certif_of_cfc', models.BooleanField(default=False, verbose_name='CFC')), + ('certif_of_800h', models.BooleanField(default=False, verbose_name='Attest. 800h.')), + ('reflexive_text', models.BooleanField(default=False, verbose_name='Texte réflexif')), + ('promise', models.BooleanField(default=False, verbose_name="Promesse d'eng.")), + ('contract', models.BooleanField(default=False, verbose_name='Contrat valide')), + ('comment', models.TextField(blank=True, verbose_name='Remarques')), + ('proc_admin_ext', models.BooleanField(default=False, verbose_name='Insc. autre école')), + ('work_certificate', models.BooleanField(default=False, verbose_name='Certif. de travail')), + ('marks_certificate', models.BooleanField(default=False, verbose_name='Bull. notes')), + ('deposite_date', models.DateField(blank=True, null=True, verbose_name='Date dépôt dossier')), + ('interview_date', models.DateTimeField(blank=True, null=True, verbose_name='Date entretien prof.')), + ('interview_room', models.CharField(blank=True, max_length=50, verbose_name="Salle d'entretien prof.")), + ('examination_result', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Points examen')), + ('interview_result', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Points entretien prof.')), + ('file_result', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Points dossier')), + ('total_result_points', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Total points')), + ('total_result_mark', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Note finale')), + ('accepted', models.BooleanField(default=False, verbose_name='Admis')), + ('corporation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.Corporation', verbose_name='Employeur')), + ('file_resp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='stages.Teacher', verbose_name='Exp. dossier')), + ('instructor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.CorpContact', verbose_name='FEE/FPP')), + ('interview_resp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='stages.Teacher', verbose_name='Exp. entretien')), + ], + options={ + 'verbose_name': 'Candidat', + }, + ), + ] diff --git a/candidats/migrations/__init__.py b/candidats/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/candidats/models.py b/candidats/models.py new file mode 100644 index 0000000..fc3dd96 --- /dev/null +++ b/candidats/models.py @@ -0,0 +1,106 @@ +from django.db import models + + +GENDER_CHOICES = ( + ('M', 'Masculin'), + ('F', 'Féminin'), + ('I', 'Inconnu') +) + +SECTION_CHOICES = ( + ('ASA', 'Aide en soin et accompagnement AFP'), + ('ASE', 'Assist. socio-éducatif-ve CFC'), + ('ASSC', 'Assist. en soin et santé communautaire CFC'), + ('EDE', 'Educ. de l\'enfance, dipl. ES'), + ('EDS', 'Educ. social-e, dipl. ES'), +) + +OPTION_CHOICES = ( + ('GEN', 'Généraliste'), + ('ENF', 'Enfance'), + ('PAG', 'Personnes âgées'), + ('HAN', 'Handicap'), + ('PE-5400h', 'Parcours Emploi 5400h.'), + ('PE-3600h', 'Parcours Emploi 3600h.'), + ('PS', 'Parcours stage'), +) + +class Candidate(models.Model): + """ + Inscriptions for new students + """ + first_name = models.CharField('Prénom', max_length=40) + last_name = models.CharField('Nom', max_length=40) + gender = models.CharField('Genre', max_length=1, choices=GENDER_CHOICES) + birth_date = models.DateField('Date de naissance', blank=True, null=True) + street = models.CharField('Rue', max_length=150, blank=True) + pcode = models.CharField('Code postal', max_length=4) + city = models.CharField('Localité', max_length=40) + district = models.CharField('Canton', max_length=2, blank=True) + mobile = models.CharField('Portable', max_length=40, blank=True) + email = models.EmailField('Courriel', blank=True) + avs = models.CharField('No AVS', max_length=15, blank=True) + handicap = models.BooleanField(default=False) + + section = models.CharField('Filière', max_length=10, choices=SECTION_CHOICES) + option = models.CharField('Option', max_length=20, choices=OPTION_CHOICES, blank=True) + exemption_ecg = models.BooleanField(default=False) + validation_sfpo = models.DateField('Confirmation SFPO', blank=True, null=True) + integration_second_year = models.BooleanField('Intégration', default=False) + date_confirmation_mail = models.DateField('Mail de confirmation', blank=True, null=True) + canceled_file = models.BooleanField('Dossier retiré', default=False) + has_photo = models.BooleanField(default=False) + + corporation = models.ForeignKey( + 'stages.Corporation', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='Employeur' + ) + instructor = models.ForeignKey( + 'stages.CorpContact', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='FEE/FPP' + ) + + # Checking for registration file + registration_form = models.BooleanField("Formulaire d'inscription", default=False) + certificate_of_payement = models.BooleanField("Attest. paiement", default=False) + police_record = models.BooleanField("Casier judic.", default=False) + cv = models.BooleanField("CV", default=False) + certif_of_cfc = models.BooleanField("CFC", default=False) + certif_of_800h = models.BooleanField("Attest. 800h.", default=False) + reflexive_text = models.BooleanField("Texte réflexif", default=False) + promise = models.BooleanField("Promesse d'eng.", default=False) + contract = models.BooleanField("Contrat valide", default=False) + comment = models.TextField('Remarques', blank=True) + + proc_admin_ext = models.BooleanField("Insc. autre école", default=False) + work_certificate = models.BooleanField("Certif. de travail", default=False) + marks_certificate = models.BooleanField("Bull. notes", default=False) + deposite_date = models.DateField('Date dépôt dossier', blank=True, null=True) + interview_date = models.DateTimeField('Date entretien prof.', blank=True, null=True) + interview_room = models.CharField("Salle d'entretien prof.", max_length=50, blank=True) + examination_result = models.PositiveSmallIntegerField('Points examen', blank=True, null=True) + interview_result = models.PositiveSmallIntegerField('Points entretien prof.', blank=True, null=True) + file_result = models.PositiveSmallIntegerField('Points dossier', blank=True, null=True) + total_result_points = models.PositiveSmallIntegerField('Total points', blank=True, null=True) + total_result_mark = models.PositiveSmallIntegerField('Note finale', blank=True, null=True) + + accepted = models.BooleanField('Admis', default=False) + interview_resp = models.ForeignKey( + 'stages.Teacher', null=True, blank=True, related_name='+', verbose_name='Exp. entretien' + ) + file_resp = models.ForeignKey( + 'stages.Teacher', null=True, blank=True, related_name='+', verbose_name='Exp. dossier' + ) + + class Meta: + verbose_name = 'Candidat' + + def __str__(self): + return "%s %s" % (self.last_name, self.first_name) + + @property + def civility(self): + if self.gender == 'M': + return 'Monsieur' + if self.gender == 'F': + return 'Madame' + else: + return '' diff --git a/common/settings.py b/common/settings.py index 4f098d8..fb460ee 100644 --- a/common/settings.py +++ b/common/settings.py @@ -108,6 +108,7 @@ INSTALLED_APPS = ( 'tabimport', 'stages', + 'candidats', ) FILE_UPLOAD_HANDLERS = ["django.core.files.uploadhandler.TemporaryFileUploadHandler"]