Source code for bag.sqlalchemy.created_changed

"""SQLAlchemy trick that makes it easy to implement timestamp columns.

Usage::

    from bag.sqlalchemy.created_changed import created_changed, CreatedChanged

    @created_changed
    class MyModel(BaseModel, CreatedChanged):
        ...
"""

from datetime import datetime

from sqlalchemy import Column, DateTime, event


[docs]class CreatedChanged: """Mixin class that adds ``created`` and ``changed`` columns. Must be used together with the ``@created_changed`` class decorator. """ created = Column(DateTime, nullable=False) changed = Column(DateTime, nullable=False)
[docs]def created_changed(cls): # noqa """Decorate ``cls`` to update *created* and *changed* automatically. If you use SQLAlchemy inheritance, apply this decorator to subclasses. """ def _set_created_and_changed(mapper, connection, instance): instance.created = instance.changed = datetime.utcnow() def _set_changed(mapper, connection, instance): instance.changed = datetime.utcnow() event.listen(cls, "before_insert", _set_created_and_changed) event.listen(cls, "before_update", _set_changed) return cls