from django.contrib import admin from django.template.response import TemplateResponse from django.urls import path from django.shortcuts import render from django.conf.urls import url 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 * class BillRecordInline(admin.TabularInline): model = BillRecord class RecurringPeriodInline(admin.TabularInline): model = ProductToRecurringPeriod class ProductAdmin(admin.ModelAdmin): inlines = [ RecurringPeriodInline ] class BillAdmin(admin.ModelAdmin): inlines = [ BillRecordInline ] def get_urls(self): """ Create URLs for PDF view """ 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.as_pdf), pat(r'^([0-9]+)/as_html/$', self.as_html), ] + super().get_urls() return url_patterns def as_pdf(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( "uncloud_pay/bill.html.j2", { 'bill': bill, 'bill_records': bill.billrecord_set.all() } ) 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 def as_html(self, request, object_id): bill = self.get_object(request, object_id=object_id) if bill is None: raise self._get_404_exception(object_id) return render(request, 'uncloud_pay/bill.html.j2', {'bill': bill, 'bill_records': bill.billrecord_set.all() }) bill_html = render_to_string("bill.html.j2", {'bill': bill, 'bill_records': bill.billrecord_set.all() }) 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 HttpResponse(template.render(context, request)) return response admin.site.register(Bill, BillAdmin) admin.site.register(Product, ProductAdmin) for m in [ BillingAddress, Order, BillRecord, Payment, ProductToRecurringPeriod, RecurringPeriod, StripeCreditCard, StripeCustomer, PricingPlan, VATRate ]: admin.site.register(m)