From 3a74057ec0673ef90430f6fbbfd7e6b742ca9f3d Mon Sep 17 00:00:00 2001 From: alazo Date: Tue, 5 Sep 2017 20:35:25 +0200 Subject: [PATCH 1/2] candidate_01 --- stages/admin.py | 8 ++ .../0003_ame=Add_Candidate_model.py | 116 ++++++++++++++++ .../0004_ame=Add_EdsCandidate_model.py | 38 ++++++ stages/models.py | 127 ++++++++++++++++-- 4 files changed, 277 insertions(+), 12 deletions(-) create mode 100644 stages/migrations/0003_ame=Add_Candidate_model.py create mode 100644 stages/migrations/0004_ame=Add_EdsCandidate_model.py diff --git a/stages/admin.py b/stages/admin.py index b4ad258..fa3bf2b 100644 --- a/stages/admin.py +++ b/stages/admin.py @@ -11,6 +11,8 @@ from django.http import HttpResponse from stages.models import ( Teacher, Option, Student, Section, Level, Klass, Corporation, CorpContact, Domain, Period, Availability, Training, Course, + AsaCandidate, AseCandidate, EdePECandidate, EdePSCandidate, AsscCandidate, + EdsCandidate, ) from stages.pdf import ChargeSheetPDF @@ -238,3 +240,9 @@ 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 diff --git a/stages/migrations/0003_ame=Add_Candidate_model.py b/stages/migrations/0003_ame=Add_Candidate_model.py new file mode 100644 index 0000000..470530a --- /dev/null +++ b/stages/migrations/0003_ame=Add_Candidate_model.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-09-05 16:56 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + 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=3, verbose_name='Genre')), + ('birth_date', models.DateField(blank=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é')), + ('tel', models.CharField(blank=True, max_length=40, verbose_name='Téléphone')), + ('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)), + ('exemption_ecg', models.BooleanField(default=False)), + ('date_confirmation_mail', models.DateField(auto_now_add=True, verbose_name='Mail de confirmation')), + ], + ), + migrations.CreateModel( + name='District', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('abrev', models.CharField(max_length=10)), + ('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', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='stages.District'), + ), + migrations.AddField( + model_name='candidate', + name='option', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='stages.Option'), + ), + migrations.AddField( + model_name='candidate', + name='section', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='stages.Section'), + ), + ] diff --git a/stages/migrations/0004_ame=Add_EdsCandidate_model.py b/stages/migrations/0004_ame=Add_EdsCandidate_model.py new file mode 100644 index 0000000..5cb1636 --- /dev/null +++ b/stages/migrations/0004_ame=Add_EdsCandidate_model.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-09-05 17:06 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('stages', '0003_ame=Add_Candidate_model'), + ] + + 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/models.py b/stages/models.py index 15cfba3..cc48b8c 100644 --- a/stages/models.py +++ b/stages/models.py @@ -1,4 +1,5 @@ import json +from django.utils import timezone from collections import OrderedDict from datetime import date, timedelta @@ -67,7 +68,7 @@ class Teacher(models.Model): archived = models.BooleanField(default=False) class Meta: - verbose_name='Enseignant' + verbose_name ='Enseignant' ordering = ('last_name', 'first_name') def __str__(self): @@ -166,11 +167,11 @@ class Student(models.Model): dispense_eps = models.BooleanField(default=False) soutien_dys = models.BooleanField(default=False) corporation = models.ForeignKey('Corporation', null=True, blank=True, - on_delete=models.SET_NULL, verbose_name='Employeur') + 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') + on_delete=models.SET_NULL, verbose_name='FEE/FPP') klass = models.ForeignKey(Klass, verbose_name='Classe', blank=True, null=True, - on_delete=models.PROTECT) + on_delete=models.PROTECT) archived = models.BooleanField(default=False, verbose_name='Archivé') archived_text = models.TextField(blank=True) @@ -235,7 +236,7 @@ class Corporation(models.Model): short_name = models.CharField(max_length=40, blank=True, verbose_name='Nom court') district = models.CharField(max_length=20, blank=True, verbose_name='Canton') parent = models.ForeignKey('self', null=True, blank=True, verbose_name='Institution mère', - on_delete=models.SET_NULL) + on_delete=models.SET_NULL) sector = models.CharField(max_length=40, blank=True, verbose_name='Secteur') typ = models.CharField(max_length=40, blank=True, verbose_name='Type de structure') street = models.CharField(max_length=100, blank=True, verbose_name='Rue') @@ -296,7 +297,7 @@ class Period(models.Model): """ Périodes de stages """ title = models.CharField(max_length=150, verbose_name='Titre') section = models.ForeignKey(Section, verbose_name='Filière', on_delete=models.PROTECT, - limit_choices_to={'name__startswith': 'MP'}) + limit_choices_to={'name__startswith': 'MP'}) level = models.ForeignKey(Level, verbose_name='Niveau', on_delete=models.PROTECT) start_date = models.DateField(verbose_name='Date de début') end_date = models.DateField(verbose_name='Date de fin') @@ -338,7 +339,7 @@ class Availability(models.Model): period = models.ForeignKey(Period, verbose_name='Période', on_delete=models.CASCADE) domain = models.ForeignKey(Domain, verbose_name='Domaine', on_delete=models.CASCADE) contact = models.ForeignKey(CorpContact, null=True, blank=True, verbose_name='Contact institution', - on_delete=models.SET_NULL) + on_delete=models.SET_NULL) priority = models.BooleanField('Prioritaire', default=False) comment = models.TextField(blank=True, verbose_name='Remarques') @@ -402,8 +403,8 @@ IMPUTATION_CHOICES = ( class Course(models.Model): """Cours et mandats attribués aux enseignants""" - teacher = models.ForeignKey(Teacher, blank=True, null=True, - verbose_name="Enseignant-e", on_delete=models.SET_NULL) + teacher = models.ForeignKey(Teacher, blank=True, null=True, verbose_name="Enseignant-e", + on_delete=models.SET_NULL) public = models.CharField("Classe(s)", max_length=200, default='') subject = models.CharField("Sujet", max_length=100, default='') period = models.IntegerField("Nb de périodes", default=0) @@ -415,6 +416,108 @@ class Course(models.Model): verbose_name_plural = 'Cours' def __str__(self): - return '{0} - {1} - {2} - {3}'.format( - self.teacher, self.public, self.subject, self.period - ) + return '{0} - {1} - {2} - {3}'.format(self.teacher, self.public, self.subject, self.period) + + +GENDER_CHOICES = ( + ('M', 'Masculin'), + ('F', 'Féminin'), + ('I', 'Inconnu') +) + + +class District(models.Model): + abrev = models.CharField(max_length=10) + name = models.CharField(max_length=30) + + def __str__(self): + return '{0} - {1}'.format(self.abrev, self.name) + + +class Candidate(models.Model): + 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') + 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') + 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) + exemption_ecg = models.BooleanField(default=False) + + date_confirmation_mail = models.DateField(auto_now_add=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) + + 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 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') From f16367a799ce9d6b0ba4d5d4bafd3197e8acb179 Mon Sep 17 00:00:00 2001 From: alazo Date: Thu, 7 Sep 2017 21:43:27 +0200 Subject: [PATCH 2/2] =Candidate_admin --- .idea/dictionaries/alzo.xml | 17 + .idea/epcstages.iml | 11 + .idea/inspectionProfiles/Project_Default.xml | 39 + .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 746 ++++++++++++++++++ stages/admin.py | 97 ++- .../0003_ame=Add_Candidate_model.py | 57 +- .../0004_ame=Add_EdsCandidate_model.py | 22 - stages/migrations/0005_ame=Ame_Candidate.py | 169 ++++ stages/models.py | 132 ++-- stages/static/img/no_ok.jpg | Bin 0 -> 38865 bytes stages/static/img/ok.jpeg | Bin 0 -> 10049 bytes 14 files changed, 1157 insertions(+), 151 deletions(-) create mode 100644 .idea/dictionaries/alzo.xml create mode 100644 .idea/epcstages.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 stages/migrations/0005_ame=Ame_Candidate.py create mode 100644 stages/static/img/no_ok.jpg create mode 100644 stages/static/img/ok.jpeg 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 0000000000000000000000000000000000000000..3ee7540d794bf39632bfaa3b4863c1dce8674dc9 GIT binary patch literal 38865 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

SneI62 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

i*$76;$^!4^mKJ9W2k< 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 Pek_&~?f-dk{22K!hJEks literal 0 HcmV?d00001 diff --git a/stages/static/img/ok.jpeg b/stages/static/img/ok.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6bc7f9ea1094409fd6daa5450d3d708585689fc8 GIT binary patch literal 10049 zcmZ{K1ymIM-~H01gp^9VbSd2+2rMimsiYuFEDcMS3JB7%gmg+sNW)T!bhCiCba$tK z#DDR5p5OC(-}C-w&(4`SGiPV!e(&er`?q+ms5MF0i{0Dyu10B)uLK>z|= zJW^s3N>Wl%O7ucaNrhgMQc+SDU?XKV+e!q-K(0V&UN8<>jSj5D*pM z5n<=y<-s5%BqY8|{E(FNArA{9>th}sp4;z#7T*7C{eL!Yz5&Sa0SkZyEDSOLCK(16 z8OBXJfEED2#KJ%?fd4F*Sh#pN*ckZeqY9(|3@l7cTwGi{TwF{n^eGtV)3M2Lm~ij$ z$!eP6kw0>N7t1fF^*XzP0w~}T5Z6litnxc@pII9gn6p47Pb~;R|I9-S!2h}i00aFq zIJoFz0_dB;L|+6O8wVSG((PSfV3J{B-{WJFCFj>PLtmf*he9qE3Cv#D7tm^b{p@BE za0d&0A7of$02#pabHH0{03!wfAMg|taHdwpj#(24on=r|F&1v@DkA+U%}bYfmXKE2 z@jyioI9>4CkEdxx4UF6aFYcZ3&$U;2U6Do9Jg($&^J9ALas$}5c~d}Rc!XUttKYJ! zAvp(&)Q%blJ6se+{~p5Xrr~gLL=e09R`sx`%xowv%^vz&a8ZWSJxg70ZbP*D##QKV z1wQy3F_WMz(%>=Gd#V9D;Q*^3PO2VwbAFK?>!lVcy9NV7(-mgvJnGY*p{Ro$ zc@>fsXU6mQwi3IMz#>1SW9x-{+h-+c{P&~H-WkpL8vtmrCd#_XdM%L0xk=PGkJO#i zfh24U1^LgTlm0gjqlnRg`$lG{zD?>XTA!Ze)wUS}Ph5fmhsd``Pvdyk__Gp40 z%3k-K!gS?3ub>o_x}6QDd3dDmZhZ8mFDsk zOXIy0$Zi{ho@>rGC)5?KH2HO|d}f#1V?iJJqzt;O&=CN%C#-wN?1@iNh zMfP)U*TLiUqVzc|l75!+kQpX_=&vwIn3*T+id#H$|B0gSB&G}>{ekRx;jaL(AL0x_ zeLf&=<~>LfR_o7mw#7x?{4o7}X>AZyajulzhHdT}T&3C4S<}>W957!}qEgL$l|E)& zzDSyq9GO?@r_pvI`XL8(Ow)E+@yrOhcozESA9-bT<>xoOrjgA_jU+zApszMSHhP=~ zy^;bd$ieu9MC5qYXOHv9##|Xsd#iR2-VbXU{cg{mXDUCWAQx5)sc0Q|v@pOJAR55W z1^XnyjHc-S94EkAF>!@F!82E5$nMm7x#h2ny9{L={3&6z@~c^;A8X?`O7$M8s5I1j z$hXD*-kn_9Uq-OSb}#lMYM;~d&>>Sw6vhjzAT;8jd#I_|ElV$=1iru|?C+X8Zbmg30kmgP`<5ePPoH znzZ~LyU;;!Po;>I8XThTt;h8U7FTH(It1?cv&R-ll_D9qD^k<;l0hg>h&<%Z6n!zX zsFetL>yybtm5F0$^d9h-;8${0XIrytm$cYf=UGJFL zAjs*e#JY;5Bq5hT@b8CUV$O4uJOhzWLN8%o?j%|4uBWHcEo^4Io@I}i_QZ$8iwdWc zk4*ZiW$L*>ug>}GJ~xeNR5g(XjS-HN^4&r# zpsnz8Q6~?c^Vn~0=6#L1%R3#Z9-tmCLz;kp35r=<;BC?`%%i9OgM=>l6_Q41R@A=k z9#4lAob|`9MG|kvu37tlu1G0&Wn*gEn&=I{uP?gT3QupqV>r ziOv;>gG(wCnn!AJ6aO%ZrIJmIi!xU14{Rf7re(yS!FpQqen<(;vp>v2vugyCx*3zn zXBhjj_tU4pvWS1ndyYLy^uYbmNrGIJuD=2Bti8EE&z|4v-QQLO$-0B5Q5~@;sCQf-4@riY&DoWda>Jcnn|86XzN1x}G zKdI;%yA>&I$OQSnRrROF!qL!d5Oy0K2cT<>u-oJ~$ZI+N?k6tF3@B&nY~nIc_Xky@ zX9gq6!T@`=IC94v>?zmS&5rVv6ul5|>t~Oe$#3NK`!YDSssbT;k%#j=kw&pSuJ0kQ z8Dj$QnMq}_A+j|1lDdy#Azekmd`h-JhQ*CZ8VS5TAPqCthyF9NR_~b1NTOYYREd|Q zr^A&>=JIFj7ST)TqJ%pr{Cgsk5gEgKwdNlQz8e}R5Y#t<*2Bc})o3gtTl+nUp){@3 zLu$m}*}zG#$4E&6 zRHUIPcJPIksCPwmqeeLa5fg9$v7`N?7k6`tAOrn(GUlKmY*<~9%9-lDw5zqjHd98xW_kjU>DMn=vHX+Iq(IlUF>4=wp5og70<0?6LysAYm zx|I%0Q=!-{)Q*p?ShE_4vz{^#)LH=i-A8FHew4XjA%2O?rSJVpQVh)DV4IPXY7)sS5z+Gx>kt9@$} zEU*8y2f15&_?yV@A-vw0-H^D6_*8N$Y44qZBmJg~VE(>!Pe@E7v|*@td2nhuBEFM@ zGfYWKo4sM(J!q zr2R=m>Jb1}{tW5m1Sh9Jg)uipY(+%VeAs+6D)+XUy(Y@*rPJv3{3JSeoSZ`S@8=mf zx%(sAEVIS>00N`V!Yx&JeFulelU@#iAq6_#2KtVj2Q4pjw4bCYf|VyU89vbjzMb&r zky>2p(6X0MP*mqdUZ_WXs#5HE>F~2!ta*@{s98cva7UltoJ;D_VrMjQ!ho>P4!Oi! ztn}S+X$-4GU2^V`DcslMGQlYgh0sYUk!pHX+&$^L*kww^P}(O^tFiSjx`j>**Q;@> zT^v+0HKj(ac#B!Lqw0-GfNAAbDcxx+w=C|_7e?Fe>suE8$An-1ag$rcJk-&}J(8s8 zg_3dP!B{^wtu0sBx2V#lAs(?jQIgYU*V3hk$@|Rl=x6q%*m$hwlWi<_!HZ=_>GiV- z52))@iC#+I(0B-pFuPbuLV~+Sfj`rnTLZ8fXXi@=9jx79qhy;{k44UifL<=m6`-5 zgcwJs1=j0>O0Bn*q2?0d5NhFF_ws$?WJ;xD{?7aXwj5f+FWFB-PqW+$ZvbjD`R8>I_TO)=V76=ex?A2tQfOb}HqWIaVmI?*KZI$w=7wLqx$ zhogH+>O;7`a)XcUEFR076WB)-tcT}jH1$aacc(3vp#Axe(Iotn5dXFvwB^Y2dSiQX ze%^umj%#H?EF{xo=UFTv9Gt;1LHWJr*G46GgsHg^yQT*&JI$!Y z>yVs`ZN4{h>L2)si%FlrHDy)xt>UUhTh98;1B(87 zfk$iu&K4fRUgt9dNp}Hnp9O90rC5AP3KRjOj5~CbvyRh&xXjqYxGYN~LlSxSq%{qW?b(>O4#B4tB zq>RSzt;f|80=C*$m$SSwW`(LP^Y64$$H@@th%!;DKsoi{c+hoO*ndt zZow+xGvk+N!EvWamU>uy)+9GT;_FU<>7%3ZekkFepUR zI(H~a-b+yU@SF+!6c~et1+F+nf-F(J3n)htuj!Bu^Hg*YhOG@Ol%*v@j>L8!JF^Tj z$GOM7z?0HnIdPaE;E0dO%h!^NE6fYGQcQ0^WX%W(_8)A=_fvcd5WH-pd(ClF_&_9A4-MWi#l=qe6TJ(5d{j@ z6Hga}Dc1WX50#97Gzk|@EtNlL_GmDL=_Mi>>-QP=@WRfUKCVO=LK-qz;CBv`zuP3Q zusqTtjqjyMP(ZUhOzFhzrE7xAha74)eh)!M7=nk-JW<&`w1t+xkEcSYgn=+BiiyHJ zHQjD{XZZ_^ihU_+%#WUyuY;~a%EH>_FMeZ+i9d@3DNr?5Irl`gILHh;>o0d_mGtrI zMhW*PHdHDvyH+;p4^H|&b;1fbN_BA`V%0*gIM^S`#U=kC#O>V}G(7gJc!{W$y#Zid zQC++d8~trl2jt)5u(6aVW}n2? z2kGF}a*EsZQdWw;Er)x^krpo+3j1+%gj7w*7#Nt6jDUNw*saCI#8JfeD*f%IOvT?oi(`rpvS$XRpsXjza-`=#CU{L?8H89vx*~7e)^y2AMVzD z?`7#@1?LTj#o3yTk=y`|YGv*R8eUNLeKBUdiehO0sp>fS)kad?`zV?fEiXYpTB5hk z<;+I=)cxnIpMOLNPPW{AK~fOKp3?nxtX6OE*PP$-mx2!b?*z{Rx67A;7;}k9z{6wc z=1!Udqy2UWT5gBntKK!2Bs^RsIIO>!%!{K>0lPtNB+0ptF{rf^g zRl6cdQd^Uw&~X;WL_aDxxV&>N`RI~vu|d6+5c`(;7%N|jqwr_A%YN7@^jzVQ_o(LO zl)^dKi!Gn!eO%hg|LLx3-)=Wge6&Y{v%1{9x_u~M;l<*(?%bm#_utg#;E4QV#C18N z#YX2*-O$yTGaHhzbDr|^FQ|>t^F35PUr@E6eL2?G*L@Yy=59BD&hxUJknHmQ22lQH zg>qN5!404vc>}Ob)o^` z%k-4!ew~QPXM{45j(j9KSM(X*MQ(ZK4E*vd%er+<2F--b zcj?Nojc5YP-|rb`s-~ZS#sG{Y?*SZ2AadnnZ}GEjy9t_gWxFn5M?t{a7<4JY=OQho zlpEHWDV5wiyhCwue=8r*?|@Tvhem=ebm`lK`KOVyHx!89_pOgjs5@jtP}P(uk1%vn z3u1aorpEPhWKC2k%P7tcK+~h#u-QHdo`{3G$B8$n=^4q5PB>Qk)se(ZH%(7?w4~81 z`VIj%T8+@@<{yFo%Wcg6usbMU-+B08Y@t3 z&`_HpWAm~L{!WI4^aZmOj*HS2i)rJKYL7Uy?ZhfLk3=n4#G^b(Wd4`GZeO~a>e5)( zXRGks2N4k^c{c!lCT8=ws2hMp-C>CZ-Psz6<1Vb1o|QYs_@_n+-N<9ip^uf+%@~l! z-q><$Sw!ydp|74RNIh#QN#$D`lO$<8+%?Gv(XYCIE!EYXNoBUxT+_YozHs-?oF92- zvT$tr7V|A>9uxQv?cQp=!`H%~eGcRvjby)2iIn8MNX$SoG&x;s9!#}*ogX>)yueE; z8fxB&W^l;>e_KU&B7c(Jt?j*M;mf-femQOKvyarYrVs51=*g_>$ zc*{K&N0=Yqxk~g~eap!9E=dPmshs-k+|pp5<)3e_?K~{dvhKf6&CQ~vx)fB~!@rhy z+^nDzNgv9zEopFhcu>D@BK?ISBt>PjrC?~Q!c%{Re)Xw!&t8Z7?4bl9f65OA9!^;(-nR1PPr6HkP_%%T0)qK`HggV807XFccJW@*= zZB&JM=m0Ym`fjJy>6h+UhdMGX+E#-VJ}G?{v9HDjrKCjUxqHjE%b)C;OAi82=2(Gv z*4MUC^OP$dK-Ce1Z}{FbPtCA6aMGPsztmsA-fLdoLn1q}4a*DbF}q>CHKocYqExX? zve?deHh{~8yn2(VS4zx@%YiEh z>AYVDPZF+U2n|(((ffng7DauHxE`%aUPe9O>XM}R?=-6(mUETW@XFr6Aju^R#K0<= z`EK8&Hu}X4U`;0X2GBM&Y+K(IdzpFt@X-m0wOq`5cGCBZ6j^cy!<7BbUrPxch z`K4B~4BuazIS0N;ZRJzMBN$PH2qad{BabYa|)5w zB&tFuP)_5?35t;M`7Q?AcXM-fKSpf6%x5AqW~s)fZsO5*wU)afUd}A-acVuR%kZXzHToCKkiSyv{}Q!> zC)gOftxi2$oWO$Uk(kNfZyzAKVgT`rr6ZhtF0N6l>5H0(gW*xX_l$he{%X-)OCKLy z&UBb4HWdd!6TzotWOM5t7(WwEhUgMaL=jCF>iZA;fvwO0DUXNHg`du)W$<#e=>jvT zy1V%1sp_ff>4L~!lLTNC%Sb_k0o&rG`!Q}LHf#*~Ayywm@ETJV(%c&)r(-5KxhJ^{ zrqz>9eakR&NR7cqTY`6%oR?zv>na@|ICJk$%{W=55{{XpF8iYA7yG;TI?Axc@&bs5 zWh-zz2YJM;hU%*~4&}jU`Tj?{l9lnnpE-c)!%|PSzI`h47$?G?edCF{==U|{M6e-! z4jb`1V>bFl<9w!6^9`WKldJw%fdl^w)IUyuB>4P+35njI|7bJv097%NU~aM|oh#nK z;NSUJU*|l}HBJ;UDB>*9dt_)oB^f-OUNs2Dy?w!OYs+$RAOA=J6Gx)2Dtc}c^A!1; z@B=)-Puqn?l{CF>ekn7u8SeLWDY{WyW-+?)xx=CiWnIGt!PpQcWI>zh>(j^1ZIKe+lAAeH_EhA*InL z2fZS_TF2VCFOv3Eow`r+orU4j>fWw-@hJCJdq}cNGq}RUZ0WD|UllEDnovTp1+y

S%lC|?4ll)Z8#)Tvq7;40(t`xqucddRJ zXCC|fsRdl1BBI671EVi=x~?Zy)=(T~@p8$o-PsOofJhfCYfSTfC?b^WMAR3bmR{AF zHoejS3W|UC7r6h+lF%=yaYjK-_2p-{Y(`UXbgx?QXfSq(5BLs+w2i2zCwkeT;E*&t zOQvbKa;)%*qMfxQeH5&c=QT}$evkjn4#RTFVIn?nc_&o{^pN$*nfQd^$>Ce$H#2qC z5wNA9dfukzlck3qW?eOg%k`yd@BW&rCdHx2GbW_$7ZTjT%+BR22P5l$w@J|bCf+hn zqTels-$B*68GXE_dnH6WkVs9X)OIM$<1{NmiqM8mio%`U!`F0ig&t%ix{EH_b15b3*L$ZKG-6Y{B|0?!R$VTs4q`h`;-f;;1lYcR)9E$E^;FFV7?|oM{mQw z^B^E>Mka@=K{iV56<>;#i!CUpbJrF`>@x;dSD#2*UEWC%QS>G&DmK&^97mZ;7Xn9} zPOG{drs^!uDz5Wg7dkHTpy64Y|IYlA;*e`p->u0S(*{g@W3FSI@Hvyo%p{9aHEbwT z_pSFpL;0IQi2ElFQiY~vD`g(xo$q|2G2NuKq*MQmY@BNJ$2Me#DoPzw7CjSUx+}kM zXZqMb8%`^5-k|dHTog4MV8>! zcF>TL-uAh-P5=K{%Rc34tT~nHWf^QrJEz?k9fM+m9{D*dNXq*NafNC^ZX$kt-B^>pS9?qE{1jZQ(OlVZm%4hV=Oot&+Nz90lM8$a1T4?o|6JzFUf`uHOK1 zchn3%kGt1)5melr-@yIlGUIzRfsCg1qI+3>UG(tvy7)ib`}@xVddH2=pa-loZN(pn z`v)An>`3UVyu7&AB9;1BS!9yKHgKcH77lH66rY|z03TanJs@m@6YO{Zjn{hp62CjR{4El}OhMbZw-E+hrNIVliEEYR#_ zzQ3e$8U1boGU@L%FoJDGjviYPQMPgx-7R>xO+Q|W^2y*on}PMwX0L*n_Xp`AFao7` z4vxhC6HXF`2SH;$8uc;=m?aIq8%Q5rQJuw)I0k8jC*fCBDR8jcU1}9&kJo>CyQSoR z)U3HOTaC(Hee>)UG2hYG?3Iq{f!*-+F+M^iQAPiX%Q?m&X%h=J_$N>fMP)LawzMJ7EHB)lU@U{PJQGY+g`U~iq;L{agY?Hpm%tsDiZAAsJWkjQnD7_fDH^!~#w_b4G(AuEg){O&G#>n_ z-MbziUuxi8sY5qz0GpPm{0CCZ>BjQvkyC-eQ;ty79?syXdU79oeS?)D!6^8`q|cIH zz!!!ARN9lup4a7$Q|RLU2`h9BCny>$Cic~kc%{bjesJWa3g}zB46#wyDfvr_{x@b{ z&CJ{$j4lR9T)^99cfVSlXwSEvTl|Kf`#SbLo<6?;bp6oyO|W4}zasnf15f!8Xk}$G z@UUuo6bR2PQT1ObXs~>va|3wHcm0AbD`I_%!ejTL#H#6)_Dfcw{GN5O_0<~00FNLr zB7y3#3haNU5&0@9(;FiPHS(PfMKwY7H}u@7iRyD0D(y zgmSlCqnOENhr>JT^=K-1DKCdu*$Q+=BNZiO>DTA2O%FUiEk9j`_px$V!cRp7t4GHA zifHJVqeRMa1|^41IPcjX3n|;LhfPAFyX3 zvC75EYHU3!o!-1T8N2U>-c3Jr%e{>1_av=M#BaI7QV_nBt=@jY`z2gd6-JCP8FlFY ziW1(&(i%~HWaP%B>n&zXGO49HciI<{>OeT~U8N$mi=|ggtMj4VDQe%T;*e86wQQ+_ z$uVb9dIPu|B(&|9XeBY?CF9k8IZQGg8UYoyrk=-rgWW)sJ(~B;mi4!|e)C9{LwJWl z2B*Y{cNICR;9|UgDNbm)DN7D?#H}Wg=7Pk{uWPCVj{W~o`B#ohpfWjCv1$EPN+M@v kUbJvY6z+14>RlCu7xKjQ)VSLQsSMBmt%-l|CApdSe}-@2@Bjb+ literal 0 HcmV?d00001