multitenant: enable DISABLE_CRON_JOBS for a specific tenant (#56595)

This commit is contained in:
Emmanuel Cazenave 2021-09-09 12:40:56 +02:00
parent 4d2d6a05d1
commit f9de8f6f6d
2 changed files with 41 additions and 1 deletions

View File

@ -132,9 +132,20 @@ class Command(InteractiveTenantOption, BaseCommand):
if args_namespace.all_tenants:
errors = []
for tenant in TenantMiddleware.get_tenants():
connection.set_tenant(tenant)
if getattr(settings, 'DISABLE_CRON_JOBS', False):
if args_verbosity.verbosity > 1 or args_namespace.force_job:
msg = 'Command %s is ignored on tenant %s because DISABLE_CRON_JOBS is set' % (
app_name,
tenant.domain_url,
)
prefix = '* '
if args_namespace.force_job:
prefix = '* WARNING: '
print(prefix + msg)
continue
if args_verbosity.verbosity > 1:
print(u'* Running command on tenant %s' % tenant.domain_url)
connection.set_tenant(tenant)
error = run_command_from_argv(klass, args)
if error:
errors.append(error)

View File

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
import json
import os
import sys
@ -45,6 +46,34 @@ def test_all_tenants(handle, tenants):
)
@mock.patch('django.contrib.sessions.management.commands.clearsessions.Command.handle')
def test_all_tenants_disable_cron(handle, tenants, settings):
from django.core.management import execute_from_command_line
settings.DISABLE_CRON_JOBS = True
handle.side_effect = RecordTenant()
execute_from_command_line(['manage.py', 'tenant_command', 'clearsessions', '--all-tenants'])
assert handle.call_count == 0
assert len(handle.side_effect.tenants) == 0
@mock.patch('django.contrib.sessions.management.commands.clearsessions.Command.handle')
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(
{'DISABLE_CRON_JOBS': True},
fd,
)
handle.side_effect = RecordTenant()
execute_from_command_line(['manage.py', 'tenant_command', 'clearsessions', '--all-tenants'])
assert handle.call_count == 1
assert len(handle.side_effect.tenants) == 1
@mock.patch('django.contrib.sessions.management.commands.clearsessions.Command.handle')
def test_one_tenant(handle, tenants, tenant_in_call=None):
from django.core.management import execute_from_command_line