- 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.
98 lines
2.7 KiB
Python
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
|