diff --git a/django/shortcuts.py b/django/shortcuts.py index 4bfc2dcfb2..8ff39c08ba 100644 --- a/django/shortcuts.py +++ b/django/shortcuts.py @@ -12,7 +12,7 @@ from django.http import ( ) from django.template import RequestContext, loader from django.template.engine import ( - _context_instance_undefined, _dictionary_undefined, _dirs_undefined, + _context_instance_undefined, _dictionary_undefined ) from django.utils import six from django.utils.encoding import force_text @@ -21,14 +21,13 @@ from django.utils.functional import Promise def render_to_response(template_name, context=None, context_instance=_context_instance_undefined, - content_type=None, status=None, dirs=_dirs_undefined, + content_type=None, status=None, dictionary=_dictionary_undefined, using=None): """ Returns a HttpResponse whose content is filled with the result of calling django.template.loader.render_to_string() with the passed arguments. """ if (context_instance is _context_instance_undefined - and dirs is _dirs_undefined and dictionary is _dictionary_undefined): # No deprecated arguments were passed - use the new code path content = loader.render_to_string(template_name, context, using=using) @@ -36,7 +35,7 @@ def render_to_response(template_name, context=None, else: # Some deprecated arguments were passed - use the legacy code path content = loader.render_to_string( - template_name, context, context_instance, dirs, dictionary, + template_name, context, context_instance, dictionary, using=using) return HttpResponse(content, content_type, status) @@ -45,7 +44,7 @@ def render_to_response(template_name, context=None, def render(request, template_name, context=None, context_instance=_context_instance_undefined, content_type=None, status=None, - dirs=_dirs_undefined, dictionary=_dictionary_undefined, + dictionary=_dictionary_undefined, using=None): """ Returns a HttpResponse whose content is filled with the result of calling @@ -53,7 +52,6 @@ def render(request, template_name, context=None, Uses a RequestContext by default. """ if (context_instance is _context_instance_undefined - and dirs is _dirs_undefined and dictionary is _dictionary_undefined): # No deprecated arguments were passed - use the new code path # In Django 1.10, request should become a positional argument. @@ -66,7 +64,7 @@ def render(request, template_name, context=None, else: context_instance = RequestContext(request) content = loader.render_to_string( - template_name, context, context_instance, dirs, dictionary, + template_name, context, context_instance, dictionary, using=using) return HttpResponse(content, content_type, status) diff --git a/django/template/backends/django.py b/django/template/backends/django.py index deca90c28e..e016b18749 100644 --- a/django/template/backends/django.py +++ b/django/template/backends/django.py @@ -10,7 +10,7 @@ from django.apps import apps from django.conf import settings from django.template import TemplateDoesNotExist from django.template.context import Context, RequestContext, make_context -from django.template.engine import Engine, _dirs_undefined +from django.template.engine import Engine from django.template.library import InvalidTemplateLibrary from django.utils import six from django.utils.deprecation import RemovedInDjango110Warning @@ -35,9 +35,9 @@ class DjangoTemplates(BaseEngine): def from_string(self, template_code): return Template(self.engine.from_string(template_code), self) - def get_template(self, template_name, dirs=_dirs_undefined): + def get_template(self, template_name): try: - return Template(self.engine.get_template(template_name, dirs), self) + return Template(self.engine.get_template(template_name), self) except TemplateDoesNotExist as exc: reraise(exc, self) diff --git a/django/template/engine.py b/django/template/engine.py index 75d39c82a0..2761a70400 100644 --- a/django/template/engine.py +++ b/django/template/engine.py @@ -13,7 +13,6 @@ from .library import import_library _context_instance_undefined = object() _dictionary_undefined = object() -_dirs_undefined = object() class Engine(object): @@ -167,19 +166,12 @@ class Engine(object): """ return Template(template_code, engine=self) - def get_template(self, template_name, dirs=_dirs_undefined): + def get_template(self, template_name): """ Returns a compiled Template object for the given template name, handling template inheritance recursively. """ - if dirs is _dirs_undefined: - dirs = None - else: - warnings.warn( - "The dirs argument of get_template is deprecated.", - RemovedInDjango110Warning, stacklevel=2) - - template, origin = self.find_template(template_name, dirs) + template, origin = self.find_template(template_name) if not hasattr(template, 'render'): # template needs to be compiled template = Template(template, origin, template_name, engine=self) @@ -193,7 +185,6 @@ class Engine(object): def render_to_string(self, template_name, context=None, context_instance=_context_instance_undefined, - dirs=_dirs_undefined, dictionary=_dictionary_undefined): if context_instance is _context_instance_undefined: context_instance = None @@ -201,14 +192,6 @@ class Engine(object): warnings.warn( "The context_instance argument of render_to_string is " "deprecated.", RemovedInDjango110Warning, stacklevel=2) - if dirs is _dirs_undefined: - # Do not set dirs to None here to avoid triggering the deprecation - # warning in select_template or get_template. - pass - else: - warnings.warn( - "The dirs argument of render_to_string is deprecated.", - RemovedInDjango110Warning, stacklevel=2) if dictionary is _dictionary_undefined: dictionary = None else: @@ -218,9 +201,9 @@ class Engine(object): context = dictionary if isinstance(template_name, (list, tuple)): - t = self.select_template(template_name, dirs) + t = self.select_template(template_name) else: - t = self.get_template(template_name, dirs) + t = self.get_template(template_name) if not context_instance: # Django < 1.8 accepted a Context in `context` even though that's # unintended. Preserve this ability but don't rewrap `context`. @@ -235,25 +218,16 @@ class Engine(object): with context_instance.push(context): return t.render(context_instance) - def select_template(self, template_name_list, dirs=_dirs_undefined): + def select_template(self, template_name_list): """ Given a list of template names, returns the first that can be loaded. """ - if dirs is _dirs_undefined: - # Do not set dirs to None here to avoid triggering the deprecation - # warning in get_template. - pass - else: - warnings.warn( - "The dirs argument of select_template is deprecated.", - RemovedInDjango110Warning, stacklevel=2) - if not template_name_list: raise TemplateDoesNotExist("No template names provided") not_found = [] for template_name in template_name_list: try: - return self.get_template(template_name, dirs) + return self.get_template(template_name) except TemplateDoesNotExist as exc: if exc.args[0] not in not_found: not_found.append(exc.args[0]) diff --git a/django/template/loader.py b/django/template/loader.py index ed3039b471..d0ac9f6494 100644 --- a/django/template/loader.py +++ b/django/template/loader.py @@ -4,14 +4,12 @@ from django.utils.deprecation import RemovedInDjango110Warning from . import engines from .backends.django import DjangoTemplates -from .engine import ( - _context_instance_undefined, _dictionary_undefined, _dirs_undefined, -) +from .engine import _context_instance_undefined, _dictionary_undefined from .exceptions import TemplateDoesNotExist from .loaders import base -def get_template(template_name, dirs=_dirs_undefined, using=None): +def get_template(template_name, using=None): """ Loads and returns a template for the given name. @@ -21,24 +19,14 @@ def get_template(template_name, dirs=_dirs_undefined, using=None): engines = _engine_list(using) for engine in engines: try: - # This is required for deprecating the dirs argument. Simply - # return engine.get_template(template_name) in Django 1.10. - if isinstance(engine, DjangoTemplates): - return engine.get_template(template_name, dirs) - elif dirs is not _dirs_undefined: - warnings.warn( - "Skipping template backend %s because its get_template " - "method doesn't support the dirs argument." % engine.name, - stacklevel=2) - else: - return engine.get_template(template_name) + return engine.get_template(template_name) except TemplateDoesNotExist as e: chain.append(e) raise TemplateDoesNotExist(template_name, chain=chain) -def select_template(template_name_list, dirs=_dirs_undefined, using=None): +def select_template(template_name_list, using=None): """ Loads and returns a template for one of the given names. @@ -51,17 +39,7 @@ def select_template(template_name_list, dirs=_dirs_undefined, using=None): for template_name in template_name_list: for engine in engines: try: - # This is required for deprecating the dirs argument. Simply - # use engine.get_template(template_name) in Django 1.10. - if isinstance(engine, DjangoTemplates): - return engine.get_template(template_name, dirs) - elif dirs is not _dirs_undefined: - warnings.warn( - "Skipping template backend %s because its get_template " - "method doesn't support the dirs argument." % engine.name, - stacklevel=2) - else: - return engine.get_template(template_name) + return engine.get_template(template_name) except TemplateDoesNotExist as e: chain.append(e) @@ -73,7 +51,6 @@ def select_template(template_name_list, dirs=_dirs_undefined, using=None): def render_to_string(template_name, context=None, context_instance=_context_instance_undefined, - dirs=_dirs_undefined, dictionary=_dictionary_undefined, request=None, using=None): """ @@ -82,7 +59,6 @@ def render_to_string(template_name, context=None, template_name may be a string or a list of strings. """ if (context_instance is _context_instance_undefined - and dirs is _dirs_undefined and dictionary is _dictionary_undefined): # No deprecated arguments were passed - use the new code path if isinstance(template_name, (list, tuple)): @@ -106,17 +82,12 @@ def render_to_string(template_name, context=None, "when some deprecated arguments are passed.") # Hack -- use the internal Engine instance of DjangoTemplates. return engine.engine.render_to_string( - template_name, context, context_instance, dirs, dictionary) + template_name, context, context_instance, dictionary) elif context_instance is not _context_instance_undefined: warnings.warn( "Skipping template backend %s because its render_to_string " "method doesn't support the context_instance argument." % engine.name, stacklevel=2) - elif dirs is not _dirs_undefined: - warnings.warn( - "Skipping template backend %s because its render_to_string " - "method doesn't support the dirs argument." % engine.name, - stacklevel=2) elif dictionary is not _dictionary_undefined: warnings.warn( "Skipping template backend %s because its render_to_string " diff --git a/docs/topics/http/shortcuts.txt b/docs/topics/http/shortcuts.txt index 43b5ef5868..03562aaf89 100644 --- a/docs/topics/http/shortcuts.txt +++ b/docs/topics/http/shortcuts.txt @@ -15,7 +15,7 @@ introduce controlled coupling for convenience's sake. ``render`` ========== -.. function:: render(request, template_name, context=None, context_instance=_context_instance_undefined, content_type=None, status=None, dirs=_dirs_undefined, using=None) +.. function:: render(request, template_name, context=None, context_instance=_context_instance_undefined, content_type=None, status=None, using=None) Combines a given template with a given context dictionary and returns an :class:`~django.http.HttpResponse` object with that rendered text. @@ -75,10 +75,6 @@ Optional arguments The ``using`` parameter was added. -.. deprecated:: 1.8 - - The ``dirs`` parameter was deprecated. - Example ------- @@ -107,7 +103,7 @@ This example is equivalent to:: ``render_to_response`` ====================== -.. function:: render_to_response(template_name, context=None, context_instance=_context_instance_undefined, content_type=None, status=None, dirs=_dirs_undefined, using=None) +.. function:: render_to_response(template_name, context=None, context_instance=_context_instance_undefined, content_type=None, status=None, using=None) Renders a given template with a given context dictionary and returns an :class:`~django.http.HttpResponse` object with that rendered text. @@ -165,10 +161,6 @@ Optional arguments The ``status`` and ``using`` parameters were added. -.. deprecated:: 1.8 - - The ``dirs`` parameter was deprecated. - Example ------- diff --git a/docs/topics/templates.txt b/docs/topics/templates.txt index a2ccdb0c9f..b8a537aa5d 100644 --- a/docs/topics/templates.txt +++ b/docs/topics/templates.txt @@ -95,7 +95,7 @@ Usage The ``django.template.loader`` module defines two functions to load templates. -.. function:: get_template(template_name, dirs=_dirs_undefined, using=None) +.. function:: get_template(template_name, using=None) This function loads the template with the given name and returns a ``Template`` object. @@ -115,10 +115,6 @@ The ``django.template.loader`` module defines two functions to load templates. If you want to restrict the search to a particular template engine, pass the engine's :setting:`NAME ` in the ``using`` argument. - .. deprecated:: 1.8 - - The ``dirs`` parameter was deprecated. - .. versionchanged:: 1.8 The ``using`` parameter was added. @@ -128,16 +124,12 @@ The ``django.template.loader`` module defines two functions to load templates. ``get_template()`` returns a backend-dependent ``Template`` instead of a :class:`django.template.Template`. -.. function:: select_template(template_name_list, dirs=_dirs_undefined, using=None) +.. function:: select_template(template_name_list, using=None) ``select_template()`` is just like ``get_template()``, except it takes a list of template names. It tries each name in order and returns the first template that exists. - .. deprecated:: 1.8 - - The ``dirs`` parameter was deprecated. - .. versionchanged:: 1.8 The ``using`` parameter was added. diff --git a/tests/shortcuts/other_templates/render_dirs_test.html b/tests/shortcuts/other_templates/render_dirs_test.html deleted file mode 100644 index 52a6c1d3a7..0000000000 --- a/tests/shortcuts/other_templates/render_dirs_test.html +++ /dev/null @@ -1 +0,0 @@ -spam eggs diff --git a/tests/shortcuts/tests.py b/tests/shortcuts/tests.py index 5c44ab20f5..9418424922 100644 --- a/tests/shortcuts/tests.py +++ b/tests/shortcuts/tests.py @@ -32,13 +32,6 @@ class ShortcutTests(SimpleTestCase): self.assertEqual(response.content, b'FOO.BAR..\n') self.assertEqual(response['Content-Type'], 'application/x-rendertest') - @ignore_warnings(category=RemovedInDjango110Warning) - def test_render_to_response_with_dirs(self): - response = self.client.get('/render_to_response/dirs/') - self.assertEqual(response.status_code, 200) - self.assertEqual(response.content, b'spam eggs\n') - self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') - def test_render_to_response_with_status(self): response = self.client.get('/render_to_response/status/') self.assertEqual(response.status_code, 403) @@ -101,10 +94,3 @@ class ShortcutTests(SimpleTestCase): self.assertEqual(response.content, b'DTL\n') response = self.client.get('/render/using/?using=jinja2') self.assertEqual(response.content, b'Jinja2\n') - - @ignore_warnings(category=RemovedInDjango110Warning) - def test_render_with_dirs(self): - response = self.client.get('/render/dirs/') - self.assertEqual(response.status_code, 200) - self.assertEqual(response.content, b'spam eggs\n') - self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8') diff --git a/tests/shortcuts/urls.py b/tests/shortcuts/urls.py index e125709296..0c01ada37a 100644 --- a/tests/shortcuts/urls.py +++ b/tests/shortcuts/urls.py @@ -7,7 +7,6 @@ urlpatterns = [ url(r'^render_to_response/multiple_templates/$', views.render_to_response_view_with_multiple_templates), url(r'^render_to_response/request_context/$', views.render_to_response_view_with_request_context), url(r'^render_to_response/content_type/$', views.render_to_response_view_with_content_type), - url(r'^render_to_response/dirs/$', views.render_to_response_view_with_dirs), url(r'^render_to_response/status/$', views.render_to_response_view_with_status), url(r'^render_to_response/using/$', views.render_to_response_view_with_using), url(r'^render_to_response/context_instance_misuse/$', views.render_to_response_with_context_instance_misuse), @@ -15,7 +14,6 @@ urlpatterns = [ url(r'^render/multiple_templates/$', views.render_view_with_multiple_templates), url(r'^render/base_context/$', views.render_view_with_base_context), url(r'^render/content_type/$', views.render_view_with_content_type), - url(r'^render/dirs/$', views.render_with_dirs), url(r'^render/status/$', views.render_view_with_status), url(r'^render/using/$', views.render_view_with_using), ] diff --git a/tests/shortcuts/views.py b/tests/shortcuts/views.py index e4638106ac..e072e96b32 100644 --- a/tests/shortcuts/views.py +++ b/tests/shortcuts/views.py @@ -1,10 +1,5 @@ -import os.path - from django.shortcuts import render, render_to_response from django.template import Context, RequestContext -from django.utils._os import upath - -dirs = (os.path.join(os.path.dirname(upath(__file__)), 'other_templates'),) def render_to_response_view(request): @@ -38,10 +33,6 @@ def render_to_response_view_with_content_type(request): }, content_type='application/x-rendertest') -def render_to_response_view_with_dirs(request): - return render_to_response('render_dirs_test.html', dirs=dirs) - - def render_to_response_view_with_status(request): return render_to_response('shortcuts/render_test.html', { 'foo': 'FOO', @@ -95,10 +86,6 @@ def render_view_with_content_type(request): }, content_type='application/x-rendertest') -def render_with_dirs(request): - return render(request, 'render_dirs_test.html', dirs=dirs) - - def render_view_with_status(request): return render(request, 'shortcuts/render_test.html', { 'foo': 'FOO', diff --git a/tests/template_tests/test_engine.py b/tests/template_tests/test_engine.py index 2d354bae0b..d2c45b25a9 100644 --- a/tests/template_tests/test_engine.py +++ b/tests/template_tests/test_engine.py @@ -89,28 +89,3 @@ class LoaderTests(SimpleTestCase): template = engine.get_template('priority/foo.html') self.assertEqual(template.render(Context()), 'priority\n') - - -@ignore_warnings(category=RemovedInDjango110Warning) -class TemplateDirsOverrideTests(SimpleTestCase): - DIRS = ((OTHER_DIR, ), [OTHER_DIR]) - - def setUp(self): - self.engine = Engine() - - def test_render_to_string(self): - for dirs in self.DIRS: - self.assertEqual( - self.engine.render_to_string('test_dirs.html', dirs=dirs), - 'spam eggs\n', - ) - - def test_get_template(self): - for dirs in self.DIRS: - template = self.engine.get_template('test_dirs.html', dirs=dirs) - self.assertEqual(template.render(Context()), 'spam eggs\n') - - def test_select_template(self): - for dirs in self.DIRS: - template = self.engine.select_template(['test_dirs.html'], dirs=dirs) - self.assertEqual(template.render(Context()), 'spam eggs\n')