Skip to content
Snippets Groups Projects

Place editing

All threads resolved!
Merged Jiří Setnička requested to merge jirka/schools into master
All threads resolved!
1 file
+ 30
2
Compare changes
  • Side-by-side
  • Inline
+ 30
2
@@ -5,9 +5,10 @@ from enum import Enum as PythonEnum, auto
from sqlalchemy import \
Boolean, Column, DateTime, Enum, ForeignKey, Integer, String, Text, UniqueConstraint, \
text, \
create_engine
create_engine, inspect
from sqlalchemy.engine import Engine
from sqlalchemy.orm import relationship, sessionmaker, Session
from sqlalchemy.orm import relationship, sessionmaker, Session, class_mapper
from sqlalchemy.orm.attributes import get_history
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.ext.declarative import declarative_base
from typing import Optional, List
@@ -289,3 +290,30 @@ def get_place_parents(place: Place) -> List[Place]:
recq = topq.union(botq)
return sess.query(recq).all()
def get_object_changes(obj):
""" Given a model instance, returns dict of pending
changes waiting for database flush/commit.
e.g. {
'some_field': {
'before': *SOME-VALUE*,
'after': *SOME-VALUE*
},
...
}
Source: https://stackoverflow.com/questions/15952733/sqlalchemy-logging-of-changes-with-date-and-user
"""
inspection = inspect(obj)
changes = {}
for attr in class_mapper(obj.__class__).column_attrs:
if getattr(inspection.attrs, attr.key).history.has_changes():
if get_history(obj, attr.key)[2]:
before = get_history(obj, attr.key)[2].pop()
after = getattr(obj, attr.key)
if before != after:
if before or after:
changes[attr.key] = {'before': before, 'after': after}
return changes
Loading