Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
altlinux-packages-bot
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kirill Unitsaev
altlinux-packages-bot
Commits
4752dd9d
Verified
Commit
4752dd9d
authored
Nov 03, 2025
by
Kirill Unitsaev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tasks: add task command
parent
58a423d8
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
131 additions
and
11 deletions
+131
-11
methods.py
src/altrepo/api/methods.py
+5
-0
models.py
src/altrepo/api/models.py
+43
-2
__init__.py
src/data/keyboards/__init__.py
+1
-0
tasks.py
src/data/keyboards/tasks.py
+13
-0
tasks.py
src/handlers/tasks.py
+63
-7
utils.py
src/services/utils.py
+6
-2
No files found.
src/altrepo/api/methods.py
View file @
4752dd9d
...
@@ -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
:
...
...
src/altrepo/api/models.py
View file @
4752dd9d
...
@@ -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
...
...
src/data/keyboards/__init__.py
View file @
4752dd9d
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
...
...
src/data/keyboards/tasks.py
0 → 100644
View file @
4752dd9d
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
()
src/handlers/tasks.py
View file @
4752dd9d
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
)
src/services/utils.py
View file @
4752dd9d
...
@@ -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
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment