Skip to content

Commit

Permalink
Merge pull request #12 from uw-it-aca/feaure/external-course-calls
Browse files Browse the repository at this point in the history
Feaure/external course calls
  • Loading branch information
mikeseibel authored Jun 12, 2024
2 parents 3e09be7 + bb6d3ca commit 33f0906
Show file tree
Hide file tree
Showing 11 changed files with 92 additions and 61 deletions.
3 changes: 3 additions & 0 deletions panopto_client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,9 @@ def _instance(self, namespace):
return self._api.factory.create(namespace)

def _request(self, methodName, params={}):
if 'auth' not in params:
params['auth'] = self.authentication_info()

try:
return self._data(methodName, params)
except WebFault as err:
Expand Down
5 changes: 0 additions & 5 deletions panopto_client/access.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,35 +21,30 @@ def access_role(self, role):

def getFolderAccessDetails(self, folder_id):
return self._request('GetFolderAccessDetails', {
'auth': self.authentication_info(),
'folderId': folder_id,
})

def grantUsersAccessToFolder(self, folder_id, user_ids, role):
return self._request('GrantUsersAccessToFolder', {
'auth': self.authentication_info(),
'folderId': folder_id,
'userIds': self.guid_list(ns='ns2:ArrayOfguid', guids=user_ids),
'role': self.access_role(role),
})

def revokeUsersAccessFromFolder(self, folder_id, user_ids, role):
return self._request('RevokeUsersAccessFromFolder', {
'auth': self.authentication_info(),
'folderId': folder_id,
'userIds': self.guid_list(ns='ns2:ArrayOfguid', guids=user_ids),
'role': self.access_role(role),
})

def getSessionAccessDetails(self, session_id):
return self._request('GetSessionAccessDetails', {
'auth': self.authentication_info(),
'sessionId': session_id
})

def updateSessionIsPublic(self, session_id, is_public):
return self._request('UpdateSessionIsPublic', {
'auth': self.authentication_info(),
'sessionId': session_id,
'isPublic': is_public
})
6 changes: 0 additions & 6 deletions panopto_client/remote_recorder.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,18 @@ def recorder_settings(self, recorder_id):

def getRemoteRecordersById(self, remote_recorder_id):
return self._request('GetRemoteRecordersById', {
'auth': self.authentication_info(),
'remoteRecorderIds': self.guid_list(
ns='ns4:ArrayOfguid', guids=[remote_recorder_id]),
})

def getRemoteRecordersByExternalId(self, external_id):
return self._request('GetRemoteRecordersByExternalId', {
'auth': self.authentication_info(),
'externalIds': self.parameter_list(params=[external_id]),
})

def scheduleRecording(self, name, folder_id, is_broadcast,
start_time, end_time, recorder_id):
return self._request('ScheduleRecording', {
'auth': self.authentication_info(),
'name': name,
'folderId': folder_id,
'isBroadcast': is_broadcast,
Expand All @@ -53,7 +50,6 @@ def listRecorders(self, sort_by='Name'):
self._set_page_number(page)

response = self._request('ListRecorders', {
'auth': self.authentication_info(),
'pagination': self.pagination(),
'sortBy': sort_by
})
Expand All @@ -69,7 +65,6 @@ def listRecorders(self, sort_by='Name'):

def updateRemoteRecorderExternalId(self, remote_recorder_id, external_id):
return self._request('UpdateRemoteRecorderExternalId', {
'auth': self.authentication_info(),
'externalId': external_id,
'remoteRecorderId': remote_recorder_id
})
Expand All @@ -78,7 +73,6 @@ def updateRemoteRecorderExternalId(self, remote_recorder_id, external_id):
# xs:dateTime start, xs:dateTime end)
def updateRecordingTime(self, session_id, start, end):
return self._request('UpdateRecordingTime', {
'auth': self.authentication_info(),
'sessionId': session_id,
'start': start,
'end': end
Expand Down
34 changes: 31 additions & 3 deletions panopto_client/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,19 @@ def __init__(self):
wsdl='SessionManagement.svc?wsdl',
port='BasicHttpBinding_ISessionManagement')

def getFoldersList(self, search_query='', sort_by='Name',
sort_increasing='true'):
def getFoldersList(
self, search_query='', sort_by='Name', sort_increasing='true'):
return self._folder_search('GetFoldersList', search_query,
sort_by, sort_increasing)

def getFoldersWithExternalContextList(
self, search_query='', sort_by='Name', sort_increasing='true'):
return self._folder_search('GetFoldersWithExternalContextList',
search_query, sort_by, sort_increasing)

def _folder_search(
self, method, search_query='', sort_by='Name',
sort_increasing='true'):
request = self._instance('ns1:ListFoldersRequest')
request.ParentFolderId = None
request.PublicOnly = 'false'
Expand All @@ -35,7 +46,7 @@ def getFoldersList(self, search_query='', sort_by='Name',

request.Pagination = self.pagination(ns='ns1:Pagination')

response = self._request('GetFoldersList', {
response = self._request(method, {
'auth': self.authentication_info(ns=self.auth_ns),
'request': request,
'searchQuery': search_query
Expand All @@ -53,6 +64,16 @@ def getFoldersList(self, search_query='', sort_by='Name',

return result

def getAllFoldersWithExternalContextByExternalId(
self, folder_external_ids, provider_names=[]):
return self._request('GetAllFoldersWithExternalContextByExternalId', {
'auth': self.authentication_info(ns=self.auth_ns),
'folderExternalIds': self.parameter_list(
ns=self.param_ns, params=folder_external_ids),
'providerNames': self.parameter_list(
ns=self.param_ns, params=provider_names),
})

def getAllFoldersByExternalId(self, folder_external_ids,
provider_names=[]):
return self._request('GetAllFoldersByExternalId', {
Expand Down Expand Up @@ -108,6 +129,13 @@ def updateFolderDescription(self, folder_id, description):
'description': description
})

def provisionExternalCourse(self, course_name, course_id):
return self._request('ProvisionExternalCourse', {
'auth': self.authentication_info(ns=self.auth_ns),
'name': course_name,
'externalId': course_id
})

def getSessionsById(self, session_ids):
return self._request('GetSessionsById', {
'auth': self.authentication_info(ns=self.auth_ns),
Expand Down
28 changes: 12 additions & 16 deletions panopto_client/tests/test_access.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,44 +20,40 @@ def test_init(self, mock_request, mock_instance):
def test_getFolderAccessDetails(self, mock_request, mock_instance):
client = AccessManagement()
result = client.getFolderAccessDetails('test-folder-id')
self.assertEqual(instance_args(mock_instance.call_args_list),
['ns0:AuthenticationInfo'])
self.assertEqual(instance_args(mock_instance.call_args_list), [])
mock_request.assert_called_with('GetFolderAccessDetails', {
'auth': mock.sentinel.instance, 'folderId': 'test-folder-id'})
'folderId': 'test-folder-id'})

def test_grantUsersAccessToFolder(self, mock_request, mock_instance):
client = AccessManagement()
result = client.grantUsersAccessToFolder(
'test-folder-id', ['user-id-1'], 'test-role')
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AccessRole', 'ns0:AuthenticationInfo', 'ns2:ArrayOfguid'])
'ns0:AccessRole', 'ns2:ArrayOfguid'])
mock_request.assert_called_with('GrantUsersAccessToFolder', {
'auth': mock.sentinel.instance, 'folderId': 'test-folder-id',
'userIds': mock.sentinel.instance, 'role': 'test-role'})
'folderId': 'test-folder-id', 'userIds': mock.sentinel.instance,
'role': 'test-role'})

def test_revokeUsersAccessFromFolder(self, mock_request, mock_instance):
client = AccessManagement()
result = client.revokeUsersAccessFromFolder(
'test-folder-id', ['user-id-1'], 'test-role')
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AccessRole', 'ns0:AuthenticationInfo', 'ns2:ArrayOfguid'])
'ns0:AccessRole', 'ns2:ArrayOfguid'])
mock_request.assert_called_with('RevokeUsersAccessFromFolder', {
'auth': mock.sentinel.instance, 'folderId': 'test-folder-id',
'userIds': mock.sentinel.instance, 'role': 'test-role'})
'folderId': 'test-folder-id', 'userIds': mock.sentinel.instance,
'role': 'test-role'})

def test_getSessionAccessDetails(self, mock_request, mock_instance):
client = AccessManagement()
result = client.getSessionAccessDetails('test-session-id')
self.assertEqual(instance_args(mock_instance.call_args_list),
['ns0:AuthenticationInfo'])
self.assertEqual(instance_args(mock_instance.call_args_list), [])
mock_request.assert_called_with('GetSessionAccessDetails', {
'auth': mock.sentinel.instance, 'sessionId': 'test-session-id'})
'sessionId': 'test-session-id'})

def test_updateSessionIsPublic(self, mock_request, mock_instance):
client = AccessManagement()
result = client.updateSessionIsPublic('test-session-id', True)
self.assertEqual(instance_args(mock_instance.call_args_list),
['ns0:AuthenticationInfo'])
self.assertEqual(instance_args(mock_instance.call_args_list), [])
mock_request.assert_called_with('UpdateSessionIsPublic', {
'auth': mock.sentinel.instance, 'sessionId': 'test-session-id',
'isPublic': True})
'sessionId': 'test-session-id', 'isPublic': True})
26 changes: 10 additions & 16 deletions panopto_client/tests/test_remote_recorder.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,16 @@ def test_getRemoteRecordersById(self, mock_request, mock_instance):
client = RemoteRecorderManagement()
result = client.getRemoteRecordersById('test-recorder-id')
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AuthenticationInfo', 'ns4:ArrayOfguid'])
'ns4:ArrayOfguid'])
mock_request.assert_called_with('GetRemoteRecordersById', {
'auth': mock.sentinel.instance,
'remoteRecorderIds': mock.sentinel.instance})

def test_getRemoteRecordersByExternalId(self, mock_request, mock_instance):
client = RemoteRecorderManagement()
result = client.getRemoteRecordersByExternalId('test-external-id')
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AuthenticationInfo', 'ns4:ArrayOfstring'])
'ns4:ArrayOfstring'])
mock_request.assert_called_with('GetRemoteRecordersByExternalId', {
'auth': mock.sentinel.instance,
'externalIds': mock.sentinel.instance})

def test_scheduleRecording(self, mock_request, mock_instance):
Expand All @@ -47,11 +45,10 @@ def test_scheduleRecording(self, mock_request, mock_instance):
end_time=datetime(2013, 3, 15, 10, 0, 0),
recorder_id='test-recorder-id')
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:ArrayOfRecorderSettings', 'ns0:AuthenticationInfo',
'ns0:RecorderSettings'])
'ns0:ArrayOfRecorderSettings', 'ns0:RecorderSettings'])
mock_request.assert_called_with('ScheduleRecording', {
'auth': mock.sentinel.instance, 'name': 'test-name',
'folderId': 'test-folder-id', 'isBroadcast': False,
'name': 'test-name', 'folderId': 'test-folder-id',
'isBroadcast': False,
'start': datetime(2013, 3, 15, 9, 0),
'end': datetime(2013, 3, 15, 10, 0),
'recorderSettings': mock.sentinel.instance})
Expand All @@ -63,29 +60,26 @@ def test_listRecorders(self, mock_request, mock_instance):
except TypeError:
pass
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AuthenticationInfo', 'ns0:Pagination'])
'ns0:Pagination'])
mock_request.assert_called_with('ListRecorders', {
'auth': mock.sentinel.instance,
'pagination': mock.sentinel.instance, 'sortBy': 'Name'})

def test_updateRemoteRecorderExternalId(self, mock_request, mock_instance):
client = RemoteRecorderManagement()
result = client.updateRemoteRecorderExternalId(
'test-recorder-id', 'test-external-id')
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AuthenticationInfo'])
self.assertEqual(instance_args(mock_instance.call_args_list), [])
mock_request.assert_called_with('UpdateRemoteRecorderExternalId', {
'auth': mock.sentinel.instance, 'externalId': 'test-external-id',
'externalId': 'test-external-id',
'remoteRecorderId': 'test-recorder-id'})

def test_updateRecordingTime(self, mock_request, mock_instance):
client = RemoteRecorderManagement()
result = client.updateRecordingTime(
'test-session-id', start=datetime(2013, 3, 15, 9, 0, 0),
end=datetime(2013, 3, 15, 10, 0, 0))
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AuthenticationInfo'])
self.assertEqual(instance_args(mock_instance.call_args_list), [])
mock_request.assert_called_with('UpdateRecordingTime', {
'auth': mock.sentinel.instance, 'sessionId': 'test-session-id',
'sessionId': 'test-session-id',
'start': datetime(2013, 3, 15, 9, 0),
'end': datetime(2013, 3, 15, 10, 0)})
29 changes: 29 additions & 0 deletions panopto_client/tests/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,25 @@ def test_getAllFoldersByExternalId(self, mock_request, mock_instance):
'folderExternalIds': mock.sentinel.instance,
'providerNames': mock.sentinel.instance})

def test_getFoldersWithExternalContextList(
self, mock_request, mock_instance):
mock_request.TotalNumberResults = 0
client = SessionManagement()
try:
result = client.getFoldersWithExternalContextList(
search_query='test query')
except TypeError:
pass
self.assertEqual(
instance_args(mock_instance.call_args_list), [
'ns1:AuthenticationInfo',
'ns1:FolderSortField',
'ns1:ListFoldersRequest',
'ns1:Pagination'])
mock_request.assert_called_with('GetFoldersWithExternalContextList', {
'auth': mock.sentinel.instance, 'request': mock.sentinel.instance,
'searchQuery': 'test query'})

def test_getFoldersByExternalId(self, mock_request, mock_instance):
client = SessionManagement()
result = client.getFoldersByExternalId(['test-external-id'])
Expand Down Expand Up @@ -107,6 +126,16 @@ def test_updateFolderDescription(self, mock_request, mock_instance):
'auth': mock.sentinel.instance, 'folderId': 'test-folder-id',
'description': 'description'})

def test_provisionExternalCourse(self, mock_request, mock_instance):
client = SessionManagement()
result = client.provisionExternalCourse(
'test course name', 'test-course-id')
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns1:AuthenticationInfo'])
mock_request.assert_called_with('ProvisionExternalCourse', {
'auth': mock.sentinel.instance, 'name': 'test course name',
'externalId': 'test-course-id'})

def test_getSessionsById(self, mock_request, mock_instance):
client = SessionManagement()
result = client.getSessionsById(['test-session-id'])
Expand Down
5 changes: 2 additions & 3 deletions panopto_client/tests/test_usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ def test_getUserDetailedUsage(self, mock_request, mock_instance):
except TypeError:
pass
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AuthenticationInfo', 'ns0:Pagination'])
'ns0:Pagination'])
mock_request.assert_called_with('GetUserDetailedUsage', {
'auth': mock.sentinel.instance, 'userId': 'test-user-id',
'pagination': mock.sentinel.instance})
'userId': 'test-user-id', 'pagination': mock.sentinel.instance})
13 changes: 5 additions & 8 deletions panopto_client/tests/test_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,21 @@ def test_listUsers(self, mock_request, mock_instance):
except TypeError:
pass
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AuthenticationInfo', 'ns0:ListUsersRequest',
'ns0:Pagination', 'ns0:UserSortField'])
'ns0:ListUsersRequest', 'ns0:Pagination', 'ns0:UserSortField'])
mock_request.assert_called_with('ListUsers', {
'auth': mock.sentinel.instance,
'parameters': mock.sentinel.instance, 'searchQuery': 'test query'})

def test_getUserByKey(self, mock_request, mock_instance):
client = UserManagement()
result = client.getUserByKey('test-user-key')
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AuthenticationInfo'])
self.assertEqual(instance_args(mock_instance.call_args_list), [])
mock_request.assert_called_with('GetUserByKey', {
'auth': mock.sentinel.instance, 'userKey': 'test-user-key'})
'userKey': 'test-user-key'})

def test_getUsers(self, mock_request, mock_instance):
client = UserManagement()
result = client.getUsers(['test-user-id'])
self.assertEqual(instance_args(mock_instance.call_args_list), [
'ns0:AuthenticationInfo', 'ns2:ArrayOfguid'])
'ns2:ArrayOfguid'])
mock_request.assert_called_with('GetUsers', {
'auth': mock.sentinel.instance, 'userIds': mock.sentinel.instance})
'userIds': mock.sentinel.instance})
1 change: 0 additions & 1 deletion panopto_client/usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ def getUserDetailedUsage(self, user_id):
self._set_page_number(page)

response = self._request('GetUserDetailedUsage', {
'auth': self.authentication_info(),
'userId': user_id,
'pagination': self.pagination()
})
Expand Down
3 changes: 0 additions & 3 deletions panopto_client/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ def listUsers(self, search_query='', sort_by='UserKey',
parameters.Pagination = self.pagination()

response = self._request('ListUsers', {
'auth': self.authentication_info(),
'parameters': parameters,
'searchQuery': search_query
})
Expand All @@ -46,12 +45,10 @@ def listUsers(self, search_query='', sort_by='UserKey',

def getUserByKey(self, user_key):
return self._request('GetUserByKey', {
'auth': self.authentication_info(),
'userKey': user_key
})

def getUsers(self, user_ids):
return self._request('GetUsers', {
'auth': self.authentication_info(),
'userIds': self.guid_list(guids=user_ids)
})

0 comments on commit 33f0906

Please sign in to comment.