from loguru import logger import re from aiogram import types, Dispatcher from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters import Text from asyncpg import BitString from states.project import ProjectStates from services.repositories import Repos, ProjectRepo async def create_project(message: types.Message, state: FSMContext): await state.set_state(ProjectStates.set_fields) await message.reply( "Название проекта: Превращение песиков в котиков\n\n" "Описание: Наши цели прямы и понятны! Мы хотим написать" "алгоритм конвертации песиков в котиков.\n\n" "Создатель: @создатель\n\n" "Кол-во участников: 2 " "(пожалуйста напишите число участников не раскрывая личные данные)\n\n" "Статус: 1 (1 - проект ищет людей, 2 - в работе, " "3 - проект завершен, 0 - отменен)\n\n" "Теги: #python\n\n" "Категория: написание алгоритма" ) await message.reply( "Пожалуйста отправьте анкету вашего проекта по шаблону " "из сообщения выше (скопируйте сообщение и замените данные)" ) async def get_project_fields(message: types.Message, repo: Repos, state: FSMContext): # TODO: для тегов и категорий вытаскивать из таблиц индексы, # значением для creator должен быть user_id. field_patterns = { "Название проекта": str, "Описание": str, "Кол-во участников": int, "Статус": BitString, } field_values = [] for pattern, field_type in field_patterns.items(): try: field_values.append( field_type(re.findall(rf"(?<={pattern}: ).*", message.text)[0]) ) except IndexError: pass logger.debug(field_values) await state.reset_state() await repo.get_repo(ProjectRepo).add(*field_values) def register_projects_handlers(dp: Dispatcher): dp.register_message_handler(create_project, Text("Создать проект")) dp.register_message_handler(get_project_fields, state=ProjectStates.set_fields)