Запрос 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))
Надеюсь, что это поможет кому-то в будущем.