cubicweb/web/test/data/cubicweb_file/hooks.py
author Philippe Pepiot <philippe.pepiot@logilab.fr>
Tue, 19 Mar 2019 13:17:47 +0100
changeset 12519 aff5d3498f68
permissions -rw-r--r--
[web/test] drop dependency on third party cubes Drop dependency on cubicweb-file, cubicweb-blog and cubicweb-tag for cubicweb/web/test Copy required parts of cubes (schema, entities, views and hooks) into cubicweb/web/test/data/cubicweb-<cube> that make tests pass.

import os

from cubicweb.server import hook
from cubicweb.predicates import is_instance
from cubicweb.entities import adapters

from cubicweb_file.entities import UnResizeable


class UpdateFileHook(hook.Hook):
    """a file has been updated, check data_format/data_encoding consistency
    """
    __regid__ = 'updatefilehook'
    __select__ = hook.Hook.__select__ & is_instance('File')
    events = ('before_add_entity', 'before_update_entity',)
    order = -1  # should be run before other hooks
    category = 'hash'

    def __call__(self):
        edited = self.entity.cw_edited
        if 'data' in edited:
            self.entity.set_format_and_encoding()
            maxsize = None
            if maxsize and self.entity.data_format.startswith('image/'):
                iimage = self.entity.cw_adapt_to('IImage')
                try:
                    edited['data'] = iimage.resize(maxsize)
                except UnResizeable:
                    # if the resize fails for some reason, do nothing
                    # (original image will be stored)
                    pass

            # thumbnail cache invalidation
            if 'update' in self.event and 'data' in edited:
                thumb = self.entity.cw_adapt_to('IThumbnail')
                if not thumb:
                    return
                thumbpath = thumb.thumbnail_path()
                if thumbpath:
                    try:
                        os.unlink(thumbpath)
                    except Exception as exc:
                        self.warning(
                            'could not invalidate thumbnail file `%s` '
                            '(cause: %s)',
                            thumbpath, exc)


class FileIDownloadableAdapter(adapters.IDownloadableAdapter):
    __select__ = is_instance('File')

    # IDownloadable
    def download_url(self, **kwargs):
        # include filename in download url for nicer url
        name = self._cw.url_quote(self.download_file_name())
        path = '%s/raw/%s' % (self.entity.rest_path(), name)
        return self._cw.build_url(path, **kwargs)

    def download_content_type(self):
        return self.entity.data_format

    def download_encoding(self):
        return self.entity.data_encoding

    def download_file_name(self):
        return self.entity.data_name

    def download_data(self):
        return self.entity.data.getvalue()