#exchangewebservices #exchangelib
#exchangewebservices #exchangelib
Вопрос:
Моя проблема выглядит странно. Exchange 2010 SP1. Код ищет конфликтующую запись в календаре комнаты и предполагает ее удаление. Код выглядит так:
#DELEGATE also doesn't work
roomAccount = Account(primary_smtp_address=room_mailbox, config=config,
autodiscover=False, access_type=IMPERSONATION)
items = roomAccount.calendar.filter(start__gt=now_with_past)
for item in items:
if (start_dt_ews != start_dt_remote or item.subject != remote_record_subject or duration != remote_record_duration):
has_conflicts = detect_conflicts(roomAccount, item)
if has_conflicts:
process_conflict(item, 'update_conflict')
remove_meeting_data(item, item.organizer)
continue
def detect_conflicts(roomAccount, item):
try:
has_conflicts = False
if item.conflicting_meeting_count > 0:
if item.start_dt != item.start:
has_conflicts = True
return has_conflicts
except Exception as e:
trace_back = traceback.format_exc()
log_str = "Error in process_service " str(e) " " str(trace_back)
Logger.error(log_str)
return False
def process_conflict(item, category):
if item.recurrence:
conflict_notify_and_delete(item, category, True)
else:
conflict_notify_and_delete(item, category, False)
Logger.error(item.subject " meeting conflict error.")
def conflict_notify_and_delete(item, category, serial):
send_email(item.organizer, category, (item.subject))
try:
if serial:
item.delete(affected_task_occurrences=ALL_OCCURRENCIES)
item.save()
else:
# doesn't work
item.delete(send_meeting_cancellations=SEND_TO_NONE,
affected_task_occurrences=ALL_OCCURRENCIES)
# or also doesn't work
item.delete()
# or raise trash folder absense error.
item.move_to_trash()
# or raise trash folder absense error again.
item.soft_delete()
#abrakadabra atempts with rescheduling and subsequent deletion raise
# "Set action is invalid for property. (field: FieldURI(field_uri='calendar:StartTimeZone'))" error
item.start = UTC_NOW() timedelta(days=6000)
item.save(update_fields=['start'])
item.delete()
Самый странный факт во всем этом — любая обработка delete () просто молчит — никаких ошибок, никаких исключений, все выглядит так, как будто все в порядке, хотя на самом деле ничего не удаляется или не изменяется.. Второй самый странный факт — иногда, но не каждый раз, когда я пытаюсь item.save() после item.delete() , он вызывает «AttributeError («Папка должна быть предоставлена в режиме только сохранения»)», но элемент может быть удален сразу. А может быть и нет :((
Эти странные вещи происходят только в части кода, обрабатывающего конфликтующие элементы календаря. Обработка неконфликтных элементов выполняется нормально — удаление и изменение в порядке.
У кого-нибудь есть идеи, что происходит и как окончательно удалить конфликтующую запись из календаря комнаты, не отменяя встречу из календаря организаторов — мы не хотим, чтобы пользователь потерял свой элемент и информацию внутри него? Я пытался найти в Google EWS настройки, которые могут вызвать такую странность, но безуспешно: (
Комментарии:
1. Если удаление завершается неудачно, это должно вызвать ошибку в EWS. Я не знаю, почему этого здесь не происходит, но exchangelib предполагает, что элемент удален, если он не получает сообщение об ошибке. Вот почему вы получаете сообщение об ошибке при вызове.save() после .delete() — exchangelib не позволяет сохранять элемент, который, по его мнению, удален.
2. Да, Эрик, это правда. Я иногда использую save(), потому что, да, я знаю, как это выглядит глупо, но иногда (!) после возникновения этой ошибки элемент фактически удаляется. Это еще одна абракадабра. Простое удаление () вообще не приводит к фактическому удалению.