def edit_meeting( session, meeting, calendarobj, fas_user, meeting_name, meeting_date, meeting_date_end, meeting_time_start, meeting_time_stop, comanager, meeting_information, meeting_region, tzone, recursion_frequency, recursion_ends, remind_when, remind_who, full_day, edit_all_meeting=True, admin=False): """ When a user wants to edit a meeting to the database, we need to perform a number of test first checking that the input is valid and then edit the desired meeting. """ if not is_user_managing_in_calendar( session, calendarobj.calendar_name, fas_user) and not admin: raise UserNotAllowed( 'You are not allowed to add a meeting to this calendar') if not meeting_date_end: meeting_date_end = meeting_date if full_day: meeting_time_start = time(0, 0) meeting_time_stop = time(0, 0) tzone = 'UTC' meeting_time_start = convert_time( datetime(meeting_date.year, meeting_date.month, meeting_date.day, meeting_time_start.hour, meeting_time_start.minute), tzone, 'UTC') meeting_time_stop = convert_time( datetime(meeting_date_end.year, meeting_date_end.month, meeting_date_end.day, meeting_time_stop.hour, meeting_time_stop.minute), tzone, 'UTC') if not is_date_in_future(meeting_date, meeting_time_start): raise InvalidMeeting('The date you entered is in the past') if meeting_time_start.date() > meeting_time_stop.date(): raise InvalidMeeting( 'The start date of your meeting is later than the stop date.') if meeting_time_start > meeting_time_stop: raise InvalidMeeting( 'The start time of your meeting is later than the stop time.') if full_day: meeting_time_stop = meeting_time_stop + timedelta(days=1) if recursion_frequency and recursion_ends: agenda_free = agenda_is_free_in_future( session, calendarobj, meeting_time_start.date(), meeting_time_stop.date(), recursion_ends, meeting_time_start.time(), meeting_time_stop.time(), meeting_id = meeting.meeting_id) if not bool(calendarobj.calendar_multiple_meetings) and \ not agenda_free: raise InvalidMeeting( 'The start or end time you have entered is already ' 'occupied in the future.') ## The information are correct ## What we do now: # a) the meeting is not recursive -> edit the information as provided # b) the meeting is recursive and we update all the meetings # -> recursion_end = today # -> copy meeting to new object # -> update new object # c) the meeting is recursive and the update only one meeting # -> recursion_end = today # -> copy meeting to new object w/o recursion # -> update new object # -> copy meeting to new object w/ recursion and date = date + offset remove_recursion = False if meeting.recursion_frequency: old_meeting = Meeting.copy(meeting) old_meeting.recursion_ends = meeting_date - timedelta(days=1) if old_meeting.recursion_ends > old_meeting.meeting_date: old_meeting.save(session) if not edit_all_meeting: remove_recursion = True new_meeting = Meeting.copy(meeting) new_meeting.meeting_date = meeting_date + timedelta( days=meeting.recursion_frequency) dt_start = datetime( new_meeting.meeting_date.year, new_meeting.meeting_date.month, new_meeting.meeting_date.day, new_meeting.meeting_time_start.hour, new_meeting.meeting_time_start.minute, tzinfo=pytz.utc) dt_stop = datetime( new_meeting.meeting_date_end.year, new_meeting.meeting_date_end.month, new_meeting.meeting_date_end.day, new_meeting.meeting_time_start.hour, new_meeting.meeting_time_start.minute, tzinfo=pytz.utc) free_time = agenda_is_free( session, calendarobj, dt_start, dt_stop) if not bool(calendarobj.calendar_multiple_meetings) and \ bool(free_time): new_meeting.save(session) meeting.meeting_name = meeting_name meeting.meeting_manager = '%s,' % fas_user.username if comanager: meeting.meeting_manager = '%s%s,' % (meeting.meeting_manager, comanager) meeting.meeting_date = meeting_time_start.date() meeting.meeting_date_end = meeting_time_stop.date() meeting.meeting_time_start = meeting_time_start.time() meeting.meeting_time_stop = meeting_time_stop.time() meeting.meeting_information = meeting_information region = meeting_region if not region: region = None meeting.meeting_region = region recursion_frequency = recursion_frequency if not recursion_frequency: recursion_frequency = None meeting.recursion_frequency = recursion_frequency if not recursion_ends: recursion_ends = date(2025, 12, 31) meeting.recursion_ends = recursion_ends if remind_when and remind_who: if meeting.reminder_id: meeting.reminder.reminder_offset = remind_when meeting.reminder.reminder_to = remind_who meeting.reminder.save(session) else: reminder = Reminder(remind_when, remind_who, None) reminder.save(session) session.flush() meeting.reminder = reminder session.flush() elif meeting.reminder_id: meeting.reminder.delete(session) meeting.reminder_id = None if remove_recursion: meeting.recursion_frequency = None meeting.recursion_ends = None meeting.save(session) session.commit()