Projet

Général

Profil

Bug #6388 » migrate_schemas2.py

Thomas Noël, 30 janvier 2015 16:23

 
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
from django.db import connection
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
from entrouvert.djommon.multitenant.management.commands import SyncCommon
13

    
14

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

    
27
    def handle(self, *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.schema_name:
32
            self.schema_name = self.PUBLIC_SCHEMA_NAME
33

    
34
        if self.sync_public:
35
            self.run_migrations(self.schema_name, settings.SHARED_APPS)
36
        if self.sync_tenant:
37
            if self.schema_name and self.schema_name != self.PUBLIC_SCHEMA_NAME:
38
                try:
39
                    tenant = TenantMiddleware.get_tenant_by_hostname(self.schema_name)
40
                except TenantNotFound:
41
                    raise RuntimeError('Schema "{}" does not exist'.format(
42
                        self.schema_name))
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
    raise RuntimeError('Django 1.7 required')