diff --git a/src/consts.py b/src/consts.py index f75de4e..937952f 100644 --- a/src/consts.py +++ b/src/consts.py @@ -165,8 +165,6 @@ class PlainTextUserAction(Enum): GET_TASKS_REPORT__ENTER_LIST_NUMBER = "get_tasks_report__list_number" GET_TASKS_REPORT__ENTER_INTRO = "get_tasks_report__introduction" GET_TASKS_REPORT__CHOOSE_IF_FILL_LABELS = "get_tasks_report__fill_labels" - GET_RUBRICS__CHOOSE_RUBRIC = "GET_RUBRICS__CHOOSE_RUBRIC" - # /manage_reminders items MANAGE_REMINDERS__CHOOSE_ACTION = "manage_reminders__action" MANAGE_REMINDERS__ENTER_CHAT_ID = "manage_reminders__chat_id" diff --git a/src/jobs/__init__.py b/src/jobs/__init__.py index 6132692..69afde1 100644 --- a/src/jobs/__init__.py +++ b/src/jobs/__init__.py @@ -25,4 +25,3 @@ from .shrug_job import ShrugJob from .site_health_check_job import SiteHealthCheckJob from .tg_analytics_report_job import TgAnalyticsReportJob -from .trello_get_articles_rubric_job import TrelloGetArticlesRubricJob diff --git a/src/jobs/trello_get_articles_rubric_job.py b/src/jobs/trello_get_articles_rubric_job.py deleted file mode 100644 index 890990e..0000000 --- a/src/jobs/trello_get_articles_rubric_job.py +++ /dev/null @@ -1,92 +0,0 @@ -from typing import Callable, List - -from ..app_context import AppContext -from ..consts import BoardListAlias -from ..planka.planka_client import PlankaClient -from ..strings import load -from ..tg.sender import pretty_send -from . import utils -from .base_job import BaseJob - - -class TrelloGetArticlesRubricJob(BaseJob): - """ - kwargs has to be set in job config. - kwargs required: spreadsheet_key, template_string - kwargs optional: - - sheet_name (required if it's not the first tab) - - name (for readability and logs) - """ - - @staticmethod - def _execute( - app_context: AppContext, - send: Callable[[str], None], - called_from_handler=False, - *args, - **kwargs, - ): - paragraphs = [] - if called_from_handler: - if len(args) == 0: - send("Please type in rubric name after get_articles_rubric") - return - else: - rubric_name = args[0] - else: - rubric_name = kwargs["rubric_name"] - paragraphs.append(load("rubric_report_job__intro", rubric=rubric_name)) - - for alias in BoardListAlias: - if alias not in [ - BoardListAlias.BACK_BURNER, - BoardListAlias.PUBLISH_DONE_11, - ]: - paragraphs += TrelloGetArticlesRubricJob._get_rubric_paragraphs( - planka_client=app_context.planka_client, - rubric_title=load(alias.value), - rubric_alias=alias, - rubric_name=rubric_name, - ) - - pretty_send(paragraphs, send) - - @staticmethod - def _format_card(card, planka_client: PlankaClient) -> str: - card_fields = planka_client.get_custom_fields(card.id) - return load( - "rubric_report_job__card", - date=card.due.strftime("%d.%m").lower() if card.due else "", - url=card.url, - name=card.name, - authors=utils.format_possibly_plural( - load("common_role__author"), card_fields.authors - ), - ) - - def _get_rubric_paragraphs( - planka_client: PlankaClient, - rubric_title: str, - rubric_alias: str, - rubric_name: str, - ) -> List[str]: - list_ids = planka_client.get_list_id_from_aliases([rubric_alias]) - cards = planka_client.get_cards(list_ids) - cards_filtered = [ - card - for card in cards - if rubric_name in [label.name for label in card.labels] - ] - - paragraphs = [ - load( - "common_report__list_title_and_size", - title=rubric_title, - length=len(cards_filtered), - ) - ] - for card in cards_filtered: - paragraphs.append( - TrelloGetArticlesRubricJob._format_card(card, planka_client) - ) - return paragraphs diff --git a/src/tg/handler_registry.py b/src/tg/handler_registry.py index 7ce6dfb..f05fadf 100644 --- a/src/tg/handler_registry.py +++ b/src/tg/handler_registry.py @@ -98,22 +98,6 @@ class HandlerConfig: direct_only=True, description="получить список задач из Planka", ), - HandlerConfig( - command="get_rubrics", - category=CommandCategories.MOST_USED, - access_level="manager", - handler_func=handlers.get_rubrics, - direct_only=True, - description="получить рубрики из доски Редакция", - ), - HandlerConfig( - command="get_articles_rubric", - category=CommandCategories.DEBUG, - access_level="manager", - job_name="trello_get_articles_rubric_job", - job_type="manager_reply", - description="получить карточки по названию рубрики в трелло", - ), HandlerConfig( command="get_chat_id", category=CommandCategories.MOST_USED, diff --git a/src/tg/handlers/__init__.py b/src/tg/handlers/__init__.py index b816d6c..862584c 100644 --- a/src/tg/handlers/__init__.py +++ b/src/tg/handlers/__init__.py @@ -21,7 +21,6 @@ from .get_managers_handler import get_managers # Admin (developer) handlers -from .get_rubrics_handler import get_rubrics from .get_tasks_report_handler import get_tasks_report_planka from .help_handler import help from .list_chats_handler import list_chats diff --git a/src/tg/handlers/flow_handlers.py b/src/tg/handlers/flow_handlers.py index d4bb7e8..1eccde2 100644 --- a/src/tg/handlers/flow_handlers.py +++ b/src/tg/handlers/flow_handlers.py @@ -10,9 +10,7 @@ from ...app_context import AppContext from ...consts import ( ButtonValues, - GetTasksReportData, PlainTextUserAction, - BoardListAlias, ) from ...db.db_client import DBClient from ...db.db_objects import Reminder @@ -23,19 +21,6 @@ logger = logging.getLogger(__name__) -SECTIONS = [ - ("Идеи для статей", BoardListAlias.TOPIC_SUGGESTION_1), - ("Готовая тема", BoardListAlias.TOPIC_READY_2), - ("Уже пишу", BoardListAlias.DRAFT_N_PROGRESS_3, True), - ("Передано на редактуру", BoardListAlias.DRAFT_COMPLETED_4), - ("На редактуре", BoardListAlias.PENDING_EDITOR_5), - ("Проверка качества SEO", BoardListAlias.PENDING_SEO_EDITOR_6), - ("Отредактировано", BoardListAlias.APPROVED_EDITOR_7), - ("Отобрано на финальную проверку", BoardListAlias.PENDING_CHIEF_EDITOR_8), - ("Отобрано для публикации", BoardListAlias.PUBLISH_BACKLOG_9), - ("Готово для вёрстки", BoardListAlias.PUBLISH_IN_PROGRESS_10), -] - def handle_stateless_message(update, tg_context): """ @@ -110,117 +95,6 @@ def handle(self) -> Optional[PlainTextUserAction]: raise NotImplementedError -def _generate_rubric_summary(update, rubric_name: str) -> None: - try: - app_context = AppContext() - pc = app_context.planka_client - labels = pc.get_labels() - rubric_label = next( - ( - lbl - for lbl in labels - if lbl.name.strip().lower() == rubric_name.strip().lower() - ), - None, - ) - if not rubric_label: - logger.warning( - f"_generate_rubric_summary: Рубрика не найдена: {rubric_name}" - ) - reply( - load( - "rubric_not_found", - rubric_name=rubric_name, - ), - update, - ) - return - - try: - lists = pc.get_lists() - except Exception as e: - logger.error( - f"_generate_rubric_summary: не удалось получить lists: {e}", - exc_info=True, - ) - reply(load("failed_get_board_lists"), update) - return - - message_parts = [ - load( - "rubric_report_job__intro", - rubric=rubric_name, - ) - ] - - had_errors = False - - for column_name, alias, *meta_flag in SECTIONS: - need_meta = bool(meta_flag and meta_flag[0]) - heading = load(alias.value) - target_list = next( - (lst for lst in lists if lst.name.strip().startswith(column_name)), None - ) - - if not target_list: - message_parts.append(f"{heading} (0)") - message_parts.append("") - continue - - try: - cards = pc.get_cards(list_ids=[target_list.id]) - except Exception: - had_errors = True - message_parts.append(f"{heading} (0)") - message_parts.append("") - continue - - filtered = [ - card - for card in cards - if any(lbl.id == rubric_label.id for lbl in card.labels) - ] - - filtered.sort(key=lambda c: c.due or datetime.max) - - count = len(filtered) - message_parts.append(f"{heading} ({count})") - - if not filtered: - message_parts.append("(пусто)") - else: - for card in filtered: - link = f'{card.name}' - if need_meta: - due_str = ( - card.due.strftime("%d.%m.%Y") if card.due else "без срока" - ) - try: - fields = pc.get_custom_fields(card.id) - authors = ( - ", ".join(fields.authors) - if fields.authors - else "неизвестно" - ) - except Exception: - authors = "неизвестно" - message_parts.append(f"- {link}") - message_parts.append(f" • Дедлайн: {due_str}") - message_parts.append(f" • Автор: {authors}") - else: - message_parts.append(f"- {link}") - - message_parts.append("") - - if had_errors: - message_parts.append(load("partial_data_error ")) - - reply("\n".join(message_parts), update, parse_mode="HTML") - - except Exception: - reply(load("failed_try_later"), update) - - def _show_reminder_edit_options( reminder: Reminder, update: telegram.Update, command_data: dict ): @@ -312,32 +186,6 @@ def _handle_task_report_helper(command_data, add_labels, update): return None -class GetRubricsChooseRubricHandler(BaseUserMessageHandler): - def handle(self) -> Optional[PlainTextUserAction]: - try: - idx = int(self.user_input) - 1 - rubrics = self.command_data.get( - GetTasksReportData.LISTS - ) or self.tg_context.chat_data.get("available_rubrics", []) - if not (0 <= idx < len(rubrics)): - raise ValueError - except Exception: - reply( - load( - "invalid_rubric_number", - max=len(rubrics), - ), - self.update, - ) - return PlainTextUserAction.GET_RUBRICS__CHOOSE_RUBRIC - - selected = rubrics[idx] - _generate_rubric_summary(self.update, selected) - - self.tg_context.chat_data.pop(consts.LAST_ACTIONABLE_COMMAND, None) - return None - - class GetTasksReportEnterBoardNumberHandler(BaseUserMessageHandler): def handle(self) -> Optional[PlainTextUserAction]: planka_client = PlankaClient() diff --git a/src/tg/handlers/get_rubrics_handler.py b/src/tg/handlers/get_rubrics_handler.py deleted file mode 100644 index b48bc84..0000000 --- a/src/tg/handlers/get_rubrics_handler.py +++ /dev/null @@ -1,63 +0,0 @@ -import logging -from telegram import Update -from telegram.ext import CallbackContext - -from src.strings import load - -from ... import consts -from ...app_context import AppContext -from ...consts import PlainTextUserAction -from .utils import manager_only, direct_message_only, reply - -logger = logging.getLogger(__name__) - -EXCLUDED_LOAD_KEYS = [ - "common_report__section_title_proofreading", - "common_report_illustration", - "common_report_proposed_illustration", - "common_report_telegram", -] - -TASK_NAME = "get_rubrics" - - -@manager_only -@direct_message_only -def get_rubrics(update: Update, tg_context: CallbackContext) -> None: - logger.info("get_rubrics: start") - app_context = AppContext() - - excluded_rubrics = {load(key) for key in EXCLUDED_LOAD_KEYS} - try: - labels = app_context.planka_client.get_labels() - filtered = [ - lbl.name - for lbl in labels - if lbl.name and lbl.name.lower() not in excluded_rubrics - ] - filtered.sort() - logger.info("get_rubrics: %d rubrics after filter", len(filtered)) - - if not filtered: - reply(load("rubrics_not_found"), update) - return - - cmd_data = { - consts.GetTasksReportData.LISTS: filtered, - consts.NEXT_ACTION: PlainTextUserAction.GET_RUBRICS__CHOOSE_RUBRIC.value, - } - tg_context.chat_data[TASK_NAME] = cmd_data - tg_context.chat_data[consts.LAST_ACTIONABLE_COMMAND] = TASK_NAME - logger.info( - "get_rubrics: saved command_data and LAST_ACTIONABLE_COMMAND=%s", TASK_NAME - ) - - # Show list - rubric_list = "\n".join(f"{i + 1}) {name}" for i, name in enumerate(filtered)) - message = load("get_rubric_number") + "\n" + rubric_list - reply(message, update) - logger.info("get_rubrics: sent rubric list to user") - - except Exception as e: - logger.error("get_rubrics: error %s", e, exc_info=True) - reply(load("failed_get_rubrics_list"), update) diff --git a/src/tg/handlers/user_message_handler.py b/src/tg/handlers/user_message_handler.py index f144b10..8fc849b 100644 --- a/src/tg/handlers/user_message_handler.py +++ b/src/tg/handlers/user_message_handler.py @@ -23,7 +23,6 @@ def handle_callback_query( ACTION_HANDLERS = { - PlainTextUserAction.GET_RUBRICS__CHOOSE_RUBRIC: flow_handlers.GetRubricsChooseRubricHandler, PlainTextUserAction.GET_TASKS_REPORT__ENTER_BOARD_NUMBER: flow_handlers.GetTasksReportEnterBoardNumberHandler, PlainTextUserAction.GET_TASKS_REPORT__ENTER_LIST_NUMBER: flow_handlers.GetTasksReportEnterListNumberHandler, PlainTextUserAction.GET_TASKS_REPORT__ENTER_INTRO: flow_handlers.GetTasksReportEnterIntroHandler,