--- loncom/interface/courseprefs.pm 2024/02/25 05:53:47 1.49.2.28.2.20
+++ loncom/interface/courseprefs.pm 2023/09/02 12:51:32 1.126
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set configuration settings for a course
#
-# $Id: courseprefs.pm,v 1.49.2.28.2.20 2024/02/25 05:53:47 raeburn Exp $
+# $Id: courseprefs.pm,v 1.126 2023/09/02 12:51:32 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -372,12 +372,6 @@ 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);
@@ -418,7 +412,7 @@ sub handler {
my @prefs_order = ('courseinfo','localization','feedback','discussion',
'classlists','appearance','grading','printouts',
'menuitems','ltitools','linkprot','spreadsheet',
- 'bridgetasks','other');
+ 'bridgetasks','lti','other');
my %prefs = (
'courseinfo' =>
{ text => $lt{'gens'},
@@ -469,6 +463,7 @@ sub handler {
{ text => 'Discussion and Chat',
help => 'Course_Prefs_Discussions',
ordered => ['pch.roles.denied','pch.users.denied',
+ 'pac.roles.denied','pac.users.denied',
'plc.roles.denied','plc.users.denied',
'allow_limited_html_in_feedback',
'allow_discussion_post_editing',
@@ -478,6 +473,8 @@ sub handler {
'pch.users.denied' => 'No Resource Discussion',
'plc.roles.denied' => 'No Chat room use',
'plc.users.denied' => 'No Chat room use',
+ 'pac.roles.denied' => 'No Anonymous Resource Discussion',
+ 'pac.users.denied' => 'No Anonymous Resource Discussion',
allow_limited_html_in_feedback => 'Allow limited HTML in discussion',
allow_discussion_post_editing => 'Users can edit/delete own discussion posts',
discussion_post_fonts => 'Discussion post fonts based on likes/unlikes',
@@ -546,7 +543,7 @@ sub handler {
help => 'Course_Prefs_Printouts',
ordered => ['problem_stream_switch','suppress_tries',
'default_paper_size','print_header_format',
- 'disableexampointprint'],
+ 'disableexampointprint','canuse_pdfforms'],
itemtext => {
problem_stream_switch => 'Allow problems to be split over pages',
suppress_tries => 'Suppress number of tries in printing',
@@ -580,6 +577,18 @@ sub handler {
suppress_embed_prompt => 'Hide upload references prompt if uploading file to portfolio',
},
},
+ 'lti' =>
+ {
+ text => 'LTI provider settings',
+ help => 'Course_Prefs_LTIProvider',
+ ordered => ['lti.override','lti.topmenu','lti.inlinemenu','lti.lcmenu'],
+ itemtext => {
+ 'lti.override' => 'Override domain defaults',
+ 'lti.topmenu' => 'Display LON-CAPA page header',
+ 'lti.inlinemenu' => 'Display LON-CAPA inline menu',
+ 'lti.lcmenu' => 'Menu items',
+ },
+ },
'menuitems' =>
{
text => 'Menu display',
@@ -784,38 +793,9 @@ 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') ||
@@ -842,7 +822,7 @@ sub print_config_box {
} elsif ($action eq 'appearance') {
$output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'grading') {
- $output .= &print_grading($cdom,$cnum,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
+ $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'printouts') {
$output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'spreadsheet') {
@@ -855,6 +835,8 @@ sub print_config_box {
$currtools = $settings->{'ltitools'};
}
$output .= &print_ltitools($cdom,$cnum,$currtools,\$rowtotal,$crstype,$noedit,'course');
+ } elsif ($action eq 'lti') {
+ $output .= &print_lti($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'menuitems') {
$output .= &print_menuitems('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'linkprot') {
@@ -1295,7 +1277,8 @@ sub process_changes {
}
}
}
- } elsif (($entry eq 'plc.roles.denied') || ($entry eq 'pch.roles.denied')) {
+ } elsif (($entry eq 'plc.roles.denied') || ($entry eq 'pch.roles.denied') ||
+ ($entry eq 'pac.roles.denied')) {
my @denied = &Apache::loncommon::get_env_multiple('form.'.$entry);
@denied = sort(@denied);
my $deniedstr = '';
@@ -1303,7 +1286,8 @@ sub process_changes {
$deniedstr = join(',',@denied);
}
$newvalues{$entry} = $deniedstr;
- } elsif (($entry eq 'plc.users.denied') || ($entry eq 'pch.users.denied')) {
+ } elsif (($entry eq 'plc.users.denied') || ($entry eq 'pch.users.denied') ||
+ ($entry eq 'pac.users.denied')) {
my $total = $env{'form.'.$entry.'_total'};
my $userstr = '';
my @denied;
@@ -1491,6 +1475,38 @@ sub process_changes {
$settings =~ s/,$//;
}
$newvalues{$entry} = $settings;
+ } elsif ($action eq 'lti') {
+ if ($entry eq 'lti.override') {
+ $newvalues{$entry} = $env{'form.'.$entry};
+ } elsif (($entry eq 'lti.topmenu') || ($entry eq 'lti.inlinemenu')) {
+ if ($env{'form.lti.override'}) {
+ $newvalues{$entry} = $env{'form.'.$entry};
+ } else {
+ $newvalues{$entry} = '';
+ }
+ } elsif ($entry eq 'lti.lcmenu') {
+ if (($env{'form.lti.override'}) &&
+ (($env{'form.lti.topmenu'}) || ($env{'form.lti.inlinemenu'}))) {
+ my @lcmenu = &Apache::loncommon::get_env_multiple('form.lti.lcmenu');
+ my @newlcmenu;
+ if (@lcmenu) {
+ my @menuitems = ('fullname','coursetitle','role','logout','grades');
+ foreach my $item (@menuitems) {
+ next if (($item eq 'grades') && (!$newvalues{'lti.inlinemenu'}));
+ if (grep(/^\Q$item\E$/,@lcmenu)) {
+ push(@newlcmenu,$item);
+ }
+ }
+ }
+ if (@newlcmenu) {
+ $newvalues{$entry} = join(',',@newlcmenu);
+ } else {
+ $newvalues{$entry} = 'none';
+ }
+ } else {
+ $newvalues{$entry} = '';
+ }
+ }
} elsif ($entry eq 'extresource') {
if ($env{'form.'.$entry} =~ /^iframe|tab|window$/) {
$newvalues{$entry} = $env{'form.'.$entry};
@@ -1534,33 +1550,6 @@ sub process_changes {
} elsif ($values->{$entry}) {
$changes->{$entry} = '';
}
- } elsif ($entry eq 'grading') {
- if ($env{'form.'.$entry} eq 'standard') {
- if ($env{'form.hidetotals'}) {
- my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
- if (keys(%sections)) {
- my @secs = &Apache::loncommon::get_env_multiple('form.hidetotals_sections');
- if (grep(/^all$/,@secs)) {
- $newvalues{'hidetotals'} = 'all';
- } elsif (@secs) {
- $newvalues{'hidetotals'} = '';
- foreach my $sec (sort {$a <=> $b} @secs) {
- if (exists($sections{$sec})) {
- $newvalues{'hidetotals'} .= $sec.','
- }
- }
- $newvalues{'hidetotals'} =~ s/,$//;
- }
- } else {
- $newvalues{'hidetotals'} = 'all';
- }
- }
- }
- if ($newvalues{'hidetotals'} ne $values->{'hidetotals'}) {
- $changes->{'hidetotals'} = $newvalues{'hidetotals'};
- $changes->{'grading'} = $env{'form.'.$entry};
- }
- $newvalues{$entry} = $env{'form.'.$entry};
} else {
$newvalues{$entry} = $env{'form.'.$entry};
}
@@ -2642,40 +2631,6 @@ sub store_changes {
unless (($key eq 'co-owners') || ($key eq 'discussion_post_fonts') || ($key eq 'extresource')) {
$displayval = $changes->{$item}{$key};
}
- if (($item eq 'grading') && ($key eq 'grading')) {
- if ($displayval eq 'standard') {
- my $hidetotals;
- if (exists($changes->{$item}{'hidetotals'})) {
- if ($changes->{$item}{'hidetotals'} eq '') {
- if (exists($values->{'hidetotals'})) {
- push(@delkeys,'hidetotals');
- }
- } else {
- $hidetotals = $changes->{$item}{'hidetotals'};
- }
- } elsif (exists($values->{'hidetotals'})) {
- $hidetotals = $values->{'hidetotals'};
- }
- if ($hidetotals eq '') {
- $displayval = &mt('standard with "hide course totals" set to "No"');
- if (exists($values->{'hidetotals'})) {
- push(@delkeys,'hidetotals');
- }
- } elsif ($hidetotals =~ /^([\w,]+)$/) {
- my $secstr = $1;
- my @secs = split(/,/,$secstr);
- if (grep(/^all$/,@secs)) {
- $displayval = &mt('standard with "hide course totals" set to "Yes" for all users');
- $hidetotals = 'all';
- } else {
- $displayval = &mt('standard with "hide course totals" set to "Yes" for users in section(s): [_1]',join(', ',@secs));
- }
- $storehash{'hidetotals'} = $hidetotals;
- }
- } elsif (exists($values->{'hidetotals'})) {
- push(@delkeys,'hidetotals');
- }
- }
if ($item eq 'feedback') {
if ($key =~ /^(question|policy|comment)(\.email)\.text$/) {
$text = $prefs->{$item}->{'itemtext'}{$1.$2};
@@ -2753,6 +2708,22 @@ sub store_changes {
}
}
$displayname = &mt($text);
+ } elsif ($item eq 'lti') {
+ if ($key eq 'lti.lcmenu') {
+ if ($changes->{$item}{$key} eq 'none') {
+ $displayval = &mt('None of the configurable menu items displayed');
+ } else {
+ my %ltititles = <imenu_titles();
+ $displayval = join(', ', map { $ltititles{$_}; } split(/,/,$changes->{$item}{$key}));
+ }
+ } else {
+ if ($changes->{$item}{$key} eq '1') {
+ $displayval = &mt('Yes');
+ } elsif ($changes->{$item}{$key} eq '') {
+ $displayval = &mt('No');
+ }
+ }
+ $displayname = &mt($text);
} elsif ($item eq 'menuitems') {
unless ($changes->{$item}{$key} eq '') {
if ($key eq 'menudefault') {
@@ -2857,7 +2828,20 @@ sub store_changes {
}
} elsif ($changes->{$item}{$key} eq '') {
push(@delkeys,$key);
- if ($item eq 'menuitems') {
+ if ($item eq 'lti') {
+ if (($key eq 'lti.override') || (($key ne 'lti.override') && ($env{'form.lti.override'} ne ''))) {
+ if (($key eq 'lti.lcmenu') &&
+ ((!$env{'form.lti.topmenu'}) && (!$env{'form.lti.inlinemenu'}))) {
+ $output .= ''.&mt('LTI settings for menu items only saved if page header and/or inline menu is set to be displayed').'';
+ } else {
+ $output .= ''.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
+ ''.$displayname.'',
+ "'$displayval'")).'';
+ }
+ } elsif (!exists($changes->{$item}{'lti.override'})) {
+ $output .= ''.&mt('LTI settings only saved if Override is set to "Yes"').'';
+ }
+ } elsif ($item eq 'menuitems') {
if ($key eq 'menudefault') {
$output .= ''.&mt("Default collection of menu items set to: 'Standard' (all menus shown)").'';
} elsif ($key eq 'menucollections') {
@@ -2910,7 +2894,9 @@ sub store_changes {
}
if (($key eq 'description') || ($key eq 'cloners') ||
($key eq 'hidefromcat') || ($key eq 'categories') ||
- ($key eq 'co-owners')) {
+ ($key eq 'co-owners') || ($key eq 'lti.override') ||
+ ($key eq 'lti.topmenu') || ($key eq 'lti.inlinemenu') ||
+ ($key eq 'lti.lcmenu')) {
push(@need_env_update,$key);
}
}
@@ -3369,6 +3355,8 @@ sub update_env {
my @coowners = split(',',$storehash->{'internal.'.$key});
$crsinfo{$env{'request.course.id'}}{'co-owners'} = \@coowners;
$count ++;
+ } elsif ($key =~ /^lti\./) {
+ &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash->{$key}});
}
}
if ($count) {
@@ -3603,7 +3591,7 @@ function syllabusinfo() {
}
}
ENDSCRIPT
- my ($menuitems_js,$grading_js);
+ my $menuitems_js;
unless ($noedit) {
my $collections;
my $next = 1;
@@ -3685,48 +3673,6 @@ function toggleAddmenucoll() {
}
}
ENDSCRIPT
- $grading_js = <<"ENDSCRIPT";
-function toggleGrading(form) {
- if (document.getElementById('hidetotalsdiv')) {
- var totalsdivid = document.getElementById('hidetotalsdiv');
- var selname = form.elements['grading'];
- if (selname) {
- var current = selname.options[selname.selectedIndex].value
- if (current == 'standard') {
- totalsdivid.style.display = 'inline-block';
- } else {
- totalsdivid.style.display = 'none';
- }
- }
- }
- return;
-}
-
-function toggleHiddenTotalsSec(form) {
- if (document.getElementById('sectotalsdiv')) {
- var sectotalsdivid = document.getElementById('sectotalsdiv');
- var radioname = form.elements['hidetotals'];
- if (radioname) {
- if (radioname.length > 0) {
- var setvis;
- for (var i=0; i'."\n".
+ &linkprot_javascript()."\n".'//]]>'."\n".
''."\n".$stubrowse_js."\n".$ltitools_js."\n";
return $jscript;
}
@@ -4499,116 +4445,160 @@ sub display_loncaparev_constraints {
$Apache::lonrelrequtils::checkcrstypes{$crstype}).'';
}
my (%fromparam,%rowspan,%bymap,%byresource,@scopeorder,%toshow,%allmaps,
- %byresponsetype,%bysubmission,%fromblocks);
+ %byresponsetype,%bysubmission,%fromblocks,%bycrsrestype);
@scopeorder = ('all','section/group','user');
my $now = time;
my $resourcedata = &Apache::lonparmset::readdata($cnum,$cdom);
if (ref($resourcedata) eq 'HASH') {
foreach my $key (keys(%{$resourcedata})) {
+ my %found;
foreach my $item (keys(%Apache::lonrelrequtils::checkparms)) {
if ($key =~ /(\Q$item\E)$/) {
- if (ref($Apache::lonrelrequtils::checkparms{$item}) eq 'ARRAY') {
- my $value = $resourcedata->{$key};
- if ($item eq 'examcode') {
- if (&Apache::lonnet::validCODE($value)) {
- $value = 'valid';
- } else {
- $value = '';
- }
- } elsif ($item eq 'printstartdate') {
- if ($value =~ /^\d+$/) {
- if ($value > $now) {
- $value = 'future';
- }
- }
- } elsif ($item eq 'printenddate') {
- if ($value =~ /^\d+$/) {
- if ($value < $now) {
- $value = 'past';
- }
- }
-
- }
- my ($middle,$scope,$which,$level,$map,$resource);
- if (grep(/^\Q$value\E$/,@{$Apache::lonrelrequtils::checkparms{$item}})) {
- my $stdtype = &Apache::lonparmset::standard_parameter_types($item);
- my $stdname = &Apache::lonparmset::standard_parameter_names($item);
- my $valname = &get_param_description($stdtype,$value);
- my $rev = $Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value};
- my $start = $cid.'.';
- if ($key =~ /^\Q$start\E(\[useropt\:($match_username\:$match_domain)\]\.)/) {
- $middle = $1;
- $which = $2;
- $scope = 'user';
- } elsif ($key =~ /^\Q$start\E(\[(\w+)\]\.)/) {
- $middle = $1;
- $which = $2;
- $scope = 'section/group';
- } else {
- $scope = 'all';
- }
- my $what="$stdname=$valname";
- if ($key =~ /^\Q$start$middle\E\w+\.\Q$item\E$/) {
- $level = 'general';
- if ($scope eq 'all') {
- if (ref($fromparam{$rev}{$scope}) eq 'ARRAY') {
- unless(grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}})) {
- push(@{$fromparam{$rev}{$scope}},$what);
- }
- } else {
- push(@{$fromparam{$rev}{$scope}},$what);
- }
- } else {
- if (ref($fromparam{$rev}{$scope}{$which}) eq 'ARRAY') {
- unless (grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}{$which}})) {
- push(@{$fromparam{$rev}{$scope}{$which}},$what);
- }
- } else {
- push(@{$fromparam{$rev}{$scope}{$which}},$what);
- }
- }
- $rowspan{$rev} ++;
- } elsif ($key =~ /^\Q$start$middle\E(.+)___\(all\).\w+\.\Q$item\E$/) {
- $level = 'folder';
- $map = $1;
- if ($scope eq 'all') {
- if (ref($bymap{$map}{$rev}{$scope}) eq 'ARRAY') {
- unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}})) {
- push(@{$bymap{$map}{$rev}{$scope}},$what);
- }
- } else {
- push(@{$bymap{$map}{$rev}{$scope}},$what);
- }
- } else {
- if (ref($bymap{$map}{$rev}{$scope}{$which}) eq 'ARRAY') {
- unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}{$which}})) {
- push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
- }
- } else {
- push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
- }
- }
- } elsif ($key =~ /^\Q$start$middle\E(.+)\.\w+\.\Q$item\E$/) {
- $level = 'resource';
- $resource = $1;
- if ($scope eq 'all') {
- if (ref($byresource{$resource}{$rev}{$scope}) eq 'ARRAY') {
- unless(grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}})) {
- push(@{$byresource{$resource}{$rev}{$scope}},$what);
- }
- } else {
- push(@{$byresource{$resource}{$rev}{$scope}},$what);
- }
- } else {
- if (ref($byresource{$resource}{$rev}{$scope}{$which}) eq 'ARRAY') {
- unless (grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}{$which}})) {
- push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
- }
- } else {
- push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
- }
- }
- }
+ if (ref($Apache::lonrelrequtils::checkparms{$item}) eq 'ARRAY') {
+ my $value = $resourcedata->{$key};
+ if ($item eq 'examcode') {
+ if (&Apache::lonnet::validCODE($value)) {
+ $value = 'valid';
+ } else {
+ $value = '';
+ }
+ } elsif ($item eq 'printstartdate') {
+ if ($value =~ /^\d+$/) {
+ if ($value > $now) {
+ $value = 'future';
+ }
+ }
+ } elsif ($item eq 'printenddate') {
+ if ($value =~ /^\d+$/) {
+ if ($value < $now) {
+ $value = 'past';
+ }
+ }
+ }
+ if (grep(/^\Q$value\E$/,@{$Apache::lonrelrequtils::checkparms{$item}})) {
+ my $stdtype = &Apache::lonparmset::standard_parameter_types($item);
+ $found{$item}{'valname'} = &get_param_description($stdtype,$value);
+ $found{$item}{'rev'} = $Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value.'::'};
+ }
+ }
+ }
+ }
+ foreach my $item (keys(%Apache::lonrelrequtils::checkparmvalsmatch)) {
+ if (ref($Apache::lonrelrequtils::checkparmvalsmatch{$item}) eq 'ARRAY') {
+ my $value = $resourcedata->{$key};
+ foreach my $valuematch (@{$Apache::lonrelrequtils::checkparmvalsmatch{$item}}) {
+ if ($value =~ /$valuematch/) {
+ my $stdtype = &Apache::lonparmset::standard_parameter_types($item);
+ $found{$item}{'valname'} = &get_param_description($stdtype,$value,1);
+ $found{$item}{'rev'} =
+ $Apache::lonnet::needsrelease{'parameter:'.$item.'::'.$valuematch.':'};
+ last;
+ }
+ }
+ }
+ }
+ foreach my $item (keys(%Apache::lonrelrequtils::checkparmnamesmatch)) {
+ my $regexp;
+ if ($item eq 'maplevelrecurse') {
+ $regexp = '\.(?:sequence|page)___\(rec\)\.';
+ }
+ if ($regexp ne '') {
+ if ($key =~ /$regexp.*\.(\w+)$/) {
+ my $name = $1;
+ my $value = $resourcedata->{$key};
+ if ($name eq 'type') {
+ last unless (($value eq 'problem') || ($value eq 'practice') || ($value eq 'exam') ||
+ ($value eq 'survey') || ($value eq 'surveycred') || ($value eq 'anonsurvey') ||
+ ($value eq 'anonsurveycred') || ($value eq 'randomizetry') || ($value eq 'library'));
+ }
+ my $stdtype = &Apache::lonparmset::standard_parameter_types($name);
+ $found{$name}{'valname'} = &get_param_description($stdtype,$value);
+ $found{$name}{'extra'} = &mt('Recursive into sub-folders');
+ $found{$name}{'rev'} =
+ $Apache::lonnet::needsrelease{'parameter::::'.$item};
+ }
+ }
+ }
+ foreach my $item (keys(%found)) {
+ my $stdname = &Apache::lonparmset::standard_parameter_names($item);
+ my $rev = $found{$item}{'rev'};
+ my $valname = $found{$item}{'valname'};
+ my $extra = $found{$item}{'extra'};
+ my ($middle,$scope,$which,$level,$map,$resource);
+ my $start = $cid.'.';
+ if ($key =~ /^\Q$start\E(\[useropt\:($match_username\:$match_domain)\]\.)/) {
+ $middle = $1;
+ $which = $2;
+ $scope = 'user';
+ } elsif ($key =~ /^\Q$start\E(\[(\w+)\]\.)/) {
+ $middle = $1;
+ $which = $2;
+ $scope = 'section/group';
+ } else {
+ $scope = 'all';
+ }
+ my $what="$stdname=$valname";
+ if ($extra) {
+ $what .= " $extra ";
+ }
+ if ($key =~ /^\Q$start$middle\E\w+\.\Q$item\E$/) {
+ $level = 'general';
+ if ($scope eq 'all') {
+ if (ref($fromparam{$rev}{$scope}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}})) {
+ push(@{$fromparam{$rev}{$scope}},$what);
+ }
+ } else {
+ push(@{$fromparam{$rev}{$scope}},$what);
+ }
+ } else {
+ if (ref($fromparam{$rev}{$scope}{$which}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}{$which}})) {
+ push(@{$fromparam{$rev}{$scope}{$which}},$what);
+ }
+ } else {
+ push(@{$fromparam{$rev}{$scope}{$which}},$what);
+ }
+ }
+ $rowspan{$rev} ++;
+ } elsif ($key =~ /^\Q$start$middle\E(.+)___\((all|rec)\).\w+\.\Q$item\E$/) {
+ $level = 'folder';
+ $map = $1;
+ if ($scope eq 'all') {
+ if (ref($bymap{$map}{$rev}{$scope}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}})) {
+ push(@{$bymap{$map}{$rev}{$scope}},$what);
+ }
+ } else {
+ push(@{$bymap{$map}{$rev}{$scope}},$what);
+ }
+ } else {
+ if (ref($bymap{$map}{$rev}{$scope}{$which}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}{$which}})) {
+ push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
+ }
+ } else {
+ push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
+ }
+ }
+ } elsif ($key =~ /^\Q$start$middle\E(.+)\.\w+\.\Q$item\E$/) {
+ $level = 'resource';
+ $resource = $1;
+ if ($scope eq 'all') {
+ if (ref($byresource{$resource}{$rev}{$scope}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}})) {
+ push(@{$byresource{$resource}{$rev}{$scope}},$what);
+ }
+ } else {
+ push(@{$byresource{$resource}{$rev}{$scope}},$what);
+ }
+ } else {
+ if (ref($byresource{$resource}{$rev}{$scope}{$which}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}{$which}})) {
+ push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
+ }
+ } else {
+ push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
}
}
}
@@ -4726,18 +4716,25 @@ sub display_loncaparev_constraints {
if (defined($navmap)) {
my %anonsubms=&Apache::lonnet::dump('nohist_anonsurveys',$cdom,$cnum);
- my $rev_anonsurv=$Apache::lonnet::needsrelease{'parameter:type:anonsurvey'};
+ my $rev_anonsurv=$Apache::lonnet::needsrelease{'parameter:type:anonsurvey::'};
my %randtrysubms=&Apache::lonnet::dump('nohist_randomizetry',$cdom,$cnum);
- my $rev_randtry=$Apache::lonnet::needsrelease{'parameter:type:randomizetry'};
+ my $rev_randtry=$Apache::lonnet::needsrelease{'parameter:type:randomizetry::'};
+ my $rev_exttool=$Apache::lonnet::needsrelease{'course:courserestype:exttool'};
my $stdtype=&Apache::lonparmset::standard_parameter_types('type');
my $stdname=&Apache::lonparmset::standard_parameter_names('type');
my $valanon=&get_param_description($stdtype,'anonsurvey');
my $valrandtry=&get_param_description($stdtype,'randomizetry');
my %checkedrev;
- foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) {
+ foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0)) {
my @parts = @{$res->parts()};
my $symb = $res->symb();
my $enclosing_map = &Apache::lonnet::declutter($res->enclosing_map_src());
+ if ($res->is_tool()) {
+ my $rev = $rev_exttool;
+ $bycrsrestype{$symb}{$rev} = &mt('External Tool');
+ $allmaps{$enclosing_map} = 1;
+ next;
+ }
foreach my $part (@parts) {
if (exists($anonsubms{$symb."\0".$part})) {
my $rev = $rev_anonsurv;
@@ -4825,6 +4822,7 @@ sub display_loncaparev_constraints {
}
}
}
+ my $supptools = &Apache::lonnet::count_supptools($cnum,$cdom,1,1);
my $mapres_header = ''.
&mt('Requirements for specific folders or resources').
'';
@@ -4839,9 +4837,9 @@ sub display_loncaparev_constraints {
$r->print($start_page.$top_header);
if ($output) {
$r->print($output);
- if (defined($navmap)) {
+ if (defined($navmap) || $supptools) {
&show_contents_view($r,$navmap,$cid,\%toshow,\%bymap,\%byresource,\%bysubmission,
- \%byresponsetype,\@scopeorder,\%lt);
+ \%byresponsetype,\%bycrsrestype,\@scopeorder,\%lt,$supptools);
}
$r->print('
');
} else {
@@ -4859,22 +4857,30 @@ sub display_loncaparev_constraints {
sub show_contents_view {
my ($r,$navmap,$cid,$toshow,$bymap,$byresource,$bysubmission,$byresponsetype,
- $scopeorder,$lt) = @_;
- if ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) ||
- (keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0)) {
- my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
- my $whitespace = ' ';
- my $icon = ' ';
+ $bycrsrestype,$scopeorder,$lt,$supptools) = @_;
+ my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
+ my $whitespace = ' ';
+ my $showmaincontent;
+ if ((ref($navmap)) &&
+ ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) ||
+ (keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0) ||
+ (keys(%{$bycrsrestype}) > 0))) {
+ $showmaincontent = 1;
+ }
+ if ($showmaincontent || $supptools) {
+ $r->print(&Apache::loncommon::start_data_table());
+ }
+ if ($showmaincontent) {
+ my $icon = ' ';
my $topmap = $env{'course.'.$cid.'.url'};
- $r->print(&Apache::loncommon::start_data_table().
- &Apache::loncommon::start_data_table_header_row().
+ $r->print(&Apache::loncommon::start_data_table_header_row().
''.&mt('Location').' | '.&mt('Release').' | '.
''.&mt('Attribute/Setting').' | '.
&Apache::loncommon::end_data_table_header_row().
&Apache::loncommon::start_data_table_row().
' '.$icon.' '.&mt('Main Content').' | ');
- &releases_by_map($r,$bymap,$topmap,$scopeorder,$lt);
- $r->print(&Apache::loncommon::end_data_table_row());
+ &releases_by_map($r,$bymap,$topmap,$scopeorder,$lt);
+ $r->print(&Apache::loncommon::end_data_table_row());
my $it=$navmap->getIterator(undef,undef,undef,1,1,undef);
my $curRes;
my $depth = 0;
@@ -4925,6 +4931,9 @@ sub show_contents_view {
if (ref($byresponsetype->{$symb}) eq 'HASH') {
$rowspan += scalar(keys(%{$byresponsetype->{$symb}}));
}
+ if (ref($bycrsrestype->{$symb}) eq 'HASH') {
+ $rowspan += scalar(keys(%{$bycrsrestype->{$symb}}));
+ }
next if (!$rowspan);
$icon = ' ';
@@ -4989,10 +4998,37 @@ sub show_contents_view {
$r->print('');
}
$r->print(&Apache::loncommon::end_data_table_row());
+ $newrow = 1;
+ }
+ if (ref($bycrsrestype->{$symb}) eq 'HASH') {
+ foreach my $rev (sort(keys(%{$bycrsrestype->{$symb}}))) {
+ if ($newrow) {
+ $r->print(&Apache::loncommon::continue_data_table_row());
+ }
+ $r->print(''.$rev.' | '.$bycrsrestype->{$symb}{$rev}.' | ');
+ }
+ $r->print(&Apache::loncommon::end_data_table_row());
}
}
}
}
+ }
+ if ($supptools) {
+ my $icon = ' ';
+ $r->print(&Apache::loncommon::start_data_table_header_row().
+ ''.&mt('Location').' | '.&mt('Release').' | '.
+ ''.&mt('Resource Type').' | '.
+ &Apache::loncommon::end_data_table_header_row().
+ &Apache::loncommon::start_data_table_row().
+ ' '.$icon.' '.&mt('Supplemental Content').' | '.
+ ''.
+ $Apache::lonrelrequtils::exttool{'major'}.'.'.
+ $Apache::lonrelrequtils::exttool{'minor'}.
+ ' | '.&mt('[quant,_1,External Tool,External Tools]',
+ $supptools).' | '.
+ &Apache::loncommon::end_data_table_row());
+ }
+ if ($showmaincontent || $supptools) {
$r->print(&Apache::loncommon::end_data_table());
}
return;
@@ -5038,18 +5074,67 @@ sub releases_by_map {
}
sub get_param_description {
- my ($stdtype,$value) = @_;
- my $name = $value;
- my $paramstrings = &Apache::lonparmset::standard_string_options($stdtype);
- unless (ref($paramstrings) eq 'ARRAY') {
- return $name;
+ my ($stdtype,$value,$regexp) = @_;
+ my ($name,$parammatches,$paramstrings,@possibles);
+ if ($stdtype =~ /^string/) {
+ $paramstrings = &Apache::lonparmset::standard_string_options($stdtype);
+ } elsif ($stdtype eq 'date_interval') {
+ $paramstrings = &Apache::lonparmset::standard_interval_options($stdtype);
+ }
+ if ($regexp) {
+ if ($stdtype =~ /^string/) {
+ $parammatches = &Apache::lonparmset::standard_string_matches($stdtype);
+ } elsif ($stdtype eq 'date_interval') {
+ $parammatches = &Apache::lonparmset::standard_interval_matches($stdtype);
+ }
+ if (ref($parammatches) eq 'ARRAY') {
+ @possibles = @{$parammatches};
+ } else {
+ undef($regexp);
+ $name = $value;
+ }
+ }
+ unless ($regexp) {
+ $name = $value;
+ if (ref($paramstrings) eq 'ARRAY') {
+ @possibles = @{$paramstrings};
+ } else {
+ if (($stdtype eq 'date_start') || ($stdtype eq 'date_end')) {
+ if ($name == 0) {
+ $name = &mt('Never');
+ } elsif (($name ne '') && ($name !~ /\D/)) {
+ $name = &Apache::lonlocal::locallocaltime($name);
+ }
+ }
+ return $name;
+ }
}
- foreach my $possibilities (@{$paramstrings}) {
+ foreach my $possibilities (@possibles) {
next unless (ref($possibilities) eq 'ARRAY');
- my ($thing, $description) = @{ $possibilities };
- if ($thing eq $value) {
- $name = $description;
- last;
+ my $gotregexmatch = '';
+ if ($regexp) {
+ last if ($gotregexmatch);
+ my ($item,$pattern) = @{ $possibilities };
+ if ($value =~ /$pattern/) {
+ if (ref($paramstrings) eq 'ARRAY') {
+ foreach my $possibles (@{$paramstrings}) {
+ next unless (ref($possibles) eq 'ARRAY');
+ my ($thing,$description) = @{$possibles};
+ if ($thing eq $item) {
+ $name = $description;
+ $gotregexmatch = 1;
+ last;
+ }
+ }
+ last if ($gotregexmatch);
+ }
+ }
+ } else {
+ my ($thing,$description) = @{ $possibilities };
+ if ($thing eq $value) {
+ $name = $description;
+ last;
+ }
}
}
return $name;
@@ -5485,7 +5570,7 @@ sub select_recipient {
}
sub select_sections {
- my ($item,$num,$sections,$selected,$noedit,$allval) = @_;
+ my ($item,$num,$sections,$selected,$noedit) = @_;
my ($output,@currsecs,$allsec,$disabled);
if (ref($selected) eq 'ARRAY') {
@currsecs = @{$selected};
@@ -5501,24 +5586,16 @@ sub select_sections {
my $mult;
if (@{$sections} > 1) {
$mult = ' multiple="multiple"';
- my $size;
if (@{$sections} > 3) {
- $size = 4;
- } else {
- $size = 1 + scalar(@{$sections});
+ $mult .= ' size="4"';
}
- $mult .= ' size="'.$size.'"';
}
- my $name = $item.'_sections';
- unless ($item eq 'hidetotals') {
- $name .= '_'.$num;
- }
- $output = ' |