aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2012-12-28 12:36:28 +0000
committerTom Christie2012-12-28 12:36:28 +0000
commitacdb69be527f48b245a0e8cd14a3628a3c75347a (patch)
tree6a2b51b1d035d7596e97110c697dbd9917cf94fa
parent3e4242fc43def87fc6e0bda11afd8d3a82bd3ae3 (diff)
downloaddjango-rest-framework-acdb69be527f48b245a0e8cd14a3628a3c75347a.tar.bz2
Include 'static' template tag to enable 1.3 compatible staticfiles behaviour
-rw-r--r--rest_framework/templates/rest_framework/base.html1
-rw-r--r--rest_framework/templates/rest_framework/login.html1
-rw-r--r--rest_framework/templatetags/rest_framework.py83
3 files changed, 83 insertions, 2 deletions
diff --git a/rest_framework/templates/rest_framework/base.html b/rest_framework/templates/rest_framework/base.html
index 0e09e506..42e49cb9 100644
--- a/rest_framework/templates/rest_framework/base.html
+++ b/rest_framework/templates/rest_framework/base.html
@@ -1,6 +1,5 @@
{% load url from future %}
{% load rest_framework %}
-{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
diff --git a/rest_framework/templates/rest_framework/login.html b/rest_framework/templates/rest_framework/login.html
index 3681a158..e3f3d799 100644
--- a/rest_framework/templates/rest_framework/login.html
+++ b/rest_framework/templates/rest_framework/login.html
@@ -1,5 +1,4 @@
{% load url from future %}
-{% load staticfiles %}
<html>
<head>
diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py
index 4e0181ee..09c658bc 100644
--- a/rest_framework/templatetags/rest_framework.py
+++ b/rest_framework/templatetags/rest_framework.py
@@ -11,6 +11,89 @@ import string
register = template.Library()
+# Note we don't use 'load staticfiles', because we need a 1.3 compatible
+# version, so instead we include the `static` template tag ourselves.
+
+# When 1.3 becomes unsupported by REST framework, we can instead start to
+# use the {% load staticfiles %} tag, remove the following code,
+# and add a dependancy that `django.contrib.staticfiles` must be installed.
+
+# Note: We can't put this into the `compat` module because the compat import
+# from rest_framework.compat import ...
+# conflicts with this rest_framework template tag module.
+
+try: # Django 1.5+
+ from django.contrib.staticfiles.templatetags import StaticFilesNode
+
+ @register.tag('static')
+ def do_static(parser, token):
+ return StaticFilesNode.handle_token(parser, token)
+
+except:
+ try: # Django 1.4
+ from django.contrib.staticfiles.storage import staticfiles_storage
+
+ @register.simple_tag
+ def static(path):
+ """
+ A template tag that returns the URL to a file
+ using staticfiles' storage backend
+ """
+ return staticfiles_storage.url(path)
+
+ except: # Django 1.3
+ from urlparse import urljoin
+ from django import template
+ from django.templatetags.static import PrefixNode
+
+ class StaticNode(template.Node):
+ def __init__(self, varname=None, path=None):
+ if path is None:
+ raise template.TemplateSyntaxError(
+ "Static template nodes must be given a path to return.")
+ self.path = path
+ self.varname = varname
+
+ def url(self, context):
+ path = self.path.resolve(context)
+ return self.handle_simple(path)
+
+ def render(self, context):
+ url = self.url(context)
+ if self.varname is None:
+ return url
+ context[self.varname] = url
+ return ''
+
+ @classmethod
+ def handle_simple(cls, path):
+ return urljoin(PrefixNode.handle_simple("STATIC_URL"), path)
+
+ @classmethod
+ def handle_token(cls, parser, token):
+ """
+ Class method to parse prefix node and return a Node.
+ """
+ bits = token.split_contents()
+
+ if len(bits) < 2:
+ raise template.TemplateSyntaxError(
+ "'%s' takes at least one argument (path to file)" % bits[0])
+
+ path = parser.compile_filter(bits[1])
+
+ if len(bits) >= 2 and bits[-2] == 'as':
+ varname = bits[3]
+ else:
+ varname = None
+
+ return cls(varname, path)
+
+ @register.tag('static')
+ def do_static_13(parser, token):
+ return StaticNode.handle_token(parser, token)
+
+
def replace_query_param(url, key, val):
"""
Given a URL and a key/val pair, set or replace an item in the query