"""Capture every manifest change, including translation/import writers.""" import copy from uuid import uuid4 from sqlalchemy import event, inspect from sqlalchemy.orm import Session from app.models import GameVersion, Revision @event.listens_for(Session, "before_flush") def capture_revisions(session, flush_context, instances): for obj in list(session.new) + list(session.dirty): if not isinstance(obj, GameVersion) or not obj.manifest or obj in session.deleted: continue if obj not in session.new and not inspect(obj).attrs.manifest.history.has_changes(): continue parents = list(getattr(obj, "_revision_parents", None) or ([obj.revision_id] if obj.revision_id else [])) rid = str(uuid4()) session.add(Revision(id=rid, game_id=obj.game_id, user_id=session.info.get("user_id", obj.owner_id), parents=parents, manifest=copy.deepcopy(obj.manifest))) obj.revision_id = rid obj._revision_parents = None