import datetime from django.views.generic.detail import DetailView from django.template.loader import render_to_string from django.http import HttpResponse from django.conf import settings from weasyprint import HTML, CSS from .models import Invoice, InvoiceItem class MonthlyInvoiceView(DetailView): model = Invoice template_name = "admin/income/monthly.html" slug_field = "slug" def get_context_data(self, **kwargs): context = super(MonthlyInvoiceView, self).get_context_data(**kwargs) context['object_list'] = InvoiceItem.objects.filter(time_start__range=[self.object.date_start, self.object.date_end]) total_time = [] for item in context['object_list']: total_time.append(item.rounded_total) duration = (sum(total_time, datetime.timedelta())) hours = duration.total_seconds() // 3600 context['total_hours'] = hours context['total_billed'] = int(hours * 100) context['invoice_number'] = self.object.id+21 return context class DownloadMonthlyInvoiceView(MonthlyInvoiceView): model = Invoice slug_field = "slug" def get(self, *args, **kwargs): import logging logger = logging.getLogger('weasyprint') logger.addHandler(logging.FileHandler('weasyprint.log')) self.object = self.get_object() # assign the object to the view c = {'object': self.object} t = render_to_string('details/invoice.html', c).encode('utf-8') html = HTML(string=t, base_url=self.request.build_absolute_uri()) pdf = html.write_pdf(stylesheets=[CSS(settings.MEDIA_ROOT + 'site/media/pdf_gen.css')], presentational_hints=True) response = HttpResponse(pdf, content_type='application/pdf') response['Content-Disposition'] = 'inline; filename="invoice.pdf"' return response