Пример #1
0
    def refresh_room(self, vc_room, event):
        is_webinar = vc_room.data['meeting_type'] == 'webinar'
        zoom_meeting = fetch_zoom_meeting(vc_room, is_webinar=is_webinar)
        vc_room.name = zoom_meeting['topic']
        vc_room.data.update({
            'description':
            zoom_meeting.get('agenda', ''),
            'zoom_id':
            zoom_meeting['id'],
            'password':
            zoom_meeting['password'],
            'mute_host_video':
            zoom_meeting['settings']['host_video'],

            # these options will be empty for webinars
            'mute_audio':
            zoom_meeting['settings'].get('mute_upon_entry'),
            'mute_participant_video':
            not zoom_meeting['settings'].get('participant_video'),
            'waiting_room':
            zoom_meeting['settings'].get('waiting_room'),
            'alternative_hosts':
            process_alternative_hosts(
                zoom_meeting['settings'].get('alternative_hosts'))
        })
        vc_room.data.update(get_url_data_args(zoom_meeting['join_url']))
        flag_modified(vc_room, 'data')
Пример #2
0
    def update_room(self, vc_room, event):
        client = ZoomIndicoClient()
        is_webinar = vc_room.data['meeting_type'] == 'webinar'
        zoom_meeting = fetch_zoom_meeting(vc_room,
                                          client=client,
                                          is_webinar=is_webinar)
        changes = {}

        if vc_room.name != zoom_meeting['topic']:
            changes['topic'] = vc_room.name

        if vc_room.data['description'] != zoom_meeting.get('agenda', ''):
            changes['agenda'] = vc_room.data['description']

        if vc_room.data['password'] != zoom_meeting['password']:
            changes['password'] = vc_room.data['password']

        zoom_meeting_settings = zoom_meeting['settings']
        if vc_room.data['mute_host_video'] == zoom_meeting_settings[
                'host_video']:
            changes.setdefault(
                'settings',
                {})['host_video'] = not vc_room.data['mute_host_video']

        alternative_hosts = process_alternative_hosts(
            zoom_meeting_settings.get('alternative_hosts', ''))
        if vc_room.data['alternative_hosts'] != alternative_hosts:
            new_alt_host_emails = get_alt_host_emails(
                vc_room.data['alternative_hosts'])
            changes.setdefault(
                'settings',
                {})['alternative_hosts'] = ','.join(new_alt_host_emails)

        if not is_webinar:
            if vc_room.data['mute_audio'] != zoom_meeting_settings[
                    'mute_upon_entry']:
                changes.setdefault(
                    'settings',
                    {})['mute_upon_entry'] = vc_room.data['mute_audio']
            if vc_room.data['mute_participant_video'] == zoom_meeting_settings[
                    'participant_video']:
                changes.setdefault('settings',
                                   {})['participant_video'] = not vc_room.data[
                                       'mute_participant_video']
            if vc_room.data['waiting_room'] != zoom_meeting_settings[
                    'waiting_room']:
                changes.setdefault(
                    'settings',
                    {})['waiting_room'] = vc_room.data['waiting_room']

        if changes:
            update_zoom_meeting(vc_room.data['zoom_id'],
                                changes,
                                is_webinar=is_webinar)
            # always refresh meeting URL (it may have changed if password changed)
            zoom_meeting = fetch_zoom_meeting(vc_room,
                                              client=client,
                                              is_webinar=is_webinar)
            vc_room.data.update(get_url_data_args(zoom_meeting['join_url']))
Пример #3
0
    def create_room(self, vc_room, event):
        """Create a new Zoom room for an event, given a VC room.

        In order to create the Zoom room, the function will try to get
        a valid e-mail address for the user in question, which can be
        use with the Zoom API.

        :param vc_room: the VC room from which to create the Zoom room
        :param event: the event to the Zoom room will be attached
        """
        client = ZoomIndicoClient()
        host = principal_from_identifier(vc_room.data['host'])
        host_email = find_enterprise_email(host)

        # get the object that this booking is linked to
        vc_room_assoc = vc_room.events[0]
        link_obj = vc_room_assoc.link_object
        is_webinar = vc_room.data.setdefault('meeting_type',
                                             'regular') == 'webinar'
        scheduling_args = get_schedule_args(
            link_obj) if link_obj.start_dt else {}

        try:
            settings = {
                'host_video': not vc_room.data['mute_host_video'],
            }

            kwargs = {}
            if is_webinar:
                kwargs['type'] = (ZoomMeetingType.webinar
                                  if scheduling_args else
                                  ZoomMeetingType.recurring_webinar_no_time)
                settings['alternative_hosts'] = host_email
            else:
                kwargs = {
                    'type':
                    (ZoomMeetingType.scheduled_meeting if scheduling_args else
                     ZoomMeetingType.recurring_meeting_no_time),
                    'schedule_for':
                    host_email
                }
                settings.update({
                    'mute_upon_entry':
                    vc_room.data['mute_audio'],
                    'participant_video':
                    not vc_room.data['mute_participant_video'],
                    'waiting_room':
                    vc_room.data['waiting_room'],
                    'join_before_host':
                    self.settings.get('join_before_host'),
                })

            kwargs.update({
                'topic': vc_room.name,
                'agenda': vc_room.data['description'],
                'password': vc_room.data['password'],
                'timezone': event.timezone,
                'settings': settings
            })
            kwargs.update(scheduling_args)
            if is_webinar:
                meeting_obj = client.create_webinar(host_email, **kwargs)
            else:
                meeting_obj = client.create_meeting(host_email, **kwargs)
        except HTTPError as e:
            self.logger.exception('Error creating Zoom Room: %s',
                                  e.response.content)
            raise VCRoomError(
                _('Could not create the room in Zoom. Please contact support if the error persists'
                  ))

        vc_room.data.update({
            'zoom_id':
            str(meeting_obj['id']),
            'start_url':
            meeting_obj['start_url'],
            'host':
            host.identifier,
            'alternative_hosts':
            process_alternative_hosts(meeting_obj['settings'].get(
                'alternative_hosts', ''))
        })
        vc_room.data.update(get_url_data_args(meeting_obj['join_url']))
        flag_modified(vc_room, 'data')

        # e-mail Host URL to meeting host
        if self.settings.get('send_host_url'):
            notify_host_start_url(vc_room)