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
	 Konsta Vesterinen
					Konsta Vesterinen