BE-PR-008: add Proposal Accept tracking fields (source_proposal_id, source_essential_id)

- Add source_proposal_id and source_essential_id FK columns to Task model
- Populate tracking fields during Proposal Accept task generation
- Add generated_tasks relationship on Proposal model for reverse lookup
- Expose source_proposal_id/source_essential_id in TaskResponse schema
- Add GeneratedTaskBrief schema and include generated_tasks in ProposalDetailResponse
- Proposal detail endpoint now returns generated story tasks with status
This commit is contained in:
zhi
2026-03-30 10:46:20 +00:00
parent cb0be05246
commit c84884fe64
4 changed files with 58 additions and 1 deletions

View File

@@ -78,6 +78,14 @@ class Proposal(Base):
lazy="select",
)
# BE-PR-008: reverse lookup — story tasks generated from this Proposal
generated_tasks = relationship(
"Task",
foreign_keys="Task.source_proposal_id",
lazy="select",
viewonly=True,
)
# ---- convenience alias ------------------------------------------------
@hybrid_property
def proposal_code(self) -> str | None:

View File

@@ -37,6 +37,17 @@ class Task(Base):
assignee_id = Column(Integer, ForeignKey("users.id"), nullable=True)
created_by_id = Column(Integer, ForeignKey("users.id"), nullable=True)
# Proposal Accept tracking (BE-PR-008)
# When a task is generated from Proposal Accept, these record the source.
source_proposal_id = Column(
Integer, ForeignKey("proposes.id"), nullable=True,
comment="Proposal that generated this task via accept (NULL if manually created)",
)
source_essential_id = Column(
Integer, ForeignKey("essentials.id"), nullable=True,
comment="Essential that generated this task via accept (NULL if manually created)",
)
# Tags (comma-separated)
tags = Column(String(500), nullable=True)