diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py index 959c99287..9d8de9b7f 100644 --- a/eos/db/saveddata/fit.py +++ b/eos/db/saveddata/fit.py @@ -17,9 +17,12 @@ # along with eos. If not, see . # =============================================================================== +import datetime +from sqlalchemy import inspect from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.orm.collections import attribute_mapped_collection from sqlalchemy.sql import and_ +from sqlalchemy.event import listen from sqlalchemy.orm import relation, reconstructor, mapper, relationship from sqlalchemy import ForeignKey, Column, Integer, String, Table, Boolean, DateTime import sqlalchemy.sql.functions as func @@ -244,3 +247,24 @@ mapper(ProjectedFit, projectedFits_table, ) mapper(CommandFit, commandFits_table) + + +def rel_listener(target, value, initiator): + if not target or (isinstance(value, Module) and value.isEmpty): + return + + print "{} has has has a relationship changes :(".format(target) + target.modified = datetime.datetime.now() + + +def load_listener(target, context): + # We only want to se these events when the fit is first loaded (otherwise events will fire during the initial + # population of data). This sets listeners for all the relationships on fits. This allows us to update the fit's + # modified date whenever something is added/removed from fit + # See http://docs.sqlalchemy.org/en/rel_1_0/orm/events.html#sqlalchemy.orm.events.InstanceEvents.load + for rel in inspect(es_Fit).relationships: + listen(rel, 'append', rel_listener) + listen(rel, 'remove', rel_listener) + +listen(Module, 'load', load_listener) + diff --git a/eos/db/saveddata/module.py b/eos/db/saveddata/module.py index 7f869c0a6..6e4da73b4 100644 --- a/eos/db/saveddata/module.py +++ b/eos/db/saveddata/module.py @@ -17,10 +17,14 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey, CheckConstraint, Boolean, DateTime +from sqlalchemy import inspect +from sqlalchemy import Table, Column, Integer, ForeignKey, CheckConstraint, Boolean, DateTime, select from sqlalchemy.orm import relation, mapper +from sqlalchemy.event import listen import sqlalchemy.sql.functions as func +import datetime + from eos.db import saveddata_meta from eos.saveddata.module import Module from eos.saveddata.fit import Fit @@ -40,3 +44,27 @@ modules_table = Table("modules", saveddata_meta, mapper(Module, modules_table, properties={"owner": relation(Fit)}) + + +def update_fit_modified(target, value, oldvalue, initiator): + if not target.owner: + return + + if value != oldvalue: + print "{} had a module change".format(target.owner) + target.owner.modified = datetime.datetime.now() + + +def my_load_listener(target, context): + # We only want to se these events when the module is first loaded (otherwise events will fire during the initial + # population of data). This runs through all columns and sets up "set" events on each column. We do it with each + # column because the alternative would be to do a before/after_update for the Mapper itself, however we're only + # allowed to change the local attributes during those events as that's inter-flush. + # See http://docs.sqlalchemy.org/en/rel_1_0/orm/session_events.html#mapper-level-events + for col in inspect(Module).column_attrs: + listen(col, 'set', update_fit_modified) + + +listen(Module, 'load', my_load_listener) + +