Projet

Général

Profil

0001-misc-provide-origin-service-in-template-context-2069.patch

Valentin Deniaud, 03 septembre 2020 17:45

Télécharger (5,21 ko)

Voir les différences:

Subject: [PATCH] misc: provide origin service in template context (#20699)

 src/authentic2/context_processors.py          |  6 +++++
 src/authentic2/middleware.py                  | 15 ++++++++++++
 src/authentic2/settings.py                    |  1 +
 src/authentic2/templates/authentic2/base.html |  4 ++++
 tests/test_template.py                        | 24 +++++++++++++++++++
 5 files changed, 50 insertions(+)
src/authentic2/context_processors.py
18 18
from django.conf import settings
19 19

  
20 20
from . import utils, app_settings, constants
21
from .models import Service
21 22

  
22 23

  
23 24
class UserFederations(object):
......
59 60
    if hasattr(request, 'session'):
60 61
        variables['LAST_LOGIN'] = request.session.get(constants.LAST_LOGIN_SESSION_KEY)
61 62
        variables['USER_SWITCHED'] = constants.SWITCH_USER_SESSION_KEY in request.session
63
        if 'service_pk' in request.session:
64
            try:
65
                variables['service'] = Service.objects.get(pk=request.session['service_pk'])
66
            except Service.DoesNotExist:
67
                pass
62 68
    return variables
src/authentic2/middleware.py
32 32
from django.shortcuts import render
33 33

  
34 34
from . import app_settings, utils, plugins
35
from .utils.service import get_service_from_request
35 36

  
36 37

  
37 38
class CollectIPMiddleware(MiddlewareMixin):
......
205 206
            # set test cookie for 1 year
206 207
            response.set_cookie(self.COOKIE_NAME, '1', max_age=365 * 24 * 3600)
207 208
        return response
209

  
210

  
211
class SaveServiceInSessionMiddleware:
212
    def __init__(self, get_response):
213
        self.get_response = get_response
214

  
215
    def __call__(self, request):
216
        service = None
217

  
218
        service = get_service_from_request(request)
219
        if service:
220
            request.session['service_pk'] = service.pk
221

  
222
        return self.get_response(request)
src/authentic2/settings.py
95 95
    'django.middleware.common.CommonMiddleware',
96 96
    'django.middleware.http.ConditionalGetMiddleware',
97 97
    'django.contrib.sessions.middleware.SessionMiddleware',
98
    'authentic2.middleware.SaveServiceInSessionMiddleware',
98 99
    'django.middleware.csrf.CsrfViewMiddleware',
99 100
    'django.middleware.locale.LocaleMiddleware',
100 101
    'django.contrib.auth.middleware.AuthenticationMiddleware',
src/authentic2/templates/authentic2/base.html
11 11
  {{ form.media.css }}
12 12
{% endblock %}
13 13

  
14
{% block bodyargs %}
15
  data-service-slug="{{ service.slug }}" data-service-name="{{ service.name }}"
16
{% endblock %}
17

  
14 18
{% block extrascripts %}
15 19
  {{ block.super }}
16 20
  {{ form.media.js }}
tests/test_template.py
16 16

  
17 17
import pytest
18 18

  
19
from authentic2.a2_rbac.utils import get_default_ou
20
from authentic2.models import Service
19 21
from authentic2.utils.template import Template, TemplateError
20 22

  
21 23
pytestmark = pytest.mark.django_db
......
111 113
    with pytest.raises(TemplateError) as raised:
112 114
        template.render(context=context)
113 115
        assert 'missing template variable' in raised
116

  
117

  
118
def test_service_in_template(app, simple_user, service):
119
    resp = app.get(reverse('auth_login') + '?service=%s' % service.slug)
120

  
121
    assert resp.pyquery('body').attr('data-service-slug') == service.slug
122
    assert resp.pyquery('body').attr('data-service-name') == service.name
123

  
124
    resp.form.set('username', simple_user.username)
125
    resp.form.set('password', simple_user.username)
126
    response = resp.form.submit(name='login-password-submit')
127

  
128
    resp = app.get(reverse('account_management'))
129
    assert resp.pyquery('body').attr('data-service-slug') == service.slug
130
    assert resp.pyquery('body').attr('data-service-name') == service.name
131

  
132
    # if user comes back from a different service, the information is updated
133
    new_service = Service.objects.create(ou=get_default_ou(), slug='service2',
134
                                         name='Service2')
135
    resp = app.get(reverse('account_management') + '?service=%s' % new_service.slug)
136
    assert resp.pyquery('body').attr('data-service-slug') == new_service.slug
137
    assert resp.pyquery('body').attr('data-service-name') == new_service.name
114
-