=Candidate_admin

This commit is contained in:
alazo 2017-09-07 21:43:27 +02:00
parent 3a74057ec0
commit f16367a799
14 changed files with 1157 additions and 151 deletions

View file

@ -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)
admin.site.register(Candidate, CandidateAdmin)
admin.site.register(District)
admin.site.register(Config)

View file

@ -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',

View file

@ -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',
),
]

View file

@ -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'),
),
]

View file

@ -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'<img src="{0}" height="20px" width="20px" />'.format('/static/img/no_ok.jpg')
else:
return u'<img src="{0}" height="20px" width="20px" />'.format('/static/img/ok.jpeg')
confirm_email.allow_tags = True

BIN
stages/static/img/no_ok.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
stages/static/img/ok.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB