Запрос LDAP по дате

Эта проблема:

Некоторые поля даты LDAP, такие как createTimestamp или же pwdChangedTime, хранятся в "обобщенном формате даты и времени":

{"createTimestamp": "20100226142156Z"}

Который содержит компоненты даты и времени внутри.

Вопрос:

Каков канонический способ запроса записей LDAP к определенной дате?

Пример использования: получить всех пользователей, созданных вчера.

1 ответ

Решение

Прежде всего, нам нужна многократно используемая функция для преобразования даты и времени в обобщенный формат времени:

def convert_datetime_to_generalized_time(dt):
    """Convert datetime object to generalized time format."""
    dt = dt.timetuple()
    gtime = str(dt.tm_year) + ''.join('0' * (2 - len(str(item))) + str(item)
                                      for item in (dt.tm_mon, dt.tm_mday, dt.tm_hour, dt.tm_min, dt.tm_sec))
    return gtime + 'Z'

Теперь нет прямого способа отфильтровать компонент даты обобщенной отметки времени. Идея состоит в том, чтобы спросить дату:

  • больше или равно дате с частью времени 00:00:00
  • меньше или равно дате с частью времени 23:59:59

Реализация:

import datetime

def get_ldap_date_range_query(dt):
    start_date = dt.replace(hour=0, minute=0, second=0)
    end_date = dt.replace(hour=23, minute=59, second=59)

    return "(&(createTimestamp>=%s)(createTimestamp<=%s))" % (convert_datetime_to_generalized_time(start_date),
                                                              convert_datetime_to_generalized_time(end_date))

print(get_ldap_date_range_query(datetime.datetime.now() - datetime.timedelta(days=1)))

Это напечатало бы запрос LDAP, который соответствовал бы всем пользователям, созданным вчера:

(&(createTimestamp>=20160604000000Z)(createTimestamp<=20160604235959Z))

Надеюсь, что это поможет кому-то в будущем.

Другие вопросы по тегам