From 6fe5e5ddb3378fe917d82653c073e326864fdc3e Mon Sep 17 00:00:00 2001 From: Zhi Date: Thu, 12 Mar 2026 21:54:16 +0000 Subject: [PATCH] feat: add task fields - task_code, estimated_effort, etc --- app/api/routers/misc.py | 38 +++++++++++++++++++++++++++++++++++++- app/models/models.py | 11 +++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/app/api/routers/misc.py b/app/api/routers/misc.py index 8f0fb42..bb203dd 100644 --- a/app/api/routers/misc.py +++ b/app/api/routers/misc.py @@ -216,6 +216,9 @@ def milestone_items(milestone_id: int, db: Session = Depends(get_db)): @router.post("/milestones/{milestone_id}/tasks", status_code=status.HTTP_201_CREATED, tags=["Milestones"]) def create_milestone_task(milestone_id: int, issue_data: dict, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user_or_apikey)): + import json + from datetime import datetime, time + ms = db.query(MilestoneModel).filter(MilestoneModel.id == milestone_id).first() if not ms: raise HTTPException(status_code=404, detail="Milestone not found") @@ -227,6 +230,23 @@ def create_milestone_task(milestone_id: int, issue_data: dict, db: Session = Dep # Get project_id from milestone project_id = ms.project_id + # Generate task_code: i_{project_code}_{id:06x} + project = db.query(models.Project).filter(models.Project.id == project_id).first() + project_code = project.project_code if project else f"P{project_id}" + + # Get max id for this project to generate unique code + max_issue = db.query(models.Issue).filter(models.Issue.project_id == project_id).order_by(models.Issue.id.desc()).first() + next_id = (max_issue.id + 1) if max_issue else 1 + task_code = f"i_{project_code}_{next_id:06x}" + + # Parse estimated_working_time if provided + est_time = None + if issue_data.get("estimated_working_time"): + try: + est_time = datetime.strptime(issue_data["estimated_working_time"], "%H:%M").time() + except: + pass + issue = models.Issue( title=issue_data.get("title"), description=issue_data.get("description"), @@ -236,11 +256,27 @@ def create_milestone_task(milestone_id: int, issue_data: dict, db: Session = Dep project_id=project_id, milestone_id=milestone_id, reporter_id=current_user.id, + # Task-specific fields + task_code=task_code, + estimated_effort=issue_data.get("estimated_effort"), + estimated_working_time=est_time, + task_status="open", + created_by_id=current_user.id, ) db.add(issue) db.commit() db.refresh(issue) - return issue + + # Return with task_code + return { + "id": issue.id, + "title": issue.title, + "description": issue.description, + "task_code": issue.task_code, + "status": issue.status.value if hasattr(issue.status, 'value') else issue.status, + "priority": issue.priority.value if hasattr(issue.priority, 'value') else issue.priority, + "created_at": issue.created_at, + } @router.post("/milestones/{milestone_id}/supports", status_code=status.HTTP_201_CREATED, tags=["Milestones"]) diff --git a/app/models/models.py b/app/models/models.py index 2db9658..b10e369 100644 --- a/app/models/models.py +++ b/app/models/models.py @@ -68,6 +68,17 @@ class Issue(Base): due_date = Column(DateTime(timezone=True), nullable=True) milestone_id = Column(Integer, ForeignKey("milestones.id"), nullable=True) + # Task-specific fields + task_code = Column(String(64), nullable=True, unique=True, index=True) + depend_on = Column(Text, nullable=True) # JSON list of task codes + estimated_effort = Column(Integer, nullable=True) # 1-10 + estimated_working_time = Column(Time(timezone=True), nullable=True) + task_status = Column(String(32), default="open") # open, closed, pending, progressing + started_on = Column(DateTime(timezone=True), nullable=True) + finished_on = Column(DateTime(timezone=True), nullable=True) + related_tasks = Column(Text, nullable=True) # JSON list of task codes + created_by_id = Column(Integer, ForeignKey("users.id"), nullable=True) + project = relationship("Project", back_populates="issues") reporter = relationship("User", foreign_keys=[reporter_id], back_populates="reported_issues") assignee = relationship("User", foreign_keys=[assignee_id], back_populates="assigned_issues")