示例#1
0
    def __init__(self, metadata, file_path, url, assets_url, export_url):
        super().__init__(metadata, file_path, url, assets_url, export_url)

        try:
            self.map = settings.RENDER_MAP[self.metadata.ext]
        except KeyError:
            self.map = settings.DEFAULT_RENDER

        self.export_file_path = self.file_path + self.map['renderer']

        exported_url = furl.furl(export_url)
        exported_url.args['format'] = self.map['format']
        exported_metadata = self.metadata
        exported_metadata.download_url = exported_url.url

        self.renderer = utils.make_renderer(self.map['renderer'],
                                            exported_metadata,
                                            self.export_file_path,
                                            exported_url.url, assets_url,
                                            export_url)

        # can't call file_required until renderer is built
        self.renderer_metrics.add('file_required', self.file_required)
        self.renderer_metrics.add('cache_result', self.cache_result)

        self.metrics.merge({
            'map': {
                'renderer': self.map['renderer'],
                'format': self.map['format'],
            },
        })
    def __init__(self, metadata, file_path, url, assets_url, export_url):
        super().__init__(metadata, file_path, url, assets_url, export_url)

        try:
            self.map = settings.RENDER_MAP[self.metadata.ext]
        except KeyError:
            self.map = settings.DEFAULT_RENDER

        self.export_file_path = self.file_path + self.map['renderer']

        exported_url = furl.furl(export_url)
        exported_url.args['format'] = self.map['format']
        exported_metadata = self.metadata
        exported_metadata.download_url = exported_url.url

        self.renderer = utils.make_renderer(
            self.map['renderer'],
            exported_metadata,
            self.export_file_path,
            exported_url.url,
            assets_url,
            export_url
        )

        # can't call file_required until renderer is built
        self.renderer_metrics.add('file_required', self.file_required)
        self.renderer_metrics.add('cache_result', self.cache_result)

        self.metrics.merge({
            'map': {
                'renderer': self.map['renderer'],
                'format': self.map['format'],
            },
        })
    async def get(self):
        """Return HTML that will display the given file."""
        renderer = utils.make_renderer(
            self.metadata.ext,
            self.metadata,
            self.source_file_path.full_path,
            self.url,
            '{}://{}/assets'.format(self.request.protocol, self.request.host),
            self.request.uri.replace('/render?', '/export?', 1)
        )

        self.extension_metrics.add('class', renderer._get_module_name())

        if renderer.cache_result and settings.CACHE_ENABLED:
            try:
                cached_stream = await self.cache_provider.download(self.cache_file_path)
            except waterbutler.core.exceptions.DownloadError as e:
                assert e.code == 404, 'Non-404 DownloadError {!r}'.format(e)
                logger.info('No cached file found; Starting render [{}]'.format(self.cache_file_path))
                self.metrics.add('cache_file.result', 'miss')
            else:
                logger.info('Cached file found; Sending downstream [{}]'.format(self.cache_file_path))
                self.metrics.add('cache_file.result', 'hit')
                return await self.write_stream(cached_stream)

        if renderer.file_required:
            await self.local_cache_provider.upload(
                await self.provider.download(),
                self.source_file_path
            )
        else:
            self.metrics.add('source_file.upload.required', False)

        loop = asyncio.get_event_loop()
        rendition = await loop.run_in_executor(None, renderer.render)
        self.renderer_metrics = renderer.renderer_metrics

        # Spin off upload into non-blocking operation
        if renderer.cache_result and settings.CACHE_ENABLED:
            asyncio.ensure_future(
                self.cache_provider.upload(
                    waterbutler.core.streams.StringStream(rendition),
                    self.cache_file_path
                )
            )

        await self.write_stream(waterbutler.core.streams.StringStream(rendition))
示例#4
0
    async def get(self):
        """Return HTML that will display the given file."""
        renderer = utils.make_renderer(
            self.metadata.ext, self.metadata, self.source_file_path.full_path,
            self.url, '{}://{}/assets'.format(self.request.protocol,
                                              self.request.host),
            self.request.uri.replace('/render?', '/export?', 1))

        self.extension_metrics.add('class', renderer._get_module_name())

        if renderer.cache_result and settings.CACHE_ENABLED:
            try:
                cached_stream = await self.cache_provider.download(
                    self.cache_file_path)
            except waterbutler.core.exceptions.DownloadError as e:
                assert e.code == 404, 'Non-404 DownloadError {!r}'.format(e)
                logger.info(
                    'No cached file found; Starting render [{}]'.format(
                        self.cache_file_path))
                self.metrics.add('cache_file.result', 'miss')
            else:
                logger.info(
                    'Cached file found; Sending downstream [{}]'.format(
                        self.cache_file_path))
                self.metrics.add('cache_file.result', 'hit')
                return await self.write_stream(cached_stream)

        if renderer.file_required:
            await self.local_cache_provider.upload(
                await self.provider.download(), self.source_file_path)
        else:
            self.metrics.add('source_file.upload.required', False)

        loop = asyncio.get_event_loop()
        rendition = await loop.run_in_executor(None, renderer.render)
        self.renderer_metrics = renderer.renderer_metrics

        # Spin off upload into non-blocking operation
        if renderer.cache_result and settings.CACHE_ENABLED:
            asyncio.ensure_future(
                self.cache_provider.upload(
                    waterbutler.core.streams.StringStream(rendition),
                    self.cache_file_path))

        await self.write_stream(
            waterbutler.core.streams.StringStream(rendition))
示例#5
0
    def __init__(self, metadata, file_path, url, assets_url, export_url):
        super().__init__(metadata, file_path, url, assets_url, export_url)

        try:
            self.map = settings.RENDER_MAP[self.metadata.ext]
        except KeyError:
            self.map = settings.DEFAULT_RENDER

        self.export_file_path = self.file_path + self.map['renderer']

        exported_url = furl.furl(export_url)
        exported_url.args['format'] = self.map['format']
        exported_metadata = self.metadata
        exported_metadata.download_url = exported_url.url

        self.renderer = utils.make_renderer(self.map['renderer'],
                                            exported_metadata,
                                            self.export_file_path,
                                            exported_url.url, assets_url,
                                            export_url)
示例#6
0
    def get(self):
        """Render a file with the extension"""
        renderer = utils.make_renderer(
            self.metadata.ext,
            self.metadata,
            self.source_file_path.full_path,
            self.url,
            '{}://{}/assets'.format(self.request.protocol, self.request.host),
            self.request.uri.replace('/render?', '/export?', 1)
        )

        if renderer.cache_result and settings.CACHE_ENABLED:
            try:
                cached_stream = yield from self.cache_provider.download(self.cache_file_path)
            except waterbutler.core.exceptions.DownloadError as e:
                assert e.code == 404, 'Non-404 DownloadError {!r}'.format(e)
                logger.info('No cached file found; Starting render [{}]'.format(self.cache_file_path))
            else:
                logger.info('Cached file found; Sending downstream [{}]'.format(self.cache_file_path))
                return (yield self.write_stream(cached_stream))

        if renderer.file_required:
            yield from self.local_cache_provider.upload(
                (yield from self.provider.download()),
                self.source_file_path
            )

        loop = asyncio.get_event_loop()
        rendition = (yield from loop.run_in_executor(None, renderer.render))

        # Spin off upload into non-blocking operation
        if renderer.cache_result and settings.CACHE_ENABLED:
            loop.call_soon(
                asyncio.async,
                self.cache_provider.upload(waterbutler.core.streams.StringStream(rendition), self.cache_file_path)
            )

        yield self.write_stream(waterbutler.core.streams.StringStream(rendition))
示例#7
0
    def __init__(self, metadata, file_path, url, assets_url, export_url):
        super().__init__(metadata, file_path, url, assets_url, export_url)

        try:
            self.map = settings.RENDER_MAP[self.metadata.ext]
        except KeyError:
            self.map = settings.DEFAULT_RENDER

        self.export_file_path = self.file_path + self.map['renderer']

        exported_url = furl.furl(export_url)
        exported_url.args['format'] = self.map['format']
        exported_metadata = self.metadata
        exported_metadata.download_url = exported_url.url

        self.renderer = utils.make_renderer(
            self.map['renderer'],
            exported_metadata,
            self.export_file_path,
            exported_url.url,
            assets_url,
            export_url
        )