bmc_hub/app/modules/task_templates/backend/models.py
Christian f2c8af4680 feat(task-templates): implement task template MVP with modal selector and tag actions
- Added task template and task template items tables to the database.
- Introduced case template runs and run items tables for tracking template executions.
- Created a new JavaScript module for task template selection with a modal interface.
- Integrated tag actions to open the task template selector modal upon tag addition.
- Updated backend to resolve tag actions and return them in the response when adding tags.
- Enhanced the tag picker to handle actions and trigger the appropriate modal.
- Added permissions and group permissions for managing task templates.
2026-05-01 20:58:13 +02:00

98 lines
2.7 KiB
Python

"""Pydantic models for task template APIs."""
from datetime import date, datetime
from typing import Literal, Optional
from pydantic import BaseModel, Field
TemplateType = Literal["global", "company", "internal", "deactivated"]
TemplateCategory = Literal[
"onboarding",
"offboarding",
"simkort",
"hardwarebestilling",
"brugerandring",
"andet",
]
TemplateItemType = Literal["task", "subcase"]
RunMode = Literal["tasks", "subcases", "combined"]
AssigneeMode = Literal["template_default", "specific_user", "specific_role"]
class TaskTemplateBase(BaseModel):
name: str = Field(..., min_length=1, max_length=255)
description: Optional[str] = None
template_type: TemplateType = "global"
customer_id: Optional[int] = None
category: TemplateCategory = "andet"
is_active: bool = True
class TaskTemplateCreate(TaskTemplateBase):
pass
class TaskTemplateUpdate(BaseModel):
name: Optional[str] = Field(None, min_length=1, max_length=255)
description: Optional[str] = None
template_type: Optional[TemplateType] = None
customer_id: Optional[int] = None
category: Optional[TemplateCategory] = None
is_active: Optional[bool] = None
class TaskTemplate(TaskTemplateBase):
id: int
created_by: Optional[int] = None
created_at: datetime
updated_at: datetime
class TaskTemplateItemBase(BaseModel):
title: str = Field(..., min_length=1, max_length=255)
description: Optional[str] = None
item_type: TemplateItemType = "task"
default_assignee_user_id: Optional[int] = None
default_assignee_role_id: Optional[int] = None
days_offset: Optional[int] = 0
sort_order: int = 0
is_required: bool = True
is_active: bool = True
class TaskTemplateItemCreate(TaskTemplateItemBase):
pass
class TaskTemplateItemUpdate(BaseModel):
title: Optional[str] = Field(None, min_length=1, max_length=255)
description: Optional[str] = None
item_type: Optional[TemplateItemType] = None
default_assignee_user_id: Optional[int] = None
default_assignee_role_id: Optional[int] = None
days_offset: Optional[int] = None
sort_order: Optional[int] = None
is_required: Optional[bool] = None
is_active: Optional[bool] = None
class TaskTemplateItem(TaskTemplateItemBase):
id: int
template_id: int
created_at: datetime
updated_at: datetime
class TemplatePreviewRequest(BaseModel):
template_id: int
start_date: Optional[date] = None
mode: RunMode = "combined"
assignee_mode: AssigneeMode = "template_default"
assignee_user_id: Optional[int] = None
assignee_role_id: Optional[int] = None
class TemplateRunRequest(TemplatePreviewRequest):
pass