4. Extra template tags

portal.utils.templatetags.datetimeformatting.comparetime(value, arg)

Compares date to see if it is newer


{% load i18n formatting datetimeformatting %}
{% if item|getMetadataFieldValueByName:"created"|
   datetimeobject|comparetime:user.last_login %}
portal.utils.templatetags.datetimeformatting.dateobject(value, parse_values)

Returns a Python datetime object back from a string, taking into account the timezone that the date is presented in and the timezone for Portal. _dt could be returned without doing the timezone translation if needed.


{% load i18n formatting datetimeformatting %}
{{ job.getStarted|dateobject:"%b %d %Y"|date:"DATE_FORMAT" }}

Returns a Python datetime object back from a string, taking into account the timezone that the date is presented in and the timezone for Portal. _dt could be returned without doing the timezone translation if needed.

If the value cannot be parsed returns the original value as a string.


{% load i18n formatting datetimeformatting %}
{{ job.getStarted|datetimeobject|date:"DATETIME_FORMAT" }}

Compares dates with Vidispine

Takes a ISO8601 date says whether it has passed or is in the future with now.

If the date is not available, then return true.


Returns a Python datetime object back from a string, of how many hours left until this item is about to be deleted


{% load i18n formatting datetimeformatting %}
{{ job.getStarted|timeuntilremoval|date:"DATETIME_FORMAT" }}
portal.utils.templatetags.docstring.docstring(parser, token)

Ignores the contents, but useful to be parsed out by documentation parser Ignores everything between {% docstring %} and {% enddocstring %}.

Useful for documenting templates

Formatting template tags for formatting forms and text fields


Returns the displayed value for this BoundField, as rendered in widgets.


{% load formatting %} {{ field|display_value }}


We match the types to the types that Edit in place supports.


Other possible values: CheckboxInput, SelectMultiple, CheckboxSelectMultiple,TextInput, HiddenInput, Textarea


Returns the options from a field


Returns the type of a field in a form.


Returns the value for this BoundField, as rendered in widgets.

portal.utils.templatetags.formatting.framesToSMPTE(value, arg)

Convert from frames to SMTPE string Takes FPS


Returns the file extension when given a path


Returns a filename when given a path

portal.utils.templatetags.formatting.secondsToSMPTE(value, arg)

Convert from seconds to SMTPE string Takes FPS

portal.utils.templatetags.formatting.space_replace(value, arg)

Replaces an occurance of a string with a space for instance: “_” ” ” {{ somevariable|space_replace:”_” }}

portal.utils.templatetags.formatting.split_form(form, arg)

Split up a form in to component parts:

<form action="{% url 'thanks' slug %}" method="post">
    {{ form|split_form:":2" }}
        <td colspan="2">{% trans 'I am particularly interested in' %}:
    {{ form|split_form:"2:" }}
        <td><input type="submit" value="{% trans 'Submit' %}"

Strips the file extension when given a path

portal.utils.templatetags.formatting.truncchar(value, arg)

Middle truncating after a certain number of characters


Returns the widget type for a field in a form.

General template tags

portal.utils.templatetags.general.dictKeyLookup(the_dict, key)

Returns a value from a dict.


{{ dict|dictKeyLookup:key }}

Format size into bits:


{{ shape_tag.tag.getAudioBitrate|formatToBits }}
portal.utils.templatetags.general.formatToBytes(dummy, bytes)

Format size from bytes into human readable amount


{{ ""|formatToBytes:f.getSize }}
portal.utils.templatetags.general.formatToTime(dummy, seconds)

Format seconds to time.


{{ ""|formatToTime:systemmetadata.durationSeconds }}
portal.utils.templatetags.general.getUnit(dummy, bytes)

Round up a filesize to present it in the proper size.












< 1024


getUnit(null, bytes)

Filter - returns a list containing range made from given value Usage (in template):

<ul>{% for i in 3|get_range %}

<li>{{ i }}. Do something</li>

{% endfor %}</ul>

Results with the HTML: <ul>

<li>0. Do something</li> <li>1. Do something</li> <li>2. Do something</li>


Instead of 3 one may use the variable set in the views

portal.utils.templatetags.general.listLookup(the_list, index)

Returns a specific element from a list.


{{ l|listLookup:list }}
portal.utils.templatetags.getstring.qstring(parser, token)

Get the current request’s query string from within the page.


{% qstring %} or {% qstring as current_qstring %}

portal.utils.templatetags.getstring.qstring_del(qstring, del_qstring)

Returns a query string w/o some keys, every value for each key gets deleted.

More than one key can be specified using an & as separator.


{{ my_qstring|qstring_del:"key1&key2" }}
portal.utils.templatetags.getstring.qstring_get(qstring, key)

Given a key, the value is returned from the query string


{{ my_qstring|qstring_get:"key1" }}
portal.utils.templatetags.getstring.qstring_set(qstring, set_qstring)

Updates a query string, old values get deleted.


{{ my_qstring|qstring_set:"key1=1&key1=2&key2=3" }}

UI messages into templates

class portal.utils.templatetags.messages.GrowlMessagesNode(messages)

Outputs grouped Django Messages Framework messages for formatting into JQuery Growl messages


Return the node rendered as a string.

class portal.utils.templatetags.messages.MessagesNode(messages)

Outputs grouped Django Messages Framework messages in separate lists sorted by level.


Return the node rendered as a string.

portal.utils.templatetags.messages.render_growl_messages(parser, token)

Render Growl Messages. Use this tag somewhere where we can output the Javascript messages.


{% render_growl_messages messages %}

Switch support

portal.utils.templatetags.switch.do_switch(parser, token)

The {% switch %} tag compares a variable against one or more values in {% case %} tags, and outputs the contents of the matching block. An optional {% else %} tag sets off the default output if no matches could be found:

{% switch result_count %}
    {% case 0 %}
        There are no search results.
    {% case 1 %}
        There is one search result.
    {% else %}
        Jackpot! Your search found {{ result_count }} results.
{% endswitch %}

Each {% case %} tag can take multiple values to compare the variable against:

{% switch username %}
    {% case "Jim" "Bob" "Joe" %}
        Me old mate {{ username }}! How ya doin?
    {% else %}
        Hello {{ username }}
{% endswitch %}

url_optional is exactly the same as from django.template.defaulttags.url EXCEPT kwargs equal to None are removed this allows a bit more flexibility than the use of {% url %} where nesting is rested on optional base kw arguments.

see http://code.djangoproject.com/ticket/9176

class portal.utils.templatetags.url_optional.URLNodeOptional(view_name, args, kwargs, asvar)

identical to django.template.defaulttags.URLNode but removes kwargs equal to None before resolving the url


Return the node rendered as a string.

portal.utils.templatetags.url_optional.url_optional(parser, token)

creates the default URLNode, then routes it to the Optional resolver with the same properties by first creating the URLNode, the parsing stays in django core where it belongs.

class portal.utils.templatetags.videopreview.SequencePlayerNode(item)

Get the sequence information and then render the previewsequence.html template.


Return the node rendered as a string.

portal.utils.templatetags.videopreview.build_videoitem_preview_map(numberOfKeyFrames, numToShow)

We need to get the number of keyframes and then return a dictionary that can be used to build up the correct number of keyframes, or build up the template. We use this as a filter, so that it can be passed back into the current template

So we pass in the number of keyframes > 60, we then see how often to create the keyframes..

Usage for 6 keyframes:

{% for keyframe in item.num_of_keyframes|videoimagemap:"6"  %}
    <area shape="rect"
          coords="{{ keyframe.0 }},0,{{ keyframe.1 }},150"
          href="{% url 'mediaviewdetail' item.slug,item.guidstring %}"
          onmouseover="mediaitem{{ forloop.parentloop.counter }}.src=                    '{{ STATIC_URL }}{{ item.get_keyframe_path }}
            {{ keyframe.2|stringformat:"03d" }}.jpg'" alt="" />
{% endfor %}
portal.utils.templatetags.videopreview.previewplayer(parser, token)

Based upon the content type of the current item, as sent through with tag decide on what player to utilise.

The template includes pluginblock MediaViewVideoPlayerOptionsJS for customising video player options. If you create a MediaViewVideoPlayerOptionsJS plugin the javascript in the plugin will be called with the playerOptions object. You can then make changes to playerOptions. Your player will now be initialized with the new playerOptions that you have set.

Please see https://github.com/Cantemo/PortalPluginTemplate/blob/master/video_player_options.py for examples.

  • item - the item so that we can find out the type and what preview it has.

portal.utils.templatetags.videopreview.sequenceplayer(parser, token)

Build a sequence player for a given item.

  • item - the item should be a sequence (check with isSequence).

4.1. preview_by_mime_type

This tag will let you pass in a previews list, a mimetype and will return an absolute URI with an address of the media of that type. If the replace_urls config option has been set with an IP address or hostname then it will honour that hostname, otherwise it will user SERVER_NAME and SERVER_PORT to work out the current request and create a URI using that:

{% load vidispinetags %}
{% preview_by_mime_type previews "video/mp4" %}

This is ideally used when using a flash player, that needs an absolute URI to the media, relative URLS do not always work.

See also:

  • _paginator

  • _plugins-template

  • _thumbnail-configuration