Skip to content

Commit 0ac9300

Browse files
authored
Merge pull request #90 from penzance/feature/install_1.3_tools
Support installation of LTI 1.3 tools
2 parents c91bbd8 + 1b79f67 commit 0ac9300

2 files changed

Lines changed: 95 additions & 81 deletions

File tree

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.2.0
1+
1.2.1

canvas_sdk/methods/external_tools.py

Lines changed: 94 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def list_external_tools_accounts(request_ctx, account_id, search_term=None, sele
7171
def get_sessionless_launch_url_for_external_tool_courses(request_ctx, course_id, id=None, url=None, assignment_id=None, launch_type=None, **request_kwargs):
7272
"""
7373
Returns a sessionless launch url for an external tool.
74-
74+
7575
Either the id or url must be provided.
7676
7777
:param request_ctx: The request context
@@ -107,7 +107,7 @@ def get_sessionless_launch_url_for_external_tool_courses(request_ctx, course_id,
107107
def get_sessionless_launch_url_for_external_tool_accounts(request_ctx, account_id, id=None, url=None, assignment_id=None, launch_type=None, **request_kwargs):
108108
"""
109109
Returns a sessionless launch url for an external tool.
110-
110+
111111
Either the id or url must be provided.
112112
113113
:param request_ctx: The request context
@@ -184,7 +184,7 @@ def get_single_external_tool_accounts(request_ctx, account_id, external_tool_id,
184184
return response
185185

186186

187-
def create_external_tool_courses(request_ctx, course_id, name, privacy_level, consumer_key, shared_secret, description=None, url=None, domain=None, icon_url=None, text=None, not_selectable=None, custom_fields=None, account_navigation_url=None, account_navigation_enabled=None, account_navigation_text=None, user_navigation_url=None, user_navigation_enabled=None, user_navigation_text=None, course_navigation_url=None, course_navigation_enabled=None, course_navigation_text=None, course_navigation_visibility=None, course_navigation_default=None, editor_button_url=None, editor_button_enabled=None, editor_button_icon_url=None, editor_button_selection_width=None, editor_button_selection_height=None, resource_selection_url=None, resource_selection_enabled=None, resource_selection_icon_url=None, resource_selection_selection_width=None, resource_selection_selection_height=None, config_type=None, config_xml=None, config_url=None, **request_kwargs):
187+
def create_external_tool_courses(request_ctx, course_id, name=None, privacy_level=None, consumer_key=None, shared_secret=None, description=None, url=None, domain=None, icon_url=None, text=None, not_selectable=None, custom_fields=None, account_navigation_url=None, account_navigation_enabled=None, account_navigation_text=None, user_navigation_url=None, user_navigation_enabled=None, user_navigation_text=None, course_navigation_url=None, course_navigation_enabled=None, course_navigation_text=None, course_navigation_visibility=None, course_navigation_default=None, editor_button_url=None, editor_button_enabled=None, editor_button_icon_url=None, editor_button_selection_width=None, editor_button_selection_height=None, resource_selection_url=None, resource_selection_enabled=None, resource_selection_icon_url=None, resource_selection_selection_width=None, resource_selection_selection_height=None, config_type=None, config_xml=None, config_url=None, client_id=None, **request_kwargs):
188188
"""
189189
Create an external tool in the specified course/account.
190190
The created tool will be returned, see the "show" endpoint for an example.
@@ -263,6 +263,8 @@ def create_external_tool_courses(request_ctx, course_id, name, privacy_level, co
263263
:type config_xml: string or None
264264
:param config_url: (optional) URL where the server can retrieve an XML tool configuration, as specified in the CC xml specification. This is required if "config_type" is set to "by_url"
265265
:type config_url: string or None
266+
:param client_id: (optional) LTI 1.3 client_id of the tool to install
267+
:type client_id: string or None
266268
:return: Create an external tool
267269
:rtype: requests.Response (with void data)
268270
@@ -273,50 +275,56 @@ def create_external_tool_courses(request_ctx, course_id, name, privacy_level, co
273275
utils.validate_attr_is_acceptable(privacy_level, privacy_level_types)
274276
utils.validate_attr_is_acceptable(course_navigation_visibility, course_navigation_visibility_types)
275277
path = '/v1/courses/{course_id}/external_tools'
276-
payload = {
277-
'name' : name,
278-
'privacy_level' : privacy_level,
279-
'consumer_key' : consumer_key,
280-
'shared_secret' : shared_secret,
281-
'description' : description,
282-
'url' : url,
283-
'domain' : domain,
284-
'icon_url' : icon_url,
285-
'text' : text,
286-
'not_selectable' : not_selectable,
287-
'custom_fields' : custom_fields,
288-
'account_navigation[url]' : account_navigation_url,
289-
'account_navigation[enabled]' : account_navigation_enabled,
290-
'account_navigation[text]' : account_navigation_text,
291-
'user_navigation[url]' : user_navigation_url,
292-
'user_navigation[enabled]' : user_navigation_enabled,
293-
'user_navigation[text]' : user_navigation_text,
294-
'course_navigation[url]' : course_navigation_url,
295-
'course_navigation[enabled]' : course_navigation_enabled,
296-
'course_navigation[text]' : course_navigation_text,
297-
'course_navigation[visibility]' : course_navigation_visibility,
298-
'course_navigation[default]' : course_navigation_default,
299-
'editor_button[url]' : editor_button_url,
300-
'editor_button[enabled]' : editor_button_enabled,
301-
'editor_button[icon_url]' : editor_button_icon_url,
302-
'editor_button[selection_width]' : editor_button_selection_width,
303-
'editor_button[selection_height]' : editor_button_selection_height,
304-
'resource_selection[url]' : resource_selection_url,
305-
'resource_selection[enabled]' : resource_selection_enabled,
306-
'resource_selection[icon_url]' : resource_selection_icon_url,
307-
'resource_selection[selection_width]' : resource_selection_selection_width,
308-
'resource_selection[selection_height]' : resource_selection_selection_height,
309-
'config_type' : config_type,
310-
'config_xml' : config_xml,
311-
'config_url' : config_url,
312-
}
278+
payload = {}
279+
if client_id:
280+
payload = {
281+
'client_id': client_id
282+
}
283+
else:
284+
payload = {
285+
'name' : name,
286+
'privacy_level' : privacy_level,
287+
'consumer_key' : consumer_key,
288+
'shared_secret' : shared_secret,
289+
'description' : description,
290+
'url' : url,
291+
'domain' : domain,
292+
'icon_url' : icon_url,
293+
'text' : text,
294+
'not_selectable' : not_selectable,
295+
'custom_fields' : custom_fields,
296+
'account_navigation[url]' : account_navigation_url,
297+
'account_navigation[enabled]' : account_navigation_enabled,
298+
'account_navigation[text]' : account_navigation_text,
299+
'user_navigation[url]' : user_navigation_url,
300+
'user_navigation[enabled]' : user_navigation_enabled,
301+
'user_navigation[text]' : user_navigation_text,
302+
'course_navigation[url]' : course_navigation_url,
303+
'course_navigation[enabled]' : course_navigation_enabled,
304+
'course_navigation[text]' : course_navigation_text,
305+
'course_navigation[visibility]' : course_navigation_visibility,
306+
'course_navigation[default]' : course_navigation_default,
307+
'editor_button[url]' : editor_button_url,
308+
'editor_button[enabled]' : editor_button_enabled,
309+
'editor_button[icon_url]' : editor_button_icon_url,
310+
'editor_button[selection_width]' : editor_button_selection_width,
311+
'editor_button[selection_height]' : editor_button_selection_height,
312+
'resource_selection[url]' : resource_selection_url,
313+
'resource_selection[enabled]' : resource_selection_enabled,
314+
'resource_selection[icon_url]' : resource_selection_icon_url,
315+
'resource_selection[selection_width]' : resource_selection_selection_width,
316+
'resource_selection[selection_height]' : resource_selection_selection_height,
317+
'config_type' : config_type,
318+
'config_xml' : config_xml,
319+
'config_url' : config_url,
320+
}
313321
url = request_ctx.base_api_url + path.format(course_id=course_id)
314322
response = client.post(request_ctx, url, payload=payload, **request_kwargs)
315323

316324
return response
317325

318326

319-
def create_external_tool_accounts(request_ctx, account_id, name, privacy_level, consumer_key, shared_secret, description=None, url=None, domain=None, icon_url=None, text=None, not_selectable=None, custom_fields=None, account_navigation_url=None, account_navigation_enabled=None, account_navigation_text=None, user_navigation_url=None, user_navigation_enabled=None, user_navigation_text=None, course_navigation_url=None, course_navigation_enabled=None, course_navigation_text=None, course_navigation_visibility=None, course_navigation_default=None, editor_button_url=None, editor_button_enabled=None, editor_button_icon_url=None, editor_button_selection_width=None, editor_button_selection_height=None, resource_selection_url=None, resource_selection_enabled=None, resource_selection_icon_url=None, resource_selection_selection_width=None, resource_selection_selection_height=None, config_type=None, config_xml=None, config_url=None, **request_kwargs):
327+
def create_external_tool_accounts(request_ctx, account_id, name=None, privacy_level=None, consumer_key=None, shared_secret=None, description=None, url=None, domain=None, icon_url=None, text=None, not_selectable=None, custom_fields=None, account_navigation_url=None, account_navigation_enabled=None, account_navigation_text=None, user_navigation_url=None, user_navigation_enabled=None, user_navigation_text=None, course_navigation_url=None, course_navigation_enabled=None, course_navigation_text=None, course_navigation_visibility=None, course_navigation_default=None, editor_button_url=None, editor_button_enabled=None, editor_button_icon_url=None, editor_button_selection_width=None, editor_button_selection_height=None, resource_selection_url=None, resource_selection_enabled=None, resource_selection_icon_url=None, resource_selection_selection_width=None, resource_selection_selection_height=None, config_type=None, config_xml=None, config_url=None, client_id=None, **request_kwargs):
320328
"""
321329
Create an external tool in the specified course/account.
322330
The created tool will be returned, see the "show" endpoint for an example.
@@ -395,6 +403,8 @@ def create_external_tool_accounts(request_ctx, account_id, name, privacy_level,
395403
:type config_xml: string or None
396404
:param config_url: (optional) URL where the server can retrieve an XML tool configuration, as specified in the CC xml specification. This is required if "config_type" is set to "by_url"
397405
:type config_url: string or None
406+
:param client_id: (optional) LTI 1.3 client_id of the tool to install
407+
:type client_id: string or None
398408
:return: Create an external tool
399409
:rtype: requests.Response (with void data)
400410
@@ -405,43 +415,49 @@ def create_external_tool_accounts(request_ctx, account_id, name, privacy_level,
405415
utils.validate_attr_is_acceptable(privacy_level, privacy_level_types)
406416
utils.validate_attr_is_acceptable(course_navigation_visibility, course_navigation_visibility_types)
407417
path = '/v1/accounts/{account_id}/external_tools'
408-
payload = {
409-
'name' : name,
410-
'privacy_level' : privacy_level,
411-
'consumer_key' : consumer_key,
412-
'shared_secret' : shared_secret,
413-
'description' : description,
414-
'url' : url,
415-
'domain' : domain,
416-
'icon_url' : icon_url,
417-
'text' : text,
418-
'not_selectable' : not_selectable,
419-
'custom_fields' : custom_fields,
420-
'account_navigation[url]' : account_navigation_url,
421-
'account_navigation[enabled]' : account_navigation_enabled,
422-
'account_navigation[text]' : account_navigation_text,
423-
'user_navigation[url]' : user_navigation_url,
424-
'user_navigation[enabled]' : user_navigation_enabled,
425-
'user_navigation[text]' : user_navigation_text,
426-
'course_navigation[url]' : course_navigation_url,
427-
'course_navigation[enabled]' : course_navigation_enabled,
428-
'course_navigation[text]' : course_navigation_text,
429-
'course_navigation[visibility]' : course_navigation_visibility,
430-
'course_navigation[default]' : course_navigation_default,
431-
'editor_button[url]' : editor_button_url,
432-
'editor_button[enabled]' : editor_button_enabled,
433-
'editor_button[icon_url]' : editor_button_icon_url,
434-
'editor_button[selection_width]' : editor_button_selection_width,
435-
'editor_button[selection_height]' : editor_button_selection_height,
436-
'resource_selection[url]' : resource_selection_url,
437-
'resource_selection[enabled]' : resource_selection_enabled,
438-
'resource_selection[icon_url]' : resource_selection_icon_url,
439-
'resource_selection[selection_width]' : resource_selection_selection_width,
440-
'resource_selection[selection_height]' : resource_selection_selection_height,
441-
'config_type' : config_type,
442-
'config_xml' : config_xml,
443-
'config_url' : config_url,
444-
}
418+
payload = {}
419+
if client_id:
420+
payload = {
421+
'client_id': client_id
422+
}
423+
else:
424+
payload = {
425+
'name' : name,
426+
'privacy_level' : privacy_level,
427+
'consumer_key' : consumer_key,
428+
'shared_secret' : shared_secret,
429+
'description' : description,
430+
'url' : url,
431+
'domain' : domain,
432+
'icon_url' : icon_url,
433+
'text' : text,
434+
'not_selectable' : not_selectable,
435+
'custom_fields' : custom_fields,
436+
'account_navigation[url]' : account_navigation_url,
437+
'account_navigation[enabled]' : account_navigation_enabled,
438+
'account_navigation[text]' : account_navigation_text,
439+
'user_navigation[url]' : user_navigation_url,
440+
'user_navigation[enabled]' : user_navigation_enabled,
441+
'user_navigation[text]' : user_navigation_text,
442+
'course_navigation[url]' : course_navigation_url,
443+
'course_navigation[enabled]' : course_navigation_enabled,
444+
'course_navigation[text]' : course_navigation_text,
445+
'course_navigation[visibility]' : course_navigation_visibility,
446+
'course_navigation[default]' : course_navigation_default,
447+
'editor_button[url]' : editor_button_url,
448+
'editor_button[enabled]' : editor_button_enabled,
449+
'editor_button[icon_url]' : editor_button_icon_url,
450+
'editor_button[selection_width]' : editor_button_selection_width,
451+
'editor_button[selection_height]' : editor_button_selection_height,
452+
'resource_selection[url]' : resource_selection_url,
453+
'resource_selection[enabled]' : resource_selection_enabled,
454+
'resource_selection[icon_url]' : resource_selection_icon_url,
455+
'resource_selection[selection_width]' : resource_selection_selection_width,
456+
'resource_selection[selection_height]' : resource_selection_selection_height,
457+
'config_type' : config_type,
458+
'config_xml' : config_xml,
459+
'config_url' : config_url,
460+
}
445461
url = request_ctx.base_api_url + path.format(account_id=account_id)
446462
response = client.post(request_ctx, url, payload=payload, **request_kwargs)
447463

@@ -749,5 +765,3 @@ def delete_external_tool_accounts(request_ctx, account_id, external_tool_id, **r
749765
response = client.delete(request_ctx, url, **request_kwargs)
750766

751767
return response
752-
753-

0 commit comments

Comments
 (0)