diff --git a/.idea/dictionaries/alzo.xml b/.idea/dictionaries/alzo.xml
new file mode 100644
index 0000000..331a0fe
--- /dev/null
+++ b/.idea/dictionaries/alzo.xml
@@ -0,0 +1,17 @@
+
+
+
+ créés
+ domaine
+ erreurs
+ klass
+ modifiés
+ naissance
+ objets
+ pcode
+ prénom
+ rencontrées
+ étudiants
+
+
+
\ No newline at end of file
diff --git a/.idea/epcstages.iml b/.idea/epcstages.iml
new file mode 100644
index 0000000..6711606
--- /dev/null
+++ b/.idea/epcstages.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..411e19c
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..b29c312
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..212be0b
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..ad3d640
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,746 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1502127797453
+
+
+ 1502127797453
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/stages/admin.py b/stages/admin.py
index fa3bf2b..3da0b1a 100644
--- a/stages/admin.py
+++ b/stages/admin.py
@@ -2,21 +2,30 @@ import os
import tempfile
import zipfile
+from collections import OrderedDict
+from datetime import date, datetime
from django import forms
from django.contrib import admin
from django.db import models
from django.db.models import Case, Count, When
from django.http import HttpResponse
+from django.core.mail import send_mail
+
+from openpyxl import Workbook
+from openpyxl.styles import Font, Style
+from openpyxl.writer.excel import save_virtual_workbook
from stages.models import (
Teacher, Option, Student, Section, Level, Klass, Corporation,
CorpContact, Domain, Period, Availability, Training, Course,
- AsaCandidate, AseCandidate, EdePECandidate, EdePSCandidate, AsscCandidate,
- EdsCandidate,
+ Candidate, District, Config
)
from stages.pdf import ChargeSheetPDF
+openxml_contenttype = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
+
+
def print_charge_sheet(modeladmin, request, queryset):
"""
Génère un pdf pour chaque enseignant, écrit le fichier créé
@@ -192,7 +201,7 @@ class AvailabilityInline(admin.StackedInline):
ordering = ('corporation__name',)
extra = 1
formfield_overrides = {
- models.TextField: {'widget': forms.Textarea(attrs={'rows':2, 'cols':40})},
+ models.TextField: {'widget': forms.Textarea(attrs={'rows': 2, 'cols': 40})},
}
@@ -227,6 +236,79 @@ class CourseAdmin(admin.ModelAdmin):
search_fields = ('teacher__last_name', 'public', 'subject')
+def send_confirmation_mail(modeladmin, request, queryset):
+ send_mail(
+ 'Subject here',
+ 'Here is the message.',
+ 'alain.zosso@webzos.com',
+ ['azo@rpn.ch'],
+ fail_silently=False,
+ )
+send_confirmation_mail.short_description = "Envoyer email de confirmation"
+
+
+def export_candidates(modeladmin, request, queryset):
+ # Tous les champs du modèle
+ export_fields = OrderedDict([(f.verbose_name, f.name) for f in Candidate._meta.get_fields()])
+ export_fields['Canton'] = 'district__abrev'
+ export_fields['Employeur'] = 'corporation__name'
+ export_fields['FEE/FPP'] = 'instructor__last_name'
+ del export_fields['ID']
+
+ wb = Workbook()
+ ws = wb.active
+ ws.title = 'Exportation'
+ bold = Style(font=Font(bold=True))
+ for col_idx, header in enumerate(export_fields.keys(), start=1):
+ cell = ws.cell(row=1, column=col_idx)
+ cell.value = header
+ cell.style = bold
+ query_keys = [f for f in export_fields.values() if f is not None]
+ for row_idx, tr in enumerate(queryset.values(*query_keys), start=2):
+ for col_idx, field in enumerate(query_keys, start=1):
+ ws.cell(row=row_idx, column=col_idx).value = tr[field]
+
+ response = HttpResponse(save_virtual_workbook(wb), content_type=openxml_contenttype)
+ response['Content-Disposition'] = 'attachment; filename=%s%s.xlsx' % (
+ 'candidats_export_', date.strftime(date.today(), '%Y-%m-%d'))
+ return response
+ export_candidates.short_description = "Exporter les candidats sélectionnés"
+
+
+class CandidateAdmin(admin.ModelAdmin):
+ list_display = ('last_name', 'first_name', 'section', 'confirm_email')
+ list_filter = ('section', 'option', )
+ readonly_fields = ('total_result_points', 'total_result_mark', 'date_confirmation_mail', )
+ actions = [send_confirmation_mail, export_candidates]
+ 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')
+ ),
+ }),
+ ("FE", {
+ 'classes': ('collapse',),
+ 'fields': ('exemption_ecg',),
+ }),
+ ("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')
+ ),
+ }),
+ )
+
+
admin.site.register(Section)
admin.site.register(Level)
admin.site.register(Klass, KlassAdmin)
@@ -240,9 +322,6 @@ admin.site.register(Domain)
admin.site.register(Period, PeriodAdmin)
admin.site.register(Availability, AvailabilityAdmin)
admin.site.register(Training, TrainingAdmin)
-admin.site.register(AsaCandidate)
-admin.site.register(AseCandidate)
-admin.site.register(AsscCandidate)
-admin.site.register(EdePECandidate)
-admin.site.register(EdePSCandidate)
-admin.site.register(EdsCandidate)
\ No newline at end of file
+admin.site.register(Candidate, CandidateAdmin)
+admin.site.register(District)
+admin.site.register(Config)
diff --git a/stages/migrations/0003_ame=Add_Candidate_model.py b/stages/migrations/0003_ame=Add_Candidate_model.py
index 470530a..e32b44d 100644
--- a/stages/migrations/0003_ame=Add_Candidate_model.py
+++ b/stages/migrations/0003_ame=Add_Candidate_model.py
@@ -42,62 +42,7 @@ class Migration(migrations.Migration):
('name', models.CharField(max_length=30)),
],
),
- migrations.CreateModel(
- name='AsaAsscCandidate',
- fields=[
- ('candidate_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='stages.Candidate')),
- ('corporation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.Corporation', verbose_name='Employeur')),
- ('instructor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.CorpContact', verbose_name='FEE/FPP')),
- ],
- bases=('stages.candidate',),
- ),
- migrations.CreateModel(
- name='AseCandidate',
- fields=[
- ('candidate_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='stages.Candidate')),
- ('corporation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.Corporation', verbose_name='Employeur')),
- ('instructor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.CorpContact', verbose_name='FEE/FPP')),
- ],
- bases=('stages.candidate',),
- ),
- migrations.CreateModel(
- name='EdePECandidate',
- fields=[
- ('candidate_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='stages.Candidate')),
- ('registration_form', models.BooleanField(default=False)),
- ('certificate_of_payement', models.BooleanField(default=False)),
- ('police_record', models.BooleanField(default=False)),
- ('cv', models.BooleanField(default=False)),
- ('certif_of_cfc', models.BooleanField(default=False)),
- ('certif_of_800h', models.BooleanField(default=False)),
- ('reflexive_text', models.BooleanField(default=False)),
- ('proc_admin_ext', models.BooleanField(default=False)),
- ('work_certificate', models.BooleanField(default=False)),
- ('marks_certificate', models.BooleanField(default=False)),
- ('deposite_date', models.DateField(default=django.utils.timezone.now, verbose_name='Date dépôt dossier')),
- ('corporation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.Corporation', verbose_name='Employeur')),
- ('instructor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.CorpContact', verbose_name='FEE/FPP')),
- ],
- bases=('stages.candidate',),
- ),
- migrations.CreateModel(
- name='EdePSCandidate',
- fields=[
- ('candidate_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='stages.Candidate')),
- ('registration_form', models.BooleanField(default=False)),
- ('certificate_of_payement', models.BooleanField(default=False)),
- ('police_record', models.BooleanField(default=False)),
- ('cv', models.BooleanField(default=False)),
- ('certif_of_cfc', models.BooleanField(default=False)),
- ('certif_of_800h', models.BooleanField(default=False)),
- ('reflexive_text', models.BooleanField(default=False)),
- ('proc_admin_ext', models.BooleanField(default=False)),
- ('work_certificate', models.BooleanField(default=False)),
- ('marks_certificate', models.BooleanField(default=False)),
- ('deposite_date', models.DateField(default=django.utils.timezone.now, verbose_name='Date dépôt dossier')),
- ],
- bases=('stages.candidate',),
- ),
+
migrations.AddField(
model_name='candidate',
name='district',
diff --git a/stages/migrations/0004_ame=Add_EdsCandidate_model.py b/stages/migrations/0004_ame=Add_EdsCandidate_model.py
index 5cb1636..2666f4f 100644
--- a/stages/migrations/0004_ame=Add_EdsCandidate_model.py
+++ b/stages/migrations/0004_ame=Add_EdsCandidate_model.py
@@ -13,26 +13,4 @@ class Migration(migrations.Migration):
]
operations = [
- migrations.CreateModel(
- name='AsscCandidate',
- fields=[
- ('candidate_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='stages.Candidate')),
- ('corporation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.Corporation', verbose_name='Employeur')),
- ('instructor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.CorpContact', verbose_name='FEE/FPP')),
- ],
- bases=('stages.candidate',),
- ),
- migrations.CreateModel(
- name='EdsCandidate',
- fields=[
- ('candidate_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='stages.Candidate')),
- ('corporation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.Corporation', verbose_name='Employeur')),
- ('instructor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.CorpContact', verbose_name='FEE/FPP')),
- ],
- bases=('stages.candidate',),
- ),
- migrations.RenameModel(
- old_name='AsaAsscCandidate',
- new_name='AsaCandidate',
- ),
]
diff --git a/stages/migrations/0005_ame=Ame_Candidate.py b/stages/migrations/0005_ame=Ame_Candidate.py
new file mode 100644
index 0000000..76aafbe
--- /dev/null
+++ b/stages/migrations/0005_ame=Ame_Candidate.py
@@ -0,0 +1,169 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.2 on 2017-09-07 14:40
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('stages', '0004_ame=Add_EdsCandidate_model'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Config',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('key', models.CharField(max_length=100)),
+ ('value', models.TextField()),
+ ('comment', models.TextField()),
+ ],
+ ),
+ migrations.RemoveField(
+ model_name='candidate',
+ name='tel',
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='certif_of_800h',
+ field=models.BooleanField(default=False, verbose_name='Attest. 800h.'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='certif_of_cfc',
+ field=models.BooleanField(default=False, verbose_name='CFC'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='certificate_of_payement',
+ field=models.BooleanField(default=False, verbose_name='Attest. paiement'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='comment',
+ field=models.TextField(blank=True, default='', verbose_name='Remarques'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='contract',
+ field=models.BooleanField(default=False, verbose_name='Contrat valide'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='corporation',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.Corporation', verbose_name='Employeur'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='cv',
+ field=models.BooleanField(default=False, verbose_name='CV'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='deposite_date',
+ field=models.DateField(blank=True, default=None, null=True, verbose_name='Date dépôt dossier'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='examination_result',
+ field=models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Points examen'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='file_result',
+ field=models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Points dossier'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='instructor',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.CorpContact', verbose_name='FEE/FPP'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='interview_date',
+ field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Date entretien prof.'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='interview_result',
+ field=models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Points entretien prof.'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='interview_room',
+ field=models.CharField(blank=True, max_length=50, verbose_name="Salle d'entretien prof."),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='marks_certificate',
+ field=models.BooleanField(default=False, verbose_name='Bull. notes'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='police_record',
+ field=models.BooleanField(default=False, verbose_name='Casier judic.'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='proc_admin_ext',
+ field=models.BooleanField(default=False, verbose_name='Insc. autre école'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='promise',
+ field=models.BooleanField(default=False, verbose_name="Promesse d'eng."),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='reflexive_text',
+ field=models.BooleanField(default=False, verbose_name='Texte réflexif'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='registration_form',
+ field=models.BooleanField(default=False, verbose_name="Formulaire d'inscription"),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='total_result_mark',
+ field=models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Note finale'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='total_result_points',
+ field=models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Total points'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='work_certificate',
+ field=models.BooleanField(default=False, verbose_name='Certif. de travail'),
+ ),
+ migrations.AlterField(
+ model_name='candidate',
+ name='birth_date',
+ field=models.DateField(blank=True, default=None, null=True, verbose_name='Date de naissance'),
+ ),
+ migrations.AlterField(
+ model_name='candidate',
+ name='date_confirmation_mail',
+ field=models.DateField(blank=True, default=None, null=True, verbose_name='Mail de confirmation'),
+ ),
+ migrations.AlterField(
+ model_name='candidate',
+ name='district',
+ field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='stages.District', verbose_name='Canton'),
+ ),
+ migrations.AlterField(
+ model_name='candidate',
+ name='option',
+ field=models.CharField(blank=True, max_length=20, null=True),
+ ),
+ migrations.AlterField(
+ model_name='candidate',
+ name='section',
+ field=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'),
+ ),
+ ]
diff --git a/stages/models.py b/stages/models.py
index cc48b8c..b6273ba 100644
--- a/stages/models.py
+++ b/stages/models.py
@@ -425,8 +425,40 @@ GENDER_CHOICES = (
('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 Config(models.Model):
+ key = models.CharField(max_length=100)
+ value = models.TextField()
+ comment = models.TextField()
+
+ def __str__(self):
+ return '{0} : {1}'.format(self.key, self.value)
+
+
class District(models.Model):
+ class Meta:
+ verbose_name = 'Canton'
+
abrev = models.CharField(max_length=10)
name = models.CharField(max_length=30)
@@ -435,89 +467,61 @@ class District(models.Model):
class Candidate(models.Model):
+
+ class Meta:
+ verbose_name = 'Candidat'
+
first_name = models.CharField(max_length=40, verbose_name='Prénom')
last_name = models.CharField(max_length=40, verbose_name='Nom')
gender = models.CharField(max_length=3, choices=GENDER_CHOICES, verbose_name='Genre')
- birth_date = models.DateField(blank=True, verbose_name='Date de naissance')
+ birth_date = models.DateField(default=None, blank=True, null=True, verbose_name='Date de naissance')
street = models.CharField(max_length=150, blank=True, verbose_name='Rue')
pcode = models.CharField(max_length=4, verbose_name='Code postal')
city = models.CharField(max_length=40, verbose_name='Localité')
- district = models.ForeignKey(District, default=None, null=True)
- tel = models.CharField(max_length=40, blank=True, verbose_name='Téléphone')
+ district = models.ForeignKey(District, default=None, null=True, verbose_name='Canton')
mobile = models.CharField(max_length=40, blank=True, verbose_name='Portable')
email = models.EmailField(verbose_name='Courriel', blank=True)
avs = models.CharField(max_length=15, blank=True, verbose_name='No AVS')
handicap = models.BooleanField(default=False)
- section = models.ForeignKey(Section, null=False)
- option = models.ForeignKey(Option, null=True, blank=True, on_delete=models.SET_NULL)
+ section = models.CharField(max_length=10, choices=SECTION_CHOICES, null=False, verbose_name='Filière')
+ option = models.CharField(max_length=20, null=True, blank=True)
exemption_ecg = models.BooleanField(default=False)
- date_confirmation_mail = models.DateField(auto_now_add=True, verbose_name='Mail de confirmation')
+ date_confirmation_mail = models.DateField(default=None, blank=True, null=True, verbose_name='Mail de confirmation')
-
-class AsaCandidate(Candidate):
- corporation = models.ForeignKey('Corporation', null=True, blank=True,
- on_delete=models.SET_NULL, verbose_name='Employeur')
- instructor = models.ForeignKey('CorpContact', null=True, blank=True,
- on_delete=models.SET_NULL, verbose_name='FEE/FPP')
-
-
-class AsscCandidate(Candidate):
- corporation = models.ForeignKey('Corporation', null=True, blank=True,
- on_delete=models.SET_NULL, verbose_name='Employeur')
- instructor = models.ForeignKey('CorpContact', null=True, blank=True,
- on_delete=models.SET_NULL, verbose_name='FEE/FPP')
-
-
-class AseCandidate(Candidate):
-
- corporation = models.ForeignKey('Corporation', null=True, blank=True,
- on_delete=models.SET_NULL, verbose_name='Employeur')
- instructor = models.ForeignKey('CorpContact', null=True, blank=True,
- on_delete=models.SET_NULL, verbose_name='FEE/FPP')
-
-
-class EdePECandidate(Candidate):
corporation = models.ForeignKey('Corporation', null=True, blank=True,
on_delete=models.SET_NULL, verbose_name='Employeur')
instructor = models.ForeignKey('CorpContact', null=True, blank=True,
on_delete=models.SET_NULL, verbose_name='FEE/FPP')
# Checking for registration file
- registration_form = models.BooleanField(default=False)
- certificate_of_payement = models.BooleanField(default=False)
- police_record = models.BooleanField(default=False)
- cv = models.BooleanField(default=False)
- certif_of_cfc = models.BooleanField(default=False)
- certif_of_800h = models.BooleanField(default=False)
- reflexive_text = 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(default='', blank=True, verbose_name='Remarques')
- proc_admin_ext = models.BooleanField(default=False)
- work_certificate = models.BooleanField(default=False)
- marks_certificate = models.BooleanField(default=False)
- deposite_date = models.DateField(default=timezone.now, verbose_name='Date dépôt dossier')
+ 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(default=None, blank=True, null=True, verbose_name='Date dépôt dossier')
+ interview_date = models.DateTimeField(default=None, blank=True, null=True, verbose_name='Date entretien prof.')
+ interview_room = models.CharField(max_length=50, blank=True, verbose_name="Salle d'entretien prof.")
+ examination_result = models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Points examen')
+ interview_result = models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Points entretien prof.')
+ file_result = models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Points dossier')
+ total_result_points = models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Total points')
+ total_result_mark = models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='Note finale')
-
-class EdePSCandidate(Candidate):
-
- # Checking for registration file
- registration_form = models.BooleanField(default=False)
- certificate_of_payement = models.BooleanField(default=False)
- police_record = models.BooleanField(default=False)
- cv = models.BooleanField(default=False)
- certif_of_cfc = models.BooleanField(default=False)
- certif_of_800h = models.BooleanField(default=False)
- reflexive_text = models.BooleanField(default=False)
-
- proc_admin_ext = models.BooleanField(default=False)
- work_certificate = models.BooleanField(default=False)
- marks_certificate = models.BooleanField(default=False)
- deposite_date = models.DateField(default=timezone.now, verbose_name='Date dépôt dossier')
-
-
-class EdsCandidate(Candidate):
- corporation = models.ForeignKey('Corporation', null=True, blank=True,
- on_delete=models.SET_NULL, verbose_name='Employeur')
- instructor = models.ForeignKey('CorpContact', null=True, blank=True,
- on_delete=models.SET_NULL, verbose_name='FEE/FPP')
+ def confirm_email(self):
+ if self.date_confirmation_mail is None:
+ return u'
'.format('/static/img/no_ok.jpg')
+ else:
+ return u'
'.format('/static/img/ok.jpeg')
+ confirm_email.allow_tags = True
diff --git a/stages/static/img/no_ok.jpg b/stages/static/img/no_ok.jpg
new file mode 100644
index 0000000..3ee7540
Binary files /dev/null and b/stages/static/img/no_ok.jpg differ
diff --git a/stages/static/img/ok.jpeg b/stages/static/img/ok.jpeg
new file mode 100644
index 0000000..6bc7f9e
Binary files /dev/null and b/stages/static/img/ok.jpeg differ