Esempio n. 1
0
    def get_path_response(self,
                          path,
                          request,
                          force_download=False,
                          paginator=None):
        self.validate_path(path)
        try:
            if not path:
                raise OSError(errno.EISDIR, os.strerror(errno.EISDIR), path)

            if os.path.isfile(self.object_path):
                container_path = os.path.join(
                    os.path.dirname(self.object_path),
                    path.split('/', 1)[0])
                container_path = normalize_path(container_path)
                if container_path == self.object_path:
                    path = path.split('/', 1)[1]

            fid = FormatIdentifier(allow_unknown_file_types=True)
            content_type = fid.get_mimetype(path)
            return generate_file_response(self.open_file(path, 'rb'),
                                          content_type,
                                          force_download=force_download,
                                          name=path)
        except (IOError, OSError) as e:
            if e.errno == errno.ENOENT:
                raise exceptions.NotFound

            # Windows raises PermissionDenied (errno.EACCES) when trying to use
            # open() on a directory
            if os.name == 'nt':
                if e.errno not in (errno.EACCES, errno.EISDIR):
                    raise
            elif e.errno != errno.EISDIR:
                raise
        except IndexError:
            if force_download:
                fid = FormatIdentifier(allow_unknown_file_types=True)
                content_type = fid.get_mimetype(path)
                return generate_file_response(self.open_file(
                    self.object_path, 'rb'),
                                              content_type,
                                              force_download=force_download,
                                              name=path)

        entries = self.list_files(path)
        if paginator is not None:
            paginated = paginator.paginate_queryset(entries, request)
            return paginator.get_paginated_response(paginated)
        return Response(entries)
Esempio n. 2
0
    def test_when_force_download_and_filename_not_none_then_add_attachment(
            self, get_charset, get_filename):
        content_type = "text/plain"
        mock_file_obj = mock.Mock()

        resp = generate_file_response(mock_file_obj,
                                      content_type,
                                      force_download=True)
        headers = self.get_headers_from_response(resp)

        self.assertEqual(
            headers, {
                'Cache-Control':
                'no-cache, no-store, must-revalidate',
                'Pragma':
                'no-cache',
                'Expires':
                '0',
                'Content-Type':
                'text/plain; charset=utf-8',
                'Content-Disposition':
                'attachment; filename="{}"'.format("some_file_name.txt")
            })

        self.assertEqual(type(resp), FileResponse)
Esempio n. 3
0
    def test_when_filename_is_not_ascii(self, get_charset):
        content_type = 'text/plain'

        resp = generate_file_response(
            ContentFile(b'binary content', 'none_ascii_å_name.txt'),
            content_type,
        )
        headers = self.get_headers_from_response(resp)

        self.assertEqual(
            headers, {
                'Cache-Control':
                'no-cache, no-store, must-revalidate',
                'Pragma':
                'no-cache',
                'Expires':
                '0',
                'Content-Type':
                'text/plain; charset=utf-8',
                'Content-Disposition':
                "inline; filename*=utf-8''{}".format(
                    "none_ascii_%C3%A5_name.txt")
            })

        self.assertEqual(type(resp), FileResponse)
Esempio n. 4
0
    def test_when_force_download_and_filename_not_none_then_add_attachment(
            self, get_charset):
        content_type = 'text/plain'

        resp = generate_file_response(open(__file__, 'rb'),
                                      content_type,
                                      force_download=True)
        headers = self.get_headers_from_response(resp)

        self.assertEqual(
            headers, {
                'Cache-Control':
                'no-cache, no-store, must-revalidate',
                'Pragma':
                'no-cache',
                'Expires':
                '0',
                'Content-Type':
                'text/plain; charset=utf-8',
                'Content-Length':
                str(os.path.getsize(__file__)),
                'Content-Disposition':
                'attachment; filename="{}"'.format("test_util.py")
            })

        self.assertEqual(type(resp), FileResponse)
Esempio n. 5
0
    def label_report(self, request, pk=None):
        archive = TagVersion.objects.get(pk=pk)

        agents = AgentTagLink.objects.filter(tag_id=pk).all()
        series = archive.get_active_structure(
        ).structure.units.prefetch_related(
            Prefetch(
                'tagstructure_set',
                queryset=TagStructure.objects.select_related(
                    'tag__current_version'),
                to_attr='volumes',
            ), ).all()

        template = 'tags/labels.html'.format()
        f = tempfile.TemporaryFile()

        ctype = 'application/pdf'
        render = render_to_string(template, {
            'archive_name': archive.name,
            'series': series,
            'agents': agents
        })
        HTML(string=render).write_pdf(f)

        f.seek(0)
        name = 'labels_{}.pdf'.format(pk)
        return generate_file_response(f, content_type=ctype, name=name)
Esempio n. 6
0
    def generate_report(self, hits, format, user):
        try:
            tag_versions = [hit.get('_source').get('name') for hit in hits]
        except Exception:
            tag_versions = hits
        logger.info(
            f"User '{user}' generating a {format} report, with tag versions: '{tag_versions}'"
        )
        template = 'tags/search_results.html'.format()

        f = tempfile.TemporaryFile()
        formatted_hits = []

        for hit in hits:
            hit = hit['_source']
            try:
                hit['archive'] = get_archive(hit['archive'])
            except KeyError:
                pass
            formatted_hits.append(hit)

        if format == 'pdf':
            ctype = 'application/pdf'
            render = render_to_string(template, {
                'hits': formatted_hits,
                'user': user,
                'timestamp': timezone.now()
            })
            HTML(string=render).write_pdf(f)
        elif format == 'csv':
            ctype = 'text/csv'
            writer = csv.writer(f)
            for hit in formatted_hits:
                writer.writerow([
                    hit.get('archive', {}).get('name'),
                    hit.get('name'),
                    hit.get('reference_code'),
                    hit.get('name'),
                    hit.get('unit_dates', {}).get('date'),
                    hit.get('desc')
                ])
        else:
            raise ValueError('Unsupported format {}'.format(format))

        f.seek(0)
        name = 'search_results_{time}_{user}.{format}'.format(
            time=timezone.localtime(), user=user.username, format=format)
        return generate_file_response(f, content_type=ctype, name=name)
Esempio n. 7
0
    def test_win1252_and_no_filename_then_return_without_content_dispo(
            self, mock_get_charset, mock_get_filename):
        content_type = 'text/plain'
        mock_file_obj = mock.Mock()

        resp = generate_file_response(mock_file_obj, content_type)
        headers = self.get_headers_from_response(resp)
        self.assertEqual(
            headers, {
                'Cache-Control': 'no-cache, no-store, must-revalidate',
                'Pragma': 'no-cache',
                'Expires': '0',
                'Content-Type': 'text/plain; charset=windows-1252',
            })

        self.assertEqual(type(resp), FileResponse)
Esempio n. 8
0
    def test_win1252_and_no_filename_then_return_without_content_dispo(
            self, mock_get_charset, mock_get_filename):
        content_type = 'text/plain'

        resp = generate_file_response(open(__file__, 'rb'), content_type)
        headers = self.get_headers_from_response(resp)
        self.assertEqual(
            headers, {
                'Cache-Control': 'no-cache, no-store, must-revalidate',
                'Pragma': 'no-cache',
                'Expires': '0',
                'Content-Length': str(os.path.getsize(__file__)),
                'Content-Type': 'text/plain; charset=windows-1252',
            })

        self.assertEqual(type(resp), FileResponse)
Esempio n. 9
0
    def test_when_utf8_and_no_filename(self, get_charset, get_filename):
        content_type = 'text/plain'

        resp = generate_file_response(open(__file__, 'rb'), content_type)
        headers = self.get_headers_from_response(resp)
        self.assertEqual(
            headers, {
                'Cache-Control':
                'no-cache, no-store, must-revalidate',
                'Pragma':
                'no-cache',
                'Expires':
                '0',
                'Content-Length':
                str(os.path.getsize(__file__)),
                'Content-Type':
                'text/plain; charset=utf-8',
                'Content-Disposition':
                'inline; filename="{}"'.format(os.path.basename(__file__)),
            })

        self.assertEqual(type(resp), FileResponse)
Esempio n. 10
0
    def test_win1252_and_file_obj_has_name_then_return_inline_file_response(
            self, get_charset, get_filename):
        content_type = 'text/plain'
        mock_file_obj = mock.Mock()

        resp = generate_file_response(mock_file_obj, content_type)
        headers = self.get_headers_from_response(resp)

        self.assertEqual(
            headers, {
                'Cache-Control':
                'no-cache, no-store, must-revalidate',
                'Pragma':
                'no-cache',
                'Expires':
                '0',
                'Content-Type':
                'text/plain; charset=windows-1252',
                'Content-Disposition':
                'inline; filename="{}"'.format("some_file_name.txt")
            })

        self.assertEqual(type(resp), FileResponse)
Esempio n. 11
0
    def generate_report(self, hits, format, user):
        try:
            tag_versions = [hit.get('_source').get('name') for hit in hits]
        except Exception:
            tag_versions = hits
        logger.info(f"User '{user}' generating a {format} report, with tag versions: '{tag_versions}'")
        template = 'tags/search_results.html'.format()

        f = tempfile.TemporaryFile()
        formatted_hits = []

        for hit in hits:
            hit = hit['_source']
            try:
                hit['archive'] = get_archive(hit['archive'])
            except KeyError:
                pass
            formatted_hits.append(hit)

        if format == 'pdf':
            ctype = 'application/pdf'
            render = render_to_string(template, {'hits': formatted_hits, 'user': user, 'timestamp': timezone.now()})
            HTML(string=render).write_pdf(f)
        elif format == 'csv':
            ctype = 'text/csv'
            writer = csv.writer(f)
            for hit in formatted_hits:
                writer.writerow(
                    [hit.get('archive', {}).get('name'), hit.get('name'), hit.get('reference_code'), hit.get('name'),
                     hit.get('unit_dates', {}).get('date'), hit.get('desc')])
        else:
            raise ValueError('Unsupported format {}'.format(format))

        f.seek(0)
        name = 'search_results_{time}_{user}.{format}'.format(time=timezone.localtime(), user=user.username,
                                                              format=format)
        return generate_file_response(f, content_type=ctype, name=name)
Esempio n. 12
0
def export(request):
    data = get_data()

    try:
        fields = request.query_params['fields'].split(',')
    except KeyError:
        fields = []

    if fields:
        try:
            data = {k: data[k] for k in fields}
        except KeyError as e:
            raise exceptions.ParseError('Unknown field: {}'.format(e))

    template = 'stats/export.html'.format()
    f = tempfile.TemporaryFile()

    ctype = 'application/pdf'
    render = render_to_string(template, {'data': data})
    HTML(string=render).write_pdf(f)

    f.seek(0)
    name = 'stats_{}.pdf'.format(timezone.now())
    return generate_file_response(f, content_type=ctype, name=name)
Esempio n. 13
0
 def report(self, request, pk=None):
     path = self.get_report_pdf_path(pk)
     return generate_file_response(open(path, 'rb'), 'application/pdf')
Esempio n. 14
0
 def report(self, request, pk=None):
     path = self.get_object()._get_report_directory()
     path = os.path.join(path, pk + '.pdf')
     return generate_file_response(open(path, 'rb'), 'application/pdf')