gde polimorfizm

mail@pastecode.io avatar
unknown
python
a year ago
8.4 kB
2
Indexable
Never
import enum  # Библиотека для создания enum()
import time  # Библиотека для работы со временем
import pickle  # Библиотека для сохранения и загрузки


class FileManager:  # Класс отвечающий за сохранение и загрузку данных в память программы
    path = "saveload.txt"

    try:  # Если файла нет, создаем его
        open(path, "r")
    except FileNotFoundError:
        open(path, "w+")

    def save(self, list_of_tasks):  # Метод сохраняющий данные
        file = open(self.path, "wb")
        pickle.dump(list_of_tasks, file)

    def load(self):  # Метод загружающий в память сохраненные данные
        file = open(self.path, "rb")

        try:  # Проверка на то, не пустой ли файл
            return pickle.load(file)
        except EOFError:
            return list()


class Operation(enum.Enum):  # Содержит в себе имена команд, устанавливает четкое соответствие между номером команды и именем
    addTask = 1
    viewTask = 2
    viewListOfTasks = 3
    deleteTask = 4
    findTask = 5
    exit = 6

    def __str__(self):
        title = ""
        match self:
            case Operation.addTask:
                title = "Создать задачу"
            case Operation.viewTask:
                title = "Посмотреть задачу"
            case Operation.viewListOfTasks:
                title = "Посмотреть список задач"
            case Operation.deleteTask:
                title = "Удалить задачу"
            case Operation.findTask:
                title = "Найти задачу"
            case Operation.exit:
                title = "Выйти из программы"

        return f"{self.value}. {title}"


class Task:  # Класс задач, содержит в себе структуру задачи
    def __init__(self, heading, body, date, tags):
        self.heading = heading
        self.body = body
        self.date = date
        self.tags = tags

    # Выводит информацию о задаче
    def print_task(self, number_of_task):  # Метод для вывода полной информации о задаче
        print("\nЗадача №" + str(number_of_task))
        print("Заголовок: " + self.heading)
        print("Задача: " + self.body)
        print("Дата дедлайна: " + time.strftime("%H:%M %d/%m/%Y", self.date))
        print("Теги: " + ", ".join(self.tags))

    def print_short_task(self, number_of_task):  # Метод для вывода краткой информации о задаче
        print("\nЗадача №" + str(number_of_task))
        print("Заголовок: " + self.heading)
        print("Дата дедлайна: " + time.strftime("%H:%M %d/%m/%Y", self.date))


class Menu:  # Класс отвечающий за вывод меню в командную строку
    options = [Operation.addTask, Operation.viewTask, Operation.viewListOfTasks, Operation.deleteTask,
               Operation.findTask, Operation.exit]

    def print_menu(self):
        print("")
        for option in self.options:
            print(option)


class ToDoList:  # Класс содержащий основную логику программы
    def __init__(self, list_of_tasks):
        self.list_of_tasks = list_of_tasks

    def get_date(self):  # Метод отвечающий за получение даты в корректном формате
        date = ""
        while date == "":
            date = input("Дата (hh:mm dd/mm/yyyy): ")
            try:
                date = time.strptime(date, "%H:%M %d/%m/%Y")

            except ValueError:
                print("Неверная дата, повторите попытку")
                date = ""

        return date

    def get_operation(self):  # Метод отвечающий за получение команд от пользователя
        try:
            operation = Operation(int(input("\nДействие: ")))
            return operation

        except ValueError:

            print("Такого пункта меню не существует")

    def add_task(self):  # Метод позволяющий создавать задачи
        task_heading = input("Введите заголовок задачи: ")
        task_description = input("Введите задачу: ")
        task_date = self.get_date()
        task_tags = []
        tag = input("Вводите теги, когда закончите - нажмите Enter: ")

        while tag != "":
            task_tags.append(tag)
            tag = input("Введите тег: ")

        task = Task(task_heading, task_description, task_date, task_tags)
        self.list_of_tasks.append(task)
        file_manager.save(self.list_of_tasks)

    def delete_task(self):  # Метод позволяющий удалять задачи
        try:
            task_number = int(input("Введите номер задачи: "))
            if task_number > len(self.list_of_tasks) or task_number < 1:
                print("\nЗадача с таким номером не обнаружена")
            else:
                self.list_of_tasks.pop(task_number - 1)
                file_manager.save(self.list_of_tasks)
                print("\nЗадача №" + str(task_number) + " удалена")
        except ValueError:
            print("\nЗадача с таким номером не обнаружена")

    def view_task(self):  # Метод выводящий задачу

        try:
            number_of_task = int(input("Введите номер задачи: "))

            if number_of_task > 0:

                self.list_of_tasks[number_of_task - 1].print_task(number_of_task)

            else:
                print("\nЗадача с таким номером не обнаружена.")
        except (IndexError, ValueError):
            print("\nЗадача с таким номером не обнаружена.")

    def view_list_of_task(self):  # Метод выводящий весь список задач

        if len(self.list_of_tasks) == 0:
            print("Задач нет.")

        else:
            for task_number in range(len(self.list_of_tasks)):
                self.list_of_tasks[task_number].print_short_task(task_number + 1)

    def find_task(self):  # Метод осуществляющий поиск задачи по тегу
        if len(self.list_of_tasks) < 1:
            print("\nУ вас нет ни одной задачи")
        else:
            tag_to_find = input("Введите тег: ")

            for i in range(len(self.list_of_tasks)):

                if tag_to_find in self.list_of_tasks[i].tags:
                    self.list_of_tasks[i].print_task(i + 1)
                    break

            else:
                print("\nЗадачи с таким тегом не обнаружено")


operation = None
file_manager = FileManager()
to_do_list = ToDoList([])
my_menu = Menu()
to_do_list.list_of_tasks = file_manager.load()

while operation != Operation.exit:
    my_menu.print_menu()
    operation = to_do_list.get_operation()  # Получение номера операции

    # Создание задачи
    if operation == Operation.addTask:
        to_do_list.add_task()

    # Просмотр задачи
    if operation == Operation.viewTask:
        to_do_list.view_task()

    # Просмотр списка задач
    if operation == Operation.viewListOfTasks:
        to_do_list.view_list_of_task()

    # Удаление задачи
    if operation == Operation.deleteTask:
        to_do_list.delete_task()

    # Поиск задачи
    if operation == Operation.findTask:
        to_do_list.find_task()
print("Выход из программы")