feat: add code fields - milestoneCode, taskCode, supportCode, meetingCode

This commit is contained in:
Zhi
2026-03-12 22:48:04 +00:00
parent 5297711c77
commit a1a99bb838
5 changed files with 22 additions and 20 deletions

View File

@@ -106,8 +106,18 @@ def list_activity(entity_type: str = None, entity_id: int = None, user_id: int =
# ============ Milestones ============
@router.post("/milestones", response_model=schemas.MilestoneResponse, status_code=status.HTTP_201_CREATED, tags=["Milestones"])
def create_milestone(ms: schemas.MilestoneCreate, db: Session = Depends(get_db)):
def create_milestone(ms: schemas.MilestoneCreate, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user_or_apikey)):
# Generate milestone_code: projCode:{i:05x}
project = db.query(models.Project).filter(models.Project.id == ms.project_id).first()
project_code = project.project_code if project else f"P{ms.project_id}"
# Get max milestone number for this project
max_ms = db.query(MilestoneModel).filter(MilestoneModel.project_id == ms.project_id).order_by(MilestoneModel.id.desc()).first()
next_num = (max_ms.id + 1) if max_ms else 1
milestone_code = f"{project_code}:{next_num:05x}"
db_ms = MilestoneModel(**ms.model_dump())
db_ms.milestone_code = milestone_code
db.add(db_ms)
db.commit()
db.refresh(db_ms)
@@ -240,7 +250,7 @@ def create_milestone_task(milestone_id: int, issue_data: dict, db: Session = Dep
# 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}"
task_code = f"{milestone_code}:T{next_num:05x}"
# Parse estimated_working_time if provided
est_time = None
@@ -539,7 +549,7 @@ def create_task(project_code: str, milestone_id: int, task_data: dict, db: Sessi
max_task = db.query(Task).filter(Task.project_id == project.id).order_by(Task.id.desc()).first()
next_id = (max_task.id + 1) if max_task else 1
task_code = f"i_{project_code}_{next_id:06x}"
task_code = f"{milestone_code}:T{next_num:05x}"
est_time = None
if task_data.get("estimated_working_time"):

View File

@@ -24,6 +24,7 @@ class Meeting(Base):
description = Column(Text, nullable=True)
status = Column(Enum(MeetingStatus), default=MeetingStatus.SCHEDULED)
priority = Column(Enum(MeetingPriority), default=MeetingPriority.MEDIUM)
meeting_code = Column(String(64), nullable=True, unique=True, index=True)
project_id = Column(Integer, ForeignKey("projects.id"), nullable=False)
milestone_id = Column(Integer, ForeignKey("milestones.id"), nullable=False)
@@ -34,6 +35,3 @@ class Meeting(Base):
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
reporter = relationship("User", foreign_keys=[reporter_id])

View File

@@ -1,10 +1,9 @@
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Enum
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Enum, Time
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.core.config import Base
import enum
class MilestoneStatus(str, enum.Enum):
OPEN = "open"
PENDING = "pending"
@@ -12,20 +11,20 @@ class MilestoneStatus(str, enum.Enum):
PROGRESSING = "progressing"
CLOSED = "closed"
class Milestone(Base):
__tablename__ = "milestones"
id = Column(Integer, primary_key=True, index=True)
title = Column(String(255), nullable=False)
description = Column(Text, nullable=True)
status = Column(Enum(MilestoneStatus), default=MilestoneStatus.OPEN)
milestone_code = Column(String(64), nullable=True, unique=True, index=True)
due_date = Column(DateTime(timezone=True), nullable=True)
planned_release_date = Column(DateTime(timezone=True), nullable=True)
depend_on_milestones = Column(Text, nullable=True) # JSON list of milestone codes
depend_on_tasks = Column(Text, nullable=True) # JSON list of task IDs
depend_on_milestones = Column(Text, nullable=True)
depend_on_tasks = Column(Text, nullable=True)
project_id = Column(Integer, ForeignKey("projects.id"), nullable=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
project = relationship("Project")

View File

@@ -24,6 +24,7 @@ class Support(Base):
description = Column(Text, nullable=True)
status = Column(Enum(SupportStatus), default=SupportStatus.OPEN)
priority = Column(Enum(SupportPriority), default=SupportPriority.MEDIUM)
support_code = Column(String(64), nullable=True, unique=True, index=True)
project_id = Column(Integer, ForeignKey("projects.id"), nullable=False)
milestone_id = Column(Integer, ForeignKey("milestones.id"), nullable=False)
@@ -32,7 +33,3 @@ class Support(Base):
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
reporter = relationship("User", foreign_keys=[reporter_id])
assignee = relationship("User", foreign_keys=[assignee_id])

View File

@@ -24,6 +24,7 @@ class Task(Base):
description = Column(Text, nullable=True)
status = Column(Enum(TaskStatus), default=TaskStatus.OPEN)
priority = Column(Enum(TaskPriority), default=TaskPriority.MEDIUM)
task_code = Column(String(64), nullable=True, unique=True, index=True)
project_id = Column(Integer, ForeignKey("projects.id"), nullable=False)
milestone_id = Column(Integer, ForeignKey("milestones.id"), nullable=False)
@@ -31,7 +32,6 @@ class Task(Base):
assignee_id = Column(Integer, ForeignKey("users.id"), nullable=True)
created_by_id = Column(Integer, ForeignKey("users.id"), nullable=True)
task_code = Column(String(64), nullable=True, unique=True, index=True)
depend_on = Column(Text, nullable=True)
estimated_effort = Column(Integer, nullable=True)
estimated_working_time = Column(Time, nullable=True)
@@ -41,5 +41,3 @@ class Task(Base):
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())