def generate_resource(request, resource_slug): """View for generated PDF of a specific resource. Args: request: HttpRequest object. resource_slug: The slug of the requested resource. Returns: HTML response containing PDF of resource, 404 if not found. """ resource = get_object_or_404(Resource, slug=resource_slug) if not request.GET: raise Http404("No parameters given for resource generation.") try: generator = get_resource_generator(resource.generator_module, request.GET) except (QueryParameterMissingError, QueryParameterInvalidError, QueryParameterMultipleValuesError) as e: raise Http404(e) from e # TODO: Weasyprint handling in production # TODO: Add creation of PDF as job to job queue if settings.DJANGO_PRODUCTION: # Return cached static PDF file of resource. # Currently developing system for dynamically rendering # custom PDFs on request (https://github.com/uccser/render). return resource_pdf_cache(resource, generator) else: (pdf_file, filename) = generator.pdf(resource.name) response = HttpResponse(pdf_file, content_type="application/pdf") response["Content-Disposition"] = RESPONSE_CONTENT_DISPOSITION.format( filename=quote(filename)) return response
def test_resources_cache_valid_resource(self): resource = self.test_data.create_resource( "grid", "Grid", "resources/grid.html", "GridResourceGenerator", ) query = QueryDict("paper_size=a4") generator = get_resource_generator(resource.generator_module, query) response = resource_pdf_cache(resource.name, generator) self.assertEqual(response.status_code, HTTPStatus.FOUND) self.assertEqual(response.url, "/staticfiles/resources/Grid%20(a4).pdf")