2021-04-04 15:57:22 +08:00
|
|
|
from datetime import datetime
|
|
|
|
from typing import Optional
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
|
|
from sqlalchemy.ext.declarative import declared_attr
|
2021-12-13 00:20:48 +08:00
|
|
|
from sqlalchemy import Column, Integer, ForeignKey, DateTime, func
|
2021-04-04 15:57:22 +08:00
|
|
|
from sqlalchemy.orm import relationship
|
2021-12-13 00:20:48 +08:00
|
|
|
from felicity.apps.core.hooks import EventHookMixin
|
2021-04-04 15:57:22 +08:00
|
|
|
from felicity.database.base_class import DBModel
|
|
|
|
from felicity.apps.user.schemas import User as UserSchema
|
2021-05-06 21:48:09 +08:00
|
|
|
from felicity.apps.audit.mixin import AuditableMixin
|
2021-04-04 15:57:22 +08:00
|
|
|
|
|
|
|
|
|
|
|
class TrailMixin(object):
|
2021-12-13 00:20:48 +08:00
|
|
|
@declared_attr
|
|
|
|
def created_at(self):
|
|
|
|
return Column(DateTime, default=datetime.utcnow)
|
2021-04-04 15:57:22 +08:00
|
|
|
|
|
|
|
@declared_attr
|
|
|
|
def created_by_uid(self):
|
|
|
|
return Column(Integer, ForeignKey('user.uid'), nullable=True)
|
|
|
|
|
2021-09-10 14:48:06 +08:00
|
|
|
@declared_attr
|
|
|
|
def created_by(self):
|
2021-12-28 06:35:38 +08:00
|
|
|
return relationship("User", foreign_keys=[self.created_by_uid], lazy='selectin')
|
2021-09-10 14:48:06 +08:00
|
|
|
|
2021-12-13 00:20:48 +08:00
|
|
|
@declared_attr
|
|
|
|
def updated_at(self):
|
|
|
|
return Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
|
2021-04-04 15:57:22 +08:00
|
|
|
@declared_attr
|
|
|
|
def updated_by_uid(self):
|
|
|
|
return Column(Integer, ForeignKey('user.uid'), nullable=True)
|
|
|
|
|
2021-09-10 14:48:06 +08:00
|
|
|
@declared_attr
|
|
|
|
def updated_by(self):
|
2021-12-28 06:35:38 +08:00
|
|
|
return relationship("User", foreign_keys=[self.updated_by_uid], lazy='selectin')
|
2021-09-10 14:48:06 +08:00
|
|
|
|
2021-04-04 15:57:22 +08:00
|
|
|
|
|
|
|
class BaseAuditDBModel(DBModel, TrailMixin):
|
2021-05-06 21:48:09 +08:00
|
|
|
"""With creator and updater"""
|
2021-12-28 06:35:38 +08:00
|
|
|
|
2021-04-04 15:57:22 +08:00
|
|
|
__abstract__ = True
|
|
|
|
|
|
|
|
|
2021-05-06 21:48:09 +08:00
|
|
|
class Auditable(BaseAuditDBModel, AuditableMixin):
|
|
|
|
"""With Audit Log"""
|
|
|
|
__abstract__ = True
|
|
|
|
|
|
|
|
|
2021-12-13 00:20:48 +08:00
|
|
|
# class EventHooked(BaseAuditDBModel, EventHookMixin):
|
|
|
|
# """Listens for All events: Not working"""
|
|
|
|
# __abstract__ = True
|
|
|
|
|
|
|
|
|
2021-05-06 21:48:09 +08:00
|
|
|
# Pydantic
|
2021-04-04 15:57:22 +08:00
|
|
|
class BaseAuditModel(BaseModel):
|
|
|
|
created_at: Optional[datetime] = None
|
2021-10-07 15:17:20 +08:00
|
|
|
created_by_uid: Optional[int] = None
|
2021-04-04 15:57:22 +08:00
|
|
|
created_by: Optional[UserSchema] = None
|
2021-09-10 14:48:06 +08:00
|
|
|
updated_at: Optional[datetime] = None
|
2021-10-07 15:17:20 +08:00
|
|
|
updated_by_uid: Optional[int] = None
|
2021-04-04 15:57:22 +08:00
|
|
|
updated_by: Optional[UserSchema] = None
|