Always ignore certain data classes when recording instance changes.

This commit is contained in:
Lance Edgar 2015-12-17 11:07:01 -06:00
parent eb317d9b3f
commit 7eb44e333c

View file

@ -24,7 +24,7 @@
Data Changes Interface
"""
from __future__ import unicode_literals
from __future__ import unicode_literals, absolute_import
import logging
@ -32,6 +32,7 @@ from sqlalchemy.orm import object_mapper, RelationshipProperty
from sqlalchemy.orm.interfaces import SessionExtension
from sqlalchemy.orm.session import Session
from rattail.db import model
from rattail.core import get_uuid
try:
@ -81,6 +82,7 @@ class ChangeRecorder(object):
def __init__(self, ignore_role_changes=True):
self.ignore_role_changes = ignore_role_changes
self.ignored_classes = (model.Setting, model.Change, model.DataSyncChange)
def __call__(self, session, flush_context, instances):
"""
@ -93,13 +95,15 @@ class ChangeRecorder(object):
versioning_manager.before_flush(session, flush_context, instances)
for instance in session.deleted:
log.debug("found deleted instance: {0}".format(repr(instance)))
if not isinstance(instance, self.ignored_classes):
log.debug("found deleted instance: {}".format(repr(instance)))
self.record_change(session, instance, deleted=True)
for instance in session.new:
log.debug("found new instance: {0}".format(repr(instance)))
if not isinstance(instance, self.ignored_classes):
log.debug("found new instance: {}".format(repr(instance)))
self.record_change(session, instance)
for instance in session.dirty:
if session.is_modified(instance, passive=True):
if not isinstance(instance, self.ignored_classes) and session.is_modified(instance, passive=True):
# Orphaned objects which really are pending deletion show up in
# session.dirty instead of session.deleted, hence this check.
# See also https://groups.google.com/d/msg/sqlalchemy/H4nQTHphc0M/Xr8-Cgra0Z4J
@ -150,8 +154,6 @@ class ChangeRecorder(object):
:returns: ``True`` if a change was recorded, or ``False`` if it was
ignored.
"""
from rattail.db import model
# No need to record changes for changes.
if isinstance(instance, (model.Change, model.DataSyncChange)):
return False
@ -177,7 +179,7 @@ class ChangeRecorder(object):
instance_uuid=instance.uuid,
deleted=deleted)
session.add(change)
log.debug("recorded change: {0}".format(repr(change)))
log.debug("recorded {}".format(repr(change)))
return True
def ensure_uuid(self, instance):