示例#1
0
 def Add_section(self):
     """Метод добавления нового отдела"""
     os.system("clear")
     # Проверка на заполненность списка отделов
     if self._count < self._size:
         # Добавление первого отдела
         if self._count == 0:
             section_name = ""
             # Ввод названия отдела
             while not section_name.isalpha():
                 os.system("clear")
                 section_name = input("Введите название отдела: ")
             new_section = Section(section_name)
             self._section.Set_right(new_section)
             self._count += 1
         # Добавление 2-го и более отдела
         else:
             search = ""
             # Поиск отдела
             while not search.isalpha():
                 os.system("clear")
                 print("Поиск отдела до или после которого хотите добавить")
                 search = input("Название отдела: ")
             choice = 0
             # Выбор добавления до или после
             while choice != 1 and choice != 2:
                 # Защита от ввода букв
                 try:
                     print("1 - добавить до\n2 - добавить после")
                     choice = int(input("Ваш ответ: "))
                 except ValueError:
                     os.system("clear")
                     print("Ошибка! Введите число 1 или 2")
             finded_section = self.Check_add_section(search, choice)
             # Отдел найден
             if finded_section != False:
                 new_name = ""
                 # Ввод названия нового отдела
                 while not new_name.isalpha():
                     new_name = input("Введите название отдела: ")
                 new_section = Section(new_name)
                 new_section.Set_right(finded_section.Get_right())
                 finded_section.Set_right(new_section)
                 self._count += 1
             # Отдел не найден
             else:
                 print("Отдел не найден!")
     # Список заполнен
     else:
         print("Количество отделов заполнено")
示例#2
0
class Content:
    """
    Класс представляет из себя организацию
    В классе реализован однонаправленный статический список отделов
    Размер списка задаётся при заупске программы
    Методы вызываются из главного меню
    """

    def __init__(self, name, size):
        """Инициализация Организации
        Параметры функции:
            - name - название организации
            - size - количество отделов
        Свойства:
            _name - название организации
            _size - максимальное количество отделов
            _section - ссылка на список отделов
            _count - количество добавленных отделов"""
        self._name = name
        self._size = size
        self._section = Section("start")
        self._count = 0

    def __del__(self):
        """Деструктор
        Удаляет все отделы и зануляет инф. поля объекта"""
        self._name = None
        # Проход по всем отделам и их удаление
        while self._section != None:
            section = self._section
            self._section = self._section.Get_right()
            del section
        self._count = None
        self._size = None

    def Search_section(self):
        """Поиск отдела"""
        # Проверка на наличие отделов
        # Отделы существуют
        if self._count > 0:
            search = ""
            # Ввод названия отдела для поиска
            while not search.isalpha():
                print("Поиск отдела")
                search = input("Название отдела: ")
            find_section = self.Check_add_section(search, 2)
            # Проверка на наличие нахождения отдела
            if find_section != False:
                print("Отдел с таким названием найден!")
                print("\t"+find_section.Get_name())
            # Отдел не найден
            else:
                print("Отдел не найден!")
        # Список отделов пуст
        else:
            print("Отделы не добавлены!")

    def Search_worker(self):
        """Поиск сотрудника в отделе"""
        worker_section = ""
        # Ввод названия отдела в котором ищется сотрудник
        while not worker_section.isalpha():
            print("Поиск сотрудника в Отделе")
            worker_section = input("Название отдела: ")
        find_section = self.Check_add_section(worker_section, 2)
        # Отдел найден, вызывается функция поиска сотрудника внутри отдела
        if find_section != False:
            find_section.Search_worker()
        # Отдел не найден
        else:
            print("Отдел не найден!")


    def Save_to_file(self):
        """Сохранение в файл
        Вызывает метод сохранения в файл"""
        self._section.Get_right().Save_to_file(self._section.Get_right())

    def All_dell(self):
        """Удаление всех отделов и сотрудников"""
        section = self._section.Get_right()
        # Проход по всем отделам и их удаление
        while section != None:
            deleting_section = section
            section = section.Get_right()
            del deleting_section
        self._count = 0

    def Download_from_file(self):
        """Загрузка из файла"""
        self.All_dell()
        section = self._section
        # Обработчик исключений
        try:
            new_line = ""
            # Открытие файла data.txt на чтение
            with open("data.txt", "r") as f:
                # Проход по строкам файла
                while True:
                    new_line = f.readline()
                    new_line = new_line.strip(" \n")
                    # Если строка пуста, то завершается загрузка из файла
                    if len(new_line) == 0:
                        break
                    # Строка содержит метку отдела
                    if new_line == "Отдел:":
                        new_line = f.readline()
                        new_line = new_line.strip(" \n")
                        # проверка на наличие ошибок в названии отдела
                        if not new_line.isalpha():
                            print("Ошибка в названии отдела в файле!")
                            break
                        # Добавление отдела, если список не заполнен
                        if self._count < self._size:
                            new_section = Section(new_line)
                            section.Set_right(new_section)
                            section = new_section
                            self._count += 1
                        # Максимальное количество отделов заполнено
                        else:
                            print("Ошибка! Число отдедов превышено.")
                            break
                    # Строка содержит метку сотрудника
                    elif new_line == "Сотрудник:":
                        new_line = f.readline()
                        new_line = new_line.strip(" \n")
                        major_line = f.readline()
                        major_line = major_line.strip(" \n")
                        # Данные полей сотрудника имеют ошибки
                        if not new_line.isalpha() or not major_line.isalpha():
                            print("Ошибка в файле!В полях сотрудника должны быть только буквы!")
                            break
                        section.Download_add(new_line, major_line)
                    # Строка не равна ни одной метке
                    else:
                        print("Ошибка!")
        except FileNotFoundError:
            print("Файл не найден в данной директории!")

    def Delete_worker(self):
        """Метод удаление сотрудника из отдела"""
        worker_section = ""
        # Поиск отдела для удаления сотрудника
        while not worker_section.isalpha():
            print("Удаление сотрудника из Отдела")
            worker_section = input("Название отдела: ")
        find_section = self.Check_add_section(worker_section, 2)
        # Отдел найден
        if find_section != False:
            find_section.Delete_worker()
        # Отдел не найден
        else:
            print("Отдел не найден!")

    def Delete_section(self):
        """Метод удаления отдела"""
        os.system("clear")
        # Проверка на наличие отделов
        if self._count > 0:
            delete_name = ""
            # Ввод названия отдела
            while not delete_name.isalpha():
                print("Удаление отдела")
                delete_name = input("Название отдела: ")
            delete_section = self.Check_add_section(delete_name, 1)
            # Отдел найден
            if delete_section != False:
                remove_section = delete_section.Get_right()
                # Последний отдел в списке
                if remove_section == None:
                    delete_section.Set_right(None)
                    del remove_section
                    self._count -= 1
                # Не последний отдел
                else:
                    delete_section.Set_right(remove_section.Get_right())
                    del remove_section
                    self._count -= 1
            # Отдел не найден
            else:
                print("Отдел не найден!")

    def Add_section(self):
        """Метод добавления нового отдела"""
        os.system("clear")
        # Проверка на заполненность списка отделов
        if self._count < self._size:
            # Добавление первого отдела
            if self._count == 0:
                section_name = ""
                # Ввод названия отдела
                while not section_name.isalpha():
                    os.system("clear")
                    section_name = input("Введите название отдела: ")
                new_section = Section(section_name)
                self._section.Set_right(new_section)
                self._count += 1
            # Добавление 2-го и более отдела
            else:
                search = ""
                # Поиск отдела
                while not search.isalpha():
                    os.system("clear")
                    print("Поиск отдела до или после которого хотите добавить")
                    search = input("Название отдела: ")
                choice = 0
                # Выбор добавления до или после
                while choice != 1 and choice != 2:
                    # Защита от ввода букв
                    try:
                        print("1 - добавить до\n2 - добавить после")
                        choice = int(input("Ваш ответ: "))
                    except ValueError:
                        os.system("clear")
                        print("Ошибка! Введите число 1 или 2")
                finded_section = self.Check_add_section(search, choice)
                # Отдел найден
                if finded_section != False:
                    new_name = ""
                    # Ввод названия нового отдела
                    while not new_name.isalpha():
                        new_name = input("Введите название отдела: ")
                    new_section = Section(new_name)
                    new_section.Set_right(finded_section.Get_right())
                    finded_section.Set_right(new_section)
                    self._count += 1
                # Отдел не найден
                else:
                    print("Отдел не найден!")
        # Список заполнен
        else:
            print("Количество отделов заполнено")

    def Check_add_section(self, name, choice):
        """Метод проверки наличия отдела в списке
        В случае нахождения отдела возращает данный отдел или предыдущий отдел
        name - название отдела для поиска
        choice - выбор"""
        search_section = self._section.Get_right()
        # Добавление до
        if choice == 1:
            last_section = self._section
            # Проход по списку отделов
            while search_section != None:
                # Поиск нашел соответсвие
                # Возвращает предыдущий отдел
                if search_section.Get_name() == name:
                    return last_section
                last_section = last_section.Get_right()
                search_section = search_section.Get_right()
        # Добавление после
        if choice == 2:
            # Проход по списку отделов
            while search_section != None:
                # Поиск нашел соответсвие
                # Возвращает найденный отдел
                if search_section.Get_name() == name:
                    return search_section
                search_section = search_section.Get_right()
        # Отдел не найден
        # Возвращается False
        return False

    def Add_worker(self):
        """Метод добавления сотрудника"""
        worker_section = ""
        # Ввод названия отдела для поиска
        while not worker_section.isalpha():
            print("Добавление сотрудника в Отдел")
            worker_section = input("Название отдела: ")
        find_section = self.Check_add_section(worker_section, 2)
        # Отдел найден - добавления сотрудника
        if find_section != False:
            find_section.Add_worker()
        # Отдел не найден
        else:
            print("Отдел не найден!")

    def Show(self):
        """Метод вывода на консоль всей структуры данных"""
        print("\t\t\t\tОрганизация: "+self._name)
        # Проверка на наличие отделов
        if self._count > 0:
            show_section = self._section.Get_right()
            # Вывод на консоль всех отделов и сотрудников
            while show_section != None:
                print("\t\t\tОтдел: "+show_section.Get_name())
                show_section.Show_worker()
                show_section = show_section.Get_right()
        input("Для продолжения нажмите enter...")
        os.system("clear")