uncloud-mravi/uncloud_pay/admin.py
Nico Schottelius 9bf0a99f6a uncloud pay cleanups
Signed-off-by: Nico Schottelius <nico@nico-notebook.schottelius.org>
2020-08-08 22:20:49 +02:00

90 lines
2.7 KiB
Python

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
class BillRecordInline(admin.TabularInline):
# model = Bill.bill_records.through
model = BillRecord
# AT some point in the future: expose REPLACED and orders that depend on us
# class OrderInline(admin.TabularInline):
# model = Order
# fk_name = "replaces"
# class OrderAdmin(admin.ModelAdmin):
# inlines = [ OrderInline ]
class BillAdmin(admin.ModelAdmin):
inlines = [ BillRecordInline ]
# change_list_template = "uncloud_pay/change_list.html"
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.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,
'bill_records': bill.bill_records.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
# ...
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)
admin.site.register(BillingAddress)
#admin.site.register(Order, OrderAdmin)