BE-PR-002: Proposal model naming & field adjustments

- Add comprehensive docstring to Proposal model documenting all relationships
- Add column comments for all fields (title, description, status, project_id, etc.)
- Mark feat_task_id as DEPRECATED (will be replaced by Essential->task mapping in BE-PR-008)
- Add proposal_code hybrid property as preferred alias for DB column propose_code
- Update ProposalResponse schema to include proposal_code alongside propose_code
- Update serializer to emit both proposal_code and propose_code for backward compat
- No DB migration needed -- only Python-level changes
This commit is contained in:
zhi
2026-03-29 16:02:18 +00:00
parent cfacd432f5
commit 119a679e7f
3 changed files with 66 additions and 12 deletions

View File

@@ -24,16 +24,18 @@ router = APIRouter(prefix="/projects/{project_id}/proposals", tags=["Proposals"]
def _serialize_proposal(db: Session, proposal: Proposal) -> dict:
"""Serialize proposal with created_by_username."""
creator = db.query(models.User).filter(models.User.id == proposal.created_by_id).first() if proposal.created_by_id else None
code = proposal.propose_code # DB column; also exposed as proposal_code
return {
"id": proposal.id,
"title": proposal.title,
"description": proposal.description,
"propose_code": proposal.propose_code,
"proposal_code": code, # preferred name
"propose_code": code, # backward compat
"status": proposal.status.value if hasattr(proposal.status, "value") else proposal.status,
"project_id": proposal.project_id,
"created_by_id": proposal.created_by_id,
"created_by_username": creator.username if creator else None,
"feat_task_id": proposal.feat_task_id,
"feat_task_id": proposal.feat_task_id, # DEPRECATED — read-only compat
"created_at": proposal.created_at,
"updated_at": proposal.updated_at,
}