from uuid import UUID, uuid4 from enum import Enum from typing import Optional from fastapi_filter.contrib.sqlalchemy import Filter from sqlmodel import Field, SQLModel, select class CategoryBase(SQLModel): name: str = Field(index=True) class CategoryRead(CategoryBase): id: UUID | None = Field(default_factory=uuid4, primary_key=True) class Category(CategoryRead, table=True): @classmethod def create(cls, category, session): category_db = cls.model_validate(category) session.add(category_db) session.commit() session.refresh(category_db) return category_db @classmethod def list(cls, filters): return filters.filter(select(cls)) @classmethod def get(cls, session, category_id): return session.get(Category, category_id) @classmethod def update(cls, session, category_db, category_data): category_db.sqlmodel_update(category_data) session.add(category_db) session.commit() session.refresh(category_db) return category_db @classmethod def delete(cls, session, category): session.delete(category) session.commit() class CategoryWrite(CategoryBase): pass class CategoryCreate(CategoryWrite): pass class CategoryUpdate(CategoryWrite): pass class CategoryFilters(Filter): name__like: Optional[str] = None class Constants(Filter.Constants): model = Category search_model_fields = ["name"]