poste PDF
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 10 May 2011 20:08:51 +0000 (16:08 -0400)
committerNicolas Cadou <ncadou@cadou.ca>
Thu, 19 May 2011 00:12:22 +0000 (20:12 -0400)
buildout.cfg
project/dae/templates/dae/embauche_consulter.html
project/dae/templates/dae/poste_consulter.html
project/dae/templates/dae/poste_pdf.html [new file with mode: 0644]
project/dae/templates/dae/poste_resume.html
project/dae/views.py
project/media/css/dae.css
project/media/css/pdf.css [new file with mode: 0644]

index cb00740..4882a7e 100644 (file)
@@ -22,6 +22,10 @@ eggs =
     django-reversion
     simplejson
     django-ajax-selects
+    reportlab
+    html5lib
+    pyPDF
+    pisa
 
 [versions]
 django-admin-tools = 0.4.0
@@ -32,6 +36,10 @@ auf.django.auth = 0.5.2dev
 django-reversion = 1.3.3
 auf.django.workflow = 0.9dev
 django-ajax-selects = 1.1.4
+reportlab = 2.5
+html5lib = 0.90
+pyPDF = 1.13
+pisa = 3.0.33
 
 [django] 
 recipe = auf.recipe.django
index 0e1c089..d30fe10 100644 (file)
@@ -11,7 +11,8 @@
 
 {% block main %}
 <h1 class="gauche">Demandes d'autorisation d'engagement de personnel</h1>
-<a class="droite bouton-modifier" href="{% url embauche dossier.poste.key dossier.id %}">Modifier</a>
+<a class="droite bouton-action" href="">PDF</a>
+<a class="droite bouton-action" href="{% url embauche dossier.poste.key dossier.id %}">Modifier</a>
 <div class="visualClear"></div>
 
 <h2 class="section">SECTION 1 - POSTE</h2>
index 6312405..5e01b74 100644 (file)
@@ -14,7 +14,8 @@ Demande d'autorisation d'embauche
 {% block main %}
 
 <h1 class="gauche">Demande d'autorisation de création de poste</h1>
-<a class="droite bouton-modifier" href="{% url poste poste.key %}">Modifier</a>
+<a class="droite bouton-action" target="_blank" href="?mode=pdf">PDF</a>
+<a class="droite bouton-action" href="{% url poste poste.key %}">Modifier</a>
 <div class="visualClear"></div>
 
 {% include "dae/poste_resume.html" %}
diff --git a/project/dae/templates/dae/poste_pdf.html b/project/dae/templates/dae/poste_pdf.html
new file mode 100644 (file)
index 0000000..9da8f03
--- /dev/null
@@ -0,0 +1,37 @@
+<html>
+
+<head>
+    
+    <link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}css/pdf.css" />
+    <link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}css/dae.css" />
+    <style>
+    {{ css }}
+    </style>
+</head>
+
+<body>
+    <h1>Demande d'autorisation de création de poste</h1>
+    <div class="visualClear"></div>
+    
+    {% include "dae/poste_resume.html" %}
+    
+    <fieldset>
+    <h2>Validation</h2>
+    
+    <ul>
+    {% for commentaire in poste.historique_desc %}
+        <li>{{ commentaire }}</li>
+    {% endfor %}
+    </ul>
+    </fieldset>
+
+    <fieldset>
+    <h2>Signatures</h2>
+    
+    <p class="signature"> ____________________________________________________________</p>
+    <p class="signature"> ____________________________________________________________</p>
+    <p class="signature"> ____________________________________________________________</p>
+    </fieldset>
+    
+
+</body>
index 8edebc8..770bcbe 100644 (file)
     <tr>
         <th>Durée {% if not poste.date_fin %}indéterminée{% endif %}</th>
         {% if poste.date_fin %}
-            <td>du {{ poste.date_debut }}</td>
-            <td>au {{ poste.date_fin }}</td>
+            <td>du {{ poste.date_debut }} au {{ poste.date_fin }}</td>
         {% else %}
             <td>à partir du {{ poste.date_debut }}</td>
         {% endif %}
     </tr>
     <tr>
         <th>Régime travail</th>
-        <td colspan="4">{{ poste.regime_travail }}%</td>
+        <td>{{ poste.regime_travail }}%</td>
     </tr>
     <tr>
         <th>Nombre d'heure par semaine</th>
index b534850..1f881ea 100644 (file)
@@ -1,6 +1,8 @@
 # -*- encoding: utf-8 -*-
 
+import os
 import datetime
+import StringIO
 from collections import defaultdict
 from datetime import date
 from simplejson import dumps
@@ -9,10 +11,13 @@ import warnings
 from django.core.urlresolvers import reverse
 from django.http import Http404, HttpResponse, HttpResponseGone
 from django.shortcuts import redirect, render_to_response, get_object_or_404
-from django.template import RequestContext
+from django.template import Context, RequestContext
+from django.template.loader import get_template
 from django.contrib import messages
+from django.conf import settings
 
 from reversion.models import Version
+import ho.pisa as pisa
 
 from project.dae import models as dae
 from project.rh_v1 import models as rh
@@ -23,6 +28,28 @@ from decorators import dae_groupe_requis, \
                        employe_dans_ma_region_ou_service
 from forms import *
 
+pisa.showLogging()
+
+def reponse_pdf(template_src, context_dict):
+    """
+    Générer une réponse HTTP avec un PDF
+    """
+    css = ""
+    for f in ('css/pdf.css', 'css/dae.css'):
+        css_file = os.path.join(settings.MEDIA_ROOT, f)
+        css += open(css_file, 'r').read()
+    context_dict['css'] = css
+
+    template = get_template(template_src)
+    context = Context(context_dict)
+    html  = template.render(context)
+    result = StringIO.StringIO()
+    pdf = pisa.pisaDocument(html, result, encoding='UTF-8')
+    if not pdf.err:
+        return HttpResponse(result.getvalue(), mimetype='application/pdf')
+    return HttpResponse("impossible de générer le pdf! %s" % html)
+
+
 @dae_groupe_requis
 def index(request):
     return render_to_response('dae/index.html', {}, RequestContext(request))
@@ -43,7 +70,16 @@ def poste_consulter(request, key):
         validationForm = PosteWorkflowForm(instance=poste, request=request)
     
     vars = {'poste' : poste, 'validationForm' : validationForm, }
-    return render_to_response('dae/poste_consulter.html', vars, RequestContext(request))
+
+
+    mode = request.GET.get('mode', None)
+    if mode is None:
+        return render_to_response('dae/poste_consulter.html', vars, RequestContext(request))
+    if mode == 'pdf':
+        return reponse_pdf('dae/poste_pdf.html', vars)
+    if mode == 'vpdf':
+        return render_to_response('dae/poste_pdf.html', vars, RequestContext(request))
+
 
 @dae_groupe_requis
 @poste_dans_ma_region_ou_service
index f7beb02..32e7406 100644 (file)
@@ -5,7 +5,7 @@
 .clear {display: block; clear: both;}
 .note {text-decoration: underline; font-style: italic; margin-left: 12px;}
 .info {font-size:13px;  font-style: italic;}
-.noborder {border:none; margin:0; padding; 0}
+.noborder {border:none; margin:0; padding: 0;}
 tr.noborder td {border:none; padding-left: 0;}
 .supprimer {text-decoration: none; color: blue; font-size: 12px; margin-left: 6px; cursor: pointer;}
 th ul.errorlist {float: right;}
@@ -13,4 +13,4 @@ th ul.errorlist {float: right;}
 .droite { float:right; text-align:right; }
 h2.section {width:100%; background-color: #D0E8F8; text-align: center; color: #5F5F5F; margin: 50px 0px 26px 0px; border-bottom: 3px solid #BBD8EC; padding: 4px;}
 .montant {text-align: right;}
-.bouton-modifier {border:1px #BBD8EC solid; font-size: 14px; font-weight: bold; margin: 12px 0; padding: 4px 8px; color: #BBD8EC;}
+.bouton-action {border:1px #BBD8EC solid; font-size: 14px; font-weight: bold; margin: 12px 0; padding: 4px 8px; color: #BBD8EC; margin-left: 6px;}
diff --git a/project/media/css/pdf.css b/project/media/css/pdf.css
new file mode 100644 (file)
index 0000000..749a98b
--- /dev/null
@@ -0,0 +1,35 @@
+p, ul { margin: 6px 0;}
+
+body { margin:0; padding:0; background:#fff; color:#454545; font:0.8em verdana, arial, helvetica, sans-serif; }
+
+h1 { margin:10px 0 0 0; padding:0; color:#d15517; font-size:200%;font-weight:bold; }
+h2 { margin:10px 0 0 0; padding:0; color:#5f5f5f; font-size:190%; }
+h3 { margin:10px 0 0 0; padding:0; color:#5f5f5f; font-size:170%; }
+h4 { margin:10px 0 0 0; padding:0; color:#5f5f5f; font-size:150%; }
+h5 { margin:10px 0 0 0; padding:0; background:inherit; color:#5f5f5f; font-size:130%; }
+
+li {margin-left: 1em; line-height:1.4em; }
+p {line-height:1.4em; text-align: justify; }
+
+a:link, a:visited { color:#0643bb; text-decoration:none; }
+a:active { color:#990000; text-decoration:none; }
+a:hover { color:#d15517; text-decoration:none; }
+a img { border:none; }
+
+strong {font-weight: bold;}
+
+form { margin:8px 17px 0 0; padding:0px; }
+fieldset {border: none; }
+label {font-weight: bold;}
+
+table { margin:10px 0px; border-collapse:collapse; padding:5px; }
+table th, table td{ font-size: 14px; border-top:1px solid #d0e8f8; border-left:1px solid #d0e8f8; padding: 5px; }
+table { border-bottom:1px solid #d0e8f8; border-right:1px solid #d0e8f8; }
+th { height:28px; border-top:2px solid #d0e8f8; padding:0 10px; background-color:#F8FBFD; font-size:14px; text-align:left; font-weight: bold;}
+td { vertical-align: top; }
+table h1, table h2, table h3, table h4, table h5 {font-size: 120%; }
+
+.cell-nombre { padding-right:0px; text-align:right; }
+.row1, .even {}
+.row2, .odd { background-color:#EFEFEF; }
+.signature {margin: 36px 0px;}