django32: implement clear_tenants_settings as a global function (#67760)

Django 3.2 introduced a constraint on the access of settings object
attributes, they can only be in uppercase. As clear_tenants_settings is
only used by tests on the multitenant framework, clear_tenants_settings
is reimplemented as a global function using a global variable
_tenant_settings_wrapper to access the global multitenant aware wrapper
around the setting object.
This commit is contained in:
Benjamin Dauvergne 2023-01-18 12:19:47 +01:00
parent f05596a088
commit 3ac54aa650
6 changed files with 16 additions and 27 deletions

View File

@ -2,19 +2,30 @@ from django.apps import AppConfig, apps
from . import settings, threads
_tenant_settings_wrapper = None
def clear_tenants_settings():
if _tenant_settings_wrapper is not None:
_tenant_settings_wrapper.__dict__['tenants_settings'] = {}
class MultitenantAppConfig(AppConfig):
name = 'hobo.multitenant'
verbose_name = 'Multitenant'
def ready(self):
global _tenant_settings_wrapper
from django import conf
from django.db import migrations
from django.db.migrations import operations
# Install tenant aware settings
if not isinstance(conf.settings._wrapped, settings.TenantSettingsWrapper):
conf.settings._wrapped = settings.TenantSettingsWrapper(conf.settings._wrapped)
_tenant_settings_wrapper = conf.settings._wrapped = settings.TenantSettingsWrapper(
conf.settings._wrapped
)
# reset settings getattr method to a cache-less version, to cancel
# https://code.djangoproject.com/ticket/27625.
conf.LazySettings.__getattr__ = lambda self, name: getattr(self._wrapped, name)

View File

@ -34,9 +34,6 @@ class TenantSettingsWrapper:
self.__dict__['tenants_settings'] = {}
self.__dict__['default_settings'] = default_settings
def clear_tenants_settings(self):
self.__dict__['tenants_settings'] = {}
@property
def loaders(self):
loaders = getattr(self.default_settings, 'TENANT_SETTINGS_LOADERS', [])

View File

@ -1,5 +1,7 @@
import pytest
from hobo.multitenant.apps import clear_tenants_settings
@pytest.fixture
def make_tenant(tmp_path, transactional_db, settings, request):
@ -111,11 +113,13 @@ def make_tenant(tmp_path, transactional_db, settings, request):
@pytest.fixture
def tenants(make_tenant):
clear_tenants_settings()
return [make_tenant('tenant1.example.net'), make_tenant('tenant2.example.net')]
@pytest.fixture
def tenant(make_tenant):
clear_tenants_settings()
return make_tenant('tenant.example.net')

View File

@ -39,8 +39,6 @@ def test_tenant_middleware(tenants, client, settings):
def test_tenant_json_settings(tenants, settings):
settings.clear_tenants_settings()
with utilities.patch_default_settings(
settings, TENANT_SETTINGS_LOADERS=('hobo.multitenant.settings_loaders.SettingsJSON',)
):
@ -67,8 +65,6 @@ def test_tenant_json_settings(tenants, settings):
def test_tenant_template_vars(tenants, settings, client):
django.conf.settings.clear_tenants_settings()
with utilities.patch_default_settings(
settings, TENANT_SETTINGS_LOADERS=('hobo.multitenant.settings_loaders.TemplateVars',)
):
@ -99,8 +95,6 @@ def test_tenant_template_vars(tenants, settings, client):
def test_tenant_settings_vars(tenants, settings, client):
django.conf.settings.clear_tenants_settings()
with utilities.patch_default_settings(
settings, TENANT_SETTINGS_LOADERS=('hobo.multitenant.settings_loaders.SettingsVars',)
):
@ -127,8 +121,6 @@ def test_tenant_settings_vars(tenants, settings, client):
def test_tenant_cors_settings(tenants, settings, client):
settings.clear_tenants_settings()
with utilities.patch_default_settings(
settings, TENANT_SETTINGS_LOADERS=('hobo.multitenant.settings_loaders.CORSSettings',)
):
@ -148,8 +140,6 @@ def test_tenant_cors_settings(tenants, settings, client):
def test_tenant_theme_settings(tenants, settings, client):
django.conf.settings.clear_tenants_settings()
with utilities.patch_default_settings(
settings,
TENANT_SETTINGS_LOADERS=(
@ -183,7 +173,6 @@ def test_shared_secret():
def test_known_services(tenants, settings):
from hobo.multitenant.settings_loaders import KnownServices
settings.clear_tenants_settings()
settings.SETTINGS_MODULE = 'fake.settings'
for tenant in tenants:
@ -223,8 +212,6 @@ def test_known_services(tenants, settings):
def test_legacy_urls_mapping(tenants, settings):
settings.clear_tenants_settings()
settings.SETTINGS_MODULE = 'fake.settings'
for tenant in tenants:
@ -235,8 +222,6 @@ def test_legacy_urls_mapping(tenants, settings):
def test_unique_cookies(tenants, settings):
settings.clear_tenants_settings()
cookie_names = set()
for tenant in tenants:
with tenant_context(tenant):
@ -247,8 +232,6 @@ def test_unique_cookies(tenants, settings):
def test_tenant_json_settings_reload(tenants, settings, freezer):
settings.clear_tenants_settings()
with utilities.patch_default_settings(
settings, TENANT_SETTINGS_LOADERS=('hobo.multitenant.settings_loaders.SettingsJSON',)
):

View File

@ -49,7 +49,6 @@ def test_all_tenants(handle, tenants):
def test_all_tenants_disable_cron(handle, tenants, settings):
from django.core.management import execute_from_command_line
settings.clear_tenants_settings()
settings.DISABLE_CRON_JOBS = True
handle.side_effect = RecordTenant()
execute_from_command_line(['manage.py', 'tenant_command', 'clearsessions', '--all-tenants'])
@ -61,7 +60,6 @@ def test_all_tenants_disable_cron(handle, tenants, settings):
def test_all_tenants_disable_cron_for_specific_tenant(handle, tenants, settings):
from django.core.management import execute_from_command_line
settings.clear_tenants_settings()
disabled_tenant = tenants[0]
with open(os.path.join(disabled_tenant.get_directory(), 'settings.json'), 'w') as fd:
json.dump(
@ -78,7 +76,6 @@ def test_all_tenants_disable_cron_for_specific_tenant(handle, tenants, settings)
def test_all_tenants_global_disable_cron_with_force_job(handle, tenants, settings):
from django.core.management import execute_from_command_line
settings.clear_tenants_settings()
settings.DISABLE_CRON_JOBS = True
handle.side_effect = RecordTenant()
execute_from_command_line(

View File

@ -23,8 +23,6 @@ from tenant_schemas.utils import tenant_context
def test_thread(tenants, settings, client):
settings.clear_tenants_settings()
with utilities.patch_default_settings(
settings, TENANT_SETTINGS_LOADERS=('hobo.multitenant.settings_loaders.TemplateVars',)
):
@ -86,7 +84,6 @@ def test_cache(tenants, client):
def test_timer_thread(tenants, settings, client):
settings.clear_tenants_settings()
with utilities.patch_default_settings(
settings, TENANT_SETTINGS_LOADERS=('hobo.multitenant.settings_loaders.TemplateVars',)
):