Skip to content

Commit

Permalink
Used argparse on Django >= 1.8
Browse files Browse the repository at this point in the history
  • Loading branch information
charettes committed Jan 4, 2016
1 parent 0f50389 commit 48db29f
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 19 deletions.
20 changes: 16 additions & 4 deletions tenancy/management/commands/createtenant.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import logging

import django
from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
from django.core.management import call_command
Expand Down Expand Up @@ -33,13 +34,24 @@ def emit(self, record):


class Command(BaseCommand):
args = '<field1 field2 ...>'
# XXX: Remove when dropping support for Django 1.7
if django.VERSION < (1, 8):
args = '<field1 field2 ...>'

def add_arguments(self, parser):
super(Command, self).add_arguments(parser)
parser.add_argument('fields', nargs='*')

def handle(self, *args, **options):
try:
fields = options['fields']
except KeyError:
# XXX: Remove when dropping support for Django 1.7
fields = args
tenant_model = get_tenant_model()
# Attempt to build the instance based on specified data
try:
tenant = tenant_model(None, *args)
tenant = tenant_model(None, *fields)
except IndexError:
opts = tenant_model._meta
field_names = tuple(
Expand All @@ -50,7 +62,7 @@ def handle(self, *args, **options):
"Got %s when defined fields are %s." % (
opts.app_label,
opts.object_name,
args,
fields,
field_names
)
)
Expand Down Expand Up @@ -88,4 +100,4 @@ def handle(self, *args, **options):
while confirm not in ('yes', 'no'):
confirm = input('Please enter either "yes" or "no": ')
if confirm == 'yes':
call_command('createtenantsuperuser', tenant=tenant, **options)
call_command('createtenantsuperuser', *tenant.natural_key(), **options)
39 changes: 28 additions & 11 deletions tenancy/management/commands/createtenantsuperuser.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from __future__ import unicode_literals

from optparse import make_option
import argparse

import django
from django.contrib.auth.management.commands.createsuperuser import Command
from django.core.management.base import CommandError

Expand All @@ -16,15 +17,19 @@ def get_tenant_by_natural_key(option, opt, value, parser):
parser.values.tenant = tenant


class TenantAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
tenant_model = get_tenant_model()
tenant = tenant_model._default_manager.get_by_natural_key(*values)
setattr(namespace, self.dest, tenant)


class Command(Command):
# XXX: Remove when dropping support for Django 1.7
if django.VERSION < (1, 8):
args = 'tenant natural key'
help = 'Used to create a specific tenant superuser.'
requires_system_checks = False
option_list = Command.option_list + (
make_option(
'--tenant', action='callback', dest='tenant', type='str',
callback=get_tenant_by_natural_key,
help='Specifies the tenant to use by comma separated natural key.'
),
)

def __init__(self, *args, **kwargs):
super(Command, self).__init__(*args, **kwargs)
Expand All @@ -33,7 +38,19 @@ def __init__(self, *args, **kwargs):
"The defined user model (%s) is not tenant specific." % self.UserModel._meta
)

def handle(self, *args, **kwargs):
tenant = kwargs.get('tenant')
def add_arguments(self, parser):
super(Command, self).add_arguments(parser)
parser.add_argument(
'tenant', nargs='+', action=TenantAction,
help='Specifies the tenant to use by natural key.'
)

def handle(self, *args, **options):
try:
tenant = options['tenant']
except KeyError:
# XXX: Remove when dropping support for Django 1.7
tenant_model = get_tenant_model()
tenant = tenant_model._default_manager.get_by_natural_key(*args)
self.UserModel = self.UserModel.for_tenant(tenant)
return super(Command, self).handle(*args, **kwargs)
return super(Command, self).handle(*args, **options)
6 changes: 2 additions & 4 deletions tests/test_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,11 @@

class CreateTenantCommandTest(TransactionTestCase):
def test_too_many_fields(self):
args = ('name', 'useless')
expected_message = (
"Number of args exceeds the number of fields for model tenancy.Tenant.\n"
"Got %s when defined fields are ('name',)." % repr(args)
"Number of args exceeds the number of fields for model tenancy.Tenant."
)
with self.assertRaisesMessage(CommandError, expected_message):
call_command('createtenant', *args)
call_command('createtenant', 'name', 'useless')

def test_full_clean_failure(self):
expected_message = (
Expand Down

0 comments on commit 48db29f

Please sign in to comment.