eds/cms/pdf.py
2017-10-30 14:31:02 +01:00

298 lines
13 KiB
Python

from django.http.response import HttpResponse
from django.conf import settings
from reportlab.platypus import SimpleDocTemplate, Spacer, Frame, Paragraph, Preformatted
from reportlab.platypus import Table, TableStyle, Image
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.units import cm
from reportlab.lib.enums import TA_LEFT, TA_CENTER
from reportlab.lib import colors
from reportlab.lib.colors import HexColor
from reportlab.lib.styles import ParagraphStyle as ps
from reportlab.pdfgen import canvas
style_8_c = ps(name='CORPS', fontName='Helvetica', fontSize=6, alignment=TA_CENTER)
style_normal = ps(name='CORPS', fontName='Helvetica', fontSize=9, alignment=TA_LEFT)
style_bold = ps(name='CORPS', fontName='Helvetica-Bold', fontSize=10, alignment=TA_LEFT, leftIndent=0.3*cm)
style_title = ps(name='CORPS', fontName='Helvetica', fontSize=12, alignment=TA_LEFT)
style_adress = ps(name='CORPS', fontName='Helvetica', fontSize=10, alignment=TA_LEFT, leftIndent=300)
class MyDocTemplateES(SimpleDocTemplate):
def __init__(self, filename, title_left, title_right, portrait=True):
if portrait is True:
page_size = A4
column_width = 8 * cm
else:
page_size = landscape(A4)
column_width = 13 * cm
SimpleDocTemplate.__init__(self, filename, pagesize=page_size,
topMargin=0 * cm,
leftMargin=2 * cm,
rightMargin=2 * cm,
bottomMargin=0.5 * cm,
)
self.fileName = filename
im1 = Image(settings.MEDIA_ROOT + 'logo_EPC.png', width=170, height=80)
im2 = Image(settings.MEDIA_ROOT + 'logo_ESNE.png', width=170, height=80)
data = list()
data.append([im1, im2])
data.append([Spacer(0, 0.5 * cm)])
data.append([title_left, title_right])
t = Table(data, colWidths=[column_width] * 2, hAlign=TA_LEFT)
t.setStyle(
TableStyle(
[
('SIZE', (0, 0), (-1, -1), 9),
('FONT', (0, 0), (-1, -1), 'Helvetica-Bold'),
('ALIGN', (0, 0), (0, 0), 'LEFT'),
('ALIGN', (1, 0), (-1, -1), 'RIGHT'),
('LINEABOVE', (0, 2), (-1, 2), 0.5, colors.black),
('LINEBELOW', (0, -1), (-1, -1), 0.5, colors.black),
]
)
)
self.flowable.append(t)
def beforePage(self):
# page number
self.canv.saveState()
self.canv.setFontSize(8)
self.canv.drawCentredString(self.pagesize[0] / 2, 0.5 * cm, "Page : " + str(self.canv.getPageNumber()))
self.canv.restoreState()
class ModulePdf(MyDocTemplateES):
def __init__(self, filename):
self.flowable = list()
MyDocTemplateES.__init__(self, filename, 'Formation EDS', 'Module de formation', portrait=True)
def preformatted_left(self, txt):
return Preformatted(txt, style_normal, maxLineLength=15)
def preformatted_right(self, txt):
return Preformatted(txt, style_normal, maxLineLength=90)
def produce(self, module):
str_comp = ''
for c in module.competence_set.all():
str_comp += '- {0} ({1})\n'.format(c.nom, c.code)
"""
if self.request.user.is_authenticated:
for sc in c.souscompetence_set.all():
str_comp += ' -- {0}\n'.format(sc.nom)
"""
str_scom = ''
for c in module.competence_set.all():
for sc in c.souscompetence_set.all():
str_scom += '- {0} (voir {1})\n'.format(sc.nom, c.code)
str_res = ''
for c in module.ressource_set.all():
str_res += '- {0}\n'.format(c.nom)
str_obj = ''
for c in module.objectif_set.all():
str_obj += '- {0}\n'.format(c.nom)
lines = module.contenu.split('\n')
str_con = ''
for l in lines:
str_con += '{0}\n'.format(l)
self.flowable.append(Spacer(0, 0.5 * cm))
self.flowable.append(Paragraph(module.__str__(), style_bold, ))
self.flowable.append(Spacer(0, 0.5 * cm))
data = [
[self.preformatted_left('Domaine'), self.preformatted_right(module.processus.domaine.__str__())],
[self.preformatted_left('Processus'), self.preformatted_right(module.processus.__str__())],
[self.preformatted_left('Situation emblématique'), self.preformatted_right(module.situation)],
[self.preformatted_left('Compétences visées'), self.preformatted_right(str_comp)],
[self.preformatted_left('Plus-value sur le CFC ASE'), self.preformatted_right(str_scom)],
# [Preformatted_left('Ressources à acquérir'), Preformatted_right(str_res)],
[self.preformatted_left('Objectifs à atteindre'), self.preformatted_right(str_obj)],
[self.preformatted_left('Didactique'), self.preformatted_right(module.didactique)],
# [Preformatted_left('Contenu'), Preformatted_right(str_con)],
[self.preformatted_left('Evaluation'), self.preformatted_right(module.evaluation)],
[self.preformatted_left('Type'), self.preformatted_right('{0}, obligatoire'.format(module.type))],
[self.preformatted_left('Semestre'), self.preformatted_right('Sem. {0}'.format(module.semestre))],
[self.preformatted_left('Présentiel'),
self.preformatted_right('{0} heures'.format(module.periode_presentiel))],
[self.preformatted_left('Travail personnel'),
self.preformatted_right('{0} heures'.format(module.travail_perso))],
[self.preformatted_left('Responsable'),
self.preformatted_right(module.processus.domaine.responsable.descr_pdf())],
]
t = Table(data, colWidths=[3*cm, 13*cm])
t.hAlign = TA_CENTER
t.setStyle(
TableStyle([
('ALIGN', (0, 0), (-1, -1), 'LEFT'),
('VALIGN', (0, 0), (-1, -1), 'TOP'),
('LEFTPADDING', (0, 0), (-1, -1), 0), ]
)
)
self.flowable.append(t)
self.build(self.flowable)
class PlanFormationPdf(MyDocTemplateES):
def __init__(self, filename):
self.flowable = list()
MyDocTemplateES.__init__(self, filename, 'Formation EDS', 'Plan de formation', portrait=False)
def formating(self, el1='', length=40):
el1 = '' if el1 == '' else el1.__str__()
return Preformatted(el1, style_normal, maxLineLength=length)
def produce(self, domain, process):
data = [
['Domaines', 'Processus', 'Sem1', 'Sem2', 'Sem3', 'Sem4', 'Sem5', 'Sem6'],
[self.formating(domain[0]), self.formating(process[0], 60), 'M01', '', '', '', '', ''],
[self.formating(''), self.formating('', 60), 'M02', '', '', '', '', ''],
[self.formating(''), self.formating(process[1], 60), '', '', '', 'M03', '', ''],
[self.formating(''), self.formating('', 60), '', 'M04', '', '', '', ''],
[self.formating(domain[1]), self.formating(process[2], 60), 'M05', '', 'M06', '', '', ''],
[self.formating(''), self.formating(process[3], 60), '', '', '', '', 'M07', 'M09'],
[self.formating(''), self.formating('', 60), '', '', '', '', 'M08', ''],
[self.formating(domain[2]), self.formating(process[4], 60), '', '', 'M10', '', 'M12'],
[self.formating(''), self.formating(process[5], 60), '', '', 'M11', '', ''],
[self.formating(domain[3]), self.formating(process[6], 60), '', '', 'M13', '', '', 'M14'],
[self.formating(domain[4]), self.formating(process[7], 60), 'M15', '', '', '', '', ''],
[self.formating(domain[5]), self.formating(process[8], 60), 'M16_1', '', 'M16_2', '', 'M16_3', ''],
[self.formating(domain[6]), self.formating(process[9], 60), 'M17_1', '', 'M17_2', '', 'M17_3', ''],
[self.formating(domain[7]), self.formating(process[10], 60), 'Macc', '', '', '', '', ''],
]
t = Table(data, colWidths=[7*cm, 9*cm, 1.5*cm, 1.5*cm, 1.5*cm, 1.5*cm, 1.5*cm, 1.5*cm],
spaceBefore=0.5*cm, spaceAfter=1*cm)
t.setStyle(TableStyle([
('SIZE', (0, 0), (-1, -1), 8),
('FONT', (0, 0), (-1, 0), 'Helvetica-Bold'),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('ALIGN', (2, 0), (-1, -1), 'CENTER'),
('GRID', (0, 0), (-1, -1), 0.25, colors.black),
# Domaine 1
('SPAN', (0, 1), (0, 4)),
('SPAN', (1, 1), (1, 2)),
('SPAN', (1, 3), (1, 4)),
('BACKGROUND', (0, 1), (1, 4), colors.orange),
('BACKGROUND', (2, 1), (2, 2), colors.orange),
('BACKGROUND', (5, 3), (5, 3), colors.orange),
('BACKGROUND', (3, 4), (3, 4), colors.orange),
# Domaine 2
('SPAN', (0, 5), (0, 7)),
('BACKGROUND', (0, 5), (1, 7), colors.red),
('BACKGROUND', (2, 5), (2, 5), colors.red),
('BACKGROUND', (4, 5), (4, 5), colors.red),
('BACKGROUND', (6, 6), (6, 6), colors.red),
('BACKGROUND', (7, 6), (7, 6), colors.red),
('BACKGROUND', (6, 7), (6, 7), colors.red),
# Domaine 3
('SPAN', (0, 8), (0, 9)),
('SPAN', (1, 6), (1, 7)),
('SPAN', (4, 8), (5, 8)),
('SPAN', (4, 9), (5, 9)),
('BACKGROUND', (0, 8), (1, 9), colors.pink),
('BACKGROUND', (4, 8), (6, 8), colors.pink),
('BACKGROUND', (4, 9), (5, 9), colors.pink),
# Domaine 4
('BACKGROUND', (0, 10), (1, 10), HexColor('#AD7FA8')),
('BACKGROUND', (4, 10), (4, 10), HexColor('#AD7FA8')),
('BACKGROUND', (7, 10), (7, 10), HexColor('#AD7FA8')),
# Domaine 5
('SPAN', (2, 11), (-1, 11)),
('BACKGROUND', (0, 11), (-1, 11), HexColor('#729FCF')),
# Domaine 6
('SPAN', (2, 12), (3, 12)),
('SPAN', (4, 12), (5, 12)),
('SPAN', (6, 12), (7, 12)),
('BACKGROUND', (0, 12), (-1, 12), colors.lightgreen),
# Domaine 7
('SPAN', (2, 13), (3, 13)),
('SPAN', (4, 13), (5, 13)),
('SPAN', (6, 13), (7, 13)),
('BACKGROUND', (0, 13), (-1, 13), colors.white),
# Domaine 8
('SPAN', (2, 14), (-1, 14)),
('BACKGROUND', (0, 14), (-1, 14), colors.lightgrey),
]))
t.hAlign = TA_CENTER
self.flowable.append(t)
self.build(self.flowable)
class PDFResponse(HttpResponse):
def __init__(self, filename, title='', portrait=True):
HttpResponse.__init__(self, content_type='application/pdf')
self['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
self['Content-Type'] = 'charset=utf-8'
self.story = []
image = Image(settings.MEDIA_ROOT + '/media/header.png', width=400, height=80)
image.hAlign = TA_LEFT
self.story.append(image)
data = [['Filières EDS', title]]
if portrait:
t = Table(data, colWidths=[8*cm, 8*cm])
else:
t = Table(data, colWidths=[11*cm, 11*cm])
t.setStyle(TableStyle([
('ALIGN', (0, 0), (0, 0), 'LEFT'),
('ALIGN', (1, 0), (-1, -1), 'RIGHT'),
('LINEABOVE', (0, 0), (-1, -1), 0.5, colors.black),
('LINEBELOW', (0, -1), (-1, -1), 0.5, colors.black),
]))
t.hAlign = TA_LEFT
self.story.append(t)
class PeriodeFormationPdf(SimpleDocTemplate):
"""Imprime les heures de cours par semestre"""
def __init__(self, filename):
self.flowable = list()
#SimpleDocTemplate.__init__(self, filename) #, 'Formation EDS', 'Périodes de la formation', portrait=True)
c = canvas.Canvas(filename, pagesize=A4)
width, height = A4
im1 = Image(settings.MEDIA_ROOT + 'logo_EPC.png', width=120, height=80)
im2 = Image(settings.MEDIA_ROOT + 'logo_ESNE.png', width=120, height=80)
c.drawImage(settings.MEDIA_ROOT + 'logo_EPC.png', 0, height - 1*cm) # Who needs consistency?
c.drawImage(settings.MEDIA_ROOT + 'logo_ESNE.png', 8*cm, height-1*cm)
c.showPage()
c.save()
def produce_half_year(self, half_year_id, modules, total, canv):
initial_pos_x = [2, 11]
initial_pos_y = [17, 17, 10, 10, 3, 3]
width = 7.5*cm
height = 6.5*cm
x = initial_pos_x[(half_year_id-1) % 2]*cm
y = initial_pos_y[half_year_id-1]*cm
my_frame = Frame(x, y, width, height, showBoundary=1)
data = [['Semestre {0}'.format(half_year_id), '{0} h.'.format(total)]]
for line in modules:
value = getattr(line, 'sem{0}'.format(half_year_id))
data.append([line.nom, '{0} h.'.format(value)])
t = Table(data, colWidths=[7*cm, 1*cm], spaceBefore=0, spaceAfter=0, hAlign=TA_LEFT)
t.setStyle(TableStyle([('ALIGN', (0, 0), (0, 0), 'LEFT'),
('ALIGN', (1, 0), (-1, -1), 'RIGHT'),
('LINEBELOW', (0, 0), (1, 0), 1, colors.black),
('FONT', (0, 0), (-1, 0), 'Helvetica-Bold'), ]))
self.flowable.append(t)
my_frame.addFromList(self.flowable, canv)
# self.build(self.flowable)
def print_total(self, total, canv):
canv.drawString(2*cm, 2*cm, 'Total de la formation: {0} heures'.format(total))