PDF période formation

This commit is contained in:
alazo 2017-10-30 14:31:02 +01:00
parent 83cca59c7e
commit 96100f13c6
12 changed files with 410 additions and 367 deletions

View file

@ -4,21 +4,15 @@ Created on 4 déc. 2012
@author: alzo
"""
import os
import tempfile
from django.views.generic import ListView, TemplateView, DetailView
from django.db.models import F, Sum
from django.http import HttpResponse
from django.conf import settings
from reportlab.platypus import Paragraph, Spacer, Table, TableStyle, Preformatted
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.lib.colors import HexColor
from reportlab.pdfgen import canvas
from cms.pdf import PeriodPDF
from .models import style_normal, style_title
from .models import (Domaine, Processus, Module, Competence, Document, UploadDoc,
PDFResponse, MyDocTemplate, MyDocTemplateLandscape)
# Create your views here.
from cms.pdf import PeriodeFormationPdf, ModulePdf, PlanFormationPdf
from cms.models import (Domaine, Processus, Module, Competence, Document, UploadDoc,)
class HomeView(TemplateView):
@ -34,109 +28,6 @@ class HomeView(TemplateView):
context[m.code] = m
return context
class Element(object):
def __init__(self, el):
self.txt = el.__str__()
class HomePDFView(TemplateView):
template_name = 'cms/index.html'
def formating(self, el1='', length=40):
el1 = '' if el1 == '' else el1.__str__()
return Preformatted(el1, style_normal, maxLineLength=length)
# def pf40(self, txt):
# return Preformatted(txt, style_normal, maxLineLength=40)
def render_to_response(self, context, **response_kwargs):
response = PDFResponse('PlanFormation.pdf', 'Plan de formation', portrait=False)
d = Domaine.objects.all().order_by('code')
p = Processus.objects.all().order_by('code')
data = [
['Domaines', 'Processus', 'Sem1', 'Sem2', 'Sem3', 'Sem4', 'Sem5', 'Sem6'],
[self.formating(d[0]), self.formating(p[0], 60), 'M01', '', '', '', '', ''],
[self.formating(''), self.formating('', 60), 'M02', '', '', '', '', ''],
[self.formating(''), self.formating(p[1], 60), '', '', '', 'M03', '', ''],
[self.formating(''), self.formating('', 60), '', 'M04', '', '', '', ''],
[self.formating(d[1]), self.formating(p[2], 60), 'M05', '', 'M06', '', '', ''],
[self.formating(''), self.formating(p[3], 60), '', '', '', '', 'M07', 'M09'],
[self.formating(''), self.formating('', 60), '', '', '', '', 'M08', ''],
[self.formating(d[2]), self.formating(p[4], 60), '', '', 'M10', '', 'M12'],
[self.formating(''), self.formating(p[5], 60), '', '', 'M11', '', ''],
[self.formating(d[3]), self.formating(p[6], 60), '', '', 'M13', '', '', 'M14'],
[self.formating(d[4]), self.formating(p[7], 60), 'M15', '', '', '', '', ''],
[self.formating(d[5]), self.formating(p[8], 60), 'M16_1', '', 'M16_2', '', 'M16_3', ''],
[self.formating(d[6]), self.formating(p[9], 60), 'M17_1', '', 'M17_2', '', 'M17_3', ''],
[self.formating(d[7]), self.formating(p[10], 60), 'Macc', '', '', '', '', ''],
]
print(data)
t = Table(data, colWidths=[5.5*cm, 8*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 = 0
response.story.append(t)
doc = MyDocTemplateLandscape(response)
doc.build(response.story)
return response
class DomaineDetailView(DetailView):
template_name = 'cms/domaine_detail.html'
@ -166,14 +57,6 @@ class ModuleDetailView(DetailView):
class ModuleListView(ListView):
template_name = 'cms/module_list.html'
model = Module
def preformatted_left(text):
return Preformatted(text, style_normal, maxLineLength=15)
def preformatted_right(text):
return Preformatted(text, style_normal, maxLineLength=110)
class EvaluationView(ListView):
@ -212,88 +95,63 @@ class UploadDetailView(DetailView):
context = super(UploadDetailView, self).get_context_data(**kwargs)
context['fichier'] = self.get_object().docfile.url
return context
class ModulePDF(DetailView):
template_name = 'cms/module_detail.html'
model = Module
def render_to_response(self, context, **response_kwargs):
m = self.get_object()
response = PDFResponse('Module_{0}.pdf'.format(m.code), 'Module de formation')
str_comp = ''
for c in m.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 m.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 m.ressource_set.all():
str_res += '- {0}\n'.format(c.nom)
str_obj = ''
for c in m.objectif_set.all():
str_obj += '- {0}\n'.format(c.nom)
lines = m.contenu.split('\n')
str_con = ''
for l in lines:
str_con += '{0}\n'.format(l)
response.story.append(Spacer(0, 1*cm))
response.story.append(Paragraph(m.__str__(), style_title))
data = [
[preformatted_left('Domaine'), preformatted_right(m.processus.domaine.__str__())],
[preformatted_left('Processus'), preformatted_right(m.processus.__str__())],
[preformatted_left('Situation emblématique'), preformatted_right(m.situation)],
[preformatted_left('Compétences visées'), preformatted_right(str_comp)],
[preformatted_left('Plus-value sur le CFC ASE'), preformatted_right(str_scom)],
# [Preformatted_left('Ressources à acquérir'), Preformatted_right(str_res)],
[preformatted_left('Objectifs à atteindre'), preformatted_right(str_obj)],
[preformatted_left('Didactique'), preformatted_right(m.didactique)],
# [Preformatted_left('Contenu'), Preformatted_right(str_con)],
[preformatted_left('Evaluation'), preformatted_right(m.evaluation)],
[preformatted_left('Type'), preformatted_right('{0}, obligatoire'.format(m.type))],
[preformatted_left('Semestre'), preformatted_right('Sem. {0}'.format(m.semestre))],
[preformatted_left('Présentiel'), preformatted_right('{0} heures'.format(m.periode_presentiel))],
[preformatted_left('Travail personnel'), preformatted_right('{0} heures'.format(m.travail_perso))],
[preformatted_left('Responsable'), preformatted_right(m.processus.domaine.responsable.descr_pdf())],
]
t = Table(data, colWidths=[2.5*cm, 10*cm])
t.setStyle(
TableStyle([
('ALIGN', (0, 0), (-1, -1), 'LEFT'),
('VALIGN', (0, 0), (-1, -1), 'TOP'),
('LEFTPADDING', (0, 0), (-1, -1), 0), ]
)
)
t.hAlign = 0
response.story.append(Spacer(0, 1*cm))
response.story.append(t)
doc = MyDocTemplate(response)
doc.build(response.story)
return response
def print_module_pdf(request, pk):
filename = 'module.pdf'
path = os.path.join(tempfile.gettempdir(), filename)
pdf = ModulePdf(path)
module = Module.objects.get(pk=pk)
pdf.produce(module)
with open(path, mode='rb') as fh:
response = HttpResponse(fh.read(), content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="EDS_module_{0}.pdf"'.format(module.code)
return response
def print_plan_formation(request):
filename = 'plan_formation.pdf'
path = os.path.join(tempfile.gettempdir(), filename)
pdf = PlanFormationPdf(path)
domain = Domaine.objects.all().order_by('code')
process = Processus.objects.all().order_by('code')
pdf.produce(domain, process)
with open(path, mode='rb') as fh:
response = HttpResponse(fh.read(), content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="EDS_plan_formation.pdf"'
return response
def print_periode_formation(request):
filename = 'periode_formation.pdf'
path = os.path.join(tempfile.gettempdir(), filename)
pdf = PeriodeFormationPdf(path)
context = {}
context = get_context(context)
canv = canvas.Canvas(filename)
for semestre_id in range(1, 7):
modules = context['sem{0}'.format(str(semestre_id))]
total = context['tot{0}'.format(str(semestre_id))]
pdf.produce_half_year(semestre_id, modules, total, canv)
pdf.print_total(context['tot'], canv)
canv.save()
with open(filename, mode='rb') as fh:
response = HttpResponse(fh.read(), content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="{0}"'.format(filename)
return response
def get_context(context):
"""
Calcul du nombre de périodes de formation
"""
"""
liste = Module.objects.exclude(periode_presentiel=0)
# context['tot'] = liste.aggregate(Sum(F('periode_presentiel')))
context['sem1'] = liste.exclude(sem1=0)
context['tot1'] = liste.aggregate(Sum(F('sem1')))['sem1__sum']
context['sem2'] = liste.exclude(sem2=0)
@ -307,37 +165,17 @@ def get_context(context):
context['sem6'] = liste.exclude(sem6=0)
context['tot6'] = liste.aggregate(Sum(F('sem6')))['sem6__sum']
context['tot'] = context['tot1'] + context['tot2'] + context['tot3'] + \
context['tot4'] + context['tot5'] + context['tot6']
context['tot'] = context['tot1'] + context['tot2'] + context['tot3'] + context['tot4'] \
+ context['tot5'] + context['tot6']
return context
class PeriodeView(TemplateView):
template_name = 'cms/periodes.html'
def get_context_data(self, **kwargs):
context = TemplateView.get_context_data(self, **kwargs)
return get_context(context)
class PeriodePDFView(TemplateView):
def render_to_response(self, context, **response_kwargs):
context = get_context(context)
filename = os.path.join(settings.MEDIA_ROOT, 'periode.pdf')
pdf = PeriodPDF(filename)
for semestre_id in range(1, 7):
modules = context['sem{0}'.format(str(semestre_id))]
total = context['tot{0}'.format(str(semestre_id))]
pdf.produce_half_year(semestre_id, modules, total)
pdf.print_total(context['tot'])
pdf.canv.save()
with open(filename, mode='rb') as fh:
response = HttpResponse(fh.read(), content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="{0}"'.format(filename)
return response
return get_context(context)
class CompetenceListView(ListView):
@ -355,54 +193,3 @@ class TravailPersoListView(ListView):
context['total_presentiel'] = Module.objects.aggregate((Sum('periode_presentiel')))['periode_presentiel__sum']
context['total_pratique'] = Module.objects.aggregate((Sum('pratique_prof')))['pratique_prof__sum']
return get_context(context)
"""
class AddDocument(TemplateView):
template_name = 'cms/upload.html'
def post(self, request):
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
newdoc = Document(docfile = request.FILES['docfile'])
newdoc.save()
return HttpResponseRedirect('')
def get(self, request):
form = DocumentForm()
return render (request, 'cms/upload.html', {'form': form})
def AddDoc(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
newdoc = Document(docfile = request.FILES['docfile'])
newdoc.save()
return HttpResponseRedirect('')
else:
form = DocumentForm()
documents = Document.objects.all()
return render (request, 'cms/upload.html', {'documents': documents,'form': form})
def Download(request, file_name):
f = os.path.join(settings.MEDIA_ROOT, file_name)
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename={0}'.format(file_name)
response['Content-Length'] = os.stat(f).st_size
return response
def pdf_view(request):
with open(settings.MEDIA_ROOT + 'media/EDS_Calendrier_2017.pdf', 'r') as pdf:
response = HttpResponse(pdf.read().decode('latin-1') , content_type='application/pdf')
response['Content-Disposition'] = 'inline;filename=some_file.pdf'
return response
pdf.closed
"""