--- loncom/interface/lonparmset.pm 2022/01/03 20:09:40 1.522.2.28.4.1 +++ loncom/interface/lonparmset.pm 2016/03/15 14:25:26 1.558 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.522.2.28.4.1 2022/01/03 20:09:40 raeburn Exp $ +# $Id: lonparmset.pm,v 1.558 2016/03/15 14:25:26 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,8 +36,7 @@ lonparmset - Handler to set parameters f =head1 SYNOPSIS -lonparmset provides an interface to setting content parameters in a -course. +lonparmset provides an interface to setting course parameters. =head1 DESCRIPTION @@ -55,21 +54,25 @@ Inputs: $what - a parameter spec (inclu $id - a bighash Id number $def - the resource's default value 'stupid emacs -Returns: A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 14 possible levels +Returns: A list, the first item is the index into the remaining list of items of parm values that is the active one, the list consists of parm values at the 18 possible levels -14- General Course -13- Map or Folder level in course -12- resource default -11- map default -10- resource level in course -9 - General for section -8 - Map or Folder level for section -7 - resource level in section -6 - General for group -5 - Map or Folder level for group -4 - resource level in group -3 - General for specific student -2 - Map or Folder level for specific student +18 - General Course +17 - Map or Folder level in course (recursive) +16 - Map or Folder level in course (non-recursive) +15 - resource default +14 - map default +13 - resource level in course +12 - General for section +11 - Map or Folder level for section (recursive) +10 - Map or Folder level for section (non-recursive) +9 - resource level in section +8 - General for group +7 - Map or Folder level for group (recursive) +6 - Map or Folder level for group (non-recursive) +5 - resource level in group +4 - General for specific student +3 - Map or Folder level for specific student (recursive) +2 - Map or Folder level for specific student (non-recursive) 1 - resource level for specific student =item parmval_by_symb() @@ -130,7 +133,7 @@ javascript function 'pjump'. =item print_td() -=item check_other_groups() +=item print_usergroups() =item parm_control_group() @@ -150,7 +153,7 @@ Input: See list below =back -Outputs: See list below +Outputs: See list below: =over 4 @@ -324,6 +327,31 @@ use HTML::Entities; use LONCAPA qw(:DEFAULT :match); +sub startSettingsScreen { + my ($r,$mode,$crstype)=@_; + + my $tabtext = &mt('Course Settings'); + if ($crstype eq 'Community') { + $tabtext = &mt('Community Settings'); + } + $r->print("\n".''."\n"); + $r->print('
'); +} + +sub endSettingsScreen { + my ($r)=@_; + $r->print('
'); +} + + + sub parmval { my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_; return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec, @@ -345,84 +373,106 @@ sub parmval_by_symb { $map = &Apache::lonnet::deversion($map); my $symbparm=$symb.'.'.$what; + my $recurseparm=$map.'___(rec).'.$what; my $mapparm=$map.'___(all).'.$what; my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what; my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm; + my $grpleveli=$env{'request.course.id'}.'.['.$cgroup.'].'.$recurseparm; my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm; my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what; my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm; + my $secleveli=$env{'request.course.id'}.'.['.$csec.'].'.$recurseparm; my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm; my $courselevel=$env{'request.course.id'}.'.'.$what; my $courselevelr=$env{'request.course.id'}.'.'.$symbparm; + my $courseleveli=$env{'request.course.id'}.'.'.$recurseparm; my $courselevelm=$env{'request.course.id'}.'.'.$mapparm; # --------------------------------------------------------- first, check course if (defined($$courseopt{$courselevel})) { - $outpar[14]=$$courseopt{$courselevel}; - $result=14; + $outpar[18]=$$courseopt{$courselevel}; + $result=18; + } + + if (defined($$courseopt{$courseleveli})) { + $outpar[17]=$$courseopt{$courseleveli}; + $result=17; } if (defined($$courseopt{$courselevelm})) { - $outpar[13]=$$courseopt{$courselevelm}; - $result=13; + $outpar[16]=$$courseopt{$courselevelm}; + $result=16; } # ------------------------------------------------------- second, check default - if (defined($def)) { $outpar[12]=$def; $result=12; } + if (defined($def)) { $outpar[15]=$def; $result=15; } # ------------------------------------------------------ third, check map parms + my $thisparm=&parmhash($symbparm); - if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; } + if (defined($thisparm)) { $outpar[14]=$thisparm; $result=14; } if (defined($$courseopt{$courselevelr})) { - $outpar[10]=$$courseopt{$courselevelr}; - $result=10; + $outpar[13]=$$courseopt{$courselevelr}; + $result=13; } # ------------------------------------------------------ fourth, back to course if ($csec ne '') { if (defined($$courseopt{$seclevel})) { - $outpar[9]=$$courseopt{$seclevel}; - $result=9; - } + $outpar[12]=$$courseopt{$seclevel}; + $result=12; + } + if (defined($$courseopt{$secleveli})) { + $outpar[11]=$$courseopt{$secleveli}; + $result=11; + } if (defined($$courseopt{$seclevelm})) { - $outpar[8]=$$courseopt{$seclevelm}; - $result=8; - } - + $outpar[10]=$$courseopt{$seclevelm}; + $result=10; + } if (defined($$courseopt{$seclevelr})) { - $outpar[7]=$$courseopt{$seclevelr}; - $result=7; - } + $outpar[9]=$$courseopt{$seclevelr}; + $result=9; + } } # ------------------------------------------------------ fifth, check course group if ($cgroup ne '') { if (defined($$courseopt{$grplevel})) { - $outpar[6]=$$courseopt{$grplevel}; - $result=6; + $outpar[8]=$$courseopt{$grplevel}; + $result=8; + } + if (defined($$courseopt{$grpleveli})) { + $outpar[7]=$$courseopt{$grpleveli}; + $result=7; } if (defined($$courseopt{$grplevelm})) { - $outpar[5]=$$courseopt{$grplevelm}; - $result=5; + $outpar[6]=$$courseopt{$grplevelm}; + $result=6; } if (defined($$courseopt{$grplevelr})) { - $outpar[4]=$$courseopt{$grplevelr}; - $result=4; + $outpar[5]=$$courseopt{$grplevelr}; + $result=5; } } -# ---------------------------------------------------------- fifth, check user +# ---------------------------------------------------------- sixth, check user if ($uname ne '') { if (defined($$useropt{$courselevel})) { - $outpar[3]=$$useropt{$courselevel}; + $outpar[4]=$$useropt{$courselevel}; + $result=4; + } + + if (defined($$useropt{$courseleveli})) { + $outpar[3]=$$useropt{$courseleveli}; $result=3; } @@ -662,30 +712,37 @@ sub storeparm_by_symb_inner { $map = &Apache::lonnet::deversion($map); my $symbparm=$symb.'.'.$spnam; + my $recurseparm=$map.'___(rec).'.$spnam; my $mapparm=$map.'___(all).'.$spnam; my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam; my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm; + my $grpleveli=$env{'request.course.id'}.'.['.$cgroup.'].'.$recurseparm; my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm; my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam; my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm; + my $secleveli=$env{'request.course.id'}.'.['.$csec.'].'.$recurseparm; my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm; my $courselevel=$env{'request.course.id'}.'.'.$spnam; my $courselevelr=$env{'request.course.id'}.'.'.$symbparm; + my $courseleveli=$env{'request.course.id'}.'.'.$recurseparm; my $courselevelm=$env{'request.course.id'}.'.'.$mapparm; my $storeunder=''; - if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; } - if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; } - if (($snum==10) || ($snum==1)) { $storeunder=$courselevelr; } - if ($snum==9) { $storeunder=$seclevel; } - if ($snum==8) { $storeunder=$seclevelm; } - if ($snum==7) { $storeunder=$seclevelr; } - if ($snum==6) { $storeunder=$grplevel; } - if ($snum==5) { $storeunder=$grplevelm; } - if ($snum==4) { $storeunder=$grplevelr; } + if (($snum==18) || ($snum==4)) { $storeunder=$courselevel; } + if (($snum==17) || ($snum==3)) { $storeunder=$courseleveli; } + if (($snum==16) || ($snum==2)) { $storeunder=$courselevelm; } + if (($snum==13) || ($snum==1)) { $storeunder=$courselevelr; } + if ($snum==12) { $storeunder=$seclevel; } + if ($snum==11) { $storeunder=$secleveli; } + if ($snum==10) { $storeunder=$seclevelm; } + if ($snum==9) { $storeunder=$seclevelr; } + if ($snum==8) { $storeunder=$grplevel; } + if ($snum==7) { $storeunder=$grpleveli; } + if ($snum==6) { $storeunder=$grplevelm; } + if ($snum==5) { $storeunder=$grplevelr; } my $delete; @@ -693,16 +750,16 @@ sub storeparm_by_symb_inner { my %storecontent = ($storeunder => $nval, $storeunder.'.type' => $ntype); my $reply=''; - if ($snum>3) { + if ($snum>4) { # ---------------------------------------------------------------- Store Course # my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; # Expire sheets &Apache::lonnet::expirespread('','','studentcalc'); - if (($snum==10) || ($snum==7) || ($snum==4)) { + if (($snum==13) || ($snum==9) || ($snum==5)) { &Apache::lonnet::expirespread('','','assesscalc',$symb); - } elsif (($snum==11) || ($snum==8) || ($snum==5)) { + } elsif (($snum==14) || ($snum==10) || ($snum==6)) { &Apache::lonnet::expirespread('','','assesscalc',$map); } else { &Apache::lonnet::expirespread('','','assesscalc'); @@ -753,7 +810,7 @@ sub storeparm_by_symb_inner { sub valout { - my ($value,$type,$editable)=@_; + my ($value,$type,$name,$editable)=@_; my $result = ''; # Values of zero are valid. if (! $value && $value ne '0') { @@ -767,16 +824,7 @@ sub valout { } } else { if ($type eq 'date_interval') { - my ($totalsecs,$donesuffix) = split(/_/,$value,2); - my ($usesdone,$donebuttontext,$proctor,$secretkey); - if ($donesuffix =~ /^done\:([^\:]+)\:(.*)$/) { - $donebuttontext = $1; - (undef,$proctor,$secretkey) = split(/_/,$2); - $usesdone = 'done'; - } elsif ($donesuffix =~ /^done(|_.+)$/) { - $donebuttontext = &mt('Done'); - ($usesdone,$proctor,$secretkey) = split(/_/,$donesuffix); - } + my ($totalsecs,$donebutton,$proctor,$secretkey) = split(/_/,$value); my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs); my @timer; $year=$year-70; @@ -810,12 +858,12 @@ sub valout { push(@timer,&mt('[quant,_1,sec]',0)); } $result.=join(", ",@timer); - if ($usesdone eq 'done') { + if ($donebutton eq 'done') { if ($secretkey) { - $result .= ' '.&mt('+ "[_1]" with proctor key: [_2]',$donebuttontext,$secretkey); + $result .= ' '.&mt('+ "done" with proctor key: [_1]',$secretkey); } else { - $result .= ' + "'.$donebuttontext.'"'; - } + $result .= ' '.&mt('+ "done"'); + } } } elsif (&isdateparm($type)) { $result = &Apache::lonlocal::locallocaltime($value). @@ -831,15 +879,11 @@ sub valout { sub plink { - my ($type,$dis,$value,$marker,$return,$call,$extra)=@_; + my ($type,$dis,$value,$marker,$return,$call)=@_; my $winvalue=$value; unless ($winvalue) { - if ((&isdateparm($type)) || (&is_specialstring($type))) { + if (&isdateparm($type)) { $winvalue=$env{'form.recent_'.$type}; - } elsif ($type eq 'string_yesno') { - if ($env{'form.recent_string'} =~ /^(yes|no)$/i) { - $winvalue=$env{'form.recent_string'}; - } } else { $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]}; } @@ -847,16 +891,16 @@ sub plink { my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/); my ($hour,$min,$sec,$val)=&preset_defaults($parmname); unless (defined($winvalue)) { $winvalue=$val; } - my $valout = &valout($value,$type,1); + my $valout = &valout($value,$type,$parmname,1); my $unencmarker = $marker; foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call, - \$hour, \$min, \$sec, \$extra) { + \$hour, \$min, \$sec) { $$item = &HTML::Entities::encode($$item,'"<>&'); $$item =~ s/\'/\\\'/g; } return '
'. ''. + .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'. $valout.'
'; } @@ -872,22 +916,20 @@ sub page_js { $pjump_def function psub() { - var specstring = /^string_!(yesno|any)/i; if (document.parmform.pres_marker.value!='') { document.parmform.action+='#'+document.parmform.pres_marker.value; var typedef=new Array(); typedef=document.parmform.pres_type.value.split('_'); - if (document.parmform.pres_type.value!='') { - if ((typedef[0]=='date') || - (specstring.test(document.parmform.pres_type.value))) { - eval('document.parmform.recent_'+ - document.parmform.pres_type.value+ - '.value=document.parmform.pres_value.value;'); - } else { - eval('document.parmform.recent_'+typedef[0]+ - '.value=document.parmform.pres_value.value;'); - } + if (document.parmform.pres_type.value!='') { + if (typedef[0]=='date') { + eval('document.parmform.recent_'+ + document.parmform.pres_type.value+ + '.value=document.parmform.pres_value.value;'); + } else { + eval('document.parmform.recent_'+typedef[0]+ + '.value=document.parmform.pres_value.value;'); } + } document.parmform.submit(); } else { document.parmform.pres_value.value=''; @@ -902,7 +944,9 @@ sub page_js { var newWin = window.open(url, wdwName, options); newWin.focus(); } + // ]]> + $selscript ENDJS @@ -929,28 +973,104 @@ function showHide_courseContent() { COURSECONTENTSCRIPT } +sub toggleparmtextbox_js { + return <<"ENDSCRIPT"; + +if (!document.getElementsByClassName) { + function getElementsByClassName(node, classname) { + var a = []; + var re = new RegExp('(^| )'+classname+'( |$)'); + var els = node.getElementsByTagName("*"); + for(var i=0,j=els.length; i 0) { - var possdeeplink = document.parmform.elements[i].options[idx].value - possdeeplink = possdeeplink.replace(/^\s+|\s+$/g,''); - if (document.parmform.elements['set_'+identifier].value) { - possdeeplink = ','+possdeeplink; - } - document.parmform.elements['set_'+identifier].value += possdeeplink; - } - } else if (dlLinkProtectRegExp.test(name)) { - if (document.parmform.elements[i].checked) { - var identifier = name.replace(dlLinkProtectRegExp,''); - var posslinkurl = document.parmform.elements[i].value; - posslinkurl = posslinkurl.replace(/^\s+|\s+$/g,''); - if (document.parmform.elements['set_'+identifier].value) { - posslinkurl = ','+posslinkurl; - } - document.parmform.elements['set_'+identifier].value += posslinkurl; - } - } else if (dlLtidRegExp.test(name)) { - var identifier = name.replace(dlLtidRegExp,''); - if (isRadioSet('deeplink_protect_'+identifier,'ltid')) { - var possltid = document.parmform.elements[i].value; - possltid = possltid.replace(/\D+/g,''); - if (possltid.length) { - if (document.parmform.elements['set_'+identifier].value) { - possltid = ':'+possltid; - } - document.parmform.elements['set_'+identifier].value += possltid; - } else { - document.parmform.elements['set_'+identifier].value = ''; - alert("A link type of 'domain LTI launch' was selected but no domain LTI launcher was selected.\nPlease select one, or choose a different supported link type."); - return false; - } + document.parmform.elements['set_'+identifier].value += possallow; } - } else if (dlLticRegExp.test(name)) { - var identifier = name.replace(dlLticRegExp,''); - if (isRadioSet('deeplink_protect_'+identifier,'ltic')) { - var possltic = document.parmform.elements[i].value; - possltic = possltic.replace(/\D+/g,''); - if (possltic.length) { - if (document.parmform.elements['set_'+identifier].value) { - possltic = ':'+possltic; - } - document.parmform.elements['set_'+identifier].value += possltic; - } else { - document.parmform.elements['set_'+identifier].value = ''; - alert("A link type of 'course LTI launch' was selected but no course LTI launcher was selected.\nPlease select one, or choose a different supported link type."); - return false; - } - } - } else if (dlKeyRegExp.test(name)) { - var identifier = name.replace(dlKeyRegExp,''); - if (isRadioSet('deeplink_protect_'+identifier,'key')) { - var posskey = document.parmform.elements[i].value; - posskey = posskey.replace(/^\s+|\s+$/g,''); - var origlength = posskey.length; - posskey = posskey.replace(/[^a-zA-Z\d_.!@#$%^&*()+=-]/g,''); - var newlength = posskey.length; - if (newlength > 0) { - var change = origlength - newlength; - if (change) { - alert(change+' disallowed character(s) removed from deeplink key'); - } - if (document.parmform.elements['set_'+identifier].value) { - posskey = ':'+posskey; - } - document.parmform.elements['set_'+identifier].value += posskey; - } else { - document.parmform.elements['set_'+identifier].value = ''; - if (newlength < origlength) { - alert("A link type of 'deep with key' was selected but the key value was blank, after removing disallowed characters.\nPlease enter a key using one or more of: a-zA-Z0-9_.!@#$%^&*()+=-"); - } else { - alert("A link type of 'deep with key' was selected but the key value was blank.\nPlease enter a key."); - } - return false; - } - } - } else if (dlMenusRegExp.test(name)) { - if (document.parmform.elements[i].checked) { - var identifier = name.replace(dlMenusRegExp,''); - var posslinkmenu = document.parmform.elements[i].value; - posslinkmenu = posslinkmenu.replace(/^\s+|\s+$/g,''); - if (posslinkmenu == 'std') { - posslinkmenu = '0'; + } else { + if (ipdenyRegExp.test(name)) { + var identifier = name.replace(ipdenyRegExp,''); + var possdeny = document.parmform.elements[i].value; + possdeny = possdeny.replace(/^\s+|\s+$/g,''); + if (patternIP.test(possdeny)) { + possdeny = '!'+possdeny; if (document.parmform.elements['set_'+identifier].value) { - posslinkmenu = ','+posslinkmenu; + possdeny = ','+possdeny; } - document.parmform.elements['set_'+identifier].value += posslinkmenu; - } - } - } else if (dlCollsRegExp.test(name)) { - var identifier = name.replace(dlCollsRegExp,''); - if (isRadioSet('deeplink_menus_'+identifier,'colls')) { - var posslinkmenu = document.parmform.elements[i].value; - if (document.parmform.elements['set_'+identifier].value) { - posslinkmenu = ','+posslinkmenu; + document.parmform.elements['set_'+identifier].value += possdeny; } - document.parmform.elements['set_'+identifier].value += posslinkmenu; } } } @@ -1083,27 +1102,9 @@ function validateParms() { return true; } -function isRadioSet(name,expected) { - var menuitems = document.getElementsByName(name); - var radioLength = menuitems.length; - result = false; - if (radioLength > 1) { - for (var j=0; j "group_or_section('cgroup')", @@ -1244,13 +1182,14 @@ sub startpage { '; my $start_page = - &Apache::loncommon::start_page('Set/Modify Course Parameters',$js, - {'add_entries' => \%loaditems,}); + &Apache::loncommon::start_page('Set/Modify Course Parameters',$js, + {'add_entries' => \%loaditems,}); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode'); my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'}); my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'}); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); $r->print(< @@ -1265,11 +1204,11 @@ ENDHEAD sub print_row { my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone, - $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp, - $readonly)=@_; + $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp)=@_; 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); + # get the values for the parameter in cascading order # empty levels will remain empty my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which}, @@ -1281,7 +1220,7 @@ sub print_row { $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt); # cascade down manually my $cascadetype=$$defaulttype{$which}; - for (my $i=14;$i>0;$i--) { + for (my $i=18;$i>0;$i--) { if ($typeoutpar[$i]) { $cascadetype=$typeoutpar[$i]; } else { @@ -1305,89 +1244,41 @@ sub print_row { my $thismarker=$which; $thismarker=~s/^parameter\_//; my $mprefix=$rid.'&'.$thismarker.'&'; - my ($parmname)=($thismarker=~/\_([^\_]+)$/); - my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]); - my ($othergrp,$grp_parm,$controlgrp,$extra); + my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker); + my ($othergrp,$grp_parm,$controlgrp); - if ($parmname eq 'deeplink') { - my ($domltistr,$crsltistr); - my %lti = - &Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'}, - 'provider'); - if (keys(%lti)) { - foreach my $item (sort { $a <=> $b } (keys(%lti))) { - if (ref($lti{$item}) eq 'HASH') { - unless ($lti{$item}{'requser'}) { - $domltistr .= $item.':'.&escape(&escape($lti{$item}{'consumer'})).','; - } - } - } - $domltistr =~ s/,$//; - if ($domltistr) { - $extra = 'ltid_'.$domltistr; - } - } - my %courselti = &Apache::lonnet::get_course_lti($cnum,$cdom); - if (keys(%courselti)) { - foreach my $item (sort { $a <=> $b } keys(%courselti)) { - if (($item =~ /^\d+$/) && (ref($courselti{$item}) eq 'HASH')) { - $crsltistr .= $item.':'.&escape(&escape($courselti{$item}{'name'})).','; - } - } - $crsltistr =~ s/,$//; - if ($crsltistr) { - if ($extra) { - $extra .= '&'; - } - $extra .= 'ltic_'.$crsltistr; - } - } - if ($env{'course.'.$env{'request.course.id'}.'.menucollections'}) { - my @colls; - foreach my $item (split(/;/,$env{'course.'.$env{'request.course.id'}.'.menucollections'})) { - my ($num,$value) = split(/\%/,$item); - if ($num =~ /^\d+$/) { - push(@colls,$num); - } - } - if (@colls) { - if ($extra) { - $extra .= '&'; - } - $extra .= 'menus_'.join(',',@colls); - } - } - } if ($parmlev eq 'general') { - if ($uname) { - &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); + &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } elsif ($cgroup) { - &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra); + &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); } elsif ($csec) { - &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); + &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } else { - &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); + &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } } elsif ($parmlev eq 'map') { - if ($uname) { - &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); + &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } elsif ($cgroup) { - &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra); + &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); + &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); } elsif ($csec) { - &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); + &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } else { - &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); + &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } } else { if ($uname) { if (@{$usersgroups} > 1) { my ($coursereply,$grp_parm,$controlgrp); ($coursereply,$othergrp,$grp_parm,$controlgrp) = - &check_other_groups($$part{$which}.'.'.$$name{$which}, + &print_usergroups($r,$$part{$which}.'.'.$$name{$which}, $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt); - if ($coursereply && $result > 3) { + if ($coursereply && $result > 4) { if (defined($controlgrp)) { if ($cgroup ne $controlgrp) { $effective_parm = $grp_parm; @@ -1398,33 +1289,36 @@ sub print_row { } } - &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - - &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - - if ($csec) { - &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - } + &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); + + 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); + } if ($cgroup) { - &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra); - &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra); - &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra); + &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); } - if ($uname) { + if ($uname) { if ($othergrp) { $r->print($othergrp); } - &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra); - } + &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); + } } # end of $parmlev if/else $r->print(''.$effective_parm.''); @@ -1435,7 +1329,7 @@ sub print_row { my $sessionvaltype=$typeoutpar[$result]; if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; } $r->print(''. - &valout($sessionval,$sessionvaltype).' '. + &valout($sessionval,$sessionvaltype,$$name{$which}).' '. ''); } $r->print(''); @@ -1443,57 +1337,57 @@ sub print_row { } sub print_td { - my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp,$readonly,$extra)=@_; + my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_; $r->print(''); my $nolink = 0; - if ($readonly) { + if ($which == 14 || $which == 15) { $nolink = 1; - } else { - if ($which == 11 || $which == 12) { + } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) { + $nolink = 1; + } elsif ($which == 5 || $which == 6 || $which == 7 || $which == 8) { + if ($noeditgrp) { $nolink = 1; - } elsif (($env{'request.course.sec'} ne '') && ($which > 9)) { + } + } elsif ($mprefix =~ /availablestudent\&$/) { + if ($which > 4) { $nolink = 1; - } elsif ($which == 4 || $which == 5 || $which == 6) { - if ($noeditgrp) { - $nolink = 1; - } - } elsif ($mprefix =~ /availablestudent\&$/) { + } + } elsif ($mprefix =~ /examcode\&$/) { + unless ($which == 2) { $nolink = 1; - } elsif ($mprefix =~ /examcode\&$/) { - unless ($which == 2) { - $nolink = 1; - } } } if ($nolink) { - $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); + $r->print(&valout($$outpar[$which],$$typeoutpar[$which],$mprefix)); } else { $r->print(&plink($$typeoutpar[$which], $$display{$value},$$outpar[$which], - $mprefix."$which",'parmform.pres','psub',$extra)); + $mprefix."$which",'parmform.pres','psub')); } $r->print(''."\n"); } -sub check_other_groups { - my ($what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_; +sub print_usergroups { + my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_; my $courseid = $env{'request.course.id'}; my $output; my $symb = &symbcache($rid); my $symbparm=$symb.'.'.$what; my $map=(&Apache::lonnet::decode_symb($symb))[0]; + my $recurseparm=$map.'___(rec).'.$what; my $mapparm=$map.'___(all).'.$what; my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) = - &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,$what, - $courseopt); + &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm, + $recurseparm,$what,$courseopt); my $bgcolor = $defbg; my $grp_parm; if (($coursereply) && ($cgroup ne $resultgroup)) { if ($result > 3) { $bgcolor = '#AAFFAA'; + $grp_parm = &valout($coursereply,$resulttype,$what); } - $grp_parm = &valout($coursereply,$resulttype); + $grp_parm = &valout($coursereply,$resulttype,$what); $output = ''; if ($resultgroup && $resultlevel) { $output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm; @@ -1508,11 +1402,11 @@ sub check_other_groups { } sub parm_control_group { - my ($courseid,$usersgroups,$symbparm,$mapparm,$what,$courseopt) = @_; + my ($courseid,$usersgroups,$symbparm,$mapparm,$recurseparm,$what,$courseopt) = @_; my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype); my $grpfound = 0; - my @levels = ($symbparm,$mapparm,$what); - my @levelnames = ('resource','map/folder','general'); + my @levels = ($symbparm,$mapparm,$recurseparm,$what); + my @levelnames = ('resource','map/folder','recursive','general'); foreach my $group (@{$usersgroups}) { if ($grpfound) { last; } for (my $i=0; $i<@levels; $i++) { @@ -1622,7 +1516,9 @@ sub extractResourceInformation { $$maptitles{$mapid}=&Apache::lonnet::gettitle($$mapp{$id}); } $$maptitles{$$mapp{$id}}=$$maptitles{$mapid}; - $$symbp{$mapid}=$$mapp{$id}.'___(all)'; + $$symbp{$mapid}=$$mapp{$id}.'___(all)'; # Added in rev. 1.57, but seems not to be used. + # Lines 1038 and 1114 which use $symbp{$mapid} + # are commented out in rev. 1.57 } else { $$mapp{$id} = $$mapp{$mapid}; } @@ -1637,21 +1533,14 @@ sub isdateparm { return (($type=~/^date/) && (!($type eq 'date_interval'))); } -# Determine if parameter type is specialized string type (i.e., -# not just string or string_yesno. - -sub is_specialstring { - my $type=shift; - return (($type=~/^string_/) && ($type ne 'string_yesno')); -} - # # parmmenu displays a list of the selected parameters. # It also offers a link to show/hide the complete parameter list # from which you can select all desired parameters. # sub parmmenu { - my ($r)=@_; + my ($r,$allparms,$pscat,$keyorder)=@_; + my $tempkey; $r->print(< // print('
'); - &shortCuts($r); + &shortCuts($r,$allparms,$pscat,$keyorder); $r->print('
'); } # return a hash @@ -1779,7 +1668,6 @@ sub lookUpTableParameter { 'buttonshide' => 'hiding', 'turnoffeditor' => 'hiding', 'encrypturl' => 'hiding', - 'deeplink' => 'hiding', 'randomorder' => 'high_level_randomization', 'randompick' => 'high_level_randomization', 'available' => 'slots', @@ -1795,8 +1683,8 @@ sub lookUpTableParameter { 'lenient' => 'grading', 'retrypartial' => 'tries', 'discussvote' => 'misc', - 'examcode' => 'high_level_randomization', - ); + 'examcode' => 'high_level_randomization', + ); } sub whatIsMyCategory { @@ -1847,9 +1735,7 @@ sub category_order { sub parmboxes { my ($r,$allparms,$pscat,$keyorder)=@_; - my $tempkey; - my $tempparameter; - my %categories = &categories; + my %categories = &categories(); my %category_order = &category_order(); my %categoryList = ( 'time_settings' => [], @@ -1864,41 +1750,35 @@ sub parmboxes { 'misc' => [], ); - foreach $tempparameter (keys %$allparms) { + foreach my $tempparameter (keys(%$allparms)) { &whatIsMyCategory($tempparameter, \%categoryList); } #part to print the parm-list - $r->print('
'."\n"); - - #Print parameters - for my $key (sort { $category_order{$a} <=> $category_order{$b} } keys %categoryList) { - next if(@{$categoryList{$key}} == 0); + foreach my $key (sort { $category_order{$a} <=> $category_order{$b} } keys(%categoryList)) { + next if (@{$categoryList{$key}} == 0); + next if ($key eq ''); $r->print('
' - .'

' - .&mt($categories{$key}) - .'

'."\n"); - foreach $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) { - next if ($tempkey eq ''); + .'

'.&mt($categories{$key}).'

'."\n"); + foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) { $r->print('' .'
'."\n"); } - $r->print("
\n"); + $r->print('
'); } - - $r->print("\n"); + $r->print("\n"); } # # This function offers some links on the parameter section to get with one click a group a parameters # sub shortCuts { - my ($r)=@_; + my ($r,$allparms,$pscat,$keyorder)=@_; # Parameter Selection $r->print( @@ -1959,37 +1839,9 @@ sub partmenu { sub usermenu { my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups,$pssymb)=@_; my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '. - &Apache::loncommon::selectstudent_link('parmform','uname','udom','condition'). - &Apache::lonhtmlcommon::scripttag(<'. - $stuonly.'  '. - ''; my $sections=''; my %sectionhash = &Apache::loncommon::get_sections(); @@ -1998,7 +1850,7 @@ ENDJS 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=''; @@ -2016,7 +1868,7 @@ ENDJS $sections .= qq| onchange="group_or_section('csec')" |; } $sections .= '>'; - foreach my $section ('',sort keys %sectionhash) { + foreach my $section ('',sort(keys(%sectionhash))) { $sections.=''; @@ -2043,7 +1895,7 @@ function group_or_section(caller) { // ]]> |; - } elsif ($currsec eq '') { + } else { $sections .= qq| '; + my $start_page = &Apache::loncommon::start_page('Set Parameters',$js, {'add_entries' => \%loaditems,}); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); $r->print(< +
ENDOVER my @ids=(); my %typep=(); @@ -4457,7 +4229,7 @@ ENDOVER my $pschp=$env{'form.pschp'}; my @psprt=&Apache::loncommon::get_env_multiple('form.psprt'); - if (!@psprt) { $psprt[0]='0'; } + if (!@psprt) { $psprt[0]='all'; } my @selected_sections = &Apache::loncommon::get_env_multiple('form.Section'); @@ -4522,7 +4294,7 @@ ENDOVER $r->print(''); &partmenu($r,\%allparts,\@psprt); $r->print(''); - if ($sectionselector) { + if ($sectionselector) { $r->print(''.$sectionselector.''); } if ($groupselector) { @@ -4562,13 +4334,12 @@ ENDOVER # List data - &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly); + &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview'); } - $r->print(&tableend()); - unless ($readonly) { - $r->print(((($env{'form.store'}) || ($env{'form.dis'}))?'

':'')); - } - $r->print('
'); + $r->print(&tableend(). + ((($env{'form.store'}) || ($env{'form.dis'}))?'

':''). + ''); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -4587,11 +4358,14 @@ sub secgroup_lister { $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat}; } elsif ($parmlev eq 'map') { # map-level parameter - foreach my $mapid (keys %{$allmaps}) { + foreach my $mapid (keys(%{$allmaps})) { if (($pschp ne 'all') && ($pschp ne $mapid)) { next; } 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 @@ -4608,31 +4382,33 @@ sub secgroup_lister { } sub overview { - my ($r,$parm_permission) = @_; + my ($r) = @_; 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 $js = ''."\n"; - my $readonly = 1; - if ($parm_permission->{'edit'}) { - undef($readonly); - } &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview', text=>"Overview Mode"}); - my $start_page=&Apache::loncommon::start_page('Modify Parameters',$js); + my %loaditems = ( + 'onload' => "showHideLenient();", + ); + + my $start_page=&Apache::loncommon::start_page('Modify Parameters',$js,{'add_entries' => \%loaditems,}); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print($start_page.$breadcrumbs); - $r->print('
'); + &startSettingsScreen($r,'parmset',$crstype); + $r->print(''); # Store modified - unless ($readonly) { - &storedata($r,$crs,$dom); - } + + &storedata($r,$crs,$dom); # Read modified data @@ -4643,26 +4419,12 @@ sub overview { unless ($sortorder) { $sortorder='realmstudent'; } &sortmenu($r,$sortorder); - my $submitbutton = ''; - - if ($readonly) { - $r->print('

'.$submitbutton.'

'); - } - - # List data - my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist,$readonly); - - $r->print(&tableend().'

'); - if ($foundkeys) { - unless ($readonly) { - $r->print('

'.$submitbutton.'

'); - } - } else { - $r->print('

'.&mt('There are no parameters.').'

'); - } - $r->print('
'.&Apache::loncommon::end_page()); + my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist); + $r->print(&tableend().'

'. + ($foundkeys?'':''.&mt('There are no parameters.').'').'

'. + &Apache::loncommon::end_page()); } sub clean_parameters { @@ -4724,8 +4486,10 @@ ENDOVER $r->print(&mt('All users')); } elsif ($data{'scope_type'} eq 'user') { $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}}))); - } elsif ($data{'scope_type'} eq 'secgroup') { - $r->print(&mt('Group/Section: [_1]',$data{'scope'})); + } elsif ($data{'scope_type'} eq 'section') { + $r->print(&mt('Section: [_1]',$data{'scope'})); + } elsif ($data{'scope_type'} eq 'group') { + $r->print(&mt('Group: [_1]',$data{'scope'})); } $r->print('
'); if ($data{'realm_type'} eq 'all') { @@ -4736,8 +4500,8 @@ ENDOVER my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'}); $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]', - $url.'
   ', - $resid.'
   ',$map)); + $url.'
   ', + $resid.'
   ',$map)); } $r->print('
   '.&mt('Part: [_1]',$data{'parameter_part'})); $r->print(''); @@ -4747,6 +4511,7 @@ ENDOVER $r->print(&Apache::loncommon::end_data_table().'

'. ''. '

'); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -4754,24 +4519,14 @@ sub date_shift_one { my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $sec = $env{'request.course.sec'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; + &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'}, text=>"Shifting Dates"}); - my $submit_text = &mt('Shift all dates accordingly'); - if ($sec ne '') { - my @groups; - if ($env{'request.course.groups'} ne '') { - @groups = split(/:/,$env{'request.course.groups'}); - } - if (@groups) { - $submit_text = &mt("Shift dates set just for your section/group(s), accordingly"); - } else { - $submit_text = &mt("Shift dates set just for your section, accordingly"); - } - } my $start_page=&Apache::loncommon::start_page('Shift Dates'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift'); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); $r->print('
'. ''. @@ -4783,7 +4538,8 @@ sub date_shift_one { '
'.&mt('Currently set date:').''. &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'
'. ''. ''. - '
'); + ''); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -4791,57 +4547,26 @@ sub date_shift_two { my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $sec = $env{'request.course.sec'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'}, text=>"Shifting Dates"}); my $start_page=&Apache::loncommon::start_page('Shift Dates'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift'); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted'); - $r->print('

'.&mt('Shift Dates').'

'); - if ($sec ne '') { - my @groups; - if ($env{'request.course.groups'} ne '') { - @groups = split(/:/,$env{'request.course.groups'}); - } - if (@groups) { - $r->print('

'. - &mt("Shift dates set just for your section/group(s), such that [_1] becomes [_2]", - &Apache::lonlocal::locallocaltime($env{'form.timebase'}), - &Apache::lonlocal::locallocaltime($timeshifted)). - '

'); - } else { - $r->print('

'. - &mt("Shift dates set just for your section, such that [_1] becomes [_2]", - &Apache::lonlocal::locallocaltime($env{'form.timebase'}), - &Apache::lonlocal::locallocaltime($timeshifted)). - '

'); - } - } else { - $r->print('

'.&mt('Shifting all dates such that [_1] becomes [_2]', - &Apache::lonlocal::locallocaltime($env{'form.timebase'}), - &Apache::lonlocal::locallocaltime($timeshifted)). - '

'); - } + $r->print('

'.&mt('Shift Dates').'

'. + '

'.&mt('Shifting all dates such that [_1] becomes [_2]', + &Apache::lonlocal::locallocaltime($env{'form.timebase'}), + &Apache::lonlocal::locallocaltime($timeshifted)).'

'); my $delta=$timeshifted-$env{'form.timebase'}; - my $numchanges = 0; - my $result = &dateshift($delta,\$numchanges); - if ($result eq 'ok') { - $r->print( - &Apache::lonhtmlcommon::confirm_success(&mt('Completed shifting of [quant,_1,date setting]', - $numchanges))); - } elsif ($result eq 'con_delayed') { - $r->print( - &Apache::lonhtmlcommon::confirm_success(&mt('Queued shifting of [quant,_1,date setting]', - $numchanges))); - } else { - $r->print( - &Apache::lonhtmlcommon::confirm_success(&mt('An error occurred attempting to shift dates'),1)); - } + &dateshift($delta); $r->print( + &Apache::lonhtmlcommon::confirm_success(&mt('Done')). '

'. &Apache::lonhtmlcommon::actionbox( [''.&mt('Content and Problem Settings').''])); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -4857,7 +4582,8 @@ sub parse_key { $data{'scope_type'} = 'user'; $data{'scope'} = [$1,$2]; } else { - $data{'scope_type'} = 'secgroup'; + #FIXME check for group scope + $data{'scope_type'} = 'section'; } $middle=~s/^\[(.*)\]//; } @@ -4885,7 +4611,7 @@ sub parse_key { sub header { - return &Apache::loncommon::start_page('Content and Problem Settings'); + return &Apache::loncommon::start_page('Settings'); } @@ -4898,6 +4624,7 @@ sub print_main_menu { my $crstype = &Apache::loncommon::course_type(); my $lc_crstype = lc($crstype); + &startSettingsScreen($r,'parmset',$crstype); $r->print(< @@ -4908,73 +4635,35 @@ ENDMAINFORMHEAD my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}); my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'}); my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}); - my $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'}); - my $vpa = &Apache::lonnet::allowed('vpa',$env{'request.course.id'}); if ((!$dcm) && ($env{'request.course.sec'} ne '')) { $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}. '/'.$env{'request.course.sec'}); } - if ((!$vcb) && ($env{'request.course.sec'} ne '')) { - $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'}. - '/'.$env{'request.course.sec'}); - } - my (%linktext,%linktitle,%url); - if ($parm_permission->{'edit'}) { - %linktext = ( - newoverview => 'Edit Resource Parameters - Overview Mode', - settable => 'Edit Resource Parameters - Table Mode', - setoverview => 'Modify Resource Parameters - Overview Mode', - ); - %linktitle = ( - newoverview => 'Set/Modify resource parameters in overview mode.', - settable => 'Set/Modify resource parameters in table mode.', - setoverview => 'Set/Modify existing resource parameters in overview mode.', - ); - } else { - %linktext = ( - newoverview => 'View Resource Parameters - Overview Mode', - settable => 'View Resource Parameters - Table Mode', - setoverview => 'View Resource Parameters - Overview Mode', - ); - %linktitle = ( - newoverview => 'Display resource parameters in overview mode.', - settable => 'Display resource parameters in table mode.', - setoverview => 'Display existing resource parameters in overview mode.', - ); - } - if ($mgr) { - $linktext{'resettimes'} = 'Reset Student Access Times'; - $linktitle{'resettimes'} = "Reset access times for folders/maps, resources or the $lc_crstype."; - $url{'resettimes'} = '/adm/helper/resettimes.helper'; - } elsif ($vgr) { - $linktext{'resettimes'} = 'Display Student Access Times', - $linktitle{'resettimes'} = "Display access times for folders/maps, resources or the $lc_crstype.", - $url{'resettimes'} = '/adm/accesstimes'; - } + my @menu = ( { categorytitle=>"Content Settings for this $crstype", items => [ { linktext => 'Portfolio Metadata', url => '/adm/parmset?action=setrestrictmeta', - permission => $parm_permission->{'setrestrictmeta'}, + permission => $parm_permission, linktitle => "Restrict metadata for this $lc_crstype." , icon =>'contact-new.png' , }, - { linktext => $linktext{'resettimes'}, - url => $url{'resettimes'}, - permission => ($vgr || $mgr), - linktitle => $linktitle{'resettimes'}, - icon => 'start-here.png', + { linktext => 'Reset Student Access Times', + url => '/adm/helper/resettimes.helper', + permission => $mgr, + linktitle => "Reset access times for folders/maps, resources or the $lc_crstype." , + icon => 'start-here.png' , }, { linktext => 'Blocking Communication/Resource Access', url => '/adm/setblock', - permission => ($vcb || $dcm), + permission => $dcm, linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam', icon => 'comblock.png', }, { linktext => 'Set Parameter Setting Default Actions', url => '/adm/parmset?action=setdefaults', - permission => $parm_permission->{'setdefaults'}, + permission => $parm_permission, linktitle =>'Set default actions for parameters.' , icon => 'folder-new.png' , }]}, @@ -4982,43 +4671,45 @@ ENDMAINFORMHEAD items => [ { linktext => 'Edit Resource Parameters - Helper Mode', url => '/adm/helper/parameter.helper', - permission => $parm_permission->{'helper'}, + permission => $parm_permission, linktitle =>'Set/Modify resource parameters in helper mode.' , icon => 'dialog-information.png' , #help => 'Parameter_Helper', }, - { linktext => $linktext{'newoverview'}, + { linktext => 'Edit Resource Parameters - Overview Mode', url => '/adm/parmset?action=newoverview', - permission => $parm_permission->{'newoverview'}, - linktitle => $linktitle{'newoverview'}, - icon => 'edit-find.png', + permission => $parm_permission, + linktitle =>'Set/Modify resource parameters in overview mode.' , + icon => 'edit-find.png' , #help => 'Parameter_Overview', }, - { linktext => $linktext{'settable'}, + { linktext => 'Edit Resource Parameters - Table Mode', url => '/adm/parmset?action=settable', - permission => $parm_permission->{'settable'}, - linktitle => $linktitle{'settable'}, - icon => 'edit-copy.png', + permission => $parm_permission, + linktitle =>'Set/Modify resource parameters in table mode.' , + icon => 'edit-copy.png' , #help => 'Table_Mode', }]}, { categorytitle => 'Existing Parameter Settings for Resources', items => [ - { linktext => $linktext{'setoverview'}, + { linktext => 'Modify Resource Parameters - Overview Mode', url => '/adm/parmset?action=setoverview', - permission => $parm_permission->{'setoverview'}, - linktitle => $linktitle{'setoverview'}, - icon => 'preferences-desktop-wallpaper.png', + permission => $parm_permission, + linktitle =>'Set/Modify existing resource parameters in overview mode.' , + icon => 'preferences-desktop-wallpaper.png' , #help => 'Parameter_Overview', }, { linktext => 'Change Log', url => '/adm/parmset?action=parameterchangelog', - permission => $parm_permission->{'parameterchangelog'}, + permission => $parm_permission, linktitle =>"View parameter and $lc_crstype blog posting/user notification change log." , icon => 'document-properties.png', }]} ); $r->print(&Apache::lonhtmlcommon::generate_menu(@menu)); - $r->print(''.&Apache::loncommon::end_page()); + $r->print(''); + &endSettingsScreen($r); + $r->print(&Apache::loncommon::end_page()); return; } @@ -5086,6 +4777,7 @@ sub order_meta_fields { my $idx = 1; 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'};; $r->print(&Apache::loncommon::start_page('Order Metadata Fields')); &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata', text=>"Add Metadata Field"}); @@ -5094,11 +4786,12 @@ sub order_meta_fields { text=>"Restrict Metadata"}, {text=>"Order Metadata"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata')); + &startSettingsScreen($r,'parmset',$crstype); if ($env{'form.storeorder'}) { my $newpos = $env{'form.newpos'} - 1; my $currentpos = $env{'form.currentpos'} - 1; my @neworder = (); - my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}; + my @oldorder = split(/,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}); my $i; if ($newpos > $currentpos) { # moving stuff up @@ -5132,10 +4825,10 @@ sub order_meta_fields { } my $fields = &get_added_meta_fieldnames($env{'request.course.id'}); my $ordered_fields; - my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}; + my @fields_in_order = split(/,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}); if (!@fields_in_order) { # no order found, pick sorted order then create metadata.addedorder key. - foreach my $key (sort keys %$fields) { + foreach my $key (sort(keys(%$fields))) { push @fields_in_order, $key; $ordered_fields = join ",", @fields_in_order; } @@ -5163,6 +4856,7 @@ sub order_meta_fields { $idx ++; } $r->print(''); + &endSettingsScreen($r); return 'ok'; } @@ -5171,7 +4865,7 @@ sub continue { my $output; $output .= '
'; $output .= ''; - $output .= ''; + $output .= ''; return ($output); } @@ -5184,6 +4878,8 @@ sub addmetafield { $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field')); 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'}; + &startSettingsScreen($r,'parmset',$crstype); if (exists($env{'form.undelete'})) { my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield'); foreach my $meta_field(@meta_fields) { @@ -5193,10 +4889,7 @@ sub addmetafield { my $put_result = &Apache::lonnet::put('environment', {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs); - $r->print(&mt('Undeleted Metadata Field [_1] with result [_2]', - ''.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}. - '',$put_result). - '
'); + $r->print('Undeleted Metadata Field '.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}." with result ".$put_result.'
'); } $r->print(&continue()); } elsif (exists($env{'form.fieldname'})) { @@ -5208,17 +4901,12 @@ sub addmetafield { {'metadata.'.$meta_field.'.values'=>"", 'metadata.'.$meta_field.'.added'=>"$display_field", 'metadata.'.$meta_field.'.options'=>""},$dom,$crs); - $r->print(&mt('Added new Metadata Field [_1] with result [_2]', - ''.$env{'form.fieldname'}.'',$put_result). - '
'); + $r->print('Added new Metadata Field '.$env{'form.fieldname'}." with result ".$put_result.'
'); $r->print(&continue()); } else { my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'}); if ($fields) { - $r->print(&mt('You may undelete previously deleted fields.'). - '
'. - &mt('Check those you wish to undelete and click Undelete.'). - '
'); + $r->print('You may undelete previously deleted fields.
Check those you wish to undelete and click Undelete.
'); $r->print(''); foreach my $key(keys(%$fields)) { $r->print(''.$$fields{$key}.'
print(''); $r->print('
'); } - $r->print('
'. - &mt('[_1]Or[_2] you may enter a new metadata field name.', - '',''). - '
'); + $r->print('
Or you may enter a new metadata field name.print('
'); - $r->print(''); + $r->print(''); } $r->print('
'); + &endSettingsScreen($r); } @@ -5250,13 +4936,10 @@ sub setrestrictmeta { $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata')); 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'}; + &startSettingsScreen($r,'parmset',$crstype); my $key_base = $env{'course.'.$env{'request.course.id'}.'.'}; my $save_field = ''; - my %lt = &Apache::lonlocal::texthash( - addm => 'Add Metadata Field', - ordm => 'Order Metadata Fields', - save => 'Save', - ); if ($env{'form.restrictmeta'}) { foreach my $field (sort(keys(%env))) { if ($field=~m/^form.(.+)_(.+)$/) { @@ -5295,25 +4978,28 @@ sub setrestrictmeta { my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio'); # Now get possible added metadata fields my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'}); + my $row_alt = 1; $output .= &Apache::loncommon::start_data_table(); foreach my $field (sort(keys(%metadata_fields))) { if ($field ne 'courserestricted') { + $row_alt = $row_alt ? 0 : 1; $output.= &output_row($r, $field, $metadata_fields{$field}); } } my $buttons = (< +
- +

- + ENDButtons my $added_flag = 1; foreach my $field (sort(keys(%$added_metadata_fields))) { - $output.= &output_row($r,$field,$$added_metadata_fields{$field},$added_flag); + $row_alt = $row_alt ? 0 : 1; + $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt); } $output .= &Apache::loncommon::end_data_table(); $r->print(< ENDenv + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); return 'ok'; } @@ -5362,14 +5049,16 @@ sub defaultsetter { &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults', text=>"Set Defaults"}); + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; my $start_page = - &Apache::loncommon::start_page('Parameter Setting Default Actions'); + &Apache::loncommon::start_page('Parameter Setting Default Actions'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults'); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); $r->print(''); - my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; my @ids=(); my %typep=(); my %keyp=(); @@ -5420,11 +5109,11 @@ sub defaultsetter { } } } - foreach my $key (keys %allparms) { + foreach my $key (keys(%allparms)) { $newrules{$key.'_triggers'}=$triggers{$key}; } - &Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs); - &Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs); + &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum); + &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum); &resetrulescache(); } my %lt=&Apache::lonlocal::texthash('days' => 'Days', @@ -5512,6 +5201,7 @@ ENDYESNO $r->print(&Apache::loncommon::end_data_table(). "\n".''."\n"); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); return; } @@ -5541,9 +5231,15 @@ sub components { } my $realm=''.&mt('All Resources').''; my $realmdescription=&mt('all resources'); - if ($middle=~/^(.+)\_\_\_\(all\)$/) { - $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).'
('.$1.')
'; - $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1); + if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) { + my $mapurl = $1; + my $maplevel = $2; + my $leveltitle = &mt('Folder/Map'); + if ($maplevel eq 'rec') { + $leveltitle = &mt('Recursive'); + } + $realm=''.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).'
('.$mapurl.')
'; + $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($mapurl); } elsif ($middle) { my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle); $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).'
('.$url.' in '.$map.' id: '.$id.')
'; @@ -5558,7 +5254,7 @@ my %standard_parms; my %standard_parms_types; sub load_parameter_names { - open(my $config,"<","$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab"); + open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab"); while (my $configline=<$config>) { if ($configline !~ /\S/ || $configline=~/^\#/) { next; } chomp($configline); @@ -5573,7 +5269,6 @@ sub load_parameter_names { close($config); $standard_parms{'int_pos'} = 'Positive Integer'; $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero'; - $standard_parms{'scoreformat'} = 'Format for display of score'; } sub standard_parameter_names { @@ -5599,8 +5294,25 @@ sub standard_parameter_types { return; } +sub standard_parameter_levels { + my ($name)=@_; + my %levels = ( + 'resourcelevel' => 'a single resource', + 'maplevel' => 'the enclosing map/folder', + 'maplevelrecurse' => 'the enclosing map/folder (recursive into sub-folders)', + 'courselevel' => 'the general (course) level', + ); + if ($levels{$name}) { + return $levels{$name}; + } + return; +} + sub parm_change_log { - my ($r,$parm_permission)=@_; + my ($r)=@_; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'} &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', text=>"Parameter Change Log"}); my $js = ''."\n"; $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js)); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log')); - my %parmlog=&Apache::lonnet::dump('nohist_parameterlog', - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); + &startSettingsScreen($r,'parmset',$crstype); + my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',$cdom,$cnum); if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); } @@ -5629,19 +5340,12 @@ sub parm_change_log { $r->print(&Apache::loncommon::display_filter('parmslog').' '."\n". ''. '
'); - my $readonly = 1; - if ($parm_permission->{'edit'}) { - undef($readonly); - } - my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}); + + my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row(). ''.&mt('Time').''.&mt('User').''.&mt('Extent').''.&mt('Users').''. - &mt('Parameter').''.&mt('Part').''.&mt('New Value').''); - unless ($readonly) { - $r->print(''.&mt('Announce').''); - } - $r->print(&Apache::loncommon::end_data_table_header_row()); + &mt('Parameter').''.&mt('Part').''.&mt('New Value').''.&mt('Announce').''. + &Apache::loncommon::end_data_table_header_row()); my $shown=0; my $folder=''; if ($env{'form.displayfilter'} eq 'currentfolder') { @@ -5653,12 +5357,6 @@ sub parm_change_log { } if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); } } - my $numgroups = 0; - my @groups; - if ($env{'request.course.groups'} ne '') { - @groups = split(/:/,$env{'request.course.groups'}); - $numgroups = scalar(@groups); - } foreach my $id (sort { if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) { @@ -5680,8 +5378,7 @@ sub parm_change_log { $parmlog{$id}{'exe_uname'}, $parmlog{$id}{'exe_udom'}); my $send_msg_link=''; - if ((!$readonly) && - (($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) + if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) { $send_msg_link ='
'. &Apache::loncommon::messagewrapper(&mt('Send message'), @@ -5699,11 +5396,10 @@ sub parm_change_log { my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)= &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag); if ($env{'request.course.sec'} ne '') { - next if (($issection ne '') && (!(($issection eq $env{'request.course.sec'}) || - ($numgroups && (grep(/^\Q$issection\E$/,@groups)))))); + next if (($issection ne '') && ($issection ne $env{'request.course.sec'})); if ($uname ne '') { my $stusection = &Apache::lonnet::getsection($uname,$udom,$env{'request.course.id'}); - next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'})); + next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'})); } } if ($env{'form.displayfilter'} eq 'currentfolder') { @@ -5759,31 +5455,27 @@ sub parm_change_log { } } } - $output .= ''; - - unless ($readonly) { - $output .= ''; - if ($stillactive) { - my $parmitem = &standard_parameter_names($parmname); - $parmitem = &mt($parmitem); - my $title=&mt('Changed [_1]',$parmitem); - my $description=&mt('Changed [_1] for [_2] to [_3]', - $parmitem,$realmdescription, - (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value)); - if (($uname) && ($udom)) { - $output .= - &Apache::loncommon::messagewrapper('Notify User', - $uname,$udom,$title, - $description); - } else { - $output .= - &Apache::lonrss::course_blog_link($id,$title, - $description); - } - } - $output .= ''; - } - $output .= &Apache::loncommon::end_data_table_row(); + $output .= ''; + + if ($stillactive) { + my $parmitem = &standard_parameter_names($parmname); + $parmitem = &mt($parmitem); + my $title=&mt('Changed [_1]',$parmitem); + my $description=&mt('Changed [_1] for [_2] to [_3]', + $parmitem,$realmdescription, + (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value)); + if (($uname) && ($udom)) { + $output .= + &Apache::loncommon::messagewrapper('Notify User', + $uname,$udom,$title, + $description); + } else { + $output .= + &Apache::lonrss::course_blog_link($id,$title, + $description); + } + } + $output .= ''.&Apache::loncommon::end_data_table_row(); } if ($env{'form.displayfilter'} eq 'containing') { my $wholeentry=$about_me_link.':'. @@ -5803,6 +5495,7 @@ sub parm_change_log { || $shown<=$env{'form.show'})) { last; } } $r->print(&Apache::loncommon::end_data_table()); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -5851,10 +5544,10 @@ sub update_slots { context => 'parameter', ); &Apache::lonnet::write_log('course','slotreservationslog',\%storehash, - '',$uname,$udom,$cnum,$cdom); + '',$uname,$udom,$cnum,$cdom); &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash, - '',$uname,$udom,$uname,$udom); + '',$uname,$udom,$uname,$udom); } return $success; } @@ -5885,9 +5578,9 @@ sub delete_slots { context => 'parameter', ); &Apache::lonnet::write_log('course','slotreservationslog',\%storehash, - 1,$uname,$udom,$cnum,$cdom); + 1,$uname,$udom,$cnum,$cdom); &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash, - 1,$uname,$udom,$uname,$udom); + 1,$uname,$udom,$uname,$udom); } } } @@ -5910,58 +5603,24 @@ sub parameter_release_vars { } sub parameter_releasecheck { - my ($name,$value,$needsrelease,$cmajor,$cminor) = @_; + my ($name,$value,$valmatch,$namematch,$needsrelease,$cmajor,$cminor) = @_; my $needsnewer; my ($needsmajor,$needsminor) = split(/\./,$needsrelease); if (($cmajor < $needsmajor) || ($cmajor == $needsmajor && $cminor < $needsminor)) { $needsnewer = 1; - } else { - &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value}); + } elsif ($name) { + if ($valmatch) { + &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.'::'.$valmatch.':'}); + } elsif ($value) { + &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value.'::'}); + } + } elsif ($namematch) { + &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter::::'.$namematch}); } return $needsnewer; } -sub get_permission { - my %permission; - my $allowed = 0; - return (\%permission,$allowed) unless ($env{'request.course.id'}); - if ((&Apache::lonnet::allowed('opa',$env{'request.course.id'})) || - (&Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'. - $env{'request.course.sec'}))) { - %permission= ( - 'edit' => 1, - 'set' => 1, - 'setoverview' => 1, - 'addmetadata' => 1, - 'ordermetadata' => 1, - 'setrestrictmeta' => 1, - 'newoverview' => 1, - 'setdefaults' => 1, - 'settable' => 1, - 'parameterchangelog' => 1, - 'cleanparameters' => 1, - 'dateshift1' => 1, - 'dateshift2' => 1, - 'helper' => 1, - ); - } elsif ((&Apache::lonnet::allowed('vpa',$env{'request.course.id'})) || - (&Apache::lonnet::allowed('vpa',$env{'request.course.id'}.'/'. - $env{'request.course.sec'}))) { - %permission = ( - 'set' => 1, - 'settable' => 1, - 'newoverview' => 1, - 'setoverview' => 1, - 'parameterchangelog' => 1, - ); - } - foreach my $perm (values(%permission)) { - if ($perm) { $allowed=1; last; } - } - return (\%permission,$allowed); -} - sub handler { my $r=shift; @@ -5989,41 +5648,41 @@ sub handler { 'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'}); # ----------------------------------------------------- Needs to be in a course - my ($parm_permission,$allowed) = &get_permission(); + my $parm_permission = + (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) || + &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'. + $env{'request.course.sec'})); my $exists = &check_for_course_info(); - if ($env{'request.course.id'} && $allowed && $exists) { + if ($env{'request.course.id'} && $parm_permission && $exists) { # # Main switch on form.action and form.state, as appropriate # # Check first if coming from someone else headed directly for # the table mode - if (($parm_permission->{'set'}) && - ((($env{'form.command'} eq 'set') && ($env{'form.url'}) - && (!$env{'form.dis'})) || ($env{'form.symb'}))) { - &assessparms($r,$parm_permission); + if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) + && (!$env{'form.dis'})) || ($env{'form.symb'})) { + &assessparms($r); } elsif (! exists($env{'form.action'})) { &print_main_menu($r,$parm_permission); - } elsif (!$parm_permission->{$env{'form.action'}}) { - &print_main_menu($r,$parm_permission); } elsif ($env{'form.action'} eq 'setoverview') { - &overview($r,$parm_permission); - } elsif ($env{'form.action'} eq 'addmetadata') { - &addmetafield($r); - } elsif ($env{'form.action'} eq 'ordermetadata') { - &order_meta_fields($r); + &overview($r); + } elsif ($env{'form.action'} eq 'addmetadata') { + &addmetafield($r); + } elsif ($env{'form.action'} eq 'ordermetadata') { + &order_meta_fields($r); } elsif ($env{'form.action'} eq 'setrestrictmeta') { - &setrestrictmeta($r); + &setrestrictmeta($r); } elsif ($env{'form.action'} eq 'newoverview') { - &newoverview($r,$parm_permission); + &newoverview($r); } elsif ($env{'form.action'} eq 'setdefaults') { - &defaultsetter($r); - } elsif ($env{'form.action'} eq 'settable') { - &assessparms($r,$parm_permission); + &defaultsetter($r); + } elsif ($env{'form.action'} eq 'settable') { + &assessparms($r); } elsif ($env{'form.action'} eq 'parameterchangelog') { - &parm_change_log($r,$parm_permission); + &parm_change_log($r); } elsif ($env{'form.action'} eq 'cleanparameters') { - &clean_parameters($r); + &clean_parameters($r); } elsif ($env{'form.action'} eq 'dateshift1') { &date_shift_one($r); } elsif ($env{'form.action'} eq 'dateshift2') {