Exemple #1
0
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()