+//
+
+ENDCLOSE
+ &start_loading_course($r,$title,$only_body);
+ if ($only_body) {
+ $r->print(''.$title.' ');
+ }
+ my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble);
+ &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Loading ...'));
+ $r->rflush();
+ if ($critmsg_check) {
+ my $blockcrit = &Apache::loncommon::blocking_status('alert',$clientip,$cnum,$cdom,undef,1);
+ if ($blockcrit) {
+ my $checkrole = "cm./$cdom/$cnum";
+ if ($csec ne '') {
+ $checkrole .= "/$csec";
+ }
+ unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) &&
+ ($trolecode !~ m{^st\./$cdom/$cnum})) {
+ $critmsg_check = 0;
+ }
+ }
+ }
+ my ($furl,$ferr)=
+ &Apache::lonuserstate::readmap($cdom.'/'.$cnum,$critmsg_check);
+ &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!'));
+ &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
+ $r->print($closure);
+ $r->rflush();
+ if ($ferr) {
+ $furl = '/adm/roles?tryagain=1';
+ } else {
+ &Apache::lonnet::appenv({'request.course.timechecked'=>$now});
unless (($env{'form.switchrole'}) ||
($env{"environment.internal.$cdom.$cnum.$role.adhoc"})) {
&Apache::lonnet::put('nohist_crslastlogin',
@@ -606,7 +899,6 @@ ENDENTERKEY
my ($feeds,$syllabus_time);
&Apache::lonrss::advertisefeeds($cnum,$cdom,undef,\$feeds);
&Apache::lonnet::appenv({'request.course.feeds' => $feeds});
- &Apache::lonnet::get_numsuppfiles($cnum,$cdom,1);
unless ($env{'course.'.$cdom.'_'.$cnum.'.updatedsyllabus'}) {
unless (($env{'course.'.$cdom.'_'.$cnum.'.externalsyllabus'}) ||
($env{'course.'.$cdom.'_'.$cnum.'.uploadedsyllabus'})) {
@@ -632,9 +924,26 @@ ENDENTERKEY
}
if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
&Apache::lonnet::appenv({'request.role.adv'=>$tadv});
+ if ($ferr) {
+ if ($env{'form.orgurl'}) {
+ $furl .= '&orgurl='.&HTML::Entities::encode($env{'form.orgurl'},'<>&"');
+ }
+ if ($env{'form.symb'}) {
+ $furl .= '&symb='.&HTML::Entities::encode($env{'form.symb'},'<>&"');
+ }
+ } else {
+ &set_supplemental_access($cnum,$cdom);
+ }
if (($ferr) && ($tadv)) {
- &error_page($r,$ferr,$dest);
+ &error_page($r,$ferr,$furl);
} else {
+ if ($env{'request.course.id'} eq $cdom.'_'.$cnum) {
+ if (($env{'form.orgurl'} ne '') && ($env{'form.symb'} ne '')) {
+ unless (&Apache::lonnet::symbverify($env{'form.symb'},$env{'form.orgurl'})) {
+ $dest=$env{'form.orgurl'};
+ }
+ }
+ }
if ($dest =~ m{^/adm/coursedocs\?folderpath}) {
if ($env{'request.course.id'} eq $cdom.'_'.$cnum) {
my $chome = &Apache::lonnet::homeserver($cnum,$cdom);
@@ -642,27 +951,62 @@ ENDENTERKEY
$cdom.'_'.$cnum);
}
}
- $r->internal_redirect($dest);
+ if ($ferr) {
+ if (!$env{'request.course.id'}) {
+ &Apache::lonnet::appenv(
+ {"request.course.id" => $cdom.'_'.$cnum});
+ $r->print(''.
+ &mt('Could not initialize [_1] at this time.',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
'.
+ ''.
+ &mt('Please try again.').'
'.
+ &Apache::loncommon::end_page());
+ }
+ } else {
+ if (($env{'request.lti.login'}) &&
+ ($env{'request.lti.rosterid'} || $env{'request.lti.passbackid'})) {
+ &process_lti($r,$cdom,$cnum);
+ }
+ if ($env{'request.deeplink.login'}) {
+ &set_deeplink_target($cnum,$cdom);
+ }
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ &finish_loading_course($r,$msg,$dest,$only_body);
+ }
}
+ $r->rflush();
return OK;
} else {
if (!$env{'request.course.id'}) {
&Apache::lonnet::appenv(
{"request.course.id" => $cdom.'_'.$cnum});
- $furl='/adm/roles?tryagain=1';
- $msg=''
- .&mt('Could not initialize [_1] at this time.',
- $env{'course.'.$cdom.'_'.$cnum.'.description'})
- .'
'
- .''.&mt('Please try again.').'
'
- .''.$ferr.'
';
}
if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
&Apache::lonnet::appenv({'request.role.adv'=>$tadv});
-
- if (($ferr) && ($tadv)) {
- &error_page($r,$ferr,$furl);
+ if ($ferr) {
+ if ($tadv) {
+ &error_page($r,$ferr,$furl);
+ } else {
+ $r->print(''.
+ &mt('Could not initialize [_1] at this time.',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
'.
+ ''.&mt('Please try again.').'
'.
+ ''.
+ &Apache::loncommon::end_page());
+ }
} else {
+ &set_supplemental_access($cnum,$cdom);
+ if (($env{'request.lti.login'}) &&
+ ($env{'request.lti.rosterid'} || $env{'request.lti.passbackid'})) {
+ &process_lti($r,$cdom,$cnum);
+ }
+ if ($env{'request.deeplink.login'}) {
+ &set_deeplink_target($cnum,$cdom);
+ }
# Check to see if the user is a CC entering a course
# for the first time
if ((($role eq 'cc') || ($role eq 'co'))
@@ -675,9 +1019,11 @@ ENDENTERKEY
my ($score,$incomplete) =
&Apache::lonplacementtest::check_completion(undef,undef,1);
if (($incomplete) && ($incomplete < 100)) {
- &redirect_user($r, &mt('Entering [_1]',
- $env{'course.'.$cdom.'_'.$cnum.'.description'}),
- '/adm/placement', $msg);
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ &finish_loading_course($r,$msg,'/adm/placement',$only_body);
+ $r->rflush();
return OK;
}
}
@@ -697,8 +1043,11 @@ ENDENTERKEY
($dest =~ m{^\Q/adm/wrapper/ext/\E(?!https:)})) {
if ($ENV{'SERVER_PORT'} == 443) {
my $hostname = $r->hostname();
- if ($hostname ne '') {
- $dest = 'http://'.$hostname.$dest;
+ unless ((&Apache::lonnet::uses_sts()) ||
+ (&Apache::lonnet::waf_allssl($hostname))) {
+ if ($hostname ne '') {
+ $dest = 'http://'.$hostname.$dest;
+ }
}
}
}
@@ -737,9 +1086,16 @@ ENDENTERKEY
$dest .= (($dest =~/\?/)? '&':'?').'symb='.$esc_symb;
}
}
- &redirect_user($r, &mt('Entering [_1]',
- $env{'course.'.$cdom.'_'.$cnum.'.description'}),
- $dest, $msg);
+ if ($env{'form.ttoken'}) {
+ $dest .= (($dest =~/\?/)? '&':'?').'ttoken='.$env{'form.ttoken'};
+ }
+ unless (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ }
+ &finish_loading_course($r,$msg,$dest,$only_body);
+ $r->rflush();
return OK;
}
if (&Apache::lonnet::allowed('whn',
@@ -750,39 +1106,66 @@ ENDENTERKEY
) {
my $startpage = &courseloadpage($env{'request.course.id'});
unless ($startpage eq 'firstres') {
- $msg = &mt('Entering [_1] ...',
- $env{'course.'.$env{'request.course.id'}.'.description'});
- &redirect_user($r, &mt('New in course'),
- '/adm/whatsnew?refpage=start', $msg);
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ &finish_loading_course($r,$msg,'/adm/whatsnew?refpage=start',$only_body);
+ $r->rflush();
return OK;
}
}
}
# Are we allowed to look at the first resource?
- my $access;
- if ($furl =~ m{^(/adm/wrapper|)/ext/}) {
- # If it's an external resource,
- # strip off the symb argument and possible query
- my ($exturl,$symb) = ($furl =~ m{^(.+)(?:\?|\&)symb=(.+)$});
- # Unencode $symb
- $symb = &unescape($symb);
- # Then check for permission
- $access = &Apache::lonnet::allowed('bre',$exturl,$symb);
- # For other resources just check for permission
+ #
+ # $furl returned by lonuserstate::readmap() has format:
+ # $url?symb=escaped($symb). If the resource has the
+ # encrypturl parameter in effect, the entire string
+ # $url?symb=escaped($symb) is encrypted as a string
+ # beginning /enc/.
+ #
+ my ($access,$unencfurl,$unencsymb);
+ if ($furl =~ m{^(.+)(?:\?|\&)symb=([^&]+)(?:$|&)}) {
+ my ($poss_url,$poss_symb) = ($1,$2);
+ $unencsymb = &unescape($poss_symb);
+ $unencfurl = $poss_url;
+ } elsif ($furl =~ m{^/enc/}) {
+ my $unenc = &Apache::lonenc::unencrypted($furl);
+ if ($unenc =~ m{^(.+)(?:\?|\&)symb=([^&]+)(?:$|&)}) {
+ ($unencfurl,$unencsymb) = ($1,$2);
+ $unencsymb = &unescape($unencsymb);
+ } else {
+ $unencfurl = $unenc;
+ }
+ } else {
+ $unencfurl = $furl;
+ }
+ if ($unencsymb) {
+ my $symb = &Apache::lonnet::symbclean($unencsymb);
+ if (($symb ne '') && (&Apache::lonnet::symbverify($symb,$unencfurl))) {
+ $access = &Apache::lonnet::allowed('bre',$unencfurl,$symb);
+ } else {
+ $access = &Apache::lonnet::allowed('bre',$unencfurl);
+ }
} else {
- $access = &Apache::lonnet::allowed('bre',$furl);
+ $access = &Apache::lonnet::allowed('bre',$unencfurl);
}
- if (!$access) {
+ if ((!$access) || ($access eq 'B') || ($access eq 'D')) {
$furl = &Apache::lonpageflip::first_accessible_resource();
- } elsif ($access eq 'B') {
- $furl = '/adm/navmaps?showOnlyHomework=1';
+ if ($furl eq '') {
+ $furl = '/adm/navmaps?showOnlyHomework=1';
+ }
+ }
+ if ($env{'request.lti.login'}) {
+ undef($msg);
+ &finish_loading_course($r,$msg,$furl,$only_body);
+ } else {
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ &finish_loading_course($r,$msg,$furl,$only_body);
}
- $msg = &mt('Entering [_1] ...',
- $env{'course.'.$cdom.'_'.$cnum.'.description'});
- &redirect_user($r, &mt('Entering [_1]',
- $env{'course.'.$cdom.'_'.$cnum.'.description'}),
- $furl, $msg);
}
+ $r->rflush();
return OK;
}
}
@@ -796,6 +1179,12 @@ ENDENTERKEY
$redirect_url .= $where;
}
$redirect_url .= '/';
+ if ($env{'form.orgurl'} =~ /^\Q$redirect_url\E/) {
+ my ($path) = ($env{'form.orgurl'} =~ m{^(.+)/[^/]+$});
+ if (($path ne '') && (-e $Apache::lonnet::perlvar{'lonDocRoot'}.$path)) {
+ $redirect_url = $env{'form.orgurl'};
+ }
+ }
&redirect_user($r,&mt('Entering Authoring Space'),
$redirect_url);
return OK;
@@ -846,7 +1235,11 @@ ENDENTERKEY
$crumbtext = 'Courses';
$pagetitle = 'My Courses';
$recent = &mt('Recent Courses');
- $standby = &mt('Course selected. Please stand by.');
+ $standby = &mt('Course selected. Please stand by.');
+ }
+ if (($norolelist) && ((split(/:/,$env{'user.error.msg'}))[2])) {
+ $crumbtext = 'Access Denied';
+ $pagetitle = 'Unauthorized';
}
my $brcrum =[{href=>"/adm/roles",text=>$crumbtext}];
@@ -884,14 +1277,18 @@ ENDENTERKEY
$start_page=&Apache::loncommon::start_page($pagetitle,undef,
{bread_crumbs=>$brcrum,crstype=>'Placement'});
} else {
- $funcs = &get_roles_functions($showcount,$cattype);
- my $crumbsright;
- if ($env{'browser.mobile'}) {
- $crumbsright = $funcs;
- undef($funcs);
+ my ($crumbsright,$crumbs_style);
+ unless (($norolelist) && ((split(/:/,$env{'user.error.msg'}))[2])) {
+ $funcs = &get_roles_functions($showcount,$cattype,$domdefs{'userapprovals'});
+ if ($env{'browser.mobile'}) {
+ $crumbsright = $funcs;
+ undef($funcs);
+ $crumbs_style = 'overflow: visible;';
+ }
}
$start_page=&Apache::loncommon::start_page($pagetitle,undef,{bread_crumbs=>$brcrum,
- bread_crumbs_component=>$crumbsright});
+ bread_crumbs_component=>$crumbsright,
+ bread_crumbs_style=>$crumbs_style,});
}
&js_escape(\$standby);
my $noscript=''.&mt('Use of LON-CAPA requires Javascript to be enabled in your web browser.').' '.&mt('As this is not the case, most functionality in the system will be unavailable.').' ';
@@ -922,7 +1319,11 @@ function enterrole (thisform,rolecode,bu
}
function rolesView (caller) {
- if ((caller == 'showall') || (caller == 'noshowall')) {
+ if (caller == 'approvals') {
+ document.rolechoice.approvals.value = 'show';
+ } else if (caller == 'noapprovals') {
+ document.rolechoice.approvals.value = 'hide';
+ } else if ((caller == 'showall') || (caller == 'noshowall')) {
document.rolechoice.display.value = caller;
} else {
if ((caller == 'doupdate') || (caller == 'requestauthor') ||
@@ -995,9 +1396,18 @@ ENDHEADER
}
}
if ($nochoose) {
- $r->print("".&mt('Sorry ...')." \n".
- &mt('This action is currently not authorized.').' '.
- &Apache::loncommon::end_page());
+ $r->print("
+
".&mt('Sorry ...')." \n".
+ &mt('This action is currently not authorized.').' ');
+ if ($error && $norolelist) {
+ $r->print(''.
+ &mt('As your session was launched from a web page external to LON-CAPA some course content may be unavailable, including the resource you were trying to access.').
+ ' '.
+ ''.
+ &mt('You may need to login to LON-CAPA directly, or re-launch from a different external system.').
+ ' ');
+ }
+ $r->print(''.&Apache::loncommon::end_page());
return OK;
} else {
if ($updateresult || $reqauthor || $hotlist) {
@@ -1010,22 +1420,41 @@ ENDHEADER
}
if ($hotlist) {
$showresult .= $hotlist;
- }
+ }
$showresult .= '';
$r->print($showresult);
} elsif ($env{'form.state'} eq 'queued') {
$r->print(&get_queued());
+ } elsif ($env{'form.approvals'} eq 'show') {
+ if ($env{'form.state'} eq 'done') {
+ $r->print($approvalresult).' ';
+ }
+ $r->print('
'.&mt('Role assignments queued pending your acceptance').' '.
+ &get_approvals().
+ ' ');
}
if (($ENV{'REDIRECT_QUERY_STRING'}) && ($fn)) {
$fn.='?'.$ENV{'REDIRECT_QUERY_STRING'};
}
my $display = ($env{'form.display'} =~ /^(showall)$/);
+ my $approvals = ($env{'form.approvals'} =~ /^(show)$/);
$r->print('');
if ($countfuture) {
$r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture));
@@ -1333,8 +1786,8 @@ sub gather_roles {
if (!$allowed) {
$button=0;
unless ($trustchecked{$tdom}) {
- if ((&Apache::lonnet::will_trust('othcoau',$tdom,$env{'user.domain'})) &&
- (&Apache::lonnet::will_trust('coremau',$env{'user.domain'},$tdom))) {
+ if ((&Apache::lonnet::will_trust('othcoau',$env{'user.domain'},$tdom)) &&
+ (&Apache::lonnet::will_trust('coaurem',$tdom,$env{'user.domain'}))) {
$willtrust{$tdom} = 1;
$trustchecked{$tdom} = 1;
}
@@ -1391,9 +1844,9 @@ sub gather_roles {
foreach my $rolename (sort(keys(%{$domdef{'adhocroles'}}))) {
if (ref($domdef{'adhocroles'}{$rolename}) eq 'HASH') {
$adhocdesc{$tdom}{$rolename} = $domdef{'adhocroles'}{$rolename}{'desc'};
- $desc = $adhocdesc{$tdom}{$rolename};
}
}
+ $desc = $adhocdesc{$tdom}{$rolename};
}
}
if ($desc ne '') {
@@ -1549,7 +2002,7 @@ sub roletable_headers {
.&Apache::loncommon::start_data_table('LC_textsize_mobile')
.&Apache::loncommon::start_data_table_header_row()
);
- if (!$nochoose) { $r->print(' '); }
+ if (!$nochoose) { $r->print(''.&mt('Action').' '); }
$r->print(''.&mt('User Role').' '
.''.&mt('Extent').' '
.''.&mt('Start').' '
@@ -1623,20 +2076,26 @@ sub print_rolerows {
}
sub findcourse_advice {
- my ($r,$cattype) = @_;
+ my ($r,$cattype,$elapsed) = @_;
my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');
if (&Apache::lonnet::auto_run(undef,$env{'user.domain'})) {
- $r->print(&mt('If you were expecting to see an active role listed for a particular course in the [_1] domain, it may be missing for one of the following reasons:',$domdesc).'
+ $r->print(''.&mt('If you were expecting to see an active role listed for a particular course in the [_1] domain, it may be missing for one of the following reasons:',$domdesc).'
'.&mt('The course has yet to be created.').'
'.&mt('Automatic enrollment of registered students has not been enabled for the course.').'
'.&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.').' ');
+ $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.').'
');
+ if ($elapsed > 600) {
+ $r->print(''.&mt('You may also have been assigned to a course in the time since you last logged-in, or checked for changes.').
+ ' '.
+ &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.').'
');
+ }
}
if (($cattype eq 'std') || ($cattype eq 'domonly')) {
$r->print(''.&mt('Self-Enrollment').' '.
@@ -1648,7 +2107,7 @@ sub findcourse_advice {
}
sub requestcourse_advice {
- my ($r,$cattype,$inrole) = @_;
+ my ($r,$cattype,$inrole,$elapsed) = @_;
my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');
my (%can_request,%request_doms,$output);
@@ -1709,7 +2168,7 @@ sub requestcourse_advice {
} else {
$r->print(''.&mt('Currently no active roles, courses or communities').' ');
}
- &findcourse_advice($r,$cattype);
+ &findcourse_advice($r,$cattype,$elapsed);
}
return;
}
@@ -1829,7 +2288,7 @@ sub build_roletext {
$trolecode."','".$buttonname.'\');" />';
}
}
- if (($trolecode !~ m/^(dc|ca|au|aa)\./) && (!$skipcal)) {
+ if (($trolecode !~ m/^(ca|aa)\./) && ($trest ne '') && (!$skipcal)) {
$tremark.=&Apache::lonannounce::showday(time,1,
&Apache::lonannounce::readcalendar($tdom.'_'.$trest));
}
@@ -2096,6 +2555,38 @@ sub display_cc_role {
return ($roletext,$roletext_end);
}
+sub display_curr_role {
+ my ($currentrole) = @_;
+ my ($roletext,$roletext_end);
+ my $advanced = $env{'user.adv'};
+ my $tryagain = $env{'form.tryagain'};
+ my ($role,$rest) = split(m{\./},$currentrole,2);
+ unless (!defined($role) || $role eq '') {
+ if ($rest =~ m{^($match_domain)/($match_courseid)(?:/(\w+)|$)}) {
+ my $cdom = $1;
+ my $cnum = $2;
+ my $csec = $3;
+ my $cid = $cdom.'_'.$cnum;
+ my $ttype = $env{'course.'.$cid.'.type'};
+ my $skipcal = 1;
+ my $tbg='LC_roles_is';
+ my $twhere = $env{'course.'.$cid.'.description'}.
+ ' '.
+ &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$cnum,$cdom).
+ ' ';
+ my $trole = &Apache::lonnet::plaintext($role,$ttype,$cid);
+ if ($csec) {
+ $twhere.= ' '.&mt('Section').': '.$csec;
+ }
+ if ($role ne 'st') {
+ $twhere.= ' '.&mt('Domain').': '.$cdom;
+ }
+ ($roletext,$roletext_end) = &build_roletext($currentrole,$cdom,$cnum,'is',$tryagain,$advanced,'',$tbg,$trole,$twhere,'','','',1,'','','',$skipcal);
+ }
+ }
+ return ($roletext,$roletext_end);
+}
+
sub adhoc_roles_row {
my ($dcdom,$rowtype) = @_;
my $output = &Apache::loncommon::continue_data_table_row()
@@ -2256,6 +2747,22 @@ sub update_session_roles {
}
} else {
$newrole{$rolekey} = $status_in_db;
+ if ($role eq 'au') {
+ my %userenv =
+ &Apache::lonnet::userenvironment($env{'user.domain'},
+ $env{'user.name'},'authoreditors');
+ if ($userenv{'authoreditors'}) {
+ $userenv{'editors'} = $userenv{'authoreditors'};
+ } else {
+ my %domdef = &Apache::lonnet::get_domain_defaults($env{'user.domain'});
+ if ($domdef{'editors'} ne '') {
+ $userenv{'editors'} = $domdef{'editors'};
+ } else {
+ $userenv{'editors'} = 'edit,xml';
+ }
+ }
+ &Apache::lonnet::appenv(\%userenv);
+ }
}
}
}
@@ -2937,7 +3444,7 @@ sub is_active_course {
}
sub get_roles_functions {
- my ($rolescount,$cattype) = @_;
+ my ($rolescount,$cattype,$userapprovals) = @_;
my @links;
push(@links,["javascript:rolesView('doupdate');",'start-here-22x22',&mt('Check for changes')]);
if ($env{'environment.canrequest.author'}) {
@@ -2966,6 +3473,13 @@ sub get_roles_functions {
unless ($cattype eq 'none') {
push(@links,['/adm/coursecatalog','ccat-22x22',&mt('Course catalog')]);
}
+ if ($userapprovals) {
+ if ($env{'form.approvals'} eq 'show') {
+ push(@links,["javascript:rolesView('noapprovals');",'list-add-22x22',&mt('Hide pending')]);
+ } else {
+ push(@links,["javascript:rolesView('approvals');",'list-add-22x22',&mt('Show pending')]);
+ }
+ }
my $funcs;
if ($env{'browser.mobile'}) {
my @functions;
@@ -2983,7 +3497,7 @@ sub get_roles_functions {
foreach my $link (@links) {
$funcs .= &Apache::lonhtmlcommon::add_item_funclist(
'');
}
$funcs .= &Apache::lonhtmlcommon::end_funclist();
@@ -3069,15 +3583,139 @@ sub get_queued {
unless ($output) {
if ($env{'environment.canrequest.author'} || $env{'environment.canrequest.official'} ||
$env{'environment.canrequest.unofficial'} || $env{'environment.canrequest.community'}) {
- $output = &mt('No requests for courses, communities or authoring currently queued');
+ $output = ''.
+ &mt('No requests for courses, communities or authoring currently queued').
+ ' ';
} else {
- $output = &mt('No enrollment requests currently queued awaiting approval');
+ $output = ''.
+ &mt('No enrollment requests currently queued awaiting approval').
+ ' ';
}
}
return '
'.&mt('Queued requests').' '.
$output.' ';
}
+sub get_approvals {
+ return &Apache::loncoursequeueadmin::display_queued_requests('othdomaction',$env{'user.domain'},'','user');
+}
+
+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);
+ }
+ }
+ $rosterupdates = [];
+ }
+ return OK;
+}
+
+sub set_deeplink_target {
+ my ($cnum,$cdom) = @_;
+ if (($cnum ne '') && ($cdom ne '')) {
+ my $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom);
+ if ($deeplink_symb ne '') {
+ my $deeplink;
+ if ($deeplink_symb =~ /\.(page|sequence)$/) {
+ my $mapname = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[2]);
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if (ref($navmap)) {
+ $deeplink = $navmap->get_mapparam(undef,$mapname,'0.deeplink');
+ }
+ } elsif ($deeplink_symb ne '') {
+ $deeplink = &Apache::lonnet::EXT('resource.0.deeplink',$deeplink_symb);
+ }
+ if ($deeplink ne '') {
+ my ($state,$others,$listed,$scope,$protect,$display,$target) = split(/,/,$deeplink);
+ if ($target ne '') {
+ &Apache::lonnet::appenv({'request.deeplink.target' => $target});
+ } elsif (exists($env{'request.deeplink.target'})) {
+ &Apache::lonnet::delenv('request.deeplink.target');
+ }
+ }
+ }
+ }
+ return;
+}
+
+sub set_supplemental_access {
+ my ($cnum,$cdom) = @_;
+ my ($supplemental,$refs_updated) = &Apache::loncommon::get_supplemental($cnum,$cdom);
+ unless ($refs_updated) {
+ &Apache::loncommon::set_supp_httprefs($cnum,$cdom,$supplemental);
+ }
+}
+
1;
__END__