1aaef71f52
Document-driven MVP with FastAPI backend, Vue H5, WeChat mini shell, product demo, and Docker dev stack. Co-authored-by: Cursor <cursoragent@cursor.com>
89 lines
2.5 KiB
Python
89 lines
2.5 KiB
Python
from datetime import date
|
|
|
|
from sqlalchemy import func, select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.db.models import Child
|
|
from app.schemas.models import ChildCreateRequest, ChildUpdateRequest
|
|
|
|
|
|
def calc_age(birthday: date) -> int:
|
|
today = date.today()
|
|
age = today.year - birthday.year
|
|
if (today.month, today.day) < (birthday.month, birthday.day):
|
|
age -= 1
|
|
return age
|
|
|
|
|
|
def child_to_dict(child: Child) -> dict:
|
|
return {
|
|
"id": child.id,
|
|
"name": child.name,
|
|
"birthday": child.birthday.isoformat(),
|
|
"age": calc_age(child.birthday),
|
|
"height": float(child.height) if child.height is not None else None,
|
|
"weight": float(child.weight) if child.weight is not None else None,
|
|
"status": child.status,
|
|
}
|
|
|
|
|
|
def list_children(db: Session, parent_user_id: int, page: int, page_size: int) -> tuple[list[Child], int]:
|
|
filters = (Child.parent_user_id == parent_user_id, Child.status != "archived")
|
|
total = db.scalar(select(func.count()).select_from(Child).where(*filters)) or 0
|
|
items = db.scalars(
|
|
select(Child)
|
|
.where(*filters)
|
|
.order_by(Child.id.desc())
|
|
.offset((page - 1) * page_size)
|
|
.limit(page_size)
|
|
).all()
|
|
return items, total
|
|
|
|
|
|
def get_child(db: Session, parent_user_id: int, child_id: int) -> Child | None:
|
|
return db.scalar(
|
|
select(Child).where(
|
|
Child.id == child_id,
|
|
Child.parent_user_id == parent_user_id,
|
|
Child.status != "archived",
|
|
)
|
|
)
|
|
|
|
|
|
def create_child(db: Session, parent_user_id: int, tenant_id: int | None, body: ChildCreateRequest) -> Child:
|
|
child = Child(
|
|
parent_user_id=parent_user_id,
|
|
tenant_id=tenant_id,
|
|
name=body.name,
|
|
birthday=body.birthday,
|
|
gender=body.gender.value,
|
|
height=body.height,
|
|
weight=body.weight,
|
|
contraindications=body.contraindications,
|
|
status="active",
|
|
)
|
|
db.add(child)
|
|
db.commit()
|
|
db.refresh(child)
|
|
return child
|
|
|
|
|
|
def update_child(db: Session, child: Child, body: ChildUpdateRequest) -> Child:
|
|
child.name = body.name
|
|
child.birthday = body.birthday
|
|
child.gender = body.gender.value
|
|
child.height = body.height
|
|
child.weight = body.weight
|
|
child.contraindications = body.contraindications
|
|
db.commit()
|
|
db.refresh(child)
|
|
return child
|
|
|
|
|
|
def archive_child(db: Session, child: Child) -> None:
|
|
from datetime import datetime, timezone
|
|
|
|
child.status = "archived"
|
|
child.deleted_at = datetime.now(timezone.utc)
|
|
db.commit()
|