"""
Модуль управления вопросами.
Реализует сервисный слой для работы с вопросами, обеспечивая
изоляцию хендлеров от структуры данных вопросов.
Classes:
Questionary: Основной класс для управления вопросами
Methods:
get_section_questions: Получение вопросов раздела
get_section_description: Получение описания раздела
get_random_question: Получение случайного вопроса
get_themes: Получение списка тем раздела
get_all_sections: Получение всех разделов
"""
import random
from typing import Dict, List, Optional
from .questions_data import (
QUESTIONS_SELF_KNOWLEDGE, QUESTIONS_VECTOR, QUESTIONS_CHALLENGES,
QUESTIONS_ENVIRONMENT, QUESTIONS_INTEGRATION, QUESTIONS_MEMORIES
)
[документация]
class Questionary:
"""
Класс для управления вопросами с возможностью dependency injection.
Предоставляет интерфейс для доступа к вопросам, разбитым по разделам и темам.
Реализует паттерн dependency injection для изоляции обработчиков от логики работы с вопросами.
Attributes
----------
sections : Dict[str, Dict[str, List[str]]]
Словарь разделов, тем и списков вопросов
section_descriptions : Dict[str, str]
Словарь описаний разделов
"""
[документация]
def __init__(self):
self.sections: Dict[str, Dict[str, List[str]]] = {}
self.section_descriptions: Dict[str, str] = {}
self._load_questions()
[документация]
def _load_questions(self) -> None:
"""
Загружает все вопросы из модуля questions_data в память.
Инициализирует структуры данных sections и section_descriptions,
добавляя категорию "Случайный вопрос" в каждый раздел.
"""
# Основные разделы вопросов
self.sections = {
"Самопознание: Кто Я?": QUESTIONS_SELF_KNOWLEDGE,
"Вектор: Куда я движусь?": QUESTIONS_VECTOR,
"Вызовы: Что мне мешает?": QUESTIONS_CHALLENGES,
"Окружение: Мои отношения?": QUESTIONS_ENVIRONMENT,
"Интеграция: Как я живу?": QUESTIONS_INTEGRATION,
"Капсула Времени: История для моих детей": QUESTIONS_MEMORIES
}
# Описания разделов
self.section_descriptions = {
"Самопознание: Кто Я?": "Самопознание: Кто Я? - это вопросы, помогающие понять свою личность, ценности и убеждения",
"Вектор: Куда я движусь?": "Вектор: Куда я движусь? - вопросы о целях, мечтах и направлении жизни",
"Вызовы: Что мне мешает?": "Вызовы: Что мне мещается? - вопросы о трудностях, страхах и ограничениях",
"Окружение: Мои отношения?": "Окружение: Мои отношения? - вопросы о взаимодействии с людьми и социальной среде",
"Интеграция: Как я живу?": "Интеграция: Как я живу? - вопросы о повседневной жизни, привычках и ритуалах",
"Капсула Времени: История для моих детей": "Капсула Времени: История для моих детей - это то, что мы можем оставить себе будущему и потомкам"
}
# Добавляем пункт "Случайный вопрос" в каждый раздел
for section_name, questions_dict in self.sections.items():
questions_dict["Случайный вопрос"] = []
for theme_questions in questions_dict.values():
if isinstance(theme_questions, list):
questions_dict["Случайный вопрос"].extend(theme_questions)
[документация]
def get_section_questions(self, section_name: str) -> Optional[Dict[str, List[str]]]:
"""
Возвращает словарь тем и вопросов для указанного раздела.
Parameters
----------
section_name : str
Название раздела
Returns
-------
Optional[Dict[str, List[str]]]
Словарь {тема: список_вопросов} или None если раздел не найден
"""
return self.sections.get(section_name)
[документация]
def get_section_description(self, section_name: str) -> str:
"""
Возвращает описание указанного раздела.
Parameters
----------
section_name : str
Название раздела
Returns
-------
str
Описание раздела или пустая строка если раздел не найден
"""
return self.section_descriptions.get(section_name, "")
[документация]
def get_random_question(self, section_name: str, theme: Optional[str] = None) -> Optional[str]:
"""
Возвращает случайный вопрос из указанного раздела и/или темы.
Parameters
----------
section_name : str
Название раздела
theme : Optional[str], optional
Название темы, по умолчанию None (случайный вопрос из всего раздела)
Returns
-------
Optional[str]
Случайный вопрос или None если вопросы не найдены
"""
questions_dict = self.get_section_questions(section_name)
if not questions_dict:
return None
if theme and theme in questions_dict:
return random.choice(questions_dict[theme])
elif "Случайный вопрос" in questions_dict and questions_dict["Случайный вопрос"]:
return random.choice(questions_dict["Случайный вопрос"])
else:
# Если нет специальной категории, выбираем из всех вопросов раздела
all_questions = []
for theme_questions in questions_dict.values():
if isinstance(theme_questions, list):
all_questions.extend(theme_questions)
return random.choice(all_questions) if all_questions else None
[документация]
def get_themes(self, section_name: str) -> List[str]:
"""
Возвращает список тем для указанного раздела.
Исключает категорию "Случайный вопрос" из результата.
Parameters
----------
section_name : str
Название раздела
Returns
-------
List[str]
Список названий тем
"""
questions_dict = self.get_section_questions(section_name)
if not questions_dict:
return []
return [key for key in questions_dict.keys() if key != "Случайный вопрос"]
[документация]
def get_all_sections(self) -> List[str]:
"""
Возвращает список всех доступных разделов.
Returns
-------
List[str]
Список названий разделов
"""
return list(self.sections.keys())