예제 #1
0
def select_record(phonebook: pb.Phonebook,
                  multiple_choice=False,
                  index=False,
                  firstname_lastname=False,
                  firstname=False,
                  lastname=False,
                  phone=False,
                  birthday=False) -> rec.SetRecords or None:
    """
    Нахождение набора записей по любому количеству полей. В начале функции составляется меню полей исходя из входных
    параметров, а также добавляются нужные функции для ввода пользователем данных. Затем, согласно выбору пользователя,
    происходит ввод данных и нахождение и вывод нужного набора записей из данной телефонной книги. В случае успешной
    работы функции выводится набор записей (rec.SetRecords), иначе None.

    :param phonebook: данная телефонная книга, в которой происходит поиск нужного набора (pb.Phonebook)
    :param multiple_choice: флаг о типе выбора полей записи пользователем, множественный или однозначный
    (несколько полей или одно), (bool)
    :param index: флаг о выводе индекса в меню выбора (bool)
    :param firstname_lastname: флаг о выводе и имени, и фамилии в меню выбора (bool)
    :param firstname: флаг о выводе только имени в меню выбора (bool)
    :param lastname: флаг о выводе фамилии в меню выбора (bool)
    :param phone: флаг о выводе телефона в меню выбора (bool)
    :param birthday: флаг о выводе даты рожедения в меню выбора (bool)
    :return: если без ошибок, то rec.SetRecords, иначе None
    """
    func_for_input = []
    k = 0
    menu = "You can select a record by the following criteria. "
    if multiple_choice:
        menu += "So, enter number or numbers of field:\n"

    else:
        menu += "So, enter number of field:\n"

    if index:
        menu += f"[{k}] select by index\n"
        func_for_input.append(("index", lambda: get_index(phonebook.get_amount_of_records())))
        k += 1

    if firstname_lastname:
        menu += f"[{k}] select by firstname and lastname\n"
        func_for_input.append(("firstname_lastname", getting_f_l_name))
        k += 1

    if firstname:
        menu += f"[{k}] select by firstname\n"
        func_for_input.append(("firstname", get_firstname))
        k += 1

    if lastname:
        menu += f"[{k}] select by lastname\n"
        func_for_input.append(("lastname", get_lastname))
        k += 1

    if phone:
        menu += f"[{k}] select by phone\n"
        func_for_input.append(("phone", get_phone))
        k += 1

    if birthday:
        menu += f"[{k}] select by birthday\n"
        func_for_input.append(("birthday", get_birthday))
        k += 1

    menu += f"[{k}] cancel\n"

    print(menu)

    if not multiple_choice:
        choice, err = get_unambiguous_choice(k)
        if err:
            return

        field, func = func_for_input[choice]
        if field == "index":
            print(phonebook)

            in_index, err = func()
            if err:
                return

            record = phonebook[in_index]
            if record is None:
                return

            return rec.SetRecords([record])

        if field == "firstname_lastname":
            firstname, lastname = func()
            if firstname is None or lastname is None:
                return

            comparator = f"x.firstname == '{firstname}' and x.lastname == '{lastname}'"
            set_records = phonebook.get_records(comparator=lambda x: eval(comparator))

            if set_records is None:
                return

            return set_records

        data, err = func()
        if err:
            return

        comparator = f"x.{field} == '{data}'"
        set_records = phonebook.get_records(comparator=lambda x: eval(comparator))
        if set_records is None:
            return

        return set_records

    else:
        choices, err = get_multiple_choice(k)
        if err:
            return

        requests = []

        for choice in choices:
            field, func = func_for_input[choice]
            data, err = func()
            if err:
                return

            comparator = f"x.{field} == '{data}'"
            requests.append(comparator)

        set_records = phonebook.get_records(comparator=lambda x: eval(" and ".join(requests)))
        if set_records is None:
            return

        return set_records