diff --git a/readthedocs/bookmarks/views.py b/readthedocs/bookmarks/views.py index 80a826471..71acbdd19 100644 --- a/readthedocs/bookmarks/views.py +++ b/readthedocs/bookmarks/views.py @@ -4,10 +4,9 @@ from __future__ import absolute_import from django.contrib.auth.decorators import login_required from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponseBadRequest -from django.shortcuts import get_object_or_404, render_to_response +from django.shortcuts import get_object_or_404, render from django.views.generic import ListView, View from django.core.urlresolvers import reverse -from django.template import RequestContext from django.utils.decorators import method_decorator from django.core.exceptions import ObjectDoesNotExist from django.views.decorators.csrf import csrf_exempt @@ -161,10 +160,7 @@ class BookmarkRemoveView(View): return super(BookmarkRemoveView, self).dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs): - return render_to_response( - 'bookmarks/bookmark_delete.html', - context_instance=RequestContext(request) - ) + return render(request, 'bookmarks/bookmark_delete.html') def post(self, request, *args, **kwargs): """ diff --git a/readthedocs/comments/views.py b/readthedocs/comments/views.py index a959924dc..1cef4a7c9 100644 --- a/readthedocs/comments/views.py +++ b/readthedocs/comments/views.py @@ -2,8 +2,7 @@ from __future__ import absolute_import from django.contrib.auth.decorators import login_required -from django.shortcuts import render_to_response -from django.template import RequestContext +from django.shortcuts import render from django.utils.decorators import method_decorator from rest_framework import permissions, status from rest_framework.decorators import ( @@ -92,9 +91,7 @@ def build(request): # pylint: disable=unused-argument def serve_file(request, file): # pylint: disable=redefined-builtin document = support.get_document(file) - return render_to_response('doc.html', - {'document': document}, - context_instance=RequestContext(request)) + return render(request, 'doc.html', {'document': document}) ###### # Called by Builder diff --git a/readthedocs/core/views/__init__.py b/readthedocs/core/views/__init__.py index 0a54aa733..a6a5b0c05 100644 --- a/readthedocs/core/views/__init__.py +++ b/readthedocs/core/views/__init__.py @@ -13,8 +13,7 @@ import logging from django.conf import settings from django.http import HttpResponseRedirect, Http404 -from django.shortcuts import render_to_response, get_object_or_404, redirect -from django.template import RequestContext +from django.shortcuts import render, get_object_or_404, redirect from django.views.decorators.csrf import csrf_exempt from django.views.generic import TemplateView @@ -98,8 +97,8 @@ def wipe_version(request, project_slug, version_slug): for del_dir in del_dirs: broadcast(type='build', task=remove_dir, args=[del_dir]) return redirect('project_version_list', project_slug) - return render_to_response('wipe_version.html', {'version': version, 'project': version.project}, - context_instance=RequestContext(request)) + return render(request, 'wipe_version.html', + {'version': version, 'project': version.project}) def divide_by_zero(request): # pylint: disable=unused-argument @@ -108,8 +107,7 @@ def divide_by_zero(request): # pylint: disable=unused-argument def server_error_500(request, template_name='500.html'): """A simple 500 handler so we get media""" - r = render_to_response(template_name, - context_instance=RequestContext(request)) + r = render(request, template_name) r.status_code = 500 return r @@ -119,7 +117,6 @@ def server_error_404(request, exception, template_name='404.html'): # pylint: d response = get_redirect_response(request, path=request.get_full_path()) if response: return response - r = render_to_response(template_name, - context_instance=RequestContext(request)) + r = render(request, template_name) r.status_code = 404 return r diff --git a/readthedocs/core/views/serve.py b/readthedocs/core/views/serve.py index a011e33bc..895515499 100644 --- a/readthedocs/core/views/serve.py +++ b/readthedocs/core/views/serve.py @@ -27,8 +27,7 @@ SERVE_DOCS (['private']) - The list of ['private', 'public'] docs to serve. from __future__ import absolute_import from django.conf import settings from django.http import HttpResponse, HttpResponseRedirect, Http404 -from django.shortcuts import render_to_response -from django.template import RequestContext +from django.shortcuts import render from django.views.static import serve from readthedocs.builds.models import Version @@ -109,8 +108,7 @@ def redirect_page_with_filename(request, project, subproject, filename): # pyli def _serve_401(request, project): - res = render_to_response('401.html', - context_instance=RequestContext(request)) + res = render(request, '401.html') res.status_code = 401 log.error('Unauthorized access to {0} documentation'.format(project.slug)) return res diff --git a/readthedocs/gold/views.py b/readthedocs/gold/views.py index 93fa51fc0..76ce1d5a9 100644 --- a/readthedocs/gold/views.py +++ b/readthedocs/gold/views.py @@ -6,8 +6,7 @@ from django.conf import settings from django.contrib.messages.views import SuccessMessageMixin from django.contrib import messages from django.http import HttpResponseRedirect -from django.shortcuts import render_to_response, get_object_or_404 -from django.template import RequestContext +from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required from django.utils.translation import ugettext_lazy as _ from vanilla import DeleteView, UpdateView, DetailView @@ -108,17 +107,15 @@ def projects(request): else: form = GoldProjectForm() - return render_to_response( - 'gold/projects.html', - { - 'form': form, - 'gold_user': gold_user, - 'publishable': settings.STRIPE_PUBLISHABLE, - 'user': request.user, - 'projects': gold_projects - }, - context_instance=RequestContext(request) - ) + return render(request, + 'gold/projects.html', + { + 'form': form, + 'gold_user': gold_user, + 'publishable': settings.STRIPE_PUBLISHABLE, + 'user': request.user, + 'projects': gold_projects + }) @login_required diff --git a/readthedocs/profiles/views.py b/readthedocs/profiles/views.py index 7f9e9429c..b99de5ba1 100644 --- a/readthedocs/profiles/views.py +++ b/readthedocs/profiles/views.py @@ -8,11 +8,9 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse -from django.http import Http404 -from django.http import HttpResponseRedirect -from django.shortcuts import get_object_or_404, render, redirect -from django.shortcuts import render_to_response -from django.template import RequestContext +from django.http import Http404, HttpResponseRedirect +from django.shortcuts import get_object_or_404, redirect, render +from django.template.context import RequestContext from readthedocs.core.forms import UserDeleteForm @@ -103,9 +101,8 @@ def create_profile(request, form_class, success_url=None, for key, value in list(extra_context.items()): context[key] = (value() if callable(value) else value) - return render_to_response(template_name, - {'form': form}, - context_instance=context) + context.update({'form': form}) + return render(request, template_name, context=context) create_profile = login_required(create_profile) @@ -180,11 +177,12 @@ def edit_profile(request, form_class, success_url=None, for key, value in list(extra_context.items()): context[key] = (value() if callable(value) else value) - return render_to_response(template_name, { + context.update({ 'form': form, 'profile': profile_obj, 'user': profile_obj.user, - }, context_instance=context) + }) + return render(request, template_name, context=context) edit_profile = login_required(edit_profile) @@ -271,6 +269,5 @@ def profile_detail(request, username, public_profile_field=None, for key, value in list(extra_context.items()): context[key] = (value() if callable(value) else value) - return render_to_response(template_name, - {'profile': profile_obj}, - context_instance=context) + context.update({'profile': profile_obj}) + return render(request, template_name, context=context) diff --git a/readthedocs/projects/views/private.py b/readthedocs/projects/views/private.py index 39b0b14f0..23290dda2 100644 --- a/readthedocs/projects/views/private.py +++ b/readthedocs/projects/views/private.py @@ -9,8 +9,7 @@ from django.contrib import messages from django.core.urlresolvers import reverse from django.http import (HttpResponseRedirect, HttpResponseNotAllowed, Http404, HttpResponseBadRequest) -from django.shortcuts import get_object_or_404, render_to_response, render -from django.template import RequestContext +from django.shortcuts import get_object_or_404, render from django.views.generic import View, TemplateView, ListView from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe @@ -154,11 +153,9 @@ def project_versions(request, project_slug): project_dashboard = reverse('projects_detail', args=[project.slug]) return HttpResponseRedirect(project_dashboard) - return render_to_response( - 'projects/project_versions.html', - {'form': form, 'project': project}, - context_instance=RequestContext(request) - ) + return render(request, + 'projects/project_versions.html', + {'form': form, 'project': project}) @login_required @@ -182,11 +179,9 @@ def project_version_detail(request, project_slug, version_slug): url = reverse('project_version_list', args=[project.slug]) return HttpResponseRedirect(url) - return render_to_response( + return render(request, 'projects/project_version_detail.html', - {'form': form, 'project': project, 'version': version}, - context_instance=RequestContext(request) - ) + {'form': form, 'project': project, 'version': version}) @login_required @@ -207,11 +202,9 @@ def project_delete(request, project_slug): project_dashboard = reverse('projects_dashboard') return HttpResponseRedirect(project_dashboard) - return render_to_response( + return render(request, 'projects/project_delete.html', - {'project': project}, - context_instance=RequestContext(request) - ) + {'project': project}) class ImportWizardView(ProjectSpamMixin, PrivateViewMixin, SessionWizardView): @@ -394,11 +387,9 @@ def edit_alias(request, project_slug, alias_id=None): if request.method == 'POST' and form.is_valid(): alias = form.save() return HttpResponseRedirect(alias.project.get_absolute_url()) - return render_to_response( + return render(request, 'projects/alias_edit.html', - {'form': form}, - context_instance=RequestContext(request) - ) + {'form': form}) class AliasList(PrivateViewMixin, ListView): @@ -474,11 +465,9 @@ def project_users(request, project_slug): users = project.users.all() - return render_to_response( + return render(request, 'projects/project_users.html', - {'form': form, 'project': project, 'users': users}, - context_instance=RequestContext(request) - ) + {'form': form, 'project': project, 'users': users}) @login_required @@ -515,7 +504,7 @@ def project_notifications(request, project_slug): emails = project.emailhook_notifications.all() urls = project.webhook_notifications.all() - return render_to_response( + return render(request, 'projects/project_notifications.html', { 'email_form': email_form, @@ -523,9 +512,7 @@ def project_notifications(request, project_slug): 'project': project, 'emails': emails, 'urls': urls, - }, - context_instance=RequestContext(request) - ) + }) @login_required @@ -533,13 +520,11 @@ def project_comments_settings(request, project_slug): project = get_object_or_404(Project.objects.for_admin_user(request.user), slug=project_slug) - return render_to_response( + return render(request, 'projects/project_comments_settings.html', { 'project': project, - }, - context_instance=RequestContext(request) - ) + }) @login_required @@ -575,11 +560,9 @@ def project_translations(request, project_slug): lang_projects = project.translations.all() - return render_to_response( + return render(request, 'projects/project_translations.html', - {'form': form, 'project': project, 'lang_projects': lang_projects}, - context_instance=RequestContext(request) - ) + {'form': form, 'project': project, 'lang_projects': lang_projects}) @login_required @@ -606,11 +589,9 @@ def project_redirects(request, project_slug): redirects = project.redirects.all() - return render_to_response( + return render(request, 'projects/project_redirects.html', - {'form': form, 'project': project, 'redirects': redirects}, - context_instance=RequestContext(request) - ) + {'form': form, 'project': project, 'redirects': redirects}) @login_required diff --git a/readthedocs/projects/views/public.py b/readthedocs/projects/views/public.py index f86360a66..85a0aac76 100644 --- a/readthedocs/projects/views/public.py +++ b/readthedocs/projects/views/public.py @@ -15,8 +15,7 @@ from django.contrib import messages from django.contrib.auth.models import User from django.contrib.staticfiles.templatetags.staticfiles import static from django.http import HttpResponse, HttpResponseRedirect, Http404 -from django.shortcuts import get_object_or_404, render_to_response -from django.template import RequestContext +from django.shortcuts import get_object_or_404, render from django.views.decorators.cache import never_cache from django.views.generic import ListView, DetailView @@ -138,15 +137,13 @@ def project_downloads(request, project_slug): if data: version_data[version] = data - return render_to_response( + return render(request, 'projects/project_downloads.html', { 'project': project, 'version_data': version_data, 'versions': versions, - }, - context_instance=RequestContext(request), - ) + }) def project_download_media(request, project_slug, type_, version_slug): @@ -234,14 +231,12 @@ def version_filter_autocomplete(request, project_slug): json_response = json.dumps(list(names)) return HttpResponse(json_response, content_type='text/javascript') elif resp_format == 'html': - return render_to_response( + return render(request, 'core/version_list.html', { 'project': project, 'versions': versions, - }, - context_instance=RequestContext(request), - ) + }) return HttpResponse(status=400) @@ -327,15 +322,13 @@ def elastic_project_search(request, project_slug): if isinstance(val, list): results['hits']['hits'][num]['fields'][key] = val[0] - return render_to_response( + return render(request, 'search/elastic_project_search.html', { 'project': project, 'query': query, 'results': results, - }, - context_instance=RequestContext(request), - ) + }) def project_versions(request, project_slug): @@ -359,15 +352,13 @@ def project_versions(request, project_slug): if wiped and wiped_version.count(): messages.success(request, 'Version wiped: ' + wiped) - return render_to_response( + return render(request, 'projects/project_version_list.html', { 'inactive_versions': inactive_versions, 'active_versions': active_versions, 'project': project, - }, - context_instance=RequestContext(request) - ) + }) def project_analytics(request, project_slug): @@ -402,7 +393,7 @@ def project_analytics(request, project_slug): page_list = page_list[:20] version_list = version_list[:20] - return render_to_response( + return render(request, 'projects/project_analytics.html', { 'project': project, @@ -410,9 +401,7 @@ def project_analytics(request, project_slug): 'page_list': page_list, 'version_list': version_list, 'full': full, - }, - context_instance=RequestContext(request) - ) + }) def project_embed(request, project_slug): @@ -422,7 +411,7 @@ def project_embed(request, project_slug): version = project.versions.get(slug=LATEST) files = version.imported_files.filter(name__endswith='.html').order_by('path') - return render_to_response( + return render(request, 'projects/project_embed.html', { 'project': project, @@ -431,6 +420,4 @@ def project_embed(request, project_slug): 'PUBLIC_API_URL': settings.PUBLIC_API_URL, 'URI': request.build_absolute_uri(location='/').rstrip('/') } - }, - context_instance=RequestContext(request) - ) + }) diff --git a/readthedocs/search/views.py b/readthedocs/search/views.py index 89951183d..b014f0b12 100644 --- a/readthedocs/search/views.py +++ b/readthedocs/search/views.py @@ -6,8 +6,7 @@ import collections import logging from django.conf import settings -from django.shortcuts import render_to_response -from django.template import RequestContext +from django.shortcuts import render from readthedocs.builds.constants import LATEST from readthedocs.search import lib as search_lib @@ -80,8 +79,7 @@ def elastic_search(request): 'results': results, 'facets': facets, }) - return render_to_response( + return render(request, 'search/elastic_search.html', template_vars, - context_instance=RequestContext(request), ) diff --git a/readthedocs/settings/base.py b/readthedocs/settings/base.py index a9aede842..267d2f54b 100644 --- a/readthedocs/settings/base.py +++ b/readthedocs/settings/base.py @@ -118,11 +118,6 @@ class CommunityBaseSettings(Settings): apps.append('readthedocsext.embed') return apps - TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', - ) - MIDDLEWARE_CLASSES = ( 'readthedocs.core.middleware.ProxyMiddleware', 'readthedocs.core.middleware.FooterNoSessionMiddleware', @@ -145,17 +140,6 @@ class CommunityBaseSettings(Settings): 'allauth.account.auth_backends.AuthenticationBackend', ) - TEMPLATE_CONTEXT_PROCESSORS = ( - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - 'django.core.context_processors.debug', - 'django.core.context_processors.i18n', - 'django.core.context_processors.media', - 'django.core.context_processors.request', - # Read the Docs processor - 'readthedocs.core.context_processors.readthedocs_processor', - ) - MESSAGE_STORAGE = 'readthedocs.notifications.storages.FallbackUniqueStorage' NOTIFICATION_BACKENDS = [ @@ -181,9 +165,30 @@ class CommunityBaseSettings(Settings): MEDIA_URL = '/media/' ADMIN_MEDIA_PREFIX = '/media/admin/' STATICFILES_DIRS = [os.path.join(SITE_ROOT, 'readthedocs', 'static')] - TEMPLATE_DIRS = ( - TEMPLATE_ROOT, - ) + + TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [TEMPLATE_ROOT], + 'OPTIONS': { + 'debug': DEBUG, + 'context_processors': [ + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + 'django.template.context_processors.debug', + 'django.template.context_processors.i18n', + 'django.template.context_processors.media', + 'django.template.context_processors.request', + # Read the Docs processor + 'readthedocs.core.context_processors.readthedocs_processor', + ], + 'loaders': [ + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ], + }, + }, + ] # Cache CACHES = {