Add has_any_changes function

This commit is contained in:
Konsta Vesterinen
2014-06-25 14:50:44 +03:00
parent d03254daba
commit 3eac18eb8e
6 changed files with 70 additions and 0 deletions

View File

@@ -4,6 +4,12 @@ Changelog
Here you can see the full list of changes between each SQLAlchemy-Utils release.
0.26.3 (2014-06-25)
^^^^^^^^^^^^^^^^^^^
- Added has_any_changes
0.26.2 (2014-05-29)
^^^^^^^^^^^^^^^^^^^

View File

@@ -52,6 +52,12 @@ query_entities
.. autofunction:: query_entities
has_any_changes
^^^^^^^^^^^^^^^
.. autofunction:: has_any_changes
has_changes
^^^^^^^^^^^

View File

@@ -19,6 +19,8 @@ from .functions import (
get_referencing_foreign_keys,
get_tables,
group_foreign_keys,
has_any_changes,
has_changes,
has_index,
identity,
merge_references,
@@ -94,6 +96,8 @@ __all__ = (
get_referencing_foreign_keys,
get_tables,
group_foreign_keys,
has_any_changes,
has_changes,
has_index,
identity,
instrumented_list,

View File

@@ -26,6 +26,7 @@ from .orm import (
get_primary_keys,
get_tables,
getdotattr,
has_any_changes,
has_changes,
identity,
naturally_equivalent,
@@ -50,6 +51,7 @@ __all__ = (
'get_tables',
'getdotattr',
'group_foreign_keys',
'has_any_changes',
'has_changes',
'identity',
'is_auto_assigned_date_column',

View File

@@ -475,6 +475,7 @@ def has_changes(obj, attr):
:param obj: SQLAlchemy declarative model object
:param attr: Name of the attribute
.. seealso:: :func:`has_any_changes`
"""
return (
sa.inspect(obj)
@@ -485,6 +486,33 @@ def has_changes(obj, attr):
)
def has_any_changes(model, columns):
"""
Simple shortcut function for checking if any of the given attributes of
given declarative model object have changes.
::
from sqlalchemy_utils import has_any_changes
user = User()
has_any_changes(user, ('name', )) # False
user.name = u'someone'
has_any_changes(user, ('name', 'age')) # True
:param obj: SQLAlchemy declarative model object
:param attrs: Names of the attributes
"""
return any(has_changes(model, column) for column in columns)
def identity(obj_or_class):
"""
Return the identity of given sqlalchemy declarative model class or instance

View File

@@ -0,0 +1,24 @@
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_utils import has_any_changes
class TestHasAnyChanges(object):
def setup_method(self, method):
Base = declarative_base()
class Article(Base):
__tablename__ = 'article_translation'
id = sa.Column(sa.Integer, primary_key=True)
title = sa.Column(sa.String(100))
self.Article = Article
def test_without_changed_attr(self):
article = self.Article()
assert not has_any_changes(article, ['title'])
def test_with_changed_attr(self):
article = self.Article(title='Some title')
assert has_any_changes(article, ['title', 'id'])