From 9f0e515f4eb044ece5f7f80fd84237629df0b3b3 Mon Sep 17 00:00:00 2001 From: alazo Date: Wed, 19 Apr 2017 18:49:49 +0200 Subject: [PATCH] Upload document --- cms/admin.py | 31 +++-- cms/forms.py | 13 +- cms/migrations/0001_initial.py | 155 ++++++++++++++++++++++ cms/migrations/0002_auto_20170419_1333.py | 28 ++++ cms/migrations/0003_auto_20170419_1409.py | 19 +++ cms/migrations/__init__.py | 0 cms/models.py | 93 +++++++------ cms/views.py | 50 ++++--- common/urls.py | 9 +- templates/cms/base_site.html | 1 - templates/cms/document_list.html | 16 ++- templates/cms/upload_detail.html | 16 +++ 12 files changed, 341 insertions(+), 90 deletions(-) create mode 100644 cms/migrations/0001_initial.py create mode 100644 cms/migrations/0002_auto_20170419_1333.py create mode 100644 cms/migrations/0003_auto_20170419_1409.py create mode 100644 cms/migrations/__init__.py create mode 100644 templates/cms/upload_detail.html diff --git a/cms/admin.py b/cms/admin.py index 1da47a2..ead4a20 100644 --- a/cms/admin.py +++ b/cms/admin.py @@ -1,16 +1,21 @@ from django.contrib import admin + from .models import (Enseignant, Domaine, Competence, SousCompetence, Objectif, - Ressource, Module, Processus, Document) + Ressource, Module, Processus, Document, UploadDoc) + from .forms import (ProcessusAdminForm, ProcessusInlineAdminForm, ModuleAdminForm, DomaineAdminForm, CompetenceAdminForm, SousCompetenceInlineAdminForm, CompetenceInlineAdminForm, ObjectifAdminForm, RessourceAdminForm, -SousCompetenceAdminForm, DocumentAdminForm) +SousCompetenceAdminForm, DocumentAdminForm, UploadAdminForm ) + # Register your models here. + class SousCompetenceInline(admin.TabularInline): form = SousCompetenceInlineAdminForm model = SousCompetence extra = 0 - + + class CompetenceInline(admin.TabularInline): form = CompetenceInlineAdminForm model = Competence @@ -21,8 +26,6 @@ class SousCompetenceAdmin(admin.ModelAdmin): form = SousCompetenceAdminForm - - class RessourceAdmin(admin.ModelAdmin): form = RessourceAdminForm list_display = ('nom', 'module') @@ -59,16 +62,16 @@ class DomaineAdmin(admin.ModelAdmin): list_display = ('nom', 'responsable',) form = DomaineAdminForm inlines = [ProcessusInlineAdmin,] - + + class DocumentAdmin(admin.ModelAdmin): form = DocumentAdminForm - class Meta: - js = ( - '/static/js/tiny_mce/tiny_mce.js', - '/static/js/textarea.js', - ) - + +class UploadAdmin(admin.ModelAdmin): + form = UploadAdminForm + + admin.site.register(Enseignant) admin.site.register(Domaine, DomaineAdmin) admin.site.register(Competence, CompetenceAdmin) @@ -77,4 +80,6 @@ admin.site.register(Objectif, ObjectifAdmin) admin.site.register(Ressource, RessourceAdmin) admin.site.register(Module, ModuleAdmin) admin.site.register(Processus, ProcessusAdmin) -admin.site.register(Document, DocumentAdmin) \ No newline at end of file +admin.site.register(Document, DocumentAdmin) + +admin.site.register(UploadDoc, UploadAdmin) diff --git a/cms/forms.py b/cms/forms.py index 5eab636..add750e 100644 --- a/cms/forms.py +++ b/cms/forms.py @@ -4,7 +4,9 @@ Created on 17 nov. 2012 @author: alzo ''' -from .models import Processus, Module, Domaine, Competence, SousCompetence, Document +from .models import (Processus, Module, Domaine, Competence, SousCompetence, Document, + UploadDoc) + from django import forms from django.contrib import admin @@ -163,4 +165,11 @@ class ModuleAdminForm(forms.ModelForm): 'didactique': forms.Textarea(attrs={'cols': 125, 'rows':2}), 'evaluation': forms.Textarea(attrs={'cols': 125, 'rows':2}), } - \ No newline at end of file + + +class UploadAdminForm(forms.ModelForm): + + class Meta: + model = UploadDoc + fields = ('titre', 'docfile', 'published', ) + \ No newline at end of file diff --git a/cms/migrations/0001_initial.py b/cms/migrations/0001_initial.py new file mode 100644 index 0000000..4797770 --- /dev/null +++ b/cms/migrations/0001_initial.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2017-04-19 11:32 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import tinymce.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Competence', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=20)), + ('nom', models.CharField(max_length=250)), + ('type', models.CharField(blank=True, default='', max_length=35)), + ], + options={ + 'verbose_name': 'compétence', + 'ordering': ('code',), + }, + ), + migrations.CreateModel( + name='Document', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('docfile', models.FileField(upload_to='media/')), + ('titre', models.CharField(blank=True, max_length=128)), + ('texte', tinymce.models.HTMLField(blank=True)), + ('published', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='Domaine', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=20)), + ('nom', models.CharField(max_length=200)), + ], + options={ + 'ordering': ('code',), + }, + ), + migrations.CreateModel( + name='Enseignant', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sigle', models.CharField(blank=True, default='', max_length=5)), + ('nom', models.CharField(blank=True, default='', max_length=20)), + ('prenom', models.CharField(blank=True, default='', max_length=20)), + ('email', models.EmailField(blank=True, default='', max_length=254)), + ], + options={ + 'ordering': ('nom',), + }, + ), + migrations.CreateModel( + name='Module', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(default='Code', max_length=10)), + ('nom', models.CharField(default='Nom du module', max_length=100)), + ('type', models.CharField(choices=[('Spécifique', 'spécifique'), ('Transversal', 'transversal')], max_length=20)), + ('situation', models.TextField()), + ('contenu', models.TextField()), + ('periode_presentiel', models.IntegerField(verbose_name='Période en présentiel')), + ('travail_perso', models.IntegerField(verbose_name='Travail personnel')), + ('pratique_prof', models.IntegerField(default=0, verbose_name='Pratique professionnelle')), + ('didactique', models.TextField()), + ('evaluation', models.TextField()), + ('sem1', models.IntegerField(default=0)), + ('sem2', models.IntegerField(default=0)), + ('sem3', models.IntegerField(default=0)), + ('sem4', models.IntegerField(default=0)), + ('sem5', models.IntegerField(default=0)), + ('sem6', models.IntegerField(default=0)), + ('semestre', models.CharField(default='', max_length=15)), + ], + options={ + 'ordering': ('code',), + }, + ), + migrations.CreateModel( + name='Objectif', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nom', models.CharField(max_length=200)), + ('module', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='cms.Module')), + ], + ), + migrations.CreateModel( + name='Processus', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=20)), + ('nom', models.CharField(max_length=200)), + ('description', models.TextField(default='')), + ('domaine', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cms.Domaine')), + ], + options={ + 'verbose_name_plural': 'processus', + 'ordering': ('code',), + }, + ), + migrations.CreateModel( + name='Ressource', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nom', models.CharField(max_length=200)), + ('type', models.CharField(choices=[('Savoir', 'savoir'), ('Savoir méthodologique', 'savoir méthodologique'), ('Savoir relationnel', 'savoir relationnel')], default='Savoir', max_length=30)), + ('module', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='cms.Module')), + ], + ), + migrations.CreateModel( + name='SousCompetence', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(blank=True, max_length=20)), + ('nom', models.CharField(max_length=250)), + ('competence', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cms.Competence')), + ], + options={ + 'verbose_name': 'sous-compétence', + 'ordering': ('code',), + }, + ), + migrations.AddField( + model_name='module', + name='processus', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='cms.Processus'), + ), + migrations.AddField( + model_name='domaine', + name='responsable', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='cms.Enseignant'), + ), + migrations.AddField( + model_name='competence', + name='module', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='cms.Module'), + ), + migrations.AddField( + model_name='competence', + name='proces_eval', + field=models.ForeignKey(default=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='cms.Processus'), + ), + ] diff --git a/cms/migrations/0002_auto_20170419_1333.py b/cms/migrations/0002_auto_20170419_1333.py new file mode 100644 index 0000000..e4b0218 --- /dev/null +++ b/cms/migrations/0002_auto_20170419_1333.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2017-04-19 11:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cms', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Upload', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('docfile', models.FileField(upload_to='doc/')), + ('titre', models.CharField(max_length=100)), + ('published', models.BooleanField(default=False)), + ], + ), + migrations.RemoveField( + model_name='document', + name='docfile', + ), + ] diff --git a/cms/migrations/0003_auto_20170419_1409.py b/cms/migrations/0003_auto_20170419_1409.py new file mode 100644 index 0000000..860a02f --- /dev/null +++ b/cms/migrations/0003_auto_20170419_1409.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2017-04-19 12:09 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('cms', '0002_auto_20170419_1333'), + ] + + operations = [ + migrations.RenameModel( + old_name='Upload', + new_name='UploadDoc', + ), + ] diff --git a/cms/migrations/__init__.py b/cms/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cms/models.py b/cms/models.py index 72bc356..cbcfc3f 100644 --- a/cms/models.py +++ b/cms/models.py @@ -16,6 +16,7 @@ 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) @@ -35,13 +36,14 @@ CHOIX_TYPE_MODULE = ( ) class Enseignant(models.Model): + + class Meta: + ordering =('nom',) + 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) @@ -54,25 +56,25 @@ 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',) + + #height_screen = 50 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 @@ -86,20 +88,20 @@ class Domaine(models.Model): 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) @@ -108,7 +110,10 @@ 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) @@ -128,12 +133,7 @@ class Module(models.Model): sem6 = models.IntegerField(default=0) semestre = models.CharField(max_length=15, default='', blank=False) processus = models.ForeignKey(Processus, null=False, default=None) - - - class Meta: - ordering = ('code',) - - + def __str__(self): return '{0} - {1}'.format(self.code, self.nom) @@ -145,44 +145,48 @@ 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') - - 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) 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) @@ -191,7 +195,8 @@ class Objectif(models.Model): class Document(models.Model): - docfile = models.FileField(upload_to='media', blank=True) + + #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) @@ -200,9 +205,17 @@ class Document(models.Model): return self.titre +class UploadDoc(models.Model): + + docfile = models.FileField(upload_to='doc/') + titre = models.CharField(max_length=100, blank=False) + published = models.BooleanField(default=False) + + def __str__(self): + return self.titre + - class PDFResponse(HttpResponse): def __init__(self, filename, title='', portrait=True): @@ -210,7 +223,7 @@ class PDFResponse(HttpResponse): 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 = Image(settings.MEDIA_ROOT + '/media/header.png', width=520, height=75) image.hAlign = TA_LEFT self.story.append(image) @@ -230,7 +243,6 @@ class PDFResponse(HttpResponse): self.story.append(t) - class MyDocTemplate(SimpleDocTemplate): def __init__(self, name): @@ -241,7 +253,6 @@ class MyDocTemplate(SimpleDocTemplate): self.CENTRE_WIDTH = self.PAGE_WIDTH/2.0 self.CENTRE_HEIGHT = self.PAGE_HEIGHT/2.0 - def beforePage(self): # page number self.canv.saveState() @@ -250,7 +261,6 @@ class MyDocTemplate(SimpleDocTemplate): self.canv.restoreState() - class MyDocTemplateLandscape(SimpleDocTemplate): def __init__(self, name): @@ -269,5 +279,4 @@ class MyDocTemplateLandscape(SimpleDocTemplate): self.canv.restoreState() - \ No newline at end of file diff --git a/cms/views.py b/cms/views.py index df944d6..052b181 100644 --- a/cms/views.py +++ b/cms/views.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- ''' Created on 4 déc. 2012 @@ -7,7 +6,8 @@ Created on 4 déc. 2012 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, PDFResponse, MyDocTemplate, MyDocTemplateLandscape +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 @@ -170,39 +170,37 @@ class EvaluationView(ListView): class DocumentListView(ListView): template_name = 'cms/document_list.html' - model = Document - + 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 -def pdf_view(request): - with open('/path/to/my/file.pdf', 'r') as pdf: - response = HttpResponse(pdf.read(), mimetype='application/pdf') - response['Content-Disposition'] = 'inline;filename=some_file.pdf' - return response - pdf.closed +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 get_object(self): - # Call the superclass - return super(ModulePDF, self).get_object() - - - - def render_to_response(self, context, **response_kwargs): - #return DetailView.render_to_response(self, context, **response_kwargs) + 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) @@ -249,16 +247,16 @@ class ModulePDF(DetailView): response.story.append(Spacer(0,1*cm)) response.story.append(t) - doc = MyDocTemplate(response) doc.build(response.story) return response -""" -Calcul du nombre de périodes de formation -""" + 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'))) @@ -355,7 +353,7 @@ class PeriodePDFView(TemplateView): return response - +""" class AddDocument(TemplateView): template_name = 'cms/upload.html' @@ -402,5 +400,5 @@ def pdf_view(request): response['Content-Disposition'] = 'inline;filename=some_file.pdf' return response pdf.closed - +""" \ No newline at end of file diff --git a/common/urls.py b/common/urls.py index 940d4f4..4d1ea3a 100644 --- a/common/urls.py +++ b/common/urls.py @@ -32,11 +32,12 @@ urlpatterns = [ url(r'^periodes$', views.PeriodeView.as_view(), name='periodes'), url(r'^periodes_pdf$', views.PeriodePDFView.as_view(), name='periodes-pdf'), url(r'^evaluation/$', views.EvaluationView.as_view(), name='evaluation'), - 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'^document/(?P\d+)$', views.DocumentDetailView.as_view(), name='document-detail'), + url(r'^upload/(?P\d+)$', views.UploadDetailView.as_view(), name='upload-detail'), url(r'^tinymce/', include('tinymce.urls'), name='tinymce-js'), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/templates/cms/base_site.html b/templates/cms/base_site.html index e943640..a9fdfd9 100644 --- a/templates/cms/base_site.html +++ b/templates/cms/base_site.html @@ -26,7 +26,6 @@
  • Documents  
  • - {% if has_permission %}
  • Calendrier  
  • {% endif %} diff --git a/templates/cms/document_list.html b/templates/cms/document_list.html index 794a06e..f0a930b 100644 --- a/templates/cms/document_list.html +++ b/templates/cms/document_list.html @@ -16,14 +16,26 @@ {% for doc in object_list %} {% if doc.published %} -
  • {{doc}}
  • +
  • {{doc}}
  • {% else %}
  • {{doc}}  (en travail)
  • {% endif %} - {% empty %}
  • Aucun document disponible
  • {% endfor %} + +{% for fic in upload %} + +{% if fic.published %} +
  • {{fic.titre}}
  • +{% else %} +
  • {{fic}}  (en travail)
  • +{% endif %} +{% endfor %} + + + + diff --git a/templates/cms/upload_detail.html b/templates/cms/upload_detail.html new file mode 100644 index 0000000..7812bac --- /dev/null +++ b/templates/cms/upload_detail.html @@ -0,0 +1,16 @@ +{% extends "./base_site.html" %} +{% load i18n static %} + +{% block coltype %}colMS{% endblock %} + + + +{% block content %} + +
    + + +
    +{% endblock %} + +