--- loncom/interface/courseprefs.pm 2023/04/13 15:21:00 1.119 +++ loncom/interface/courseprefs.pm 2023/06/03 02:29:57 1.122 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set configuration settings for a course # -# $Id: courseprefs.pm,v 1.119 2023/04/13 15:21:00 raeburn Exp $ +# $Id: courseprefs.pm,v 1.122 2023/06/03 02:29:57 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1661,14 +1661,28 @@ sub process_linkprot { } elsif (exists($env{$urlparamname})) { $env{$urlparamname} = ''; } + my $passback = 'form.linkprot_passback_'.$idx; + my $passbackparamname = 'form.linkprot_passbackformat_'.$idx; + if ($env{$passback} == 1) { + unless ($env{$passbackparamname} =~ /^1\.(0|1)$/) { + $env{$passbackparamname} = ''; + } + } elsif (exists($env{$passbackparamname})) { + $env{$passbackparamname} = ''; + } unless ($idx eq 'add') { if ((!$current{'returnurl'} && ($env{$urlparamname} ne '')) || ($current{'returnurl'} && ($env{$urlparamname} eq ''))) { $haschanges{$itemid} = 1; } + if ((!$current{'passback'} && ($env{$passbackparamname} ne '')) || + ($current{'passback'} && ($env{$passbackparamname} eq ''))) { + $haschanges{$itemid} = 1; + } } - if ($env{$urlparamname} ne '') { - $linkprot{$itemid}{'returnurl'} = $env{$urlparamname}; + if ($env{$passbackparamname} ne '') { + $linkprot{$itemid}{'passback'} = 1; + $linkprot{$itemid}{'passbackformat'} = $env{$passbackparamname}; } if ($ltiauth) { my $reqitem = 'form.linkprot_requser_'.$idx; @@ -1883,7 +1897,7 @@ sub process_ltitools { my @allfields = ('fullname','firstname','lastname','email','user','roles'); map { $possfield{$_} = 1; } @allfields; - my ($dest,$privnum,$cipher,$errors,%ltitools); + my ($dest,$privnum,$cipher); ($cipher,$privnum) = &get_credentials($cdom,$cnum,'ltitools',$context); if ($context eq 'domain') { @@ -3088,7 +3102,7 @@ sub store_linkprot { my %values = %{$changes->{$id}}; my %desc = &linkprot_names(); my $display; - foreach my $title ('name','lifetime','version','key','secret','returnurl') { + foreach my $title ('name','lifetime','version','key','secret','returnurl','passbackformat') { if (($title eq 'key') || ($title eq 'secret')) { if (ref($ltienc{$id}) eq 'HASH') { if (exists($ltienc{$id}{$title})) { @@ -3108,6 +3122,12 @@ sub store_linkprot { if ($values{$title}) { $display .= &mt('Return URL parameter').': '.$values{$title}.', '; } + } elsif ($title eq 'passbackformat') { + if ($values{$title} eq '1.0') { + $display .= &mt('Can return grades to Launcher with Outcomes Service 1.0 format').', '; + } elsif ($values{$title} eq '1.1') { + $display .= &mt('Can return grades to Launcher with Outcomes Service 1.1 format').', '; + } } else { $display .= $desc{$title}.': '.$values{$title}.', '; } @@ -3223,7 +3243,7 @@ sub store_ltitools { &Apache::lonnet::devalidate_cache_new('courseltitools',$hashid); unless (($home eq 'no_host') || ($home eq '')) { if (grep(/^\Q$home\E$/,@ids)) { - &Apache::lonnet::devalidate_cache_new('courseltitoolsenc',$hashid); + &Apache::lonnet::devalidate_cache_new('crsltitoolsenc',$hashid); } } } else { @@ -6310,8 +6330,38 @@ sub print_bridgetasks { sub print_ltitools { my ($cdom,$cnum,$settings,$rowtotal,$crstype,$noedit,$context) = @_; my ($datatable,$disabled,$css_class,$dest); - my %lt = <itools_names(); + if ($noedit) { + $disabled = ' disabled="disabled"'; + } my $itemcount = 1; + unless ($context eq 'domain') { + my %tooltypes = &Apache::loncommon::usable_exttools(); + unless ($tooltypes{'crs'}) { + my $showtype = 'course'; + if ($crstype eq 'Community') { + $showtype = lc($crstype); + } + $css_class = $itemcount%2?' class="LC_odd_row"':''; + $datatable = ''. + &mt("Definition of external tools is not enabled for this $showtype.").'
'; + if ($tooltypes{'dom'}) { + $datatable .= &mt("Contact an administrator for the $showtype domain ([_1]) to request this feature be enabled.", + ''.$cdom.''). + '

'. + &mt("Use of external tools defined at a domain level is enabled, so the $showtype editor can be used to add tool(s), if any have been defined."); + } else { + $datatable .= &mt("Use of external tools defined at a domain level is not enabled, either, for this $showtype."). + '

'. + &mt("Contact an administrator for the $showtype domain ([_1]) to request changes.", + ''.$cdom.''); + + } + $datatable .= ''; + $itemcount ++; + return $datatable; + } + } + my %lt = <itools_names(); my $maxnum = 0; my %ordered; if (ref($settings) eq 'HASH') { @@ -6393,7 +6443,7 @@ sub print_ltitools { ''. ''. '

'. - ''.$lt{'url'}.':'.$lt{'url'}.':'. (' 'x2). ''.$lt{'lifetime'}.':'. @@ -6671,7 +6721,7 @@ sub print_ltitools { ''. ''. '
'. - ''.$lt{'url'}.': '."\n". + ''.$lt{'url'}.': '."\n". (' 'x2). ''.$lt{'lifetime'}.':
'; if ($switchserver) { @@ -7286,7 +7336,27 @@ sub print_linkprotection { ''. ''; - my ($usersty,$onclickrequser,%checkedrequser,$onclickreturnurl,%checkedreturnurl); + my ($usersty,$onclickrequser,%checkedrequser,$onclickreturnurl,%checkedreturnurl, + $onclickpassback,%checkedpassback,$passbacksty,%checkedpassbackfmt); + $passbacksty = 'none'; + $onclickpassback = ' onclick="toggleLinkProtExtra(this.form,'."'passback','passbackparam','1','inline-block','$i'".');"'; + %checkedpassback = ( + 'no' => ' checked="checked"', + 'yes' => '', + ); + %checkedpassbackfmt = ( + '1p1' => ' checked="checked"', + '1p0' => '', + ); + if ($values{'passback'} ne '') { + $passbacksty = 'inline-block'; + $checkedpassback{'yes'} = ' checked="checked"'; + $checkedpassback{'no'} = ''; + if ($values{'passbackformat'} eq '1.0') { + $checkedpassbackfmt{'1p0'} = ' checked="checked"'; + $checkedpassbackfmt{'1p1'} = ''; + } + } if ($ltiauth) { $usersty = 'display:none'; $onclickrequser = ' onclick="toggleLinkProtExtra(this.form,'."'requser','optional','1','block','$i'".');"'; @@ -7375,6 +7445,19 @@ sub print_linkprotection { } } $datatable .= '

'. + ''.$desc{'passback'}.'?'. + ' '. + '
'. + '
'. + ''.&mt('Grade format'). + ''.(' 'x2). + '
'. + '
'. + '
'. ''.$desc{'returnurl'}.'?'. ' '. @@ -7405,7 +7488,8 @@ sub print_linkprotection { ''."\n". ''.&mt('Add').''."\n". ''; - my ($usersty,$onclickrequser,%checkedrequser,$onclickreturnurl,%checkedreturnurl); + my ($usersty,$onclickrequser,%checkedrequser,$onclickreturnurl,%checkedreturnurl, + $onclickpassback,%checkedpassback,%checkedpassbackfmt); if ($ltiauth) { $usersty = 'display:none'; $onclickrequser = ' onclick="toggleLinkProtExtra(this.form,'."'requser','optional','1','block','add'".');"'; @@ -7415,6 +7499,15 @@ sub print_linkprotection { ); $datatable .= '
'.$lt{'requ'}.''; } + $onclickpassback = ' onclick="toggleLinkProtExtra(this.form,'."'passback','passbackparam','1','inline-block','add'".');"'; + %checkedpassback = ( + 'no' => ' checked="checked"', + 'yes' => '', + ); + %checkedpassbackfmt = ( + '1p1' => ' checked="checked"', + '1p0' => '', + ); $onclickreturnurl = ' onclick="toggleLinkProtExtra(this.form,'."'returnurl','divurlparam','1','inline-block','add'".');"'; %checkedreturnurl = ( no => ' checked="checked"', @@ -7437,6 +7530,19 @@ sub print_linkprotection { ' '."\n"; } $datatable .= '

'. + ''.$desc{'passback'}.'?'. + ' '. + ''. + '
'. + '
'. + '
'. ''.$desc{'returnurl'}.'?'. ' '. @@ -7469,6 +7575,7 @@ sub linkprot_names { 'lifetime' => 'Nonce lifetime (s)', 'name' => 'Launcher Application', 'secret' => 'Secret', + 'passback' => 'Can return grades to Launcher', 'returnurl' => 'Launcher return URL', 'requser' => 'Use identity', 'email' => 'Email address', @@ -8224,7 +8331,7 @@ sub devalidate_remote_courseprefs { my %servers = &Apache::lonnet::internet_dom_servers($cdom); my %thismachine; map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids(); - my @posscached = ('courselti'); + my @posscached = ('courselti','courseltitools'); if (keys(%servers)) { foreach my $server (keys(%servers)) { next if ($thismachine{$server});