""" Created on 4 déc. 2012 @author: alzo """ from django.views.generic import ListView, TemplateView, DetailView from django.db.models import F, Sum from django.http import HttpResponse 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 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. class HomeView(TemplateView): template_name = 'cms/index.html' def get_context_data(self, **kwargs): context = super(HomeView, self).get_context_data(**kwargs) for d in Domaine.objects.all().order_by('code'): context[d.code] = d for c in Processus.objects.all().order_by('code'): context[c.code] = c for m in Module.objects.all().order_by('code'): 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' model = Domaine class DomaineListView(ListView): template_name = 'cms/domaine_list.html' model = Domaine class ProcessusDetailView(DetailView): template_name = 'cms/processus_detail.html' model = Processus class ProcessusListView(ListView): template_name = 'cms/processus_list.html' model = Processus class ModuleDetailView(DetailView): template_name = 'cms/module_detail.html' model = Module 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): template_name = 'cms/evaluation.html' model = Processus class DocumentListView(ListView): template_name = 'cms/document_list.html' model = Document def get_queryset(self, **kwargs): query = Document.objects.filter(published=True) return query def get_context_data(self, **kwargs): context = super(DocumentListView, self).get_context_data(**kwargs) context['upload'] = UploadDoc.objects.filter(published=True) return context class DocumentDetailView(DetailView): template_name = 'cms/document_detail.html' model = Document class UploadDetailView(DetailView): """ Affiche les documents uploadés à la suite des doc. DocumentsInline """ template_name = 'cms/upload_detail.html' model = UploadDoc def get_context_data(self, **kwargs): 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 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) context['tot2'] = liste.aggregate(Sum(F('sem2')))['sem2__sum'] context['sem3'] = liste.exclude(sem3=0) context['tot3'] = liste.aggregate(Sum(F('sem3')))['sem3__sum'] context['sem4'] = liste.exclude(sem4=0) context['tot4'] = liste.aggregate(Sum(F('sem4')))['sem4__sum'] context['sem5'] = liste.exclude(sem5=0) context['tot5'] = liste.aggregate(Sum(F('sem5')))['sem5__sum'] 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'] 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 = '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 class CompetenceListView(ListView): model = Competence template_name = 'cms/competence_list.html' class TravailPersoListView(ListView): model = Module template_name = 'cms/travail_perso.html' def get_context_data(self, **kwargs): context = ListView.get_context_data(self, **kwargs) context['total_perso'] = Module.objects.aggregate((Sum('travail_perso')))['travail_perso__sum'] 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 """