Projet

Général

Profil

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

root / entrouvert / djommon / multitenant / management / commands / sync_schemas.py @ ccec1ff4

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

    
17

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

    
22
    def handle(self, *args, **options):
23
        super(Command, self).handle(*args, **options)
24

    
25
        if "south" in settings.INSTALLED_APPS:
26
            self.options["migrate"] = False
27

    
28
        # save original settings
29
        for model in get_models(include_auto_created=True):
30
            setattr(model._meta, 'was_managed', model._meta.managed)
31

    
32
        ContentType.objects.clear_cache()
33

    
34
        if self.sync_public:
35
            self.sync_public_apps()
36
        if self.sync_tenant:
37
            self.sync_tenant_apps(self.schema_name)
38

    
39
        # restore settings
40
        for model in get_models(include_auto_created=True):
41
            model._meta.managed = model._meta.was_managed
42

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

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

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

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

    
73
            for tenant in all_tenants:
74
                self._sync_tenant(tenant)
75

    
76
    def sync_public_apps(self):
77
        apps = self.shared_apps or self.installed_apps
78
        self._set_managed_apps(apps)
79
        SyncdbCommand().execute(**self.options)
80
        self._notice("=== Running syncdb for schema public")
(5-5/7)