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 %}
+
+