HR-ATS-Portal/backend/org_settings/models.py

80 lines
2.6 KiB
Python

from typing import Any
import uuid
from datetime import datetime, timezone
from sqlalchemy import DateTime, JSON
from sqlalchemy.ext.asyncio import AsyncSession
from sqlmodel import Field, SQLModel, select
def _now() -> datetime:
return datetime.now(timezone.utc)
class OrgSettings(SQLModel, table=True):
__tablename__ = "org_settings"
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
setting_key: str = Field(unique=True, index=True)
setting_value: Any = Field(sa_type=JSON)
category: str
updated_by: uuid.UUID | None = Field(default=None, foreign_key="users.id")
created_at: datetime = Field(default_factory=_now, sa_type=DateTime(timezone=True))
updated_at: datetime = Field(default_factory=_now, sa_type=DateTime(timezone=True))
@staticmethod
def _as_uuid(record_id) -> uuid.UUID | None:
if record_id in (None, ""):
return None
try:
return uuid.UUID(str(record_id))
except ValueError:
return None
@classmethod
async def fetch_settings(cls, session: AsyncSession, *, category: str | None = None):
statement = select(cls)
if category:
statement = statement.where(cls.category == category)
statement = statement.order_by(cls.setting_key.asc())
result = await session.execute(statement)
rows = list(result.scalars().all())
return rows, len(rows)
@classmethod
async def get_by_key(cls, session: AsyncSession, setting_key: str):
result = await session.execute(select(cls).where(cls.setting_key == setting_key))
return result.scalars().first()
@classmethod
async def upsert_settings(cls, session: AsyncSession, items: list[dict], updated_by):
rows = []
now = _now()
for item in items:
key = item["setting_key"]
row = await cls.get_by_key(session, key)
if row is None:
row = cls(
setting_key=key,
setting_value=item.get("setting_value"),
category=item["category"],
updated_by=updated_by,
created_at=now,
updated_at=now,
)
else:
row.setting_value = item.get("setting_value")
row.category = item["category"]
row.updated_by = updated_by
row.updated_at = now
session.add(row)
rows.append(row)
await session.commit()
for row in rows:
await session.refresh(row)
return rows
import users.models as _users_models # noqa: E402, F401