django: woher kommt ein signal?
Verfasst: 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:
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.
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()
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.