feat(P7.1): remove task_type='task' — migrate to issue/defect, update defaults and DB migration
This commit is contained in:
@@ -445,7 +445,7 @@ def create_milestone_task(project_code: str, milestone_id: int, task_data: dict,
|
|||||||
description=task_data.get("description"),
|
description=task_data.get("description"),
|
||||||
status=TaskStatus.OPEN,
|
status=TaskStatus.OPEN,
|
||||||
priority=TaskPriority.MEDIUM,
|
priority=TaskPriority.MEDIUM,
|
||||||
task_type=task_data.get("task_type", "task"),
|
task_type=task_data.get("task_type", "issue"), # P7.1: default changed from 'task' to 'issue'
|
||||||
task_subtype=task_data.get("task_subtype"),
|
task_subtype=task_data.get("task_subtype"),
|
||||||
project_id=project.id,
|
project_id=project.id,
|
||||||
milestone_id=milestone_id,
|
milestone_id=milestone_id,
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ TASK_SUBTYPE_MAP = {
|
|||||||
'story': {'feature', 'improvement', 'refactor'},
|
'story': {'feature', 'improvement', 'refactor'},
|
||||||
'test': {'regression', 'security', 'smoke', 'stress'},
|
'test': {'regression', 'security', 'smoke', 'stress'},
|
||||||
'research': set(),
|
'research': set(),
|
||||||
'task': {'defect'},
|
# P7.1: 'task' type removed — defect subtype migrated to issue/defect
|
||||||
'resolution': set(),
|
'resolution': set(),
|
||||||
}
|
}
|
||||||
ALLOWED_TASK_TYPES = set(TASK_SUBTYPE_MAP.keys())
|
ALLOWED_TASK_TYPES = set(TASK_SUBTYPE_MAP.keys())
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ def _migrate_schema():
|
|||||||
# tasks extra fields
|
# tasks extra fields
|
||||||
result = db.execute(text("SHOW COLUMNS FROM tasks LIKE 'task_type'"))
|
result = db.execute(text("SHOW COLUMNS FROM tasks LIKE 'task_type'"))
|
||||||
if not result.fetchone():
|
if not result.fetchone():
|
||||||
db.execute(text("ALTER TABLE tasks ADD COLUMN task_type VARCHAR(32) DEFAULT 'task'"))
|
db.execute(text("ALTER TABLE tasks ADD COLUMN task_type VARCHAR(32) DEFAULT 'issue'"))
|
||||||
result = db.execute(text("SHOW COLUMNS FROM tasks LIKE 'task_subtype'"))
|
result = db.execute(text("SHOW COLUMNS FROM tasks LIKE 'task_subtype'"))
|
||||||
if not result.fetchone():
|
if not result.fetchone():
|
||||||
db.execute(text("ALTER TABLE tasks ADD COLUMN task_subtype VARCHAR(64) NULL"))
|
db.execute(text("ALTER TABLE tasks ADD COLUMN task_subtype VARCHAR(64) NULL"))
|
||||||
@@ -194,6 +194,10 @@ def _migrate_schema():
|
|||||||
if not _has_column(db, "milestones", "started_at"):
|
if not _has_column(db, "milestones", "started_at"):
|
||||||
db.execute(text("ALTER TABLE milestones ADD COLUMN started_at DATETIME NULL"))
|
db.execute(text("ALTER TABLE milestones ADD COLUMN started_at DATETIME NULL"))
|
||||||
|
|
||||||
|
# --- P7.1: Migrate task_type='task' to 'issue' ---
|
||||||
|
if _has_table(db, "tasks") and _has_column(db, "tasks", "task_type"):
|
||||||
|
db.execute(text("UPDATE tasks SET task_type='issue' WHERE task_type='task'"))
|
||||||
|
|
||||||
# --- Task status enum migration (old -> new) ---
|
# --- Task status enum migration (old -> new) ---
|
||||||
if _has_table(db, "tasks"):
|
if _has_table(db, "tasks"):
|
||||||
# Widen enum first
|
# Widen enum first
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class Task(Base):
|
|||||||
task_code = Column(String(64), nullable=True, unique=True, index=True)
|
task_code = Column(String(64), nullable=True, unique=True, index=True)
|
||||||
|
|
||||||
# Task type/subtype (replaces old issue_type/issue_subtype)
|
# Task type/subtype (replaces old issue_type/issue_subtype)
|
||||||
task_type = Column(String(32), default="task")
|
task_type = Column(String(32), default="issue") # P7.1: default changed from 'task' to 'issue'
|
||||||
task_subtype = Column(String(64), nullable=True)
|
task_subtype = Column(String(64), nullable=True)
|
||||||
|
|
||||||
project_id = Column(Integer, ForeignKey("projects.id"), nullable=False)
|
project_id = Column(Integer, ForeignKey("projects.id"), nullable=False)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class TaskTypeEnum(str, Enum):
|
|||||||
STORY = "story"
|
STORY = "story"
|
||||||
TEST = "test"
|
TEST = "test"
|
||||||
RESOLUTION = "resolution"
|
RESOLUTION = "resolution"
|
||||||
TASK = "task"
|
# P7.1: 'task' type removed — defect subtype migrated to issue/defect
|
||||||
|
|
||||||
|
|
||||||
class TaskStatusEnum(str, Enum):
|
class TaskStatusEnum(str, Enum):
|
||||||
@@ -34,7 +34,7 @@ class TaskPriorityEnum(str, Enum):
|
|||||||
class TaskBase(BaseModel):
|
class TaskBase(BaseModel):
|
||||||
title: str
|
title: str
|
||||||
description: Optional[str] = None
|
description: Optional[str] = None
|
||||||
task_type: TaskTypeEnum = TaskTypeEnum.TASK
|
task_type: TaskTypeEnum = TaskTypeEnum.ISSUE
|
||||||
task_subtype: Optional[str] = None
|
task_subtype: Optional[str] = None
|
||||||
priority: TaskPriorityEnum = TaskPriorityEnum.MEDIUM
|
priority: TaskPriorityEnum = TaskPriorityEnum.MEDIUM
|
||||||
tags: Optional[str] = None
|
tags: Optional[str] = None
|
||||||
|
|||||||
Reference in New Issue
Block a user