- #32: Update
UserProfile.name
with{given_name} {family_name}
if present in claims
- #30: Store
given_name
andfamily_name
claims onUser
object if present- Stored on
User.first_name
andUser.last_name
, respectively
- Stored on
- #28: Stores JWT email claim in
UserProfile.meta
andLtiProfile.email
if present- Adds
email
field toLtiProfile
- Creates
UserProfile
if it doesn't exist
- Adds
- #25: Adds
allowed_courses
toLaunchGate
- #21: Adds API to manage
LtiToolKey
's at a tenant level - #22: Adds API to manage
LtiTool
's at a tenant level
- #15: Adds a
LtiToolOrg
model to associate Tools with an Organization (multi-tenant)
- #15: Log statment error when launching with no launch gate
- #16: Adds a
LaunchGate
model where we can define whether a tool can launch a specificUsageKey
- If no
LaunchGate
is attached to the tool, there are no restrictions - If a
LaunchGate
is attached to the tool, the tool can only launch if theUsageKey
is explicitly defined or theUsageKey
belongs to a white listed org
- If no
- #12: Return actionable error messages to the user.
- #10: If
LTI_1P3_PROVIDER_ACCESS_LENGTH_SEC
isNone
(default), allow access as long as logged in.
- 💥 #1: Use static
redirect_uri
(/lti/1p3/launch/
); 302 redirect totarget_link_uri
after POST toredirect_uri
(Breaking Change) - #6: Show nicer error page if user hits browser Back button after launch
- #4: Pull in
generate_random_edx_username
definition fromlms.djangoapps.lti_provider.users