Files
fquiz/api/app/schemas/requirement.py
T
2026-04-23 09:41:54 +08:00

112 lines
3.3 KiB
Python

from __future__ import annotations
from datetime import datetime
from typing import Literal
from pydantic import BaseModel, Field
from .user import UserPublic
RequirementStatus = Literal[
"PENDING_ANALYSIS",
"PENDING_REVIEW",
"PENDING_REVISION",
"OPEN",
"IN_PROGRESS",
"COMPLETED",
"CLOSED",
"CANCELLED",
]
RequirementPriority = Literal["low", "medium", "high", "urgent", "LOW", "MEDIUM", "HIGH"]
RequirementCommentKind = Literal["comment", "analysis", "revision", "system"]
class RequirementSummary(BaseModel):
id: str
code: str
title: str
description: str
status: RequirementStatus
priority: RequirementPriority
project_name: str | None = None
module_name: str | None = None
source: str | None = None
creator_user_id: str | None = None
assignee_user_id: str | None = None
reviewer_user_id: str | None = None
due_at: datetime | None = None
closed_at: datetime | None = None
created_at: datetime
updated_at: datetime
result_msg: str | None = None
progress_percent: int = 0
git_url: str | None = None
branch: str | None = None
creator: UserPublic | None = None
assignee: UserPublic | None = None
reviewer: UserPublic | None = None
class RequirementListResponse(BaseModel):
items: list[RequirementSummary]
total: int
class RequirementCreateRequest(BaseModel):
title: str = Field(min_length=2, max_length=200)
description: str = Field(default="", max_length=20000)
status: RequirementStatus = "PENDING_ANALYSIS"
priority: RequirementPriority = "medium"
project_name: str | None = Field(default=None, max_length=128)
module_name: str | None = Field(default=None, max_length=128)
source: str | None = Field(default=None, max_length=128)
assignee_user_id: str | None = Field(default=None, max_length=36)
due_at: datetime | None = None
class RequirementUpdateRequest(BaseModel):
title: str | None = Field(default=None, min_length=2, max_length=200)
description: str | None = Field(default=None, max_length=20000)
priority: RequirementPriority | None = None
project_name: str | None = Field(default=None, max_length=128)
module_name: str | None = Field(default=None, max_length=128)
source: str | None = Field(default=None, max_length=128)
assignee_user_id: str | None = Field(default=None, max_length=36)
due_at: datetime | None = None
class RequirementAssignRequest(BaseModel):
assignee_user_id: str | None = Field(default=None, max_length=36)
class RequirementTransitionRequest(BaseModel):
status: RequirementStatus
note: str | None = Field(default=None, max_length=2000)
class RequirementCommentCreateRequest(BaseModel):
content: str = Field(min_length=1, max_length=20000)
kind: RequirementCommentKind = "comment"
class RequirementCommentPublic(BaseModel):
id: int
requirement_id: str
author_user_id: str | None = None
content: str
kind: RequirementCommentKind
created_at: datetime
author: UserPublic | None = None
class RequirementEventPublic(BaseModel):
id: str
requirement_id: str
actor_user_id: str | None = None
event_type: str
from_status: str | None = None
to_status: str | None = None
payload_json: dict | None = None
created_at: datetime
actor: UserPublic | None = None