django-reversion
simplejson
django-ajax-selects
+ reportlab
+ html5lib
+ pyPDF
+ pisa
[versions]
django-admin-tools = 0.4.0
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
{% 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>
{% 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" %}
--- /dev/null
+<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>
<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>
# -*- encoding: utf-8 -*-
+import os
import datetime
+import StringIO
from collections import defaultdict
from datetime import date
from simplejson import dumps
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
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))
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
.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;}
.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;}
--- /dev/null
+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;}