allow override of app's settings (#19763)

This commit is contained in:
Josue Kouka 2017-10-30 18:38:48 +01:00
parent 4a9368111c
commit 1f4bd5d85d
3 changed files with 34 additions and 32 deletions

View File

@ -29,7 +29,7 @@ from django.core.urlresolvers import resolve
def get_app_settings():
module_name, app_settings = tuple(settings.SITE_APP.rsplit('.', 1))
module = import_module(module_name)
return getattr(module, app_settings)
return getattr(module, app_settings)()
def app_web_services(request, path):
@ -63,22 +63,22 @@ class AppSettingsMeta(type):
'one of these settings ({}) must be defined'
.format(('SITE_FORCE_REDIRECT_URL', 'SITE_FORCE_REDIRECT_LOCATOR')))
# Script asserting phantomjs authentication
dct['SITE_AUTH_CHECKER'] = os.path.join(settings.STATIC_ROOT, dct['SITE_AUTH_CHECKER'])
# Default form submit element
if not dct.get('SITE_FORM_SUBMIT_ELEMENT', None):
dct['SITE_FORM_SUBMIT_ELEMENT'] = 'input[type=submit], button'
if dct.get('SITE_LOGIN_PATH_PREFIX', None):
parent = bases[0]
dct['SITE_LOGIN_PATH'] = os.path.join(dct['SITE_LOGIN_PATH_PREFIX'], parent.SITE_LOGIN_PATH.strip('/'))
return super(AppSettingsMeta, cls).__new__(cls, name, bases, dct)
class AppSettings(object):
__metaclass__ = AppSettingsMeta
def __getattribute__(self, name):
value = getattr(settings, name, None)
if value is not None:
return value
return super(AppSettings, self).__getattribute__(name)
# Test App Settings
class Test(AppSettings):
@ -228,10 +228,6 @@ class Arpege(AppSettings):
SITE_LOGOUT_LOCATOR = '#espace-login form input[type=submit]'
class ArpegeVincennesTest(Arpege):
SITE_LOGIN_PATH = '/vincennes-test/index.do'
class Imuse(AppSettings):
SITE_LOGIN_PATH = 'extranet/login/gen_index_groupe.php?nav=autre'
@ -265,20 +261,6 @@ class Imuse(AppSettings):
SITE_FORM_SUBMIT_ELEMENT = '#INDEX_BT_LOGIN'
class ImuseTeacher(Imuse):
SITE_LOGIN_PATH = '/extranet/login/ens_index_enseignant.php'
class ImuseFamily(Imuse):
SITE_LOGIN_PATH = '/extranet/login/usa_index_famille.php'
SITE_LOGOUT_LOCATOR = '#MENU_FAMILLE_QUITTER'
class ImuseFamilyMontpellier(ImuseFamily):
SITE_LOGIN_PATH_PREFIX = '/montpellier/'
class Sezhame(AppSettings):
SITE_LOGIN_PATH = '/sezhame/page/connexion-abonne?destination=user'
@ -344,7 +326,3 @@ class Teamnet(AppSettings):
SITE_FORCE_REDIRECT_LOCATOR = '#loginForm'
SITE_LOGOUT_LOCATOR = ".infoUtilisateur[alt=Deconnexion]"
class TeamnetMeyzieu(Teamnet):
SITE_LOGIN_PATH_PREFIX = '/meyzieu/'

View File

@ -133,12 +133,13 @@ def get_login_info(request, credentials):
"""Returns phantomjs login prerequis
"""
app_settings = get_app_settings()
auth_checker = os.path.join(
settings.STATIC_ROOT, app_settings.SITE_AUTH_CHECKER)
return {
'address': request.build_absolute_uri(app_settings.SITE_LOGIN_PATH),
'cookies': [],
'locators': [credentials.to_login_info()],
'auth_checker': app_settings.SITE_AUTH_CHECKER,
'auth_checker': auth_checker,
'form_submit_element': app_settings.SITE_FORM_SUBMIT_ELEMENT
}

View File

@ -3,6 +3,7 @@
import json
import time
import mock
import os
import pytest
from django.conf import settings
@ -13,7 +14,7 @@ from django.test.client import RequestFactory, Client
from django.core.urlresolvers import reverse
from mandayejs.mandaye.models import UserCredentials
from mandayejs.mandaye.utils import exec_phantom
from mandayejs.mandaye.utils import exec_phantom, get_login_info
from mandayejs.mandaye.forms import FormFactory
from mandayejs.mandaye.views import post_login_do
@ -409,3 +410,25 @@ def test_post_login_do_with_next_url(mocked_popen, user_john):
request.user = user_john
response = post_login_do(request)
assert 'window.top.location = "http://example.net/"' in response.content
@mock.patch('mandayejs.applications.Test.SITE_LOCATORS', MOCKED_SITE_LOCATORS)
def test_app_settings_overriding(settings, cred_john):
request = RequestFactory().get('/')
data = get_login_info(request, cred_john)
assert data['address'] == 'http://testserver/'
assert data['auth_checker'] == os.path.join(settings.STATIC_ROOT, 'js/test/auth.checker.js')
assert data['form_submit_element'] == 'input[type=submit], button'
# when overriding settings
settings.SITE_LOGIN_PATH = 'account/login'
settings.SITE_AUTH_CHECKER = 'js/global.auth.checker.js'
settings.SITE_FORM_SUBMIT_ELEMENT = 'button'
data = get_login_info(request, cred_john)
assert data['address'] == 'http://testserver/account/login'
assert data['auth_checker'] == os.path.join(settings.STATIC_ROOT, 'js/global.auth.checker.js')
assert data['form_submit_element'] == 'button'
settings.SITE_LOGIN_PATH = ''
settings.SITE_FORM_SUBMIT_ELEMENT = ''
data = get_login_info(request, cred_john)
assert data['address'] == 'http://testserver/'
assert data['form_submit_element'] == ''