From b7f313ae2a6e42d8d9bbb51afa0b1d1b04ac3159 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Sat, 2 Mar 2019 12:28:02 +0100 Subject: [PATCH 3/3] migrate_schemas: remove migration of public schema (fixes #31042) --- .../management/commands/__init__.py | 23 +------ .../management/commands/migrate_schemas.py | 66 ++++++++----------- 2 files changed, 30 insertions(+), 59 deletions(-) diff --git a/hobo/multitenant/management/commands/__init__.py b/hobo/multitenant/management/commands/__init__.py index 139d61c..5ed2b73 100644 --- a/hobo/multitenant/management/commands/__init__.py +++ b/hobo/multitenant/management/commands/__init__.py @@ -52,8 +52,6 @@ class BaseTenantCommand(BaseCommand): def add_arguments(self, parser): super(BaseTenantCommand, self).add_arguments(parser) parser.add_argument("-d", "--domain", dest="domain") - parser.add_argument("-p", "--skip-public", dest="skip_public", - action="store_true", default=False) # use the privately held reference to the underlying command to invoke # the add_arguments path on this parser instance self._original_command.add_arguments(parser) @@ -82,8 +80,7 @@ class BaseTenantCommand(BaseCommand): self.execute_command(TenantMiddleware.get_tenant_by_hostname(options['domain']), self.COMMAND_NAME, *args, **options) else: for tenant in TenantMiddleware.get_tenants(): - if not (options['skip_public'] and tenant.schema_name == get_public_schema_name()): - self.execute_command(tenant, self.COMMAND_NAME, *args, **options) + self.execute_command(tenant, self.COMMAND_NAME, *args, **options) class InteractiveTenantOption(object): @@ -152,10 +149,6 @@ class TenantWrappedCommand(InteractiveTenantOption, BaseCommand): class SyncCommon(BaseCommand): def add_arguments(self, parser): - parser.add_argument('--tenant', action='store_true', dest='tenant', default=False, - help='Tells Django to populate only tenant applications.') - parser.add_argument('--shared', action='store_true', dest='shared', default=False, - help='Tells Django to populate only shared applications.') parser.add_argument('--app_label', action='store', dest='app_label', nargs='?', help='App label of an application to synchronize the state.') parser.add_argument('--migration_name', action='store', dest='migration_name', nargs='?', @@ -164,8 +157,6 @@ class SyncCommon(BaseCommand): parser.add_argument("-d", "--domain", dest="domain") def handle(self, *args, **options): - self.sync_tenant = options.get('tenant') - self.sync_public = options.get('shared') self.domain = options.get('domain') self.installed_apps = settings.INSTALLED_APPS self.args = args @@ -176,18 +167,6 @@ class SyncCommon(BaseCommand): else: self.schema_name = options.get('schema_name') - if self.schema_name: - if self.sync_public: - raise CommandError("domain should only be used with the --tenant switch.") - elif self.schema_name == get_public_schema_name(): - self.sync_public = True - else: - self.sync_tenant = True - elif not self.sync_public and not self.sync_tenant: - # no options set, sync both - self.sync_tenant = True - self.sync_public = True - if hasattr(settings, 'TENANT_APPS'): self.tenant_apps = settings.TENANT_APPS if hasattr(settings, 'SHARED_APPS'): diff --git a/hobo/multitenant/management/commands/migrate_schemas.py b/hobo/multitenant/management/commands/migrate_schemas.py index 05c26d5..579c1d8 100644 --- a/hobo/multitenant/management/commands/migrate_schemas.py +++ b/hobo/multitenant/management/commands/migrate_schemas.py @@ -47,44 +47,36 @@ class MigrateSchemasCommand(SyncCommon): def handle(self, *args, **options): super(MigrateSchemasCommand, self).handle(*args, **options) - self.PUBLIC_SCHEMA_NAME = get_public_schema_name() - - if self.sync_public and not self.schema_name: - self.schema_name = self.PUBLIC_SCHEMA_NAME - - if self.sync_public: - self.run_migrations(self.schema_name, settings.SHARED_APPS) - if self.sync_tenant: - if self.schema_name and self.schema_name != self.PUBLIC_SCHEMA_NAME: - if not schema_exists(self.schema_name): - raise RuntimeError('Schema "{}" does not exist'.format( - self.schema_name)) - else: - self.run_migrations(self.schema_name, settings.TENANT_APPS) + if self.schema_name: + if not schema_exists(self.schema_name): + raise RuntimeError('Schema "{}" does not exist'.format( + self.schema_name)) else: - app_labels = [] - for app in apps.get_app_configs(): - if app.name in settings.TENANT_APPS: - app_labels.append(app.label) - loader = MigrationLoader(connection) - loader.load_disk() - recorder = MigrationRecorder(connection) - applied_public_migrations = set( - [(app, migration) - for app, migration in recorder.applied_migrations() - if app in app_labels and (app, migration) in loader.disk_migrations]) - for tenant in TenantMiddleware.get_tenants(): - connection.set_schema(tenant.schema_name, include_public=False) - applied_migrations = self.get_applied_migrations(app_labels) - if options.get('fake') or options.get('migration_name') or options.get('app_label'): - # never skip migrations if explicit migration actions - # are given. - applied_migrations = [] - if all([x in applied_migrations for x in applied_public_migrations]): - if int(self.options.get('verbosity', 1)) >= 1: - self._notice("=== Skipping migrations of schema %s" % tenant.schema_name) - continue - self.run_migrations(tenant.schema_name, settings.TENANT_APPS) + self.run_migrations(self.schema_name, settings.TENANT_APPS) + else: + app_labels = [] + for app in apps.get_app_configs(): + if app.name in settings.TENANT_APPS: + app_labels.append(app.label) + loader = MigrationLoader(connection) + loader.load_disk() + recorder = MigrationRecorder(connection) + applied_public_migrations = set( + [(app, migration) + for app, migration in recorder.applied_migrations() + if app in app_labels and (app, migration) in loader.disk_migrations]) + for tenant in TenantMiddleware.get_tenants(): + connection.set_schema(tenant.schema_name, include_public=False) + applied_migrations = self.get_applied_migrations(app_labels) + if options.get('fake') or options.get('migration_name') or options.get('app_label'): + # never skip migrations if explicit migration actions + # are given. + applied_migrations = [] + if all([x in applied_migrations for x in applied_public_migrations]): + if int(self.options.get('verbosity', 1)) >= 1: + self._notice("=== Skipping migrations of schema %s" % tenant.schema_name) + continue + self.run_migrations(tenant.schema_name, settings.TENANT_APPS) def get_applied_migrations(self, app_labels): applied_migrations = [] -- 2.20.1