﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
27247	Official way to create custom admin commands with subcommands in py2 / py3	stephanm	nobody	"Hi,

I found a example on the internet showing how to create  custom admin commands with subcommands.

My app is named ""repo"", I use django 1.10.1 on Windows and I am just trying
to migrate from python 2.7.12 (32bit) to python 3.5.2 (64bit) on windows 7 64bit.

I did also a big switch from optparse to argparse since optparse is gone in django 1.10.

The file repo_sample.py looks like:
{{{#!py
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from django.core.management.base import BaseCommand
import argparse


class Command(BaseCommand):
    
    help = ""this is a sample""
        
    def handle(self, *args, **options):
        if ""command"" in options:
            print(""command: %s"" % options[""command""])
        else:
            print(""no command"")
        
    def add_arguments(self, parser):
        parser.formatter_class = argparse.RawDescriptionHelpFormatter
        subparsers = parser.add_subparsers(metavar='command',
                                           dest='command',
                                           help='sub-command help')
        parent_parser = argparse.ArgumentParser(add_help=False)
       
        subparsers.add_parser(""command_1"", parents=[parent_parser], cmd=self, 
                              help=""This is command_1 no subcommands"")
        parser_service = subparsers.add_parser(""service"", parents=[parent_parser], cmd=self, 
                                               help=""Manage a windows service"")
        parser_service.add_argument(""serviceCmd"", choices=[""install"", ""delete"", ""start"", ""stop"", ""status""],
                                     help=""Create or deletes a windows service.."")
        
}}}

Now there is a difference if I run it with python 2 or python 3:
{{{
D:\util>manage.py repo_sample
2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:19:22) [MSC v.1500 32 bit (Intel)]
usage: manage.py repo_sample [-h] [--version] [-v {0,1,2,3}]
                             [--settings SETTINGS] [--pythonpath PYTHONPATH]
                             [--traceback] [--no-color]
                             command ...
manage.py repo_sample: error: too few arguments

D:\util>py -3 manage.py repo_sample
3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]
command: None

D:\util>
}}}

As you see, the first call with python 2 gives an error while the python 3 call behaves differently,
but I think it should at least behave the same way (so I marked it as bug).

Now I am not sure if argparse behaves differently between python 2.7 and python 3.5 and if I made an error.

But here is my question(s):

 - What is the official (""correct"") way to create  custom admin commands with subcommands?
 - Do you have some examples in the docs? (I didnt find something)

"	Bug	closed	Core (Management commands)	1.10	Normal	invalid			Unreviewed	0	0	0	0	0	0
