mirror of
https://github.com/GSA/notifications-api.git
synced 2026-09-02 17:48:36 -04:00
49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
|
|
import datetime
|
||
|
|
|
||
|
|
from functools import wraps
|
||
|
|
|
||
|
|
|
||
|
|
def create_history(obj):
|
||
|
|
history_mapper = obj.__history_mapper__
|
||
|
|
history_model = history_mapper.class_
|
||
|
|
history = history_model()
|
||
|
|
if obj.version:
|
||
|
|
obj.version += 1
|
||
|
|
else:
|
||
|
|
obj.version = 1
|
||
|
|
obj.created_at = datetime.datetime.now()
|
||
|
|
for prop in history_mapper.iterate_properties:
|
||
|
|
if obj.__mapper__.get_property(prop.key):
|
||
|
|
setattr(history, prop.key, getattr(obj, prop.key))
|
||
|
|
history.created_by_id = obj.created_by.id
|
||
|
|
return history
|
||
|
|
|
||
|
|
|
||
|
|
def transactional(func):
|
||
|
|
@wraps(func)
|
||
|
|
def commit_or_rollback(*args, **kwargs):
|
||
|
|
from flask import current_app
|
||
|
|
from app import db
|
||
|
|
try:
|
||
|
|
func(*args, **kwargs)
|
||
|
|
db.session.commit()
|
||
|
|
except Exception as e:
|
||
|
|
current_app.logger.error(e)
|
||
|
|
db.session.rollback()
|
||
|
|
raise
|
||
|
|
return commit_or_rollback
|
||
|
|
|
||
|
|
|
||
|
|
def versioned(func):
|
||
|
|
@wraps(func)
|
||
|
|
def record_version(*args, **kwargs):
|
||
|
|
import itertools
|
||
|
|
from app import db
|
||
|
|
from app.history_meta import versioned_objects
|
||
|
|
from app.dao.dao_utils import create_history
|
||
|
|
func(*args, **kwargs)
|
||
|
|
for obj in versioned_objects(itertools.chain(db.session.new, db.session.dirty)):
|
||
|
|
history = create_history(obj)
|
||
|
|
db.session.add(history)
|
||
|
|
return record_version
|