diff --git a/djangojs/conf.py b/djangojs/conf.py index b2b43ca..e9423bc 100644 --- a/djangojs/conf.py +++ b/djangojs/conf.py @@ -17,6 +17,7 @@ 'JS_USER_ENABLED': True, 'JS_URLS': None, 'JS_URLS_EXCLUDE': None, + 'JS_URL_CONFS': _settings.ROOT_URLCONF, 'JS_URLS_NAMESPACES': None, 'JS_URLS_NAMESPACES_EXCLUDE': None, 'JS_URLS_UNNAMED': False, diff --git a/djangojs/context_serializer.py b/djangojs/context_serializer.py index 0c34c32..a7ed7b6 100644 --- a/djangojs/context_serializer.py +++ b/djangojs/context_serializer.py @@ -4,6 +4,7 @@ import json import logging +from django.conf import settings from django.template.context import RequestContext from django.utils import translation, six @@ -54,6 +55,13 @@ def as_dict(self): data[key] = value if settings.JS_USER_ENABLED: self.handle_user(data) + # Monkey patch for https://github.com/noirbizarre/django.js/issues/53 + data.update({ + 'STATIC_URL': settings.STATIC_URL, + 'MEDIA_URL': settings.MEDIA_URL, + 'LANGUAGES': settings.LANGUAGES, + 'LANGUAGE_CODE': settings.LANGUAGE_CODE, + }) return data def as_json(self): diff --git a/djangojs/phantomjs/qunit-runner.js b/djangojs/phantomjs/qunit-runner.js index 86ec9d3..256d0ac 100644 --- a/djangojs/phantomjs/qunit-runner.js +++ b/djangojs/phantomjs/qunit-runner.js @@ -53,7 +53,7 @@ page.onConsoleMessage = function(msg) { console.log(msg); }; -page.open(phantom.args[0], function(status){ +page.open(system.args[1], function(status){ if (status !== "success") { console.log("Unable to access network"); phantom.exit(1); diff --git a/djangojs/runners.py b/djangojs/runners.py index d0ce2c5..f850a16 100644 --- a/djangojs/runners.py +++ b/djangojs/runners.py @@ -17,12 +17,16 @@ from django.core.urlresolvers import reverse from django.template.loader import render_to_string from django.test import LiveServerTestCase +from django.contrib.staticfiles.testing import StaticLiveServerTestCase from django.utils.encoding import python_2_unicode_compatible from djangojs.tap import TapParser from djangojs.utils import StorageGlobber -from django.utils.unittest import TestCase +try: + from django.utils.unittest import TestCase +except ImportError: + from django.test.testcases import TestCase #: Console output line length for separators LINE_SIZE = 70 @@ -175,7 +179,7 @@ def cleanup(self): pass -class JsTestCase(PhantomJsRunner, LiveServerTestCase): +class JsTestCase(PhantomJsRunner, StaticLiveServerTestCase): ''' A PhantomJS suite that run against the Django LiveServerTestCase ''' diff --git a/djangojs/templates/djangojs/django_js_init.html b/djangojs/templates/djangojs/django_js_init.html index eeffb7c..fa07439 100644 --- a/djangojs/templates/djangojs/django_js_init.html +++ b/djangojs/templates/djangojs/django_js_init.html @@ -1,5 +1,4 @@ {% load js %} -{% load url from future %} {% if js.i18n %} diff --git a/djangojs/templatetags/js.py b/djangojs/templatetags/js.py index 6c6b7f5..72401ee 100644 --- a/djangojs/templatetags/js.py +++ b/djangojs/templatetags/js.py @@ -7,6 +7,7 @@ from django import template from django.contrib.staticfiles.storage import staticfiles_storage from django.utils import six +from django.utils.safestring import mark_safe from djangojs import JQUERY_MIGRATE_VERSION from djangojs.conf import settings @@ -112,9 +113,9 @@ def javascript(filename, type='text/javascript'): '''A simple shortcut to render a ``script`` tag to a static javascript file''' if '?' in filename and len(filename.split('?')) is 2: filename, params = filename.split('?') - return '' % (type, staticfiles_storage.url(filename), params) + return mark_safe('' % (type, staticfiles_storage.url(filename), params)) else: - return '' % (type, staticfiles_storage.url(filename)) + return mark_safe('' % (type, staticfiles_storage.url(filename))) @register.simple_tag @@ -138,7 +139,7 @@ def coffee(filename): @register.simple_tag def css(filename): '''A simple shortcut to render a ``link`` tag to a static CSS file''' - return '' % staticfiles_storage.url(filename) + return mark_safe('' % staticfiles_storage.url(filename)) def _boolean(value): diff --git a/djangojs/tests/test_tap.py b/djangojs/tests/test_tap.py index 9dc3ec0..28f9ae8 100644 --- a/djangojs/tests/test_tap.py +++ b/djangojs/tests/test_tap.py @@ -130,7 +130,6 @@ def test_parse_module(self): class TapParserTest(unittest.TestCase): def test_single_test(self): '''Should parse a test and its children''' - # import ipdb; ipdb.set_trace() parser = TapParser(TapAssertion) output = ''' # test: should be defined diff --git a/djangojs/urls.py b/djangojs/urls.py index 32d0a71..60bf42f 100644 --- a/djangojs/urls.py +++ b/djangojs/urls.py @@ -6,7 +6,7 @@ from django.conf.urls import patterns, url from djangojs.conf import settings -from djangojs.views import UrlsJsonView, ContextJsonView, JsInitView +from djangojs.views import UrlsJsonView, ContextJsonView, JsInitView, cached_javascript_catalog def js_info_dict(): @@ -33,5 +33,5 @@ def js_info_dict(): url(r'^init\.js$', JsInitView.as_view(), name='django_js_init'), url(r'^urls$', UrlsJsonView.as_view(), name='django_js_urls'), url(r'^context$', ContextJsonView.as_view(), name='django_js_context'), - url(r'^translation$', 'django.views.i18n.javascript_catalog', js_info_dict(), name='js_catalog'), + url(r'^translation$', cached_javascript_catalog, js_info_dict(), name='js_catalog'), ) diff --git a/djangojs/urls_serializer.py b/djangojs/urls_serializer.py index f57452f..be9d9d2 100644 --- a/djangojs/urls_serializer.py +++ b/djangojs/urls_serializer.py @@ -39,8 +39,18 @@ def urls_as_dict(): ''' Get the URLs mapping as a dictionnary ''' - module = settings.ROOT_URLCONF - return _get_urls(module) if settings.JS_URLS_ENABLED else {} + module = settings.JS_URL_CONFS + urls = {} + if settings.JS_URLS_ENABLED: + if isinstance(module, (six.text_type, six.string_types)): + urls = _get_urls(module) + else: + for item in module: + urls = dict(urls.items() + _get_urls(item).items()) + else: + return {} + + return urls def urls_as_json(): diff --git a/djangojs/views.py b/djangojs/views.py index 713d8b3..1a6ac05 100644 --- a/djangojs/views.py +++ b/djangojs/views.py @@ -12,6 +12,7 @@ from django.utils.cache import patch_vary_headers from django.views.decorators.cache import cache_page from django.views.generic import View, TemplateView +from django.views.i18n import javascript_catalog from djangojs.conf import settings from djangojs.urls_serializer import urls_as_dict, urls_as_json @@ -150,3 +151,8 @@ def get_context_data(self, **kwargs): context = super(QUnitView, self).get_context_data(**kwargs) context['css_theme'] = 'js/test/libs/%s.css' % self.theme return context + + +@cache_page(60 * settings.JS_CACHE_DURATION) +def cached_javascript_catalog(request, domain='djangojs', packages=None): + return javascript_catalog(request, domain, packages)