Net-ng/kansha

View on GitHub
kansha/card_addons/gallery/view.py

Summary

Maintainability
C
1 day
Test Coverage
# --
# Copyright (c) 2012-2014 Net-ng.
# All rights reserved.
#
# This software is licensed under the BSD License, as described in
# the file LICENSE.txt, which you should have received as part of
# this distribution.
# --

from nagare.i18n import _
from nagare import presentation, ajax, security, component

from .comp import Gallery, Asset, AssetCropper


def render_image(self, h, comp, size, randomize=False, **kw):
    metadata = self.assets_manager.get_metadata(self.filename)
    src = self.assets_manager.get_image_url(self.filename, size)
    if randomize:
        src += '?r=' + h.generate_id()
    return h.img(title=metadata['filename'], alt=metadata['filename'],
                 src=src, **kw)


def render_file(self, h, comp, size, **kw):
    kw['class'] += ' file_icon'
    metadata = self.assets_manager.get_metadata(self.filename)
    res = [h.img(title=metadata['filename'], alt=metadata['filename'],
                 src="img/file-icon.jpg", **kw)]
    if size == 'medium':
        res.append(h.span(metadata['filename']))
    return res


CONTENT_TYPES = {'image/png': render_image,
                 'image/jpeg': render_image,
                 'image/pjpeg': render_image,
                 'image/gif': render_image}


@presentation.render_for(Gallery)
def render(self, h, comp, *args):
    self.load_assets()
    with h.div(id='gal' + self.comp_id):
        with h.div(class_='nbItems'):
            h << comp.render(h, model='badge')
        with h.div(id="card-gallery"):
            h << comp.render(h, self.model)
    return h.root


@presentation.render_for(Gallery, 'view')
def render_Gallery_view(self, h, comp, model):
    model = 'edit' if security.has_permissions('edit', self) else 'anonymous'
    for asset in self.assets:
        h << asset.render(h, model)
    return h.root


@presentation.render_for(Gallery, 'crop')
def render_Gallery_crop(self, h, comp, model):
    return self.cropper.on_answer(self.action)


@presentation.render_for(Gallery, 'cover')
def render_cover(self, h, comp, model):
    cover = self.get_cover()
    if cover:
        h << h.p(component.Component(cover, model='cover'), class_='cover')
    return h.root


@presentation.render_for(Gallery, model='badge')
def render_gallery_badge(self, h, *args):
    """Gallery badge for the card"""
    num_assets = self.num_assets
    if num_assets:
        with h.span(class_='badge'):
            h << h.span(h.i(class_='icon-file-empty'), ' ', num_assets, class_='label')
    return h.root


@presentation.render_for(Gallery, "action")
def render_download(self, h, comp, *args):
    if security.has_permissions('edit', self):
        submit_id = h.generate_id("attach_submit")
        input_id = h.generate_id("attach_input")
        h << h.label((h.i(class_='icon-file-empty'),
                      _("Add file")), class_='btn', for_=input_id)
        with h.form:
            h << h.script(
                u'''
    function valueChanged(e) {
        if (YAHOO.kansha.app.checkFileSize(this, %(max_size)s)) {
            YAHOO.util.Dom.get(%(submit_id)s).click();
            YAHOO.kansha.app.showWaiter();
        } else {
            alert(%(error)s);
        }
    }

    YAHOO.util.Event.onDOMReady(function() {
        YAHOO.util.Event.on(%(input_id)s, 'change', valueChanged);
    });''' %
                {
                    'max_size': ajax.py2js(self.assets_manager.max_size),
                    'input_id': ajax.py2js(input_id),
                    'submit_id': ajax.py2js(submit_id),
                    'error': ajax.py2js(
                        _(u'Max file size exceeded')
                    ).decode('UTF-8')
                }
            )
            submit_action = ajax.Update(
                render=lambda r: r.div(comp.render(r, model=None), r.script('YAHOO.kansha.app.hideWaiter()')),
                component_to_update='gal' + self.comp_id,
            )

            h << h.input(id=input_id, class_='hidden', type="file", name="file", multiple="multiple", maxlength="100",).action(self.add_assets)
            h << h.input(class_='hidden', id=submit_id, type="submit").action(submit_action)
    return h.root


@presentation.render_for(Asset)
@presentation.render_for(Asset, model='thumb')
@presentation.render_for(Asset, model='medium')
@presentation.render_for(Asset, model='cover')
def render_asset(self, h, comp, model, *args):
    res = []
    metadata = self.assets_manager.get_metadata(self.filename)
    kw = {'randomize': True} if model == 'cover' else {}
    kw['class'] = model
    if self.is_cover:
        res.append(h.span(class_='is_cover'))

    meth = CONTENT_TYPES.get(metadata['content-type'], render_file)
    res.append(meth(self, h, comp, model, **kw))
    return res

@presentation.render_for(Asset, model='edit')
def render_Asset_thumb(self, h, comp, model, *args):
    with h.div(class_='asset'):
        action = h.a.action(lambda: comp.answer(('delete', self))).get('onclick')
        onclick = _(u'Are you sure you want to delete this file?')
        onclick = u'if (confirm("%s")) { %s }' % (onclick, action)
        with h.a(class_='delete', title=_(u'Delete'), href='#', onclick=onclick):
            h << h.i(class_='icon-cross')
        if self.is_image():
            with h.a(class_='cover', title=_(u'Configure cover')).action(lambda: comp.answer(('configure_cover', self))):
                if self.is_cover:
                    h << {'style': 'visibility: visible'}
                h << h.i(class_='icon-checkmark')
        with h.a(href=self.assets_manager.get_image_url(self.filename), target='_blank'):
            h << comp.render(h, 'thumb')
    return h.root

@presentation.render_for(Asset, model="anonymous")
def render_asset_anonymous(self, h, comp, model, *args):
    with h.div(class_='asset'):
        with h.a(href=self.assets_manager.get_image_url(self.filename), target='_blank'):
            h << comp.render(h, model="thumb")
    return h.root


@presentation.render_for(AssetCropper)
def render_gallery_cropper(self, h, comp, *args):
    h << h.p(_('Use the controls below to create the cover of your card.'))

    form_id = h.generate_id()
    img_id = h.generate_id()

    with h.form:
        for crop_name in 'crop_left', 'crop_top', 'crop_width', 'crop_height':
            h << h.input(type='hidden', id=form_id + '_' + crop_name).action(getattr(self, crop_name))
        h << h.p(render_image(self.asset, h, comp, 'medium', id=img_id))
        h << h.script(
            "YAHOO.util.Event.onContentReady(%s,"
            "function(){setTimeout(function(){YAHOO.kansha.app.initCrop(%s, %s, %s, %s)}, 500)})" % (
                ajax.py2js(img_id),
                ajax.py2js(img_id),
                ajax.py2js(form_id),
                ajax.py2js(self.crop_width()),
                ajax.py2js(self.crop_height())
            )
        )
        with h.div(class_='buttons'):
            h << h.button(_('Create cover'), class_='btn btn-primary').action(self.commit, comp)
            if self.asset.is_cover:
                h << ' '
                h << h.button(_('Remove cover'), class_='btn delete').action(self.remove_cover, comp)
            h << ' '
            h << h.button(_('Cancel'), class_='btn').action(self.cancel, comp)
    return h.root