Projet

Général

Profil

0003-migrate_schemas-remove-migration-of-public-schema-fi.patch

Benjamin Dauvergne, 23 juin 2019 02:22

Télécharger (7,96 ko)

Voir les différences:

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(-)
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
-