From 11de455d23aaeb342f18b96b01602fb99b0b12e8 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sun, 21 Jun 2020 23:46:26 +0200 Subject: [PATCH] begin to add pdf view of bill into admin --- uncloud_pay/admin.py | 58 ++++++++++++++++++++++++++++++ uncloud_pay/templates/bill.html.j2 | 5 +-- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/uncloud_pay/admin.py b/uncloud_pay/admin.py index a78462b..74b1e2e 100644 --- a/uncloud_pay/admin.py +++ b/uncloud_pay/admin.py @@ -1,4 +1,14 @@ from django.contrib import admin +from django.template.response import TemplateResponse +from django.urls import path +from django.conf.urls import url + +from uncloud_pay.views import BillViewSet +from hardcopy import bytestring_to_pdf +from django.core.files.temp import NamedTemporaryFile +from django.http import FileResponse +from django.template.loader import render_to_string + from uncloud_pay.models import Bill, Order, BillRecord, BillingAddress @@ -8,6 +18,54 @@ class BillRecordInline(admin.TabularInline): class BillAdmin(admin.ModelAdmin): inlines = [ BillRecordInline ] +# change_list_template = "uncloud_pay/change_list.html" + + def get_urls(self): + info = "%s_%s" % (self.model._meta.app_label, self.model._meta.model_name) + pat = lambda regex, fn: url(regex, self.admin_site.admin_view(fn), name='%s_%s' % (info, fn.__name__)) + + url_patterns = [ + pat(r'^([0-9]+)/as_pdf/$', self.my_view), + ] + super().get_urls() + + return url_patterns + + # def changelist_view(self, request, extra_context=None): + # extra_context = extra_context or {} + + # print("view exec") + # return super().changelist_view( + # request, extra_context=extra_context, + # ) + + + def my_view(self, request, object_id): + bill = self.get_object(request, object_id=object_id) + print(bill) + + if bill is None: + raise self._get_404_exception(object_id) + + output_file = NamedTemporaryFile() + bill_html = render_to_string("bill.html.j2", {'bill': bill}) + + bytestring_to_pdf(bill_html.encode('utf-8'), output_file) + response = FileResponse(output_file, content_type="application/pdf") + response['Content-Disposition'] = f'filename="bill_{bill}.pdf"' + + return response + + # ... + context = dict( + # Include common variables for rendering the admin template. + self.admin_site.each_context(request), + # Anything else you want in the context... +# key=value, + ) + + #return TemplateResponse(request, "admin/change_list.html", context) + + admin.site.register(Bill, BillAdmin) admin.site.register(Order) admin.site.register(BillRecord) diff --git a/uncloud_pay/templates/bill.html.j2 b/uncloud_pay/templates/bill.html.j2 index 0ea7089..f8ed28b 100644 --- a/uncloud_pay/templates/bill.html.j2 +++ b/uncloud_pay/templates/bill.html.j2 @@ -26,7 +26,7 @@ - {{ bill.reference }} | {{ bill.uuid }} + {{ bill }}