Добавлены новые методы для получения статистики постов пользователей, информации о последних постах и количестве банов. Обновлены запросы в репозиториях для сортировки пользователей по дате бана. Исправлены вызовы функций форматирования сообщений для администраторов. Обновлены тесты для проверки новых функциональностей.

This commit is contained in:
2026-02-28 21:30:08 +03:00
parent e2a6944ed8
commit 694cf1c106
18 changed files with 1296 additions and 144 deletions

View File

@@ -545,3 +545,67 @@ class PostRepository(DatabaseConnection):
texts = [row[0] for row in rows if row[0]]
self.logger.info(f"Получено {len(texts)} отклоненных постов для обучения")
return texts
async def get_user_posts_stats(self, user_id: int) -> Tuple[int, int, int]:
"""
Получает статистику постов пользователя.
Args:
user_id: ID пользователя
Returns:
Tuple (approved_count, declined_count, suggest_count)
"""
query = """
SELECT
SUM(CASE WHEN status = 'approved' THEN 1 ELSE 0 END) as approved,
SUM(CASE WHEN status = 'declined' THEN 1 ELSE 0 END) as declined,
SUM(CASE WHEN status = 'suggest' THEN 1 ELSE 0 END) as suggest
FROM post_from_telegram_suggest
WHERE author_id = ? AND text != '^'
"""
rows = await self._execute_query_with_result(query, (user_id,))
row = rows[0] if rows else None
if row:
approved = row[0] or 0
declined = row[1] or 0
suggest = row[2] or 0
self.logger.info(
f"Статистика постов для user_id={user_id}: "
f"approved={approved}, declined={declined}, suggest={suggest}"
)
return (approved, declined, suggest)
return (0, 0, 0)
async def get_last_post_by_author(self, user_id: int) -> Optional[str]:
"""
Получает текст последнего поста пользователя.
Args:
user_id: ID пользователя
Returns:
Текст последнего поста или None, если постов нет
"""
query = """
SELECT text FROM post_from_telegram_suggest
WHERE author_id = ? AND text IS NOT NULL AND text != '' AND text != '^'
ORDER BY created_at DESC
LIMIT 1
"""
rows = await self._execute_query_with_result(query, (user_id,))
row = rows[0] if rows else None
if row:
text = row[0]
self.logger.info(
f"Последний пост для user_id={user_id}: '{text[:50]}...'"
if len(text) > 50
else f"Последний пост для user_id={user_id}: '{text}'"
)
return text
self.logger.info(f"Постов для user_id={user_id} не найдено")
return None