multitenant: don't abort --all-tenants on first failing tenant (#28039)
This commit is contained in:
parent
99567431ed
commit
7e9287ac48
|
@ -6,15 +6,50 @@
|
|||
# Home-page: http://github.com/bcarneiro/django-tenant-schemas
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.core.management.base import (BaseCommand, CommandError,
|
||||
SystemCheckError, handle_default_options)
|
||||
from django.core.management import call_command, get_commands, load_command_class
|
||||
from django.db import connection
|
||||
from django.db import connection, connections
|
||||
|
||||
from hobo.multitenant.management.commands import InteractiveTenantOption
|
||||
from hobo.multitenant.middleware import TenantMiddleware
|
||||
|
||||
def run_command_from_argv(command, argv):
|
||||
# copied/adapted from Django run_from_argv
|
||||
command._called_from_command_line = True
|
||||
parser = command.create_parser(argv[0], argv[1])
|
||||
|
||||
options = parser.parse_args(argv[2:])
|
||||
cmd_options = vars(options)
|
||||
# Move positional args out of options to mimic legacy optparse
|
||||
args = cmd_options.pop('args', ())
|
||||
handle_default_options(options)
|
||||
try:
|
||||
command.execute(*args, **cmd_options)
|
||||
except Exception as e:
|
||||
if options.traceback:
|
||||
raise
|
||||
|
||||
# SystemCheckError takes care of its own formatting.
|
||||
if isinstance(e, SystemCheckError):
|
||||
command.stderr.write(str(e), lambda x: x)
|
||||
else:
|
||||
command.stderr.write('%s: %s: %s' % (
|
||||
connection.get_tenant(), e.__class__.__name__, e))
|
||||
return e
|
||||
finally:
|
||||
try:
|
||||
connections.close_all()
|
||||
except ImproperlyConfigured:
|
||||
# Ignore if connections aren't setup at this point (e.g. no
|
||||
# configured settings).
|
||||
pass
|
||||
|
||||
|
||||
class Command(InteractiveTenantOption, BaseCommand):
|
||||
help = "Wrapper around django commands for use with an individual tenant"
|
||||
args = '<other_command>'
|
||||
|
@ -64,11 +99,17 @@ class Command(InteractiveTenantOption, BaseCommand):
|
|||
return
|
||||
|
||||
if args_namespace.all_tenants:
|
||||
errors = []
|
||||
for tenant in TenantMiddleware.get_tenants():
|
||||
if args_verbosity.verbosity > 1:
|
||||
print(u'* Running command on tenant %s' % tenant.domain_url)
|
||||
connection.set_tenant(tenant)
|
||||
klass.run_from_argv(args)
|
||||
error = run_command_from_argv(klass, args)
|
||||
if error:
|
||||
errors.append(error)
|
||||
if errors:
|
||||
self.stderr.write('Command failed on multiple tenants')
|
||||
sys.exit(1)
|
||||
else:
|
||||
tenant = self.get_tenant_from_options_or_interactive(domain=args_namespace.domain_name)
|
||||
connection.set_tenant(tenant)
|
||||
|
|
Loading…
Reference in New Issue