From 92b4b1c21b2d1f50f2c817e9b3d7805f376d6136 Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Mon, 23 Apr 2018 19:02:23 +0200 Subject: [PATCH] Merge two expert letters --- common/urls.py | 2 - stages/admin.py | 4 +- stages/models.py | 4 ++ stages/pdf.py | 118 ++++++++++++++++++++++------------------------- stages/tests.py | 21 +-------- stages/views.py | 4 +- 6 files changed, 63 insertions(+), 90 deletions(-) diff --git a/common/urls.py b/common/urls.py index 506ada4..e6aceb3 100644 --- a/common/urls.py +++ b/common/urls.py @@ -37,8 +37,6 @@ urlpatterns = [ # Qualification EDE path('student_ede//send_convocation', views.StudentConvocationExaminationView.as_view(), name='student-ede-convocation'), - path('student_ede//pdf_to_expert', views.print_pdf_to_expert_ede, - name='print-pdf-to-expert-ede'), path('student_ede//examination/expert', views.print_expert_ede_compensation_form, name='print-expert-compens-ede'), path('student_ede//examination/mentor', views.print_mentor_ede_compensation_form, diff --git a/stages/admin.py b/stages/admin.py index a8d9813..f7723d5 100644 --- a/stages/admin.py +++ b/stages/admin.py @@ -151,11 +151,9 @@ class StudentAdmin(admin.ModelAdmin): return format_html( 'Courrier pour l’expert ' 'Mail convocation soutenance ' - 'Indemnité aux experts ' 'Indemnité au mentor', - reverse('print-pdf-to-expert-ede', args=[obj.pk]), - reverse('student-ede-convocation', args=[obj.pk]), reverse('print-expert-compens-ede', args=[obj.pk]), + reverse('student-ede-convocation', args=[obj.pk]), reverse('print-mentor-compens-ede', args=[obj.pk]), ) else: diff --git a/stages/models.py b/stages/models.py index b6b3ae5..7873045 100644 --- a/stages/models.py +++ b/stages/models.py @@ -77,6 +77,10 @@ class Teacher(models.Model): def __str__(self): return '{0} {1}'.format(self.last_name, self.first_name) + @property + def title(self): + return self.civility + @property def full_name(self): return '{0} {1}'.format(self.first_name, self.last_name) diff --git a/stages/pdf.py b/stages/pdf.py index bda3e8e..6baa8d2 100644 --- a/stages/pdf.py +++ b/stages/pdf.py @@ -157,6 +157,16 @@ class EpcBaseDocTemplate(SimpleDocTemplate): ])) self.story.append(t) + def add_address(self, person): + self.story.append(Spacer(0, 2 * cm)) + self.story.append(Paragraph(person.title, style_adress)) + self.story.append(Paragraph(person.full_name, style_adress)) + try: + self.story.append(Paragraph(person.street, style_adress)) + self.story.append((Paragraph(person.pcode_city or '', style_adress))) + except AttributeError: + self.story.append(Spacer(0, 1.8 * cm)) + class ChargeSheetPDF(EpcBaseDocTemplate): """ @@ -171,9 +181,7 @@ class ChargeSheetPDF(EpcBaseDocTemplate): ]) def produce(self, activities): - destinataire = '{0}
{1}'.format(self.teacher.civility, str(self.teacher)) - self.story.append(Paragraph(destinataire, style_adress)) - self.story.append(Spacer(0, 2*cm)) + self.add_address(self.teacher) data = [[settings.CHARGE_SHEET_TITLE]] @@ -325,47 +333,45 @@ class UpdateDataFormPDF(EpcBaseDocTemplate): return any(el in klass_name for el in ['FE', 'EDS']) -class ExpertEDEPDF(EpcBaseDocTemplate): - """ - PDF letter to expert EDE - """ - def __init__(self, student, **kwargs): - filename = slugify('{0}_{1}'.format(student.last_name, student.first_name)) + '.pdf' - super().__init__(filename, title="", **kwargs) +class ExpertEdeLetterPdf(EpcBaseDocTemplate): + def __init__(self, student): + self.student = student + filename = slugify( + '{0}_{1}'.format(self.student.last_name, self.student.first_name) + ) + '_Expert.pdf' + super().__init__(filename) self.addPageTemplates([ - PageTemplate(id='FirstPage', frames=[self.page_frame], onPage=self.header) + PageTemplate(id='FirstPage', frames=[self.page_frame], onPage=self.header), + PageTemplate(id='ISOPage', frames=[self.page_frame], onPage=self.header_iso), ]) - def produce(self, student): - # Expert adress - self.story.append(Paragraph(student.expert.title, style_adress)) - self.story.append(Paragraph(student.expert.full_name, style_adress)) - self.story.append(Paragraph(student.expert.street, style_adress)) - self.story.append((Paragraph(student.expert.pcode_city, style_adress))) + def produce(self): + self.add_address(self.student.expert) + ptext = """ -


- La Chaux-de-Fonds, le {current_date}
- N/réf.:ASH/val
-


- Travail de diplôme -


- {expert_title},

- Vous avez accepté de fonctionner comme expert{expert_accord} pour un travail de diplôme de l'un-e de nos - étudiant-e-s. Nous vous remercions très chaleureusement de votre disponibilité.

- En annexe, nous avons l'avantage de vous remettre le travail de {student_civility_full_name}, - ainsi que la grille d'évaluation commune aux deux membres du jury.

- La soutenance de ce travail de diplôme se déroulera le:

- """ +


+ La Chaux-de-Fonds, le {current_date}
+ N/réf.:ASH/val
+


+ Travail de diplôme +


+ {expert_title},

+ Vous avez accepté de fonctionner comme expert{expert_accord} pour un travail de diplôme de l'un-e de nos + étudiant-e-s. Nous vous remercions très chaleureusement de votre disponibilité.

+ En annexe, nous avons l'avantage de vous remettre le travail de {student_civility_full_name}, + ainsi que la grille d'évaluation commune aux deux membres du jury.

+ La soutenance de ce travail de diplôme se déroulera le:

+ """ self.story.append(Paragraph(ptext.format( current_date=django_format(date.today(), 'j F Y'), - expert_title=student.expert.title, - expert_accord=student.expert.adjective_ending, - student_civility_full_name=student.civility_full_name, + expert_title=self.student.expert.title, + expert_accord=self.student.expert.adjective_ending, + student_civility_full_name=self.student.civility_full_name, ), style_normal)) ptext = "
{0} à l'Ecole Santé-social Pierre-Coullery, salle {1}

" self.story.append(Paragraph(ptext.format( - django_format(student.date_exam, 'l j F Y à H\hi'), - student.room + django_format(self.student.date_exam, 'l j F Y à H\hi'), + self.student.room ), style_bold_center)) ptext = """ @@ -389,41 +395,27 @@ class ExpertEDEPDF(EpcBaseDocTemplate): - {internal_expert_civility2} {internal_expert_full_name2}, {internal_expert_role2} """ self.story.append(Paragraph(ptext.format( - internal_expert_civility=student.internal_expert.civility, - internal_expert_full_name=student.internal_expert.full_name, - internal_expert_role=student.internal_expert.role, - expert_title=student.expert.title, - student_civility=student.civility, - student_full_name=student.full_name, - student_role=student.role, - internal_expert_civility2=student.internal_expert.civility, - internal_expert_full_name2=student.internal_expert.full_name, - internal_expert_role2=student.internal_expert.role, + internal_expert_civility=self.student.internal_expert.civility, + internal_expert_full_name=self.student.internal_expert.full_name, + internal_expert_role=self.student.internal_expert.role, + expert_title=self.student.expert.title, + student_civility=self.student.civility, + student_full_name=self.student.full_name, + student_role=self.student.role, + internal_expert_civility2=self.student.internal_expert.civility, + internal_expert_full_name2=self.student.internal_expert.full_name, + internal_expert_role2=self.student.internal_expert.role, resp_filiere=settings.RESP_FILIERE_EDE, ), style_normal)) - self.build(self.story) - -class ExpertCompensationPdfForm(EpcBaseDocTemplate): - - def __init__(self, student): - self.student = student - filename = slugify( - '{0}_{1}'.format(self.student.last_name, self.student.first_name) - ) + '_Indemn_expert.pdf' - super().__init__(filename) - self.addPageTemplates([ - PageTemplate(id='FirstPage', frames=[self.page_frame], onPage=self.header_iso) - ]) - - def produce(self): - self.story.append(Paragraph('Ecole Santé-social Pierre-Coullery', style_bold_title)) - self.story.append(Spacer(0, 0.7 * cm)) + # ISO page + self.story.append(PageBreak()) + self.story.append(NextPageTemplate('ISOPage')) self.add_private_data(self.student.expert) self.story.append(Paragraph( - "Soutenance de {0} {1}, classe {2}".format( + "Mandat: Soutenance de {0} {1}, classe {2}".format( self.student.civility, self.student.full_name, self.student.klass ), style_normal )) diff --git a/stages/tests.py b/stages/tests.py index 17e784c..da2f81b 100644 --- a/stages/tests.py +++ b/stages/tests.py @@ -204,25 +204,6 @@ tél. 032 886 33 00 st.refresh_from_db() self.assertIsNotNone(st.date_soutenance_mailed) - def test_print_letter_ede_expert(self): - st = Student.objects.get(first_name="Albin") - self.client.login(username='me', password='mepassword') - url = reverse('print-pdf-to-expert-ede', args=[st.pk]) - response = self.client.post(url, follow=True) - self.assertContains(response, "Toutes les informations ne sont pas disponibles pour la lettre à l’expert!") - st.date_exam = datetime(2018, 6, 28, 12, 00) - st.room = "B123" - st.expert = CorpContact.objects.get(last_name="Horner") - st.internal_expert = Teacher.objects.get(last_name="Caux") - st.save() - response = self.client.post(url, follow=True) - self.assertEqual( - response['Content-Disposition'], - 'attachment; filename="dupond_albin.pdf"' - ) - self.assertEqual(response['Content-Type'], 'application/pdf') - self.assertGreater(len(response.content), 200) - def test_print_ede_compensation_forms(self): st = Student.objects.get(first_name="Albin") url = reverse('print-expert-compens-ede', args=[st.pk]) @@ -239,7 +220,7 @@ tél. 032 886 33 00 response = self.client.post(url, follow=True) self.assertEqual( response['Content-Disposition'], - 'attachment; filename="dupond_albin_Indemn_expert.pdf"' + 'attachment; filename="dupond_albin_Expert.pdf"' ) self.assertEqual(response['Content-Type'], 'application/pdf') self.assertGreater(len(response.content), 200) diff --git a/stages/views.py b/stages/views.py index c9c1148..30168de 100644 --- a/stages/views.py +++ b/stages/views.py @@ -34,7 +34,7 @@ from .models import ( Klass, Section, Option, Student, Teacher, Corporation, CorpContact, Course, Period, Training, Availability, ) -from .pdf import ExpertCompensationPdfForm, ExpertEDEPDF, UpdateDataFormPDF, MentorCompensationPdfForm +from .pdf import ExpertEdeLetterPdf, UpdateDataFormPDF, MentorCompensationPdfForm from .utils import is_int @@ -938,7 +938,7 @@ def print_expert_ede_compensation_form(request, pk): if not student.is_examination_valid: messages.error(request, "Toutes les informations ne sont pas disponibles pour la lettre à l’expert!") return redirect(reverse("admin:stages_student_change", args=(student.pk,))) - pdf = ExpertCompensationPdfForm(student) + pdf = ExpertEdeLetterPdf(student) pdf.produce() with open(pdf.filename, mode='rb') as fh: