Files
gatehouse-api/gatehouse_app/models/base.py
T

91 lines
2.6 KiB
Python
Raw Normal View History

2026-01-08 01:00:26 +10:30
"""Base model with common fields and functionality."""
import uuid
from datetime import datetime, timezone
2026-01-15 03:40:29 +10:30
from gatehouse_app.extensions import db
2026-01-08 01:00:26 +10:30
class BaseModel(db.Model):
"""Base model class with common fields."""
__abstract__ = True
id = db.Column(
db.String(36),
primary_key=True,
default=lambda: str(uuid.uuid4()),
nullable=False,
)
created_at = db.Column(db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))
2026-01-08 01:00:26 +10:30
updated_at = db.Column(
db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)
2026-01-08 01:00:26 +10:30
)
deleted_at = db.Column(db.DateTime, nullable=True)
2026-01-20 15:54:00 +10:30
@classmethod
def create(cls, **kwargs):
"""Create and save a new model instance.
Args:
**kwargs: Model field values
Returns:
The created model instance
"""
instance = cls(**kwargs)
db.session.add(instance)
db.session.commit()
return instance
2026-01-08 01:00:26 +10:30
def save(self):
"""Save the model instance to database."""
db.session.add(self)
db.session.commit()
return self
def delete(self, soft=True):
"""
Delete the model instance.
Args:
soft: If True, performs soft delete. If False, hard delete.
"""
if soft:
self.deleted_at = datetime.now(timezone.utc)
2026-01-08 01:00:26 +10:30
db.session.commit()
else:
db.session.delete(self)
db.session.commit()
def update(self, **kwargs):
"""Update model fields."""
for key, value in kwargs.items():
if hasattr(self, key):
setattr(self, key, value)
self.updated_at = datetime.now(timezone.utc)
2026-01-08 01:00:26 +10:30
db.session.commit()
return self
def to_dict(self, exclude=None):
"""
Convert model to dictionary.
Args:
exclude: List of fields to exclude from output
Returns:
Dictionary representation of the model
"""
exclude = exclude or []
result = {}
for column in self.__table__.columns:
if column.name not in exclude:
value = getattr(self, column.name)
if isinstance(value, datetime):
if value.tzinfo is None:
result[column.name] = value.isoformat() + "Z"
else:
result[column.name] = value.astimezone(timezone.utc).isoformat().replace("+00:00", "Z")
2026-01-08 01:00:26 +10:30
else:
result[column.name] = value
return result