From f0feaf9cba04097812bf0a3114c402929760cc09 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Jaillet Date: Mon, 20 Mar 2017 16:12:06 +0100 Subject: [PATCH] multitenant: add delete_tenant command --- .../management/commands/delete_tenant.py | 29 ++++++++++++++++++++++ hobo/multitenant/models.py | 10 +++++++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 hobo/multitenant/management/commands/delete_tenant.py diff --git a/hobo/multitenant/management/commands/delete_tenant.py b/hobo/multitenant/management/commands/delete_tenant.py new file mode 100644 index 0000000..4d3096d --- /dev/null +++ b/hobo/multitenant/management/commands/delete_tenant.py @@ -0,0 +1,29 @@ +import sys +from optparse import make_option + +from django.core.management.base import CommandError, BaseCommand +from hobo.multitenant.middleware import TenantMiddleware + + +class Command(BaseCommand): + help = "Delete tenant(s) by hostname(s)" + args = ['...'] + option_list = BaseCommand.option_list + ( + make_option('--force-drop', action='store_true', default=False, + help='If you want the schema to be deleted from database'), + ) + + def handle(self, *args, **options): + + if not args: + raise CommandError("you must give at least one tenant hostname") + + # if - is given on the command line, get list of hostnames from stdin + if '-' in args: + args = list(args) + args.remove('-') + args.extend([x.strip() for x in sys.stdin.readlines()]) + for hostname in args: + tenant = TenantMiddleware.get_tenant_by_hostname(hostname) + tenant.delete(force_drop=options['force_drop']) + diff --git a/hobo/multitenant/models.py b/hobo/multitenant/models.py index 2fa97c8..813c6a6 100644 --- a/hobo/multitenant/models.py +++ b/hobo/multitenant/models.py @@ -1,9 +1,11 @@ import os from urlparse import urljoin import json +from shutil import rmtree from django.conf import settings from django.db import connection +from django.utils import timezone from tenant_schemas.utils import get_public_schema_name from tenant_schemas.models import TenantMixin @@ -65,8 +67,14 @@ class Tenant(TenantMixin): "the public schema. Current schema is %s." % connection.schema_name) - os.rename(self.get_directory(), self.get_directory() + '.invalid') + delete_date = timezone.now().strftime('%Y_%m_%d_%H_%M') if schema_exists(self.schema_name) and (self.auto_drop_schema or force_drop): + rmtree(self.get_directory()) cursor = connection.cursor() cursor.execute('DROP SCHEMA %s CASCADE' % self.schema_name) + + if schema_exists(self.schema_name) and (not self.auto_drop_schema and not force_drop): + os.rename(self.get_directory(), self.get_directory() + 'removed_%s_%s.invalid' % (self.schema_name, delete_date)) + cursor = connection.cursor() + cursor.execute('ALTER SCHEMA %s RENAME removed_%s_%s' % (self.schema_name,delete_date, self.schema_name)) -- 2.11.0