Add force_instant_defaults listener
This commit is contained in:
@@ -17,3 +17,20 @@ def coercion_listener(mapper, class_):
|
|||||||
listener,
|
listener,
|
||||||
retval=True
|
retval=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def instant_defaults_listener(target, args, kwargs):
|
||||||
|
for key, column in sa.inspect(target.__class__).columns.items():
|
||||||
|
if column.default is not None:
|
||||||
|
if callable(column.default.arg):
|
||||||
|
setattr(target, key, column.default.arg(target))
|
||||||
|
else:
|
||||||
|
setattr(target, key, column.default.arg)
|
||||||
|
|
||||||
|
|
||||||
|
def coerce_data_types(mapper=sa.orm.mapper):
|
||||||
|
sa.event.listen(mapper, 'mapper_configured', coercion_listener)
|
||||||
|
|
||||||
|
|
||||||
|
def force_instant_defaults(mapper=sa.orm.mapper):
|
||||||
|
sa.event.listen(mapper, 'init', instant_defaults_listener)
|
||||||
|
26
tests/test_instant_defaults_listener.py
Normal file
26
tests/test_instant_defaults_listener.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy_utils.listeners import force_instant_defaults
|
||||||
|
from tests import TestCase
|
||||||
|
|
||||||
|
|
||||||
|
force_instant_defaults()
|
||||||
|
|
||||||
|
|
||||||
|
class TestInstantDefaultListener(TestCase):
|
||||||
|
def create_models(self):
|
||||||
|
class Article(self.Base):
|
||||||
|
__tablename__ = 'article'
|
||||||
|
id = sa.Column(sa.Integer, primary_key=True)
|
||||||
|
name = sa.Column(sa.Unicode(255), default=u'Some article')
|
||||||
|
created_at = sa.Column(sa.DateTime, default=datetime.now)
|
||||||
|
|
||||||
|
self.Article = Article
|
||||||
|
|
||||||
|
def test_assigns_defaults_on_object_construction(self):
|
||||||
|
article = self.Article()
|
||||||
|
assert article.name == u'Some article'
|
||||||
|
|
||||||
|
def test_callables_as_defaults(self):
|
||||||
|
article = self.Article()
|
||||||
|
assert isinstance(article.created_at, datetime)
|
Reference in New Issue
Block a user