Не удается удалить элемент Календаря комнаты с кодом exchagelib

#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(), потому что, да, я знаю, как это выглядит глупо, но иногда (!) после возникновения этой ошибки элемент фактически удаляется. Это еще одна абракадабра. Простое удаление () вообще не приводит к фактическому удалению.