add statistics

parent 18281836
...@@ -37,6 +37,18 @@ class APIInfo: ...@@ -37,6 +37,18 @@ class APIInfo:
return models.APIVersion(**data) return models.APIVersion(**data)
class PackagesetInfo:
def __init__(self, client: BaseAPI):
self.client = client
async def repository_statistics(self, branch: str | None = None) -> models.RepositoryStatisticsModel:
if branch:
data = await self.client.get("/packageset/repository_statistics", {"branch": branch})
else:
data = await self.client.get("/packageset")
return models.RepositoryStatisticsModel(**data)
class BugInfo: class BugInfo:
def __init__(self, client: BaseAPI): def __init__(self, client: BaseAPI):
self.client = client self.client = client
...@@ -76,6 +88,7 @@ class PackagesAPI: ...@@ -76,6 +88,7 @@ class PackagesAPI:
def __init__(self): def __init__(self):
self._client = BaseAPI() self._client = BaseAPI()
self.api = APIInfo(self._client) self.api = APIInfo(self._client)
self.packageset = PackagesetInfo(self._client)
self.bug = BugInfo(self._client) self.bug = BugInfo(self._client)
self.site = SiteInfo(self._client) self.site = SiteInfo(self._client)
......
...@@ -8,6 +8,26 @@ class APIVersion(BaseModel): ...@@ -8,6 +8,26 @@ class APIVersion(BaseModel):
description: str description: str
class RepositoryStatisticsPackageCountsModel(BaseModel):
arch: str
component: str
count: int
size: int
size_hr: str
uuid: str
class RepositoryStatisticsBranchesModel(BaseModel):
branch: str
date_update: str
packages_count: List[RepositoryStatisticsPackageCountsModel]
class RepositoryStatisticsModel(BaseModel):
length: int
branches: List[RepositoryStatisticsBranchesModel]
class AllMaintainersElementModel(BaseModel): class AllMaintainersElementModel(BaseModel):
packager_name: str packager_name: str
packager_nickname: str packager_nickname: str
......
...@@ -3,4 +3,6 @@ from telegrinder import Button, Keyboard ...@@ -3,4 +3,6 @@ from telegrinder import Button, Keyboard
menu_kb = ( menu_kb = (
Keyboard() Keyboard()
.add(Button("Профиль")) .add(Button("Профиль"))
.row()
.add(Button("Статистика"))
).get_markup() ).get_markup()
\ No newline at end of file
...@@ -5,7 +5,7 @@ from api import api ...@@ -5,7 +5,7 @@ from api import api
dp = Dispatch() dp = Dispatch()
@dp.message(Command("info")) @dp.message(Command("altrepo_info"))
async def info_handler(m: Message) -> None: async def info_handler(m: Message) -> None:
api_data = await api.api.version() api_data = await api.api.version()
await m.answer( await m.answer(
......
from telegrinder import Dispatch, Message, CallbackQuery from telegrinder import Dispatch, Message, CallbackQuery
from telegrinder.rules import Command, PayloadEqRule, Text from telegrinder.rules import Command, PayloadEqRule, Text, IsUser
from api import api from api import api
from api.models import BugzillaInfoModel from api.models import BugzillaInfoModel
...@@ -7,8 +7,10 @@ from api.models import BugzillaInfoModel ...@@ -7,8 +7,10 @@ from api.models import BugzillaInfoModel
from services.menu import send_menu from services.menu import send_menu
from database.models import User from database.models import User
dp = Dispatch() dp = Dispatch()
dp.message.auto_rules = IsUser()
@dp.message(Command("profile") | Text(["profile", "профиль"], ignore_case=True)) @dp.message(Command("profile") | Text(["profile", "профиль"], ignore_case=True))
async def profile_handler(m: Message, user: User | None) -> None: async def profile_handler(m: Message, user: User | None) -> None:
......
from telegrinder import MESSAGE_FROM_USER, Dispatch, Message, WaiterMachine from telegrinder import MESSAGE_FROM_USER, Dispatch, Message, WaiterMachine
from telegrinder.rules import StartCommand, HasText from telegrinder.rules import StartCommand, HasText, IsUser
from database.func import DB from database.func import DB
from database.models import User from database.models import User
...@@ -7,11 +7,14 @@ from database.models import User ...@@ -7,11 +7,14 @@ from database.models import User
from data.keyboards import start_keyboards from data.keyboards import start_keyboards
from api import api from api import api
from services.menu import send_menu
from config import DEFAUIL_BRANCHES from config import DEFAUIL_BRANCHES
dp = Dispatch() dp = Dispatch()
wm = WaiterMachine(dp) wm = WaiterMachine(dp)
dp.message.auto_rules = IsUser()
@dp.message(StartCommand()) @dp.message(StartCommand())
async def start_handler(m: Message, user: User | None) -> None: async def start_handler(m: Message, user: User | None) -> None:
...@@ -63,3 +66,4 @@ async def start_handler(m: Message, user: User | None) -> None: ...@@ -63,3 +66,4 @@ async def start_handler(m: Message, user: User | None) -> None:
maintainer, maintainer,
branch branch
) )
await send_menu(m, user)
from telegrinder import MESSAGE_FROM_USER, Dispatch, Message, WaiterMachine, CallbackQuery
from telegrinder.rules import Command, PayloadEqRule, Text, IsUser
from datetime import datetime
import locale
from api import api
from services.menu import send_menu
from database.models import User
dp = Dispatch()
wm = WaiterMachine(dp)
@dp.message(Command("statistics"))
@dp.message(Text(["statistics", "статистика"], ignore_case=True), IsUser())
async def profile_handler(m: Message, user: User | None) -> None:
statistics_data = (await api.packageset.repository_statistics(user.default_branch)).branches[0]
locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')
statistics_date = (datetime.fromisoformat(
statistics_data.date_update)).strftime("%-d %B %Y г.")
statistics_message = f"{statistics_data.branch.capitalize()} ({statistics_date})\n\n"
for packages in statistics_data.packages_count:
statistics_message += f"Архитектура: {packages.arch} ({packages.component})\n"
statistics_message += f"Пакеты: {packages.count} - {packages.size_hr}\n\n"
await m.answer(
statistics_message
)
@dp.callback_query(PayloadEqRule("command/menu"), IsUser())
async def menu_handler(cb: CallbackQuery, user: User | None):
send_menu(cb, user)
@dp.message(Command(["menu", "меню"]) | Text(["меню", "menu"]), IsUser())
async def menu_handler(m: Message, user: User | None):
await send_menu(m, user)
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