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
|
from django.core.management.base import CommandError
|
8
|
|
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 Command(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
|
if django.VERSION >= (1, 7, 0):
|
27
|
raise CommandError('This command is only meant to be used for 1.6'
|
28
|
' and older version of django. For 1.7, use'
|
29
|
' `migrate_schemas` instead.')
|
30
|
super(Command, self).handle(*args, **options)
|
31
|
|
32
|
if "south" in settings.INSTALLED_APPS:
|
33
|
self.options["migrate"] = False
|
34
|
|
35
|
# save original settings
|
36
|
for model in get_models(include_auto_created=True):
|
37
|
setattr(model._meta, 'was_managed', model._meta.managed)
|
38
|
|
39
|
ContentType.objects.clear_cache()
|
40
|
|
41
|
if self.sync_public:
|
42
|
self.sync_public_apps()
|
43
|
if self.sync_tenant:
|
44
|
self.sync_tenant_apps(self.domain)
|
45
|
|
46
|
# restore settings
|
47
|
for model in get_models(include_auto_created=True):
|
48
|
model._meta.managed = model._meta.was_managed
|
49
|
|
50
|
def _set_managed_apps(self, included_apps):
|
51
|
""" sets which apps are managed by syncdb """
|
52
|
for model in get_models(include_auto_created=True):
|
53
|
model._meta.managed = False
|
54
|
|
55
|
verbosity = int(self.options.get('verbosity'))
|
56
|
for app_model in get_apps():
|
57
|
app_name = app_model.__name__.replace('.models', '')
|
58
|
if app_name in included_apps:
|
59
|
for model in get_models(app_model, include_auto_created=True):
|
60
|
model._meta.managed = model._meta.was_managed
|
61
|
if model._meta.managed and verbosity >= 3:
|
62
|
self._notice("=== Include Model: %s: %s" % (app_name, model.__name__))
|
63
|
|
64
|
def _sync_tenant(self, tenant):
|
65
|
self._notice("=== Running syncdb for schema: %s" % tenant.schema_name)
|
66
|
connection.set_tenant(tenant, include_public=False)
|
67
|
SyncdbCommand().execute(**self.options)
|
68
|
|
69
|
def sync_tenant_apps(self, schema_name=None):
|
70
|
apps = self.tenant_apps or self.installed_apps
|
71
|
self._set_managed_apps(apps)
|
72
|
if schema_name:
|
73
|
tenant = TenantMiddleware.get_tenant_by_hostname(schema_name)
|
74
|
self._sync_tenant(tenant)
|
75
|
else:
|
76
|
all_tenants = TenantMiddleware.get_tenants()
|
77
|
if not all_tenants:
|
78
|
self._notice("No tenants found!")
|
79
|
|
80
|
for tenant in all_tenants:
|
81
|
self._sync_tenant(tenant)
|
82
|
|
83
|
def sync_public_apps(self):
|
84
|
self._notice("=== Running syncdb for schema public")
|
85
|
apps = self.shared_apps or self.installed_apps
|
86
|
self._set_managed_apps(apps)
|
87
|
SyncdbCommand().execute(**self.options)
|