Custom commands auflisten

Django, Flask, Bottle, WSGI, CGI…
Antworten
bangoperator
User
Beiträge: 3
Registriert: Montag 10. November 2014, 09:44

Hallo zusammen,

ich stehe nach einer Migration meiner Django-Anwendung auf Version 1.7.1 irgendwie auf dem Schlauch.
In einer App "config" meines Projekts habe ich mir in der Vergangenheit meine Django Custom Commands aus der App "main" immer mittels folgendem Code rausgesucht:

Code: Alles auswählen

def GetCustomCommands():
    from django.core.management import find_management_module, find_commands, load_command_class
    commands = [(0, '-- bitte waehlen --')]
    index = 1
    app_name = "main"
    command_names = find_commands(find_management_module(app_name))
    for command_name in command_names:
        help_text = load_command_class(app_name, command_name).help
        print "%s\n\t%s (%s)\n" % (command_name, help_text, app_name)
        index = index + 1
        commands.append((index, command_name))

return commands
Nun scheint find_management_module nicht mehr in django.core.management enthalten zu sein. Gibt es eine Alternative zu dieser Methode bzw. eine elegante Möglichkeit, wie ich weiterhin an meine Commands dieser einen App "main" komme? Ich habe in meiner App die benötigte Struktur "meinprojekt/main/management/commands/" eingerichtet und auch die __init__.py in den Ordnern platziert. Ein Aufruf von manage.py zeigt mir, dass die Commands zur Verfügung stehen. Ich kann sie auch problemlos über "python manage.py mycommand" ausführen. Nur leider das Auffinden und Auflisten aus dem Code heraus ist aktuell noch ein Problem.

Verwendete Python-Version: 2.7
Django-Version: 1.7.1
Läuft alles in der virtualenv.

Ich hoffe, ich habe keine wichtige Information ausgelassen. Danke vorab!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@bangoperator: das was Du willst, scheinst Du jetzt mit get_commands machen zu müssen. Ungetestet:

Code: Alles auswählen

def GetCustomCommands():
    from django.core.management import get_commands, load_command_class
    commands = ['-- bitte waehlen --']
    for command_name, app_name in get_commands():
        if app_name == 'main':
            help_text = load_command_class(app_name, command_name).help
            print "%s\n\t%s (%s)\n" % (command_name, help_text, app_name)
            commands.append(command_name)
    return enumerate(commands)
Der zusätzliche Index für jeden Listeneintrag scheint mir etwas überflüssig, den habe ich jetzt trotzdem mit enumerate erzeugt.
bangoperator
User
Beiträge: 3
Registriert: Montag 10. November 2014, 09:44

Sirius3 hat geschrieben:@bangoperator: das was Du willst, scheinst Du jetzt mit get_commands machen zu müssen. Ungetestet:

Code: Alles auswählen

def GetCustomCommands():
    from django.core.management import get_commands, load_command_class
    commands = ['-- bitte waehlen --']
    for command_name, app_name in get_commands():
        if app_name == 'main':
            help_text = load_command_class(app_name, command_name).help
            print "%s\n\t%s (%s)\n" % (command_name, help_text, app_name)
            commands.append(command_name)
    return enumerate(commands)
Der zusätzliche Index für jeden Listeneintrag scheint mir etwas überflüssig, den habe ich jetzt trotzdem mit enumerate erzeugt.
@Sirius3: Mit get_commands() habe ich es auch bereits versucht. Hatte übersehen, dass er auch den app_name mitliefert. Scheint also wohl doch der richtige Ansatz zu sein. Aktuell liefert er mir noch einen ValueError bei der Iteration. Er scheint beim Entpacken von key und value bei der Anzahl der Ergebnisse etwas zu stottern!?

Code: Alles auswählen

for command_name, app_name in get_commands():

Exception Type: 	ValueError
Exception Value: 	too many values to unpack
EDIT:

Code: Alles auswählen

for command_name, app_name in get_commands().iteritems():
So geht's. Danke für deine Hilfe!!!
BlackJack

@bangoperator: Die Funktion liefert ein Wörterbuch als Ergebnis. Das, und was da drin steht, kann man in der Dokumentation dieser Funktion nachlesen.
bangoperator
User
Beiträge: 3
Registriert: Montag 10. November 2014, 09:44

BlackJack hat geschrieben:@bangoperator: Die Funktion liefert ein Wörterbuch als Ergebnis. Das, und was da drin steht, kann man in der Dokumentation dieser Funktion nachlesen.
@BlackJack: Ja, das ist mir bewusst. Ich war mir nur nicht sicher, ob get_commands() der richtige Ansatz ist oder ob es noch "bessere" Alternativen gibt. Irgendwas haben die sich ja beim Entfernen von find_management_module() gedacht. Hatte nach einem neuen Ersatz gesucht. Die Methode schien wohl schlichtweg überflüssig gewesen zu sein.
Antworten