+
+
+ {{ vc_room.data.zoom_id }}
+
{% if vc_room.data.description %}
-
{% trans %}Description{% endtrans %}
-
{{ vc_room.data.description }}
+
+
+ {{ vc_room.data.description }}
+
{% endif %}
{% if host %}
-
{% trans %}Host{% endtrans %}
-
{{ (host|decodeprincipal).full_name }}
+
+
+ {{ (host|decodeprincipal).full_name }}
+
{% endif %}
{% if alt_hosts %}
-
- {% trans count=alt_hosts|length -%}
- Alternative host
- {%- pluralize -%}
- Alternative hosts
- {%- endtrans %}
-
-
+
+
{{ alt_hosts | map('decodeprincipal') | map(attribute='full_name') | join(', ') }}
-
+
{% endif %}
{% if passcode_visible %}
- {% trans %}Passcode{% endtrans %}
-
{{ vc_room.data.password }}
+
+
+ {{ vc_room.data.password }}
+
{% endif %}
{% if phone_link %}
-
- {% trans %}Useful links{% endtrans %}
-
-
+
{% endif %}
- {% trans %}Zoom URL{% endtrans %}
-
+
+
{{ clipboard_input(vc_room.data.url if passcode_visible else vc_room.data.public_url,
- name="vc-room-url-%s"|format(event_vc_room.id)) }}
-
-
+ name="vc-room-url-%s"|format(event_vc_room.id)) }}
+
+
diff --git a/vc_zoom/indico_vc_zoom/templates/management_buttons.html b/vc_zoom/indico_vc_zoom/templates/management_buttons.html
index 2ec6e31f1..4ef956c57 100644
--- a/vc_zoom/indico_vc_zoom/templates/management_buttons.html
+++ b/vc_zoom/indico_vc_zoom/templates/management_buttons.html
@@ -2,6 +2,5 @@
{% from 'vc_zoom:buttons.html' import render_join_button, render_make_me_owner %}
{% block buttons %}
- {{ render_join_button(vc_room, event_vc_room, extra_classes='icon-play') }}
- {{ render_make_me_owner(event_vc_room.event, vc_room, event_vc_room) }}
+ {{ render_join_button(vc_room, event_vc_room) }}
{% endblock %}
diff --git a/vc_zoom/indico_vc_zoom/templates/vc_room_timetable_buttons.html b/vc_zoom/indico_vc_zoom/templates/vc_room_timetable_buttons.html
index 67c79c18e..6f472367c 100644
--- a/vc_zoom/indico_vc_zoom/templates/vc_room_timetable_buttons.html
+++ b/vc_zoom/indico_vc_zoom/templates/vc_room_timetable_buttons.html
@@ -1,8 +1,7 @@
-{% extends 'vc/vc_room_timetable_buttons.html' %}
-{% from 'vc_zoom:buttons.html' import render_join_button, render_make_me_owner %}
+{% from 'vc_zoom:buttons.html' import render_join_button %}
+
{% set vc_room = event_vc_room.vc_room %}
-{% block buttons %}
- {{ render_join_button(vc_room, event_vc_room, "i-button-small event-service-right-button join-button") }}
- {{ render_make_me_owner(event, vc_room, event_vc_room, extra_classes="i-button-small") }}
-{% endblock %}
+{% call render_join_button(vc_room, event_vc_room, true) %}
+ {{ template_hook('event-timetable-vc-extra-buttons', event_vc_room=event_vc_room) }}
+{% endcall %}
diff --git a/vc_zoom/pyproject.toml b/vc_zoom/pyproject.toml
index 1877c215d..4c689c28e 100644
--- a/vc_zoom/pyproject.toml
+++ b/vc_zoom/pyproject.toml
@@ -2,7 +2,7 @@
name = 'indico-plugin-vc-zoom'
description = 'Zoom video-conferencing plugin for Indico'
readme = 'README.md'
-version = '3.3'
+version = '3.3.1'
license = 'MIT'
authors = [
{ name = 'Indico Team', email = 'indico-team@cern.ch' },
@@ -15,7 +15,7 @@ classifiers = [
'Programming Language :: Python :: 3.12',
]
requires-python = '>=3.12.2, <3.13'
-dependencies = ['indico>=3.3']
+dependencies = ['indico>=3.3.5.dev0']
[project.urls]
GitHub = 'https://github.com/indico/indico-plugins'
diff --git a/vc_zoom/tests/operation_test.py b/vc_zoom/tests/operation_test.py
index 62b73cbfa..b9257a39b 100644
--- a/vc_zoom/tests/operation_test.py
+++ b/vc_zoom/tests/operation_test.py
@@ -5,103 +5,38 @@
# them and/or modify them under the terms of the MIT License;
# see the LICENSE file for more details.
-import pytest
+from datetime import datetime
+from zoneinfo import ZoneInfo
-from indico.core.plugins import plugin_engine
-from indico.modules.vc.models.vc_rooms import VCRoom, VCRoomEventAssociation, VCRoomLinkType, VCRoomStatus
-from indico_vc_zoom.plugin import ZoomPlugin
+TZ = ZoneInfo('Europe/Zurich')
-@pytest.fixture
-def zoom_plugin(app):
- """Return a callable which lets you create dummy Zoom room occurrences."""
- plugin = ZoomPlugin(plugin_engine, app)
- plugin.settings.set('email_domains', 'megacorp.xyz')
- return plugin
-
-
-@pytest.fixture
-def create_meeting(create_user, dummy_event, db, zoom_plugin):
- def _create_meeting(name='New Room'):
- user_joe = create_user(1, email='don.orange@megacorp.xyz')
-
- vc_room = VCRoom(
- type='zoom',
- status=VCRoomStatus.created,
- name=name,
- created_by_id=0,
- data={
- 'description': 'something something',
- 'password': '1234',
- 'host': user_joe.identifier,
- 'meeting_type': 'meeting',
- 'mute_host_video': False,
- 'mute_audio': False,
- 'mute_participant_video': False,
- 'waiting_room': False
- }
- )
- VCRoomEventAssociation(linked_event=dummy_event, vc_room=vc_room, link_type=VCRoomLinkType.event, data={})
- db.session.flush()
- zoom_plugin.create_room(vc_room, dummy_event)
- return vc_room
- return _create_meeting
-
-
-@pytest.fixture
-def zoom_api(create_user, mocker):
- """Mock some Zoom API endpoints."""
- api_create_meeting = mocker.patch('indico_vc_zoom.plugin.ZoomIndicoClient.create_meeting')
- api_create_meeting.return_value = {
- 'id': '12345abc',
- 'join_url': 'https://example.com/kitties',
- 'start_url': 'https://example.com/puppies',
- 'password': '1234',
- 'host_id': 'don.orange@megacorp.xyz',
- 'topic': 'New Room',
- 'agenda': 'something something',
- 'settings': {
- 'host_video': True,
- 'mute_upon_entry': False,
- 'participant_video': True,
- 'waiting_room': False
- }
- }
-
- api_update_meeting = mocker.patch('indico_vc_zoom.plugin.ZoomIndicoClient.update_meeting')
- api_update_meeting.return_value = {}
-
- create_user(1, email='don.orange@megacorp.xyz')
-
- api_get_user = mocker.patch('indico_vc_zoom.plugin.ZoomIndicoClient.get_user')
- api_get_user.return_value = {
- 'id': '7890abcd',
- 'email': 'don.orange@megacorp.xyz'
- }
-
- api_get_meeting = mocker.patch('indico_vc_zoom.plugin.ZoomIndicoClient.get_meeting')
- api_get_meeting.return_value = api_create_meeting.return_value
-
- return {
- 'create_meeting': api_create_meeting,
- 'get_meeting': api_get_meeting,
- 'update_meeting': api_update_meeting,
- 'get_user': api_get_user
- }
-
-
-def test_room_creation(create_meeting, zoom_api):
- vc_room = create_meeting()
+def test_room_creation(create_zoom_meeting, zoom_api, create_event):
+ event = create_event(
+ creator=zoom_api['user'],
+ start_dt=datetime(2024, 3, 1, 16, 0, tzinfo=TZ),
+ end_dt=datetime(2024, 3, 1, 18, 0, tzinfo=TZ),
+ title='Test Event #1',
+ creator_has_privileges=True,
+ )
+ vc_room = create_zoom_meeting(event, 'event')
assert vc_room.data['url'] == 'https://example.com/kitties'
assert vc_room.data['host'] == 'User:1'
assert zoom_api['create_meeting'].called
-def test_password_change(create_user, mocker, create_meeting, zoom_plugin, zoom_api):
- create_user(2, email='joe.bidon@megacorp.xyz')
- vc_room = create_meeting()
- vc_room.data['password'] = '1337'
+def test_password_change(create_user, mocker, create_event, create_zoom_meeting, zoom_plugin, zoom_api):
+ event = create_event(
+ creator=zoom_api['user'],
+ start_dt=datetime(2024, 3, 1, 16, 0, tzinfo=TZ),
+ end_dt=datetime(2024, 3, 1, 18, 0, tzinfo=TZ),
+ title='Test Event #1',
+ creator_has_privileges=True,
+ )
+
+ vc_room = create_zoom_meeting(event, 'event')
+ vc_room.data['password'] = '12341234'
# simulate changes between calls of "GET meeting"
def _get_meeting(self, meeting_id):
@@ -109,14 +44,14 @@ def _get_meeting(self, meeting_id):
'id': meeting_id,
'join_url': 'https://example.com/llamas' if _get_meeting.called else 'https://example.com/kitties',
'start_url': 'https://example.com/puppies',
- 'password': '1337' if _get_meeting.called else '1234',
+ 'password': '12341234' if _get_meeting.called else '13371337',
'host_id': 'don.orange@megacorp.xyz',
- 'topic': 'New Room',
- 'agenda': 'something something',
+ 'topic': 'Zoom Meeting',
+ 'agenda': 'nothing to add',
'settings': {
- 'host_video': True,
- 'mute_upon_entry': False,
- 'participant_video': True,
+ 'host_video': False,
+ 'mute_upon_entry': True,
+ 'participant_video': False,
'waiting_room': False
}
}
@@ -127,9 +62,9 @@ def _get_meeting(self, meeting_id):
zoom_plugin.update_room(vc_room, vc_room.events[0].event)
- zoom_api['update_meeting'].assert_called_with('12345abc', {
- 'password': '1337'
+ zoom_api['update_meeting'].assert_called_with('zmeeting1', {
+ 'password': '12341234',
})
- assert vc_room.data['password'] == '1337'
+ assert vc_room.data['password'] == '12341234'
assert vc_room.data['url'] == 'https://example.com/llamas'