[#2241] Changé la gestion des uploads pour utiliser django-sendfile
authorEric Mc Sween <eric.mcsween@auf.org>
Fri, 28 Oct 2011 19:29:56 +0000 (15:29 -0400)
committerEric Mc Sween <eric.mcsween@auf.org>
Wed, 2 Nov 2011 20:05:23 +0000 (16:05 -0400)
buildout.cfg
project/dae/models.py
project/dae/templates/dae/embauche_consulter.html
project/dae/templates/dae/embauche_pdf.html
project/dae/templates/dae/poste_resume.html
project/dae/urls.py
project/dae/views.py
project/settings.py

index da75d2a..86d216e 100644 (file)
@@ -33,6 +33,8 @@ eggs =
     django-alphafilter
     django-form-utils
     django-tinymce
+    django-sendfile
+
 # LA PROD ne dispose que de reportlab 2.1, incompatible avec
 # les versions de pisa assez évoluées pour un bon rendu.
 #    reportlab
@@ -56,15 +58,11 @@ auf.django.emploi = 0.5dev
 #html5lib = 0.90
 #pyPDF = 1.13
 #pisa = 3.0.33
+django-sendfile = 0.2.1
 
-#reportlab = 2.5
-#html5lib = 0.90
-#pyPDF = 1.13
-#pisa = 3.0.33
-
-[django] 
+[django]
 recipe = auf.recipe.django
-wsgi=true 
+wsgi=true
 settings=production
 extra-paths = project
 eggs =${buildout:eggs}
index 0befb6d..596f0d6 100644 (file)
@@ -17,18 +17,8 @@ HELP_TEXT_DATE = "format: aaaa-mm-jj"
 REGIME_TRAVAIL_DEFAULT=100.00
 REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT=35.00
 
-
 # Upload de fichiers
-storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT, 
-                            base_url=settings.PRIVE_MEDIA_URL)
-
-def poste_piece_dispatch(instance, filename):
-    path = "poste/%s/%s" % (instance.poste_id, filename)
-    return path
-
-def dossier_piece_dispatch(instance, filename):
-    path = "dossier/%s/%s" % (instance.dossier_id, filename)
-    return path
+UPLOAD_STORAGE = FileSystemStorage(settings.PRIVE_MEDIA_ROOT)
 
 
 ### POSTE
@@ -399,9 +389,7 @@ class PostePiece(models.Model):
     """
     poste = models.ForeignKey("Poste")
     nom = models.CharField(verbose_name="Nom", max_length=255)
-    fichier = models.FileField(verbose_name="Fichier", 
-                            upload_to=poste_piece_dispatch, 
-                            storage=storage_prive)
+    fichier = models.FileField(verbose_name="Fichier", upload_to='dae/poste', storage=UPLOAD_STORAGE)
 
 class PosteComparaison(models.Model):
     poste = models.ForeignKey('Poste', related_name='comparaisons_internes')
@@ -703,9 +691,7 @@ class DossierPiece(models.Model):
     """
     dossier = models.ForeignKey("Dossier")
     nom = models.CharField(verbose_name="Nom", max_length=255)
-    fichier = models.FileField(verbose_name="Fichier", 
-                            upload_to=dossier_piece_dispatch, 
-                            storage=storage_prive)
+    fichier = models.FileField(verbose_name="Fichier", upload_to='dae/dossier', storage=UPLOAD_STORAGE)
 
 
 class DossierComparaison(models.Model):
index f216bd5..843ab50 100644 (file)
@@ -85,7 +85,7 @@
   <h2>Pièces jointes</h2>
   <ul>
   {% for pj in dossier.dossierpiece_set.all %}
-      <li><a href="{{ pj.fichier.url }}" target="_blank">{{ pj.nom }}</a></li>
+      <li><a href="{% url dossier_piece pj.id %}">{{ pj.nom }}</a></li>
   {% endfor %}
   </ul>
 
index b7faaf8..737160b 100644 (file)
@@ -76,7 +76,7 @@
   <h2>Pièces jointes</h2>
   <ul>
   {% for pj in dossier.dossierpiece_set.all %}
-      <li><a href="{{ pj.fichier.url }}" target="_blank">{{ pj.nom }}</a></li>
+      <li><a href="{% url dossier_piece pj.id %}">{{ pj.nom }}</a></li>
   {% endfor %}
   </ul>
 
index cad05bd..d4fa663 100644 (file)
 <h2>Pièces jointes</h2>
 <ul>
 {% for pj in poste.postepiece_set.all %}
-    <li><a href="{{ pj.fichier.url }}">{{ pj.nom }}</a></li>
+    <li><a href="{% url poste_piece pj.id %}">{{ pj.nom }}</a></li>
 {% endfor %}
 </ul>
 </fieldset>
index 440c66e..d92dcdd 100644 (file)
@@ -1,10 +1,8 @@
 # -*- encoding: utf-8 -*
 from django.conf.urls.defaults import patterns, url, include
-from django.conf import settings
 
 urlpatterns = patterns(
     'project.dae.views',
-    (r'^prive/(?P<path>.*)$', 'mediaserve', {'document_root': settings.PRIVE_MEDIA_ROOT}),
     url(r'^$', 'index', name='dae_index'),
 
     # poste
@@ -12,6 +10,7 @@ urlpatterns = patterns(
     url(r'^poste/consulter/(?P<key>.*)$', 'poste_consulter', name='poste_consulter'),
     url(r'^poste$', 'poste', name='poste'),
     url(r'^poste/(?P<key>.*)$', 'poste', name='poste'),
+    url(r'^pieces-postes/(\d+)$', 'poste_piece', name='poste_piece'),
 
     # embauche
     url(r'^embauches$', 'embauches_liste', name='dae_embauches_liste'),
@@ -25,6 +24,7 @@ urlpatterns = patterns(
     url(r'^employe/(?P<key>.*)$', 'employe', name='employe'),
     url(r'^dossier$', 'dossier', name='dossier'),
     url(r'^dossier/(?P<poste_key>.*)/(?P<employe_key>.*)$', 'dossier', name='dossier'),
+    url(r'^pieces-dossiers/(\d+)$', 'dossier_piece', name='dossier_piece'), 
     url(r'^dossier_resume/(?P<dossier_id>.*)$', 'dossier_resume', name='dossier_resume'),
     url(r'^poste_resume/(?P<dossier_id>.*)$', 'poste_resume', name='poste_resume'),
     url(r'^salaire$', 'salaire', name='salaire'),
index 4a44efa..d55928d 100644 (file)
@@ -16,9 +16,12 @@ from django.template import Context, RequestContext
 from django.template.loader import get_template
 from django.contrib import messages
 from django.conf import settings
+from django.contrib.auth.decorators import login_required
 
 from reversion.models import Version
 
+from sendfile import sendfile
+
 from project.dae import models as dae
 from project.rh_v1 import models as rh
 
@@ -73,6 +76,9 @@ def reponse_pdf(template_src, context_dict):
 def index(request):
     return render_to_response('dae/index.html', {}, RequestContext(request))
 
+
+### POSTE
+
 @dae_groupe_requis
 @poste_dans_ma_region_ou_service
 def poste_consulter(request, key):
@@ -173,6 +179,18 @@ def postes_liste(request):
     vars['postes_valides'] = dae.Poste.objects.ma_region_ou_service(request.user).filter(etat=POSTE_ETAT_DRH_FINALISATION).order_by('-date_creation')
     return render_to_response('dae/postes_liste.html', vars, RequestContext(request))
 
+@login_required
+def poste_piece(request, id):
+    """Téléchargement d'une pièce jointe à un poste."""
+    piece = get_object_or_404(dae.PostePiece, pk=id)
+    if dae.Poste.objects.ma_region_ou_service(request.user).filter(id=piece.poste_id).exists():
+        return sendfile(request, piece.fichier.path, attachment=True)
+    else:
+        return redirect_interdiction(request)
+
+
+### DOSSIER
+
 def filtered_type_remun():
     defaut = (2, 3, 8, 17) # salaire de base, indemnité de fonction, charges patronales
     return rh.TypeRemuneration.objects.filter(pk__in=defaut)
@@ -543,6 +561,15 @@ def liste_postes(request):
     data = [('', 'Nouveau poste')] +  sorted([('dae-%s' % p.id, label_poste_display(p)) for p in dae_ | copies] + [('rh-%s' % p.id, label_poste_display(p)) for p in rhv1], key=lambda t: t[1])
     return HttpResponse(dumps(data))
 
+@login_required
+def dossier_piece(request, id):
+    """Téléchargement d'une pièce jointe à un poste."""
+    piece = get_object_or_404(dae.DossierPiece, pk=id)
+    if dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=piece.dossier_id).exists():
+        return sendfile(request, piece.fichier.path, attachment=True)
+    else:
+        return redirect_interdiction(request)
+
 
 ################################################################################
 # AJAX SECURITE non nécessaire
index 0d0dd63..cf8ef80 100644 (file)
@@ -141,3 +141,7 @@ TINYMCE_DEFAULT_CONFIG = {
 'paste_remove_styles' : 'true',
 'content_css' : '/media/css/tinymce.css',
 }
+
+# django-sendfile
+
+SENDFILE_BACKEND = 'sendfile.backends.simple'