Browse Source

First draft for generating PDF from invoice

Fabs 11 years ago
parent
commit
7458ed1e8d

+ 2 - 1
coin/billing/models.py

@@ -53,7 +53,8 @@ class InvoiceDetail(models.Model):
                                  verbose_name='Montant')
     quantity = models.IntegerField(null=True, verbose_name=u'Quantité')
     tax = models.IntegerField(null=True, default=0, verbose_name='TVA')
-    invoice = models.ForeignKey(Invoice, verbose_name='Facture')
+    invoice = models.ForeignKey(Invoice, verbose_name='Facture',
+                                related_name='details')
     offer = models.ForeignKey(Offer, null=True, verbose_name='Offre')
 
     def __unicode__(self):

+ 49 - 0
coin/billing/process_latex.py

@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+from subprocess import call, PIPE
+from os import remove, rename
+from os.path import dirname
+from tempfile import NamedTemporaryFile
+from django.template import loader, Context
+from django.conf import settings
+
+def process_latex(template, context={}, type='pdf', outfile=None):
+    """
+    Processes a template as a LaTeX source file.
+    Output is either being returned or stored in outfile.
+    At the moment only pdf output is supported.
+    """
+
+    t = loader.get_template(template)
+    c = Context(context)
+    r = t.render(c)
+
+    tex = NamedTemporaryFile()
+    tex.write(r.encode('utf-8'))
+    tex.flush()
+    base = tex.name
+    items = "log aux pdf dvi png".split()
+    names = dict((x, '%s.%s' % (base, x)) for x in items)
+    output = names[type]
+
+    if type == 'pdf' or type == 'dvi':
+        pdflatex(base, type)
+    elif type == 'png':
+        pdflatex(base, 'dvi')
+        call(['dvipng', '-bg', '-transparent',
+              names['dvi'], '-o', names['png']],
+              cwd=dirname(base), stdout=PIPE, stderr=PIPE)
+
+    remove(names['log'])
+    remove(names['aux'])
+
+    if not outfile:
+        o = file(output).read()
+        remove(output)
+        return o
+    else:
+        rename(output, outfile)
+
+def pdflatex(file, type='pdf'):
+    call([settings.PDFLATEX_PATH, '-interaction=nonstopmode',
+                      '-output-format', type, file],
+         cwd=dirname(file), stdout=PIPE, stderr=PIPE)

+ 23 - 0
coin/billing/templates/billing/invoice.tex

@@ -0,0 +1,23 @@
+{% autoescape off %}
+	%Preambule du document :
+	\documentclass[11pt]{report}
+	\usepackage[utf8]{inputenc}
+	\usepackage[francais]{babel}
+
+	%Corps du document :
+	\begin{document}
+	    Number : {{ invoice.number }}
+	    Date : {{ invoice.date }}
+	    Facture du {{ invoice.period_from }} au {{ invoice.period_to }}
+	    Paiement le : {{ invoice.date_due }}
+
+	    Détails :
+	    {% for detail in invoice.details.all %}
+	    	{{ detail.label }}
+	    	{{ detail.amount }}
+	    	{{ detail.quantity }}
+	    	{{ detail.tax }}
+	    {% endfor %}
+
+	\end{document}
+{% endautoescape %}

+ 11 - 0
coin/billing/templates/billing/test.tex

@@ -0,0 +1,11 @@
+{% autoescape off %}
+	%Preambule du document :
+	\documentclass[11pt]{report}
+	\usepackage[latin1]{inputenc}
+	\usepackage[francais]{babel}
+
+	%Corps du document :
+	\begin{document}
+	    Hello World ! : {{ blop }}
+	\end{document}
+{% endautoescape %}

+ 11 - 0
coin/billing/urls.py

@@ -0,0 +1,11 @@
+from django.conf.urls import patterns, url
+from django.views.generic import DetailView
+from coin.billing import views
+
+
+urlpatterns = patterns(
+    '',
+    url(r'^pdf_test$', views.pdf_test, name='pdf_test'),
+    url(r'^invoice/(?P<pk>\d+)/pdf$', views.invoice_pdf),
+
+)

+ 28 - 2
coin/billing/views.py

@@ -1,3 +1,29 @@
-from django.shortcuts import render
+# -*- coding: utf-8 -*-
+from django.http import HttpResponse
+# from django.template import Context, loader
+from django.shortcuts import render #, get_object_or_404
+#from django.http import Http404
+#from coin.members.models import Member
+from coin.billing.process_latex import process_latex
+from django.shortcuts import get_object_or_404
+from coin.billing.models import Invoice
 
-# Create your views here.
+def pdf_test(request):
+
+    context = {"blop":"COIN !"}
+
+    response = HttpResponse(content_type='application/pdf')
+    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'
+    response.write(process_latex('billing/test.tex', context))
+    return response
+
+
+def invoice_pdf(request, pk):
+
+	invoice = get_object_or_404(Invoice, pk=1)
+	context = {"invoice":invoice}
+
+	response = HttpResponse(content_type='application/pdf')
+	response['Content-Disposition'] = 'attachment; filename="facture.pdf"'
+	response.write(process_latex('billing/invoice.tex', context))
+	return response

+ 2 - 0
coin/settings.py

@@ -226,6 +226,8 @@ AUTH_LDAP_USER_FLAGS_BY_GROUP = {
 }
 
 
+PDFLATEX_PATH = "pdflatex"
+
 # Surcharge les paramètres en utilisant le fichier settings-local.py
 try:
     from settings_local import *

+ 1 - 0
coin/urls.py

@@ -16,6 +16,7 @@ urlpatterns = patterns(
     url(r'^members/login/$', 'django.contrib.auth.views.login',
         {'template_name': 'members/login.html'}),
     url(r'^members/', include('coin.members.urls', namespace='members')),
+    url(r'^billing/', include('coin.billing.urls', namespace='billing')),
 
     url(r'^admin/', include(admin.site.urls)),