def test_defaults(self): """sendfile() takes at least request and filename.""" request = django.test.RequestFactory().get("/fake-url") filename = __file__ response = sendfile(request, filename) self.assertTrue(isinstance(response, DownloadResponse)) self.assertFalse(response.attachment)
def get(self, request, *args, **kwargs): # Get document or raise HTTP404 doc = get_object_or_404(models.Document, pk=self.kwargs.get("pk")) # If document is an exam or marked as non-public, require login if doc.dtype == doc.DTypes.EXAM or doc.public is False: if not self.request.user.is_authenticated: return redirect("%s?next=%s" % ( reverse("auth_login"), reverse( "documents:document_list", kwargs={"category": slugify(doc.category.name)}, ), )) # Log download timerange = datetime.datetime.now() - datetime.timedelta(1) filters = {"document": doc, "timestamp__gt": timerange} if not models.DocumentDownload.objects.filter(**filters).exists(): models.DocumentDownload.objects.create(document=doc) # Serve file filename = unicodedata.normalize("NFKD", doc.original_filename).encode( "ascii", "ignore") attachment = b"inline" if filename.lower().endswith( b".pdf") else b"attachment" response = sendfile(request, doc.document.path, encoding="ascii") # NOTE: The Content-Disposition header is much more complex with UTF-8 # filenames, but we've made sure the filename only contains ASCII # above. response["Content-Disposition"] = b'%s; filename="%s"' % (attachment, filename) return response
def test_defaults(self): """sendfile() takes at least request and filename.""" request = django.test.RequestFactory().get('/fake-url') filename = __file__ response = sendfile(request, filename) self.assertTrue(isinstance(response, DownloadResponse)) self.assertFalse(response.attachment)
def test_custom(self): """sendfile() accepts various arguments for response tuning.""" request = django.test.RequestFactory().get('/fake-url') filename = __file__ response = sendfile(request, filename, attachment=True, attachment_filename='toto.txt', mimetype='test/octet-stream', encoding='gzip') self.assertTrue(isinstance(response, DownloadResponse)) self.assertTrue(response.attachment) self.assertEqual(response.basename, 'toto.txt') self.assertEqual(response['Content-Type'], 'test/octet-stream; charset=utf-8') self.assertEqual(response.get_encoding(), 'gzip')
def test_custom(self): """sendfile() accepts various arguments for response tuning.""" request = django.test.RequestFactory().get("/fake-url") filename = __file__ response = sendfile( request, filename, attachment=True, attachment_filename="toto.txt", mimetype="test/octet-stream", encoding="gzip", ) self.assertTrue(isinstance(response, DownloadResponse)) self.assertTrue(response.attachment) self.assertEqual(response.basename, "toto.txt") self.assertEqual(response["Content-Type"], "test/octet-stream; charset=utf-8") self.assertEqual(response.get_encoding(), "gzip")
def get(self, request, *args, **kwargs): doc = get_object_or_404(models.Document, pk=self.kwargs.get("pk")) if not os.path.exists(doc.document.path): return HttpResponseBadRequest("Document has no file attached.") if not doc.document.path.lower().endswith(".pdf"): return HttpResponseBadRequest( "File has to be a PDF to create a thumbnail") thumbnail_path = f"{doc.document.path}.png" if not os.path.exists(thumbnail_path): try: self.generate_thumbnail(doc.document.path, thumbnail_path) except subprocess.CalledProcessError as e: logger.error( "Thumbnail for {} could not be created: {}".format( doc.document.path, e)) filename = unicodedata.normalize("NFKD", thumbnail_path) return sendfile(request, thumbnail_path, attachment=False, attachment_filename=filename)
def test_404(self): """sendfile() raises Http404 if file does not exists.""" request = django.test.RequestFactory().get("/fake-url") filename = "i-do-no-exist" with self.assertRaises(Http404): sendfile(request, filename)
def test_404(self): """sendfile() raises Http404 if file does not exists.""" request = django.test.RequestFactory().get('/fake-url') filename = 'i-do-no-exist' with self.assertRaises(Http404): sendfile(request, filename)
def get(self, request, uid, *args, **kwargs): content = Content.objects.filter(uid=uid, entity=settings.AGENT['entity']).first() if content: return sendfile(request, filename=os.path.join(settings.MEDIA_ROOT, content.uid)) else: return Response(f'Not Found', status=404)