Diff for /loncom/interface/lonparmset.pm between versions 1.566 and 1.580

version 1.566, 2016/08/10 21:05:42 version 1.580, 2017/07/15 02:49:10
Line 36  lonparmset - Handler to set parameters f Line 36  lonparmset - Handler to set parameters f
   
 =head1 SYNOPSIS  =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  It contains all the code for the "Content and Problem Settings" UI, except
 for the helpers parameter.helper and resettimes.helper, and lonhelper.pm,  for the helpers parameter.helper and resettimes.helper, and lonhelper.pm,
Line 137  javascript function 'pjump'. Line 138  javascript function 'pjump'.
   
 =item print_td()  =item print_td()
   
 =item print_usergroups()  =item check_other_groups()
   
 =item parm_control_group()  =item parm_control_group()
   
Line 846  sub storeparm_by_symb_inner { Line 847  sub storeparm_by_symb_inner {
     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;      my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
   
     my $storeunder='';      my $storeunder='';
       my $possreplace='';
     if (($snum==18) || ($snum==4)) { $storeunder=$courselevel; }      if (($snum==18) || ($snum==4)) { $storeunder=$courselevel; }
     if (($snum==17) || ($snum==3)) { $storeunder=$courseleveli; }       if (($snum==17) || ($snum==3)) { 
     if (($snum==16) || ($snum==2)) { $storeunder=$courselevelm; }          $storeunder=$courseleveli;
           $possreplace=$courselevelm; 
       } 
       if (($snum==16) || ($snum==2)) { 
           $storeunder=$courselevelm;
           $possreplace=$courseleveli;
       }
     if (($snum==13) || ($snum==1)) { $storeunder=$courselevelr; }      if (($snum==13) || ($snum==1)) { $storeunder=$courselevelr; }
     if ($snum==12) { $storeunder=$seclevel; }      if ($snum==12) { $storeunder=$seclevel; }
     if ($snum==11) { $storeunder=$secleveli; }      if ($snum==11) { 
     if ($snum==10) { $storeunder=$seclevelm; }          $storeunder=$secleveli;
           $possreplace=$seclevelm; 
       }
       if ($snum==10) { 
           $storeunder=$seclevelm;
           $possreplace=$secleveli;
       }
     if ($snum==9) { $storeunder=$seclevelr; }      if ($snum==9) { $storeunder=$seclevelr; }
     if ($snum==8) { $storeunder=$grplevel; }      if ($snum==8) { $storeunder=$grplevel; }
     if ($snum==7) { $storeunder=$grpleveli; }      if ($snum==7) { 
     if ($snum==6) { $storeunder=$grplevelm; }          $storeunder=$grpleveli;
           $possreplace=$grplevelm;
       }
       if ($snum==6) {
           $storeunder=$grplevelm;
           $possreplace=$grpleveli;
       }
     if ($snum==5) { $storeunder=$grplevelr; }      if ($snum==5) { $storeunder=$grplevelr; }
   
   
Line 875  sub storeparm_by_symb_inner { Line 895  sub storeparm_by_symb_inner {
         &Apache::lonnet::expirespread('','','studentcalc');          &Apache::lonnet::expirespread('','','studentcalc');
         if (($snum==13) || ($snum==9) || ($snum==5)) {          if (($snum==13) || ($snum==9) || ($snum==5)) {
             &Apache::lonnet::expirespread('','','assesscalc',$symb);              &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);              &Apache::lonnet::expirespread('','','assesscalc',$map);
         } else {          } else {
             &Apache::lonnet::expirespread('','','assesscalc');              &Apache::lonnet::expirespread('','','assesscalc');
Line 889  sub storeparm_by_symb_inner { Line 909  sub storeparm_by_symb_inner {
             $reply=&Apache::lonnet::cput              $reply=&Apache::lonnet::cput
             ('resourcedata',\%storecontent,$cdom,$cnum);              ('resourcedata',\%storecontent,$cdom,$cnum);
             &log_parmset(\%storecontent);              &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);          &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
     } else {      } else {
Line 899  sub storeparm_by_symb_inner { Line 930  sub storeparm_by_symb_inner {
         if ($snum==1) {          if ($snum==1) {
             &Apache::lonnet::expirespread              &Apache::lonnet::expirespread
             ($uname,$udom,'assesscalc',$symb);              ($uname,$udom,'assesscalc',$symb);
         } elsif ($snum==2) {          } elsif (($snum==2) || ($snum==3)) {
             &Apache::lonnet::expirespread              &Apache::lonnet::expirespread
             ($uname,$udom,'assesscalc',$map);              ($uname,$udom,'assesscalc',$map);
         } else {          } else {
Line 914  sub storeparm_by_symb_inner { Line 945  sub storeparm_by_symb_inner {
             $reply=&Apache::lonnet::cput              $reply=&Apache::lonnet::cput
             ('resourcedata',\%storecontent,$udom,$uname);              ('resourcedata',\%storecontent,$udom,$uname);
             &log_parmset(\%storecontent,0,$uname,$udom);              &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);          &Apache::lonnet::devalidateuserresdata($uname,$udom);
     }      }
Line 1022  sub valout { Line 1065  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} $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} $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 {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 {  sub plink {
     my ($type,$dis,$value,$marker,$return,$call)=@_;      my ($type,$dis,$value,$marker,$return,$call,$recursive)=@_;
     my $winvalue=$value;      my $winvalue=$value;
     unless ($winvalue) {      unless ($winvalue) {
         if (&isdateparm($type)) {          if (&isdateparm($type)) {
Line 1045  sub plink { Line 1089  sub plink {
     return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.      return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.
     '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"      '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
         .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.          .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.
         $valout.'</a></td></tr></table>';          $valout.'</a></td></tr>'.($recursive?'<tr><td align="center" class="LC_parm_recursive">'.
                                                 &mt('recursive').'</td></tr>' : '').'</table>';
   
 }  }
   
 # Javascript for table mode.  # Javascript for table mode.
Line 1380  ENDHEAD Line 1426  ENDHEAD
 # @param {string} $cgroup - group name  # @param {string} $cgroup - group name
 # @param {array reference} $usersgroups - list of groups the user belongs to, if any  # @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} $noeditgrp - true if no edit is allowed for group level parameters
   # @param {boolean} $readonly - true if no editing allowed. 
 sub print_row {  sub print_row {
     my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,      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)=@_;
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);      my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
Line 1423  sub print_row { Line 1471  sub print_row {
     $thismarker=~s/^parameter\_//;      $thismarker=~s/^parameter\_//;
     my $mprefix=$rid.'&'.$thismarker.'&';      my $mprefix=$rid.'&'.$thismarker.'&';
     my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker);      my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker);
     my ($othergrp,$grp_parm,$controlgrp);      my ($othergrp,$grp_parm,$controlgrp,$effparm_rec);
       if ($result == 17 || $result == 11 || $result == 7 || $result == 3) {
           $effparm_rec = 1;
       }
     if ($parmlev eq 'general') {      if ($parmlev eq 'general') {
         if ($uname) {          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) {          } 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) {          } 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 {          } 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') {      } elsif ($parmlev eq 'map') {
         if ($uname) {          if ($uname) {
             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1); 
             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);   
         } elsif ($cgroup) {          } 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,$readonly,1);
             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);  
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
             &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);  
         } else {          } else {
             &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
             &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);  
         }          }
     } else {      } else {
         if ($uname) {          if ($uname) {
             if (@{$usersgroups} > 1) {              if (@{$usersgroups} > 1) {
                 my ($coursereply,$grp_parm,$controlgrp);                  my ($coursereply,$grp_parm,$controlgrp);
                 ($coursereply,$othergrp,$grp_parm,$controlgrp) =                  ($coursereply,$othergrp,$grp_parm,$controlgrp) =
                     &print_usergroups($r,$$part{$which}.'.'.$$name{$which},                      &check_other_groups($$part{$which}.'.'.$$name{$which},
                        $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);                         $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
                 if ($coursereply && $result > 4) {                  if ($coursereply && $result > 4) {
                     if (defined($controlgrp)) {                      if (defined($controlgrp)) {
Line 1467  sub print_row { Line 1513  sub print_row {
             }              }
         }          }
   
         &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);          &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);          &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
         &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);          &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);          &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);          &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
         &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);  
   
         if ($csec) {          if ($csec) {
             &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
             &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
             &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
             &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);  
         }          }
   
         if ($cgroup) {          if ($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);
             &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);              &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,1);
             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);              &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp.$readonly);
             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);  
         }          }
   
         if ($uname) {          if ($uname) {
             if ($othergrp) {              if ($othergrp) {
                 $r->print($othergrp);                  $r->print($othergrp);
             }              }
             &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);              &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
             &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);  
         }          }
   
     } # end of $parmlev if/else      } # end of $parmlev if/else
     $r->print('<td style="background-color:#CCCCFF;" align="center">'.$effective_parm.'</td>');      $r->print('<td style="background-color:#CCCCFF;" align="center">'.$effective_parm.
                 ($effparm_rec?'<br /><span class="LC_parm_recursive">'.&mt('recursive').
                               '</span>':'').'</td>');
   
     if ($parmlev eq 'full') {      if ($parmlev eq 'full') {
         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.          my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
Line 1532  sub print_row { Line 1576  sub print_row {
 # @param {array reference} $typeoutpar - array level -> parameter type (when defined)  # @param {array reference} $typeoutpar - array level -> parameter type (when defined)
 # @param {hash reference} $display - parameter key -> full title for the parameter  # @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} $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 {  sub print_td {
     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_;      my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,
     $r->print('<td style="background-color:'.(($result==$which)?'#AAFFAA':$defbg).          $noeditgrp,$readonly,$ismaplevel)=@_;
       my ($ineffect,$recursive,$currval,$currtype,$currlevel);
       $ineffect = 0;
       $currval = $$outpar[$which];
       $currtype = $$typeoutpar[$which];
       $currlevel = $which;
       if (($result) && ($result == $which)) {
           $ineffect = 1;
       } 
       if ($ismaplevel) {
           if ($mprefix =~ /(hiddenresource|encrypturl)\&/) {
               if (($result) && ($result == $which)) {
                   $recursive = 1;
               }
           } elsif ($$outpar[$which+1] ne '') {
               $recursive = 1;
               $currlevel = $which+1;
               $currval = $$outpar[$currlevel];
               $currtype = $$typeoutpar[$currlevel];
               if (($result) && ($result == $currlevel)) {
                   $ineffect = 1;
               }
           }
       }
       $r->print('<td style="background-color:'.($ineffect?'#AAFFAA':$defbg).
               ';" align="center">');                ';" align="center">');
     my $nolink = 0;      my $nolink = 0;
     if ($which == 14 || $which == 15) {      if ($readonly) {
         $nolink = 1;  
     } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) {  
         $nolink = 1;          $nolink = 1;
     } elsif ($which == 5 || $which ==  6 || $which == 7 || $which == 8) {      } else { 
         if ($noeditgrp) {          if ($which == 14 || $which == 15 || $mprefix =~ /mapalias\&$/) {
             $nolink = 1;              $nolink = 1;
         }          } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) {
     } elsif ($mprefix =~ /availablestudent\&$/) {  
         if ($which > 4) {  
             $nolink = 1;  
         }  
     } elsif ($mprefix =~ /examcode\&$/) {  
         unless ($which == 2) {  
             $nolink = 1;              $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) {      if ($nolink) {
         $r->print(&valout($$outpar[$which],$$typeoutpar[$which],$mprefix));          my ($parmname)=((split(/\&/,$mprefix))[1]=~/\_([^\_]+)$/);
 # FIXME: probably a good thing that mprefix is not used in valout, because it does not look like a parameter name !          $r->print(&valout($currval,$currtype,$parmname));
     } else {      } else {
         $r->print(&plink($$typeoutpar[$which],          $r->print(&plink($currtype,
                          $$display{$value},$$outpar[$which],                           $$display{$value},$currval,
                          $mprefix."$which",'parmform.pres','psub'));                           $mprefix.$currlevel,'parmform.pres','psub',$recursive));
     }      }
     $r->print('</td>'."\n");      $r->print('</td>'."\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  # 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".  # 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} $what - parameter part.'.'.parameter name
 # @param {string} $rid - resource id  # @param {string} $rid - resource id
 # @param {string} $cgroup - group name  # @param {string} $cgroup - group name
Line 1578  sub print_td { Line 1650  sub print_td {
 # @param {integer} $result - level  # @param {integer} $result - level
 # @param {hash reference} $courseopt - course parameters hash (result of lonnet::get_courseresdata, dump of course's resourcedata.db)  # @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)  # @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 {  sub check_other_groups {
     my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;      my ($what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
     my $courseid = $env{'request.course.id'};      my $courseid = $env{'request.course.id'};
     my $output;      my $output;
     my $symb = &symbcache($rid);      my $symb = &symbcache($rid);
Line 1595  sub print_usergroups { Line 1667  sub print_usergroups {
     if (($coursereply) && ($cgroup ne $resultgroup)) {      if (($coursereply) && ($cgroup ne $resultgroup)) {
         if ($result > 3) {          if ($result > 3) {
             $bgcolor = '#AAFFAA';              $bgcolor = '#AAFFAA';
             $grp_parm = &valout($coursereply,$resulttype,$what);  
         }          }
         $grp_parm = &valout($coursereply,$resulttype,$what);          $grp_parm = &valout($coursereply,$resulttype,$what);
         $output = '<td style="background-color:'.$bgcolor.';" align="center">';          $output = '<td style="background-color:'.$bgcolor.';" align="center">';
Line 1612  sub print_usergroups { Line 1683  sub print_usergroups {
 }  }
   
 # Looks for a group with a defined parameter for given user and parameter.  # 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 {string} $courseid - the course id
 # @param {array reference} $usersgroups - list of groups the user belongs to, if any  # @param {array reference} $usersgroups - list of groups the user belongs to, if any
Line 1928  sub lookUpTableParameter { Line 1999  sub lookUpTableParameter {
         'retrypartial' => 'tries',          'retrypartial' => 'tries',
         'discussvote'  => 'misc',          '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.  # Adds the given parameter name to an array of arrays listing all parameters for each category.
Line 2022  sub parmboxes { Line 2093  sub parmboxes {
         $r->print('<div class="LC_Box LC_400Box">'          $r->print('<div class="LC_Box LC_400Box">'
                  .'<h4 class="LC_hcell">'.&mt($categories{$key}).'</h4>'."\n");                   .'<h4 class="LC_hcell">'.&mt($categories{$key}).'</h4>'."\n");
         foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {          foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {
               next if ($tempkey eq '');
             $r->print('<span class="LC_nobreak">'              $r->print('<span class="LC_nobreak">'
                      .'<label><input type="checkbox" name="pscat" '                       .'<label><input type="checkbox" name="pscat" '
                      .'value="'.$tempkey.'" ');                       .'value="'.$tempkey.'" ');
Line 2630  sub standardkeyorder { Line 2702  sub standardkeyorder {
 # url - used only with command 'set', the resource url  # url - used only with command 'set', the resource url
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @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 {  sub assessparms {
   
     my $r=shift;      my ($r,$parm_permission) = @_;
   
   
 # -------------------------------------------------------- Variable declaration  # -------------------------------------------------------- Variable declaration
Line 2803  sub assessparms { Line 2877  sub assessparms {
     $symbp{'0.0'} = '';      $symbp{'0.0'} = '';
   
 # ---------------------------------------------------------- Anything to store?  # ---------------------------------------------------------- Anything to store?
     if ($env{'form.pres_marker'}) {      if ($env{'form.pres_marker'} && $parm_permission->{'edit'}) {
         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});          my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
         my @values=split(/\&\&\&/,$env{'form.pres_value'});          my @values=split(/\&\&\&/,$env{'form.pres_value'});
         my @types=split(/\&\&\&/,$env{'form.pres_type'});          my @types=split(/\&\&\&/,$env{'form.pres_type'});
Line 3096  ENDPARMSELSCRIPT Line 3170  ENDPARMSELSCRIPT
         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;          my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
         my $csuname=$env{'user.name'};          my $csuname=$env{'user.name'};
         my $csudom=$env{'user.domain'};          my $csudom=$env{'user.domain'};
           my $readonly = 1;
           if ($parm_permission->{'edit'}) {
               undef($readonly); 
           }
   
         if ($parmlev eq 'full') {          if ($parmlev eq 'full') {
 #  #
 # This produces the cascading table output of parameters  # This produces the cascading table output of parameters
 #  #
             my $coursespan=$csec?10:6;              my $coursespan=$csec?8:5;
             my $userspan=4;              my $userspan=3;
             if ($cgroup ne '') {              if ($cgroup ne '') {
                 $coursespan += 4;                  $coursespan += 3;
             }              }
   
             $r->print(&Apache::loncommon::start_data_table());              $r->print(&Apache::loncommon::start_data_table());
Line 3134  ENDPARMSELSCRIPT Line 3212  ENDPARMSELSCRIPT
                 'femof'  => 'from Enclosing Map or Folder',                  'femof'  => 'from Enclosing Map or Folder',
                 'gen'    => 'general',                  'gen'    => 'general',
                 'foremf' => 'for Enclosing Map or Folder',                  'foremf' => 'for Enclosing Map or Folder',
                 'formfr' => 'for Map or Folder (recursive)',  
                 'fr'     => 'for Resource'                  'fr'     => 'for Resource'
             );              );
             $r->print(<<ENDTABLETWO);              $r->print(<<ENDTABLETWO);
 <th rowspan="3">$lt{'pie'}</th>  <th rowspan="3">$lt{'pie'}</th>
 <th rowspan="3">$lt{'csv'}<br />($csuname:$csudom)</th>  <th rowspan="3">$lt{'csv'}<br />($csuname:$csudom)</th>
 </tr><tr><td colspan="5"></td><th colspan="3">$lt{'ic'}</th><th colspan="2">$lt{'rl'}</th>  </tr><tr><td colspan="5"></td><th colspan="2">$lt{'ic'}</th><th colspan="2">$lt{'rl'}</th>
 <th colspan="1">$lt{'ic'}</th>  <th colspan="1">$lt{'ic'}</th>
   
 ENDTABLETWO  ENDTABLETWO
             if ($csec) {              if ($csec) {
                 $r->print('<th colspan="4">'.                  $r->print('<th colspan="3">'.
                 &mt("in Section")." $csec</th>");                  &mt("in Section")." $csec</th>");
             }              }
             if ($cgroup) {              if ($cgroup) {
                 $r->print('<th colspan="4">'.                  $r->print('<th colspan="3">'.
                 &mt("in Group")." $cgroup</th>");                  &mt("in Group")." $cgroup</th>");
             }              }
             $r->print(<<ENDTABLEHEADFOUR);              $r->print(<<ENDTABLEHEADFOUR);
 </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>  </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
 <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>  <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
 <th>$lt{'gen'}</th><th>$lt{'formfr'}</th><th>$lt{'foremf'}</th>  <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
 <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>  <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
 ENDTABLEHEADFOUR  ENDTABLEHEADFOUR
   
             if ($csec) {              if ($csec) {
                 $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');                  $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');
             }              }
   
             if ($cgroup) {              if ($cgroup) {
                 $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.&mt('foremf').'</th><th>'.$lt{'fr'}.'</th>');                  $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');
             }              }
   
             if ($uname) {              if ($uname) {
                 if (@usersgroups > 1) {                  if (@usersgroups > 1) {
                     $r->print('<th>'.&mt('Control by other group?').'</th>');                      $r->print('<th>'.&mt('Control by other group?').'</th>');
                 }                  }
                 $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'formfr'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');                  $r->print('<th>'.$lt{'gen'}.'</th><th>'.$lt{'foremf'}.'</th><th>'.$lt{'fr'}.'</th>');
             }              }
   
             $r->print('</tr>');              $r->print('</tr>');
Line 3279  ENDTABLEHEADFOUR Line 3356  ENDTABLEHEADFOUR
                             &print_row($r,$item,\%part,\%name,\%symbp,$rid,\%default,                              &print_row($r,$item,\%part,\%name,\%symbp,$rid,\%default,
                                        \%type,\%display,$defbgone,$defbgtwo,                                         \%type,\%display,$defbgone,$defbgtwo,
                                        $defbgthree,$parmlev,$uname,$udom,$csec,                                         $defbgthree,$parmlev,$uname,$udom,$csec,
                                        $cgroup,\@usersgroups,$noeditgrp);                                         $cgroup,\@usersgroups,$noeditgrp,$readonly);
                         }                          }
                     }                      }
                 }                  }
Line 3392  ENDTABLEHEADFOUR Line 3469  ENDTABLEHEADFOUR
                 $r->print('<p>'.&Apache::loncommon::start_data_table()                  $r->print('<p>'.&Apache::loncommon::start_data_table()
                          .&Apache::loncommon::start_data_table_header_row()                           .&Apache::loncommon::start_data_table_header_row()
                          .'<th>'.&mt('Parameter Name').'</th>'                           .'<th>'.&mt('Parameter Name').'</th>'
                          .'<th>'.&mt('Recursive Value').'</th>'                           .'<th>'.&mt('Value').'</th>'
                          .'<th>'.&mt('Non-Recursive Value').'</th>'  
                          .'<th>'.&mt('Parameter in Effect').'</th>'                           .'<th>'.&mt('Parameter in Effect').'</th>'
                          .&Apache::loncommon::end_data_table_header_row()                           .&Apache::loncommon::end_data_table_header_row()
                 );                  );
Line 3402  ENDTABLEHEADFOUR Line 3478  ENDTABLEHEADFOUR
                     $r->print(&Apache::loncommon::start_data_table_row());                      $r->print(&Apache::loncommon::start_data_table_row());
                     &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,                      &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,
                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,                             \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                            $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp);                             $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,
                              $readonly);
                 }                  }
                 $r->print(&Apache::loncommon::end_data_table().'</p>'                  $r->print(&Apache::loncommon::end_data_table().'</p>'
                          .'</div>'                           .'</div>'
Line 3491  ENDMAPONE Line 3568  ENDMAPONE
             foreach my $item (&keysinorder(\%name,\%keyorder)) {              foreach my $item (&keysinorder(\%name,\%keyorder)) {
                 $r->print(&Apache::loncommon::start_data_table_row());                  $r->print(&Apache::loncommon::start_data_table_row());
                 &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,                  &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,
                        \%type,\%display,$defbgone,$defbgtwo,$defbgthree,                             \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                                    $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp);                             $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,
                              $readonly);
             }              }
             $r->print(&Apache::loncommon::end_data_table()              $r->print(&Apache::loncommon::end_data_table()
                      .'</p>'                       .'</p>'
Line 3517  my $tableopen; # boolean, true if HTML t Line 3595  my $tableopen; # boolean, true if HTML t
 # @param {boolean} $readonly - true if values cannot be edited (otherwise more columns are added)  # @param {boolean} $readonly - true if values cannot be edited (otherwise more columns are added)
 # @returns {string}  # @returns {string}
 sub tablestart {  sub tablestart {
     my ($readonly) = @_;      my ($readonly,$is_map) = @_;
     if ($tableopen) {      if ($tableopen) {
         return '';          return '';
     } else {      } else {
Line 3526  sub tablestart { Line 3604  sub tablestart {
         if ($readonly) {          if ($readonly) {
             $output .= '<th>'.&mt('Current value').'</th>';              $output .= '<th>'.&mt('Current value').'</th>';
         } else {          } else {
             $output .= '<th>'.&mt('Delete').'</th><th>'.&mt('Set to ...').'</th>';              $output .= '<th>'.&mt('Delete').'</th>'.
                          '<th>'.&mt('Set to ...').'</th>';
               if ($is_map) {
                   $output .= '<th>'.&mt('Recursive?').'</th>';
               }
         }          }
         $output .= '</tr>';          $output .= '</tr>';
         return $output;          return $output;
Line 3605  sub storedata { Line 3687  sub storedata {
     my %newdata=();      my %newdata=();
     undef %newdata;      undef %newdata;
     my @deldata=();      my @deldata=();
       my @delrec=();
       my @delnonrec=();
     undef @deldata;      undef @deldata;
     my ($got_chostname,$chostname,$cmajor,$cminor);      my ($got_chostname,$chostname,$cmajor,$cminor);
     my $now = time;      my $now = time;
Line 3612  sub storedata { Line 3696  sub storedata {
         if ($key =~ /^form\.([a-z]+)\_(.+)$/) {          if ($key =~ /^form\.([a-z]+)\_(.+)$/) {
             my $cmd=$1;              my $cmd=$1;
             my $thiskey=$2;              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 ($tuname,$tudom)=&extractuser($thiskey);
             my $tkey=$thiskey;  
             if ($tuname) {              if ($tuname) {
                   $tkey=$thiskey;
                 $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;                  $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') {              if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
                 my ($data, $typeof, $text, $name, $valchk, $valmatch, $namematch);                  my ($data, $typeof, $text, $name, $valchk, $valmatch, $namematch);
Line 3700  sub storedata { Line 3800  sub storedata {
                     $typeof=$env{'form.typeof_'.$thiskey};                      $typeof=$env{'form.typeof_'.$thiskey};
                     $text = &mt('Saved modified date for');                      $text = &mt('Saved modified date for');
                 }                  }
                 if ($thiskey =~ m{\.(?:sequence|page)___\(rec\)}) {                  if ($recursive) {
                     $namematch = 'maplevelrecurse';                      $namematch = 'maplevelrecurse';
                 }                  }
                 if (($name ne '') || ($namematch ne '')) {                  if (($name ne '') || ($namematch ne '')) {
Line 3747  sub storedata { Line 3847  sub storedata {
                         next;                          next;
                     }                      }
                 }                  }
                 if (defined($data) and $$olddata{$thiskey} ne $data) {                  my ($reconlychg,$haschange,$storekey);
                     if ($tuname) {                  if ($tuname) {
                         if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,                      my $ustorekey;
                                             $tkey.'.type' => $typeof},                      if ($altkey) {
                                     $tudom,$tuname) eq 'ok') {                          if ($recursive) {
                             &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);                              if (exists($$olddata{$thiskey})) {
                             $r->print('<br />'.$text.' '.                                  if ($$olddata{$thiskey} eq $data) {
                                 &Apache::loncommon::plainname($tuname,$tudom));                                      $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 {
                           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('<br />'.$text.' '.
                                             &Apache::loncommon::plainname($tuname,$tudom));
                               } else {
                                   $r->print('<div class="LC_error">'.
                                             &mt('Error saving parameters').'</div>');
                               }
                               &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                           }
                       }
                   } else {
                       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 {                          } else {
                             $r->print('<div class="LC_error">'.                              if (exists($$olddata{$altkey})) {
                                 &mt('Error saving parameters').'</div>');                                  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;
                         }                          }
                         &Apache::lonnet::devalidateuserresdata($tuname,$tudom);  
                     } else {                      } else {
                         $newdata{$thiskey}=$data;                          if (defined($data) && $$olddata{$thiskey} ne $data) {
                         $newdata{$thiskey.'.type'}=$typeof;                              $haschange = 1;
                               $storekey = $thiskey;
                           }
                       }
                   }
                   if ($reconlychg || $haschange) {
                       unless ($env{'form.del_'.$thiskey}) {
                           $newdata{$storekey}=$data;
                           $newdata{$storekey.'.type'}=$typeof;
                     }                      }
                 }                  }
             } elsif ($cmd eq 'del') {              } elsif ($cmd eq 'del') {
                 if ($tuname) {                  if ($tuname) {
                     if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {                      my $error;
                             &log_parmset({$tkey=>''},1,$tuname,$tudom);                      if ($altkey) {  
                         $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));                          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('<br />'.&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('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                                   }
                               } elsif (!$recursive) {
                                   $error = 1;
                               }
                           }
                     } else {                      } 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('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                               } else {
                                   $error = 1;
                               }
                           }
                       }
                       if ($error) { 
                         $r->print('<div class="LC_error">'.                          $r->print('<div class="LC_error">'.
                             &mt('Error deleting parameters').'</div>');                              &mt('Error deleting parameters').'</div>');
                     }                      }
                     &Apache::lonnet::devalidateuserresdata($tuname,$tudom);                      &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                 } else {                  } 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  # Store all course level
     my $delentries=$#deldata+1;      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 @newdatakeys=keys(%newdata);
     my $putentries=$#newdatakeys+1;      my $putentries=$#newdatakeys+1;
     if ($delentries) {      my ($delresult,$devalidate);
         if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {      if (@alldels) {
             my %loghash=map { $_ => '' } @deldata;          if (&Apache::lonnet::del('resourcedata',\@alldels,$dom,$crs) eq 'ok') {
               my %loghash=map { $_ => '' } @alldels;
             &log_parmset(\%loghash,1);              &log_parmset(\%loghash,1);
             $r->print('<h2>'.&mt('Deleted [quant,_1,parameter]',$delentries/2).'</h2>');              if ($delentries) {
         } else {                  $r->print('<h2>'.&mt('Deleted [quant,_1,parameter]',$delentries/2).'</h2>');
               }
           } elsif ($delentries) {
             $r->print('<div class="LC_error">'.              $r->print('<div class="LC_error">'.
                 &mt('Error deleting parameters').'</div>');                  &mt('Error deleting parameters').'</div>');
         }          }
         &Apache::lonnet::devalidatecourseresdata($crs,$dom);          $devalidate = 1; 
     }      }
     if ($putentries) {      if ($putentries) {
         if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {          if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
Line 3804  sub storedata { Line 4045  sub storedata {
             $r->print('<div class="LC_error">'.              $r->print('<div class="LC_error">'.
                 &mt('Error saving parameters').'</div>');                  &mt('Error saving parameters').'</div>');
         }          }
           $devalidate = 1; 
       }
       if ($devalidate) {
         &Apache::lonnet::devalidatecourseresdata($crs,$dom);          &Apache::lonnet::devalidatecourseresdata($crs,$dom);
     }      }
 }  }
Line 3850  sub parse_listdata_key { Line 4094  sub parse_listdata_key {
 # @param {string} $sortorder - realmstudent|studentrealm  # @param {string} $sortorder - realmstudent|studentrealm
 # @param {string} $caller - name of the calling sub (overview|newoverview)  # @param {string} $caller - name of the calling sub (overview|newoverview)
 # @param {hash reference} $classlist - from loncoursedata::get_classlist  # @param {hash reference} $classlist - from loncoursedata::get_classlist
   # @param {boolean} $readonly - true if editing not allowed
 # @returns{integer} - number of $listdata parameters processed  # @returns{integer} - number of $listdata parameters processed
 sub listdata {  sub listdata {
     my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist)=@_;      my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly)=@_;
           
 # Start list output  # Start list output
   
Line 3874  sub listdata { Line 4119  sub listdata {
         }          }
     }      }
   
     foreach my $thiskey (sort {      foreach my $key (sort {
         my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);          my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
         my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);          my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
   
Line 3914  sub listdata { Line 4159  sub listdata {
   
         $result;          $result;
                   
     } keys(%{$listdata})) { # foreach my $thiskey      } keys(%{$listdata})) { # foreach my $key
           my $thiskey = $key;
         my $readonly;  
         if ($$listdata{$thiskey.'.type'}) {          if ($$listdata{$thiskey.'.type'}) {
             my $thistype=$$listdata{$thiskey.'.type'};              my $thistype=$$listdata{$thiskey.'.type'};
             if ($$resourcedata{$thiskey.'.type'}) {              if ($$resourcedata{$thiskey.'.type'}) {
                 $thistype=$$resourcedata{$thiskey.'.type'};                  $thistype=$$resourcedata{$thiskey.'.type'};
             }              }
             my ($middle,$part,$name)=              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 $section=&mt('All Students');
               my $showval = $$resourcedata{$thiskey}; 
             if ($middle=~/^\[(.*)\]/) {              if ($middle=~/^\[(.*)\]/) {
                 my $issection=$1;                  my $issection=$1;
                 if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {                  if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
Line 3957  sub listdata { Line 4202  sub listdata {
             $middle=~s/\.+$//;              $middle=~s/\.+$//;
             $middle=~s/^\.+//;              $middle=~s/^\.+//;
             my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';              my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
             if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) {              my ($is_map,$is_recursive,$mapurl,$maplevel);
                 my $mapurl = $1;              if ($caller eq 'overview') {
                 my $maplevel = $2;                  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');                  my $leveltitle = &mt('Folder/Map');
                 if ($maplevel eq 'rec') {                  unless (($name eq 'hiddenresource') || ($name eq 'encrypturl')) {   
                     $leveltitle = &mt('Recursive');                      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='<span class="LC_parm_scope_folder">'.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' <br /><span class="LC_parm_folder">('.$mapurl.')</span></span>';                  $realm='<span class="LC_parm_scope_folder">'.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' <br /><span class="LC_parm_folder">('.$mapurl.')</span></span>';
             } elsif ($middle) {              } elsif ($middle) {
Line 4004  sub listdata { Line 4274  sub listdata {
     # Ready to print      # Ready to print
     #      #
             my $parmitem = &standard_parameter_names($name);              my $parmitem = &standard_parameter_names($name);
             $r->print(&tablestart($readonly).              $r->print(&tablestart($readonly,$is_map).
                 &Apache::loncommon::start_data_table_row().                  &Apache::loncommon::start_data_table_row().
                 '<td><b>'.&mt($parmitem).                  '<td><b>'.&mt($parmitem).
                 '</b></td>');                  '</b></td>');
Line 4024  sub listdata { Line 4294  sub listdata {
                 $r->print(                  $r->print(
                     &Apache::lonhtmlcommon::date_setter('parmform',                      &Apache::lonhtmlcommon::date_setter('parmform',
                                                         $jskey,                                                          $jskey,
                                                         $$resourcedata{$thiskey},                                                          $showval,
                                                         '',1,$state));                                                          '',1,$state));
                 unless  ($readonly) {                  unless  ($readonly) {
                     $r->print(                      $r->print(
     '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.      '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
     (($$resourcedata{$thiskey}!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.      (($showval!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$showval.'">'.
     &mt('Shift all dates based on this date').'</a></span>':'').      &mt('Shift all dates based on this date').'</a></span>':'').
     &date_sanity_info($$resourcedata{$thiskey})      &date_sanity_info($showval)
                     );                      );
                 }                  }
             } elsif ($thistype eq 'date_interval') {              } elsif ($thistype eq 'date_interval') {
                 $r->print(&date_interval_selector($thiskey,$name,                  $r->print(&date_interval_selector($thiskey,$name,
                         $$resourcedata{$thiskey},$readonly));                            $showval,$readonly));
             } elsif ($thistype =~ m/^string/) {              } elsif ($thistype =~ m/^string/) {
                 $r->print(&string_selector($thistype,$thiskey,                  $r->print(&string_selector($thistype,$thiskey,
                         $$resourcedata{$thiskey},$name,$readonly));                            $showval,$name,$readonly));
             } else {              } else {
                 $r->print(&default_selector($thiskey,$$resourcedata{$thiskey},$readonly));                  $r->print(&default_selector($thiskey,$showval,$readonly));
             }              }
             unless ($readonly) {              unless ($readonly) {
                 $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.                  $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                         $thistype.'" />');                          $thistype.'" />');
             }              }
             $r->print('</td>'.&Apache::loncommon::end_data_table_row());              $r->print('</td>');
               if ($is_map) {
                   if (($name eq 'encrypturl') || ($name eq 'hiddenresource')) {
                       $r->print('<td><table><tr><td>'.&mt('Yes').'</td></tr></table></td>');
                   } else {
                       my ($disabled,$recon,$recoff);
                       if ($readonly) {
                           $disabled = ' disabled="disabled"';
                       }
                       if ($is_recursive) {
                           $recon = ' checked="checked"';
                       } else {
                           $recoff = ' checked="checked"';
                       }
                       $r->print('<td><table><tr><td><label><input type="radio" name="rec_'.$thiskey.'" value="1"'.$recon.$disabled.' />'.&mt('Yes').'</label>'.
                                 '</td><td><label><input type="radio" name="rec_'.$thiskey.'" value="0"'.$recoff.$disabled.' />'.&mt('No').'</label></td></tr></table></td>');
                   }
               }
               $r->print(&Apache::loncommon::end_data_table_row());
         }          }
     }      }
     return $foundkeys;      return $foundkeys;
Line 4140  sub string_ip_selector { Line 4428  sub string_ip_selector {
         @{$access{'deny'}} = ('');          @{$access{'deny'}} = ('');
     }      }
     my ($disabled,$addmore);      my ($disabled,$addmore);
     if ($disabled) {      if ($readonly) {
         $disabled=' disabled="disabled"';          $disabled=' disabled="disabled"';
     } else {      } else {
         $addmore = "\n".'<button class="LC_add_ipacc_button">'.&mt('Add more').'</button>';          $addmore = "\n".'<button class="LC_add_ipacc_button">'.&mt('Add more').'</button>';
Line 4561  sub date_interval_selector { Line 4849  sub date_interval_selector {
                 $currprocdisplay = 'text';                  $currprocdisplay = 'text';
             }              }
             my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';              my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';
               my $disabled;
               if ($readonly) {
                   $disabled = ' disabled="disabled"';
               }
             $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').              $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').
                        '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.' />'.                         '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.$disabled.' />'.
                        &mt('No').'</label>'.('&nbsp;'x2).                         &mt('No').'</label>'.('&nbsp;'x2).
                        '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.' />'.                         '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.$disabled.' />'.
                        &mt('Yes').'</label>'.('&nbsp;'x2).                         &mt('Yes').'</label>'.('&nbsp;'x2).
                        '<label><input type="radio" value="_done_proctor" name="done_'.$thiskey.'"'.$checkedproc.$onclick.' />'.                         '<label><input type="radio" value="_done_proctor" name="done_'.$thiskey.'"'.$checkedproc.$onclick.$disabled.' />'.
                        &mt('Yes, with proctor key').'</label>'.                         &mt('Yes, with proctor key').'</label>'.
                        '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.                         '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.
                        'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'" /></span><br />'.                         'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'"'.$disabled.' /></span><br />'.
                        '<span class="LC_nobreak">'.&mt('Button text').': '.                         '<span class="LC_nobreak">'.&mt('Button text').': '.
                        '<input type="text" name="done_'.$thiskey.'_buttontext" value="'.&HTML::Entities::encode($currdonetext,'"<>&').'" /></span>';                         '<input type="text" name="done_'.$thiskey.'_buttontext" value="'.&HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></span>';
         }          }
     }      }
     unless ($readonly) {      unless ($readonly) {
Line 4705  sub dateshift { Line 4997  sub dateshift {
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @param {Apache2::RequestRec} $r - the Apache request
 sub newoverview {  sub newoverview {
     my ($r) = @_;      my ($r,$parm_permission) = @_;
   
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $crstype =  $env{'course.'.$env{'request.course.id'}.'.type'};      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',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
         text=>"Overview Mode"});          text=>"Overview Mode"});
   
Line 4868  ENDOVER Line 5164  ENDOVER
   
 # List data  # List data
   
         &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview');          &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly);
     }      }
     $r->print(&tableend().      $r->print(&tableend());
          ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').      unless ($readonly) {
           '</form>');          $r->print( ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'') );
       }
       $r->print('</form>');
     &endSettingsScreen($r);      &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
Line 4911  sub secgroup_lister { Line 5209  sub secgroup_lister {
                     my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;                      my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
                     $$listdata{$newparmkey}=1;                      $$listdata{$newparmkey}=1;
                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};                      $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                     $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(rec).'.$part.'.'.$cat;  
                     $$listdata{$newparmkey}=1;  
                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};  
                 }                  }
             } else {              } else {
 # resource-level parameter  # resource-level parameter
Line 4934  sub secgroup_lister { Line 5229  sub secgroup_lister {
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @param {Apache2::RequestRec} $r - the Apache request
 sub overview {  sub overview {
     my ($r) = @_;      my ($r,$parm_permission) = @_;
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};      my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
       my $readonly = 1;
       if ($parm_permission->{'edit'}) {
           undef($readonly);
       }
     my $js = '<script type="text/javascript">'."\n".      my $js = '<script type="text/javascript">'."\n".
              '// <![CDATA['."\n".               '// <![CDATA['."\n".
              &toggleparmtextbox_js()."\n".               &toggleparmtextbox_js()."\n".
Line 4960  sub overview { Line 5259  sub overview {
   
 # Store modified  # Store modified
   
     &storedata($r,$crs,$dom);      unless ($readonly) {
           &storedata($r,$crs,$dom);
       }
   
 # Read modified data  # Read modified data
   
Line 4971  sub overview { Line 5272  sub overview {
     unless ($sortorder) { $sortorder='realmstudent'; }      unless ($sortorder) { $sortorder='realmstudent'; }
     &sortmenu($r,$sortorder);      &sortmenu($r,$sortorder);
   
       my $submitbutton = '<input type="submit" value="'.&mt('Save').'" />';
   
       if ($readonly) {
           $r->print('<p>'.$submitbutton.'</p>');
       }
   
 # List data  # List data
   
     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist);      my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist,$readonly);
     $r->print(&tableend().'<p>'.      $r->print(&tableend().'<p>');
     ($foundkeys?'<input type="submit" value="'.&mt('Save').'" />':'<span class="LC_info">'.&mt('There are no parameters.').'</span>').'</p></form>'.      if ($foundkeys) {
           &Apache::loncommon::end_page());          unless ($readonly) {
               $r->print('<p>'.$submitbutton.'</p>');
           }
       } else {
           $r->print('<p class="LC_info">'.&mt('There are no parameters.').'</p>');
       }
       $r->print('</form>'.&Apache::loncommon::end_page());
 }  }
   
 # Unused sub.  # Unused sub.
Line 5143  sub parse_key { Line 5456  sub parse_key {
     my ($key) = @_;      my ($key) = @_;
     my %data;      my %data;
     my ($middle,$part,$name)=      my ($middle,$part,$name)=
     ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);      ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/);
     $data{'scope_type'} = 'all';      $data{'scope_type'} = 'all';
     if ($middle=~/^\[(.*)\]/) {      if ($middle=~/^\[(.*)\]/) {
         $data{'scope'} = $1;          $data{'scope'} = $1;
Line 5213  ENDMAINFORMHEAD Line 5526  ENDMAINFORMHEAD
     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});      my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     my $mgr  = &Apache::lonnet::allowed('mgr',$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 $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 '')) {      if ((!$dcm) && ($env{'request.course.sec'} ne '')) {
         $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.          $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
                                         '/'.$env{'request.course.sec'});                                          '/'.$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 =      my @menu =
         ( { categorytitle=>"Content Settings for this $crstype",          ( { categorytitle=>"Content Settings for this $crstype",
         items => [          items => [
           { linktext => 'Portfolio Metadata',            { linktext => 'Portfolio Metadata',
             url => '/adm/parmset?action=setrestrictmeta',              url => '/adm/parmset?action=setrestrictmeta',
             permission => $parm_permission,              permission => $parm_permission->{'setrestrictmeta'},
             linktitle => "Restrict metadata for this $lc_crstype." ,              linktitle => "Restrict metadata for this $lc_crstype." ,
             icon =>'contact-new.png'   ,              icon =>'contact-new.png'   ,
             },              },
           { linktext => 'Reset Student Access Times',            { linktext => $linktext{'resettimes'},
             url => '/adm/helper/resettimes.helper',              url => $url{'resettimes'},
             permission => $mgr,              permission => ($vgr || $mgr),
             linktitle => "Reset access times for folders/maps, resources or the $lc_crstype."  ,              linktitle => $linktitle{'resettimes'},
             icon => 'start-here.png'  ,              icon => 'start-here.png',
             },              },
           { linktext => 'Blocking Communication/Resource Access',            { linktext => 'Blocking Communication/Resource Access',
             url => '/adm/setblock',              url => '/adm/setblock',
             permission => $dcm,              permission => ($vcb || $dcm),
             linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam',              linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam',
             icon => 'comblock.png',              icon => 'comblock.png',
             },              },
           { linktext => 'Set Parameter Setting Default Actions',            { linktext => 'Set Parameter Setting Default Actions',
             url => '/adm/parmset?action=setdefaults',              url => '/adm/parmset?action=setdefaults',
             permission => $parm_permission,              permission => $parm_permission->{'setdefaults'},
             linktitle =>'Set default actions for parameters.'  ,              linktitle =>'Set default actions for parameters.'  ,
             icon => 'folder-new.png'  ,              icon => 'folder-new.png'  ,
             }]},              }]},
Line 5249  ENDMAINFORMHEAD Line 5600  ENDMAINFORMHEAD
         items => [          items => [
           { linktext => 'Edit Resource Parameters - Helper Mode',            { linktext => 'Edit Resource Parameters - Helper Mode',
             url => '/adm/helper/parameter.helper',              url => '/adm/helper/parameter.helper',
             permission => $parm_permission,              permission => $parm_permission->{'helper'},
             linktitle =>'Set/Modify resource parameters in helper mode.'  ,              linktitle =>'Set/Modify resource parameters in helper mode.'  ,
             icon => 'dialog-information.png'  ,              icon => 'dialog-information.png'  ,
             #help => 'Parameter_Helper',              #help => 'Parameter_Helper',
             },              },
           { linktext => 'Edit Resource Parameters - Overview Mode',            { linktext => $linktext{'newoverview'},
             url => '/adm/parmset?action=newoverview',              url => '/adm/parmset?action=newoverview',
             permission => $parm_permission,              permission => $parm_permission->{'newoverview'},
             linktitle =>'Set/Modify resource parameters in overview mode.'  ,              linktitle => $linktitle{'newoverview'},
             icon => 'edit-find.png'  ,              icon => 'edit-find.png',
             #help => 'Parameter_Overview',              #help => 'Parameter_Overview',
             },              },
           { linktext => 'Edit Resource Parameters - Table Mode',            { linktext => $linktext{'settable'},
             url => '/adm/parmset?action=settable',              url => '/adm/parmset?action=settable',
             permission => $parm_permission,              permission => $parm_permission->{'settable'},
             linktitle =>'Set/Modify resource parameters in table mode.'  ,              linktitle => $linktitle{'settable'},
             icon => 'edit-copy.png'  ,              icon => 'edit-copy.png',
             #help => 'Table_Mode',              #help => 'Table_Mode',
             }]},              }]},
            { categorytitle => 'Existing Parameter Settings for Resources',             { categorytitle => 'Existing Parameter Settings for Resources',
          items => [           items => [
           { linktext => 'Modify Resource Parameters - Overview Mode',            { linktext => $linktext{'setoverview'},
             url => '/adm/parmset?action=setoverview',              url => '/adm/parmset?action=setoverview',
             permission => $parm_permission,              permission => $parm_permission->{'setoverview'},
             linktitle =>'Set/Modify existing resource parameters in overview mode.'  ,              linktitle => $linktitle{'setoverview'},
             icon => 'preferences-desktop-wallpaper.png'  ,              icon => 'preferences-desktop-wallpaper.png',
             #help => 'Parameter_Overview',              #help => 'Parameter_Overview',
             },              },
           { linktext => 'Change Log',            { linktext => 'Change Log',
             url => '/adm/parmset?action=parameterchangelog',              url => '/adm/parmset?action=parameterchangelog',
             permission => $parm_permission,              permission => $parm_permission->{'parameterchangelog'},
             linktitle =>"View parameter and $lc_crstype blog posting/user notification change log."  ,              linktitle =>"View parameter and $lc_crstype blog posting/user notification change log."  ,
             icon => 'document-properties.png',              icon => 'document-properties.png',
             }]}              }]}
Line 5513  sub addmetafield { Line 5864  sub addmetafield {
             $r->print('<input type="submit" name="undelete" value="Undelete" />');              $r->print('<input type="submit" name="undelete" value="Undelete" />');
             $r->print('</form>');              $r->print('</form>');
         }          }
         $r->print('<hr /><strong>Or</strong> you may enter a new metadata field name.<form method="post" action="/adm/parmset?action=addmetadata"'); # FIXME: HTML error, input will not be displayed !          $r->print('<hr /><strong>Or</strong> you may enter a new metadata field name.<form method="post" action="/adm/parmset?action=addmetadata">');
         $r->print('<input type="text" name="fieldname" /><br />');          $r->print('<input type="text" name="fieldname" /><br />');
         $r->print('<input type="submit" value="Add Metadata Field" />');          $r->print('<input type="submit" value="Add Metadata Field" />');
     }      }
Line 5857  sub components { Line 6208  sub components {
     }      }
   
     my ($middle,$part,$name)=      my ($middle,$part,$name)=
         ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);          ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/);
     my $issection;      my $issection;
   
     my $section=&mt('All Students');      my $section=&mt('All Students');
Line 5917  sub load_parameter_names { Line 6268  sub load_parameter_names {
     close($config);      close($config);
     $standard_parms{'int_pos'}      = 'Positive Integer';      $standard_parms{'int_pos'}      = 'Positive Integer';
     $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';      $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
       $standard_parms{'scoreformat'}  = 'Format for display of score';
 }  }
   
 # Returns a parameter title for standard parameters, the name for others.  # Returns a parameter title for standard parameters, the name for others.
Line 5972  sub standard_parameter_levels { Line 6324  sub standard_parameter_levels {
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @param {Apache2::RequestRec} $r - the Apache request
 sub parm_change_log {  sub parm_change_log {
     my ($r)=@_;      my ($r,$parm_permission)=@_;
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}      my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
     text=>"Parameter Change Log"});      text=>"Parameter Change Log"});
     my $js = '<script type="text/javascript">'."\n".      my $js = '<script type="text/javascript">'."\n".
Line 6004  sub parm_change_log { Line 6356  sub parm_change_log {
               '<input type="submit" value="'.&mt('Display').'" />'.                '<input type="submit" value="'.&mt('Display').'" />'.
               '</form></fieldset></div><br clear="all" />');                '</form></fieldset></div><br clear="all" />');
   
       my $readonly = 1;
       if ($parm_permission->{'edit'}) {
           undef($readonly);
       }
     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);      my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().      $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
           '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.            '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
           &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.            &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th>');
           &Apache::loncommon::end_data_table_header_row());      unless ($readonly) {
           $r->print('<th>'.&mt('Announce').'</th>');
       }
       $r->print(&Apache::loncommon::end_data_table_header_row());
     my $shown=0;      my $shown=0;
     my $folder='';      my $folder='';
     if ($env{'form.displayfilter'} eq 'currentfolder') {      if ($env{'form.displayfilter'} eq 'currentfolder') {
Line 6040  sub parm_change_log { Line 6399  sub parm_change_log {
                             $parmlog{$id}{'exe_uname'},                              $parmlog{$id}{'exe_uname'},
                             $parmlog{$id}{'exe_udom'});                              $parmlog{$id}{'exe_udom'});
         my $send_msg_link='';          my $send_msg_link='';
         if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})          if ((!$readonly) && 
               (($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
             || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {              || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
             $send_msg_link ='<br />'.              $send_msg_link ='<br />'.
             &Apache::loncommon::messagewrapper(&mt('Send message'),              &Apache::loncommon::messagewrapper(&mt('Send message'),
Line 6117  sub parm_change_log { Line 6477  sub parm_change_log {
                     }                      }
                 }                  }
             }              }
             $output .= '</td><td>';              $output .= '</td>';
                   
             if ($stillactive) {              unless ($readonly) { 
                 my $parmitem = &standard_parameter_names($parmname);                  $output .= '<td>';
                 $parmitem = &mt($parmitem);                  if ($stillactive) {
                 my $title=&mt('Changed [_1]',$parmitem);                      my $parmitem = &standard_parameter_names($parmname);
                 my $description=&mt('Changed [_1] for [_2] to [_3]',                      $parmitem = &mt($parmitem);
                     $parmitem,$realmdescription,                      my $title=&mt('Changed [_1]',$parmitem);
                     (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));                      my $description=&mt('Changed [_1] for [_2] to [_3]',
                 if (($uname) && ($udom)) {                          $parmitem,$realmdescription,
                     $output .=                          (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
                     &Apache::loncommon::messagewrapper('Notify User',                      if (($uname) && ($udom)) {
                                     $uname,$udom,$title,                          $output .=
                                     $description);                          &Apache::loncommon::messagewrapper('Notify User',
                 } else {                                                             $uname,$udom,$title,
                     $output .=                                                             $description);
                     &Apache::lonrss::course_blog_link($id,$title,                      } else {
                                     $description);                          $output .=
                               &Apache::lonrss::course_blog_link($id,$title,
                                                                 $description);
                       }
                 }                  }
                   $output .= '</td>';
             }              }
             $output .= '</td>'.&Apache::loncommon::end_data_table_row();              $output .= &Apache::loncommon::end_data_table_row();
         }          }
         if ($env{'form.displayfilter'} eq 'containing') {          if ($env{'form.displayfilter'} eq 'containing') {
             my $wholeentry=$about_me_link.':'.              my $wholeentry=$about_me_link.':'.
Line 6327  sub parameter_releasecheck { Line 6691  sub parameter_releasecheck {
     return $needsnewer;      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);
   }
   
 ##################################################  ##################################################
 # HANDLER  # HANDLER
 ##################################################  ##################################################
Line 6375  sub handler { Line 6779  sub handler {
                                             'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});                                              'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
   
 # ----------------------------------------------------- Needs to be in a course  # ----------------------------------------------------- Needs to be in a course
     my $parm_permission =      my ($parm_permission,$allowed) = &get_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();      my $exists = &check_for_course_info();
   
     if ($env{'request.course.id'} &&  $parm_permission && $exists) {      if ($env{'request.course.id'} && $allowed && $exists) {
         #          #
         # Main switch on form.action and form.state, as appropriate          # Main switch on form.action and form.state, as appropriate
         #          #
         # Check first if coming from someone else headed directly for          # Check first if coming from someone else headed directly for
         #  the table mode          #  the table mode
         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})          if (($parm_permission->{'set'}) && 
                 && (!$env{'form.dis'})) || ($env{'form.symb'})) {              ((($env{'form.command'} eq 'set') && ($env{'form.url'})
             &assessparms($r);                  && (!$env{'form.dis'})) || ($env{'form.symb'}))) {
               &assessparms($r,$parm_permission);
         } elsif (! exists($env{'form.action'})) {          } elsif (! exists($env{'form.action'})) {
             &print_main_menu($r,$parm_permission);              &print_main_menu($r,$parm_permission);
           } elsif (!$parm_permission->{$env{'form.action'}}) {
               &print_main_menu($r,$parm_permission);
         } elsif ($env{'form.action'} eq 'setoverview') {          } elsif ($env{'form.action'} eq 'setoverview') {
             &overview($r);              &overview($r,$parm_permission);
         } elsif ($env{'form.action'} eq 'addmetadata') {          } elsif ($env{'form.action'} eq 'addmetadata') {
             &addmetafield($r);              &addmetafield($r);
         } elsif ($env{'form.action'} eq 'ordermetadata') {          } elsif ($env{'form.action'} eq 'ordermetadata') {
Line 6401  sub handler { Line 6805  sub handler {
         } elsif ($env{'form.action'} eq 'setrestrictmeta') {          } elsif ($env{'form.action'} eq 'setrestrictmeta') {
             &setrestrictmeta($r);              &setrestrictmeta($r);
         } elsif ($env{'form.action'} eq 'newoverview') {          } elsif ($env{'form.action'} eq 'newoverview') {
             &newoverview($r);              &newoverview($r,$parm_permission);
         } elsif ($env{'form.action'} eq 'setdefaults') {          } elsif ($env{'form.action'} eq 'setdefaults') {
             &defaultsetter($r);              &defaultsetter($r);
         } elsif ($env{'form.action'} eq 'settable') {          } elsif ($env{'form.action'} eq 'settable') {
             &assessparms($r);              &assessparms($r,$parm_permission);
         } elsif ($env{'form.action'} eq 'parameterchangelog') {          } elsif ($env{'form.action'} eq 'parameterchangelog') {
             &parm_change_log($r);              &parm_change_log($r,$parm_permission);
         } elsif ($env{'form.action'} eq 'cleanparameters') {          } elsif ($env{'form.action'} eq 'cleanparameters') {
             &clean_parameters($r);              &clean_parameters($r);
         } elsif ($env{'form.action'} eq 'dateshift1') {          } elsif ($env{'form.action'} eq 'dateshift1') {

Removed from v.1.566  
changed lines
  Added in v.1.580


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>