Projet

Général

Profil

0001-multitenant-skip-tenants-where-all-migrations-are-ap.patch

Frédéric Péters, 07 janvier 2019 14:41

Télécharger (3,01 ko)

Voir les différences:

Subject: [PATCH] multitenant: skip tenants where all migrations are applied
 (#29522)

 .../management/commands/migrate_schemas.py    | 29 +++++++++++++++++++
 1 file changed, 29 insertions(+)
hobo/multitenant/management/commands/migrate_schemas.py
1 1
import django
2 2
from optparse import NO_DEFAULT
3 3

  
4
from django.apps import apps
4 5
from django.core.management.commands.migrate import Command as MigrateCommand
6
from django.db.migrations.loader import MigrationLoader
5 7
from django.db.migrations.recorder import MigrationRecorder
6 8
from django.db import connection
7 9
from django.conf import settings
......
45 47
                else:
46 48
                    self.run_migrations(self.schema_name, settings.TENANT_APPS)
47 49
            else:
50
                app_labels = []
51
                for app in apps.get_app_configs():
52
                    if app.name in settings.TENANT_APPS:
53
                        app_labels.append(app.label)
54
                loader = MigrationLoader(connection)
55
                loader.load_disk()
56
                recorder = MigrationRecorder(connection)
57
                applied_public_migrations = set(
58
                        [(app, migration) for app, migration
59
                         in recorder.applied_migrations()
60
                         if app in app_labels and
61
                            (app, migration) in loader.disk_migrations])
48 62
                for tenant in TenantMiddleware.get_tenants():
63
                    connection.set_schema(tenant.schema_name, include_public=False)
64
                    applied_migrations = self.get_applied_migrations(app_labels)
65
                    if all([x in applied_migrations for x in applied_public_migrations]):
66
                        if int(self.options.get('verbosity', 1)) >= 1:
67
                            self._notice("=== Skipping migrations of schema %s" % tenant.schema_name)
68
                        continue
49 69
                    self.run_migrations(tenant.schema_name, settings.TENANT_APPS)
50 70

  
71
    def get_applied_migrations(self, app_labels):
72
        applied_migrations = []
73
        with connection.cursor() as cursor:
74
            cursor.execute('SELECT app, name FROM django_migrations')
75
            for row in cursor.fetchall():
76
                applied_migrations.append(row)
77
        applied_migrations = [x for x in applied_migrations if x[0] in app_labels]
78
        return applied_migrations
79

  
51 80
    def run_migrations(self, schema_name, included_apps):
52 81
        if int(self.options.get('verbosity', 1)) >= 1:
53 82
            self._notice("=== Running migrate for schema %s" % schema_name)
54
-