tasks: add task command

parent 58a423d8
...@@ -83,6 +83,11 @@ class TaskProcessInfo: ...@@ -83,6 +83,11 @@ class TaskProcessInfo:
} }
data = await self.client.get("/task/progress/find_tasks", params) data = await self.client.get("/task/progress/find_tasks", params)
return models.TasksListModel(**data) return models.TasksListModel(**data)
async def task_info(self, task_id: int) -> models.TaskProgressTaskInfoModel:
data = await self.client.get(f"/task/progress/task_info/{task_id}")
return models.TaskProgressTaskInfoModel(**data)
class TaskInfo: class TaskInfo:
......
...@@ -50,8 +50,49 @@ class TasksListElementModel(BaseModel): ...@@ -50,8 +50,49 @@ class TasksListElementModel(BaseModel):
dependencies: List[int] dependencies: List[int]
subtasks: List[SubTasksElementModel] subtasks: List[SubTasksElementModel]
approval: list[TaskApprovalElementModel] approval: list[TaskApprovalElementModel]
class SubTaskInfoElementModel(BaseModel):
subtask_id: int
subtask_type: str
subtask_srpm: str
subtask_srpm_name: str
subtask_srpm_evr: str
subtask_dir: str
subtask_tag_id: str
subtask_tag_name: str
subtask_tag_author: str
subtask_package: str
subtask_pkg_from: str
subtask_changed: str
type: str
src_pkg_name: str
src_pkg_hash: str
archs: List[SubTaskArchitectureModel]
approval: list[TaskApprovalElementModel]
class TaskIterationsElementModel(BaseModel):
task_try: int
task_iter: int
class TaskProgressTaskInfoModel(BaseModel):
task_id: int
task_repo: str
task_state: str
task_owner: str
task_try: int
task_iter: int
task_testonly: int
task_changed: str
task_message: str
task_stage: str
dependencies: List[int]
subtasks: List[SubTaskInfoElementModel]
iterations: list[TaskIterationsElementModel]
class TasksListModel(BaseModel): class TasksListModel(BaseModel):
request_args: Dict[str, Any] request_args: Dict[str, Any]
length: int length: int
......
from . import admin as admin_keyboards from . import admin as admin_keyboards
from . import tasks as tasks_keyboards
from . import start as start_keyboards from . import start as start_keyboards
from . import menu as menu_keyboards from . import menu as menu_keyboards
from . import news as news_keyboards from . import news as news_keyboards
......
from telegrinder import InlineKeyboard, InlineButton
from config import TASK_URL
def task_page_kb(task: int):
kb = InlineKeyboard()
kb.add(
InlineButton(
f"Таск {task}",
url=f"{TASK_URL}{task}",
)
)
return kb.get_markup()
from telegrinder import Dispatch, Message from telegrinder import Dispatch, Message
from telegrinder.rules import Command, Argument from telegrinder.rules import Command, Argument
from telegrinder.tools.formatting import HTMLFormatter, link from telegrinder.tools.formatting import HTMLFormatter
from datetime import datetime
from altrepo import altrepo from altrepo import altrepo
from altrepo.api.errors import DataNotFoundError, RequestValidationError from altrepo.api.errors import DataNotFoundError
from data.keyboards import package_keyboards
from database.models import User from database.models import User
from database.func import DB from database.func import DB
from services.utils import _bold, date_format from services.utils import _bold, date_format, int_validator
from data.keyboards import tasks_keyboards
from config import TASK_URL from config import TASK_URL
...@@ -38,7 +37,7 @@ async def tasks_handler(m: Message, user: User | None, maintainer: str | None = ...@@ -38,7 +37,7 @@ async def tasks_handler(m: Message, user: User | None, maintainer: str | None =
maintainer = user.maintainer maintainer = user.maintainer
else: else:
return return
print(f"@{maintainer.nickname}" f"({branch})")
tasks_data = await altrepo.api.task.progress.find_tasks( tasks_data = await altrepo.api.task.progress.find_tasks(
input=[f"@{maintainer.nickname}"], branch=branch input=[f"@{maintainer.nickname}"], branch=branch
) )
...@@ -59,3 +58,60 @@ async def tasks_handler(m: Message, user: User | None, maintainer: str | None = ...@@ -59,3 +58,60 @@ async def tasks_handler(m: Message, user: User | None, maintainer: str | None =
f" | {task.task_state} | {build_time} | {subtasks} | {task.task_message}\n" f" | {task.task_state} | {build_time} | {subtasks} | {task.task_message}\n"
await m.answer(tasks_message) await m.answer(tasks_message)
@dp.message(Command("task", Argument("task", [int_validator], optional=True)))
async def task_handler(m: Message, user: User | None, task: int | None = None) -> None:
if task is None:
await m.answer("Укажите ID таска.")
return
try:
task_data = await altrepo.api.task.progress.task_info(task)
except DataNotFoundError:
await m.answer("Таск не найден.")
return
subtask_types = {
"build": "🛠",
"rebuild": "🔄",
"delete": "🗑️"
}
build_time = await date_format(task_data.task_changed)
subtasks_message = ""
if task_data.subtasks:
subtasks_message = "\nСабтаски:\n"
for i, subtask in enumerate(task_data.subtasks):
markup = None
if i == 40:
subtasks_message += "..."
markup = tasks_keyboards.task_page_kb(task)
break
subtask_type = "build" if subtask.subtask_type in [
"gear", "srpm"] else subtask.subtask_type
subtask_package = subtask.subtask_package or subtask.subtask_srpm_name or \
subtask.subtask_dir.split("/")[-1].split(".")[0]
subtask_version = subtask.subtask_srpm_evr or subtask.subtask_tag_name or None
subtask_version = f"= {subtask_version}" if subtask_version else ""
subtasks_message += (
f"{subtask_types[subtask_type]} | {subtask.subtask_id} | {subtask_package} {subtask_version}\n"
)
task_message = _bold(
f"Таск {task_data.task_repo}/{task_data.task_id} от {task_data.task_owner}\n\n"
)
task_message += (
f"Статус: {task_data.task_state} (try {task_data.task_try})\n"
f"Собран: {build_time}\n"
f"{f"Сообщение: {task_data.task_message}\n" if task_data.task_message else ""}"
f"{subtasks_message}"
)
await m.answer(task_message, reply_markup=markup)
...@@ -65,4 +65,9 @@ async def date_format(time) -> str: ...@@ -65,4 +65,9 @@ async def date_format(time) -> str:
dt = datetime.fromtimestamp(time) dt = datetime.fromtimestamp(time)
elif isinstance(time, str): elif isinstance(time, str):
dt = datetime.fromisoformat(time) dt = datetime.fromisoformat(time)
return dt.strftime("%Y-%m-%d %H:%M:%S") return dt.strftime("%Y-%m-%d %H:%M:%S")
\ No newline at end of file
def int_validator(s: str) -> int | None:
if not s.isdigit():
return None
return int(s)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment