--- loncom/interface/courseprefs.pm 2023/09/24 03:31:18 1.127
+++ loncom/interface/courseprefs.pm 2025/03/15 01:03:33 1.134
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set configuration settings for a course
#
-# $Id: courseprefs.pm,v 1.127 2023/09/24 03:31:18 raeburn Exp $
+# $Id: courseprefs.pm,v 1.134 2025/03/15 01:03:33 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -372,6 +372,12 @@ sub handler {
my %values=&Apache::lonnet::dump('environment',$cdom,$cnum);
my %linkprot=&Apache::lonnet::dump('lti',$cdom,$cnum,undef,undef,undef,1);
+ my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
+ unless ($phase eq 'process') {
+ if (ref($domdefs{'linkprotsuggested'}) eq 'HASH') {
+ $values{'suggested'} = $domdefs{'linkprotsuggested'};
+ }
+ }
my %ltienc = &Apache::lonnet::dump('nohist_ltienc',$cdom,$cnum,undef,undef,undef,1);
my %ltitools = &Apache::lonnet::dump('ltitools',$cdom,$cnum,undef,undef,undef,1);
my %ltitoolsenc = &Apache::lonnet::dump('nohist_toolsenc',$cdom,$cnum,undef,undef,undef,1);
@@ -793,9 +799,38 @@ sub print_config_box {
';
+ if ($action eq 'linkprot') {
+ if ((ref($settings) eq 'HASH') && (ref($settings->{'suggested'}) eq 'HASH')) {
+ my $hints;
+ my $hintcount = 0;
+ foreach my $key (sort { $a <=> $b } keys(%{$settings->{'suggested'}})) {
+ if ((ref($settings->{'suggested'}->{$key}) eq 'HASH')) {
+ if (($settings->{'suggested'}->{$key}-{'name'} ne '') &&
+ ($settings->{'suggested'}->{$key}-{'info'} ne '')) {
+ my $css_class = $hintcount%2?' class="LC_odd_row"':' class="LC_even_row"';
+ $hints .= ''.
+ $settings->{'suggested'}->{$key}->{'name'}.' | '.
+ ''.
+ $settings->{'suggested'}->{$key}->{'info'}.
+ ' | ';
+ $hintcount ++;
+ }
+ }
+ }
+ if ($hintcount) {
+ $output .= ''.
+ ''.&mt('Recommendation(s) for specific launcher application(s)').' | '.
+ ' '."\n".
+ ''.
+ ''.&mt('Launcher Application').' | '.
+ ''.&mt('Recommendation(s)').' | '."\n".
+ $hints;
+ }
+ }
+ }
if (exists $item->{'header'}->[0]->{'col1'} ||
exists $item->{'header'}->[0]->{'col2'}) {
- $output .= '
+ $output .= '
'.&mt($item->{'header'}->[0]->{'col1'}).' | ';
if (($action eq 'courseinfo') || ($action eq 'localization') ||
@@ -1991,10 +2026,14 @@ sub process_ltitools {
} else {
$ltitools{$newid}{'display'}{'target'} = 'iframe';
}
- foreach my $item ('passback','roster') {
+ foreach my $item ('passback','roster','returnurl') {
if ($env{'form.ltitools_'.$item.'_add'}) {
$ltitools{$newid}{$item} = 1;
- if ($env{'form.ltitools_'.$item.'valid_add'} ne '') {
+ if ($item eq 'returnurl') {
+ if ($env{'form.ltitools_crs'.$item.'_add'}) {
+ $ltitools{$newid}{'crsconf'}{$item} = 1;
+ }
+ } elsif ($env{'form.ltitools_'.$item.'valid_add'} ne '') {
my $lifetime = $env{'form.ltitools_'.$item.'valid_add'};
$lifetime =~ s/^\s+|\s+$//g;
if ($lifetime =~ /^\d+\.?\d*$/) {
@@ -2178,10 +2217,21 @@ sub process_ltitools {
} else {
$haschanges{$itemid} = 1;
}
- foreach my $extra ('passback','roster') {
+ foreach my $extra ('passback','roster','returnurl') {
if ($env{'form.ltitools_'.$extra.'_'.$i}) {
$ltitools{$itemid}{$extra} = 1;
- if ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') {
+ if ($extra eq 'returnurl') {
+ if ($env{'form.ltitools_crs'.$extra.'_'.$i}) {
+ $ltitools{$itemid}{'crsconf'}{$extra} = 1;
+ if (ref($values->{$itemid}{'crsconf'}) eq 'HASH') {
+ if (!$values->{$itemid}{'crsconf'}{$extra}) {
+ $haschanges{$itemid} = 1;
+ }
+ } else {
+ $haschanges{$itemid} = 1;
+ }
+ }
+ } elsif ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') {
my $lifetime = $env{'form.ltitools_'.$extra.'valid_'.$i};
$lifetime =~ s/^\s+|\s+$//g;
if ($lifetime =~ /^\d+\.?\d*$/) {
@@ -2700,14 +2750,14 @@ sub store_changes {
$displayname = &mt('Recipients of '.$text.' questions');
}
} elsif ($item eq 'discussion') {
- if ($key =~ /^p(lc|ch)\.roles\.denied/) {
+ if ($key =~ /^p(lc|ch|ac)\.roles\.denied/) {
$displayname = &mt("$text (role-based)");
if ($displayval ne '') {
my @roles = split(',',$displayval);
@roles = map { &Apache::lonnet::plaintext($_); } @roles;
$displayval = join(', ',@roles);
}
- } elsif ($key =~ /^p(lc|ch)\.users\.denied/) {
+ } elsif ($key =~ /^p(lc|ch|ac)\.users\.denied/) {
$displayname = &mt("$text (specific user(s))");
} else {
if ($key eq 'allow_discussion_post_editing') {
@@ -3285,7 +3335,13 @@ sub store_ltitools {
}
}
}
- $output .= ''.&mt('Configurable in course:');
+ $output .= '';
+ if ($context eq 'domain') {
+ $output .= &mt('Configurable in course');
+ } else {
+ $output .= &mt('Configurable for each instance of tool in course');
+ }
+ $output .= ':';
my @possconfig = ('label','title','target','linktext','explanation','append');
my $numconfig = 0;
if (ref($changes->{$itemid}{'crsconf'}) eq 'HASH') {
@@ -3300,11 +3356,21 @@ sub store_ltitools {
$output .= ' '.&mt('None');
}
$output .= '';
- foreach my $item ('passback','roster') {
+ foreach my $item ('passback','roster','returnurl') {
$output .= ''.$lt{$item}.' ';
if ($changes->{$itemid}{$item}) {
$output .= &mt('Yes');
- if ($changes->{$itemid}{$item.'valid'}) {
+ if ($item eq 'returnurl') {
+ if (ref($changes->{$itemid}{'crsconf'}) eq 'HASH') {
+ $output .= ' ['.&mt('Configurable in course').': ';
+ if ($changes->{$itemid}{'crsconf'}{$item}) {
+ $output .= &mt('Yes');
+ } else {
+ $output .= &mt('No');
+ }
+ $output .= ']';
+ }
+ } elsif ($changes->{$itemid}{$item.'valid'}) {
if ($item eq 'passback') {
$output .= ' '.&mt('valid for at least [quant,_1,day] after launch',
$changes->{$itemid}{$item.'valid'});
@@ -5257,8 +5323,7 @@ sub update_releasereq {
}
$modified_courses = [];
}
- undef($registered_cleanup);
- return;
+ return OK;
}
sub show_autocoowners {
@@ -6587,22 +6652,35 @@ sub print_ltitools {
''.$lt{'linktext'}.' '.
' '.
''.$lt{'explanation'}.' '.
- ' ';
my %units = (
'passback' => 'days',
'roster' => 'seconds',
);
- foreach my $extra ('passback','roster') {
+ my %courseconfig;
+ if (ref($settings->{$item}) eq 'HASH') {
+ if (ref($settings->{$item}->{'crsconf'}) eq 'HASH') {
+ %courseconfig = %{$settings->{$item}->{'crsconf'}};
+ }
+ }
+ foreach my $extra ('passback','roster','returnurl') {
my $validsty = 'none';
my $currvalid;
my $checkedon = '';
my $checkedoff = ' checked="checked"';
+ my $crscheckedon = '';
+ my $crscheckedoff = ' checked="checked"';
if ($settings->{$item}->{$extra}) {
$checkedon = $checkedoff;
$checkedoff = '';
$validsty = 'inline-block';
- if ($settings->{$item}->{$extra.'valid'} =~ /^\d+\.?\d*$/) {
+ if ($extra eq 'returnurl') {
+ if ($courseconfig{$extra}) {
+ $crscheckedon = ' checked="checked"';
+ $crscheckedoff = '';
+ }
+ } elsif ($settings->{$item}->{$extra.'valid'} =~ /^\d+\.?\d*$/) {
$currvalid = $settings->{$item}->{$extra.'valid'};
}
}
@@ -6611,12 +6689,21 @@ sub print_ltitools {
''.(' 'x2).
''.
- '';
+ &mt('Yes').'';
+ if ($extra eq 'returnurl') {
+ $datatable .= ' ';
- my %courseconfig;
- if (ref($settings->{$item}) eq 'HASH') {
- if (ref($settings->{$item}->{'crsconf'}) eq 'HASH') {
- %courseconfig = %{$settings->{$item}->{'crsconf'}};
- }
+ $datatable .= ' |
'."\n".
+ '