Upload document

This commit is contained in:
alazo 2017-04-19 18:49:49 +02:00
parent 30550d3066
commit 9f0e515f4e
12 changed files with 341 additions and 90 deletions

View file

@ -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)
admin.site.register(Document, DocumentAdmin)
admin.site.register(UploadDoc, UploadAdmin)

View file

@ -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}),
}
class UploadAdminForm(forms.ModelForm):
class Meta:
model = UploadDoc
fields = ('titre', 'docfile', 'published', )

View file

@ -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'),
),
]

View file

@ -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',
),
]

View file

@ -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',
),
]

View file

View file

@ -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 "<a href='/domaine/{0}'>{1}</a>".format(self.id, self.__str__())
"""
def svg(self):
processus = self.processus_set.all()
svg = '<rect x="20" y="{0}" rx="5" ry="5" width="250" height="{1}" fill="{2}" stroke="black" stroke-width="1" />'
txt = '<text x="25" y="{0}" style="stroke:#000000;font-size:10;">{1}</text>'
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()

View file

@ -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
"""