From d9d4fd787981477c40906ee5d8b507b98f921a57 Mon Sep 17 00:00:00 2001 From: alazo Date: Sun, 13 Aug 2017 22:58:46 +0200 Subject: [PATCH] PDF_periodes --- cms/admin.py | 25 +- cms/forms.py | 192 ++++++------ cms/migrations/0002_auto_20170419_1333.py | 1 + cms/models.py | 170 ++++------ cms/pdf.py | 129 ++++++++ cms/views.py | 361 ++++++++++------------ common/settings.py | 22 +- common/urls.py | 13 +- pdf/__init__.py | 0 pdf/models.py | 87 ------ templates/admin/base.html | 21 +- templates/admin/base_site.html | 8 +- templates/cms/404.html | 25 +- templates/cms/base.html | 22 +- templates/cms/base_site.html | 52 ++-- templates/cms/competence_list.html | 22 +- templates/cms/document_detail.html | 15 +- templates/cms/document_list.html | 19 +- templates/cms/domaine_detail.html | 23 +- templates/cms/domaine_list.html | 33 +- templates/cms/evaluation.html | 112 +++---- templates/cms/index.html | 224 ++++++++------ templates/cms/module_detail.html | 120 ++++--- templates/cms/module_detail_old.html | 106 +++++-- templates/cms/module_list.html | 17 +- templates/cms/periodes.html | 145 +++++---- templates/cms/processus_detail.html | 51 ++- templates/cms/processus_list.html | 30 +- templates/cms/travail_perso.html | 71 +++-- templates/cms/upload.html | 53 ++-- templates/cms/upload_detail.html | 5 +- 31 files changed, 1175 insertions(+), 999 deletions(-) create mode 100644 cms/pdf.py delete mode 100644 pdf/__init__.py delete mode 100644 pdf/models.py diff --git a/cms/admin.py b/cms/admin.py index bdbb27b..512405c 100644 --- a/cms/admin.py +++ b/cms/admin.py @@ -1,13 +1,12 @@ from django.contrib import admin from .models import (Enseignant, Domaine, Competence, SousCompetence, Objectif, - Ressource, Module, Processus, Document, UploadDoc) + Ressource, Module, Processus, Document, UploadDoc) -from .forms import (ProcessusAdminForm, ProcessusInlineAdminForm, ModuleAdminForm, DomaineAdminForm, CompetenceAdminForm, -SousCompetenceInlineAdminForm, CompetenceInlineAdminForm, ObjectifAdminForm, RessourceAdminForm, -SousCompetenceAdminForm, DocumentAdminForm, UploadAdminForm ) - -# Register your models here. +from .forms import (ProcessusAdminForm, ProcessusInlineAdminForm, ModuleAdminForm, + DomaineAdminForm, CompetenceAdminForm, SousCompetenceInlineAdminForm, + CompetenceInlineAdminForm, ObjectifAdminForm, RessourceAdminForm, + SousCompetenceAdminForm, DocumentAdminForm, UploadAdminForm) class SousCompetenceInline(admin.TabularInline): @@ -19,8 +18,8 @@ class SousCompetenceInline(admin.TabularInline): class CompetenceInline(admin.TabularInline): form = CompetenceInlineAdminForm model = Competence - extra=0 - #template ='templates/admin/cms/processus/edit_inline/tabular.html' + extra = 0 + class SousCompetenceAdmin(admin.ModelAdmin): form = SousCompetenceAdminForm @@ -33,10 +32,10 @@ class RessourceAdmin(admin.ModelAdmin): class ModuleAdmin(admin.ModelAdmin): form = ModuleAdminForm - inlines = [CompetenceInline,] + inlines = [CompetenceInline] extra = 0 fields = (('code', 'nom'), - ('situation'), + 'situation', ('contenu', 'contenu_published'), ('didactique', 'didactique_published'), ('evaluation', 'evaluation_published'), @@ -45,7 +44,7 @@ class ModuleAdmin(admin.ModelAdmin): ('sem1', 'sem2'), ('sem3', 'sem4'), ('sem5', 'sem6'), - ('processus'), + 'processus', ) @@ -60,7 +59,7 @@ class ObjectifAdmin(admin.ModelAdmin): class ProcessusInlineAdmin(admin.TabularInline): form = ProcessusInlineAdminForm model = Processus - extra=0 + extra = 0 class CompetenceAdmin(admin.ModelAdmin): @@ -73,7 +72,7 @@ class CompetenceAdmin(admin.ModelAdmin): class DomaineAdmin(admin.ModelAdmin): list_display = ('nom', 'responsable',) form = DomaineAdminForm - inlines = [ProcessusInlineAdmin,] + inlines = [ProcessusInlineAdmin] class DocumentAdmin(admin.ModelAdmin): diff --git a/cms/forms.py b/cms/forms.py index 49b99a3..3ecfac6 100644 --- a/cms/forms.py +++ b/cms/forms.py @@ -1,168 +1,163 @@ -# -*- encoding: utf-8 -*- -''' +""" Created on 17 nov. 2012 @author: alzo -''' -from .models import (Processus, Module, Domaine, Competence, SousCompetence, Document, - UploadDoc) - +""" from django import forms -#from django.forms import Textarea, TextInput - +from .models import (Processus, Module, Domaine, Competence, SousCompetence, Document, UploadDoc) from tinymce.widgets import TinyMCE - class DocumentAdminForm(forms.ModelForm): class Meta: model = Document - fields = ('titre', 'texte','published') + fields = ('titre', 'texte', 'published') widgets = { 'texte': TinyMCE(attrs={'cols': 120, 'rows': 30}), - } + } class ProcessusAdminForm(forms.ModelForm): - - def __init__(self, *args, **kwargs): - super(ProcessusAdminForm, self).__init__(*args, **kwargs) - #self.fields['nom'].widget.attrs['size']='50' - + class Meta: model = Processus fields = ('code', 'nom', 'domaine', 'description') widgets = { - 'nom': forms.Textarea(attrs={'cols': 125, 'rows':2}), - 'description': forms.Textarea(attrs={'cols': 125, 'rows':8}), - } - -class DomaineAdminForm(forms.ModelForm): - + 'nom': forms.Textarea(attrs={'cols': 125, 'rows': 2}), + 'description': forms.Textarea(attrs={'cols': 125, 'rows': 8}), + } + def __init__(self, *args, **kwargs): - super(DomaineAdminForm, self).__init__(*args, **kwargs) - + super(ProcessusAdminForm, self).__init__(*args, **kwargs) + + +class DomaineAdminForm(forms.ModelForm): + class Meta: model = Domaine fields = ('code', 'nom', 'responsable') widgets = { - 'nom': forms.Textarea(attrs={'cols': 125, 'rows':2}), - } + 'nom': forms.Textarea(attrs={'cols': 125, 'rows': 2}), + } + + def __init__(self, *args, **kwargs): + super(DomaineAdminForm, self).__init__(*args, **kwargs) + class CompetenceAdminForm(forms.ModelForm): - - def __init__(self, *args, **kwargs): - super(CompetenceAdminForm, self).__init__(*args, **kwargs) - + class Meta: model = Competence - fields = ('__all__') + fields = '__all__' widgets = { - 'nom': forms.Textarea(attrs={'cols': 125, 'rows':2}), - } - + 'nom': forms.Textarea(attrs={'cols': 125, 'rows': 2}), + } + + def __init__(self, *args, **kwargs): + super(CompetenceAdminForm, self).__init__(*args, **kwargs) + class SousCompetenceAdminForm(forms.ModelForm): - + + class Meta: + model = SousCompetence + fields = '__all__' + widgets = { + 'nom': forms.Textarea(attrs={'cols': 125, 'rows': 2}), + } + def __init__(self, *args, **kwargs): super(SousCompetenceAdminForm, self).__init__(*args, **kwargs) - + + +class CompetenceInlineAdminForm(forms.ModelForm): + class Meta: model = SousCompetence - fields = ('__all__') + fields = '__all__' widgets = { - 'nom': forms.Textarea(attrs={'cols': 125, 'rows':2}), - } - - -class CompetenceInlineAdminForm(forms.ModelForm): - + 'code': forms.Textarea(attrs={'cols': 5, 'rows': 1}), + 'nom': forms.Textarea(attrs={'cols': 125, 'rows': 2}), + } + def __init__(self, *args, **kwargs): super(CompetenceInlineAdminForm, self).__init__(*args, **kwargs) - + + +class SousCompetenceInlineAdminForm(forms.ModelForm): + class Meta: model = SousCompetence - fields = ('__all__') + fields = '__all__' widgets = { - 'code': forms.Textarea(attrs={'cols': 5, 'rows':1}), - 'nom': forms.Textarea(attrs={'cols': 125, 'rows':2}), - } - - -class SousCompetenceInlineAdminForm(forms.ModelForm): - + 'code': forms.Textarea(attrs={'cols': 5, 'rows': 1}), + 'nom': forms.Textarea(attrs={'cols': 125, 'rows': 1}), + } + def __init__(self, *args, **kwargs): super(SousCompetenceInlineAdminForm, self).__init__(*args, **kwargs) - - class Meta: - model = SousCompetence - fields = ('__all__') - widgets = { - 'code': forms.Textarea(attrs={'cols': 5, 'rows':1}), - 'nom': forms.Textarea(attrs={'cols': 125, 'rows':1}), - } class ProcessusInlineAdminForm(forms.ModelForm): - + + class Meta: + model = SousCompetence + fields = '__all__' + widgets = { + 'code': forms.Textarea(attrs={'cols': 5, 'rows': 1}), + 'nom': forms.Textarea(attrs={'cols': 75, 'rows': 4}), + 'description': forms.Textarea(attrs={'cols': 95, 'rows': 6}), + } + def __init__(self, *args, **kwargs): super(ProcessusInlineAdminForm, self).__init__(*args, **kwargs) - - class Meta: - model = SousCompetence - fields = ('__all__') - widgets = { - 'code': forms.Textarea(attrs={'cols': 5, 'rows':1}), - 'nom': forms.Textarea(attrs={'cols': 75, 'rows':4}), - 'description': forms.Textarea(attrs={'cols': 95, 'rows':6}), - } + class ObjectifAdminForm(forms.ModelForm): - - def __init__(self, *args, **kwargs): - super(ObjectifAdminForm, self).__init__(*args, **kwargs) - + class Meta: model = SousCompetence - fields = ('__all__') + fields = '__all__' widgets = { - 'nom': forms.Textarea(attrs={'cols': 125, 'rows':2}), - } + 'nom': forms.Textarea(attrs={'cols': 125, 'rows': 2}), + } + + def __init__(self, *args, **kwargs): + super(ObjectifAdminForm, self).__init__(*args, **kwargs) class RessourceAdminForm(forms.ModelForm): - - def __init__(self, *args, **kwargs): - super(RessourceAdminForm, self).__init__(*args, **kwargs) - + class Meta: model = SousCompetence - fields = ('__all__') + fields = '__all__' widgets = { - 'nom': forms.Textarea(attrs={'cols': 125, 'rows':3}), - } + 'nom': forms.Textarea(attrs={'cols': 125, 'rows': 3}), + } + + def __init__(self, *args, **kwargs): + super(RessourceAdminForm, self).__init__(*args, **kwargs) + - class ModuleAdminForm(forms.ModelForm): + class Meta: + model = Module + fields = '__all__' + widgets = { + 'nom': forms.Textarea(attrs={'cols': 125, 'rows': 2}), + 'description': forms.Textarea(attrs={'cols': 125, 'rows': 4}), + 'situation': forms.Textarea(attrs={'cols': 125, 'rows': 6}), + 'contenu': forms.Textarea(attrs={'cols': 125, 'rows': 4}), + 'didactique': forms.Textarea(attrs={'cols': 125, 'rows': 2}), + 'evaluation': forms.Textarea(attrs={'cols': 125, 'rows': 2}), + } + def __init__(self, *args, **kwargs): super(ModuleAdminForm, self).__init__(*args, **kwargs) - #self.fields['nom'].widget.attrs['size']='50' - - class Meta: - model = Module - fields = ('__all__') - widgets = { - 'nom': forms.Textarea(attrs={'cols': 125, 'rows':2}), - 'description': forms.Textarea(attrs={'cols': 125, 'rows':4}), - 'situation': forms.Textarea(attrs={'cols': 125, 'rows':6}), - 'contenu': forms.Textarea(attrs={'cols': 125, 'rows':4}), - 'didactique': forms.Textarea(attrs={'cols': 125, 'rows':2}), - 'evaluation': forms.Textarea(attrs={'cols': 125, 'rows':2}), - } class UploadAdminForm(forms.ModelForm): @@ -170,4 +165,3 @@ class UploadAdminForm(forms.ModelForm): class Meta: model = UploadDoc fields = ('titre', 'docfile', 'published', ) - \ No newline at end of file diff --git a/cms/migrations/0002_auto_20170419_1333.py b/cms/migrations/0002_auto_20170419_1333.py index e4b0218..eb0ad1a 100644 --- a/cms/migrations/0002_auto_20170419_1333.py +++ b/cms/migrations/0002_auto_20170419_1333.py @@ -21,6 +21,7 @@ class Migration(migrations.Migration): ('published', models.BooleanField(default=False)), ], ), + migrations.RemoveField( model_name='document', name='docfile', diff --git a/cms/models.py b/cms/models.py index bb9e88c..352dfdb 100644 --- a/cms/models.py +++ b/cms/models.py @@ -1,50 +1,52 @@ # -*- encoding: utf-8 -*- -''' +""" Created on 17 nov. 2012 @author: alzo -''' +""" + from django.db import models from django.http.response import HttpResponse from django.conf import settings from tinymce import models as tinymce_models from reportlab.platypus import SimpleDocTemplate -from reportlab.platypus import Paragraph, Spacer, PageBreak, Table, TableStyle, Image -from reportlab.graphics.shapes import Line +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.styles import ParagraphStyle as PS -style_8_c = PS(name='CORPS', fontName='Helvetica', fontSize=6, alignment = TA_CENTER) -style_normal = PS(name='CORPS', fontName='Helvetica', fontSize=8, alignment = TA_LEFT) -style_bold = PS(name='CORPS', fontName='Helvetica-Bold', fontSize=10, alignment = TA_LEFT) -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) -# Create your models here. -CHOIX_TYPE_SAVOIR = ( - ('Savoir','savoir'), - ('Savoir méthodologique','savoir méthodologique'), - ('Savoir relationnel','savoir relationnel'), +style_8_c = PS(name='CORPS', fontName='Helvetica', fontSize=6, alignment=TA_CENTER) +style_normal = PS(name='CORPS', fontName='Helvetica', fontSize=8, alignment=TA_LEFT) +style_bold = PS(name='CORPS', fontName='Helvetica-Bold', fontSize=10, alignment=TA_LEFT) +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) + + +CHOIX_TYPE_SAVOIR = ( + ('Savoir', 'savoir'), + ('Savoir méthodologique', 'savoir méthodologique'), + ('Savoir relationnel', 'savoir relationnel'), ) + CHOIX_TYPE_MODULE = ( ('Spécifique', 'spécifique'), ('Transversal', 'transversal'), ) -class Enseignant(models.Model): - class Meta: - ordering =('nom',) - - sigle = models.CharField(max_length= 5, blank=True, default='') +class Enseignant(models.Model): + sigle = models.CharField(max_length=5, blank=True, default='') nom = models.CharField(max_length=20, blank=True, default='') prenom = models.CharField(max_length=20, blank=True, default='') email = models.EmailField(blank=True, default='') - + + class Meta: + ordering = ('nom',) + def __str__(self): return '{0} {1}'.format(self.nom, self.prenom) @@ -56,52 +58,30 @@ class Enseignant(models.Model): class Domaine(models.Model): - - class Meta: - ordering = ('code',) - code = models.CharField(max_length=20, blank=True) nom = models.CharField(max_length=200, blank=False) responsable = models.ForeignKey(Enseignant, null=True, default=None) - #height_screen = 50 - + class Meta: + ordering = ('code', ) + def __str__(self): return '{0} - {1}'.format(self.code, self.nom) def url(self): return "{1}".format(self.id, self.__str__()) - - """ - def svg(self): - processus = self.processus_set.all() - svg = '' - txt = '{1}' - height_frame = processus.count()* self.height_screen - color = settings.DOMAINE_COULEURS[self.code] - return svg.format(20, height_frame , color) + txt.format(50, self.__str__()) - - def json(self): - dic_js = {} - dic_js['{code'] = self.code - dic_js['nom'] = self.nom - dic_js['resp'] = self.responsable.nom - - return '{' - """ class Processus(models.Model): - - class Meta: - ordering = ('code',) - verbose_name_plural = 'processus' - code = models.CharField(max_length=20, blank=True) nom = models.CharField(max_length=200, blank=False) domaine = models.ForeignKey(Domaine, null=False) description = models.TextField(default='') - + + class Meta: + ordering = ('code',) + verbose_name_plural = 'processus' + def __str__(self): return '{0} - {1}'.format(self.code, self.nom) @@ -110,21 +90,16 @@ class Processus(models.Model): class Module(models.Model): - - class Meta: - ordering = ('code',) - code = models.CharField(max_length=10, blank=False, default='Code') nom = models.CharField(max_length=100, blank=False, default='Nom du module') - type = models.CharField(max_length=20, choices= CHOIX_TYPE_MODULE) + type = models.CharField(max_length=20, choices=CHOIX_TYPE_MODULE) situation = models.TextField() evaluation = models.TextField() contenu = models.TextField() periode_presentiel = models.IntegerField(verbose_name='Présentiel') - travail_perso = models.IntegerField(verbose_name = 'Travail personnel') + travail_perso = models.IntegerField(verbose_name='Travail personnel') pratique_prof = models.IntegerField(default=0, verbose_name='Pratique prof.') didactique = models.TextField() - evaluation = models.TextField() sem1 = models.IntegerField(default=0) sem2 = models.IntegerField(default=0) @@ -138,7 +113,10 @@ class Module(models.Model): didactique_published = models.BooleanField(default=False) evaluation_published = models.BooleanField(default=False) contenu_published = models.BooleanField(default=False) - + + class Meta: + ordering = ('code',) + def __str__(self): return '{0} - {1}'.format(self.code, self.nom) @@ -150,58 +128,52 @@ class Module(models.Model): class Competence(models.Model): - - class Meta: - ordering = ('code',) - verbose_name = 'compétence' - code = models.CharField(max_length=20, blank=True) nom = models.CharField(max_length=250, blank=False) type = models.CharField(max_length=35, blank=True, default='') module = models.ForeignKey(Module, null=True, default=None) proces_eval = models.ForeignKey(Processus, null=True, default=True) - list_display = ('code', 'nom', 'type','proces_eval') - + list_display = ('code', 'nom', 'type', 'proces_eval') + + class Meta: + ordering = ('code',) + verbose_name = 'compétence' + def __str__(self): return '{0} - {1}'.format(self.code, self.nom) class SousCompetence(models.Model): + code = models.CharField(max_length=20, blank=True) + nom = models.CharField(max_length=250, blank=False) + competence = models.ForeignKey(Competence, null=False) class Meta: ordering = ('code',) verbose_name = 'sous-compétence' - - code = models.CharField(max_length=20, blank=True) - nom = models.CharField(max_length=250, blank=False) - competence = models.ForeignKey(Competence, null=False) - + def __str__(self): return '{0} - {1}'.format(self.code, self.nom) class Ressource(models.Model): - nom = models.CharField(max_length=200, blank=False) - type = models.CharField(max_length=30, choices = CHOIX_TYPE_SAVOIR, default='Savoir') - module=models.ForeignKey(Module, null=True, default=None) + type = models.CharField(max_length=30, choices=CHOIX_TYPE_SAVOIR, default='Savoir') + module = models.ForeignKey(Module, null=True, default=None) def __str__(self): return '{0}'.format(self.nom) class Objectif(models.Model): - nom = models.CharField(max_length=200, blank=False) - module=models.ForeignKey(Module, null=True, default=None) + module = models.ForeignKey(Module, null=True, default=None) def __str__(self): return '{0}'.format(self.nom) class Document(models.Model): - - #docfile = models.FileField(upload_to='media/') titre = models.CharField(max_length=128, blank=True) texte = tinymce_models.HTMLField(blank=True,) published = models.BooleanField(default=False) @@ -211,23 +183,16 @@ class Document(models.Model): class UploadDoc(models.Model): - - class Meta: - verbose_name= 'UploadDoc' - docfile = models.FileField(upload_to='doc/') titre = models.CharField(max_length=100, blank=False) published = models.BooleanField(default=False) - + + class Meta: + verbose_name = 'UploadDoc' + def __str__(self): return self.titre -""" -class OffreEmploi(models.Model): - source = models.CharField(max_lenght=200, blank=False) - descr = model.HTMLField(blank=False) - published = models.BooleanField(default=False) -""" - + class PDFResponse(HttpResponse): @@ -238,20 +203,18 @@ class PDFResponse(HttpResponse): self.story = [] image = Image(settings.MEDIA_ROOT + '/media/header.png', width=520, height=75) image.hAlign = TA_LEFT - self.story.append(image) - #self.story.append(Spacer(0,1*cm)) - - data = [['Filières EDS', title]] + data = list(['Filières EDS', title]) if portrait: - t = Table(data, colWidths=[8*cm,8*cm]) + 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 = 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) @@ -270,7 +233,7 @@ class MyDocTemplate(SimpleDocTemplate): # page number self.canv.saveState() self.canv.setFontSize(8) - self.canv.drawCentredString(self.CENTRE_WIDTH,1*cm,"Page : " + str(self.canv.getPageNumber())) + self.canv.drawCentredString(self.CENTRE_WIDTH, 1*cm, "Page : " + str(self.canv.getPageNumber())) self.canv.restoreState() @@ -288,8 +251,5 @@ class MyDocTemplateLandscape(SimpleDocTemplate): # page number self.canv.saveState() self.canv.setFontSize(8) - self.canv.drawCentredString(self.CENTRE_WIDTH,1*cm,"Page : " + str(self.canv.getPageNumber())) + self.canv.drawCentredString(self.CENTRE_WIDTH, 1*cm, "Page : " + str(self.canv.getPageNumber())) self.canv.restoreState() - - - \ No newline at end of file diff --git a/cms/pdf.py b/cms/pdf.py new file mode 100644 index 0000000..f31be55 --- /dev/null +++ b/cms/pdf.py @@ -0,0 +1,129 @@ + +from django.http.response import HttpResponse +from django.conf import settings + +from reportlab.pdfgen import canvas +from reportlab.platypus import SimpleDocTemplate, Frame +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.styles import ParagraphStyle as PS + + +style_8_c = PS(name='CORPS', fontName='Helvetica', fontSize=6, alignment=TA_CENTER) +style_normal = PS(name='CORPS', fontName='Helvetica', fontSize=8, alignment=TA_LEFT) +style_bold = PS(name='CORPS', fontName='Helvetica-Bold', fontSize=10, alignment=TA_LEFT) +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 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 MyDocTemplate(SimpleDocTemplate): + + def __init__(self, name): + SimpleDocTemplate.__init__(self, name, pagesize=A4, topMargin=0.5*cm, leftMargin=1*cm) + self.fileName = name + self.PAGE_WIDTH = A4[0] + self.PAGE_HEIGHT = A4[1] + self.CENTRE_WIDTH = self.PAGE_WIDTH/2.0 + self.CENTRE_HEIGHT = self.PAGE_HEIGHT/2.0 + + def beforePage(self): + # page number + self.canv.saveState() + self.canv.setFontSize(8) + self.canv.drawCentredString(self.CENTRE_WIDTH, 1*cm, "Page : " + str(self.canv.getPageNumber())) + self.canv.restoreState() + + +class MyDocTemplateLandscape(SimpleDocTemplate): + + def __init__(self, name): + SimpleDocTemplate.__init__(self, name, pagesize=landscape(A4), topMargin=0*cm, leftMargin=2*cm) + self.fileName = name + self.PAGE_WIDTH = A4[1] + self.PAGE_HEIGHT = A4[0] + self.CENTRE_WIDTH = self.PAGE_WIDTH/2.0 + self.CENTRE_HEIGHT = self.PAGE_HEIGHT/2.0 + + def beforePage(self): + # page number + self.canv.saveState() + self.canv.setFontSize(8) + self.canv.drawCentredString(self.CENTRE_WIDTH, 1*cm, "Page : " + str(self.canv.getPageNumber())) + self.canv.restoreState() + + +class PeriodPDF(object): + """Imprime les heures de cours par semestre""" + def __init__(self, filename): + self.canv = canvas.Canvas(filename, pagesize=A4) + self.canv.setPageCompression(0) + self.canv.setFont('Helvetica', 9) + header_frame = Frame(1.2*cm, 24*cm, 18*cm, 5*cm, showBoundary=0) + story = [] + image = Image(settings.MEDIA_ROOT + 'logo.png', width=520, height=90) + story.append(image) + data = [['Filières EDS', 'Périodes de formation']] + t = Table(data, colWidths=[8.5*cm, 8.5*cm], spaceBefore=0, spaceAfter=0, hAlign=TA_LEFT) + 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), + ])) + story.append(t) + header_frame.addFromList(story, self.canv) + + def produce_half_year(self, half_year_id, modules, total): + initial_pos_x = [2, 11] + initial_pos_y = [17, 17, 10, 10, 3, 3] + width = 7*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=0) + 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'), ])) + story = [t] + my_frame.addFromList(story, self.canv) + + def print_total(self, total): + self.canv.drawString(2*cm, 2*cm, 'Total de la formation: {0} heures'.format(total)) diff --git a/cms/views.py b/cms/views.py index ad90270..d51f92c 100644 --- a/cms/views.py +++ b/cms/views.py @@ -1,24 +1,24 @@ -''' +""" Created on 4 déc. 2012 @author: alzo -''' - +""" 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.http import HttpResponse - -from reportlab.platypus import Paragraph, Spacer, PageBreak, Table, TableStyle, Preformatted +from reportlab.platypus import Paragraph, Spacer, 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 +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' @@ -26,116 +26,113 @@ class HomeView(TemplateView): 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, top_left, bottom_right): - self.txt = el.__str__() + def __init__(self, el): + self.txt = el.__str__() + + class HomePDFView(TemplateView): template_name = 'cms/index.html' - - def formating(self, el1=None, length=40 ): - el1 = '' if el1 is None else el1.__str__() - + + 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 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) + 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(None), self.formating(None, 60) , 'M02' , '' ,'' , '' , '' ,'' ], - [self.formating(None), self.formating(p[1], 60) , '' , '' ,'' , 'M03' , '' , '' ], - [self.formating(None), self.formating(None, 60) , '' , 'M04' ,'' , '' , '' , '' ], - [self.formating(d[1]), self.formating(p[2], 60) , 'M05' , '' ,'M06' , '' , '' , '' ], - [self.formating(None), self.formating(p[3], 60) , '' , '' ,'' , '' , 'M07' , 'M09' ], - [self.formating(None), self.formating(None, 60) , '' , '' ,'' ,'' , 'M08' , '' ], - [self.formating(d[2]), self.formating(p[4], 60), '' , '' , 'M10' , '' , 'M12' ], - [self.formating(None), 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' , '' ,'' , '' , '' , '' ], - ] + 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 = 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), + ('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 @@ -169,18 +166,19 @@ class ModuleListView(ListView): model = Module -def Preformatted_left(text): +def preformatted_left(text): return Preformatted(text, style_normal, maxLineLength=15) -def Preformatted_right(text): +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 @@ -188,8 +186,7 @@ class DocumentListView(ListView): 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) @@ -197,7 +194,7 @@ class DocumentListView(ListView): class DocumentDetailView(DetailView): - template_name ='cms/document_detail.html' + template_name = 'cms/document_detail.html' model = Document @@ -221,7 +218,7 @@ class ModulePDF(DetailView): def render_to_response(self, context, **response_kwargs): m = self.get_object() - response = PDFResponse('Module_{0}.pdf'.format(m.code) ,'Module de formation') + response = PDFResponse('Module_{0}.pdf'.format(m.code), 'Module de formation') str_comp = '' for c in m.competence_set.all(): @@ -251,32 +248,34 @@ class ModulePDF(DetailView): for l in lines: str_con += '{0}\n'.format(l) - response.story.append(Spacer(0,1*cm)) + 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)) + 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) @@ -288,24 +287,25 @@ 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'))) + 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'] - 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 @@ -316,74 +316,26 @@ class PeriodeView(TemplateView): context = TemplateView.get_context_data(self, **kwargs) return get_context(context) - -class PeriodePDFView(TemplateView): - template_name = 'cms/periodes.html' - + +class PeriodePDFView(TemplateView): + 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) - + 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' @@ -400,10 +352,7 @@ class TravailPersoListView(ListView): context['total_pratique'] = Module.objects.aggregate((Sum('pratique_prof')))['pratique_prof__sum'] return get_context(context) - - - """ class AddDocument(TemplateView): template_name = 'cms/upload.html' diff --git a/common/settings.py b/common/settings.py index d031d8d..475c32d 100644 --- a/common/settings.py +++ b/common/settings.py @@ -39,9 +39,10 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'chartjs', 'tinymce', - 'cms', + 'cms', ] + MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -72,9 +73,6 @@ TEMPLATES = [ WSGI_APPLICATION = 'common.wsgi.application' - - - # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators @@ -128,10 +126,18 @@ STUDENT_IMPORT_MAPPING = { 'Email élève': 'email_rpn', 'Date nais. élève': 'date_naissance', 'Classe': 'klasse', - } -DOMAINE_COULEURS = {'D1':'#fcaf3e', 'D2': '#cc0000', 'D3': '#ef896b', 'D4': '#ad7fa8', 'D5': '#729fcf', 'D6':'#73d216', 'D7':'#ffffff', 'D8':'#babdb6' } +DOMAINE_COULEURS = { + 'D1': '#fcaf3e', + 'D2': '#cc0000', + 'D3': '#ef896b', + 'D4': '#ad7fa8', + 'D5': '#729fcf', + 'D6': '#73d216', + 'D7': '#ffffff', + 'D8': '#babdb6' +} TINYMCE_JS_URL = MEDIA_URL + 'js/tiny_mce/tiny_mce.js' TINYMCE_JS_ROOT = MEDIA_ROOT + 'js/tiny_mce' @@ -145,6 +151,4 @@ TINYMCE_DEFAULT_CONFIG = { TINYMCE_SPELLCHECKER = True TINYMCE_COMPRESSOR = True -from .local_settings import * - - +from .local_settings import * \ No newline at end of file diff --git a/common/urls.py b/common/urls.py index e78a002..21855c0 100644 --- a/common/urls.py +++ b/common/urls.py @@ -15,10 +15,11 @@ Including another URLconf """ from django.conf.urls import url, include from django.contrib import admin -from cms import views from django.conf import settings from django.conf.urls.static import static +from cms import views + urlpatterns = [ url(r'^$', views.HomeView.as_view(), name='home'), url(r'^plan_pdf/$', views.HomePDFView.as_view(), name='plan-pdf'), @@ -34,15 +35,15 @@ urlpatterns = [ url(r'^evaluation/$', views.EvaluationView.as_view(), name='evaluation'), url(r'^competences/$', views.CompetenceListView.as_view(), name='competences'), url(r'^travail/$', views.TravailPersoListView.as_view(), name='travail'), - #url(r'^upload/$', views.AddDocument.as_view(), name='upload'), - #url(r'^download/(?P.+)$', views.Download, name='download'), - #url(r'^calendrier/$', views.pdf_view, name='pdf-view'), + # url(r'^upload/$', views.AddDocument.as_view(), name='upload'), + # url(r'^download/(?P.+)$', views.Download, name='download'), + # url(r'^calendrier/$', views.pdf_view, name='pdf-view'), url(r'^module_pdf/(?P\d+)$', views.ModulePDF.as_view(), name='module-pdf'), url(r'^documents/$', views.DocumentListView.as_view(), name='document-list'), url(r'^document/(?P\d+)$', views.DocumentDetailView.as_view(), name='document-detail'), url(r'^upload/(?P\d+)$', views.UploadDetailView.as_view(), name='upload-detail'), - #url(r'^emplois/$', views.EmploiListView.as_view(), name='emploi-list'), + # url(r'^emplois/$', views.EmploiListView.as_view(), name='emploi-list'), url(r'^tinymce/', include('tinymce.urls'), name='tinymce-js'), -] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT ) +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/pdf/__init__.py b/pdf/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pdf/models.py b/pdf/models.py deleted file mode 100644 index be38423..0000000 --- a/pdf/models.py +++ /dev/null @@ -1,87 +0,0 @@ - -from django.http.response import HttpResponse -from django.conf import settings - -from reportlab.platypus import SimpleDocTemplate - -from reportlab.platypus import Paragraph, Spacer, PageBreak, Table, TableStyle, Image -from reportlab.graphics.shapes import Line -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.styles import ParagraphStyle as PS -style_8_c = PS(name='CORPS', fontName='Helvetica', fontSize=6, alignment = TA_CENTER) -style_normal = PS(name='CORPS', fontName='Helvetica', fontSize=8, alignment = TA_LEFT) -style_bold = PS(name='CORPS', fontName='Helvetica-Bold', fontSize=10, alignment = TA_LEFT) -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 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=480, height=80) - image.hAlign = TA_LEFT - - self.story.append(image) - #self.story.append(Spacer(0,1*cm)) - - 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 MyDocTemplate(SimpleDocTemplate): - - def __init__(self, name): - SimpleDocTemplate.__init__(self, name, pagesize=A4, topMargin=0*cm) - self.fileName = name - self.PAGE_WIDTH = A4[0] - self.PAGE_HEIGHT = A4[1] - self.CENTRE_WIDTH = self.PAGE_WIDTH/2.0 - self.CENTRE_HEIGHT = self.PAGE_HEIGHT/2.0 - - - def beforePage(self): - # page number - self.canv.saveState() - self.canv.setFontSize(8) - self.canv.drawCentredString(self.CENTRE_WIDTH,1*cm,"Page : " + str(self.canv.getPageNumber())) - self.canv.restoreState() - - - -class MyDocTemplateLandscape(SimpleDocTemplate): - - def __init__(self, name): - SimpleDocTemplate.__init__(self, name, pagesize=landscape(A4), topMargin=0*cm, leftMargin=2*cm) - self.fileName = name - self.PAGE_WIDTH = A4[1] - self.PAGE_HEIGHT = A4[0] - self.CENTRE_WIDTH = self.PAGE_WIDTH/2.0 - self.CENTRE_HEIGHT = self.PAGE_HEIGHT/2.0 - - def beforePage(self): - # page number - self.canv.saveState() - self.canv.setFontSize(8) - self.canv.drawCentredString(self.CENTRE_WIDTH,1*cm,"Page : " + str(self.canv.getPageNumber())) - self.canv.restoreState() - - \ No newline at end of file diff --git a/templates/admin/base.html b/templates/admin/base.html index 0bc119e..e58ca4f 100644 --- a/templates/admin/base.html +++ b/templates/admin/base.html @@ -2,15 +2,18 @@ {% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} -{% block title %}{% endblock %} - -{% block extrastyle %}{% endblock %} -{% if LANGUAGE_BIDI %}{% endif %} -{% block extrahead %} -{% endblock %} - - -{% block blockbots %}{% endblock %} + {% block title %}{% endblock %} + + {% block extrastyle %}{% endblock %} + {% if LANGUAGE_BIDI %} + + {% endif %} + {% block extrahead %} + + {% endblock %} + {% block blockbots %} + + {% endblock %} {% load i18n %} diff --git a/templates/admin/base_site.html b/templates/admin/base_site.html index e94353f..b90c23b 100644 --- a/templates/admin/base_site.html +++ b/templates/admin/base_site.html @@ -1,15 +1,13 @@ {% extends "./base.html" %} - {% block title %}EDS{% endblock %} {% block branding %} -

{{ site_header|default:_('Django administration') }}

+

{{ site_header|default:_('Django administration') }}

{% endblock %} {% block nav-global %}{% endblock %} {% block breadcrumbs %} - {% endblock %} diff --git a/templates/cms/index.html b/templates/cms/index.html index 29f935f..5d22547 100644 --- a/templates/cms/index.html +++ b/templates/cms/index.html @@ -7,99 +7,145 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
DomainesProcessusSem1Sem2Sem3Sem4Sem5Sem6
{{D1.url|safe}}{{P01.url|safe}}{{M01.url_code|safe}}     
{{M02.url_code|safe}}     
{{P02.url|safe}}  {{M03.url_code|safe}}  
{{ M04.url_code|safe }}    
{{D2.url|safe}}{{P03.url|safe}}{{M05.url_code|safe}} {{M06.url_code|safe}}   
{{P04.url|safe}}   {{M07.url_code|safe}}{{M09.url_code|safe}}
   {{M08.url_code|safe}} 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + - - - - - - -
DomainesProcessusSem1Sem2Sem3Sem4Sem5Sem6
{{D1.url|safe}}{{P01.url|safe}}{{M01.url_code|safe}}     
{{M02.url_code|safe}}     
{{P02.url|safe}}  {{M03.url_code|safe}}  
{{D3.url|safe}}{{P05.url|safe}}  {{M10.url_code|safe}}{{M12.url_code|safe}} 
{{P06.url|safe}}  {{M11.url_code|safe}}  
{{D4.url|safe}}{{P07.url|safe}}  {{M13.url_code|safe}}  {{M14.url_code|safe}}
{{ M04.url_code|safe }}    
{{D2.url|safe}}{{P03.url|safe}}{{M05.url_code|safe}} {{M06.url_code|safe}}   
{{P04.url|safe}}   {{M07.url_code|safe}}{{M09.url_code|safe}}
   {{M08.url_code|safe}} 
{{D5.url|safe}}{{P08.url|safe}}{{M15.url_code|safe}}
{{D3.url|safe}}{{P05.url|safe}}  {{M10.url_code|safe}}{{M12.url_code|safe}} 
{{P06.url|safe}}  {{M11.url_code|safe}}  
{{D4.url|safe}}{{P07.url|safe}}  {{M13.url_code|safe}}  {{M14.url_code|safe}}
{{D6.url|safe}}{{P09.url|safe}}{{M16_1a.url_code|safe}} / {{M16_1b.url_code|safe}} / {{M16_1c.url_code|safe}} / {{M16_1d.url_code|safe}} / {{M16_1e.url_code|safe}}{{M16_2a.url_code|safe}} / {{M16_2b.url_code|safe}} / {{M16_2c.url_code|safe}}{{M16_3a.url_code|safe}} / {{M16_3b.url_code|safe}}
{{D7.url|safe}}{{P10.url|safe}}{{M17_1.url_code|safe}}{{M17_2.url_code|safe}}{{M17_3.url_code|safe}}
{{D5.url|safe}}{{P08.url|safe}}{{M15.url_code|safe}}
{{D8.url|safe}}{{P11.url|safe}}{{MACC.url_code|safe}}
-
-Imprimer en PDF + + + {{D6.url|safe}} + {{P09.url|safe}} + {{M16_1a.url_code|safe}} / {{M16_1b.url_code|safe}} / {{M16_1c.url_code|safe}} / {{M16_1d.url_code|safe}} / {{M16_1e.url_code|safe}} + {{M16_2a.url_code|safe}} / {{M16_2b.url_code|safe}} / {{M16_2c.url_code|safe}} + {{M16_3a.url_code|safe}} / {{M16_3b.url_code|safe}} + + + + {{D7.url|safe}} + {{P10.url|safe}} + {{M17_1.url_code|safe}} + {{M17_2.url_code|safe}} + {{M17_3.url_code|safe}} + + + + + {{D8.url|safe}} + {{P11.url|safe}} + {{MACC.url_code|safe}} + + +
+ Imprimer en PDF
{% endblock %} diff --git a/templates/cms/module_detail.html b/templates/cms/module_detail.html index 7f1e5f4..5a0b685 100644 --- a/templates/cms/module_detail.html +++ b/templates/cms/module_detail.html @@ -4,44 +4,90 @@ {% block coltype %}colMS{% endblock %} {% block content %} -
-

{{object}}

- - - - - - - - - - - - - - - -{% if object.periode_presentiel > 0 %} - -{% endif %} -{% if object.pratique_prof > 0 %} - -{% endif %} -{% if object.travail_perso > 0 %} - -{% endif %} - -
Domaine{{object.processus.domaine.url|safe}}
Processus{{object.processus.url|safe}}
Situation emblématique{{object.situation|linebreaksbr}}
Compétences visées

L'éducateur social, l'éducatrice sociale:

-{% for c in object.competence_set.all %}- {{c.nom}} ({{c.code}})
{% endfor %}
Plus-value sur le CFC ASE -{% for c in object.competence_set.all %} -{% for sc in c.souscompetence_set.all %} -- {{sc.nom}} (voir {{sc.competence.code}})
-{%endfor %} -{% endfor %} -
Objectifs à atteindre{% for c in object.objectif_set.all %}- {{c}}
{% endfor %}
Didactique{{ object.didactique }}
Evaluation{{object.evaluation|linebreaksbr}}
Type{{object.type}}, obligatoire
SemestreSem. {{object.semestre}}
Présentiel{{object.periode_presentiel}} heures
Pratique prof.{{object.pratique_prof}} heures
Travail perso.{{object.travail_perso}} heures
Responsable{{object.processus.domaine.responsable.descr|safe}}
-

Imprimer en PDF

- +

{{object}}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if object.periode_presentiel > 0 %} + + + + + {% endif %} + {% if object.pratique_prof > 0 %} + + + + + {% endif %} + {% if object.travail_perso > 0 %} + + + + + {% endif %} + + + + +
Domaine{{object.processus.domaine.url|safe}}
Processus{{object.processus.url|safe}}
Situation emblématique{{object.situation|linebreaksbr}}
Compétences visées +

L'éducateur social, l'éducatrice sociale:

+ {% for c in object.competence_set.all %} + - {{c.nom}} ({{c.code}})
+ {% endfor %} +
Plus-value sur le CFC ASE + {% for c in object.competence_set.all %} + {% for sc in c.souscompetence_set.all %} + - {{sc.nom}} (voir {{sc.competence.code}})
+ {%endfor %} + {% endfor %} +
Objectifs à atteindre + {% for c in object.objectif_set.all %} + - {{c}}
+ {% endfor %} +
Didactique{{ object.didactique }}
Evaluation{{object.evaluation|linebreaksbr}}
Type{{object.type}}, obligatoire
SemestreSem. {{object.semestre}}
Présentiel{{object.periode_presentiel}} heures
Pratique prof.{{object.pratique_prof}} heures
Travail perso.{{object.travail_perso}} heures
Responsable{{object.processus.domaine.responsable.descr|safe}}
+

Imprimer en PDF

{% endblock %} diff --git a/templates/cms/module_detail_old.html b/templates/cms/module_detail_old.html index 9381379..2a6633e 100644 --- a/templates/cms/module_detail_old.html +++ b/templates/cms/module_detail_old.html @@ -6,35 +6,83 @@ {% block content %}
-

{{object}}

- - - - - - - - - - - - -{% if object.periode_presentiel > 0 %} - -{% endif %} -{% if object.pratique_prof > 0 %} - -{% endif %} -{% if object.travail_perso > 0 %} - -{% endif %} - -
Domaine{{object.processus.domaine.url|safe}}
Processus{{object.processus.url|safe}}
Situation emblématique{{object.situation|linebreaksbr}}
Compétences visées

L'éducateur social, l'éducatrice sociale:

-{% for c in object.competence_set.all %}- {{c.nom}} ({{c.code}})
-{% if user.is_authenticated %} -{% for sc in c.souscompetence_set.all %}    -- {{sc.nom}}
{%endfor %}{% endif %}{% endfor %}
Objectifs à atteindre{% for c in object.objectif_set.all %}- {{c}}
{% endfor %}
Didactique{{ object.didactique }}
Evaluation{{object.evaluation|linebreaksbr}}
Type{{object.type}}, obligatoire
SemestreSem. {{object.semestre}}
Présentiel{{object.periode_presentiel}} heures
Pratique prof.{{object.pratique_prof}} heures
Travail perso.{{object.travail_perso}} heures
Responsable{{object.processus.domaine.responsable.descr|safe}}
-

Imprimer en PDF

- +

{{object}}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if object.periode_presentiel > 0 %} + + + + + {% endif %} + {% if object.pratique_prof > 0 %} + + + + + {% endif %} + {% if object.travail_perso > 0 %} + + + + + {% endif %} + + + + +
Domaine{{object.processus.domaine.url|safe}}
Processus{{object.processus.url|safe}}
Situation emblématique{{object.situation|linebreaksbr}}
Compétences visées

L'éducateur social, l'éducatrice sociale:

+ {% for c in object.competence_set.all %} + - {{c.nom}} ({{c.code}})
+ {% if user.is_authenticated %} + {% for sc in c.souscompetence_set.all %} +     -- {{sc.nom}}
+ {%endfor %} + {% endif %} + {% endfor %} +
Objectifs à atteindre + {% for c in object.objectif_set.all %} + - {{c}}
+ {% endfor %} +
Didactique{{ object.didactique }}
Evaluation{{object.evaluation|linebreaksbr}}
Type{{object.type}}, obligatoire
SemestreSem. {{object.semestre}}
Présentiel{{object.periode_presentiel}} heures
Pratique prof.{{object.pratique_prof}} heures
Travail perso.{{object.travail_perso}} heures
Responsable{{object.processus.domaine.responsable.descr|safe}}
+

Imprimer en PDF

{% endblock %} diff --git a/templates/cms/module_list.html b/templates/cms/module_list.html index 10d0f15..2339d8c 100644 --- a/templates/cms/module_list.html +++ b/templates/cms/module_list.html @@ -8,14 +8,15 @@ {% block content %}
-

Liste des modules

- -{% for m in object_list %} - -{% endfor %} -
{{m.code}}{{m.nom}}
- - +

Liste des modules

+ + {% for m in object_list %} + + + + + {% endfor %} +
{{m.code}}{{m.nom}}
{% endblock %} diff --git a/templates/cms/periodes.html b/templates/cms/periodes.html index 8384405..1c75119 100644 --- a/templates/cms/periodes.html +++ b/templates/cms/periodes.html @@ -5,60 +5,99 @@ {% block content %} -
-

Périodes de formation

- - - - - - - - - - - - - - - -
Semestre 1{{tot1.sem1__sum}}h.Semestre 2{{tot2.sem2__sum}}h.
-{% for s in sem1 %} - -{% endfor %} -
{{s}}{{s.sem1}} h.
-
- -{% for s in sem2 %} - -{% endfor %} -
{{s}}{{s.sem2}} h.
-
  
Semestre 3{{tot3.sem3__sum}}h.Semestre 4{{tot4.sem4__sum}}h.
-{% for s in sem3 %} - -{% endfor %} -
{{s}}{{s.sem3}} h.
-{% for s in sem4 %} - -{% endfor %} -
{{s}}{{s.sem4}} h.
  
Semestre 5{{tot5.sem5__sum}}h.Semestre 6{{tot6.sem6__sum}}h.
-{% for s in sem5 %} - -{% endfor %} -
{{s}}{{s.sem5}} h.
- -{% for s in sem6 %} - -{% endfor %} -
{{s}}{{s.sem6}} h.
-
- -
-Total des heures de cours: {{tot}} heures - -

-Imprimer en PDF +

Périodes de formation

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Semestre 1{{tot1}}h.Semestre 2{{tot2}}h.
+ + {% for s in sem1 %} + + {% endfor %} +
{{s}}{{s.sem1}} h.
+
+ + {% for s in sem2 %} + + {% endfor %} +
{{s}}{{s.sem2}} h.
+
  
Semestre 3{{tot3}}h.Semestre 4{{tot4}}h.
+ + {% for s in sem3 %} + + {% endfor %} +
{{s}}{{s.sem3}} h.
+
+ + {% for s in sem4 %} + + + + + {% endfor %} +
{{s}}{{s.sem4}} h.
+
  
Semestre 5{{tot5}}h.Semestre 6{{tot6}}h.
+ + {% for s in sem5 %} + + {% endfor %} +
{{s}}{{s.sem5}} h.
+
+ + {% for s in sem6 %} + + + + + {% endfor %} +
{{s}}{{s.sem6}} h.
+
+
+

Total des heures de cours: {{tot}} heures

+ Imprimer en PDF
{% endblock %} diff --git a/templates/cms/processus_detail.html b/templates/cms/processus_detail.html index 0d37507..7cefc16 100644 --- a/templates/cms/processus_detail.html +++ b/templates/cms/processus_detail.html @@ -1,29 +1,46 @@ {% extends "./base_site.html" %} {% load i18n static %} - {% block coltype %}colMS{% endblock %} {% block bodyclass %}{{ block.super }} dashboard{% endblock %} - {% block content %} -
-

{{object}}

- - - - - - - - -
Description{{object.description}}
Compétences visées

L'éducateur social, l'éducatrice sociale:

-{% for m in object.module_set.all %}{% for c in m.competences.all %} -- {{c.libelle}} ({{c.code}})
{% endfor %}{% endfor %}
Domaine{{object.domaine.url|safe}}
Responsable{{object.domaine.responsable.descr|safe}}
Modules concernés{% for m in object.module_set.all %}{{m.url|safe}}
{% endfor %}
- - +

{{object}}

+ + + + + + + + + + + + + + + + + + + + + +
Description{{object.description}}
Compétences visées +

L'éducateur social, l'éducatrice sociale:

+ {% for m in object.module_set.all %} + {% for c in m.competences.all %} + - {{c.libelle}} ({{c.code}})
+ {% endfor %} + {% endfor %} +
Domaine{{object.domaine.url|safe}}
Responsable{{object.domaine.responsable.descr|safe}}
Modules concernés + {% for m in object.module_set.all %} + {{m.url|safe}}
+ {% endfor %} +
{% endblock %} diff --git a/templates/cms/processus_list.html b/templates/cms/processus_list.html index 691c302..bc8997c 100644 --- a/templates/cms/processus_list.html +++ b/templates/cms/processus_list.html @@ -1,27 +1,27 @@ {% extends "./base_site.html" %} {% load i18n static %} - - - {% block coltype %}colMS{% endblock %} {% block bodyclass %}{{ block.super }}{% endblock %} {% block content %} -
-

Liste des processus

- -{% for p in object_list %} - -{% for m in p.module_set.all %} - -{% endfor %} -{% endfor %} -
{{p.code}}{{p.nom}}
 {{m}}
- - +

Liste des processus

+ + {% for p in object_list %} + + + + + {% for m in p.module_set.all %} + + + + + {% endfor %} + {% endfor %} +
{{p.code}}{{p.nom}}
 {{m}}
{% endblock %} diff --git a/templates/cms/travail_perso.html b/templates/cms/travail_perso.html index f04f631..4d6c281 100644 --- a/templates/cms/travail_perso.html +++ b/templates/cms/travail_perso.html @@ -8,29 +8,52 @@ {% block content %}
-

Répartion des heures de formation

- - -{% for m in object_list %} - - - - - - -{% endfor %} - - - - - - -
ModuleHeures de coursTravail perso.Pratique prof.
-{% if forloop.last %} -{{ m }} - Travail de diplôme -{% else %} -{{ m }} -{% endif %} -{% if m.periode_presentiel == 0 %}   {% else %} {{ m.periode_presentiel|rjust:"3" }} h. {% endif %}{% if m.travail_perso == 0 %}   {% else %} {{ m.travail_perso|rjust:"3" }} h. {% endif %}{% if m.pratique_prof == 0 %}   {% else %} {{ m.pratique_prof|rjust:"3" }} h.{% endif %}
Total{{ total_perso }} heures{{ total_presentiel }} heures{{ total_pratique }} heures
+

Répartion des heures de formation

+ + + + + + + + {% for m in object_list %} + + + + + + + {% endfor %} + + + + + + +
ModuleHeures de coursTravail perso.Pratique prof.
+ {% if forloop.last %} + {{ m }} - Travail de diplôme + {% else %} + {{ m }} + {% endif %} + + {% if m.periode_presentiel == 0 %} +   + {% else %} + {{ m.periode_presentiel|rjust:"3" }} h. + {% endif %} + + {% if m.travail_perso == 0 %} +  nbsp; + {% else %} + {{ m.travail_perso|rjust:"3" }} h. + {% endif %} + + {% if m.pratique_prof == 0 %} +   + {% else %} + {{ m.pratique_prof|rjust:"3" }} h. + {% endif %} +
Total{{ total_perso }} heures{{ total_presentiel }} heures{{ total_pratique }} heures
{% endblock %} \ No newline at end of file diff --git a/templates/cms/upload.html b/templates/cms/upload.html index 70e4f34..d690e1d 100644 --- a/templates/cms/upload.html +++ b/templates/cms/upload.html @@ -10,39 +10,34 @@ {% block breadcrumbs %} - {% endblock %} +{% endblock %} {% block content %} - -
-

Enregistrements de documents

-{% if documents %} - - {% else %} -

No documents.

- {% endif %} - -
  -
- {% csrf_token %} -

{{ form.non_field_errors }}

-

{{ form.docfile.label_tag }} {{ form.docfile.help_text }}

-

- {{ form.docfile.errors }} - {{ form.docfile }} -

- -

-
+
+

Enregistrements de documents

+ {% if documents %} + + {% else %} +

No documents.

+ {% endif %} + +
  +
+ {% csrf_token %} +

{{ form.non_field_errors }}

+

{{ form.docfile.label_tag }} {{ form.docfile.help_text }}

+

{{ form.docfile.errors }} {{ form.docfile }}

+

+
-
+
{% endblock %} diff --git a/templates/cms/upload_detail.html b/templates/cms/upload_detail.html index 7812bac..29e91e5 100644 --- a/templates/cms/upload_detail.html +++ b/templates/cms/upload_detail.html @@ -3,13 +3,10 @@ {% block coltype %}colMS{% endblock %} - - {% block content %}
- - +
{% endblock %}