Projet

Général

Profil

« Précédent | Suivant » 

Révision 1f642209

Ajouté par Thomas Noël il y a plus de 9 ans

migrate_schemas: use django 1.7 if available (#6388)

Voir les différences:

entrouvert/djommon/multitenant/management/commands/legacy/migrate_schemas.py
1
# this file derive from django-tenant-schemas
2
#   Author: Bernardo Pires Carneiro
3
#   Email: carneiro.be@gmail.com
4
#   License: MIT license
5
#   Home-page: http://github.com/bcarneiro/django-tenant-schemas
6
from django.conf import settings
7
from django.db import connection
8
from south import migration
9
from south.migration.base import Migrations
10
from south.management.commands.migrate import Command as MigrateCommand
11
from entrouvert.djommon.multitenant.middleware import TenantMiddleware
12
from entrouvert.djommon.multitenant.management.commands import SyncCommon
13

  
14

  
15
class Command(SyncCommon):
16
    help = "Migrate schemas with South"
17
    option_list = MigrateCommand.option_list + SyncCommon.option_list
18

  
19
    def handle(self, *args, **options):
20
        super(Command, self).handle(*args, **options)
21

  
22
        if self.sync_public:
23
            self.migrate_public_apps()
24
        if self.sync_tenant:
25
            self.migrate_tenant_apps(self.domain)
26

  
27
    def _set_managed_apps(self, included_apps, excluded_apps):
28
        """ while sync_schemas works by setting which apps are managed, on south we set which apps should be ignored """
29
        ignored_apps = []
30
        if excluded_apps:
31
            for item in excluded_apps:
32
                if item not in included_apps:
33
                    ignored_apps.append(item)
34

  
35
        for app in ignored_apps:
36
            app_label = app.split('.')[-1]
37
            settings.SOUTH_MIGRATION_MODULES[app_label] = 'ignore'
38

  
39
    def _save_south_settings(self):
40
        self._old_south_modules = None
41
        if hasattr(settings, "SOUTH_MIGRATION_MODULES") and settings.SOUTH_MIGRATION_MODULES is not None:
42
            self._old_south_modules = settings.SOUTH_MIGRATION_MODULES.copy()
43
        else:
44
            settings.SOUTH_MIGRATION_MODULES = dict()
45

  
46
    def _restore_south_settings(self):
47
        settings.SOUTH_MIGRATION_MODULES = self._old_south_modules
48

  
49
    def _clear_south_cache(self):
50
        for mig in list(migration.all_migrations()):
51
            delattr(mig._application, "migrations")
52
        Migrations._clear_cache()
53

  
54
    def _migrate_schema(self, tenant):
55
        connection.set_tenant(tenant, include_public=False)
56
        MigrateCommand().execute(*self.args, **self.options)
57

  
58
    def migrate_tenant_apps(self, schema_name=None):
59
        self._save_south_settings()
60

  
61
        apps = self.tenant_apps or self.installed_apps
62
        self._set_managed_apps(included_apps=apps, excluded_apps=self.shared_apps)
63

  
64
        if schema_name:
65
            self._notice("=== Running migrate for schema: %s" % schema_name)
66
            connection.set_schema_to_public()
67
            tenant = TenantMiddleware.get_tenant_by_hostname(schema_name)
68
            self._migrate_schema(tenant)
69
        else:
70
            all_tenants = TenantMiddleware.get_tenants()
71
            if not all_tenants:
72
                self._notice("No tenants found")
73

  
74
            for tenant in all_tenants:
75
                Migrations._dependencies_done = False  # very important, the dependencies need to be purged from cache
76
                self._notice("=== Running migrate for schema %s" % tenant.schema_name)
77
                self._migrate_schema(tenant)
78

  
79
        self._restore_south_settings()
80

  
81
    def migrate_public_apps(self):
82
        self._save_south_settings()
83

  
84
        apps = self.shared_apps or self.installed_apps
85
        self._set_managed_apps(included_apps=apps, excluded_apps=self.tenant_apps)
86

  
87
        self._notice("=== Running migrate for schema public")
88
        MigrateCommand().execute(*self.args, **self.options)
89

  
90
        self._clear_south_cache()
91
        self._restore_south_settings()
entrouvert/djommon/multitenant/management/commands/migrate_schemas.py
1
# this file derive from django-tenant-schemas
2
#   Author: Bernardo Pires Carneiro
3
#   Email: carneiro.be@gmail.com
4
#   License: MIT license
5
#   Home-page: http://github.com/bcarneiro/django-tenant-schemas
6
from django.conf import settings
1
import django
2
from optparse import NO_DEFAULT
3

  
4
if django.VERSION >= (1, 7, 0):
5
    from django.core.management.commands.migrate import Command as MigrateCommand
6
    from django.db.migrations.recorder import MigrationRecorder
7 7
from django.db import connection
8
from south import migration
9
from south.migration.base import Migrations
10
from south.management.commands.migrate import Command as MigrateCommand
11
from entrouvert.djommon.multitenant.middleware import TenantMiddleware
8
from django.conf import settings
9

  
10
from tenant_schemas.utils import get_public_schema_name
11
from entrouvert.djommon.multitenant.middleware import TenantMiddleware, TenantNotFound
12 12
from entrouvert.djommon.multitenant.management.commands import SyncCommon
13 13

  
14 14

  
15
class Command(SyncCommon):
16
    help = "Migrate schemas with South"
17
    option_list = MigrateCommand.option_list + SyncCommon.option_list
15
class MigrateSchemasCommand(SyncCommon):
16
    help = "Updates database schema. Manages both apps with migrations and those without."
17

  
18
    def run_from_argv(self, argv):
19
        """
20
        Changes the option_list to use the options from the wrapped command.
21
        Adds schema parameter to specify which schema will be used when
22
        executing the wrapped command.
23
        """
24
        self.option_list += MigrateCommand.option_list
25
        super(MigrateSchemasCommand, self).run_from_argv(argv)
18 26

  
19 27
    def handle(self, *args, **options):
20
        super(Command, self).handle(*args, **options)
28
        super(MigrateSchemasCommand, self).handle(*args, **options)
29
        self.PUBLIC_SCHEMA_NAME = get_public_schema_name()
30

  
31
        if self.sync_public and not self.domain:
32
            self.domain = self.PUBLIC_SCHEMA_NAME
21 33

  
22 34
        if self.sync_public:
23
            self.migrate_public_apps()
35
            self.run_migrations(self.domain, settings.SHARED_APPS)
24 36
        if self.sync_tenant:
25
            self.migrate_tenant_apps(self.domain)
26

  
27
    def _set_managed_apps(self, included_apps, excluded_apps):
28
        """ while sync_schemas works by setting which apps are managed, on south we set which apps should be ignored """
29
        ignored_apps = []
30
        if excluded_apps:
31
            for item in excluded_apps:
32
                if item not in included_apps:
33
                    ignored_apps.append(item)
34

  
35
        for app in ignored_apps:
36
            app_label = app.split('.')[-1]
37
            settings.SOUTH_MIGRATION_MODULES[app_label] = 'ignore'
38

  
39
    def _save_south_settings(self):
40
        self._old_south_modules = None
41
        if hasattr(settings, "SOUTH_MIGRATION_MODULES") and settings.SOUTH_MIGRATION_MODULES is not None:
42
            self._old_south_modules = settings.SOUTH_MIGRATION_MODULES.copy()
43
        else:
44
            settings.SOUTH_MIGRATION_MODULES = dict()
45

  
46
    def _restore_south_settings(self):
47
        settings.SOUTH_MIGRATION_MODULES = self._old_south_modules
48

  
49
    def _clear_south_cache(self):
50
        for mig in list(migration.all_migrations()):
51
            delattr(mig._application, "migrations")
52
        Migrations._clear_cache()
53

  
54
    def _migrate_schema(self, tenant):
55
        connection.set_tenant(tenant, include_public=False)
56
        MigrateCommand().execute(*self.args, **self.options)
57

  
58
    def migrate_tenant_apps(self, schema_name=None):
59
        self._save_south_settings()
60

  
61
        apps = self.tenant_apps or self.installed_apps
62
        self._set_managed_apps(included_apps=apps, excluded_apps=self.shared_apps)
63

  
64
        if schema_name:
65
            self._notice("=== Running migrate for schema: %s" % schema_name)
66
            connection.set_schema_to_public()
67
            tenant = TenantMiddleware.get_tenant_by_hostname(schema_name)
68
            self._migrate_schema(tenant)
69
        else:
70
            all_tenants = TenantMiddleware.get_tenants()
71
            if not all_tenants:
72
                self._notice("No tenants found")
73

  
74
            for tenant in all_tenants:
75
                Migrations._dependencies_done = False  # very important, the dependencies need to be purged from cache
76
                self._notice("=== Running migrate for schema %s" % tenant.schema_name)
77
                self._migrate_schema(tenant)
78

  
79
        self._restore_south_settings()
80

  
81
    def migrate_public_apps(self):
82
        self._save_south_settings()
83

  
84
        apps = self.shared_apps or self.installed_apps
85
        self._set_managed_apps(included_apps=apps, excluded_apps=self.tenant_apps)
86

  
87
        self._notice("=== Running migrate for schema public")
88
        MigrateCommand().execute(*self.args, **self.options)
89

  
90
        self._clear_south_cache()
91
        self._restore_south_settings()
37
            if self.domain and self.domain != self.PUBLIC_SCHEMA_NAME:
38
                try:
39
                    tenant = TenantMiddleware.get_tenant_by_hostname(self.domain)
40
                except TenantNotFound:
41
                    raise RuntimeError('Schema "{}" does not exist'.format(
42
                        self.domain))
43
                else:
44
                    self.run_migrations(tenant.schema_name, settings.TENANT_APPS)
45
            else:
46
                all_tenants = TenantMiddleware.get_tenants()
47
                for tenant in all_tenants:
48
                    self.run_migrations(tenant.schema_name, settings.TENANT_APPS)
49

  
50
    def run_migrations(self, schema_name, included_apps):
51
        self._notice("=== Running migrate for schema %s" % schema_name)
52
        connection.set_schema(schema_name)
53
        command = MigrateCommand()
54

  
55
        defaults = {}
56
        for opt in MigrateCommand.option_list:
57
            if opt.dest in self.options:
58
                defaults[opt.dest] = self.options[opt.dest]
59
            elif opt.default is NO_DEFAULT:
60
                defaults[opt.dest] = None
61
            else:
62
                defaults[opt.dest] = opt.default
63

  
64
        command.execute(*self.args, **defaults)
65
        connection.set_schema_to_public()
66

  
67
    def _notice(self, output):
68
        self.stdout.write(self.style.NOTICE(output))
69

  
70

  
71
if django.VERSION >= (1, 7, 0):
72
    Command = MigrateSchemasCommand
73
else:
74
    from .legacy.migrate_schemas import Command
entrouvert/djommon/multitenant/management/commands/safemigrate_schemas.py
3 3
#   Email: carneiro.be@gmail.com
4 4
#   License: MIT license
5 5
#   Home-page: http://github.com/bcarneiro/django-tenant-schemas
6
from django.conf import settings
7
from django.db import connection
8
from south import migration
9
from south.migration.base import Migrations
10
from entrouvert.djommon.multitenant.middleware import TenantMiddleware
6
import django
7

  
8
if django.VERSION < (1, 7, 0):
9
    from django.conf import settings
10
    from django.db import connection
11
    from south import migration
12
    from south.migration.base import Migrations
13
    from entrouvert.djommon.multitenant.middleware import TenantMiddleware
14
    from entrouvert.djommon.management.commands.safemigrate import Command as SafeMigrateCommand
15
    from entrouvert.djommon.multitenant.management.commands.sync_schemas import Command as MTSyncCommand
16
    from entrouvert.djommon.multitenant.management.commands.migrate_schemas import Command as MTMigrateCommand
11 17
from entrouvert.djommon.multitenant.management.commands import SyncCommon
12
from entrouvert.djommon.management.commands.safemigrate import Command as SafeMigrateCommand
13
from entrouvert.djommon.multitenant.management.commands.sync_schemas import Command as MTSyncCommand
14
from entrouvert.djommon.multitenant.management.commands.migrate_schemas import Command as MTMigrateCommand
15 18

  
16 19

  
17
class Command(SyncCommon):
20
class SafeMigrateCommand(SyncCommon):
18 21
    help = "Safely migrate schemas with South"
19 22
    option_list = MTMigrateCommand.option_list
20 23

  
......
95 98

  
96 99
        self._clear_south_cache()
97 100
        self._restore_south_settings()
101

  
102
if django.VERSION < (1, 7, 0):
103
    Command = SafeMigrateCommand
104
else:
105
    raise RuntimeError('Django 1.7: please use migrate_schemas')
entrouvert/djommon/multitenant/management/commands/sync_schemas.py
3 3
#   Email: carneiro.be@gmail.com
4 4
#   License: MIT license
5 5
#   Home-page: http://github.com/bcarneiro/django-tenant-schemas
6
from django.conf import settings
7
from django.contrib.contenttypes.models import ContentType
8
from django.db.models import get_apps, get_models
9
if "south" in settings.INSTALLED_APPS:
10
    from south.management.commands.syncdb import Command as SyncdbCommand
11
else:
12
    from django.core.management.commands.syncdb import Command as SyncdbCommand
13
from django.db import connection
14
from entrouvert.djommon.multitenant.middleware import TenantMiddleware
6
import django
7

  
8
if django.VERSION < (1, 7, 0):
9
    from django.conf import settings
10
    from django.contrib.contenttypes.models import ContentType
11
    from django.db.models import get_apps, get_models
12
    if "south" in settings.INSTALLED_APPS:
13
        from south.management.commands.syncdb import Command as SyncdbCommand
14
    else:
15
        from django.core.management.commands.syncdb import Command as SyncdbCommand
16
    from django.db import connection
17
    from entrouvert.djommon.multitenant.middleware import TenantMiddleware
15 18
from entrouvert.djommon.multitenant.management.commands import SyncCommon
16 19

  
17 20

  
18
class Command(SyncCommon):
21
class SyncSchemasCommand(SyncCommon):
19 22
    help = "Sync schemas based on TENANT_APPS and SHARED_APPS settings"
20 23
    option_list = SyncdbCommand.option_list + SyncCommon.option_list
21 24

  
......
78 81
        apps = self.shared_apps or self.installed_apps
79 82
        self._set_managed_apps(apps)
80 83
        SyncdbCommand().execute(**self.options)
84

  
85
if django.VERSION < (1, 7, 0):
86
    Command = SyncSchemasCommand
87
else:
88
    raise RuntimeError('Django 1.7: use migrate_schemas')
89

  

Formats disponibles : Unified diff