This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
cmsplugin-blurp/src/cmsplugin_blurp/utils.py

63 lines
2.2 KiB
Python

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