from os import remove from re import compile from django.conf import settings from django.contrib.sites.models import Site from django.template.context import RequestContext from django.template.response import HttpResponse from django.views.generic import TemplateView from wkhtmltopdf.utils import template_to_temp_file, wkhtmltopdf class PDFResponse(HttpResponse): def __init__(self, content, filename): super(PDFResponse, self).__init__(content, 'application/pdf') self.__setitem__('Content-Disposition', 'attachment; filename=%s' % filename) class PdfResponse(PDFResponse): def __init__(self, content, filename): warning = '''PdfResponse is deprecated in favour of PDFResponse. It will be removed in version 1.''' raise PendingDeprecationWarning(warning) super(PdfResponse, self).__init__(content, filename) class PDFTemplateView(TemplateView): filename = 'rendered_pdf.pdf' footer_template = None header_template = None orientation = 'portrait' margin_bottom = 0 margin_left = 0 margin_right = 0 margin_top = 0 response = PDFResponse def get(self, request, context_instance=None, *args, **kwargs): if request.GET.get('as', '') == 'html': return super(PDFTemplateView, self).get(request, *args, **kwargs) if context_instance: self.context_instance = context_instance else: self.context_instance = RequestContext(request, self.get_context_data(**kwargs)) page_path = template_to_temp_file(self.get_template_names(), self.get_context_data(), self.context_instance) pdf_kwargs = self.get_pdf_kwargs() return self.response(wkhtmltopdf(page_path, **pdf_kwargs), self.get_filename()) def get_filename(self): return self.filename def get_pdf_kwargs(self): kwargs = { 'margin_bottom': self.margin_bottom, 'margin_left': self.margin_left, 'margin_right': self.margin_right, 'margin_top': self.margin_top, 'orientation': self.orientation, } tmp_files = [] if self.header_template: kwargs['header_html'] = template_to_temp_file(self.header_template, self.get_context_data(), self.context_instance) tmp_files.append(kwargs['header_html']) if self.footer_template: kwargs['footer_html'] = template_to_temp_file(self.footer_template, self.get_context_data(), self.context_instance) tmp_files.append(kwargs['footer_html']) map(remove, tmp_files) return kwargs def get_context_data(self, **kwargs): context = super(PDFTemplateView, self).get_context_data(**kwargs) match_full_url = compile(r'^https?://') if not match_full_url.match(settings.STATIC_URL): context['STATIC_URL'] = 'http://' + Site.objects.get_current().domain + settings.STATIC_URL if not match_full_url.match(settings.MEDIA_URL): context['MEDIA_URL'] = 'http://' + Site.objects.get_current().domain + settings.MEDIA_URL return context class PdfTemplateView(PDFTemplateView): #TODO: Remove this in v1.0 def as_view(cls, **initkwargs): warning = '''PdfTemplateView is deprecated in favour of PDFTemplateView. It will be removed in version 1.''' raise PendingDeprecationWarning(warning) return super(PdfTemplateView, cls).as_view(**initkwargs)