0003-migrate_schemas-remove-migration-of-public-schema-fi.patch
hobo/multitenant/management/commands/__init__.py | ||
---|---|---|
52 | 52 |
def add_arguments(self, parser): |
53 | 53 |
super(BaseTenantCommand, self).add_arguments(parser) |
54 | 54 |
parser.add_argument("-d", "--domain", dest="domain") |
55 |
parser.add_argument("-p", "--skip-public", dest="skip_public", |
|
56 |
action="store_true", default=False) |
|
57 | 55 |
# use the privately held reference to the underlying command to invoke |
58 | 56 |
# the add_arguments path on this parser instance |
59 | 57 |
self._original_command.add_arguments(parser) |
... | ... | |
82 | 80 |
self.execute_command(TenantMiddleware.get_tenant_by_hostname(options['domain']), self.COMMAND_NAME, *args, **options) |
83 | 81 |
else: |
84 | 82 |
for tenant in TenantMiddleware.get_tenants(): |
85 |
if not (options['skip_public'] and tenant.schema_name == get_public_schema_name()): |
|
86 |
self.execute_command(tenant, self.COMMAND_NAME, *args, **options) |
|
83 |
self.execute_command(tenant, self.COMMAND_NAME, *args, **options) |
|
87 | 84 | |
88 | 85 | |
89 | 86 |
class InteractiveTenantOption(object): |
... | ... | |
152 | 149 |
class SyncCommon(BaseCommand): |
153 | 150 | |
154 | 151 |
def add_arguments(self, parser): |
155 |
parser.add_argument('--tenant', action='store_true', dest='tenant', default=False, |
|
156 |
help='Tells Django to populate only tenant applications.') |
|
157 |
parser.add_argument('--shared', action='store_true', dest='shared', default=False, |
|
158 |
help='Tells Django to populate only shared applications.') |
|
159 | 152 |
parser.add_argument('--app_label', action='store', dest='app_label', nargs='?', |
160 | 153 |
help='App label of an application to synchronize the state.') |
161 | 154 |
parser.add_argument('--migration_name', action='store', dest='migration_name', nargs='?', |
... | ... | |
164 | 157 |
parser.add_argument("-d", "--domain", dest="domain") |
165 | 158 | |
166 | 159 |
def handle(self, *args, **options): |
167 |
self.sync_tenant = options.get('tenant') |
|
168 |
self.sync_public = options.get('shared') |
|
169 | 160 |
self.domain = options.get('domain') |
170 | 161 |
self.installed_apps = settings.INSTALLED_APPS |
171 | 162 |
self.args = args |
... | ... | |
176 | 167 |
else: |
177 | 168 |
self.schema_name = options.get('schema_name') |
178 | 169 | |
179 |
if self.schema_name: |
|
180 |
if self.sync_public: |
|
181 |
raise CommandError("domain should only be used with the --tenant switch.") |
|
182 |
elif self.schema_name == get_public_schema_name(): |
|
183 |
self.sync_public = True |
|
184 |
else: |
|
185 |
self.sync_tenant = True |
|
186 |
elif not self.sync_public and not self.sync_tenant: |
|
187 |
# no options set, sync both |
|
188 |
self.sync_tenant = True |
|
189 |
self.sync_public = True |
|
190 | ||
191 | 170 |
if hasattr(settings, 'TENANT_APPS'): |
192 | 171 |
self.tenant_apps = settings.TENANT_APPS |
193 | 172 |
if hasattr(settings, 'SHARED_APPS'): |
hobo/multitenant/management/commands/migrate_schemas.py | ||
---|---|---|
47 | 47 | |
48 | 48 |
def handle(self, *args, **options): |
49 | 49 |
super(MigrateSchemasCommand, self).handle(*args, **options) |
50 |
self.PUBLIC_SCHEMA_NAME = get_public_schema_name() |
|
51 | ||
52 |
if self.sync_public and not self.schema_name: |
|
53 |
self.schema_name = self.PUBLIC_SCHEMA_NAME |
|
54 | ||
55 |
if self.sync_public: |
|
56 |
self.run_migrations(self.schema_name, settings.SHARED_APPS) |
|
57 |
if self.sync_tenant: |
|
58 |
if self.schema_name and self.schema_name != self.PUBLIC_SCHEMA_NAME: |
|
59 |
if not schema_exists(self.schema_name): |
|
60 |
raise RuntimeError('Schema "{}" does not exist'.format( |
|
61 |
self.schema_name)) |
|
62 |
else: |
|
63 |
self.run_migrations(self.schema_name, settings.TENANT_APPS) |
|
50 |
if self.schema_name: |
|
51 |
if not schema_exists(self.schema_name): |
|
52 |
raise RuntimeError('Schema "{}" does not exist'.format( |
|
53 |
self.schema_name)) |
|
64 | 54 |
else: |
65 |
app_labels = [] |
|
66 |
for app in apps.get_app_configs(): |
|
67 |
if app.name in settings.TENANT_APPS: |
|
68 |
app_labels.append(app.label) |
|
69 |
loader = MigrationLoader(connection) |
|
70 |
loader.load_disk() |
|
71 |
recorder = MigrationRecorder(connection) |
|
72 |
applied_public_migrations = set( |
|
73 |
[(app, migration) |
|
74 |
for app, migration in recorder.applied_migrations() |
|
75 |
if app in app_labels and (app, migration) in loader.disk_migrations]) |
|
76 |
for tenant in TenantMiddleware.get_tenants(): |
|
77 |
connection.set_schema(tenant.schema_name, include_public=False) |
|
78 |
applied_migrations = self.get_applied_migrations(app_labels) |
|
79 |
if options.get('fake') or options.get('migration_name') or options.get('app_label'): |
|
80 |
# never skip migrations if explicit migration actions |
|
81 |
# are given. |
|
82 |
applied_migrations = [] |
|
83 |
if all([x in applied_migrations for x in applied_public_migrations]): |
|
84 |
if int(self.options.get('verbosity', 1)) >= 1: |
|
85 |
self._notice("=== Skipping migrations of schema %s" % tenant.schema_name) |
|
86 |
continue |
|
87 |
self.run_migrations(tenant.schema_name, settings.TENANT_APPS) |
|
55 |
self.run_migrations(self.schema_name, settings.TENANT_APPS) |
|
56 |
else: |
|
57 |
app_labels = [] |
|
58 |
for app in apps.get_app_configs(): |
|
59 |
if app.name in settings.TENANT_APPS: |
|
60 |
app_labels.append(app.label) |
|
61 |
loader = MigrationLoader(connection) |
|
62 |
loader.load_disk() |
|
63 |
recorder = MigrationRecorder(connection) |
|
64 |
applied_public_migrations = set( |
|
65 |
[(app, migration) |
|
66 |
for app, migration in recorder.applied_migrations() |
|
67 |
if app in app_labels and (app, migration) in loader.disk_migrations]) |
|
68 |
for tenant in TenantMiddleware.get_tenants(): |
|
69 |
connection.set_schema(tenant.schema_name, include_public=False) |
|
70 |
applied_migrations = self.get_applied_migrations(app_labels) |
|
71 |
if options.get('fake') or options.get('migration_name') or options.get('app_label'): |
|
72 |
# never skip migrations if explicit migration actions |
|
73 |
# are given. |
|
74 |
applied_migrations = [] |
|
75 |
if all([x in applied_migrations for x in applied_public_migrations]): |
|
76 |
if int(self.options.get('verbosity', 1)) >= 1: |
|
77 |
self._notice("=== Skipping migrations of schema %s" % tenant.schema_name) |
|
78 |
continue |
|
79 |
self.run_migrations(tenant.schema_name, settings.TENANT_APPS) |
|
88 | 80 | |
89 | 81 |
def get_applied_migrations(self, app_labels): |
90 | 82 |
applied_migrations = [] |
91 |
- |