Add force_instant_defaults listener
This commit is contained in:
		@@ -17,3 +17,20 @@ def coercion_listener(mapper, class_):
 | 
			
		||||
            listener,
 | 
			
		||||
            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