2015-01-08 01:54:38 +08:00
#
# Copyright (C) 2015 Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Filters added to this controller apply to all controllers in the application.
# Likewise, all the methods added will be available for all controllers.
module Lti
class VariableExpander
2015-05-14 01:00:18 +08:00
SUBSTRING_REGEX = / (?<= \ ${).*?(?=}) / . freeze #matches only the stuff inside `${}`
2015-01-08 01:54:38 +08:00
attr_reader :context , :root_account , :controller , :current_user
attr_accessor :current_pseudonym , :content_tag , :assignment ,
2016-06-25 00:21:16 +08:00
:tool_setting_link_id , :tool_setting_binding_id , :tool_setting_proxy_id , :tool , :attachment ,
:collaboration
2015-01-08 01:54:38 +08:00
2016-10-28 03:57:01 +08:00
def self . register_expansion ( name , permission_groups , expansion_proc , * guards )
2015-01-08 01:54:38 +08:00
@expansions || = { }
2016-10-28 03:57:01 +08:00
@expansions [ " $ #{ name } " . to_sym ] = VariableExpansion . new ( name , permission_groups , expansion_proc , * guards )
2015-01-08 01:54:38 +08:00
end
def self . expansions
2016-10-28 03:57:01 +08:00
@expansions || { }
2015-01-08 01:54:38 +08:00
end
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD = - > { ! ! @controller }
2015-01-08 01:54:38 +08:00
COURSE_GUARD = - > { @context . is_a? Course }
2015-04-23 23:08:26 +08:00
TERM_START_DATE_GUARD = - > { @context . is_a? ( Course ) && @context . enrollment_term &&
@context . enrollment_term . start_at }
2015-01-08 01:54:38 +08:00
USER_GUARD = - > { @current_user }
2017-01-13 06:22:26 +08:00
SIS_USER_GUARD = - > { @current_user && @current_user . pseudonym && @current_user . pseudonym . sis_user_id }
2015-01-08 01:54:38 +08:00
PSEUDONYM_GUARD = - > { sis_pseudonym }
ENROLLMENT_GUARD = - > { @current_user && @context . is_a? ( Course ) }
2015-08-04 03:46:13 +08:00
ROLES_GUARD = - > { @current_user && ( @context . is_a? ( Course ) || @context . is_a? ( Account ) ) }
2015-01-08 01:54:38 +08:00
CONTENT_TAG_GUARD = - > { @content_tag }
ASSIGNMENT_GUARD = - > { @assignment }
2016-06-25 00:21:16 +08:00
COLLABORATION_GUARD = - > { @collaboration }
2015-02-11 07:40:06 +08:00
MEDIA_OBJECT_GUARD = - > { @attachment && @attachment . media_object }
USAGE_RIGHTS_GUARD = - > { @attachment && @attachment . usage_rights }
MEDIA_OBJECT_ID_GUARD = - > { @attachment && ( @attachment . media_object || @attachment . media_entry_id ) }
2016-10-28 03:57:01 +08:00
LTI1_GUARD = - > { @tool . is_a? ( ContextExternalTool ) }
MASQUERADING_GUARD = - > { ! ! @controller && @controller . logged_in_user != @current_user }
2015-01-08 01:54:38 +08:00
def initialize ( root_account , context , controller , opts = { } )
@root_account = root_account
@context = context
@controller = controller
2016-10-28 03:57:01 +08:00
@request = controller . request if controller
2015-01-08 01:54:38 +08:00
opts . each { | opt , val | instance_variable_set ( " @ #{ opt } " , val ) }
end
def lti_helper
@lti_helper || = Lti :: SubstitutionsHelper . new ( @context , @root_account , @current_user )
end
def current_user = ( current_user )
@lti_helper = nil
@current_user = current_user
end
def [] ( key )
k = ( key [ 0 ] == '$' && key ) || " $ #{ key } "
2015-05-14 01:00:18 +08:00
if ( expansion = self . class . expansions [ k . respond_to? ( :to_sym ) && k . to_sym ] )
2015-01-08 01:54:38 +08:00
expansion . expand ( self )
end
end
def expand_variables! ( var_hash )
var_hash . update ( var_hash ) do | _ , v |
2015-05-14 01:00:18 +08:00
if ( expansion = v . respond_to? ( :to_sym ) && self . class . expansions [ v . to_sym ] )
2015-01-08 01:54:38 +08:00
expansion . expand ( self )
2015-05-14 01:00:18 +08:00
elsif v . respond_to? ( :to_s ) && v . to_s =~ SUBSTRING_REGEX
expand_substring_variables ( v )
2015-01-08 01:54:38 +08:00
else
v
end
end
end
2017-02-08 04:51:01 +08:00
def enabled_capability_params ( enabled_capabilities )
enabled_capabilities . each_with_object ( { } ) do | capability , hash |
if ( expansion = capability . respond_to? ( :to_sym ) && self . class . expansions [ " $ #{ capability } " . to_sym ] )
hash [ expansion . default_name ] = expansion . expand ( self ) if expansion . default_name . present?
end
end
end
2017-02-09 06:35:31 +08:00
# an opaque identifier that uniquely identifies the context that contains the link being launched
# @example
# ```
# cdca1fe2c392a208bd8a657f8865ddb9ca359534
# ```
register_expansion 'Context.id' , [ ] ,
- > { Lti :: Asset . opaque_identifier_for ( @context ) } ,
default_name : 'context_id'
2017-02-08 04:51:01 +08:00
# communicates the kind of browser window/frame where the Canvas has launched a tool
# associated launch param name: launch_presentation_document_target
# @example
# ```
# ifame
# ```
register_expansion 'Message.documentTarget' , [ ] ,
- > { IMS :: LTI :: Models :: Messages :: Message :: LAUNCH_TARGET_IFRAME } ,
default_name : 'launch_presentation_document_target'
# returns the current locale
# associated launch param name: launch_presentation_locale
# @example
# ```
# de
# ```
register_expansion 'Message.locale' , [ ] ,
- > { I18n . locale || I18n . default_locale } ,
default_name : 'launch_presentation_locale'
# returns a unique identifier for the Tool Consumer (Canvas)
# associated launch param name: 'tool_consumer_instance_guid'
# @example
# ```
# 0dWtgJjjFWRNT41WdQMvrleejGgv7AynCVm3lmZ2:canvas-lms
# ```
register_expansion 'ToolConsumerInstance.guid' , [ ] ,
- > { @root_account . lti_guid } ,
default_name : 'tool_consumer_instance_guid'
2016-03-11 12:49:32 +08:00
# returns the canvas domain for the current context.
# @example
# ```
# canvas.instructure.com
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.api.domain' , [ ] ,
2016-10-28 03:57:01 +08:00
- > { HostUrl . context_host ( @root_account , @request . host ) } ,
CONTROLLER_GUARD
2015-01-08 01:54:38 +08:00
2016-06-25 00:21:16 +08:00
# returns the api url for the members of the collaboration
# @example
# ```
# https://canvas.instructure.com/api/v1/collaborations/1/members
# ```
register_expansion 'Canvas.api.collaborationMembers.url' , [ ] ,
- > { @controller . api_v1_collaboration_members_url ( @collaboration ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2016-06-25 00:21:16 +08:00
COLLABORATION_GUARD
2016-03-11 12:49:32 +08:00
# returns the base URL for the current context.
# @example
# ```
# https://canvas.instructure.com
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.api.baseUrl' , [ ] ,
2016-10-28 03:57:01 +08:00
- > { " #{ @request . scheme } :// #{ HostUrl . context_host ( @root_account , @request . host ) } " } ,
CONTROLLER_GUARD
2015-01-08 01:54:38 +08:00
2016-06-16 02:10:32 +08:00
# returns the URL for the membership service associated with the current context
# @example
# ```
# https://canvas.instructure.com/api/lti/courses/1/membership_service
# ```
register_expansion 'ToolProxyBinding.memberships.url' , [ ] ,
2016-04-29 03:29:56 +08:00
- > { @controller . polymorphic_url ( [ @context , :membership_service ] ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2016-04-29 03:29:56 +08:00
- > { @context . is_a? ( Course ) || @context . is_a? ( Group ) }
2016-03-31 06:59:58 +08:00
2016-03-11 12:49:32 +08:00
# returns the account id for the current context.
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.account.id' , [ ] ,
- > { lti_helper . account . id }
2016-03-11 12:49:32 +08:00
# returns the account name for the current context.
# @example
# ```
# School Name
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.account.name' , [ ] ,
- > { lti_helper . account . name }
2016-12-06 06:06:35 +08:00
# returns the account's sis source id for the current context. Only available if sis_account_id is specified.
# @example
# ```
# sis_account_id_1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.account.sisSourceId' , [ ] ,
- > { lti_helper . account . sis_source_id }
2016-03-11 12:49:32 +08:00
# returns the Root Account ID for the current context.
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.rootAccount.id' , [ ] ,
- > { @root_account . id }
2016-12-06 06:06:35 +08:00
# returns the root account's sis source id for the current context. Only available if sis_account_id is specified.
# @example
# ```
# sis_account_id_1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.rootAccount.sisSourceId' , [ ] ,
- > { @root_account . sis_source_id }
2016-12-06 06:06:35 +08:00
# returns the API URL for the external tool that was launched. Only available for LTI 1.
2016-03-11 12:49:32 +08:00
# @example
# ```
# http://example.url/path
# ```
2015-04-25 00:14:02 +08:00
register_expansion 'Canvas.externalTool.url' , [ ] ,
2016-08-24 03:22:00 +08:00
- > { @controller . named_context_url ( @tool . context , :api_v1_context_external_tools_update_url ,
2015-04-25 00:14:02 +08:00
@tool . id , include_host : true ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-04-25 00:14:02 +08:00
LTI1_GUARD
2016-12-06 06:06:35 +08:00
# returns the URL for the common css file. Should always be available.
2016-03-11 12:49:32 +08:00
# @example
# ```
# http://example.url/path.css
# ```
2015-07-11 00:28:43 +08:00
register_expansion 'Canvas.css.common' , [ ] ,
- > { URI . parse ( @request . url )
2016-10-28 03:57:01 +08:00
. merge ( @controller . view_context . stylesheet_path ( @controller . css_url_for ( :common ) ) ) . to_s } ,
CONTROLLER_GUARD
2015-04-25 00:14:02 +08:00
2016-03-11 12:49:32 +08:00
# returns the shard id for the current context.
# @example
# ```
# 1234
# ```
2015-08-04 07:01:36 +08:00
register_expansion 'Canvas.shard.id' , [ ] ,
- > { Shard . current . id }
2016-03-11 12:49:32 +08:00
# returns the root account's global id for the current context.
# @example
# ```
# 123400000000123
# ```
2015-08-04 07:01:36 +08:00
register_expansion 'Canvas.root_account.global_id' , [ ] ,
- > { @root_account . global_id }
2015-01-08 01:54:38 +08:00
2016-03-11 12:49:32 +08:00
# returns the root account id for the current context.
# @deprecated
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.root_account.id' , [ ] ,
- > { @root_account . id }
2016-03-11 12:49:32 +08:00
# returns the root account sis source id for the current context.
# @deprecated
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.root_account.sisSourceId' , [ ] ,
- > { @root_account . sis_source_id }
2016-03-11 12:49:32 +08:00
# returns the current course id.
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.id' , [ ] ,
- > { @context . id } ,
COURSE_GUARD
2017-01-31 06:36:37 +08:00
# returns the current course name.
# @example
# ```
# Course Name
# ```
register_expansion 'Canvas.course.name' , [ ] ,
- > { @context . name } ,
COURSE_GUARD
2016-03-11 12:49:32 +08:00
# returns the current course sis source id.
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.sisSourceId' , [ ] ,
- > { @context . sis_source_id } ,
COURSE_GUARD
2016-03-11 12:49:32 +08:00
# returns the current course start date.
# @example
# ```
2016-12-06 06:06:35 +08:00
# YYY-MM-DD HH:MM:SS -0700
2016-03-11 12:49:32 +08:00
# ```
2015-04-23 23:08:26 +08:00
register_expansion 'Canvas.course.startAt' , [ ] ,
- > { @context . start_at } ,
COURSE_GUARD
2016-11-11 06:56:37 +08:00
# returns the current course workflow state. Workflow states of "claimed" or "created"
# indicate an unpublished course.
# @example
# ```
# active
# ```
register_expansion 'Canvas.course.workflowState' , [ ] ,
- > { @context . workflow_state } ,
COURSE_GUARD
2016-03-11 12:49:32 +08:00
# returns the current course's term start date.
# @example
# ```
2016-12-06 06:06:35 +08:00
# YYY-MM-DD HH:MM:SS -0700
2016-03-11 12:49:32 +08:00
# ```
2015-04-23 23:08:26 +08:00
register_expansion 'Canvas.term.startAt' , [ ] ,
- > { @context . enrollment_term . start_at } ,
TERM_START_DATE_GUARD
2016-12-06 06:06:35 +08:00
# returns the current course sis source id
# to return the section source id use Canvas.course.sectionIds
2017-02-08 04:51:01 +08:00
# associated launch param name: 'lis_course_section_sourcedid'
2016-03-11 12:49:32 +08:00
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'CourseSection.sourcedId' , [ ] ,
- > { @context . sis_source_id } ,
2017-02-08 04:51:01 +08:00
COURSE_GUARD ,
default_name : 'lis_course_section_sourcedid'
2015-01-08 01:54:38 +08:00
2016-03-11 12:49:32 +08:00
# returns the current course enrollment state
# @example
# ```
2016-12-06 06:06:35 +08:00
# active
2016-03-11 12:49:32 +08:00
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.enrollment.enrollmentState' , [ ] ,
- > { lti_helper . enrollment_state } ,
COURSE_GUARD
2016-03-11 12:49:32 +08:00
# returns the current course membership roles
# @example
# ```
2016-12-06 06:06:35 +08:00
# StudentEnrollment
2016-03-11 12:49:32 +08:00
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.membership.roles' , [ ] ,
- > { lti_helper . current_canvas_roles } ,
2015-08-04 03:46:13 +08:00
ROLES_GUARD
2015-01-08 01:54:38 +08:00
2016-03-11 12:49:32 +08:00
# This is a list of IMS LIS roles should have a different key
2016-12-06 06:06:35 +08:00
# @example
# ```
# urn:lti:sysrole:ims/lis/None
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.membership.concludedRoles' , [ ] ,
- > { lti_helper . concluded_lis_roles } ,
COURSE_GUARD
2016-12-06 06:06:35 +08:00
# Returns the context ids from the course that the current course was copied from.
# Only available when launched in a course that was copied (excludes cartridge imports).
2016-03-11 12:49:32 +08:00
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.previousContextIds' , [ ] ,
- > { lti_helper . previous_lti_context_ids } ,
COURSE_GUARD
2016-12-06 06:06:35 +08:00
# Returns the course ids of the course that the current course was copied from.
# Only available when launched in a course that was copied (excludes cartridge imports).
2016-03-11 12:49:32 +08:00
# @example
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.previousCourseIds' , [ ] ,
- > { lti_helper . previous_course_ids } ,
COURSE_GUARD
2016-12-06 06:06:35 +08:00
# Returns the full name of the launching user. Only available when launched by a logged in user.
2017-02-08 04:51:01 +08:00
# associated launch param name: lis_person_name_full
2016-12-06 06:06:35 +08:00
# @example
# ```
# John Doe
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.name.full' , [ ] ,
- > { @current_user . name } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'lis_person_name_full'
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the last name of the launching user. Only available when launched by a logged in user.
2017-02-08 04:51:01 +08:00
# associated launch param name: 'lis_person_name_family'
2016-12-06 06:06:35 +08:00
# @example
# ```
# Doe
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.name.family' , [ ] ,
- > { @current_user . last_name } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'lis_person_name_family'
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the first name of the launching user. Only available when launched by a logged in user.
2017-02-08 04:51:01 +08:00
# associated launch param name: 'lis_person_name_given'
2016-12-06 06:06:35 +08:00
# @example
# ```
# John
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.name.given' , [ ] ,
- > { @current_user . first_name } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'lis_person_name_given'
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the primary email of the launching user. Only available when launched by a logged in user.
2017-02-08 04:51:01 +08:00
# associated launch param name: 'lis_person_contact_email_primary'
2016-12-06 06:06:35 +08:00
# @example
# ```
# john.doe@example.com
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.email.primary' , [ ] ,
- > { @current_user . email } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'lis_person_contact_email_primary'
2015-01-08 01:54:38 +08:00
2017-01-13 06:22:26 +08:00
# Returns the institution assigned email of the launching user. Only available when launched by a logged in user that was added via SIS.
# @example
# ```
# john.doe@example.com
# ```
register_expansion 'vnd.Canvas.Person.email.sis' , [ ] ,
- > { @current_user . communication_channels . joins (
" INNER JOIN #{ Pseudonym . quoted_table_name }
ON communication_channels . id = pseudonyms . sis_communication_channel_id " )
. limit ( 1 ) . pluck ( :path ) . first } , SIS_USER_GUARD
2016-12-06 06:06:35 +08:00
# Returns the name of the timezone of the launching user. Only available when launched by a logged in user.
# @example
# ```
# America/Denver
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.address.timezone' , [ ] ,
- > { Time . zone . tzinfo . name } ,
USER_GUARD
2016-12-06 06:06:35 +08:00
# Returns the profile picture URL of the launching user. Only available when launched by a logged in user.
2017-02-08 04:51:01 +08:00
# associated launch param name: 'user_image'
2016-12-06 06:06:35 +08:00
# @example
# ```
# https://example.com/picture.jpg
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'User.image' , [ ] ,
- > { @current_user . avatar_url } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'user_image'
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the Canvas user_id of the launching user. Only available when launched by a logged in user.
2017-02-08 04:51:01 +08:00
# associated launch param name: 'user_id'
2016-12-06 06:06:35 +08:00
# @example
# ```
# 420000000000042
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'User.id' , [ ] ,
- > { @current_user . id } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'user_id'
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the Canvas user_id of the launching user. Only available when launched by a logged in user.
# @example
# ```
# 420000000000042
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.user.id' , [ ] ,
- > { @current_user . id } ,
USER_GUARD
2016-12-06 06:06:35 +08:00
# Returns the users preference for high contrast colors (an accessibility feature). Only available when launched by a logged in user.
# @example
# ```
# false
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.user.prefersHighContrast' , [ ] ,
- > { @current_user . prefers_high_contrast? ? 'true' : 'false' } ,
USER_GUARD
2016-06-16 02:10:32 +08:00
# returns the context ids for the groups the user belongs to in the course.
# @example
# ```
# 1c16f0de65a080803785ecb3097da99872616f0d,d4d8d6ae1611e2c7581ce1b2f5c58019d928b79d,...
# ```
register_expansion 'Canvas.group.contextIds' , [ ] ,
- > { @current_user . groups . active . where ( context_type : 'Course' , context_id : @context . id ) . map do | g |
Lti :: Asset . opaque_identifier_for ( g )
end . join ( ',' ) } ,
- > { @current_user && @context . is_a? ( Course ) }
2016-12-06 06:06:35 +08:00
# Returns the <a href="https://www.imsglobal.org/specs/ltimemv1p0/specification-3">IMS LTI membership service</a> roles for filtering via query parameters.
# Only available when launched by a logged in user.
2017-02-08 04:51:01 +08:00
# associated launch param name: 'roles'
2016-12-06 06:06:35 +08:00
# @example
# ```
# http://purl.imsglobal.org/vocab/lis/v2/institution/person#Administrator
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Membership.role' , [ ] ,
- > { lti_helper . all_roles ( 'lis2' ) } ,
2017-02-08 04:51:01 +08:00
USER_GUARD ,
default_name : 'roles'
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns list of <a href="https://www.imsglobal.org/specs/ltiv1p0/implementation-guide#toc-16" target ="_blank">LIS role full URNs</a>.
# Should always be available.
# @example
# ```
# http://purl.imsglobal.org/vocab/lis/v2/institution/person#Administrator
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.xuser.allRoles' , [ ] ,
- > { lti_helper . all_roles }
2016-12-06 06:06:35 +08:00
# Returns the Canvas user_id of the launching user. Only available when launched by a logged in user.
# @example
# ```
# 420000000000042
# ```
2015-10-22 05:03:34 +08:00
register_expansion 'Canvas.user.globalId' , [ ] ,
- > { @current_user . global_id } ,
USER_GUARD
2016-12-06 06:06:35 +08:00
# Returns true for root account admins and false for all other roles. Only available when launched by a logged in user.
# @example
# ```
# true
# ```
2016-11-17 23:36:15 +08:00
register_expansion 'Canvas.user.isRootAccountAdmin' , [ ] ,
- > { @current_user . roles ( @root_account ) . include? 'root_admin' } ,
USER_GUARD
2016-12-06 06:06:35 +08:00
# Returns the username/Login ID for the primary pseudonym for the user for the account
# This may not be the pseudonym the user is actually logged in with. Only available when pseudonym is in use.
# ```
# jdoe
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'User.username' , [ ] ,
- > { sis_pseudonym . unique_id } ,
PSEUDONYM_GUARD
2016-12-06 06:06:35 +08:00
# Returns the username/Login ID for the primary pseudonym for the user for the account
# This may not be the pseudonym the user is actually logged in with. Only available when pseudonym is in use.
# ```
# jdoe
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.user.loginId' , [ ] ,
- > { sis_pseudonym . unique_id } ,
PSEUDONYM_GUARD
2016-12-06 06:06:35 +08:00
# Returns the sis source id for the primary pseudonym for the user for the account
# This may not be the pseudonym the user is actually logged in with. Only available when pseudonym is in use.
# ```
# sis_user_42
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.user.sisSourceId' , [ ] ,
- > { sis_pseudonym . sis_user_id } ,
PSEUDONYM_GUARD
2016-12-06 06:06:35 +08:00
# Returns the integration id for the primary pseudonym for the user for the account
# This may not be the pseudonym the user is actually logged in with. Only available when pseudonym is in use.
# ```
# integration_user_42
# ```
2016-01-23 05:43:11 +08:00
register_expansion 'Canvas.user.sisIntegrationId' , [ ] ,
- > { sis_pseudonym . integration_id } ,
PSEUDONYM_GUARD
2016-12-06 06:06:35 +08:00
# Returns the sis source id for the primary pseudonym for the user for the account
# This may not be the pseudonym the user is actually logged in with. Only available when pseudonym is in use.
# ```
# sis_user_42
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Person.sourcedId' , [ ] ,
- > { sis_pseudonym . sis_user_id } ,
2017-02-08 04:51:01 +08:00
PSEUDONYM_GUARD ,
default_name : 'lis_person_sourcedid'
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the logout service url for the user.
# This is the pseudonym the user is actually logged in as.
# It may not hold all the sis info needed in other launch substitutions.
# ```
# https://<domain>.instructure.com/api/lti/v1/logout_service/<external_tool_id>-<user_id>-<current_unix_timestamp>-<opaque_id>
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.logoutService.url' , [ ] ,
- > { @controller . lti_logout_service_url ( Lti :: LogoutService . create_token ( @tool , @current_pseudonym ) ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-01-08 01:54:38 +08:00
- > { @current_pseudonym && @tool }
2016-12-06 06:06:35 +08:00
# Returns the Canvas user_id for the masquerading user.
# This is the pseudonym the user is actually logged in as.
# It may not hold all the sis info needed in other launch substitutions.
# Only available when the user is being masqueraded.
# ```
# 420000000000042
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.masqueradingUser.id' , [ ] ,
2015-05-12 01:05:45 +08:00
- > { @controller . logged_in_user . id } ,
MASQUERADING_GUARD
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the 40 character opaque user_id for masquerading user.
# This is the pseudonym the user is actually logged in as.
# It may not hold all the sis info needed in other launch substitutions.
# Only available when the user is being masqueraded.
# ```
# da12345678cb37ba1e522fc7c5ef086b7704eff9
# ```
2015-04-28 03:41:05 +08:00
register_expansion 'Canvas.masqueradingUser.userId' , [ ] ,
- > { @tool . opaque_identifier_for ( @controller . logged_in_user ) } ,
2015-05-12 01:05:45 +08:00
MASQUERADING_GUARD
2015-04-28 03:41:05 +08:00
2016-12-06 06:06:35 +08:00
# Returns the xapi url for the user.
# ```
# https://<domain>.instructure.com/api/lti/v1/xapi/<external_tool_id>-<user_id>-<course_id>-<current_unix_timestamp>-<opaque_id>
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.xapi.url' , [ ] ,
2015-01-28 04:33:11 +08:00
- > { @controller . lti_xapi_url ( Lti :: AnalyticsService . create_token ( @tool , @current_user , @context ) ) } ,
- > { @current_user && @context . is_a? ( Course ) && @tool }
2016-12-06 06:06:35 +08:00
# Returns the caliper url for the user.
# ```
# https://<domain>.instructure.com/api/lti/v1/caliper/<external_tool_id>-<user_id>-<course_id>-<current_unix_timestamp>-<opaque_id>
# ```
2015-02-24 06:49:19 +08:00
register_expansion 'Caliper.url' , [ ] ,
2015-01-28 04:33:11 +08:00
- > { @controller . lti_caliper_url ( Lti :: AnalyticsService . create_token ( @tool , @current_user , @context ) ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-01-08 01:54:38 +08:00
- > { @current_user && @context . is_a? ( Course ) && @tool }
2016-12-06 06:06:35 +08:00
# Returns a comma separated list of section_id's that the user is enrolled in.
# Only available when launched from a course as an enrolled user.
# ```
# 42, 43
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.sectionIds' , [ ] ,
- > { lti_helper . section_ids } ,
ENROLLMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns a comma separated list of section sis_id's that the user is enrolled in.
# Only available when launched from a course as an enrolled user.
# ```
# section_sis_id_1, section_sis_id_2
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.course.sectionSisSourceIds' , [ ] ,
- > { lti_helper . section_sis_ids } ,
ENROLLMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns the module_id that the module item was launched from.
# Only available when content tag is present.
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.module.id' , [ ] ,
2015-06-26 04:56:13 +08:00
- > {
@content_tag . context_module_id
} ,
2015-01-08 01:54:38 +08:00
CONTENT_TAG_GUARD
2016-12-06 06:06:35 +08:00
# Returns the module_item_id of the module item that was launched.
# Only available when content tag is present.
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.moduleItem.id' , [ ] ,
2015-06-26 04:56:13 +08:00
- > {
@content_tag . id
} ,
2015-01-08 01:54:38 +08:00
CONTENT_TAG_GUARD
2016-12-06 06:06:35 +08:00
# Returns the assignment_id of the assignment that was launched.
# Only available when launched as an assignment.
# ```
# 1234
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.assignment.id' , [ ] ,
- > { @assignment . id } ,
ASSIGNMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns the title of the assignment that was launched.
# Only available when launched as an assignment.
# ```
# Deep thought experiment
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.assignment.title' , [ ] ,
- > { @assignment . title } ,
ASSIGNMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns the points possible of the assignment that was launched.
# Only available when launched as an assignment.
# ```
# 100
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'Canvas.assignment.pointsPossible' , [ ] ,
2016-05-11 22:03:11 +08:00
- > { TextHelper . round_if_whole ( @assignment . points_possible ) } ,
2015-01-08 01:54:38 +08:00
ASSIGNMENT_GUARD
2016-12-06 06:06:35 +08:00
2016-03-11 12:49:32 +08:00
# @deprecated in favor of ISO8601
2015-03-13 06:29:38 +08:00
register_expansion 'Canvas.assignment.unlockAt' , [ ] ,
- > { @assignment . unlock_at } ,
ASSIGNMENT_GUARD
2016-03-11 12:49:32 +08:00
# @deprecated in favor of ISO8601
2015-03-13 06:29:38 +08:00
register_expansion 'Canvas.assignment.lockAt' , [ ] ,
- > { @assignment . lock_at } ,
ASSIGNMENT_GUARD
2016-03-11 12:49:32 +08:00
# @deprecated in favor of ISO8601
2015-03-13 06:29:38 +08:00
register_expansion 'Canvas.assignment.dueAt' , [ ] ,
- > { @assignment . due_at } ,
ASSIGNMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns the unlock_at date of the assignment that was launched.
# Only available when launched as an assignment.
# ```
# YYYY-MM-DDT07:00:00Z
# ```
2015-08-26 05:07:33 +08:00
register_expansion 'Canvas.assignment.unlockAt.iso8601' , [ ] ,
- > { @assignment . unlock_at . utc . iso8601 } ,
2015-10-20 01:05:17 +08:00
- > { @assignment && @assignment . unlock_at . present? }
2015-08-26 05:07:33 +08:00
2016-12-06 06:06:35 +08:00
# Returns the lock_at date of the assignment that was launched.
# Only available when launched as an assignment.
# ```
# YYYY-MM-DDT07:00:00Z
# ```
2015-08-26 05:07:33 +08:00
register_expansion 'Canvas.assignment.lockAt.iso8601' , [ ] ,
- > { @assignment . lock_at . utc . iso8601 } ,
2015-10-20 01:05:17 +08:00
- > { @assignment && @assignment . lock_at . present? }
2015-08-26 05:07:33 +08:00
2016-12-06 06:06:35 +08:00
# Returns the due_at date of the assignment that was launched.
# Only available when launched as an assignment.
# ```
# YYYY-MM-DDT07:00:00Z
# ```
2015-08-26 05:07:33 +08:00
register_expansion 'Canvas.assignment.dueAt.iso8601' , [ ] ,
- > { @assignment . due_at . utc . iso8601 } ,
2015-10-20 01:05:17 +08:00
- > { @assignment && @assignment . due_at . present? }
2015-08-26 05:07:33 +08:00
2016-12-06 06:06:35 +08:00
# Returns the true if the assignment that was launched is published.
# Only available when launched as an assignment.
# ```
# true
# ```
2016-06-21 11:51:25 +08:00
register_expansion 'Canvas.assignment.published' , [ ] ,
- > { @assignment . workflow_state == 'published' } ,
2016-06-17 01:30:26 +08:00
ASSIGNMENT_GUARD
2016-12-06 06:06:35 +08:00
# Returns the endpoint url for accessing link-level tool settings
# Only available for LTI 2.0
# ```
# https://<domain>.instructure.com/api/lti/tool_settings/<link_id>
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'LtiLink.custom.url' , [ ] ,
- > { @controller . show_lti_tool_settings_url ( @tool_setting_link_id ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-01-08 01:54:38 +08:00
- > { @tool_setting_link_id }
2016-12-06 06:06:35 +08:00
# Returns the endpoint url for accessing context-level tool settings
# Only available for LTI 2.0
# ```
# https://<domain>.instructure.com/api/lti/tool_settings/<binding_id>
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'ToolProxyBinding.custom.url' , [ ] ,
- > { @controller . show_lti_tool_settings_url ( @tool_setting_binding_id ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2015-01-08 01:54:38 +08:00
- > { @tool_setting_binding_id }
2016-12-06 06:06:35 +08:00
# Returns the endpoint url for accessing system-wide tool settings
# Only available for LTI 2.0
# ```
# https://<domain>.instructure.com/api/lti/tool_settings/<proxy_id>
# ```
2015-01-08 01:54:38 +08:00
register_expansion 'ToolProxy.custom.url' , [ ] ,
- > { @controller . show_lti_tool_settings_url ( @tool_setting_proxy_id ) } ,
2016-10-28 03:57:01 +08:00
- > { ! ! @controller && @tool_setting_proxy_id }
2015-01-08 01:54:38 +08:00
2016-12-06 06:06:35 +08:00
# Returns the <a href="https://www.imsglobal.org/specs/ltiv2p0/implementation-guide#toc-46" target="_blank">Tool Consumer Profile</a> url for the tool.
# Only available for LTI 2.0
# ```
# https://<domain>.instructure.com/api/lti/courses/<course_id>/tool_consumer_profile/<opaque_id>
# https://<domain>.instructure.com/api/lti/accounts/<account_id>/tool_consumer_profile/<opaque_id>
# ```
2015-01-16 02:47:16 +08:00
register_expansion 'ToolConsumerProfile.url' , [ ] ,
2015-10-29 05:58:10 +08:00
- > { @controller . polymorphic_url ( [ @tool . context , :tool_consumer_profile ] , tool_consumer_profile_id : Lti :: ToolConsumerProfileCreator :: TCP_UUID ) } ,
2016-10-28 03:57:01 +08:00
CONTROLLER_GUARD ,
2016-06-08 02:45:50 +08:00
- > { @tool && @tool . is_a? ( Lti :: ToolProxy ) }
2015-01-16 02:47:16 +08:00
2015-02-11 07:40:06 +08:00
register_expansion 'Canvas.file.media.id' , [ ] ,
- > { ( @attachment . media_object && @attachment . media_object . media_id ) || @attachment . media_entry_id } ,
MEDIA_OBJECT_ID_GUARD
register_expansion 'Canvas.file.media.type' , [ ] ,
- > { @attachment . media_object . media_type } ,
MEDIA_OBJECT_GUARD
register_expansion 'Canvas.file.media.duration' , [ ] ,
- > { @attachment . media_object . duration } ,
MEDIA_OBJECT_GUARD
register_expansion 'Canvas.file.media.size' , [ ] ,
- > { @attachment . media_object . total_size } ,
MEDIA_OBJECT_GUARD
register_expansion 'Canvas.file.media.title' , [ ] ,
- > { @attachment . media_object . user_entered_title || @attachment . media_object . title } ,
MEDIA_OBJECT_GUARD
register_expansion 'Canvas.file.usageRights.name' , [ ] ,
- > { @attachment . usage_rights . license_name } ,
USAGE_RIGHTS_GUARD
register_expansion 'Canvas.file.usageRights.url' , [ ] ,
- > { @attachment . usage_rights . license_url } ,
USAGE_RIGHTS_GUARD
register_expansion 'Canvas.file.usageRights.copyrightText' , [ ] ,
- > { @attachment . usage_rights . legal_copyright } ,
USAGE_RIGHTS_GUARD
2015-01-08 01:54:38 +08:00
private
def sis_pseudonym
@sis_pseudonym || = @current_user . find_pseudonym_for_account ( @root_account ) if @current_user
end
2015-05-14 01:00:18 +08:00
def expand_substring_variables ( value )
value . to_s . scan ( SUBSTRING_REGEX ) . inject ( value ) do | v , match |
substring = " ${ #{ match } } "
v . gsub ( substring , ( self [ match ] || substring ) . to_s )
end
end
2015-01-08 01:54:38 +08:00
end
2015-05-14 01:00:18 +08:00
end