don't use context_instance in rendering functions (#25346)

This commit is contained in:
Emmanuel Cazenave 2018-07-18 19:48:42 +02:00
parent cecdc9adfd
commit 64766b7016
9 changed files with 59 additions and 84 deletions

View File

@ -1,10 +1,9 @@
import logging
from django.utils.translation import ugettext as _
from django.shortcuts import render_to_response, render
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.views.generic.base import TemplateView
from django.template import RequestContext
from django.template.loader import render_to_string
from django.contrib import messages
from django.contrib.auth.forms import AuthenticationForm
@ -57,8 +56,7 @@ def handle_request(request):
# No SSL entries and no user session, redirect account linking page
if not user and not request.user.is_authenticated():
return render_to_response('auth/account_linking_ssl.html',
context_instance=RequestContext(request))
return render(request, 'auth/account_linking_ssl.html')
# No SSL entries but active user session, perform account linking
if not user and request.user.is_authenticated():
@ -128,12 +126,10 @@ def post_account_linking(request):
return render(request, 'auth/account_linking_ssl.html')
def profile(request, template_name='ssl/profile.html', *args, **kwargs):
context_instance = kwargs.pop('context_instance', None) or \
RequestContext(request)
context = kwargs.pop('context', {})
certificates = models.ClientCertificate.objects.filter(user=request.user)
ctx = { 'certificates': certificates }
return render_to_string(template_name, ctx,
context_instance=context_instance)
context.update({'certificates': certificates})
return render_to_string(template_name, context, request=request)
def delete_certificate(request, certificate_pk):
qs = models.ClientCertificate.objects.filter(pk=certificate_pk)

View File

@ -17,7 +17,7 @@ class LoginPasswordBackend(object):
return 'password'
def login(self, request, *args, **kwargs):
context_instance = kwargs.get('context_instance', None)
context = kwargs.get('context', {})
is_post = request.method == 'POST' and self.submit_name in request.POST
data = request.POST if is_post else None
form = forms.AuthenticationForm(request=request, data=data)
@ -26,9 +26,7 @@ class LoginPasswordBackend(object):
if app_settings.A2_USERNAME_LABEL:
form.fields['username'].label = app_settings.A2_USERNAME_LABEL
is_secure = request.is_secure
context = {
'submit_name': self.submit_name,
}
context['submit_name'] = self.submit_name
if is_post:
utils.csrf_token_check(request, form)
if form.is_valid():
@ -39,8 +37,7 @@ class LoginPasswordBackend(object):
return utils.login(request, form.get_user(), how,
service_slug=request.GET.get(constants.SERVICE_FIELD_NAME))
context['form'] = form
return render(request, 'authentic2/login_password_form.html', context,
context_instance=context_instance)
return render(request, 'authentic2/login_password_form.html', context)
def profile(self, request, *args, **kwargs):
return views.login_password_profile(request, *args, **kwargs)

View File

@ -1,7 +1,6 @@
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.shortcuts import render
from authentic2.saml.models import LibertyProvider
@ -11,11 +10,10 @@ def consent_federation(request, nonce = '', next = None, provider_id = None):
'''On a GET produce a form asking for consentment,
On a POST handle the form and redirect to next'''
if request.method == "GET":
return render_to_response('interaction/consent_federation.html',
return render(request, 'interaction/consent_federation.html',
{'provider_id': request.GET.get('provider_id', ''),
'nonce': request.GET.get('nonce', ''),
'next': request.GET.get('next', '')},
context_instance=RequestContext(request))
'next': request.GET.get('next', '')})
else:
next = '/'
if 'next' in request.POST:
@ -57,13 +55,12 @@ def consent_attributes(request, nonce = '', next = None, provider_id = None):
name = request.GET.get('provider_id', '')
if provider:
name = provider.name or name
return render_to_response('interaction/consent_attributes.html',
return render(request, 'interaction/consent_attributes.html',
{'provider_id': name,
'attributes': attributes,
'allow_selection': request.session['allow_attributes_selection'],
'nonce': request.GET.get('nonce', ''),
'next': next},
context_instance=RequestContext(request))
'next': next})
elif request.method == "POST":
if request.session['allow_attributes_selection']:

View File

@ -14,7 +14,6 @@ from django.views.generic.edit import FormView, CreateView
from django.contrib.auth import get_user_model
from django.forms import CharField, Form
from django.core.urlresolvers import reverse_lazy
from django.template import RequestContext
from django.http import Http404, HttpResponseBadRequest
from authentic2.utils import (import_module_or_class, redirect, make_url, get_fields_and_labels,
@ -92,16 +91,14 @@ class BaseRegistrationView(FormView):
return redirect(self.request, 'registration_complete')
def get_context_data(self, **kwargs):
ctx = super(BaseRegistrationView, self).get_context_data(**kwargs)
request_context = RequestContext(self.request)
request_context.push(ctx)
context = super(BaseRegistrationView, self).get_context_data(**kwargs)
parameters = {'request': self.request,
'context_instance': request_context}
'context': context}
blocks = [utils.get_backend_method(backend, 'registration', parameters)
for backend in utils.get_backends('AUTH_FRONTENDS')]
request_context['frontends'] = collections.OrderedDict((block['id'], block)
for block in blocks if block)
return request_context
context['frontends'] = collections.OrderedDict((block['id'], block)
for block in blocks if block)
return context
class RegistrationView(cbv.ValidateCSRFMixin, BaseRegistrationView):

View File

@ -9,10 +9,9 @@ import datetime
import requests
from authentic2.compat_lasso import lasso
from django.template import RequestContext
from django.conf import settings
from django.http import HttpResponseRedirect, Http404, HttpResponse
from django.shortcuts import render_to_response
from django.shortcuts import render
from django.core.exceptions import ValidationError
from authentic2.saml.models import (LibertyFederation, LibertyProvider,
@ -181,14 +180,14 @@ def return_saml2_request(request, profile, title=''):
def return_saml2(request, profile, field_name, title=''):
'''Helper to handle SAMLv2 bindings to emit request and responses'''
context_instance = RequestContext(request)
logger.debug('profile.msgBody: %r', profile.msgBody)
logger.debug('profile.msgUrl: %r', profile.msgUrl)
logger.debug('profile.msgRelayState: %r', profile.msgRelayState)
logger.debug('field_name: %s', field_name)
if profile.msgBody:
if profile.msgUrl:
return render_to_response(
return render(
request,
'saml/post_form.html',
{
'title': title,
@ -196,8 +195,7 @@ def return_saml2(request, profile, field_name, title=''):
'fieldname': field_name,
'body': profile.msgBody,
'relay_state': profile.msgRelayState
},
context_instance=context_instance)
})
return HttpResponse(profile.msgBody, content_type='text/xml')
elif profile.msgUrl:
return HttpResponseRedirect(profile.msgUrl)
@ -503,13 +501,12 @@ def error_page(request, message, back=None, logger=None, warning=False):
back = '/'
redirection_timeout = getattr(settings, 'REDIRECTION_TIMEOUT_AFTER_ERROR',
2000)
return render_to_response('error.html',
{
'msg': message,
'back': back,
'redir_timeout': redirection_timeout
},
context_instance=RequestContext(request))
return render(request, 'error.html',
{
'msg': message,
'back': back,
'redir_timeout': redirection_timeout
})
def redirect_next(request, next):

View File

@ -34,7 +34,6 @@ from django.core.urlresolvers import reverse, NoReverseMatch
from django.utils.formats import localize
from django.contrib import messages
from django.utils.functional import empty
from django.template import RequestContext
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes
from django.shortcuts import render
@ -592,11 +591,8 @@ def send_templated_mail(user_or_email, template_names, context=None, with_html=T
user_or_email = user_or_email.email
if not request:
request = middleware.StoreRequestMiddleware().get_request()
if request:
ctx = RequestContext(request)
ctx.update(context or {})
else:
ctx = context or {}
ctx = context or {}
subject_template_names = [template_name + '_subject.txt' for template_name in template_names]
subject_template_names += legacy_subject_templates or []
@ -611,7 +607,7 @@ def send_templated_mail(user_or_email, template_names, context=None, with_html=T
html_body_template_names += legacy_html_body_templates or []
if with_html:
try:
html_body = render_to_string(html_body_template_names, ctx)
html_body = render_to_string(html_body_template_names, ctx, request=request)
except TemplateDoesNotExist:
html_body = None
send_mail(subject, body, from_email or settings.DEFAULT_FROM_EMAIL, [user_or_email],

View File

@ -9,7 +9,6 @@ import collections
from django.conf import settings
from django.shortcuts import render_to_response, render
from django.template import RequestContext
from django.template.loader import render_to_string, select_template
from django.views.generic.edit import UpdateView, FormView
from django.views.generic import RedirectView, TemplateView
@ -290,12 +289,12 @@ def login(request, template_name='authentic2/login.html',
registration_url = utils.get_registration_url(
request, service_slug=request.GET.get(constants.SERVICE_FIELD_NAME))
context_instance = RequestContext(request, {
context = {
'cancel': nonce is not None,
'can_reset_password': app_settings.A2_USER_CAN_RESET_PASSWORD is not False,
'registration_authorized': getattr(settings, 'REGISTRATION_OPEN', True),
'registration_url': registration_url,
})
}
# Cancel button
if request.method == "POST" \
@ -327,7 +326,7 @@ def login(request, template_name='authentic2/login.html',
blocks.append(block)
else: # New frontends API
parameters = {'request': request,
'context_instance': context_instance}
'context': context}
block = utils.get_backend_method(frontend, 'login', parameters)
# If a login frontend method returns an HttpResponse with a status code != 200
# this response is returned.
@ -347,29 +346,29 @@ def login(request, template_name='authentic2/login.html',
if not 'form' in block:
continue
frontend = block['frontend']
context = {
context.update({
'submit_name': 'submit-%s' % fid,
redirect_field_name: redirect_to,
'form': block['form']
}
})
if hasattr(frontend, 'get_context'):
context.update(frontend.get_context())
sub_template_name = frontend.template()
block['content'] = render_to_string(
sub_template_name, context,
context_instance=context_instance)
request=request)
request.session.set_test_cookie()
# legacy context variable
rendered_forms = [(block['name'], block['content']) for block in blocks]
return render_to_response(template_name, {
context.update({
'methods': rendered_forms,
# new definition
'blocks': collections.OrderedDict((block['id'], block) for block in blocks),
redirect_field_name: redirect_to,
}, context_instance=context_instance)
})
return render(request, template_name, context)
def service_list(request):
@ -404,12 +403,11 @@ class ProfileView(cbv.TemplateNamesMixin, TemplateView):
return super(ProfileView, self).dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
ctx = super(ProfileView, self).get_context_data(**kwargs)
context = super(ProfileView, self).get_context_data(**kwargs)
frontends = utils.get_backends('AUTH_FRONTENDS')
request = self.request
context_instance = RequestContext(request, ctx)
if request.method == "POST":
for frontend in frontends:
if 'submit-%s' % frontend.id in request.POST:
@ -479,7 +477,7 @@ class ProfileView(cbv.TemplateNamesMixin, TemplateView):
# Credentials management
parameters = {'request': request,
'context_instance': context_instance}
'context': context}
profiles = [utils.get_backend_method(frontend, 'profile', parameters)
for frontend in frontends]
# Old frontends data structure for templates
@ -494,7 +492,7 @@ class ProfileView(cbv.TemplateNamesMixin, TemplateView):
for idp_backend in idp_backends:
if hasattr(idp_backend, 'federation_management'):
federation_management.extend(idp_backend.federation_management(request))
context_instance.update({
context.update({
'frontends_block': blocks,
'frontends_block_by_id': blocks_by_id,
'profile': profile,
@ -506,8 +504,8 @@ class ProfileView(cbv.TemplateNamesMixin, TemplateView):
'allow_password_change': request.user.can_change_password(),
'federation_management': federation_management,
})
hooks.call_hooks('modify_context_data', self, context_instance)
return context_instance
hooks.call_hooks('modify_context_data', self, context)
return context
profile = login_required(ProfileView.as_view())
@ -581,14 +579,15 @@ def logout(request, next_url=None, default_next_url='auth_homepage',
def login_password_profile(request, *args, **kwargs):
context_instance = kwargs.pop('context_instance', None) or RequestContext(request)
context = kwargs.pop('context', {})
can_change_password = app_settings.A2_REGISTRATION_CAN_CHANGE_PASSWORD
has_usable_password = request.user.has_usable_password()
context.update(
{'can_change_password': can_change_password,
'has_usable_password': has_usable_password})
return render_to_string(['auth/login_password_profile.html',
'authentic2/login_password_profile.html'],
{'can_change_password' : can_change_password,
'has_usable_password' : has_usable_password},
context_instance=context_instance)
context, request=request)
class LoggedInView(View):

View File

@ -15,9 +15,6 @@ class OIDCFrontend(object):
return 'oidc'
def login(self, request, *args, **kwargs):
context_instance = kwargs.get('context_instance', None)
ctx = {
'providers': utils.get_providers(shown=True),
}
return render(request, 'authentic2_auth_oidc/login.html', ctx,
context_instance=context_instance)
context = kwargs.get('context', {})
context['providers'] = utils.get_providers(shown=True)
return render(request, 'authentic2_auth_oidc/login.html', context)

View File

@ -1,6 +1,5 @@
from django.utils.translation import gettext_noop
from django.template.loader import render_to_string
from django.template import RequestContext
from django.shortcuts import render
from mellon.utils import get_idp, get_idps
@ -19,20 +18,20 @@ class SAMLFrontend(object):
return gettext_noop('SAML')
def login(self, request, *args, **kwargs):
context_instance = kwargs.pop('context_instance', None) or RequestContext(request)
context = kwargs.pop('context', {})
submit_name = 'login-%s' % self.id
context['submit_name'] = submit_name
if request.method == 'POST' and submit_name in request.POST:
return redirect_to_login(request, login_url='mellon_login')
return render(request, 'authentic2_auth_saml/login.html', {'submit_name': submit_name},
context_instance=context_instance)
return render(request, 'authentic2_auth_saml/login.html', context)
def profile(self, request, *args, **kwargs):
context_instance = kwargs.pop('context_instance', None) or RequestContext(request)
context = kwargs.pop('context', {})
user_saml_identifiers = request.user.saml_identifiers.all()
if not user_saml_identifiers:
return ''
for user_saml_identifier in user_saml_identifiers:
user_saml_identifier.idp = get_idp(user_saml_identifier.issuer)
context['user_saml_identifiers'] = user_saml_identifiers
return render_to_string('authentic2_auth_saml/profile.html',
{'user_saml_identifiers': user_saml_identifiers},
context_instance=context_instance)
context, request=request)