--- loncom/interface/lonparmset.pm 2016/07/15 22:24:37 1.562
+++ loncom/interface/lonparmset.pm 2018/09/14 18:27:49 1.586
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.562 2016/07/15 22:24:37 damieng Exp $
+# $Id: lonparmset.pm,v 1.586 2018/09/14 18:27:49 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,7 +36,8 @@ lonparmset - Handler to set parameters f
=head1 SYNOPSIS
-lonparmset provides an interface to setting course parameters.
+lonparmset provides an interface to setting content parameters in a
+course.
It contains all the code for the "Content and Problem Settings" UI, except
for the helpers parameter.helper and resettimes.helper, and lonhelper.pm,
@@ -137,7 +138,7 @@ javascript function 'pjump'.
=item print_td()
-=item print_usergroups()
+=item check_other_groups()
=item parm_control_group()
@@ -367,14 +368,14 @@ sub endSettingsScreen {
##################################################
-# TABLE MODE
+# (mostly) TABLE MODE
# (parmval is also used for the log of parameter changes)
##################################################
-# Calls parmval_by_symb, getting the symb from $id (the big hash resource id) with &symbcache.
+# Calls parmval_by_symb, getting the symb from $id with &symbcache.
#
# @param {string} $what - part info and parameter name separated by a dot, e.g. '0.weight'
-# @param {string} $id - big hash resource id
+# @param {string} $id - resource id or map pc
# @param {string} $def - the resource's default value for this parameter
# @param {string} $uname - user name
# @param {string} $udom - user domain
@@ -394,7 +395,7 @@ sub parmval {
# (level 1 is the most specific and will have precedence)
#
# @param {string} $what - part info and parameter name separated by a dot, e.g. '0.weight'
-# @param {string} $symb - resource symb
+# @param {string} $symb - resource symb or map src
# @param {string} $def - the resource's default value for this parameter
# @param {string} $uname - user name
# @param {string} $udom - user domain
@@ -597,7 +598,7 @@ sub reset_caches {
}
}
-# cache big hash id -> symb, using lonnavmaps to find association
+# cache resource id or map pc -> resource symb or map src, using lonnavmaps to find association
{
my $symbsid; # course identifier, to initialize the cache only once for a course
my %symbs; # hash id->symb
@@ -607,7 +608,8 @@ sub reset_caches {
undef(%symbs);
}
- # returns the symb corresponding to a big hash id (using lonnavmaps and a cache)
+ # returns the resource symb or map src corresponding to a resource id or map pc
+ # (using lonnavmaps and a cache)
sub symbcache {
my $id=shift;
if ($symbsid ne $env{'request.course.id'}) {
@@ -718,8 +720,8 @@ sub date_sanity_info {
# Store a parameter value and type by ID, also triggering more parameter changes based on parameter default actions.
#
-# @param {string} $sresid - resource big hash id
-# @param {string} $spnam - part info and parameter name separated by a dot, e.g. '0.weight'
+# @param {string} $sresid - resource id or map pc
+# @param {string} $spnam - part info and parameter name separated by a dot or underscore, e.g. '0.weight'
# @param {integer} $snum - level
# @param {string} $nval - new value
# @param {string} $ntype - new type
@@ -737,8 +739,8 @@ my %recstack; # hash parameter name -> 1
# Store a parameter value and type by symb, also triggering more parameter changes based on parameter default actions.
# Uses storeparm_by_symb_inner to actually store the parameter, ignoring any returned error.
#
-# @param {string} $symb - resource symb
-# @param {string} $spnam - part info and parameter name separated by a dot, e.g. '0.weight'
+# @param {string} $symb - resource symb or map src
+# @param {string} $spnam - part info and parameter name separated by a dot or underscore, e.g. '0.weight'
# @param {integer} $snum - level
# @param {string} $nval - new value
# @param {string} $ntype - new type
@@ -776,8 +778,7 @@ sub storeparm_by_symb {
# are there restrictions?
if (&rulescache($triggered.'_triggervalue')=~/\w/) {
$active=0;
- foreach my $possiblevalue (split(/\s*\,
- \s*/,&rulescache($triggered.'_triggervalue'))) {
+ foreach my $possiblevalue (split(/\s*\,\s*/,&rulescache($triggered.'_triggervalue'))) {
if (lc($possiblevalue) eq lc($nval)) { $active=1; }
}
}
@@ -808,7 +809,7 @@ sub log_parmset {
# Store a parameter value and type by symb, without using the parameter default actions.
# Expire related sheets.
#
-# @param {string} $symb - resource symb
+# @param {string} $symb - resource symb or map src
# @param {string} $spnam - part info and parameter name separated by a dot, e.g. '0.weight'
# @param {integer} $snum - level
# @param {string} $nval - new value
@@ -846,17 +847,36 @@ sub storeparm_by_symb_inner {
my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
my $storeunder='';
+ my $possreplace='';
if (($snum==18) || ($snum==4)) { $storeunder=$courselevel; }
- if (($snum==17) || ($snum==3)) { $storeunder=$courseleveli; }
- if (($snum==16) || ($snum==2)) { $storeunder=$courselevelm; }
+ if (($snum==17) || ($snum==3)) {
+ $storeunder=$courseleveli;
+ $possreplace=$courselevelm;
+ }
+ if (($snum==16) || ($snum==2)) {
+ $storeunder=$courselevelm;
+ $possreplace=$courseleveli;
+ }
if (($snum==13) || ($snum==1)) { $storeunder=$courselevelr; }
if ($snum==12) { $storeunder=$seclevel; }
- if ($snum==11) { $storeunder=$secleveli; }
- if ($snum==10) { $storeunder=$seclevelm; }
+ if ($snum==11) {
+ $storeunder=$secleveli;
+ $possreplace=$seclevelm;
+ }
+ if ($snum==10) {
+ $storeunder=$seclevelm;
+ $possreplace=$secleveli;
+ }
if ($snum==9) { $storeunder=$seclevelr; }
if ($snum==8) { $storeunder=$grplevel; }
- if ($snum==7) { $storeunder=$grpleveli; }
- if ($snum==6) { $storeunder=$grplevelm; }
+ if ($snum==7) {
+ $storeunder=$grpleveli;
+ $possreplace=$grplevelm;
+ }
+ if ($snum==6) {
+ $storeunder=$grplevelm;
+ $possreplace=$grpleveli;
+ }
if ($snum==5) { $storeunder=$grplevelr; }
@@ -875,7 +895,7 @@ sub storeparm_by_symb_inner {
&Apache::lonnet::expirespread('','','studentcalc');
if (($snum==13) || ($snum==9) || ($snum==5)) {
&Apache::lonnet::expirespread('','','assesscalc',$symb);
- } elsif (($snum==14) || ($snum==10) || ($snum==6)) {
+ } elsif (($snum==17) || ($snum==16) || ($snum==11) || ($snum==10) || ($snum==7) || ($snum==6)) {
&Apache::lonnet::expirespread('','','assesscalc',$map);
} else {
&Apache::lonnet::expirespread('','','assesscalc');
@@ -889,6 +909,17 @@ sub storeparm_by_symb_inner {
$reply=&Apache::lonnet::cput
('resourcedata',\%storecontent,$cdom,$cnum);
&log_parmset(\%storecontent);
+ if ($possreplace) {
+ my $resdata = &Apache::lonnet::get_courseresdata($cnum,$cdom);
+ if (ref($resdata) eq 'HASH') {
+ if (exists($resdata->{$possreplace})) {
+ if (&Apache::lonnet::del
+ ('resourcedata',[$possreplace,$possreplace.'.type'],$cdom,$cnum) eq 'ok') {
+ &log_parmset({$possreplace => '', $possreplace.'.type' => $ntype},1);
+ }
+ }
+ }
+ }
}
&Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
} else {
@@ -899,7 +930,7 @@ sub storeparm_by_symb_inner {
if ($snum==1) {
&Apache::lonnet::expirespread
($uname,$udom,'assesscalc',$symb);
- } elsif ($snum==2) {
+ } elsif (($snum==2) || ($snum==3)) {
&Apache::lonnet::expirespread
($uname,$udom,'assesscalc',$map);
} else {
@@ -914,6 +945,18 @@ sub storeparm_by_symb_inner {
$reply=&Apache::lonnet::cput
('resourcedata',\%storecontent,$udom,$uname);
&log_parmset(\%storecontent,0,$uname,$udom);
+ if ($possreplace) {
+ my $resdata = &Apache::lonnet::get_userresdata($uname,$udom);
+ if (ref($resdata) eq 'HASH') {
+ if (exists($resdata->{$possreplace})) {
+ if (&Apache::lonnet::del
+ ('resourcedata',[$possreplace,$possreplace.'.type'],$udom,$uname) eq 'ok') {
+ &log_parmset({$possreplace => '',$possreplace.'.type' => $ntype},1,
+ $uname,$udom);
+ }
+ }
+ }
+ }
}
&Apache::lonnet::devalidateuserresdata($uname,$udom);
}
@@ -1022,8 +1065,9 @@ sub valout {
# @param {string} $marker - identifier for the parameter, "resource id&part_parameter name&level", will be passed as pres_marker when the user submits a change.
# @param {string} $return - prefix for the name of the form and field names that will be used to submit the form ('parmform.pres')
# @param {string} $call - javascript function to call to submit the form ('psub')
+# @param {boolean} $recursive - true if link is for a map/folder where parameter is currently set to be recursive.
sub plink {
- my ($type,$dis,$value,$marker,$return,$call)=@_;
+ my ($type,$dis,$value,$marker,$return,$call,$recursive)=@_;
my $winvalue=$value;
unless ($winvalue) {
if (&isdateparm($type)) {
@@ -1045,7 +1089,9 @@ sub plink {
return '
';
+ $valout.''.($recursive?''.
+ &mt('recursive').' ' : '').'';
+
}
# Javascript for table mode.
@@ -1365,7 +1411,7 @@ ENDHEAD
# @param {string} $which - parameter key ('parameter_'.part.'_'.name)
# @param {hash reference} $part - parameter key -> parameter part (can be problem part.'_'.response id for response parameters)
# @param {hash reference} $name - parameter key -> parameter name
-# @param {hash reference} $symbp - resource id -> symb
+# @param {hash reference} $symbp - map pc or resource/map id -> map src.'___(all)' or resource symb
# @param {string} $rid - resource id
# @param {hash reference} $default - parameter key -> resource parameter default value
# @param {hash reference} $defaulttype - parameter key -> resource parameter default type
@@ -1380,12 +1426,19 @@ ENDHEAD
# @param {string} $cgroup - group name
# @param {array reference} $usersgroups - list of groups the user belongs to, if any
# @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters
+# @param {boolean} $readonly - true if no editing allowed.
+# @param {array reference} - $recurseup - list of maps containing current one, ending at top-level.
+# @param {hash reference} - $maptitles - - hash map id or src -> map title
+# @param {hash reference} - $allmaps_inverted - hash map src -> map pc
+# @param {scalar reference} - $reclinks - number of "parameter in effect" cells with link to map where recursive param was set
sub print_row {
my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
- $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp)=@_;
+ $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp,
+ $readonly,$recurseup,$maptitles,$allmaps_inverted,$reclinks)=@_;
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
+ my $numlinks = 0;
# get the values for the parameter in cascading order
# empty levels will remain empty
@@ -1422,85 +1475,162 @@ sub print_row {
my $thismarker=$which;
$thismarker=~s/^parameter\_//;
my $mprefix=$rid.'&'.$thismarker.'&';
- my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker);
- my ($othergrp,$grp_parm,$controlgrp);
-
+ my ($parmname)=($thismarker=~/\_([^\_]+)$/);
+ my ($othergrp,$grp_parm,$controlgrp,$effective_parm,$effparm_rec,$effparm_level,
+ $eff_groupparm,$recurse_check,$recursinfo);
+ if ((ref($recurseup) eq 'ARRAY') && (@{$recurseup} > 0)) {
+ if ($result eq '') {
+ $recurse_check = 1;
+ } elsif (($uname ne '') && ($result > 3)) {
+ $recurse_check = 1;
+ } elsif (($cgroup ne '') && ($result > 7)) {
+ $recurse_check = 1;
+ } elsif (($csec ne '') && ($result > 11)) {
+ $recurse_check = 1;
+ } elsif ($result > 17) {
+ $recurse_check = 1;
+ }
+ if ($recurse_check) {
+ my $what = $$part{$which}.'.'.$$name{$which};
+ my $prefix;
+ if (($uname ne '') && ($udom ne '')) {
+ my $useropt = &Apache::lonnet::get_userresdata($uname,$udom);
+ $prefix = $env{'request.course.id'};
+ $recursinfo = &get_recursive($recurseup,$useropt,$what,$prefix);
+ if (ref($recursinfo) eq 'ARRAY') {
+ $effparm_rec = 1;
+ $effparm_level = &mt('user: [_1]',$uname);
+ }
+ }
+ if (($cgroup ne '') && (!$effparm_rec)) {
+ $prefix = $env{'request.course.id'}.'.['.$cgroup.']';
+ $recursinfo = &get_recursive($recurseup,$courseopt,$what,$prefix);
+ if (ref($recursinfo) eq 'ARRAY') {
+ $effparm_rec = 1;
+ $effparm_level = &mt('group: [_1]',$cgroup);
+ }
+ }
+ if (($csec ne '') && (!$effparm_rec)) {
+ $prefix = $env{'request.course.id'}.'.['.$csec.']';
+ $recursinfo = &get_recursive($recurseup,$courseopt,$what,$prefix);
+ if (ref($recursinfo) eq 'ARRAY') {
+ $effparm_rec = 1;
+ $effparm_level = &mt('section: [_1]',$csec);
+ }
+ }
+ if (!$effparm_rec) {
+ $prefix = $env{'request.course.id'};
+ $recursinfo = &get_recursive($recurseup,$courseopt,$what,$prefix);
+ if (ref($recursinfo) eq 'ARRAY') {
+ $effparm_rec = 1;
+ }
+ }
+ }
+ }
+ if ((!$effparm_rec) && ($result == 17 || $result == 11 || $result == 7 || $result == 3)) {
+ $effparm_rec = 1;
+ }
+ if ((!$effparm_rec) &&
+ (($$name{$which} eq 'encrypturl') || ($$name{$which} eq 'hiddenresource')) &&
+ ($result == 16 || $result == 10 || $result == 6 || $result == 2)) {
+ $effparm_rec = 1;
+ }
if ($parmlev eq 'general') {
if ($uname) {
- &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
} elsif ($cgroup) {
- &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
+ &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly);
} elsif ($csec) {
- &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
} else {
- &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
}
} elsif ($parmlev eq 'map') {
if ($uname) {
- &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
} elsif ($cgroup) {
- &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
- &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,1);
} elsif ($csec) {
- &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
} else {
- &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
}
} else {
if ($uname) {
if (@{$usersgroups} > 1) {
- my ($coursereply,$grp_parm,$controlgrp);
- ($coursereply,$othergrp,$grp_parm,$controlgrp) =
- &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
+ (my $coursereply,$othergrp,$grp_parm,$controlgrp,my $grp_is_rec) =
+ &check_other_groups($$part{$which}.'.'.$$name{$which},
$rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
- if ($coursereply && $result > 4) {
+ if (($coursereply) && ($result > 4)) {
if (defined($controlgrp)) {
if ($cgroup ne $controlgrp) {
- $effective_parm = $grp_parm;
- $result = 0;
+ $eff_groupparm = $grp_parm;
+ undef($result);
+ undef($effparm_rec);
+ if ($grp_is_rec) {
+ $effparm_rec = 1;
+ }
}
}
}
}
}
- &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
+ &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
if ($csec) {
- &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
}
if ($cgroup) {
- &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
- &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
- &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
- &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
+ &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,1);
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp.$readonly);
}
if ($uname) {
if ($othergrp) {
$r->print($othergrp);
}
- &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
- &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
+ &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
}
-
} # end of $parmlev if/else
- $r->print(''.$effective_parm.' ');
-
+ if (ref($recursinfo) eq 'ARRAY') {
+ my $rectitle = &mt('recursive');
+ if ((ref($maptitles) eq 'HASH') && (exists($maptitles->{$recursinfo->[2]}))) {
+ if ((ref($allmaps_inverted) eq 'HASH') && (exists($allmaps_inverted->{$recursinfo->[2]}))) {
+ $rectitle = &mt('set in: [_1]','"'.
+ '{$recursinfo->[2]}."',".
+ "'$parmname','$$part{$which}'".');">'.
+ $maptitles->{$recursinfo->[2]}.' "');
+
+ $numlinks ++;
+ }
+ }
+ my ($parmname)=($thismarker=~/\_([^\_]+)$/);
+ $effective_parm = &valout($recursinfo->[0],$recursinfo->[1],$parmname);
+ $r->print(''.$effective_parm.
+ ''.$rectitle.' '.
+ $effparm_level.' ');
+ } else {
+ if ($result) {
+ $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$parmname);
+ }
+ if ($eff_groupparm) {
+ $effective_parm = $eff_groupparm;
+ }
+ $r->print(''.$effective_parm.
+ ($effparm_rec?''.&mt('recursive').
+ ' ':'').' ');
+ }
if ($parmlev eq 'full') {
my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
'.'.$$name{$which},$$symbp{$rid});
@@ -1514,6 +1644,9 @@ sub print_row {
}
$r->print('');
$r->print("\n");
+ if (($numlinks) && (ref($reclinks))) {
+ $$reclinks = $numlinks;
+ }
}
# Prints a cell for table mode.
@@ -1532,44 +1665,72 @@ sub print_row {
# @param {array reference} $typeoutpar - array level -> parameter type (when defined)
# @param {hash reference} $display - parameter key -> full title for the parameter
# @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters
+# @param {boolean} $readonly -true if editing not allowed.
+# @param {boolean} $ismaplevel - true if level is for a map.
sub print_td {
- my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_;
- $r->print('');
my $nolink = 0;
- if ($which == 14 || $which == 15) {
- $nolink = 1;
- } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) {
+ if ($readonly) {
$nolink = 1;
- } elsif ($which == 5 || $which == 6 || $which == 7 || $which == 8) {
- if ($noeditgrp) {
+ } else {
+ if ($which == 14 || $which == 15 || $mprefix =~ /mapalias\&$/) {
$nolink = 1;
- }
- } elsif ($mprefix =~ /availablestudent\&$/) {
- if ($which > 4) {
- $nolink = 1;
- }
- } elsif ($mprefix =~ /examcode\&$/) {
- unless ($which == 2) {
+ } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) {
$nolink = 1;
+ } elsif ($which == 5 || $which == 6 || $which == 7 || $which == 8) {
+ if ($noeditgrp) {
+ $nolink = 1;
+ }
+ } elsif ($mprefix =~ /availablestudent\&$/) {
+ if ($which > 4) {
+ $nolink = 1;
+ }
+ } elsif ($mprefix =~ /examcode\&$/) {
+ unless ($which == 2) {
+ $nolink = 1;
+ }
}
}
if ($nolink) {
- $r->print(&valout($$outpar[$which],$$typeoutpar[$which],$mprefix));
-# FIXME: probably a good thing that mprefix is not used in valout, because it does not look like a parameter name !
+ my ($parmname)=((split(/\&/,$mprefix))[1]=~/\_([^\_]+)$/);
+ $r->print(&valout($currval,$currtype,$parmname));
} else {
- $r->print(&plink($$typeoutpar[$which],
- $$display{$value},$$outpar[$which],
- $mprefix."$which",'parmform.pres','psub'));
+ $r->print(&plink($currtype,
+ $$display{$value},$currval,
+ $mprefix.$currlevel,'parmform.pres','psub',$recursive));
}
$r->print(' '."\n");
}
-# FIXME: Despite the name, this does not print anything, the $r parameter is unused.
# Returns HTML and other info for the cell added when a user is selected
# and that user is in several groups. This is the cell with the title "Control by other group".
#
-# @param {Apache2::RequestRec} $r - the Apache request (unused)
# @param {string} $what - parameter part.'.'.parameter name
# @param {string} $rid - resource id
# @param {string} $cgroup - group name
@@ -1577,9 +1738,9 @@ sub print_td {
# @param {array reference} $usersgroups - list of groups the user belongs to, if any
# @param {integer} $result - level
# @param {hash reference} $courseopt - course parameters hash (result of lonnet::get_courseresdata, dump of course's resourcedata.db)
-# @returns {Array} - array (parameter value for the other group, HTML for the cell, HTML with the value, name of the other group)
-sub print_usergroups {
- my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
+# @returns {Array} - array (parameter value for the other group, HTML for the cell, HTML with the value, name of the other group, true if recursive)
+sub check_other_groups {
+ my ($what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
my $courseid = $env{'request.course.id'};
my $output;
my $symb = &symbcache($rid);
@@ -1591,16 +1752,22 @@ sub print_usergroups {
&parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,
$recurseparm,$what,$courseopt);
my $bgcolor = $defbg;
- my $grp_parm;
+ my ($grp_parm,$grp_is_rec);
if (($coursereply) && ($cgroup ne $resultgroup)) {
+ my ($parmname) = ($what =~ /\.([^.]+)$/);
if ($result > 3) {
$bgcolor = '#AAFFAA';
- $grp_parm = &valout($coursereply,$resulttype,$what);
}
- $grp_parm = &valout($coursereply,$resulttype,$what);
+ $grp_parm = &valout($coursereply,$resulttype,$parmname);
$output = '';
if ($resultgroup && $resultlevel) {
- $output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm;
+ if ($resultlevel eq 'recursive') {
+ $resultlevel = 'map/folder';
+ $grp_is_rec = 1;
+ }
+ $output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm.
+ ($grp_is_rec?''.&mt('recursive').' ':'');
+
} else {
$output .= ' ';
}
@@ -1608,11 +1775,11 @@ sub print_usergroups {
} else {
$output .= ' ';
}
- return ($coursereply,$output,$grp_parm,$resultgroup);
+ return ($coursereply,$output,$grp_parm,$resultgroup,$grp_is_rec);
}
# Looks for a group with a defined parameter for given user and parameter.
-# Used by print_usergroups.
+# Used by check_other_groups.
#
# @param {string} $courseid - the course id
# @param {array reference} $usersgroups - list of groups the user belongs to, if any
@@ -1651,16 +1818,16 @@ sub parm_control_group {
# Extracts lots of information about all of the the course's resources into a variety of hashes, using lonnavmaps and lonnet::metadata.
# All the parameters are references and are filled by the sub.
#
-# @param {array reference} $ids - resource ids
-# @param {hash reference} $typep - hash resource id (from big hash) -> resource type (file extension)
-# @param {hash reference} $keyp - hash resource id -> comma-separated list of parameter keys from lonnet::metadata
+# @param {array reference} $ids - resource and map ids
+# @param {hash reference} $typep - hash resource/map id -> resource type (file extension)
+# @param {hash reference} $keyp - hash resource/map id -> comma-separated list of parameter keys from lonnet::metadata
# @param {hash reference} $allparms - hash parameter name -> parameter title
# @param {hash reference} $allparts - hash parameter part -> part title (a parameter part can be problem part.'_'.response id for response parameters)
-# @param {hash reference} $allmaps - hash map id (from big hash) -> map src
-# @param {hash reference} $mapp - hash resource id -> enclosing map src
-# @param {hash reference} $symbp - hash map id or resource id -> map src.'___(all)' for a map or resource symb for a resource
-# @param {hash reference} $maptitles - hash map id or src -> map title (this should really be two separate hashes)
-# @param {hash reference} $uris - hash resource id -> resource src
+# @param {hash reference} $allmaps - hash map pc -> map src
+# @param {hash reference} $mapp - hash map pc or resource/map id -> enclosing map src
+# @param {hash reference} $symbp - hash map pc or resource/map id -> map src.'___(all)' for a map or resource symb for a resource
+# @param {hash reference} $maptitles - hash map pc or src -> map title (this should really be two separate hashes)
+# @param {hash reference} $uris - hash resource/map id -> resource src
# @param {hash reference} $keyorder - hash parameter key -> appearance rank for this parameter when looking through every resource and every parameter, starting at 100 (integer)
# @param {hash reference} $defkeytype - hash parameter name -> parameter type
sub extractResourceInformation {
@@ -1689,23 +1856,27 @@ sub extractResourceInformation {
my $srcf=$resource->src();
$srcf=~/\.(\w+)$/;
$$typep{$id}=$1;
+ my $toolsymb;
+ if ($srcf =~ /ext\.tool$/) {
+ $toolsymb = $resource->symb();
+ }
$$keyp{$id}='';
$$uris{$id}=$srcf;
- foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
+ foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys',$toolsymb))) {
next if ($key!~/^parameter_/);
# Hidden parameters
- next if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm');
+ next if (&Apache::lonnet::metadata($srcf,$key.'.hidden',$toolsymb) eq 'parm');
#
# allparms is a hash of parameter names
#
- my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
+ my $name=&Apache::lonnet::metadata($srcf,$key.'.name',$toolsymb);
if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) {
my ($display,$parmdis);
$display = &standard_parameter_names($name);
if ($display eq '') {
- $display= &Apache::lonnet::metadata($srcf,$key.'.display');
+ $display= &Apache::lonnet::metadata($srcf,$key.'.display',$toolsymb);
$parmdis = $display;
$parmdis =~ s/\s*\[Part.*$//g;
} else {
@@ -1714,14 +1885,14 @@ sub extractResourceInformation {
$$allparms{$name}=$parmdis;
if (ref($defkeytype)) {
$$defkeytype{$name}=
- &Apache::lonnet::metadata($srcf,$key.'.type');
+ &Apache::lonnet::metadata($srcf,$key.'.type',$toolsymb);
}
}
#
# allparts is a hash of all parts
#
- my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
+ my $part= &Apache::lonnet::metadata($srcf,$key.'.part',$toolsymb);
$$allparts{$part} = &mt('Part: [_1]',$part);
#
# Remember all keys going with this resource
@@ -1762,6 +1933,29 @@ sub extractResourceInformation {
}
}
+sub get_recursive {
+ my ($recurseup,$resdata,$what,$prefix) = @_;
+ if ((ref($resdata) eq 'HASH') && (ref($recurseup) eq 'ARRAY')) {
+ foreach my $item (@{$recurseup}) {
+ my $norecursechk=$prefix.'.'.$item.'___(all).'.$what;
+ if (defined($resdata->{$norecursechk})) {
+ if ($what =~ /\.(encrypturl|hiddenresource)$/) {
+ my $type = $resdata->{$norecursechk.'.type'};
+ return [$resdata->{$norecursechk},$type,$item];
+ } else {
+ last;
+ }
+ }
+ my $recursechk=$prefix.'.'.$item.'___(rec).'.$what;
+ if (defined($resdata->{$recursechk})) {
+ my $type = $resdata->{$recursechk.'.type'};
+ return [$resdata->{$recursechk},$type,$item];
+ }
+ }
+ }
+ return;
+}
+
# Tells if a parameter type is a date.
#
@@ -1773,15 +1967,10 @@ sub isdateparm {
}
# Prints the HTML and Javascript to select parameters, with various shortcuts.
-# FIXME: remove unused parameters
#
-# @param {Apache2::RequestRec} $r - the Apache request (unused)
-# @param {hash reference} $allparms - hash parameter name -> parameter title
-# @param {array reference} $pscat - list of selected parameter names (unused)
-# @param {hash reference} $keyorder - hash parameter key -> appearance rank (unused)
+# @param {Apache2::RequestRec} $r - the Apache request
sub parmmenu {
- my ($r,$allparms,$pscat,$keyorder)=@_;
- my $tempkey;
+ my ($r)=@_;
$r->print(<
// print(' ');
- &shortCuts($r,$allparms,$pscat,$keyorder);
+ &shortCuts($r);
$r->print(' ');
}
@@ -1927,8 +2116,8 @@ sub lookUpTableParameter {
'lenient' => 'grading',
'retrypartial' => 'tries',
'discussvote' => 'misc',
- 'examcode' => 'high_level_randomization',
- );
+ 'examcode' => 'high_level_randomization',
+ );
}
# Adds the given parameter name to an array of arrays listing all parameters for each category.
@@ -2022,6 +2211,7 @@ sub parmboxes {
$r->print(''
.'
'.&mt($categories{$key}).' '."\n");
foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {
+ next if ($tempkey eq '');
$r->print('
'
.' parameter title (unused)
-# @param {array reference} $pscat - list of selected parameter names (unused)
-# @param {hash reference} $keyorder - hash parameter key -> appearance rank (unused)
sub shortCuts {
- my ($r,$allparms,$pscat,$keyorder)=@_;
+ my ($r)=@_;
# Parameter Selection
$r->print(
@@ -2135,7 +2321,7 @@ sub usermenu {
if (($pssymb) || &Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
%grouphash = &Apache::longroup::coursegroups();
} elsif ($env{'request.course.groups'} ne '') {
- map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'});
+ map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});
}
my $g_s_header='';
@@ -2238,16 +2424,15 @@ function group_or_section(caller) {
# @param {Apache2::RequestRec} $r - the Apache request
# @param {hash reference} $allparms - hash parameter name -> parameter title
# @param {array reference} $pscat - list of selected parameter names
-# @param {array reference} $psprt - list of selected parameter parts (unused)
# @param {hash reference} $keyorder - hash parameter key -> appearance rank
# @param {string} [$divid] - name used to give an id to the HTML element for the scroll box
sub displaymenu {
- my ($r,$allparms,$pscat,$psprt,$keyorder,$divid)=@_;
+ my ($r,$allparms,$pscat,$keyorder,$divid)=@_;
$r->print(&Apache::lonhtmlcommon::start_pick_box());
$r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));
- &parmmenu($r,$allparms,$pscat,$keyorder); # only $allparms is used by parmmenu
+ &parmmenu($r);
$r->print(&Apache::loncommon::start_scrollbox('480px','440px','200px',$divid));
&parmboxes($r,$allparms,$pscat,$keyorder);
$r->print(&Apache::loncommon::end_scrollbox());
@@ -2261,10 +2446,10 @@ sub displaymenu {
# Used by table mode and overview mode.
#
# @param {Apache2::RequestRec} $r - the Apache request
-# @param {hash reference} $allmaps - hash map id -> map src
-# @param {string} $pschp - selected map id, or 'all'
+# @param {hash reference} $allmaps - hash map pc -> map src
+# @param {string} $pschp - selected map pc, or 'all'
# @param {hash reference} $maptitles - hash map id or src -> map title
-# @param {hash reference} $symbp - hash map id or resource id -> map src.'___(all)' for a map or resource symb for a resource
+# @param {hash reference} $symbp - hash map pc or resource/map id -> map src.'___(all)' or resource symb
sub mapmenu {
my ($r,$allmaps,$pschp,$maptitles,$symbp)=@_;
my %allmaps_inverted = reverse %$allmaps;
@@ -2416,8 +2601,12 @@ sub mapmenu {
}
}
-# Build up the select Box to choose if your parameter specification should work for the resource, map/folder or the course level
-# The value of default selection in the select box is set by the value that is given by the argument in $parmlev.
+# Prints HTML to select the parameter level (resource, map/folder or course).
+# Used by table and overview modes.
+#
+# @param {Apache2::RequestRec} $r - the Apache request
+# @param {hash reference} $alllevs - all parameter levels, hash English title -> value
+# @param {string} $parmlev - selected level value (full|map|general), or ''
sub levelmenu {
my ($r,$alllevs,$parmlev)=@_;
@@ -2435,6 +2624,11 @@ sub levelmenu {
}
+# Returns HTML to select a section (with a select HTML element).
+# Used by overview mode.
+#
+# @param {array reference} $selectedsections - list of selected section ids
+# @returns {string}
sub sectionmenu {
my ($selectedsections)=@_;
my %sectionhash = &Apache::loncommon::get_sections();
@@ -2460,13 +2654,18 @@ sub sectionmenu {
return $output;
}
+# Returns HTML to select a group (with a select HTML element).
+# Used by overview mode.
+#
+# @param {array reference} $selectedgroups - list of selected group names
+# @returns {string}
sub groupmenu {
my ($selectedgroups)=@_;
my %grouphash;
if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
%grouphash = &Apache::longroup::coursegroups();
} elsif ($env{'request.course.groups'} ne '') {
- map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'});
+ map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});
}
return '' if (!%grouphash);
@@ -2482,11 +2681,23 @@ sub groupmenu {
return $output;
}
+# Returns an array with the given parameter split by comma.
+# Used by assessparms (table mode).
+#
+# @param {string} $keyp - the string to split
+# @returns {Array}
sub keysplit {
my $keyp=shift;
return (split(/\,/,$keyp));
}
+# Returns the keys in $name, sorted using $keyorder.
+# Parameters are sorted by key, which means they are sorted by part first, then by name.
+# Used by assessparms (table mode) for resource level.
+#
+# @param {hash reference} $name - parameter key -> parameter name
+# @param {hash reference} $keyorder - hash parameter key -> appearance rank
+# @returns {Array}
sub keysinorder {
my ($name,$keyorder)=@_;
return sort {
@@ -2494,10 +2705,16 @@ sub keysinorder {
} (keys(%{$name}));
}
+# Returns the keys in $name, sorted using $keyorder to sort parameters by name first, then by part.
+# Used by assessparms (table mode) for map and general levels.
+#
+# @param {hash reference} $name - parameter key -> parameter name
+# @param {hash reference} $keyorder - hash parameter key -> appearance rank
+# @returns {Array}
sub keysinorder_bytype {
my ($name,$keyorder)=@_;
return sort {
- my $ta=(split('_',$a))[-1];
+ my $ta=(split('_',$a))[-1]; # parameter name
my $tb=(split('_',$b))[-1];
if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
return ($a cmp $b);
@@ -2506,6 +2723,12 @@ sub keysinorder_bytype {
} (keys(%{$name}));
}
+# Returns the keys in $name, sorted using $keyorder to sort parameters by name.
+# Used by defaultsetter (parameter settings default actions).
+#
+# @param {hash reference} $name - hash parameter name -> parameter title
+# @param {hash reference} $keyorder - hash parameter key -> appearance rank
+# @returns {Array}
sub keysindisplayorder {
my ($name,$keyorder)=@_;
return sort {
@@ -2513,6 +2736,11 @@ sub keysindisplayorder {
} (keys(%{$name}));
}
+# Prints HTML with a choice to sort results by realm or student first.
+# Used by overview mode.
+#
+# @param {Apache2::RequestRec} $r - the Apache request
+# @param {string} $sortorder - realmstudent|studentrealm
sub sortmenu {
my ($r,$sortorder)=@_;
$r->print(' ');
}
+# Returns a hash parameter key -> order (integer) giving the order for some parameters.
+#
+# @returns {hash}
sub standardkeyorder {
return ('parameter_0_opendate' => 1,
'parameter_0_duedate' => 2,
@@ -2556,28 +2787,60 @@ sub standardkeyorder {
# Table mode UI.
+# If nothing is selected, prints HTML forms to select resources, parts, parameters, user, group and section.
+# Otherwise, prints the parameter table, with a link to change the selection unless a single resource is selected.
+#
+# Parameters used from the request:
+# action - handler action (see handler), usermenu is checking for value 'settable'
+# cgroup - selected group
+# command - 'set': direct access to table mode for a resource
+# csec - selected section
+# dis - set when the "Update Display" button was used, used only to discard command 'set'
+# hideparmsel - can be 'hidden' to hide the parameter selection div initially and display the "Change Parameter Selection" link instead (which displays the div)
+# id - student/employee ID
+# parmlev - selected level (full|map|general)
+# part - selected part (unused ?)
+# pres_marker - &&&-separated parameter identifiers, "resource id&part_parameter name&level"
+# pres_type - &&&-separated parameter types
+# pres_value - &&&-separated parameter values
+# prevvisit - '1' if the user has submitted the form before
+# pscat (multiple values) - selected parameter names
+# pschp - selected map pc, or 'all'
+# psprt (multiple values) - list of selected parameter parts
+# filter - part of or whole parameter name, to be filtered out when parameters are displayed (unused ?)
+# recent_* (* = parameter type) - recent values entered by the user for parameter types
+# symb - resource symb (when a single resource is selected)
+# udom - selected user domain
+# uname - selected user name
+# url - used only with command 'set', the resource url
+#
+# @param {Apache2::RequestRec} $r - the Apache request
+# @param $parm_permission - ref to hash of permissions
+# if $parm_permission->{'edit'} is true, editing is allowed.
sub assessparms {
- my $r=shift;
+ my ($r,$parm_permission) = @_;
# -------------------------------------------------------- Variable declaration
- my @ids=();
- my %symbp=();
- my %mapp=();
- my %typep=();
- my %keyp=();
- my %uris=();
- my %maptitles=();
- my %allmaps=();
- my %alllevs=();
-
- my $uname;
- my $udom;
- my $uhome;
- my $csec;
- my $cgroup;
- my @usersgroups = ();
+ my @ids=(); # resource and map ids
+ my %symbp=(); # hash map pc or resource/map id -> map src.'___(all)' or resource symb
+ my %mapp=(); # hash map pc or resource/map id -> enclosing map src
+ my %typep=(); # hash resource/map id -> resource type (file extension)
+ my %keyp=(); # hash resource/map id -> comma-separated list of parameter keys
+ my %uris=(); # hash resource/map id -> resource src
+ my %maptitles=(); # hash map pc or src -> map title
+ my %allmaps=(); # hash map pc -> map src
+ my %allmaps_inverted=(); # hash map src -> map pc
+ my %alllevs=(); # hash English level title -> value
+
+ my $uname; # selected user name
+ my $udom; # selected user domain
+ my $uhome; # server with the user's files, or 'no_host'
+ my $csec; # selected section name
+ my $cgroup; # selected group name
+ my @usersgroups = (); # list of the user groups
+ my $numreclinks = 0;
my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
@@ -2585,8 +2848,8 @@ sub assessparms {
$alllevs{'Map/Folder Level'}='map';
$alllevs{'Course Level'}='general';
- my %allparms;
- my %allparts;
+ my %allparms; # hash parameter name -> parameter title
+ my %allparts; # hash parameter part -> part title
# ------------------------------------------------------------------------------
#
@@ -2611,7 +2874,7 @@ sub assessparms {
if ($cgroup ne '') {
unless (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
if (($env{'request.course.groups'} eq '') ||
- (!grep(/^\Q$cgroup\E$/,split(/,/,$env{'request.course.groups'})))) {
+ (!grep(/^\Q$cgroup\E$/,split(/:/,$env{'request.course.groups'})))) {
$noeditgrp = 1;
}
}
@@ -2725,11 +2988,13 @@ sub assessparms {
\%mapp, \%symbp,\%maptitles,\%uris,
\%keyorder);
+ %allmaps_inverted = reverse(%allmaps);
+
$mapp{'0.0'} = '';
$symbp{'0.0'} = '';
# ---------------------------------------------------------- Anything to store?
- if ($env{'form.pres_marker'}) {
+ if ($env{'form.pres_marker'} && $parm_permission->{'edit'}) {
my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
my @values=split(/\&\&\&/,$env{'form.pres_value'});
my @types=split(/\&\&\&/,$env{'form.pres_type'});
@@ -2889,20 +3154,27 @@ sub assessparms {
.'';
}
}
+
#----------------------------------------------- if all selected, fill in array
- if ($pscat[0] eq "all") {@pscat = (keys(%allparms));}
- if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries','type','problemstatus') };
- if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys(%allparts));}
+ if ($pscat[0] eq "all") {
+ @pscat = (keys(%allparms));
+ }
+ if (!@pscat) {
+ @pscat=('duedate','opendate','answerdate','weight','maxtries','type','problemstatus')
+ };
+ if ($psprt[0] eq "all" || !@psprt) {
+ @psprt = (keys(%allparts));
+ }
# ------------------------------------------------------------------ Start page
my $crstype = &Apache::loncommon::course_type();
&startpage($r,$pssymb,$crstype);
foreach my $item ('tolerance','date_default','date_start','date_end',
- 'date_interval','int','float','string') {
+ 'date_interval','int','float','string') {
$r->print(' ').
- '" name="recent_'.$item.'" />');
+ &HTML::Entities::encode($env{'form.recent_'.$item},'"&<>').
+ '" name="recent_'.$item.'" />');
}
# ----- Start Parameter Selection
@@ -2920,6 +3192,7 @@ function parmsel_show() {
ENDPARMSELSCRIPT
if (!$pssymb) {
+ # No single resource selected, print forms to select things (hidden after first selection)
my $parmselhiddenstyle=' style="display:none"';
if($env{'form.hideparmsel'} eq 'hidden') {
$r->print('');
@@ -2948,7 +3221,7 @@ ENDPARMSELSCRIPT
# Step 2
$r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));
- &displaymenu($r,\%allparms,\@pscat,\@psprt,\%keyorder,'parmmenuscroll');
+ &displaymenu($r,\%allparms,\@pscat,\%keyorder,'parmmenuscroll');
# Step 3
$r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));
@@ -3015,15 +3288,19 @@ ENDPARMSELSCRIPT
my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
my $csuname=$env{'user.name'};
my $csudom=$env{'user.domain'};
+ my $readonly = 1;
+ if ($parm_permission->{'edit'}) {
+ undef($readonly);
+ }
if ($parmlev eq 'full') {
#
# This produces the cascading table output of parameters
#
- my $coursespan=$csec?10:6;
- my $userspan=4;
+ my $coursespan=$csec?8:5;
+ my $userspan=3;
if ($cgroup ne '') {
- $coursespan += 4;
+ $coursespan += 3;
}
$r->print(&Apache::loncommon::start_data_table());
@@ -3053,44 +3330,43 @@ ENDPARMSELSCRIPT
'femof' => 'from Enclosing Map or Folder',
'gen' => 'general',
'foremf' => 'for Enclosing Map or Folder',
- 'formfr' => 'for Map or Folder (recursive)',
'fr' => 'for Resource'
);
$r->print(<
$lt{'pie'}
$lt{'csv'} ($csuname:$csudom)
-$lt{'ic'} $lt{'rl'}
+$lt{'ic'} $lt{'rl'}
$lt{'ic'}
ENDTABLETWO
if ($csec) {
- $r->print(''.
+ $r->print(' '.
&mt("in Section")." $csec ");
}
if ($cgroup) {
- $r->print(''.
+ $r->print(' '.
&mt("in Group")." $cgroup ");
}
$r->print(<$lt{'aut'} $lt{'type'}
$lt{'emof'} $lt{'part'} $lt{'pn'}
-$lt{'gen'} $lt{'formfr'} $lt{'foremf'}
+$lt{'gen'} $lt{'foremf'}
$lt{'def'} $lt{'femof'} $lt{'fr'}
ENDTABLEHEADFOUR
if ($csec) {
- $r->print(''.$lt{'gen'}.' '.$lt{'formfr'}.' '.$lt{'foremf'}.' '.$lt{'fr'}.' ');
+ $r->print(''.$lt{'gen'}.' '.$lt{'foremf'}.' '.$lt{'fr'}.' ');
}
if ($cgroup) {
- $r->print(''.$lt{'gen'}.' '.$lt{'formfr'}.' '.&mt('foremf').' '.$lt{'fr'}.' ');
+ $r->print(''.$lt{'gen'}.' '.$lt{'foremf'}.' '.$lt{'fr'}.' ');
}
if ($uname) {
if (@usersgroups > 1) {
$r->print(''.&mt('Control by other group?').' ');
}
- $r->print(''.$lt{'gen'}.' '.$lt{'formfr'}.' '.$lt{'foremf'}.' '.$lt{'fr'}.' ');
+ $r->print(''.$lt{'gen'}.' '.$lt{'foremf'}.' '.$lt{'fr'}.' ');
}
$r->print(' ');
@@ -3104,7 +3380,6 @@ ENDTABLEHEADFOUR
foreach my $rid (@ids) {
my ($inmapid)=($rid=~/\.(\d+)$/);
-
if ((!$pssymb &&
(($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
||
@@ -3134,19 +3409,23 @@ ENDTABLEHEADFOUR
my %type= ();
my %default=();
my $uri=&Apache::lonnet::declutter($uris{$rid});
+ my $toolsymb;
+ if ($uri =~ /ext\.tool$/) {
+ $toolsymb = $symbp{$rid};
+ }
my $filter=$env{'form.filter'};
foreach my $tempkeyp (&keysplit($keyp{$rid})) {
if (grep $_ eq $tempkeyp, @catmarker) {
- my $parmname=&Apache::lonnet::metadata($uri,$tempkeyp.'.name');
+ my $parmname=&Apache::lonnet::metadata($uri,$tempkeyp.'.name',$toolsymb);
# We may only want certain parameters listed
if ($filter) {
unless ($filter=~/\Q$parmname\E/) { next; }
}
$name{$tempkeyp}=$parmname;
- $part{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.part');
+ $part{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.part',$toolsymb);
- my $parmdis=&Apache::lonnet::metadata($uri,$tempkeyp.'.display');
+ my $parmdis=&Apache::lonnet::metadata($uri,$tempkeyp.'.display',$toolsymb);
if ($allparms{$name{$tempkeyp}} ne '') {
my $identifier;
if ($parmdis =~ /(\s*\[Part.*)$/) {
@@ -3158,15 +3437,20 @@ ENDTABLEHEADFOUR
}
unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
$display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
- $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp);
- $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.type');
- $thistitle=&Apache::lonnet::metadata($uri,$tempkeyp.'.title');
+ $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp,$toolsymb);
+ $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$tempkeyp.'.type',$toolsymb);
+ $thistitle=&Apache::lonnet::metadata($uri,$tempkeyp.'.title',$toolsymb);
}
}
my $totalparms=scalar(keys(%name));
if ($totalparms>0) {
my $firstrow=1;
my $title=&Apache::lonnet::gettitle($symbp{$rid});
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my @recurseup;
+ if (ref($navmap) && $mapp{$rid}) {
+ @recurseup = $navmap->recurseup_maps($mapp{$rid});
+ }
$r->print(''.
@@ -3198,7 +3482,9 @@ ENDTABLEHEADFOUR
&print_row($r,$item,\%part,\%name,\%symbp,$rid,\%default,
\%type,\%display,$defbgone,$defbgtwo,
$defbgthree,$parmlev,$uname,$udom,$csec,
- $cgroup,\@usersgroups,$noeditgrp);
+ $cgroup,\@usersgroups,$noeditgrp,$readonly,
+ \@recurseup,\%maptitles,\%allmaps_inverted,
+ \$numreclinks);
}
}
}
@@ -3244,6 +3530,11 @@ ENDTABLEHEADFOUR
if ($map eq $mapid) {
my $uri=&Apache::lonnet::declutter($uris{$rid});
+ my $toolsymb;
+ if ($uri =~ /ext\.tool$/) {
+ $toolsymb = $symbp{$rid};
+ }
+
# $r->print("Keys: $keyp{$rid} \n");
#--------------------------------------------------------------------
@@ -3259,8 +3550,8 @@ ENDTABLEHEADFOUR
if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
$part{$tempkeyp}="0";
- $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
- my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
+ $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name',$toolsymb);
+ my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display',$toolsymb);
if ($allparms{$name{$tempkeyp}} ne '') {
my $identifier;
if ($parmdis =~ /(\s*\[Part.*)$/) {
@@ -3273,8 +3564,8 @@ ENDTABLEHEADFOUR
unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
$display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
$display{$tempkeyp} =~ s/_\w+_/_0_/;
- $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
- $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
+ $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp,$toolsymb);
+ $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type',$toolsymb);
}
} # end loop through keys
}
@@ -3311,17 +3602,28 @@ ENDTABLEHEADFOUR
$r->print(''.&Apache::loncommon::start_data_table()
.&Apache::loncommon::start_data_table_header_row()
.'
'.&mt('Parameter Name').' '
- .''.&mt('Recursive Value').' '
- .''.&mt('Non-Recursive Value').' '
+ .''.&mt('Value').' '
.''.&mt('Parameter in Effect').' '
.&Apache::loncommon::end_data_table_header_row()
);
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my @recurseup;
+ if (ref($navmap)) {
+ my $mapres = $navmap->getByMapPc($mapid);
+ if (ref($mapres)) {
+ @recurseup = $navmap->recurseup_maps($mapres->src());
+ }
+ }
+
+
foreach my $item (&keysinorder(\%name,\%keyorder)) {
$r->print(&Apache::loncommon::start_data_table_row());
&print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,
\%type,\%display,$defbgone,$defbgtwo,$defbgthree,
- $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp);
+ $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,
+ $readonly,\@recurseup,\%maptitles,\%allmaps_inverted,
+ \$numreclinks);
}
$r->print(&Apache::loncommon::end_data_table().''
.''
@@ -3348,6 +3650,10 @@ ENDTABLEHEADFOUR
my $rid = $id;
my $uri=&Apache::lonnet::declutter($uris{$rid});
+ my $toolsymb;
+ if ($uri =~ /ext\.tool$/) {
+ $toolsymb = $symbp{$rid};
+ }
#--------------------------------------------------------------------
# @catmarker contains list of all possible parameters including part #s
@@ -3361,8 +3667,8 @@ ENDTABLEHEADFOUR
$tempkeyp =~ s/_\w+_/_0_/;
if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
$part{$tempkeyp}="0";
- $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
- my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
+ $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name',$toolsymb);
+ my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display',$toolsymb);
if ($allparms{$name{$tempkeyp}} ne '') {
my $identifier;
if ($parmdis =~ /(\s*\[Part.*)$/) {
@@ -3375,8 +3681,8 @@ ENDTABLEHEADFOUR
unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
$display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
$display{$tempkeyp} =~ s/_\w+_/_0_/;
- $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
- $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
+ $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp,$toolsymb);
+ $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type',$toolsymb);
}
} # end loop through keys
} # end loop through ids
@@ -3410,8 +3716,9 @@ ENDMAPONE
foreach my $item (&keysinorder(\%name,\%keyorder)) {
$r->print(&Apache::loncommon::start_data_table_row());
&print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,
- \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
- $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp);
+ \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
+ $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,
+ $readonly);
}
$r->print(&Apache::loncommon::end_data_table()
.''
@@ -3420,6 +3727,25 @@ ENDMAPONE
} # end of $parmlev eq general
}
$r->print('');
+ if ($numreclinks) {
+ $r->print(<<"END");
+
+
+END
+ }
&endSettingsScreen($r);
$r->print(&Apache::loncommon::end_page());
} # end sub assessparms
@@ -3429,10 +3755,14 @@ ENDMAPONE
##################################################
# OVERVIEW MODE
##################################################
-my $tableopen;
+my $tableopen; # boolean, true if HTML table is already opened
+
+# Returns HTML with the HTML table start tag and header, unless the table is already opened.
+# @param {boolean} $readonly - true if values cannot be edited (otherwise more columns are added)
+# @returns {string}
sub tablestart {
- my ($readonly) = @_;
+ my ($readonly,$is_map) = @_;
if ($tableopen) {
return '';
} else {
@@ -3441,13 +3771,19 @@ sub tablestart {
if ($readonly) {
$output .= ''.&mt('Current value').' ';
} else {
- $output .= ''.&mt('Delete').' '.&mt('Set to ...').' ';
+ $output .= ''.&mt('Delete').' '.
+ ''.&mt('Set to ...').' ';
+ if ($is_map) {
+ $output .= ''.&mt('Recursive?').' ';
+ }
}
$output .= ' ';
return $output;
}
}
+# Returns HTML with the HTML table end tag, unless the table is not opened.
+# @returns {string}
sub tableend {
if ($tableopen) {
$tableopen=0;
@@ -3457,6 +3793,13 @@ sub tableend {
}
}
+# Reads course and user information.
+# If the context is looking for a scalar, returns the course parameters hash (result of lonnet::get_courseresdata, dump of course's resourcedata.db) with added student data from lonnet::get_userresdata (which reads the user's resourcedata.db).
+# The key for student data is modified with '[useropt:'.username.':'.userdomain.'].'.
+# If the context is looking for a list, returns a list with the scalar data and the class list.
+# @param {string} $crs - course number
+# @param {string} $dom - course domain
+# @returns {hash reference|Array}
sub readdata {
my ($crs,$dom)=@_;
# Read coursedata
@@ -3485,8 +3828,24 @@ sub readdata {
}
-# Setting
-
+# Stores parameter data, using form parameters directly.
+#
+# Uses the following form parameters. The variable part in the names is a resourcedata key (except for a modification for user data).
+# set_* (except settext, setipallow, setipdeny) - set a parameter value
+# del_* - remove a parameter
+# datepointer_* - set a date parameter (value is key_* refering to a set of other form parameters)
+# dateinterval_* - set a date interval parameter (value refers to more form parameters)
+# key_* - date values
+# days_* - for date intervals
+# hours_* - for date intervals
+# minutes_* - for date intervals
+# seconds_* - for date intervals
+# done_* - for date intervals
+# typeof_* - parameter type
+#
+# @param {Apache2::RequestRec} $r - the Apache request
+# @param {string} $crs - course number
+# @param {string} $dom - course domain
sub storedata {
my ($r,$crs,$dom)=@_;
# Set userlevel immediately
@@ -3495,6 +3854,8 @@ sub storedata {
my %newdata=();
undef %newdata;
my @deldata=();
+ my @delrec=();
+ my @delnonrec=();
undef @deldata;
my ($got_chostname,$chostname,$cmajor,$cminor);
my $now = time;
@@ -3502,188 +3863,346 @@ sub storedata {
if ($key =~ /^form\.([a-z]+)\_(.+)$/) {
my $cmd=$1;
my $thiskey=$2;
- next if ($cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny');
+ my ($altkey,$recursive,$tkey,$tkeyrec,$tkeynonrec);
+ next if ($cmd eq 'rec' || $cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny');
+ if ((($cmd eq 'set') || ($cmd eq 'datepointer') || ($cmd eq 'dateinterval') || ($cmd eq 'del')) &&
+ ($thiskey =~ /(?:sequence|page)\Q___(all)\E/)) {
+ unless ($thiskey =~ /(encrypturl|hiddenresource)$/) {
+ $altkey = $thiskey;
+ $altkey =~ s/\Q___(all)\E/___(rec)/;
+ if ($env{'form.rec_'.$thiskey}) {
+ $recursive = 1;
+ }
+ }
+ }
my ($tuname,$tudom)=&extractuser($thiskey);
- my $tkey=$thiskey;
if ($tuname) {
+ $tkey=$thiskey;
$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
+ if ($altkey) {
+ $tkeynonrec = $tkey;
+ $tkeyrec = $altkey;
+ $tkeyrec=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
+ }
}
if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
- my ($data, $typeof, $text, $name, $valchk, $valmatch, $namematch);
- if ($cmd eq 'set') {
- $data=$env{$key};
- $valmatch = '';
- $valchk = $data;
- $typeof=$env{'form.typeof_'.$thiskey};
- $text = &mt('Saved modified parameter for');
- if ($typeof eq 'string_questiontype') {
- $name = 'type';
- } elsif ($typeof eq 'string_lenient') {
- $name = 'lenient';
- my $stringmatch = &standard_string_matches($typeof);
- if (ref($stringmatch) eq 'ARRAY') {
- foreach my $item (@{$stringmatch}) {
- if (ref($item) eq 'ARRAY') {
- my ($regexpname,$pattern) = @{$item};
- if ($pattern ne '') {
- if ($data =~ /$pattern/) {
- $valmatch = $regexpname;
- $valchk = '';
- last;
+ my ($data, $typeof, $text, $name, $valchk, $valmatch, $namematch);
+ if ($cmd eq 'set') {
+ $data=$env{$key};
+ $valmatch = '';
+ $valchk = $data;
+ $typeof=$env{'form.typeof_'.$thiskey};
+ $text = &mt('Saved modified parameter for');
+ if ($typeof eq 'string_questiontype') {
+ $name = 'type';
+ } elsif ($typeof eq 'string_lenient') {
+ $name = 'lenient';
+ my $stringmatch = &standard_string_matches($typeof);
+ if (ref($stringmatch) eq 'ARRAY') {
+ foreach my $item (@{$stringmatch}) {
+ if (ref($item) eq 'ARRAY') {
+ my ($regexpname,$pattern) = @{$item};
+ if ($pattern ne '') {
+ if ($data =~ /$pattern/) {
+ $valmatch = $regexpname;
+ $valchk = '';
+ last;
+ }
}
}
}
}
+ } elsif ($typeof eq 'string_discussvote') {
+ $name = 'discussvote';
+ } elsif ($typeof eq 'string_examcode') {
+ $name = 'examcode';
+ if (&Apache::lonnet::validCODE($data)) {
+ $valchk = 'valid';
+ }
+ } elsif ($typeof eq 'string_yesno') {
+ if ($thiskey =~ /\.retrypartial$/) {
+ $name = 'retrypartial';
+ }
}
- } elsif ($typeof eq 'string_discussvote') {
- $name = 'discussvote';
- } elsif ($typeof eq 'string_examcode') {
- $name = 'examcode';
- if (&Apache::lonnet::validCODE($data)) {
- $valchk = 'valid';
- }
- } elsif ($typeof eq 'string_yesno') {
- if ($thiskey =~ /\.retrypartial$/) {
- $name = 'retrypartial';
- }
- }
- } elsif ($cmd eq 'datepointer') {
- $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});
- $typeof=$env{'form.typeof_'.$thiskey};
- $text = &mt('Saved modified date for');
- if ($typeof eq 'date_start') {
- if ($thiskey =~ /\.printstartdate$/) {
- $name = 'printstartdate';
- if (($data) && ($data > $now)) {
- $valchk = 'future';
- }
- }
- } elsif ($typeof eq 'date_end') {
- if ($thiskey =~ /\.printenddate$/) {
- $name = 'printenddate';
- if (($data) && ($data < $now)) {
- $valchk = 'past';
+ } elsif ($cmd eq 'datepointer') {
+ $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});
+ $typeof=$env{'form.typeof_'.$thiskey};
+ $text = &mt('Saved modified date for');
+ if ($typeof eq 'date_start') {
+ if ($thiskey =~ /\.printstartdate$/) {
+ $name = 'printstartdate';
+ if (($data) && ($data > $now)) {
+ $valchk = 'future';
+ }
+ }
+ } elsif ($typeof eq 'date_end') {
+ if ($thiskey =~ /\.printenddate$/) {
+ $name = 'printenddate';
+ if (($data) && ($data < $now)) {
+ $valchk = 'past';
+ }
}
}
- }
- } elsif ($cmd eq 'dateinterval') {
- $data=&get_date_interval_from_form($thiskey);
- if ($thiskey =~ /\.interval$/) {
- $name = 'interval';
- my $intervaltype = &get_intervaltype($name);
- my $intervalmatch = &standard_interval_matches($intervaltype);
- if (ref($intervalmatch) eq 'ARRAY') {
- foreach my $item (@{$intervalmatch}) {
- if (ref($item) eq 'ARRAY') {
- my ($regexpname,$pattern) = @{$item};
- if ($pattern ne '') {
- if ($data =~ /$pattern/) {
- $valmatch = $regexpname;
- $valchk = '';
- last;
+ } elsif ($cmd eq 'dateinterval') {
+ $data=&get_date_interval_from_form($thiskey);
+ if ($thiskey =~ /\.interval$/) {
+ $name = 'interval';
+ my $intervaltype = &get_intervaltype($name);
+ my $intervalmatch = &standard_interval_matches($intervaltype);
+ if (ref($intervalmatch) eq 'ARRAY') {
+ foreach my $item (@{$intervalmatch}) {
+ if (ref($item) eq 'ARRAY') {
+ my ($regexpname,$pattern) = @{$item};
+ if ($pattern ne '') {
+ if ($data =~ /$pattern/) {
+ $valmatch = $regexpname;
+ $valchk = '';
+ last;
+ }
}
}
}
}
}
+ $typeof=$env{'form.typeof_'.$thiskey};
+ $text = &mt('Saved modified date for');
}
- $typeof=$env{'form.typeof_'.$thiskey};
- $text = &mt('Saved modified date for');
- }
- if ($thiskey =~ m{\.(?:sequence|page)___\(rec\)}) {
- $namematch = 'maplevelrecurse';
- }
- if (($name ne '') || ($namematch ne '')) {
- my ($needsrelease,$needsnewer);
- if ($name ne '') {
- $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$valchk:$valmatch:"};
- if ($needsrelease) {
- unless ($got_chostname) {
- ($chostname,$cmajor,$cminor)=¶meter_release_vars();
- $got_chostname = 1;
- }
- $needsnewer = ¶meter_releasecheck($name,$valchk,$valmatch,undef,
- $needsrelease,
- $cmajor,$cminor);
- }
+ if ($recursive) {
+ $namematch = 'maplevelrecurse';
}
- if ($namematch ne '') {
- if ($needsnewer) {
- undef($namematch);
- } else {
- my $currneeded;
+ if (($name ne '') || ($namematch ne '')) {
+ my ($needsrelease,$needsnewer);
+ if ($name ne '') {
+ $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$valchk:$valmatch:"};
if ($needsrelease) {
- $currneeded = $needsrelease;
- }
- $needsrelease =
- $Apache::lonnet::needsrelease{"parameter::::$namematch"};
- if (($needsrelease) && (($currneeded eq '') || ($needsrelease < $currneeded))) {
unless ($got_chostname) {
- ($chostname,$cmajor,$cminor) = ¶meter_release_vars();
+ ($chostname,$cmajor,$cminor)=¶meter_release_vars();
$got_chostname = 1;
}
- $needsnewer = ¶meter_releasecheck(undef,$valchk,$valmatch,$namematch,
- $needsrelease,$cmajor,$cminor);
- } else {
+ $needsnewer = ¶meter_releasecheck($name,$valchk,$valmatch,undef,
+ $needsrelease,
+ $cmajor,$cminor);
+ }
+ }
+ if ($namematch ne '') {
+ if ($needsnewer) {
undef($namematch);
+ } else {
+ my $currneeded;
+ if ($needsrelease) {
+ $currneeded = $needsrelease;
+ }
+ $needsrelease =
+ $Apache::lonnet::needsrelease{"parameter::::$namematch"};
+ if (($needsrelease) &&
+ (($currneeded eq '') || ($needsrelease < $currneeded))) {
+ unless ($got_chostname) {
+ ($chostname,$cmajor,$cminor) = ¶meter_release_vars();
+ $got_chostname = 1;
+ }
+ $needsnewer = ¶meter_releasecheck(undef,$valchk,$valmatch,
+ $namematch, $needsrelease,$cmajor,$cminor);
+ } else {
+ undef($namematch);
+ }
}
}
+ if ($needsnewer) {
+ $r->print(' '.&oldversion_warning($name,$namematch,$data,
+ $chostname,$cmajor,
+ $cminor,$needsrelease));
+ next;
+ }
}
- if ($needsnewer) {
- $r->print(' '.&oldversion_warning($name,$namematch,$data,
- $chostname,$cmajor,
- $cminor,$needsrelease));
- next;
- }
- }
- if (defined($data) and $$olddata{$thiskey} ne $data) {
+ my ($reconlychg,$haschange,$storekey);
if ($tuname) {
- if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
- $tkey.'.type' => $typeof},
- $tudom,$tuname) eq 'ok') {
- &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
- $r->print(' '.$text.' '.
- &Apache::loncommon::plainname($tuname,$tudom));
+ my $ustorekey;
+ if ($altkey) {
+ if ($recursive) {
+ if (exists($$olddata{$thiskey})) {
+ if ($$olddata{$thiskey} eq $data) {
+ $reconlychg = 1;
+ }
+ &Apache::lonnet::del('resourcedata',[$tkeynonrec,$tkeynonrec.'.type'],$tudom,$tuname);
+ }
+ if (exists($$olddata{$altkey})) {
+ if (defined($data) && $$olddata{$altkey} ne $data) {
+ $haschange = 1;
+ }
+ } elsif ((!$reconlychg) && ($data ne '')) {
+ $haschange = 1;
+ }
+ $ustorekey = $tkeyrec;
+ } else {
+ if (exists($$olddata{$altkey})) {
+ if ($$olddata{$altkey} eq $data) {
+ $reconlychg = 1;
+ }
+ &Apache::lonnet::del('resourcedata',[$tkeyrec,$tkeyrec.'.type'],$tudom,$tuname);
+ }
+ if (exists($$olddata{$thiskey})) {
+ if (defined($data) && $$olddata{$thiskey} ne $data) {
+ $haschange = 1;
+ }
+ } elsif ((!$reconlychg) && ($data ne '')) {
+ $haschange = 1;
+ }
+ $ustorekey = $tkeynonrec;
+ }
} else {
- $r->print(''.
- &mt('Error saving parameters').'
');
+ if (exists($$olddata{$tkey})) {
+ if (defined($data) && $$olddata{$tkey} ne $data) {
+ $haschange = 1;
+ }
+ $ustorekey = $tkey;
+ }
+ }
+ if ($haschange || $reconlychg) {
+ unless ($env{'form.del_'.$thiskey}) {
+ if (&Apache::lonnet::put('resourcedata',{$ustorekey=>$data,
+ $ustorekey.'.type' => $typeof},
+ $tudom,$tuname) eq 'ok') {
+ &log_parmset({$ustorekey=>$data,$ustorekey.'.type' => $typeof},0,$tuname,$tudom);
+ $r->print(' '.$text.' '.
+ &Apache::loncommon::plainname($tuname,$tudom));
+ } else {
+ $r->print(''.
+ &mt('Error saving parameters').'
');
+ }
+ &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
+ }
}
- &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
} else {
- $newdata{$thiskey}=$data;
- $newdata{$thiskey.'.type'}=$typeof;
+ if ($altkey) {
+ if ($recursive) {
+ if (exists($$olddata{$thiskey})) {
+ if ($$olddata{$thiskey} eq $data) {
+ $reconlychg = 1;
+ }
+ push(@delnonrec,($thiskey,$thiskey.'.type'));
+ }
+ if (exists($$olddata{$altkey})) {
+ if (defined($data) && $$olddata{$altkey} ne $data) {
+ $haschange = 1;
+ }
+ } elsif (($data ne '') && (!$reconlychg)) {
+ $haschange = 1;
+ }
+ $storekey = $altkey;
+ } else {
+ if (exists($$olddata{$altkey})) {
+ if ($$olddata{$altkey} eq $data) {
+ $reconlychg = 1;
+ }
+ push(@delrec,($altkey,$altkey.'.type'));
+ }
+ if (exists($$olddata{$thiskey})) {
+ if (defined($data) && $$olddata{$thiskey} ne $data) {
+ $haschange = 1;
+ }
+ } elsif (($data ne '') && (!$reconlychg)) {
+ $haschange = 1;
+ }
+ $storekey = $thiskey;
+ }
+ } else {
+ if (defined($data) && $$olddata{$thiskey} ne $data) {
+ $haschange = 1;
+ $storekey = $thiskey;
+ }
+ }
+ }
+ if ($reconlychg || $haschange) {
+ unless ($env{'form.del_'.$thiskey}) {
+ $newdata{$storekey}=$data;
+ $newdata{$storekey.'.type'}=$typeof;
+ }
}
- }
} elsif ($cmd eq 'del') {
if ($tuname) {
- if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
- &log_parmset({$tkey=>''},1,$tuname,$tudom);
- $r->print(' '.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
+ my $error;
+ if ($altkey) {
+ if (exists($$olddata{$altkey})) {
+ if (&Apache::lonnet::del('resourcedata',[$tkeyrec,$tkeyrec.'.type'],$tudom,$tuname) eq 'ok') {
+ &log_parmset({$tkeyrec=>''},1,$tuname,$tudom);
+ if ($recursive) {
+ $r->print(' '.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
+ }
+ } elsif ($recursive) {
+ $error = 1;
+ }
+ }
+ if (exists($$olddata{$thiskey})) {
+ if (&Apache::lonnet::del('resourcedata',[$tkeynonrec,$tkeynonrec.'.type'],$tudom,$tuname) eq 'ok') {
+ &log_parmset({$tkeynonrec=>''},1,$tuname,$tudom);
+ unless ($recursive) {
+ $r->print(' '.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
+ }
+ } elsif (!$recursive) {
+ $error = 1;
+ }
+ }
} else {
+ if (exists($$olddata{$thiskey})) {
+ if (&Apache::lonnet::del('resourcedata',[$tkey,$tkey.'.type'],$tudom,$tuname) eq 'ok') {
+ &log_parmset({$tkey=>''},1,$tuname,$tudom);
+ $r->print(' '.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
+ } else {
+ $error = 1;
+ }
+ }
+ }
+ if ($error) {
$r->print(''.
&mt('Error deleting parameters').'
');
}
&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
} else {
- push (@deldata,$thiskey,$thiskey.'.type');
+ if ($altkey) {
+ if (exists($$olddata{$altkey})) {
+ unless (grep(/^\Q$altkey\E$/,@delrec)) {
+ push(@deldata,($altkey,$altkey.'.type'));
+ }
+ }
+ if (exists($$olddata{$thiskey})) {
+ unless (grep(/^\Q$thiskey\E$/,@delnonrec)) {
+ push(@deldata,($thiskey,$thiskey.'.type'));
+ }
+ }
+ } elsif (exists($$olddata{$thiskey})) {
+ push(@deldata,($thiskey,$thiskey.'.type'));
+ }
}
}
}
}
# Store all course level
my $delentries=$#deldata+1;
+ my @alldels;
+ if (@delrec) {
+ push(@alldels,@delrec);
+ }
+ if (@delnonrec) {
+ push(@alldels,@delnonrec);
+ }
+ if (@deldata) {
+ push(@alldels,@deldata);
+ }
my @newdatakeys=keys(%newdata);
my $putentries=$#newdatakeys+1;
- if ($delentries) {
- if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
- my %loghash=map { $_ => '' } @deldata;
+ my ($delresult,$devalidate);
+ if (@alldels) {
+ if (&Apache::lonnet::del('resourcedata',\@alldels,$dom,$crs) eq 'ok') {
+ my %loghash=map { $_ => '' } @alldels;
&log_parmset(\%loghash,1);
- $r->print(''.&mt('Deleted [quant,_1,parameter]',$delentries/2).' ');
- } else {
+ if ($delentries) {
+ $r->print(''.&mt('Deleted [quant,_1,parameter]',$delentries/2).' ');
+ }
+ } elsif ($delentries) {
$r->print(''.
&mt('Error deleting parameters').'
');
}
- &Apache::lonnet::devalidatecourseresdata($crs,$dom);
+ $devalidate = 1;
}
if ($putentries) {
if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
@@ -3693,15 +4212,27 @@ sub storedata {
$r->print(''.
&mt('Error saving parameters').'
');
}
+ $devalidate = 1;
+ }
+ if ($devalidate) {
&Apache::lonnet::devalidatecourseresdata($crs,$dom);
}
}
+# Returns the username and domain from a key created in readdata from a resourcedata key.
+#
+# @param {string} $key - the key
+# @returns {Array}
sub extractuser {
my $key=shift;
return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./);
}
+# Parses a parameter key and returns the components.
+#
+# @param {string} $key -
+# @param {hash reference} $listdata -
+# @return {Array} - (student, resource, part, parameter)
sub parse_listdata_key {
my ($key,$listdata) = @_;
# split into student/section affected, and
@@ -3722,9 +4253,18 @@ sub parse_listdata_key {
return ($student,$res,$part,$parm);
}
-# Displays forms for the given data in overview mode (newoverview or overview).
+# Prints HTML with forms for the given parameter data in overview mode (newoverview or overview).
+#
+# @param {Apache2::RequestRec} $r - the Apache request
+# @param {hash reference} $resourcedata - parameter data returned by readdata
+# @param {hash reference} $listdata - data created in secgroup_lister, course id.[section id].part.name -> 1 or course id.[section id].part.name.type -> parameter type
+# @param {string} $sortorder - realmstudent|studentrealm
+# @param {string} $caller - name of the calling sub (overview|newoverview)
+# @param {hash reference} $classlist - from loncoursedata::get_classlist
+# @param {boolean} $readonly - true if editing not allowed
+# @returns{integer} - number of $listdata parameters processed
sub listdata {
- my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist)=@_;
+ my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly)=@_;
# Start list output
@@ -3742,11 +4282,11 @@ sub listdata {
if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
%grouphash = &Apache::longroup::coursegroups();
} elsif ($env{'request.course.groups'} ne '') {
- map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'});
+ map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});
}
}
- foreach my $thiskey (sort {
+ foreach my $key (sort {
my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
@@ -3786,17 +4326,17 @@ sub listdata {
$result;
- } keys(%{$listdata})) { # foreach my $thiskey
-
- my $readonly;
+ } keys(%{$listdata})) { # foreach my $key
+ my $thiskey = $key;
if ($$listdata{$thiskey.'.type'}) {
my $thistype=$$listdata{$thiskey.'.type'};
if ($$resourcedata{$thiskey.'.type'}) {
$thistype=$$resourcedata{$thiskey.'.type'};
}
my ($middle,$part,$name)=
- ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
+ ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/);
my $section=&mt('All Students');
+ my $showval = $$resourcedata{$thiskey};
if ($middle=~/^\[(.*)\]/) {
my $issection=$1;
if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
@@ -3829,12 +4369,37 @@ sub listdata {
$middle=~s/\.+$//;
$middle=~s/^\.+//;
my $realm=''.&mt('All Resources').' ';
- if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) {
- my $mapurl = $1;
- my $maplevel = $2;
+ my ($is_map,$is_recursive,$mapurl,$maplevel);
+ if ($caller eq 'overview') {
+ if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) {
+ $mapurl = $1;
+ $maplevel = $2;
+ $is_map = 1;
+ }
+ } elsif ($caller eq 'newoverview') {
+ if ($middle=~/^(.+)\_\_\_\((all)\)$/) {
+ $mapurl = $1;
+ $maplevel = $2;
+ $is_map = 1;
+ }
+ }
+ if ($is_map) {
my $leveltitle = &mt('Folder/Map');
- if ($maplevel eq 'rec') {
- $leveltitle = &mt('Recursive');
+ unless (($name eq 'hiddenresource') || ($name eq 'encrypturl')) {
+ if ($caller eq 'newoverview') {
+ my $altkey = $thiskey;
+ $altkey =~ s/\Q___(all)\E/___(rec)/;
+ if ((exists($$resourcedata{$altkey})) & (!exists($$resourcedata{$thiskey}))) {
+ $is_recursive = 1;
+ if ($$resourcedata{$altkey.'.type'}) {
+ $thistype=$$resourcedata{$altkey.'.type'};
+ }
+ $showval = $$resourcedata{$altkey};
+ }
+ } elsif (($caller eq 'overview') && ($maplevel eq 'rec')) {
+ $thiskey =~ s/\Q___(rec)\E/___(all)/;
+ $is_recursive = 1;
+ }
}
$realm=''.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' ('.$mapurl.') ';
} elsif ($middle) {
@@ -3876,7 +4441,7 @@ sub listdata {
# Ready to print
#
my $parmitem = &standard_parameter_names($name);
- $r->print(&tablestart($readonly).
+ $r->print(&tablestart($readonly,$is_map).
&Apache::loncommon::start_data_table_row().
''.&mt($parmitem).
' ');
@@ -3896,35 +4461,59 @@ sub listdata {
$r->print(
&Apache::lonhtmlcommon::date_setter('parmform',
$jskey,
- $$resourcedata{$thiskey},
+ $showval,
'',1,$state));
unless ($readonly) {
$r->print(
' '.
- (($$resourcedata{$thiskey}!=0)?''.
+ (($showval!=0)?''.
&mt('Shift all dates based on this date').' ':'').
- &date_sanity_info($$resourcedata{$thiskey})
+ &date_sanity_info($showval)
);
}
} elsif ($thistype eq 'date_interval') {
$r->print(&date_interval_selector($thiskey,$name,
- $$resourcedata{$thiskey},$readonly));
+ $showval,$readonly));
} elsif ($thistype =~ m/^string/) {
$r->print(&string_selector($thistype,$thiskey,
- $$resourcedata{$thiskey},$name,$readonly));
+ $showval,$name,$readonly));
} else {
- $r->print(&default_selector($thiskey,$$resourcedata{$thiskey},$readonly));
+ $r->print(&default_selector($thiskey,$showval,$readonly));
}
unless ($readonly) {
$r->print(' ');
}
- $r->print(''.&Apache::loncommon::end_data_table_row());
+ $r->print('');
+ if ($is_map) {
+ if (($name eq 'encrypturl') || ($name eq 'hiddenresource')) {
+ $r->print(' ');
+ } else {
+ my ($disabled,$recon,$recoff);
+ if ($readonly) {
+ $disabled = ' disabled="disabled"';
+ }
+ if ($is_recursive) {
+ $recon = ' checked="checked"';
+ } else {
+ $recoff = ' checked="checked"';
+ }
+ $r->print(' ');
+ }
+ }
+ $r->print(&Apache::loncommon::end_data_table_row());
}
}
return $foundkeys;
}
+# Returns a string representing the interval, directly using form data matching the given key.
+# The returned string may also include information related to proctored exams.
+# Format: seconds['_done'[':'done button title':']['_proctor'['_'proctor key]]]
+#
+# @param {string} $key - suffix for form fields related to the interval
+# @returns {string}
sub get_date_interval_from_form {
my ($key) = @_;
my $seconds = 0;
@@ -3957,6 +4546,12 @@ sub get_date_interval_from_form {
}
+# Returns HTML to enter a text value for a parameter.
+#
+# @param {string} $thiskey - parameter key
+# @param {string} $showval - the current value
+# @param {boolean} $readonly - true if the field should not be made editable
+# @returns {string}
sub default_selector {
my ($thiskey, $showval, $readonly) = @_;
my $disabled;
@@ -3966,6 +4561,12 @@ sub default_selector {
return ' ';
}
+# Returns HTML to enter allow/deny rules related to IP addresses.
+#
+# @param {string} $thiskey - parameter key
+# @param {string} $showval - the current value
+# @param {boolean} $readonly - true if the fields should not be made editable
+# @returns {string}
sub string_ip_selector {
my ($thiskey, $showval, $readonly) = @_;
my %access = (
@@ -3994,7 +4595,7 @@ sub string_ip_selector {
@{$access{'deny'}} = ('');
}
my ($disabled,$addmore);
- if ($disabled) {
+ if ($readonly) {
$disabled=' disabled="disabled"';
} else {
$addmore = "\n".''.&mt('Add more').' ';
@@ -4079,6 +4680,11 @@ my %stringtypes = (
acc => 'string_ip',
);
+# Returns the possible values and titles for a given string type, or undef if there are none.
+# Used by courseprefs.
+#
+# @param {string} $string_type - a parameter type for strings
+# @returns {array reference} - 2D array, containing values and English titles
sub standard_string_options {
my ($string_type) = @_;
if (ref($strings{$string_type}) eq 'ARRAY') {
@@ -4087,6 +4693,10 @@ sub standard_string_options {
return;
}
+# Returns regular expressions to match kinds of string types, or undef if there are none.
+#
+# @param {string} $string_type - a parameter type for strings
+# @returns {array reference} - 2D array, containing regular expression names and regular expressions
sub standard_string_matches {
my ($string_type) = @_;
if (ref($stringmatches{$string_type}) eq 'ARRAY') {
@@ -4095,6 +4705,10 @@ sub standard_string_matches {
return;
}
+# Returns a parameter type for a given parameter with a string type, or undef if not known.
+#
+# @param {string} $name - parameter name
+# @returns {string}
sub get_stringtype {
my ($name) = @_;
if (exists($stringtypes{$name})) {
@@ -4103,6 +4717,14 @@ sub get_stringtype {
return;
}
+# Returns HTML to edit a string parameter.
+#
+# @param {string} $thistype - parameter type
+# @param {string} $thiskey - parameter key
+# @param {string} $showval - parameter current value
+# @param {string} $name - parameter name
+# @param {boolean} $readonly - true if the values should not be made editable
+# @returns {string}
sub string_selector {
my ($thistype, $thiskey, $showval, $name, $readonly) = @_;
@@ -4268,6 +4890,10 @@ my %intervaltypes = (
interval => 'date_interval',
);
+# Returns regular expressions to match kinds of interval type, or undef if there are none.
+#
+# @param {string} $interval_type - a parameter type for intervals
+# @returns {array reference} - 2D array, containing regular expression names and regular expressions
sub standard_interval_matches {
my ($interval_type) = @_;
if (ref($intervalmatches{$interval_type}) eq 'ARRAY') {
@@ -4276,6 +4902,10 @@ sub standard_interval_matches {
return;
}
+# Returns a parameter type for a given parameter with an interval type, or undef if not known.
+#
+# @param {string} $name - parameter name
+# @returns {string}
sub get_intervaltype {
my ($name) = @_;
if (exists($intervaltypes{$name})) {
@@ -4284,6 +4914,11 @@ sub get_intervaltype {
return;
}
+# Returns the possible values and titles for a given interval type, or undef if there are none.
+# Used by courseprefs.
+#
+# @param {string} $interval_type - a parameter type for intervals
+# @returns {array reference} - 2D array, containing values and English titles
sub standard_interval_options {
my ($interval_type) = @_;
if (ref($intervals{$interval_type}) eq 'ARRAY') {
@@ -4292,6 +4927,13 @@ sub standard_interval_options {
return;
}
+# Returns HTML to edit a date interval parameter.
+#
+# @param {string} $thiskey - parameter key
+# @param {string} $name - parameter name
+# @param {string} $showval - parameter current value
+# @param {boolean} $readonly - true if the values should not be made editable
+# @returns {string}
sub date_interval_selector {
my ($thiskey, $name, $showval, $readonly) = @_;
my ($result,%skipval);
@@ -4374,17 +5016,21 @@ sub date_interval_selector {
$currprocdisplay = 'text';
}
my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';
+ my $disabled;
+ if ($readonly) {
+ $disabled = ' disabled="disabled"';
+ }
$result .= ''.&mt('Include "done" button').
- ' '.
+ ' '.
&mt('No').' '.(' 'x2).
- ' '.
+ ' '.
&mt('Yes').' '.(' 'x2).
- ' '.
+ ' '.
&mt('Yes, with proctor key').' '.
' &').'" /> '.
+ 'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'"'.$disabled.' /> '.
''.&mt('Button text').': '.
- ' &').'" /> ';
+ ' &').'"'.$disabled.' />';
}
}
unless ($readonly) {
@@ -4393,6 +5039,16 @@ sub date_interval_selector {
return $result;
}
+# Returns HTML with a warning if a parameter requires a more recent version of LON-CAPA.
+#
+# @param {string} $name - parameter name
+# @param {string} $namematch - parameter level name (recognized: resourcelevel|maplevel|maplevelrecurse|courselevel)
+# @param {string} $value - parameter value
+# @param {string} $chostname - course server name
+# @param {integer} $cmajor - major version number
+# @param {integer} $cminor - minor version number
+# @param {string} $needsrelease - release version needed (major.minor)
+# @returns {string}
sub oldversion_warning {
my ($name,$namematch,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
my $standard_name = &standard_parameter_names($name);
@@ -4468,10 +5124,11 @@ sub oldversion_warning {
} # end of block using some constants related to parameter types
-#
-# Shift all start and end dates by $shift
-#
+# Shifts all start and end dates in the current course by $shift.
+#
+# @param {integer} $shift - time to shift, in seconds
+# @returns {string} - error name or 'ok'
sub dateshift {
my ($shift)=@_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
@@ -4503,12 +5160,19 @@ sub dateshift {
return $reply;
}
+# Overview mode UI to edit course parameters.
+#
+# @param {Apache2::RequestRec} $r - the Apache request
sub newoverview {
- my ($r) = @_;
+ my ($r,$parm_permission) = @_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
+ my $readonly = 1;
+ if ($parm_permission->{'edit'}) {
+ undef($readonly);
+ }
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
text=>"Overview Mode"});
@@ -4611,7 +5275,7 @@ ENDOVER
$r->print('');
$r->print('
');
- &displaymenu($r,\%allparms,\@pscat,\%keyorder); # FIXME: wrong parameters, could make keysindisplayorderCategory crash because $keyorder is undefined
+ &displaymenu($r,\%allparms,\@pscat,\%keyorder);
$r->print(&Apache::lonhtmlcommon::start_pick_box());
$r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
my $sectionselector = §ionmenu(\@selected_sections);
@@ -4667,15 +5331,31 @@ ENDOVER
# List data
- &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview');
+ &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly);
+ }
+ $r->print(&tableend());
+ unless ($readonly) {
+ $r->print( ((($env{'form.store'}) || ($env{'form.dis'}))?'
':'') );
}
- $r->print(&tableend().
- ((($env{'form.store'}) || ($env{'form.dis'}))?'
':'').
- '');
+ $r->print('');
&endSettingsScreen($r);
$r->print(&Apache::loncommon::end_page());
}
+# Fills $listdata with parameter information.
+# Keys use the format course id.[section id].part.name and course id.[section id].part.name.type.
+# The non-type value is always 1.
+#
+# @param {string} $cat - parameter name
+# @param {string} $pschp - selected map pc, or 'all'
+# @param {string} $parmlev - selected level value (full|map|general), or ''
+# @param {hash reference} $listdata - the parameter data that will be modified
+# @param {array reference} $psprt - selected parts
+# @param {array reference} $selections - selected sections
+# @param {hash reference} $defkeytype - hash parameter name -> parameter type
+# @param {hash reference} $allmaps - hash map pc -> map src
+# @param {array reference} $ids - resource and map ids
+# @param {hash reference} $symbp - hash map pc or resource/map id -> map src.'___(all)' or resource symb
sub secgroup_lister {
my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
foreach my $item (@{$selections}) {
@@ -4696,9 +5376,6 @@ sub secgroup_lister {
my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
$$listdata{$newparmkey}=1;
$$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
- $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(rec).'.$part.'.'.$cat;
- $$listdata{$newparmkey}=1;
- $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
}
} else {
# resource-level parameter
@@ -4714,12 +5391,19 @@ sub secgroup_lister {
}
}
-# Display all existing parameter settings.
+# UI to edit parameter settings starting with a list of all existing parameters.
+# (called by setoverview action)
+#
+# @param {Apache2::RequestRec} $r - the Apache request
sub overview {
- my ($r) = @_;
+ my ($r,$parm_permission) = @_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
+ my $readonly = 1;
+ if ($parm_permission->{'edit'}) {
+ undef($readonly);
+ }
my $js = '