Загрузка данных



import operations
import classes


def ask_number(message):
    while True:
        text = input(message).strip()
        try:
            return int(text)
        except ValueError:
            print("Ошибка: нужно ввести целое число")


def ask_task_type():
    while True:
        task_type = input("Тип (feature/bug/passive): ").strip().lower()
        if task_type in ("feature", "bug", "passive"):
            return task_type
        print("Ошибка: тип должен быть feature, bug или passive")


def ask_priority():
    while True:
        priority = ask_number("Приоритет (1-5): ")
        if 1 <= priority <= 5:
            return priority
        print("Ошибка: приоритет должен быть от 1 до 5")


def ask_title():
    while True:
        title = input("Название задачи: ").strip()
        if title:
            return title
        print("Ошибка: название не может быть пустым")


def get_operation(*names):
    for name in names:
        function = getattr(operations, name, None)
        if function is not None:
            return function
    raise ValueError("Эта операция пока не найдена в operations.py")


def show_task(task):
    print("ID:", task.id, "| Название:", task.title, "| Приоритет:", task.priority, "| Статус:", task.status)


def show_user(user):
    print("ID:", user.id, "| Имя:", user.name, "| Грейд:", user.grade, "| Очки:", user.points)


def show_tasks(result):
    if not result:
        print("Задачи не найдены")
    for task in result:
        show_task(task)


def main():
    while True:
        print("\n=== ТРЕКЕР ЗАДАЧ ===")
        print("1. Создать участника")
        print("2. Создать задачу")
        print("3. Показать участников")
        print("4. Показать задачи")
        print("5. Показать участника")
        print("6. Показать задачу")
        print("7. Изменить задачу")
        print("8. Удалить задачу")
        print("9. Назначить исполнителя")
        print("10. Назначить проверяющего")
        print("11. Добавить зависимость")
        print("12. Убрать зависимость")
        print("13. Взять задачу в работу")
        print("14. Сдать на проверку")
        print("15. Вернуть на доработку")
        print("16. Принять задачу")
        print("17. Отменить задачу")
        print("18. Поиск и фильтр")
        print("19. Рейтинг участников")
        print("20. Оставшиеся часы")
        print("21. Статистика типов задач")
        print("22. Количество завершённых задач")
        print("0. Выход")

        choice = input("Выберите действие: ").strip()

        if choice == "0":
            print("До свидания!")
            break

        try:
            if choice == "1":
                name = input("Имя: ").strip()
                email = input("Email: ").strip()
                user = operations.create_user(name, email)
                print("Создан участник с ID:", user.id)

            elif choice == "2":
                task_type = ask_task_type()
                title = ask_title()
                priority = ask_priority()

                if task_type == "feature":
                    hours = ask_number("Количество часов: ")
                    task = operations.create_task(task_type, title, priority, hours=hours)
                elif task_type == "bug":
                    error = ask_number("Серьёзность ошибки: ")
                    task = operations.create_task(task_type, title, priority, error=error)
                else:
                    task = operations.create_task(task_type, title, priority)

                print("Создана задача с ID:", task.id)

            elif choice == "3":
                for user in operations.users:
                    show_user(user)

            elif choice == "4":
                show_tasks(operations.tasks)

            elif choice == "5":
                user_id = ask_number("ID участника: ")
                user = operations.get_user(user_id)
                show_user(user)
                print("Текущие задачи:")
                for task in operations.tasks:
                    if task.worker is user and task.status in ("в работе", "на проверке"):
                        show_task(task)

            elif choice == "6":
                task_id = ask_number("ID задачи: ")
                show_task(operations.get_task(task_id))

            elif choice == "7":
                task_id = ask_number("ID задачи: ")
                task = operations.get_task(task_id)
                print("1. Изменить название")
                print("2. Изменить приоритет")
                print("3. Изменить поле типа задачи")
                field = input("Что изменить: ").strip()

                if field == "1":
                    new_title = ask_title()
                    get_operation("change_task_title", "update_task_title")(task_id, new_title)
                elif field == "2":
                    new_priority = ask_priority()
                    get_operation("change_task_priority", "update_task_priority")(task_id, new_priority)
                elif field == "3":
                    if isinstance(task, classes.FeatureTask):
                        value = ask_number("Новые часы: ")
                    elif isinstance(task, classes.BugTask):
                        value = ask_number("Новая серьёзность: ")
                    else:
                        raise ValueError("У passive нет дополнительного поля")
                    get_operation("change_task_field", "update_task_field")(task_id, value)
                else:
                    raise ValueError("Неизвестный пункт")

                print("Изменение выполнено")

            elif choice == "8":
                task_id = ask_number("ID задачи: ")
                get_operation("delete_task", "remove_task")(task_id)
                print("Задача удалена")

            elif choice == "9":
                task_id = ask_number("ID задачи: ")
                user_id = ask_number("ID исполнителя: ")
                task = operations.get_task(task_id)
                user = operations.get_user(user_id)
                task.work_user(user)
                print("Исполнитель назначен")

            elif choice == "10":
                task_id = ask_number("ID задачи: ")
                user_id = ask_number("ID проверяющего: ")
                task = operations.get_task(task_id)
                user = operations.get_user(user_id)
                task.reviewer_user(user)
                print("Проверяющий назначен")

            elif choice == "11":
                task_id = ask_number("ID задачи: ")
                need_id = ask_number("ID задачи, от которой зависит: ")
                task = operations.get_task(task_id)
                need_task = operations.get_task(need_id)
                task.set_need_task(need_task)
                print("Зависимость установлена")

            elif choice == "12":
                task_id = ask_number("ID задачи: ")
                task = operations.get_task(task_id)
                task.remove_need_task()
                print("Зависимость убрана")

            elif choice == "13":
                task_id = ask_number("ID задачи: ")
                user_id = ask_number("ID исполнителя: ")
                task = operations.get_task(task_id)
                user = operations.get_user(user_id)
                operations.pick_up_task(task, user, operations.tasks)
                print("Задача взята в работу")

            elif choice == "14":
                task_id = ask_number("ID задачи: ")
                operations.send_to_review_byid(task_id)
                print("Задача отправлена на проверку")

            elif choice == "15":
                task_id = ask_number("ID задачи: ")
                get_operation("return_to_work_byid", "return_task_byid")(task_id)
                print("Задача возвращена на доработку")

            elif choice == "16":
                task_id = ask_number("ID задачи: ")
                operations.accept_task_byid(task_id)
                print("Задача принята")

            elif choice == "17":
                task_id = ask_number("ID задачи: ")
                operations.canel_task_byid(task_id)
                print("Задача отменена")

            elif choice == "18":
                title = input("Фрагмент названия (Enter — любое): ").strip()
                status = input("Статус (Enter — любой): ").strip()
                task_type = input("Тип feature/bug/passive (Enter — любой): ").strip().lower()

                if task_type and task_type not in ("feature", "bug", "passive"):
                    raise ValueError("Неизвестный тип задачи")

                result = operations.filter_tasks(title=title or None, status=status or None, task_type=task_type or None)
                show_tasks(result)

            elif choice == "19":
                rating = operations.get_user_rating()
                for user in rating:
                    show_user(user)

            elif choice == "20":
                print("Оставшиеся часы:", operations.get_remaining_hours())

            elif choice == "21":
                stats = operations.get_task_types_stats()
                for task_type, count in stats.items():
                    print(task_type, ":", count)

            elif choice == "22":
                user_id = ask_number("ID участника: ")
                print("Завершённых задач:", operations.count_complited_tasks(user_id))

            else:
                print("Ошибка: такого пункта меню нет")

        except (ValueError, TypeError, AttributeError, KeyError) as error:
            print("Ошибка:", error)


if __name__ == "__main__":
    main()