--- loncom/auth/lonroles.pm 2017/10/27 17:43:47 1.335
+++ loncom/auth/lonroles.pm 2018/05/28 23:26:12 1.338
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# User Roles Screen
#
-# $Id: lonroles.pm,v 1.335 2017/10/27 17:43:47 raeburn Exp $
+# $Id: lonroles.pm,v 1.338 2018/05/28 23:26:12 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -145,6 +145,8 @@ use GDBM_File;
use LONCAPA qw(:DEFAULT :match);
use HTML::Entities;
+my $registered_cleanup;
+my $rosterupdates;
sub redirect_user {
my ($r,$title,$url,$msg) = @_;
@@ -153,20 +155,26 @@ sub redirect_user {
&Apache::loncommon::no_cache($r);
$r->send_http_header;
- # Breadcrumbs
- my $brcrum = [{'href' => $url,
- 'text' => 'Switching Role'},];
- my $start_page = &Apache::loncommon::start_page('Switching Role',undef,
- {'redirect' => [1,$url],
- 'bread_crumbs' => $brcrum,});
- my $end_page = &Apache::loncommon::end_page();
+ my $start_page;
+ if ($env{'request.lti.login'}) {
+ $start_page = &Apache::loncommon::start_page(undef,undef,
+ {'redirect' => [0,$url],}).$msg;
+ } else {
+ # Breadcrumbs
+ my $brcrum = [{'href' => $url,
+ 'text' => 'Switching Role'},];
+ $start_page = &Apache::loncommon::start_page('Switching Role',undef,
+ {'redirect' => [1,$url],
+ 'bread_crumbs' => $brcrum,}).
+ "\n
$msg
";
+ }
+ my $end_page = &Apache::loncommon::end_page();
# Note to style police:
# This must only replace the spaces, nothing else, or it bombs elsewhere.
$url=~s/ /\%20/g;
$r->print(<$msg
$end_page
ENDREDIR
return;
@@ -222,6 +230,8 @@ sub handler {
$update = $then;
}
+ $registered_cleanup=0;
+ @{$rosterupdates}=();
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
# -------------------------------------------------- Check if setting hot list
@@ -643,6 +653,10 @@ ENDENTERKEY
$cdom.'_'.$cnum);
}
}
+ if (($env{'request.lti.login'}) &&
+ ($env{'request.lti.rosterid'} || $env{'request.lti.passbackid'})) {
+ &process_lti($r,$cdom,$cnum);
+ }
$r->internal_redirect($dest);
}
return OK;
@@ -664,6 +678,10 @@ ENDENTERKEY
if (($ferr) && ($tadv)) {
&error_page($r,$ferr,$furl);
} else {
+ if (($env{'request.lti.login'}) &&
+ ($env{'request.lti.rosterid'} || $env{'request.lti.passbackid'})) {
+ &process_lti($r,$cdom,$cnum);
+ }
# Check to see if the user is a CC entering a course
# for the first time
if ((($role eq 'cc') || ($role eq 'co'))
@@ -738,9 +756,12 @@ ENDENTERKEY
$dest .= (($dest =~/\?/)? '&':'?').'symb='.$esc_symb;
}
}
- &redirect_user($r, &mt('Entering [_1]',
- $env{'course.'.$cdom.'_'.$cnum.'.description'}),
- $dest, $msg);
+ my $title;
+ unless ($env{'request.lti.login'}) {
+ $title = &mt('Entering [_1]',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'});
+ }
+ &redirect_user($r,$title,$dest,$msg);
return OK;
}
if (&Apache::lonnet::allowed('whn',
@@ -778,11 +799,16 @@ ENDENTERKEY
} elsif ($access eq 'B') {
$furl = '/adm/navmaps?showOnlyHomework=1';
}
- $msg = &mt('Entering [_1] ...',
- $env{'course.'.$cdom.'_'.$cnum.'.description'});
- &redirect_user($r, &mt('Entering [_1]',
- $env{'course.'.$cdom.'_'.$cnum.'.description'}),
- $furl, $msg);
+ my $title;
+ if ($env{'request.lti.login'}) {
+ undef($msg);
+ } else {
+ $title = &mt('Entering [_1]',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'});
+ $msg = &mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'});
+ }
+ &redirect_user($r,$title,$furl,$msg);
}
return OK;
}
@@ -1635,6 +1661,7 @@ sub findcourse_advice {
'.&mt('You are in a section of course for which automatic enrollment in the corresponding LON-CAPA course is not active.').'
'.&mt('The start date for automated enrollment has yet to be reached.').'
'.&mt('You registered for the course recently and there is a time lag between the time you register, and the time this information becomes available for the update of LON-CAPA course rosters.').'
+ '.&mt('Automated enrollment added you to the course in the time since you last logged in.').' '.&mt('If that is the case you can use the "Check for changes" link in the gray Functions bar to update the list of your available course roles.').'
');
} else {
$r->print(&mt('If you were expecting to see an active role listed for a particular course, that course may not have been created yet.').'
');
@@ -3079,6 +3106,84 @@ sub get_queued {
$output.'
';
}
+sub process_lti {
+ my ($r,$cdom,$cnum) = @_;
+ my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider');
+ my $uriscope = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},
+ $cdom,$cnum);
+ my $lonhost = $r->dir_config('lonHostID');
+ my $internet_names = &Apache::lonnet::get_internet_names($lonhost);
+ if ($env{'request.lti.rosterid'} &&
+ $env{'request.lti.rosterurl'}) {
+ if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {
+ if ($lti{$env{'request.lti.login'}}{'roster'}) {
+ my @lcroles = ('in','ta','ep','st');
+ my @possibleroles;
+ foreach my $role (@lcroles) {
+ if (&Apache::lonnet::allowed('c'.$role,"$cdom/$cnum")) {
+ push(@possibleroles,$role);
+ }
+ }
+ my $owner = $env{'course.'.$cdom.'_'.$cnum.'.internal.courseowner'};
+ if ($owner eq $env{'user.name'}.':'.$env{'user.domain'}) {
+ my $crstype = &Apache::loncommon::course_type($cdom.'_'.$cnum);
+ if ($crstype eq 'Community') {
+ unshift(@possibleroles,'co');
+ } else {
+ unshift(@possibleroles,'cc');
+ }
+ }
+ if (@possibleroles) {
+ push(@{$rosterupdates},{cid => $cdom.'_'.$cnum,
+ lti => $env{'request.lti.login'},
+ ltiref => $lti{$env{'request.lti.login'}},
+ id => $env{'request.lti.rosterid'},
+ url => $env{'request.lti.rosterurl'},
+ sourcecrs => $env{'request.lti.sourcecrs'},
+ uriscope => $uriscope,
+ possroles => \@possibleroles,
+ intdoms => $internet_names,
+ });
+ unless ($registered_cleanup) {
+ my $handlers = $r->get_handlers('PerlCleanupHandler');
+ $r->set_handlers('PerlCleanupHandler' =>
+ [\<ienroll,@{$handlers}]);
+ $registered_cleanup=1;
+ }
+ }
+ }
+ }
+ }
+ if ($env{'request.lti.passbackid'} &&
+ $env{'request.lti.passbackurl'}) {
+ if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {
+ if ($lti{$env{'request.lti.login'}}{'passback'}) {
+ my ($pbnum,$error) =
+ &LONCAPA::ltiutils::store_passbackurl($env{'request.lti.login'},
+ $env{'request.lti.passbackurl'},
+ $cdom,$cnum);
+ if ($pbnum eq '') {
+ $pbnum = $env{'request.lti.passbackurl'};
+ }
+ &Apache::lonnet::put('nohist_'.$cdom.'_'.$cnum.'_passback',
+ {"$uriscope\0$env{'request.lti.sourcecrs'}\0$env{'request.lti.login'}" =>
+ "$pbnum\0$env{'request.lti.passbackid'}"});
+ }
+ }
+ }
+ return;
+}
+
+sub ltienroll {
+ if (ref($rosterupdates) eq 'ARRAY') {
+ foreach my $item (@{$rosterupdates}) {
+ if (ref($item) eq 'HASH') {
+ &LONCAPA::ltiutils::batchaddroster($item);
+ }
+ }
+ }
+}
+
1;
__END__