#27247: Official way to create custom admin commands with subcommands in py2 / 
py3
--------------------------------------------+--------------------
     Reporter:  stephanm                    |      Owner:  nobody
         Type:  Bug                         |     Status:  new
    Component:  Core (Management commands)  |    Version:  1.10
     Severity:  Normal                      |   Keywords:
 Triage Stage:  Unreviewed                  |  Has patch:  0
Easy pickings:  0                           |      UI/UX:  0
--------------------------------------------+--------------------
 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)

--
Ticket URL: <https://code.djangoproject.com/ticket/27247>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.b85123e854c510defc2f4ee4327941b4%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to