Пример #1
0
def response_for_download(report, cd_value='attachment'):
    """
    Preparing response for downloading file
    Content-Disposition header field from http://tools.ietf.org/html/rfc2183
    :param:     report - instance of Report model
    :param:     cd_value - Content Disposition Value:
                    "attachment" - for download
                    "inline" - for preview
    :return:    HttpResponse with report.file and some parameters
    """
    path = report.file.path
    fileExt  = os.path.splitext(report.filename)[1]  # [0] returns path+filename
    ct = get_mimeType().get(fileExt.lower(), "application/octet-stream")
    filename = report.filename
    cdv = '%s; ' % cd_value
    fn = 'filename="%s"; ' % transliterate(filename)
    fns = "filename*=utf-8''%s; " % urlquote(filename)
    md = 'modification-date="%s"; ' % report.uploaded_on
    response = HttpResponse(content_type=ct)
    # content = report.file.read()
    with open(path, 'rb') as file:
        content = file.read()   # читаємо файл незалежно від report
                                # (інакше при тестуванні не завжди
                                # вдається видалити тимчасовий файл)
    response.write(content)
    response['Content-Disposition'] = cdv + fn + fns + md
    response['Content-Length'] = report.file.size
    return response
Пример #2
0
def response_for_download_zip(folder, maxFileSize = MAX_ZIP_FILE_SIZE):
    """
    Preparing response for downloading zip-file,
    consist of all files in folder (without recursion!)
    Content-Disposition header field from http://tools.ietf.org/html/rfc2183
    :param:     folder - instance of Folder model
    :return:    HttpResponse with zip file and some parameters
                Message in case of zip file overflow max size
    """
    zipSubdir = folder.name
    zipFilename = "%s.zip" % folder.name
    sio = BytesIO()  # Open StringIO to grab in-memory ZIP contents
    zipFile = zipfile.ZipFile(sio, "w")    # The zip compressor
    zipFileSize = 0
    msg = ""
    for report in Report.objects.filter(parent_id=folder.id):
        zipFileSize += report.file.size
        if zipFileSize > maxFileSize:
            msg = 'Завеликий zip. Решту файлів відкинуто'
            break
        filename = report.filename              # "людська" назва файла
        filepath = report.file.name             # шлях до файла на диску
        abs_path = os.path.join(MEDIA_ROOT, filepath)
        zipPath = os.path.join(zipSubdir, filename) # шлях в архіві
        zipFile.write(abs_path, zipPath)            # add file to zip
    zipFile.close() # Must close zip for all contents to be written
    fileExt  = ".zip"
    ct = get_mimeType().get(fileExt.lower(), "application/octet-stream")
    fn = ' filename="%s";' % transliterate(zipFilename)
    fns = " filename*=utf-8''%s;" % urlquote(zipFilename)
    # Grab ZIP file from in-memory, make response with correct MIME-type
    response = HttpResponse(sio.getvalue(), content_type=ct)
    response['Content-Disposition'] = 'attachment' + fn + fns
    response['Content-Length'] = len(sio.getbuffer())
    return response, zipFilename, msg
    def test_response_for_download_zip_gives_proper_value_3(self):
        file2 = SimpleUploadedFile("file2.txt", b"file_content")
        report2 = DummyFolder().create_dummy_report(self.root, file=file2)

        zipFilename = "%s.zip" % self.root.name
        fn = ' filename="%s";' % transliterate(zipFilename)
        fns = " filename*=utf-8''%s;" % urlquote(zipFilename)
        expected_content_disposition = 'attachment' + fn + fns

        resp, zipFilename, msg = response_for_download_zip(self.root, 15)

        self.assertEqual(zipFilename, 'Тека файлів.zip')
        self.assertEqual(msg, 'Завеликий zip. Решту файлів відкинуто')
        self.assertEqual(resp.get('Content-Disposition'), expected_content_disposition)
        self.assertEqual(resp.get('Content-Length'), '232')
        self.assertEqual(resp.get('Content-Type'), 'application/zip')
        # self.assertEqual(resp.content, b'file_content')

        report2.file.delete()
    def test_response_for_download_zip_gives_proper_value(self):
        zipFilename = "%s.zip" % self.root.name
        fn = ' filename="%s";' % transliterate(zipFilename)
        fns = " filename*=utf-8''%s;" % urlquote(zipFilename)
        expected_content_disposition = 'attachment' + fn + fns

        resp, zipFilename, msg = response_for_download_zip(self.root)

        self.assertEqual(zipFilename, 'Тека файлів.zip')
        self.assertEqual(msg, "")
        self.assertEqual(resp.get('Content-Disposition'), expected_content_disposition)
        self.assertEqual(resp.get('Content-Length'), '232')
        self.assertEqual(resp.get('Content-Type'), 'application/zip')
        expected_namelist = ['Тека файлів/Текстовий файл.txt']
        bio = BytesIO()  # Open ByteIO to grab in-memory file
        bio.write(resp.content)         # записуємо вміст у "файл"
        zipFile = zipfile.ZipFile(bio)  # "файл" як zipfile
        self.assertIsNone(zipFile.testzip())
        self.assertEqual(zipFile.namelist(), expected_namelist)
    def test_response_for_download_gives_proper_value(self):
        filename = self.report.filename
        cd_value = "attachment"
        cdv = '%s; ' % cd_value
        fn = 'filename="%s"; ' % transliterate(filename)
        fns = "filename*=utf-8''%s; " % urlquote(filename)
        md = 'modification-date="%s"; ' % self.report.uploaded_on
        expected_content_disposition = cdv + fn + fns + md

        resp = response_for_download(self.report)
        self.assertEqual(resp.get('Content-Disposition'), expected_content_disposition)
        self.assertEqual(resp.get('Content-Length'), '12')
        self.assertEqual(resp.get('Content-Type'), 'text/plain')
        self.assertEqual(resp.content, b'file_content')

        cd_value = "inline"
        cdv = '%s; ' % cd_value
        expected_content_disposition = cdv + fn + fns + md
        resp = response_for_download(self.report, cd_value=cd_value)
        self.assertEqual(resp.get('Content-Disposition'), expected_content_disposition)
    def test_response_for_download_zip_gives_proper_value_3(self):
        file2 = SimpleUploadedFile("file2.txt", b"file_content")
        report2 = DummyFolder().create_dummy_report(self.root, file=file2)

        zipFilename = "%s.zip" % self.root.name
        fn = ' filename="%s";' % transliterate(zipFilename)
        fns = " filename*=utf-8''%s;" % urlquote(zipFilename)
        expected_content_disposition = 'attachment' + fn + fns

        resp, zipFilename, msg = response_for_download_zip(self.root, 15)

        self.assertEqual(zipFilename, 'Тека файлів.zip')
        self.assertEqual(msg, 'Завеликий zip. Решту файлів відкинуто')
        self.assertEqual(resp.get('Content-Disposition'),
                         expected_content_disposition)
        self.assertEqual(resp.get('Content-Length'), '232')
        self.assertEqual(resp.get('Content-Type'), 'application/zip')
        # self.assertEqual(resp.content, b'file_content')

        report2.file.delete()
    def test_response_for_download_zip_gives_proper_value(self):
        zipFilename = "%s.zip" % self.root.name
        fn = ' filename="%s";' % transliterate(zipFilename)
        fns = " filename*=utf-8''%s;" % urlquote(zipFilename)
        expected_content_disposition = 'attachment' + fn + fns

        resp, zipFilename, msg = response_for_download_zip(self.root)

        self.assertEqual(zipFilename, 'Тека файлів.zip')
        self.assertEqual(msg, "")
        self.assertEqual(resp.get('Content-Disposition'),
                         expected_content_disposition)
        self.assertEqual(resp.get('Content-Length'), '232')
        self.assertEqual(resp.get('Content-Type'), 'application/zip')
        expected_namelist = ['Тека файлів/Текстовий файл.txt']
        bio = BytesIO()  # Open ByteIO to grab in-memory file
        bio.write(resp.content)  # записуємо вміст у "файл"
        zipFile = zipfile.ZipFile(bio)  # "файл" як zipfile
        self.assertIsNone(zipFile.testzip())
        self.assertEqual(zipFile.namelist(), expected_namelist)
    def test_response_for_download_gives_proper_value(self):
        filename = self.report.filename
        cd_value = "attachment"
        cdv = '%s; ' % cd_value
        fn = 'filename="%s"; ' % transliterate(filename)
        fns = "filename*=utf-8''%s; " % urlquote(filename)
        md = 'modification-date="%s"; ' % self.report.uploaded_on
        expected_content_disposition = cdv + fn + fns + md

        resp = response_for_download(self.report)
        self.assertEqual(resp.get('Content-Disposition'),
                         expected_content_disposition)
        self.assertEqual(resp.get('Content-Length'), '12')
        self.assertEqual(resp.get('Content-Type'), 'text/plain')
        self.assertEqual(resp.content, b'file_content')

        cd_value = "inline"
        cdv = '%s; ' % cd_value
        expected_content_disposition = cdv + fn + fns + md
        resp = response_for_download(self.report, cd_value=cd_value)
        self.assertEqual(resp.get('Content-Disposition'),
                         expected_content_disposition)
 def test_other_examples(self):
     for e in self.examples:
         ukr = e[0].strip()
         eng = e[1]
         trans = transliterate(ukr)
         self.assertEqual(trans, eng)
Пример #10
0
 def test_other_examples(self):
     for e in self.examples:
         ukr = e[0].strip()
         eng = e[1]
         trans = transliterate(ukr)
         self.assertEqual(trans, eng)