from django import template
from ..utils import obtain_image
from ..settings import (
MEDIA_ROOT,
MEDIA_RELATIVE_ROOT,
EXPIRATION_INTERVAL,
DEBUG
)
__title__ = 'eximagination.templatetags.eximaginate'
__author__ = 'Artur Barseghyan <artur.barseghyan@gmail.com>'
__copyright__ = '2013-2017 Artur Barseghyan'
__license__ = 'GPL 2.0/LGPL 2.1'
__all__ = ('eximaginate',)
register = template.Library()
class EximaginateNode(template.Node):
"""Node for ``eximaginate`` tag.
.. code-block: html
{% eximaginate photo as image %}
{{ image }}
Eximagination will automatically add ``ei_width`` and ``ei_height``
variables to the content - those are the original width and height values
of the obtained image.
"""
def __init__(self, source_var, force_update, context_name=None):
self.source_var = template.Variable(source_var)
self.force_update = bool(force_update)
self.context_name = context_name
def render(self, context):
# Note that this isn't a global constant because we need to change the
# value for tests.
try:
file_data = obtain_image(
image_source=self.source_var.resolve(context),
save_to=MEDIA_ROOT,
media_url=MEDIA_RELATIVE_ROOT,
force_update=self.force_update,
expiration_interval=EXPIRATION_INTERVAL,
debug=DEBUG
)
filename = file_data[0]
# Original width of the obtained image
context['ei_width'] = file_data[1]
# Original height of the obtained image
context['ei_height'] = file_data[2]
if self.context_name is None:
return filename
# We need to get here so we don't have old values in the context
# variable.
context[self.context_name] = filename
except:
pass
return ''
@register.tag
[docs]def eximaginate(parser, token):
"""Copy an external image locally.
To just output the absolute url to the thumbnail::
{% load eximaginate %}
<img src="{{ MEDIA_URL }}
{% eximaginate 'http://www.google.com/intl/en/images/logo.gif' %}">
To put the the downloaded image URL on the context instead of just
rendering the relative url, finish the tag with ``as [context_var_name]``:
{% load eximaginate thumbnail %}
{% eximaginate 'http://www.google.com/intl/en/images/logo.gif'
as original %}
<img src="{% thumbnail original 100x100 %}">
Eximagination will automatically add "ei_width" and "ei_height" variables
to the content - those are the original width and height values of the
obtained image.
TODO: Implement force_update feature (some extra tokens parsing)
"""
arguments = token.split_contents()
# Check to see if we're setting to a context variable.
if len(arguments) < 1:
raise template.TemplateSyntaxError(
"{0} tag requires at least one "
"argument".format(token.contents.split()[0])
)
# Get arguments
if len(arguments) == 4:
source_var = arguments[1]
force_update = False # At the moment force_update is not implemented
context_name = arguments[3]
elif len(arguments) == 2:
source_var = arguments[1]
force_update = False # At the moment force_update is not implemented
context_name = None
else:
raise template.TemplateSyntaxError(
"{0} wrong number arguments".format(token.contents.split()[0])
)
# If the size argument was a correct static format, wrap it in quotes so
# that it is compiled correctly.
return EximaginateNode(source_var, force_update, context_name)