nk20/apps/treasury/views.py

92 lines
2.5 KiB
Python
Raw Normal View History

2020-03-20 23:30:49 +00:00
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
2020-03-21 08:22:38 +00:00
import os
import shutil
import subprocess
from tempfile import mkdtemp
2020-03-20 23:30:49 +00:00
from django.contrib.auth.mixins import LoginRequiredMixin
2020-03-21 08:22:38 +00:00
from django.http import HttpResponse
from django.template.loader import render_to_string
from django.views.generic import CreateView, UpdateView
2020-03-21 06:36:07 +00:00
from django.views.generic.base import View
2020-03-20 23:30:49 +00:00
from django_tables2 import SingleTableView
2020-03-21 08:22:38 +00:00
from note_kfet.settings.base import BASE_DIR
2020-03-20 23:30:49 +00:00
from .models import Billing
from .tables import BillingTable
class BillingCreateView(LoginRequiredMixin, CreateView):
"""
Create Billing
"""
model = Billing
fields = '__all__'
# form_class = ClubForm
2020-03-20 23:30:49 +00:00
class BillingListView(LoginRequiredMixin, SingleTableView):
"""
List existing Billings
"""
model = Billing
table_class = BillingTable
class BillingUpdateView(LoginRequiredMixin, UpdateView):
"""
Create Billing
"""
model = Billing
fields = '__all__'
2020-03-21 06:36:07 +00:00
# form_class = BillingForm
2020-03-21 08:22:38 +00:00
class BillingRenderView(LoginRequiredMixin, View):
2020-03-21 06:36:07 +00:00
"""
2020-03-21 08:22:38 +00:00
Render Billing as generated PDF
2020-03-21 06:36:07 +00:00
"""
2020-03-21 08:22:38 +00:00
def get(self, request, **kwargs):
pk = kwargs["pk"]
billing = Billing.objects.get(pk=pk)
billing.description = billing.description.replace("\n", "\\newline\n")
billing.address = billing.address.replace("\n", "\\newline\n")
tex = render_to_string("treasury/billing_sample.tex", dict(obj=billing))
try:
os.mkdir(BASE_DIR + "/tmp")
except FileExistsError:
pass
tmp_dir = mkdtemp(prefix=BASE_DIR + "/tmp/")
with open("{}/billing-{:d}.tex".format(tmp_dir, pk), "wb") as f:
f.write(tex.encode("UTF-8"))
del tex
error = subprocess.Popen(
["pdflatex", "billing-{}.tex".format(pk)],
cwd=tmp_dir,
stdin=open(os.devnull, "r"),
stderr=open(os.devnull, "wb"),
stdout=open(os.devnull, "wb")
).wait()
error = subprocess.Popen(
["pdflatex", "billing-{}.tex".format(pk)],
cwd=tmp_dir,
stdin=open(os.devnull, "r"),
stderr=open(os.devnull, "wb"),
stdout=open(os.devnull, "wb")
).wait()
pdf = open("{}/billing-{}.pdf".format(tmp_dir, pk), 'rb').read()
shutil.rmtree(tmp_dir)
response = HttpResponse(pdf, content_type="application/pdf")
response['Content-Disposition'] = "inline;filename=billing-{:d}.pdf".format(pk)
return response