Add Candidate model
This commit is contained in:
parent
ab5b287ce9
commit
54a1d34466
8 changed files with 430 additions and 16 deletions
125
stages/admin.py
125
stages/admin.py
|
|
@ -2,18 +2,29 @@ import os
|
|||
import tempfile
|
||||
import zipfile
|
||||
|
||||
from collections import OrderedDict
|
||||
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 datetime import date, datetime
|
||||
|
||||
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,
|
||||
District, Candidate, Config
|
||||
)
|
||||
from django.db.models import BooleanField
|
||||
from .forms import CandidateAdminForm
|
||||
from stages.pdf import ChargeSheetPDF
|
||||
|
||||
openxml_contenttype = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||
|
||||
|
||||
def print_charge_sheet(modeladmin, request, queryset):
|
||||
"""
|
||||
|
|
@ -184,13 +195,14 @@ class AvailabilityAdminForm(forms.ModelForm):
|
|||
comment=instance.comment)
|
||||
return instance
|
||||
|
||||
|
||||
class AvailabilityInline(admin.StackedInline):
|
||||
model = Availability
|
||||
form = AvailabilityAdminForm
|
||||
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})},
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -225,6 +237,114 @@ class CourseAdmin(admin.ModelAdmin):
|
|||
search_fields = ('teacher__last_name', 'public', 'subject')
|
||||
|
||||
|
||||
def send_confirmation_mail(modeladmin, request, queryset):
|
||||
for candidate in queryset:
|
||||
if candidate.deposite_date is not None and candidate.date_confirmation_mail is None:
|
||||
# Send confirmation message
|
||||
src = 'cifom-epc@rpn.ch'
|
||||
to = '{0}'.format(candidate.email)
|
||||
if candidate.corporation:
|
||||
to += ';'.format(candidate.corporation.email)
|
||||
if candidate.instructor:
|
||||
to += ';'.format(candidate.instructor.email)
|
||||
subject = "Confirmation de votre inscription à l'Ecole Santé-social Pierre-Coullery"
|
||||
message = "Madame, Monsieur,<br><br>Nous vous confirmons la bonne réception de l'inscription de {0} {1} {2}"
|
||||
message += " dans la filière {3} pour l'année scolaire à venir.<br><br>"
|
||||
message += " Nous nous tenons à votre disposition pour tout renseignement complémentaire et "
|
||||
message += " vous prions de recevoir, Madame, Monsieur, nos salutations les plus cordiales.<br><br>"
|
||||
message += "Secrétariat de l'EPC"
|
||||
msg = message.format(candidate.civility, candidate.first_name, candidate.last_name, candidate.section)
|
||||
|
||||
""" ********************** to be uncommented !!
|
||||
send_mail(
|
||||
subject,
|
||||
msg,
|
||||
src,
|
||||
[to],
|
||||
fail_silently=False,
|
||||
)
|
||||
**************************************************
|
||||
"""
|
||||
|
||||
cand = Candidate.objects.get(pk=candidate.id)
|
||||
cand.date_confirmation_mail = datetime.now()
|
||||
cand.save()
|
||||
return
|
||||
send_confirmation_mail.short_description = "Envoyer email de confirmation"
|
||||
|
||||
|
||||
def export_candidates(modeladmin, request, queryset):
|
||||
"""
|
||||
Export all candidates fields
|
||||
"""
|
||||
export_fields = OrderedDict([(f.verbose_name, f.name) for f in Candidate._meta.get_fields()])
|
||||
boolean_fields = [f.name for f in Candidate._meta.get_fields() if isinstance(f, BooleanField)]
|
||||
export_fields['Canton'] = 'district__abrev'
|
||||
export_fields['Employeur'] = 'corporation__name'
|
||||
export_fields['Employeur_localite'] = 'corporation__city'
|
||||
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):
|
||||
if field == 'gender':
|
||||
tr[field] = ('Madame', 'Monsieur')[tr[field] == 'M']
|
||||
if field in boolean_fields:
|
||||
tr[field] = ('', 'Oui')[tr[field] == 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):
|
||||
form = CandidateAdminForm
|
||||
list_display = ('last_name', 'first_name', 'section', 'option', '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', 'canceled_file', ),
|
||||
'comment',
|
||||
),
|
||||
}),
|
||||
("FE", {
|
||||
'classes': ('collapse',),
|
||||
'fields': (('exemption_ecg', 'integration_second_year', 'validation_sfpo'),),
|
||||
}),
|
||||
("EDE/EDS", {
|
||||
'classes': ('collapse',),
|
||||
'fields': (('registration_form', 'certificate_of_payement', 'cv', 'certif_of_cfc',
|
||||
'police_record', 'certif_of_800h', 'reflexive_text', 'work_certificate', 'marks_certificate',
|
||||
'proc_admin_ext', 'promise', 'contract'),
|
||||
|
||||
('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)
|
||||
|
|
@ -238,3 +358,6 @@ admin.site.register(Domain)
|
|||
admin.site.register(Period, PeriodAdmin)
|
||||
admin.site.register(Availability, AvailabilityAdmin)
|
||||
admin.site.register(Training, TrainingAdmin)
|
||||
admin.site.register(Candidate, CandidateAdmin)
|
||||
admin.site.register(District)
|
||||
admin.site.register(Config)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue