Projet

Général

Profil

Télécharger (3,39 ko) Statistiques
| Branche: | Tag: | Révision:

root / entrouvert / djommon / multitenant / management / commands / sync_schemas.py @ 1f642209

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
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
18
from entrouvert.djommon.multitenant.management.commands import SyncCommon
19

    
20

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

    
25
    def handle(self, *args, **options):
26
        super(Command, self).handle(*args, **options)
27

    
28
        if "south" in settings.INSTALLED_APPS:
29
            self.options["migrate"] = False
30

    
31
        # save original settings
32
        for model in get_models(include_auto_created=True):
33
            setattr(model._meta, 'was_managed', model._meta.managed)
34

    
35
        ContentType.objects.clear_cache()
36

    
37
        if self.sync_public:
38
            self.sync_public_apps()
39
        if self.sync_tenant:
40
            self.sync_tenant_apps(self.domain)
41

    
42
        # restore settings
43
        for model in get_models(include_auto_created=True):
44
            model._meta.managed = model._meta.was_managed
45

    
46
    def _set_managed_apps(self, included_apps):
47
        """ sets which apps are managed by syncdb """
48
        for model in get_models(include_auto_created=True):
49
            model._meta.managed = False
50

    
51
        verbosity = int(self.options.get('verbosity'))
52
        for app_model in get_apps():
53
            app_name = app_model.__name__.replace('.models', '')
54
            if app_name in included_apps:
55
                for model in get_models(app_model, include_auto_created=True):
56
                    model._meta.managed = model._meta.was_managed
57
                    if model._meta.managed and verbosity >= 3:
58
                        self._notice("=== Include Model: %s: %s" % (app_name, model.__name__))
59

    
60
    def _sync_tenant(self, tenant):
61
        self._notice("=== Running syncdb for schema: %s" % tenant.schema_name)
62
        connection.set_tenant(tenant, include_public=False)
63
        SyncdbCommand().execute(**self.options)
64

    
65
    def sync_tenant_apps(self, schema_name=None):
66
        apps = self.tenant_apps or self.installed_apps
67
        self._set_managed_apps(apps)
68
        if schema_name:
69
            tenant = TenantMiddleware.get_tenant_by_hostname(schema_name)
70
            self._sync_tenant(tenant)
71
        else:
72
            all_tenants = TenantMiddleware.get_tenants()
73
            if not all_tenants:
74
                self._notice("No tenants found!")
75

    
76
            for tenant in all_tenants:
77
                self._sync_tenant(tenant)
78

    
79
    def sync_public_apps(self):
80
        self._notice("=== Running syncdb for schema public")
81
        apps = self.shared_apps or self.installed_apps
82
        self._set_managed_apps(apps)
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

    
(11-11/13)