django: woher kommt ein signal?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 7. August 2008, 18:09

Ich baue gerade ein model logging, welches alle änderungen an einem model automatisch speichert: http://svn.pylucid.net/pyrm/trunk/pyrm/ ... logging.py

Das ganze arbeitet mit signals (post_save und pre_delete).

Nun hab ich die Idee, man könnte auch mitspeichern, wo im Code das Objekt geändert wurde. Also wo abschließend das save() ausgeführt wurde, im einem eigenen view oder im django admin panel...

Gibt es da eine einfache Möglichkeit?

"sender" sagt ja nur wie das Datebank Model heißt.

Versuche das ganze mit inspect.stack() zu machen war nicht sehr erfolgreich. In den Stack Daten ist zwar die richtige Codestelle drin, aber IMHO kann man nicht einfach feststellen welcher Eintrag im Stack der passende ist.
Hab versucht über den Dateinamen zu gehen und mir dazu das wirre Zeug zusammen gehackt:

Code: Alles auswählen

from django.db.models import get_apps, get_models
def get_entry_points():
    result = []
    known_packages = []
    for app in get_apps():
        for model in get_models(app):
            class_path = repr(model).split("'")[1] # FIXME
            package, obj_name = class_path.rsplit(".", 1)

            if package not in known_packages:
                known_packages.append(package)

                model_class = __import__(
                    package, globals={}, locals={}, fromlist=[obj_name]
                )
                raw_file_path = model_class.__file__
                file_path = os.path.splitext(raw_file_path)[0] + ".py"
                result.append(file_path)

    return result

STACK_ENTRY_POINTS = get_entry_points()
Aber das ist auch super umständlich und reicht nicht aus, weil z.B. Basis-Model-Klassen die in anderen Dateien stecken nicht mit drin sind.

Edit: Mir ist da gerade noch etwas eingefallen: Man könnte evtl. im stack objekt in den locals nachsehen, ob die Klassen instanz vorhanden ist.
Naja, so richtig schön ist das auch nicht und ob es funktioniert, weiß ich nicht.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 8. August 2008, 07:45

Mache daraus ein eigenständiges Projekt: http://code.google.com/p/django-modelvcs/

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Freitag 8. August 2008, 07:58

Die ZODB hat das schon eingebaut :o
Antworten