From 0deee454cfd3df05a0412288fbc904b3026ada01 Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Fri, 7 Aug 2015 11:52:00 +0200 Subject: [PATCH] contrib.teamnet_axel: invoice pdf download endpoint (#8035) --- passerelle/contrib/teamnet_axel/models.py | 9 +++++++++ .../passerelle/contrib/teamnet_axel/detail.html | 6 ++++++ passerelle/contrib/teamnet_axel/urls.py | 2 ++ passerelle/contrib/teamnet_axel/views.py | 16 ++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/passerelle/contrib/teamnet_axel/models.py b/passerelle/contrib/teamnet_axel/models.py index 00e3bf8..a0937b4 100644 --- a/passerelle/contrib/teamnet_axel/models.py +++ b/passerelle/contrib/teamnet_axel/models.py @@ -15,6 +15,7 @@ # along with this program. If not, see . import logging +import base64 import xml.etree.ElementTree as ET from django.core.urlresolvers import reverse @@ -152,6 +153,14 @@ class Management(BaseResource): invoices = [utils.normalize_invoice(i.attrib, family_id) for i in xml_invoices] return sorted(invoices, key=lambda i: i['created'], reverse=True) + def invoice_pdf(self, family_id, invoice_id): + invoice_xml = ET.Element('FACTUREPDF') + ET.SubElement(invoice_xml, 'IDFAMILLE').text = family_id + ET.SubElement(ET.SubElement(invoice_xml, 'FACTURES'), 'NOFACTURE').text = invoice_id + data = self.get_data('FacturesPDF', invoice_xml) + pdf = data.find('PORTAIL/PDF') + return base64.b64decode(pdf.get('FILE')) + class Link(models.Model): resource = models.ForeignKey(Management) diff --git a/passerelle/contrib/teamnet_axel/templates/passerelle/contrib/teamnet_axel/detail.html b/passerelle/contrib/teamnet_axel/templates/passerelle/contrib/teamnet_axel/detail.html index c7c5ccb..f17fd07 100644 --- a/passerelle/contrib/teamnet_axel/templates/passerelle/contrib/teamnet_axel/detail.html +++ b/passerelle/contrib/teamnet_axel/templates/passerelle/contrib/teamnet_axel/detail.html @@ -58,6 +58,12 @@ 2345 {% trans 'is family identifier' %}, 20150916 {% trans 'is invoice identifier' %} +
  • {% trans 'Get invoice pdf:' %} + {% url 'teamnet-axel-invoice-pdf' slug=object.slug regie_id='42' invoice_id='2345-20150916' as invoice_download_url %} + + {{ site_base_uri }}{{ invoice_download_url }} + +
  • diff --git a/passerelle/contrib/teamnet_axel/urls.py b/passerelle/contrib/teamnet_axel/urls.py index 293d1e8..9753c74 100644 --- a/passerelle/contrib/teamnet_axel/urls.py +++ b/passerelle/contrib/teamnet_axel/urls.py @@ -41,6 +41,8 @@ public_urlpatterns = patterns('', name='teamnet-axel-invoices'), url(r'^(?P[\w,-]+)/regie/(?P[\w,-]+)/invoice/(?P[\w,-]+)/$', InvoiceView.as_view(), name='teamnet-axel-invoice'), + url(r'^(?P[\w,-]+)/regie/(?P[\w,-]+)/invoice/(?P[\w,-]+)/pdf/$', InvoicePDFView.as_view(), + name='teamnet-axel-invoice-pdf'), #url(r'^(?P[\w,-]+)/invoice-pdf/(?P[\w,-]+)/$', InvoicePDFView.as_view(), # name='teamnet-axel-unlink'), #url(r'^(?P[\w,-]+)/invoice-paid/(?P[\w,-]+)/$', InvoicePayView.as_view(), diff --git a/passerelle/contrib/teamnet_axel/views.py b/passerelle/contrib/teamnet_axel/views.py index 3368b9c..b917f7b 100644 --- a/passerelle/contrib/teamnet_axel/views.py +++ b/passerelle/contrib/teamnet_axel/views.py @@ -14,9 +14,11 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . + from django.core.urlresolvers import reverse from django.views.generic import DetailView as GenericDetailView from django.views.generic.edit import CreateView, UpdateView, DeleteView +from django.http import HttpResponse, Http404 from passerelle import utils @@ -164,3 +166,17 @@ class InvoiceView(DetailView): for invoice in invoices: if invoice['id'] == kwargs['invoice_id']: return invoice + + +class InvoicePDFView(DetailView): + + def get_data(self, request, *args, **kwargs): + family_id, invoice_id = kwargs['invoice_id'].split('-', 1) + pdf = self.object.invoice_pdf(family_id, invoice_id) + if not pdf: + raise Http404() + + response = HttpResponse(content_type='application/pdf') + response['Content-Disposition'] = 'attachment; filename="%s.pdf"' % invoice_id + response.write(pdf) + return response -- 2.5.3