chat_moderator_bot/templates/moderation.py
2024-07-17 23:35:45 +03:00

458 lines
15 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime
import logging
from aiogram.fsm.state import StatesGroup, State
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, FSInputFile
from aiogram.utils.keyboard import InlineKeyboardBuilder
from config import FILES_PATH, ROLE_MODERATOR_ID, ROLE_CURATOR_ID
from core import bot
from utils.bitrix import notify
from utils.db import get_data, query
class ModerationState(StatesGroup):
confirm = State()
confirm_confirm = State()
revision = State()
grade = State()
reject = State()
check_revision_comment = State()
check_reject_comment = State()
date = State()
new_idea_text = """
{name}, пожалуйста, ознакомьтесь с новой НеоИдеей.
"""
new_idea_data_text = """
<b>Автор:</b> {author_name}
<b>Дата:</b> {creation_date}
<b>Подразделение:</b> {department}
<b>Категория:</b> {category}
<b>Город:</b> {city}
<b>Название:</b> «{idea_name}»
<b>Содержание:</b> {idea_content}
"""
choose_action_text = """
Пожалуйста, выберите одно из следующих действий:
"""
confirm_action_text = """
<b>Вы согласовываете НеоИдею:</b>
«{idea_name}».
<b>Автор:</b> {author_name}
"""
choose_responsible_text = """
Пожалуйста, выберите <b>Ответственного за категорию</b> для передачи НеоИдеи в работу.
"""
send_date_text = """
В календаре укажите крайние сроки выполнения:
"""
confirm_responsible_date_text = """
Вы передаёте НеоИдею в работу.
<b>Название:</b> «{idea_name}».
<b>Автор:</b> {author_name}
<b>Ответственный за категорию:</b> {responsible_name}
<b>Крайние сроки выполнения:</b> {date}
"""
confirm_action_send_text = """
Спасибо! Вы передали НеоИдею в работу.
"""
revision_action_text = """
<b>Вы возвращаете на доработку НеоИдею:</b>
«{idea_name}».
<b>Автор:</b> {author_name}
Оставьте комментарий для того, чтобы отправить НеоИдею на доработку.
"""
send_revision_comment_text = """
Оставьте комментарий для того, чтобы отправить НеоИдею на доработку
"""
send_comment_text = """
Пожалуйста, оставьте свой комментарий:
"""
check_comment = """
Проверьте правильность введенных данных:
{comment}
"""
revision_action_send_text = """
Вы отправили НеоИдею на доработку.
"""
grade_action_text = """
<b>Вы направляете НеоИдею на оценку:</b>
«{idea_name}».
<b>Автор:</b> {author_name}
НеоИдея будет передана Куратору.
"""
grade_action_send_text = """
Спасибо! НеоИдея передана Куратору.
"""
reject_action_text = """
<b>Вы отклоняете НеоИдею:</b>
«{idea_name}».
<b>Автор:</b> {author_name}
Пожалуйста, оставьте свой комментарий.
"""
reject_action_send_text = """
Спасибо! НеоИдея отклонена.
"""
you_rejected = """
Здравствуйте, {name}.
Ваша НеоИдея "{idea_name}" была отклонена с комментарием:
"{comment}"
"""
you_revision = """
Ваша НеоИдея возвращена на доработку, пожалуйста проработайте комментарии от генерального директора и отправьте заявку заново.
НеоИдея: "{idea_name}"
Комментарий: "{comment}"
"""
accept_notify_author_text = """
Поздравляем! Ваша НеоИдея передана к внедрению
"""
accept_notify_curator_text = """
Быстрая НеоИдея автора {author_name} передана к внедрению {responsible_name}
"""
grade_curator_text = """
Вам на оценку передана НеоИдея "{idea_name}".
"""
confirm_notify_curator_text = """
Быстрая НеоИдея автора {author_name} передана к ответственному за категорию {responsible_name}
"""
confirm_notify_author_text = """
Ваша НеоИдея передана ответственному за категорию
"""
def confirm_action_ikb() -> InlineKeyboardMarkup:
"""
-Да, продолжить ✅
-Нет, вернуться назад ❌
:return: объект клавиатуры для параметра reply_markup
"""
builder = InlineKeyboardBuilder()
builder.add(
InlineKeyboardButton(
text='Да, продолжить ✅',
callback_data='confirm_action_confirm'
),
InlineKeyboardButton(
text='Нет, вернуться назад ❌',
callback_data='confirm_action_reject'
)
)
builder.adjust(1)
return builder.as_markup()
def choose_action_ikb(idea_id: str | int, msg_id: str | int) -> InlineKeyboardMarkup:
"""
-Согласовать и передать в работу
-Вернуть Автору на доработку
-Направить на оценку
-Отклонить
:param idea_id: ID идеи
:param msg_id: ID сообщения с клавиатурой
:return: объект клавиатуры для параметра reply_markup
"""
builder = InlineKeyboardBuilder()
builder.add(
InlineKeyboardButton(
text='Согласовать и передать в работу',
callback_data=f'moderation_confirm_{idea_id}_{msg_id}'
),
InlineKeyboardButton(
text='Вернуть Автору на доработку',
callback_data=f'moderation_revision_{idea_id}_{msg_id}'
),
InlineKeyboardButton(
text='Направить на оценку',
callback_data=f'moderation_grade_{idea_id}_{msg_id}'
),
InlineKeyboardButton(
text='Отклонить',
callback_data=f'moderation_reject_{idea_id}_{msg_id}'
)
)
builder.adjust(1)
return builder.as_markup()
async def choose_responsible_ikb(category_id: int) -> InlineKeyboardMarkup:
"""
-Ответственный 1
-Ответственный 2
:param category_id: ID категории идеи
:return: объект клавиатуры для параметра reply_markup
"""
builder = InlineKeyboardBuilder()
responsible_list = await get_data(
table_name='user_to_categories',
query_filter={'category_id': category_id}
)
for responsible in responsible_list:
responsible_data = await get_data(
table_name='users',
query_filter={'id': responsible['user_id']}
)
builder.add(
InlineKeyboardButton(
text=responsible_data[0]['full_name'],
callback_data=f'choose_responsible_{responsible_data[0]["id"]}',
)
)
builder.adjust(1)
return builder.as_markup()
async def send_new_idea_on_moderation(
idea_id: int, user_name: str, department: str, idea_title: str,
idea_content: str, relation_id: int, city_id: int, category_id: int, creation_date: datetime.datetime):
"""
Присылает новую идею модераторам из списка
:param idea_id: Данные идеи
:param user_name: Имя пользователя
:param department: Отдел пользователя
:param idea_title: Название идеи
:param idea_content: Описание идеи
:param relation_id: id отношения к идее
:param city_id: id города, где работает пользователь
:param category_id: id категории
:param creation_date: Дата создания идеи
:return:
"""
moderators = await get_data(
table_name='user_to_roles',
query_filter={'role_id': ROLE_MODERATOR_ID}
)
city = await get_data(
table_name='cities',
query_filter={'id': city_id}
)
files = await get_data(
table_name='idea_to_files',
query_filter={'idea_id': idea_id}
)
category = await get_data(
table_name='categories',
query_filter={'id': category_id}
)
notify_text = new_idea_data_text.format(
author_name=user_name,
creation_date=creation_date,
department=department,
idea_name=idea_title,
idea_content=idea_content,
city=city[0]['name'],
category=category[0]['name']
)
for moderator_id in moderators:
try:
moderator = await get_data(
table_name='users',
query_filter={'id': moderator_id['user_id']}
)
formatted_new_idea_text = new_idea_text.format(
name=moderator[0]['full_name'],
)
await bot.send_message(
chat_id=moderator[0]['telegram_id'],
text=formatted_new_idea_text
)
await bot.send_message(
chat_id=moderator[0]['telegram_id'],
text=notify_text
)
for file in files:
file_data = await get_data(
table_name='files',
query_filter={'id': file['file_id']}
)
await bot.send_document(
chat_id=moderator[0]['telegram_id'],
document=FSInputFile(FILES_PATH + file_data[0]['file'])
)
last_msg = await bot.send_message(
chat_id=moderator[0]['telegram_id'],
text=choose_action_text,
reply_markup=choose_action_ikb(
idea_id=idea_id,
msg_id=0
)
)
await bot.edit_message_reply_markup(
message_id=last_msg.message_id,
chat_id=moderator[0]['telegram_id'],
reply_markup=choose_action_ikb(
idea_id=idea_id,
msg_id=last_msg.message_id
)
)
moderator_user_data = await get_data(
table_name='users',
query_filter={'id': moderator_id['user_id']}
)
await notify(
user_id=moderator_user_data[0]['external_id'],
message='Новая быстрая НеоИдея!'
)
except Exception as e:
logging.error(e)
curators = await get_data(
table_name='user_to_roles',
query_filter={'role_id': ROLE_CURATOR_ID}
)
for curator in curators:
try:
user_data = await get_data(
table_name='users',
query_filter={'id': curator['user_id']}
)
await notify(
user_id=user_data[0]['external_id'],
message='Новая быстрая НеоИдея!'
)
except Exception as e:
logging.error(f'не могу отправить уведомление куратору о новой идее {e}')
async def accept_notify(author_name: str, responsible_id: str, author_id: int) -> None:
"""
Уведомляет куратора и автора о принятии идеи
:param responsible_id: ID кому передают идею
:param author_name: Имя автора идеи
:param author_id: ID автора
:return:
"""
responsible_data = await get_data(
table_name='users',
query_filter={'id': responsible_id}
)
notify_text = notify_curator_text.format(
author_name=author_name,
responsible_name=responsible_data[0]['full_name']
)
curators = await get_data(
table_name='user_to_roles',
query_filter={'role_id': ROLE_CURATOR_ID}
)
for curator in curators:
try:
user_data = await get_data(
table_name='users',
query_filter={'id': curator['user_id']}
)
await notify(
user_id=user_data[0]['external_id'],
message=notify_text
)
await bot.send_message(
chat_id=user_data[0]['telegram_id'],
text=notify_text
)
except Exception as e:
logging.error(f'не могу отправить уведомление куратору о принятии идеи {e}')
try:
author_data = await get_data(
table_name='users',
query_filter={'id': author_id}
)
await notify(
user_id=author_data[0]['external_id'],
message=notify_author_text
)
await bot.send_message(
chat_id=author_data[0]['telegram_id'],
text=notify_author_text
)
except Exception as e:
logging.error(f'Не смог отправить уведомление автору идеи {e}')
async def confirm_notify(author_name: str, responsible_id: str, author_id: int) -> None:
"""
Уведомляет куратора и автора о согласовании идеи
:param responsible_id: ID кому передают идею
:param author_name: Имя автора идеи
:param author_id: ID автора
:return:
"""
responsible_data = await get_data(
table_name='users',
query_filter={'id': responsible_id}
)
notify_text = confirm_notify_curator_text.format(
author_name=author_name,
responsible_name=responsible_data[0]['full_name']
)
curators = await get_data(
table_name='user_to_roles',
query_filter={'role_id': ROLE_CURATOR_ID}
)
for curator in curators:
try:
user_data = await get_data(
table_name='users',
query_filter={'id': curator['user_id']}
)
await notify(
user_id=user_data[0]['external_id'],
message=notify_text
)
await bot.send_message(
chat_id=user_data[0]['telegram_id'],
text=notify_text
)
except Exception as e:
logging.error(f'не могу отправить уведомление куратору о принятии идеи {e}')
try:
author_data = await get_data(
table_name='users',
query_filter={'id': author_id}
)
await notify(
user_id=author_data[0]['external_id'],
message=notify_author_text
)
await bot.send_message(
chat_id=author_data[0]['telegram_id'],
text=notify_author_text
)
except Exception as e:
logging.error(f'Не смог отправить уведомление автору идеи {e}')