''' Created on 4 déc. 2012 @author: alzo ''' import os from django.shortcuts import render, render_to_response from django.views.generic import ListView, TemplateView, DetailView from .models import (Domaine, Processus, Module, Competence, Document, UploadDoc, PDFResponse, MyDocTemplate, MyDocTemplateLandscape) from .models import style_normal, style_bold, style_title from django.db.models import F, Sum from django.conf import settings from django.http import HttpResponseRedirect from django.http import HttpResponse #from .forms import DocumentAdminForm from reportlab.pdfgen import canvas from reportlab.platypus import Paragraph, Spacer, PageBreak, Table, TableStyle, Preformatted from reportlab.lib.units import cm from reportlab.lib.enums import TA_LEFT from reportlab.lib import colors from reportlab.lib.colors import HexColor # 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 HomePDFView(TemplateView): template_name = 'cms/index.html' 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'], [Preformatted(d[0].__str__(), style_normal, maxLineLength=40), Preformatted(p[0].__str__(), style_normal, maxLineLength=60) , 'M01' , '' ,'' , '' , '' ,'' ], ['' , '' , 'M02' , '' ,'' , '' , '' ,'' ], ['' , Preformatted(p[1].__str__(), style_normal, maxLineLength=60) , '' , '' ,'' , 'M03' , '' , '' ], ['' , '' , '' , 'M04' ,'' , '' , '' , '' ], [Preformatted(d[1].__str__(), style_normal, maxLineLength=40), Preformatted(p[2].__str__(), style_normal, maxLineLength=60) , 'M05' , '' ,'M06' , '' , '' , '' ], ['' , Preformatted(p[3].__str__(), style_normal, maxLineLength=60) , '' , '' ,'' , 'M07' , '' , 'M09' ], ['' , '' , '' , '' ,'' , 'M08' , '' , '' ], [Preformatted(d[2].__str__(), style_normal, maxLineLength=40), Preformatted(p[4].__str__(), style_normal, maxLineLength=60) , '' , '' ,'' , 'M10' , '' , 'M12' ], ['' , Preformatted(p[5].__str__(), style_normal, maxLineLength=60) , '' , '' ,'' , 'M11' , '' , '' ], [Preformatted(d[3].__str__(), style_normal, maxLineLength=40), Preformatted(p[6].__str__(), style_normal, maxLineLength=60) , '' , '' ,'' , 'M13' , '' , 'M14' ], [Preformatted(d[4].__str__(), style_normal, maxLineLength=40), Preformatted(p[7].__str__(), style_normal, maxLineLength=60) , 'M15' , '' ,'' , '' , '' , '' ], [Preformatted(d[5].__str__(), style_normal, maxLineLength=40), Preformatted(p[8].__str__(), style_normal, maxLineLength=60) , 'M16_1' , '' ,'M16_2' , '' , 'M16_3' , '' ], [Preformatted(d[6].__str__(), style_normal, maxLineLength=40), Preformatted(p[9].__str__(), style_normal, maxLineLength=60), 'M17_1' , '' ,'M17_2' , '' , 'M17_3' , '' ], [Preformatted(d[7].__str__(), style_normal, maxLineLength=40), Preformatted(p[10].__str__(), style_normal, maxLineLength=60) , 'Macc' , '' ,'' , '' , '' , '' ], ] 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'), #('BOX',(0,0),(-1,-1), 0.25, colors.black), ('GRID',(0,0),(-1,-1), 0.25, colors.black), ('SPAN',(0,1), (0,4)), #Domaine 1 ('SPAN',(1,1), (1,2)), ('SPAN',(1,3), (1,4)), ('SPAN',(0,5), (0,7)), #Domaine 2 ('SPAN',(1,6), (1,7)), ('SPAN',(0,8), (0,9)), #Domaine 3 ('SPAN',(5,8), (6,8)), ('SPAN',(5,9), (6,9)), ('SPAN',(2,11), (-1,11)), ('SPAN',(2,12), (3,12)), ('SPAN',(4,12), (5,12)), ('SPAN',(6,12), (7,12)), ('SPAN',(2,13), (3,13)), ('SPAN',(4,13), (5,13)), ('SPAN',(6,13), (7,13)), ('SPAN',(2,14), (-1,14)), ('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), ('BACKGROUND',(0,5), (1,7), colors.red), ('BACKGROUND',(2,5), (2,5), colors.red), ('BACKGROUND',(4,5), (4,5), colors.red), ('BACKGROUND',(5,6), (5,6), colors.red), ('BACKGROperiodesUND',(7,6), (7,6), colors.red), ('BACKGROUND',(5,7), (5,7), colors.red), ('BACKGROUND',(0,8), (1,9), colors.pink), ('BACKGROUND',(5,8), (-1,8), colors.pink), ('BACKGROUND',(5,9), (6,9), colors.pink), ('BACKGROUND',(0,10), (1,10), HexColor('#AD7FA8')), ('BACKGROUND',(5,10), (5,10), HexColor('#AD7FA8')), ('BACKGROUND',(7,10), (7,10), HexColor('#AD7FA8')), ('BACKGROUND',(0,11), (-1,11), HexColor('#729FCF')), ('BACKGROUND',(0,12), (-1,12), colors.lightgreen), ('BACKGROUND',(0,13), (-1,13), colors.white), ('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_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): 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_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('Ressources à acquérir'), Preformatted_right(str_res)], [Preformatted_left('Objectifs à atteindre'), Preformatted_right(str_obj)], #[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'))) context['sem2'] = liste.exclude(sem2 = 0) context['tot2'] = liste.aggregate(Sum(F('sem2'))) context['sem3'] = liste.exclude(sem3 = 0) context['tot3'] = liste.aggregate(Sum(F('sem3'))) context['sem4'] = liste.exclude(sem4 = 0) context['tot4'] = liste.aggregate(Sum(F('sem4'))) context['sem5'] = liste.exclude(sem5 = 0) context['tot5'] = liste.aggregate(Sum(F('sem5'))) context['sem6'] = liste.exclude(sem6 = 0) context['tot6'] = liste.aggregate(Sum(F('sem6'))) context['tot'] = context['tot1']['sem1__sum'] + context['tot2']['sem2__sum'] + context['tot3']['sem3__sum'] + \ context['tot4']['sem4__sum'] + context['tot5']['sem5__sum'] + context['tot6']['sem6__sum'] 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): template_name = 'cms/periodes.html' def render_to_response(self, context, **response_kwargs): response = PDFResponse('Périodes.pdf' ,'Périodes de formation') context = get_context(context) data = [['Semestre 1', '{0} h.'.format(context['tot1']['sem1__sum']),'', 'Semestre 2', '{0} h.'.format(context['tot2']['sem2__sum'])], [context['sem1'][0], '{0} h.'.format(context['sem1'][0].sem1),'', context['sem2'][0], '{0} h.'.format(context['sem2'][0].sem2) ], [context['sem1'][1], '{0} h.'.format(context['sem1'][1].sem1),'', context['sem2'][1], '{0} h.'.format(context['sem2'][1].sem2) ], [context['sem1'][2], '{0} h.'.format(context['sem1'][2].sem1),'', context['sem2'][2], '{0} h.'.format(context['sem2'][2].sem2) ], [context['sem1'][3], '{0} h.'.format(context['sem1'][3].sem1),'', context['sem2'][3], '{0} h.'.format(context['sem2'][3].sem2) ], [context['sem1'][4], '{0} h.'.format(context['sem1'][4].sem1),'', context['sem2'][4], '{0} h.'.format(context['sem2'][4].sem2) ], [context['sem1'][5], '{0} h.'.format(context['sem1'][5].sem1),'', context['sem2'][5], '{0} h.'.format(context['sem2'][5].sem2) ], [context['sem1'][6], '{0} h.'.format(context['sem1'][6].sem1),'', '', ''], ['Semestre 3', '{0} h.'.format(context['tot3']['sem3__sum']),'', 'Semestre 4', '{0} h.'.format(context['tot4']['sem4__sum'])], [context['sem3'][0], '{0} h.'.format(context['sem3'][0].sem3),'', context['sem4'][0], '{0} h.'.format(context['sem4'][0].sem4) ], [context['sem3'][1], '{0} h.'.format(context['sem3'][1].sem3),'', context['sem4'][1], '{0} h.'.format(context['sem4'][1].sem4) ], [context['sem3'][2], '{0} h.'.format(context['sem3'][2].sem3),'', context['sem4'][2], '{0} h.'.format(context['sem4'][2].sem4) ], [context['sem3'][3], '{0} h.'.format(context['sem3'][3].sem3),'', context['sem4'][3], '{0} h.'.format(context['sem4'][3].sem4) ], [context['sem3'][4], '{0} h.'.format(context['sem3'][4].sem3),'', context['sem4'][4], '{0} h.'.format(context['sem4'][4].sem4) ], [context['sem3'][5], '{0} h.'.format(context['sem3'][5].sem3),'', context['sem4'][5], '{0} h.'.format(context['sem4'][5].sem4) ], ['Semestre 5', '{0} h.'.format(context['tot5']['sem5__sum']),'', 'Semestre 6', '{0} h.'.format(context['tot6']['sem6__sum'])], [context['sem5'][0], '{0} h.'.format(context['sem5'][0].sem5),'', context['sem6'][0], '{0} h.'.format(context['sem6'][0].sem6) ], [context['sem5'][1], '{0} h.'.format(context['sem5'][1].sem5),'', context['sem6'][1], '{0} h.'.format(context['sem6'][1].sem6) ], [context['sem5'][2], '{0} h.'.format(context['sem5'][2].sem5),'', context['sem6'][2], '{0} h.'.format(context['sem6'][2].sem6) ], [context['sem5'][3], '{0} h.'.format(context['sem5'][3].sem5),'', context['sem6'][3], '{0} h.'.format(context['sem6'][3].sem6) ], [context['sem5'][4], '{0} h.'.format(context['sem5'][4].sem5),'', context['sem6'][4], '{0} h.'.format(context['sem6'][4].sem6) ], [context['sem5'][5], '{0} h.'.format(context['sem5'][5].sem5),'', '', '' ], [context['sem5'][6], '{0} h.'.format(context['sem5'][6].sem5),'', '', '' ], ] t = Table(data, colWidths=[6.5*cm,1*cm, 1*cm, 6.5*cm, 1*cm], spaceBefore=2*cm, spaceAfter=1.5*cm) t.setStyle(TableStyle([ ('ALIGN',(0,0),(-1,-1),'LEFT'), ('VALIGN',(0,0),(-1,-1),'TOP'), ('LEFTPADDING', (0,0),(-1,-1), 0), ('SIZE', (0,0), (-1,-1), 8), ('ALIGN', (1,0), (1,-1), 'RIGHT'), ('ALIGN', (-1,0), (-1,-1), 'RIGHT'), ('LINEBELOW', (0,0), (1,0), 1, colors.black), ('LINEBELOW', (3,0), (-1,0), 1, colors.black), ('TOPPADDING', (0,8), (-1,8), 15), ('LINEBELOW', (0,8), (1,8), 1, colors.black), ('LINEBELOW', (3,8), (-1,8), 1, colors.black), ('TOPPADDING', (0,15), (-1,15), 15), ('LINEBELOW', (0,15), (1,15), 1, colors.black), ('LINEBELOW', (3,15), (-1,15), 1, colors.black), ('FONT', (0, 0), (-1, 0), 'Helvetica-Bold'), ('FONT', (0, 8), (-1, 8), 'Helvetica-Bold'), ('FONT', (0, 15), (-1, 15), 'Helvetica-Bold'), ])) t.hAlign = 0 response.story.append(t) response.story.append(Paragraph('Total des heures de cours: {0} heures'.format(context['tot']), style_normal)) doc = MyDocTemplate(response) doc.build(response.story) return response """ 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 """