Projet

Général

Profil

0001-multitenant-add-delete_tenant-command-15513.patch

Jean-Baptiste Jaillet, 28 mars 2017 09:53

Télécharger (4,88 ko)

Voir les différences:

Subject: [PATCH] multitenant: add delete_tenant command (#15513)

 .../management/commands/delete_tenant.py           | 29 ++++++++++++++++++++++
 hobo/multitenant/models.py                         | 14 ++++++++++-
 tests_multitenant/conftest.py                      |  3 ++-
 tests_multitenant/test_tenant_command.py           |  9 +++++++
 4 files changed, 53 insertions(+), 2 deletions(-)
 create mode 100644 hobo/multitenant/management/commands/delete_tenant.py
hobo/multitenant/management/commands/delete_tenant.py
1
import sys
2
from optparse import make_option
3

  
4
from django.core.management.base import CommandError, BaseCommand
5
from hobo.multitenant.middleware import TenantMiddleware
6

  
7

  
8
class Command(BaseCommand):
9
    help = "Delete tenant(s) by hostname(s)"
10
    args = ['...']
11
    option_list = BaseCommand.option_list + (
12
		make_option('--force-drop', action='store_true', default=False,
13
                    help='If you want the schema to be deleted from database'),
14
    )
15

  
16
    def handle(self, *args, **options):
17

  
18
        if not args:
19
            raise CommandError("you must give at least one tenant hostname")
20

  
21
        # if - is given on the command line, get list of hostnames from stdin
22
        if '-' in args:
23
            args = list(args)
24
            args.remove('-')
25
            args.extend([x.strip() for x in sys.stdin.readlines()])
26
        for hostname in args:
27
            tenant = TenantMiddleware.get_tenant_by_hostname(hostname)
28
            tenant.delete(force_drop=options['force_drop'])
29

  
hobo/multitenant/models.py
1 1
import os
2 2
from urlparse import urljoin
3 3
import json
4
from shutil import rmtree
4 5

  
5 6
from django.conf import settings
6 7
from django.db import connection
8
from django.utils import timezone
7 9

  
8 10
from tenant_schemas.utils import get_public_schema_name
9 11
from tenant_schemas.models import TenantMixin
......
65 67
                            "the public schema. Current schema is %s."
66 68
                            % connection.schema_name)
67 69

  
68
        os.rename(self.get_directory(), self.get_directory() + '.invalid')
70
        if force_drop:
71
            rmtree(self.get_directory())
72
        else:
73
            deletion_date = timezone.now().strftime('%Y%m%d_%H%M%S_%f')
74
            os.rename(self.get_directory(), self.get_directory() + '.removed_%s.invalid' % deletion_date)
69 75

  
70 76
        if schema_exists(self.schema_name) and (self.auto_drop_schema or force_drop):
71 77
            cursor = connection.cursor()
72 78
            cursor.execute('DROP SCHEMA %s CASCADE' % self.schema_name)
79

  
80
        if schema_exists(self.schema_name) and (not self.auto_drop_schema and not force_drop):
81
            cursor = connection.cursor()
82
            schema_new_name = 'removed_%s_%s' % (self.schema_name, deletion_date, self.schema_name)
83
            cursor.execute('ALTER SCHEMA %s RENAME TO %s' % schema_new_name[:63])
84

  
tests_multitenant/conftest.py
54 54
    tenants = [make_tenant('tenant1.example.net'), make_tenant('tenant2.example.net')]
55 55
    def fin():
56 56
        from django.db import connection
57
        from hobo.multitenant.middleware import TenantMiddleware
57 58
        connection.set_schema_to_public()
58
        for t in tenants:
59
        for t in TenantMiddleware.get_tenants():
59 60
            t.delete(True)
60 61
        shutil.rmtree(base)
61 62
    request.addfinalizer(fin)
tests_multitenant/test_tenant_command.py
29 29
    assert handle.call_count == 1
30 30
    assert len(handle.side_effect.tenants) == 1
31 31
    assert handle.side_effect.tenants[0].domain_url == 'tenant2.example.net'
32

  
33
def test_delete_tenant(tenants):
34
    from django.core.management import execute_from_command_line
35
    from hobo.multitenant.middleware import TenantMiddleware
36
    all_tenants = list(TenantMiddleware.get_tenants())
37
    assert len(all_tenants) == 2
38
    execute_from_command_line(['manage.py', 'delete_tenant', 'tenant2.example.net'])
39
    all_tenants = list(TenantMiddleware.get_tenants())
40
    assert len(all_tenants) == 1
32
-