コード例 #1
0
ファイル: main.py プロジェクト: AndreyBakurskii/IAD_minor
def get_persons_birth_within_month(phonebook: pb.Phonebook) -> rec.SetRecords:
    """
    Вывод таблицы с записями, у которых день рождения в ближайший месяц.

    :param phonebook: телефонная книга, в которой происходит поиск нужных записей (pb.Phonebook)
    :return: набор найденых записей (rec.SetRecords)
    """
    records = phonebook.get_records(comparator=None)
    result = []

    today = date.today()
    after_month = today + timedelta(days=30)

    for record in records:
        if record.birthday_date:

            person_date = date(day=record.birthday_date.day, month=record.birthday_date.month, year=today.year)

            if today.year != after_month.year:
                if person_date.month == 1:
                    person_date = date(day=record.birthday_date.day, month=record.birthday_date.month,
                                       year=after_month.year)

            if today <= person_date <= after_month:
                result.append(record)

    return rec.SetRecords(result)
コード例 #2
0
ファイル: main.py プロジェクト: AndreyBakurskii/IAD_minor
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