Seite 1 von 1

django: woher kommt ein signal?

Verfasst: Donnerstag 7. August 2008, 18:09
von jens
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.

Verfasst: Freitag 8. August 2008, 07:45
von jens
Mache daraus ein eigenständiges Projekt: http://code.google.com/p/django-modelvcs/

Verfasst: Freitag 8. August 2008, 07:58
von audax
Die ZODB hat das schon eingebaut :o