68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
import logging
|
|
import json
|
|
|
|
from django import template
|
|
from django.conf import settings
|
|
from django.utils.html import escape
|
|
from django.core.serializers import serialize
|
|
from django.core.serializers.json import DjangoJSONEncoder
|
|
from django.db.models.query import QuerySet
|
|
from django.utils.safestring import mark_safe
|
|
|
|
from classytags.arguments import Argument
|
|
from classytags.core import Options, Tag
|
|
|
|
from .. import utils
|
|
|
|
register = template.Library()
|
|
|
|
# originally copied from django-jsonify(https://bitbucket.org/marltu/django-jsonify/)
|
|
# released under a three-clause BSD License by Marius Grigaitis
|
|
@register.filter
|
|
def jsonify(obj):
|
|
if isinstance(obj, QuerySet):
|
|
return mark_safe(serialize('json', obj))
|
|
return mark_safe(json.dumps(obj, cls=DjangoJSONEncoder))
|
|
|
|
@register.tag
|
|
class RenderBlurp(Tag):
|
|
name = 'render_blurp'
|
|
options = Options(
|
|
Argument('name', resolve=False),
|
|
)
|
|
|
|
|
|
def render_tag(self, context, slug):
|
|
context.push()
|
|
try:
|
|
logger = logging.getLogger(__name__)
|
|
try:
|
|
template, context = utils.render_blurp(context, slug)
|
|
return template.render(context)
|
|
except Exception, e:
|
|
logger.exception('error while rendering blurp %s', slug)
|
|
msg = ''
|
|
if settings.TEMPLATE_DEBUG:
|
|
msg += 'error while rendering blurp %s: %s' % (slug, e)
|
|
msg = '<pre>%s</pre>' % escape(msg)
|
|
return msg
|
|
finally:
|
|
context.pop()
|
|
|
|
@register.tag
|
|
class BlurpNode(Tag):
|
|
'''Insert content generated from a blurp block and render inside template'''
|
|
name = 'blurp'
|
|
options = Options(
|
|
Argument('name'),
|
|
blocks=[('endblurp', 'nodelist')])
|
|
|
|
def render_tag(self, context, slug, nodelist):
|
|
context.push()
|
|
try:
|
|
utils.insert_blurp_in_context(slug, context)
|
|
output = self.nodelist.render(context)
|
|
return output
|
|
finally:
|
|
context.pop()
|