import logging from django.utils.importlib import import_module from django.utils.translation import ugettext_lazy as _ from django.template.loader import get_template from . import app_settings def renderer_description(renderer): if 'name' in renderer.config: if 'template_name' in renderer.config: return _('{name} using template {template}').format( name=renderer.config['name'], template=renderer.config['template_name']) else: return renderer.config['name'] def renderers_choices(): for slug in app_settings.RENDERERS: renderer = resolve_renderer(slug) yield slug, renderer_description(renderer) or slug def create_renderer(name, instance): '''Create a renderer instance of given name from a settings dictionary''' module_name, class_name = instance['class'].rsplit('.', 1) module = import_module(module_name) return getattr(module, class_name)(name, instance) def resolve_renderer(name): '''Create a renderer instance from slug name of its settings''' instance = app_settings.RENDERERS.get(name) if instance: return create_renderer(name, instance) def insert_blurp_in_context(name, context): renderer = resolve_renderer(name) if not renderer: return '' return renderer.render(context) def render_blurp(context, slug, ajax=True): logger = logging.getLogger(__name__) renderer = resolve_renderer(slug) if not renderer: logger.warning('renderer %s does not exist', slug) return None, None # Ajax rendering is canceled in the ajax view ajax = ajax and renderer.use_ajax(context) if ajax: request = context.get('request') context['slug'] = renderer.slug context['ajax_refresh'] = renderer.config.get('ajax_refresh', 0) if request.GET: context['plugin_args'] = '?{0}'.format(request.GET.urlencode()) # hack alert !! template = get_template('cmsplugin_blurp/ajax.html', context) else: template = renderer.render_template() if not hasattr(template, 'render'): template = template.Template(template) context = renderer.render(context) return template, context