--- loncom/interface/lonparmset.pm 2015/04/28 13:12:46 1.549 +++ loncom/interface/lonparmset.pm 2016/03/02 14:14:06 1.556 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.549 2015/04/28 13:12:46 raeburn Exp $ +# $Id: lonparmset.pm,v 1.556 2016/03/02 14:14:06 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -54,21 +54,25 @@ Inputs: $what - a parameter spec (inclu $id - a bighash Id number $def - the resource's default value 'stupid emacs -Returns: A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 14 possible levels +Returns: A list, the first item is the index into the remaining list of items of parm values that is the active one, the list consists of parm values at the 18 possible levels -14- General Course -13- Map or Folder level in course -12- resource default -11- map default -10- resource level in course -9 - General for section -8 - Map or Folder level for section -7 - resource level in section -6 - General for group -5 - Map or Folder level for group -4 - resource level in group -3 - General for specific student -2 - Map or Folder level for specific student +18 - General Course +17 - Map or Folder level in course (recursive) +16 - Map or Folder level in course (non-recursive) +15 - resource default +14 - map default +13 - resource level in course +12 - General for section +11 - Map or Folder level for section (recursive) +10 - Map or Folder level for section (non-recursive) +9 - resource level in section +8 - General for group +7 - Map or Folder level for group (recursive) +6 - Map or Folder level for group (non-recursive) +5 - resource level in group +4 - General for specific student +3 - Map or Folder level for specific student (recursive) +2 - Map or Folder level for specific student (non-recursive) 1 - resource level for specific student =item parmval_by_symb() @@ -369,84 +373,106 @@ sub parmval_by_symb { $map = &Apache::lonnet::deversion($map); my $symbparm=$symb.'.'.$what; + my $recurseparm=$map.'___(rec).'.$what; my $mapparm=$map.'___(all).'.$what; my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what; my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm; + my $grpleveli=$env{'request.course.id'}.'.['.$cgroup.'].'.$recurseparm; my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm; my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what; my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm; + my $secleveli=$env{'request.course.id'}.'.['.$csec.'].'.$recurseparm; my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm; my $courselevel=$env{'request.course.id'}.'.'.$what; my $courselevelr=$env{'request.course.id'}.'.'.$symbparm; + my $courseleveli=$env{'request.course.id'}.'.'.$recurseparm; my $courselevelm=$env{'request.course.id'}.'.'.$mapparm; # --------------------------------------------------------- first, check course if (defined($$courseopt{$courselevel})) { - $outpar[14]=$$courseopt{$courselevel}; - $result=14; + $outpar[18]=$$courseopt{$courselevel}; + $result=18; + } + + if (defined($$courseopt{$courseleveli})) { + $outpar[17]=$$courseopt{$courseleveli}; + $result=17; } if (defined($$courseopt{$courselevelm})) { - $outpar[13]=$$courseopt{$courselevelm}; - $result=13; + $outpar[16]=$$courseopt{$courselevelm}; + $result=16; } # ------------------------------------------------------- second, check default - if (defined($def)) { $outpar[12]=$def; $result=12; } + if (defined($def)) { $outpar[15]=$def; $result=15; } # ------------------------------------------------------ third, check map parms + my $thisparm=&parmhash($symbparm); - if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; } + if (defined($thisparm)) { $outpar[14]=$thisparm; $result=14; } if (defined($$courseopt{$courselevelr})) { - $outpar[10]=$$courseopt{$courselevelr}; - $result=10; + $outpar[13]=$$courseopt{$courselevelr}; + $result=13; } # ------------------------------------------------------ fourth, back to course if ($csec ne '') { if (defined($$courseopt{$seclevel})) { - $outpar[9]=$$courseopt{$seclevel}; - $result=9; - } + $outpar[12]=$$courseopt{$seclevel}; + $result=12; + } + if (defined($$courseopt{$secleveli})) { + $outpar[11]=$$courseopt{$secleveli}; + $result=11; + } if (defined($$courseopt{$seclevelm})) { - $outpar[8]=$$courseopt{$seclevelm}; - $result=8; - } - + $outpar[10]=$$courseopt{$seclevelm}; + $result=10; + } if (defined($$courseopt{$seclevelr})) { - $outpar[7]=$$courseopt{$seclevelr}; - $result=7; - } + $outpar[9]=$$courseopt{$seclevelr}; + $result=9; + } } # ------------------------------------------------------ fifth, check course group if ($cgroup ne '') { if (defined($$courseopt{$grplevel})) { - $outpar[6]=$$courseopt{$grplevel}; - $result=6; + $outpar[8]=$$courseopt{$grplevel}; + $result=8; + } + if (defined($$courseopt{$grpleveli})) { + $outpar[7]=$$courseopt{$grpleveli}; + $result=7; } if (defined($$courseopt{$grplevelm})) { - $outpar[5]=$$courseopt{$grplevelm}; - $result=5; + $outpar[6]=$$courseopt{$grplevelm}; + $result=6; } if (defined($$courseopt{$grplevelr})) { - $outpar[4]=$$courseopt{$grplevelr}; - $result=4; + $outpar[5]=$$courseopt{$grplevelr}; + $result=5; } } -# ---------------------------------------------------------- fifth, check user +# ---------------------------------------------------------- sixth, check user if ($uname ne '') { if (defined($$useropt{$courselevel})) { - $outpar[3]=$$useropt{$courselevel}; + $outpar[4]=$$useropt{$courselevel}; + $result=4; + } + + if (defined($$useropt{$courseleveli})) { + $outpar[3]=$$useropt{$courseleveli}; $result=3; } @@ -686,30 +712,37 @@ sub storeparm_by_symb_inner { $map = &Apache::lonnet::deversion($map); my $symbparm=$symb.'.'.$spnam; + my $recurseparm=$map.'___(rec).'.$spnam; my $mapparm=$map.'___(all).'.$spnam; my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam; my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm; + my $grpleveli=$env{'request.course.id'}.'.['.$cgroup.'].'.$recurseparm; my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm; my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam; my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm; + my $secleveli=$env{'request.course.id'}.'.['.$csec.'].'.$recurseparm; my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm; my $courselevel=$env{'request.course.id'}.'.'.$spnam; my $courselevelr=$env{'request.course.id'}.'.'.$symbparm; + my $courseleveli=$env{'request.course.id'}.'.'.$recurseparm; my $courselevelm=$env{'request.course.id'}.'.'.$mapparm; my $storeunder=''; - if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; } - if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; } - if (($snum==10) || ($snum==1)) { $storeunder=$courselevelr; } - if ($snum==9) { $storeunder=$seclevel; } - if ($snum==8) { $storeunder=$seclevelm; } - if ($snum==7) { $storeunder=$seclevelr; } - if ($snum==6) { $storeunder=$grplevel; } - if ($snum==5) { $storeunder=$grplevelm; } - if ($snum==4) { $storeunder=$grplevelr; } + if (($snum==18) || ($snum==4)) { $storeunder=$courselevel; } + if (($snum==17) || ($snum==3)) { $storeunder=$courseleveli; } + if (($snum==16) || ($snum==2)) { $storeunder=$courselevelm; } + if (($snum==13) || ($snum==1)) { $storeunder=$courselevelr; } + if ($snum==12) { $storeunder=$seclevel; } + if ($snum==11) { $storeunder=$secleveli; } + if ($snum==10) { $storeunder=$seclevelm; } + if ($snum==9) { $storeunder=$seclevelr; } + if ($snum==8) { $storeunder=$grplevel; } + if ($snum==7) { $storeunder=$grpleveli; } + if ($snum==6) { $storeunder=$grplevelm; } + if ($snum==5) { $storeunder=$grplevelr; } my $delete; @@ -717,16 +750,17 @@ sub storeparm_by_symb_inner { my %storecontent = ($storeunder => $nval, $storeunder.'.type' => $ntype); my $reply=''; - if ($snum>3) { + if ($snum>4) { # ---------------------------------------------------------------- Store Course # my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; # Expire sheets &Apache::lonnet::expirespread('','','studentcalc'); - if (($snum==10) || ($snum==7) || ($snum==4)) { + if (($snum==13) || ($snum==9) || ($snum==5)) { &Apache::lonnet::expirespread('','','assesscalc',$symb); - } elsif (($snum==11) || ($snum==8) || ($snum==5)) { +#FIXME + } elsif (($snum==14) || ($snum==10) || ($snum==6)) { &Apache::lonnet::expirespread('','','assesscalc',$map); } else { &Apache::lonnet::expirespread('','','assesscalc'); @@ -777,7 +811,7 @@ sub storeparm_by_symb_inner { sub valout { - my ($value,$type,$editable)=@_; + my ($value,$type,$name,$editable)=@_; my $result = ''; # Values of zero are valid. if (! $value && $value ne '0') { @@ -791,7 +825,8 @@ sub valout { } } else { if ($type eq 'date_interval') { - my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value); + my ($totalsecs,$donebutton) = split(/_/,$value); + my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs); my @timer; $year=$year-70; $mday--; @@ -824,6 +859,9 @@ sub valout { push(@timer,&mt('[quant,_1,sec]',0)); } $result.=join(", ",@timer); + if ($donebutton eq 'done') { + $result .= ' '.&mt('+ "done"'); + } } elsif (&isdateparm($type)) { $result = &Apache::lonlocal::locallocaltime($value). &date_sanity_info($value); @@ -850,7 +888,7 @@ sub plink { my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/); my ($hour,$min,$sec,$val)=&preset_defaults($parmname); unless (defined($winvalue)) { $winvalue=$val; } - my $valout = &valout($value,$type,1); + my $valout = &valout($value,$type,$parmname,1); my $unencmarker = $marker; foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call, \$hour, \$min, \$sec) { @@ -1076,7 +1114,7 @@ sub ipacc_boxes_js { e.preventDefault(); var identifier = \$(this).closest("div").attr("id"); identifier = identifier.replace(ipaccRegExp,''); - \$(this).closest('div').find('.LC_string_ipacc_inner').append('
$remove
'); + \$(this).closest('div').find('.LC_string_ipacc_inner').append('
$remove
'); }); \$(wrapper).delegate(".LC_remove_ipacc","click", function(e){ @@ -1138,10 +1176,11 @@ ENDHEAD sub print_row { my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone, - $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_; + $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp)=@_; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); + # get the values for the parameter in cascading order # empty levels will remain empty my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which}, @@ -1153,7 +1192,7 @@ sub print_row { $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt); # cascade down manually my $cascadetype=$$defaulttype{$which}; - for (my $i=14;$i>0;$i--) { + for (my $i=18;$i>0;$i--) { if ($typeoutpar[$i]) { $cascadetype=$typeoutpar[$i]; } else { @@ -1177,29 +1216,32 @@ sub print_row { my $thismarker=$which; $thismarker=~s/^parameter\_//; my $mprefix=$rid.'&'.$thismarker.'&'; - my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]); + my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker); my ($othergrp,$grp_parm,$controlgrp); if ($parmlev eq 'general') { if ($uname) { - &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } elsif ($cgroup) { - &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); } elsif ($csec) { - &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } else { - &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } } elsif ($parmlev eq 'map') { - if ($uname) { - &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } elsif ($cgroup) { - &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); + &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); } elsif ($csec) { - &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } else { - &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } } else { if ($uname) { @@ -1208,7 +1250,7 @@ sub print_row { ($coursereply,$othergrp,$grp_parm,$controlgrp) = &print_usergroups($r,$$part{$which}.'.'.$$name{$which}, $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt); - if ($coursereply && $result > 3) { + if ($coursereply && $result > 4) { if (defined($controlgrp)) { if ($cgroup ne $controlgrp) { $effective_parm = $grp_parm; @@ -1219,28 +1261,32 @@ sub print_row { } } - &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); - &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); - &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); - &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); if ($csec) { + &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); - &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); - &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } if ($cgroup) { - &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); - &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); - &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); + &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); + &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); + &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); } if ($uname) { if ($othergrp) { $r->print($othergrp); } + &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); @@ -1255,7 +1301,7 @@ sub print_row { my $sessionvaltype=$typeoutpar[$result]; if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; } $r->print(''. - &valout($sessionval,$sessionvaltype).' '. + &valout($sessionval,$sessionvaltype,$$name{$which}).' '. ''); } $r->print(''); @@ -1263,14 +1309,20 @@ sub print_row { } sub print_td { - my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_; + my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_; $r->print(''); my $nolink = 0; - if ($which == 11 || $which == 12) { + if ($which == 14 || $which == 15) { + $nolink = 1; + } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) { $nolink = 1; + } elsif ($which == 5 || $which == 6 || $which == 7 || $which == 8) { + if ($noeditgrp) { + $nolink = 1; + } } elsif ($mprefix =~ /availablestudent\&$/) { - if ($which > 3) { + if ($which > 4) { $nolink = 1; } } elsif ($mprefix =~ /examcode\&$/) { @@ -1279,7 +1331,7 @@ sub print_td { } } if ($nolink) { - $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); + $r->print(&valout($$outpar[$which],$$typeoutpar[$which],$mprefix)); } else { $r->print(&plink($$typeoutpar[$which], $$display{$value},$$outpar[$which], @@ -1295,18 +1347,19 @@ sub print_usergroups { my $symb = &symbcache($rid); my $symbparm=$symb.'.'.$what; my $map=(&Apache::lonnet::decode_symb($symb))[0]; + my $recurseparm=$map.'___(rec).'.$what; my $mapparm=$map.'___(all).'.$what; my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) = - &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,$what, - $courseopt); + &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm, + $recurseparm,$what,$courseopt); my $bgcolor = $defbg; my $grp_parm; if (($coursereply) && ($cgroup ne $resultgroup)) { if ($result > 3) { $bgcolor = '#AAFFAA'; - $grp_parm = &valout($coursereply,$resulttype); + $grp_parm = &valout($coursereply,$resulttype,$what); } - $grp_parm = &valout($coursereply,$resulttype); + $grp_parm = &valout($coursereply,$resulttype,$what); $output = ''; if ($resultgroup && $resultlevel) { $output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm; @@ -1321,11 +1374,11 @@ sub print_usergroups { } sub parm_control_group { - my ($courseid,$usersgroups,$symbparm,$mapparm,$what,$courseopt) = @_; + my ($courseid,$usersgroups,$symbparm,$mapparm,$recurseparm,$what,$courseopt) = @_; my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype); my $grpfound = 0; - my @levels = ($symbparm,$mapparm,$what); - my @levelnames = ('resource','map/folder','general'); + my @levels = ($symbparm,$mapparm,$recurseparm,$what); + my @levelnames = ('resource','map/folder','recursive','general'); foreach my $group (@{$usersgroups}) { if ($grpfound) { last; } for (my $i=0; $i<@levels; $i++) { @@ -1435,7 +1488,9 @@ sub extractResourceInformation { $$maptitles{$mapid}=&Apache::lonnet::gettitle($$mapp{$id}); } $$maptitles{$$mapp{$id}}=$$maptitles{$mapid}; - $$symbp{$mapid}=$$mapp{$id}.'___(all)'; + $$symbp{$mapid}=$$mapp{$id}.'___(all)'; # Added in rev. 1.57, but seems not to be used. + # Lines 1038 and 1114 which use $symbp{$mapid} + # are commented out in rev. 1.57 } else { $$mapp{$id} = $$mapp{$mapid}; } @@ -1754,7 +1809,7 @@ sub partmenu { } sub usermenu { - my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups)=@_; + my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups,$pssymb)=@_; my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '. &Apache::loncommon::selectstudent_link('parmform','uname','udom'); my $selscript=&Apache::loncommon::studentbrowser_javascript(); @@ -1763,12 +1818,23 @@ sub usermenu { my %sectionhash = &Apache::loncommon::get_sections(); my $groups; - my %grouphash = &Apache::longroup::coursegroups(); + my %grouphash; + if (($pssymb) || &Apache::lonnet::allowed('mdg',$env{'request.course.id'})) { + %grouphash = &Apache::longroup::coursegroups(); + } elsif ($env{'request.course.groups'} ne '') { + map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'}); + } my $g_s_header=''; my $g_s_footer=''; - if (%sectionhash) { + my $currsec = $env{'request.course.sec'}; + if ($currsec) { + $sections=&mt('Section:').' '.$currsec; + if (%grouphash) { + $sections .= ';'.(' ' x2); + } + } elsif (%sectionhash && $currsec eq '') { $sections=&mt('Section:').' print(&Apache::lonhtmlcommon::row_title(&mt('Group/Section'))); $r->print($sections.$groups); $r->print(&Apache::lonhtmlcommon::row_closure()); + } else { + $r->print($sections); } $r->print(&Apache::lonhtmlcommon::row_title(&mt('User'))); @@ -2040,44 +2108,52 @@ sub levelmenu { sub sectionmenu { - my ($r,$selectedsections)=@_; + my ($selectedsections)=@_; my %sectionhash = &Apache::loncommon::get_sections(); - return if (!%sectionhash); + return '' if (!%sectionhash); - $r->print(''; + foreach my $s (@possibles) { + $output .= ' \n"); + $output .= '>'."$s\n"; } - $r->print("\n"); + $output .= "\n"; + return $output; } sub groupmenu { - my ($r,$selectedgroups)=@_; - my %grouphash = &Apache::longroup::coursegroups(); - return if (!%grouphash); + my ($selectedgroups)=@_; + my %grouphash; + if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) { + %grouphash = &Apache::longroup::coursegroups(); + } elsif ($env{'request.course.groups'} ne '') { + map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'}); + } + return '' if (!%grouphash); - $r->print(''; foreach my $group (sort(keys(%grouphash))) { - $r->print(' \n"); + $output .= '>'."$group\n"; } - $r->print("\n"); + $output .= "\n"; + return $output; } - sub keysplit { my $keyp=shift; return (split(/\,/,$keyp)); @@ -2197,7 +2273,21 @@ sub assessparms { my $message=''; $csec=$env{'form.csec'}; + if ($env{'request.course.sec'} ne '') { + $csec = $env{'request.course.sec'}; + } + +# Check group privs. $cgroup=$env{'form.cgroup'}; + my $noeditgrp; + if ($cgroup ne '') { + unless (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) { + if (($env{'request.course.groups'} eq '') || + (!grep(/^\Q$cgroup\E$/,split(/,/,$env{'request.course.groups'})))) { + $noeditgrp = 1; + } + } + } if ($udom=$env{'form.udom'}) { } elsif ($udom=$env{'request.role.domain'}) { @@ -2245,7 +2335,7 @@ sub assessparms { my $id=$env{'form.id'}; if (($id) && ($udom)) { - $uname=(&Apache::lonnet::idget($udom,$id))[1]; + $uname=(&Apache::lonnet::idget($udom,[$id],'ids'))[1]; if ($uname) { $id=''; } else { @@ -2323,7 +2413,13 @@ sub assessparms { my $now = time; for (my $i=0;$i<=$#markers;$i++) { my ($needsrelease,$needsnewer,$name); - if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) { + if (($env{'request.course.sec'} ne '') && ($markers[$i] =~ /\&(9|10|11|12)$/)) { + next if ($csec ne $env{'request.course.sec'}); + } + if ($markers[$i] =~ /\&(8|7|6|5)$/) { + next if ($noeditgrp); + } + if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3|4)$/) { my (@ok_slots,@fail_slots,@del_slots); my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); my ($level,@all) = @@ -2353,7 +2449,7 @@ sub assessparms { } } } - } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote|examcode|printstartdate|printenddate|acc)\&\d+$/) { + } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote|examcode|printstartdate|printenddate|acc|interval)\&\d+$/) { $name = $1; my $val = $values[$i]; my $valmatch = ''; @@ -2390,6 +2486,23 @@ sub assessparms { } } } + } elsif ($name eq 'interval') { + my $intervaltype = &get_intervaltype($name); + my $intervalmatch = &standard_interval_matches($intervaltype); + if (ref($intervalmatch) eq 'ARRAY') { + foreach my $item (@{$intervalmatch}) { + if (ref($item) eq 'ARRAY') { + my ($regexpname,$pattern) = @{$item}; + if ($pattern ne '') { + if ($val =~ /$pattern/) { + $valmatch = $regexpname; + $val = ''; + last; + } + } + } + } + } } $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$val:$valmatch"}; @@ -2486,7 +2599,7 @@ ENDPARMSELSCRIPT # Step 3 $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3')); $r->print(&Apache::lonhtmlcommon::start_pick_box()); - &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups); + &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb); $r->print(&Apache::lonhtmlcommon::row_closure(1)); $r->print(&Apache::lonhtmlcommon::end_pick_box()); @@ -2518,7 +2631,7 @@ ENDPARMSELSCRIPT '
'); $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)'))); $r->print(&Apache::lonhtmlcommon::start_pick_box()); - &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups); + &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb); $r->print(&Apache::lonhtmlcommon::row_closure(1)); $r->print(&Apache::lonhtmlcommon::end_pick_box()); $r->print('

' @@ -2553,10 +2666,10 @@ ENDPARMSELSCRIPT # # This produces the cascading table output of parameters # - my $coursespan=$csec?8:5; - my $userspan=3; + my $coursespan=$csec?10:6; + my $userspan=4; if ($cgroup ne '') { - $coursespan += 3; + $coursespan += 4; } $r->print(&Apache::loncommon::start_data_table()); @@ -2586,43 +2699,44 @@ ENDPARMSELSCRIPT 'femof' => 'from Enclosing Map or Folder', 'gen' => 'general', 'foremf' => 'for Enclosing Map or Folder', + 'formfr' => 'for Map or Folder (recursive)', 'fr' => 'for Resource' ); $r->print(<$lt{'pie'} $lt{'csv'}
($csuname:$csudom) -$lt{'ic'}$lt{'rl'} +$lt{'ic'}$lt{'rl'} $lt{'ic'} ENDTABLETWO if ($csec) { - $r->print(''. + $r->print(''. &mt("in Section")." $csec"); } if ($cgroup) { - $r->print(''. + $r->print(''. &mt("in Group")." $cgroup"); } $r->print(<$lt{'aut'}$lt{'type'} $lt{'emof'}$lt{'part'}$lt{'pn'} -$lt{'gen'}$lt{'foremf'} +$lt{'gen'}$lt{'formfr'}$lt{'foremf'} $lt{'def'}$lt{'femof'}$lt{'fr'} ENDTABLEHEADFOUR if ($csec) { - $r->print(''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').''); + $r->print(''.$lt{'gen'}.''.$lt{'formfr'}.''.$lt{'foremf'}.''.$lt{'fr'}.''); } if ($cgroup) { - $r->print(''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').''); + $r->print(''.$lt{'gen'}.''.$lt{'formfr'}.''.&mt('foremf').''.$lt{'fr'}.''); } if ($uname) { - if (@usersgroups > 1) { - $r->print(''.&mt('Control by other group?').''); + if (@usersgroups > 1) { + $r->print(''.&mt('Control by other group?').''); } - $r->print(''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').''); + $r->print(''.$lt{'gen'}.''.$lt{'formfr'}.''.$lt{'foremf'}.''.$lt{'fr'}.''); } $r->print(''); @@ -2730,7 +2844,7 @@ ENDTABLEHEADFOUR &print_row($r,$item,\%part,\%name,\%symbp,$rid,\%default, \%type,\%display,$defbgone,$defbgtwo, $defbgthree,$parmlev,$uname,$udom,$csec, - $cgroup,\@usersgroups); + $cgroup,\@usersgroups,$noeditgrp); } } } @@ -2843,7 +2957,8 @@ ENDTABLEHEADFOUR $r->print('

'.&Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row() .''.&mt('Parameter Name').'' - .''.&mt('Default Value').'' + .''.&mt('Recursive Value').'' + .''.&mt('Non-Recursive Value').'' .''.&mt('Parameter in Effect').'' .&Apache::loncommon::end_data_table_header_row() ); @@ -2852,7 +2967,7 @@ ENDTABLEHEADFOUR $r->print(&Apache::loncommon::start_data_table_row()); &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default, \%type,\%display,$defbgone,$defbgtwo,$defbgthree, - $parmlev,$uname,$udom,$csec,$cgroup); + $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp); } $r->print(&Apache::loncommon::end_data_table().'

' .'' @@ -2942,7 +3057,7 @@ ENDMAPONE $r->print(&Apache::loncommon::start_data_table_row()); &print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default, \%type,\%display,$defbgone,$defbgtwo,$defbgthree, - $parmlev,$uname,$udom,$csec,$cgroup); + $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp); } $r->print(&Apache::loncommon::end_data_table() .'

' @@ -2961,12 +3076,19 @@ ENDMAPONE my $tableopen; sub tablestart { + my ($readonly) = @_; if ($tableopen) { - return ''; + return ''; } else { - $tableopen=1; - return &Apache::loncommon::start_data_table().''.&mt('Parameter').''. - &mt('Delete').''.&mt('Set to ...').''; + $tableopen=1; + my $output = &Apache::loncommon::start_data_table().''.&mt('Parameter').''; + if ($readonly) { + $output .= ''.&mt('Current value').''; + } else { + $output .= ''.&mt('Delete').''.&mt('Set to ...').''; + } + $output .= ''; + return $output; } } @@ -2999,7 +3121,11 @@ sub readdata { } } } - return $resourcedata; + if (wantarray) { + return ($resourcedata,$classlist); + } else { + return $resourcedata; + } } @@ -3086,6 +3212,25 @@ sub storedata { } } elsif ($cmd eq 'dateinterval') { $data=&get_date_interval_from_form($thiskey); + if ($thiskey =~ /\.interval$/) { + $name = 'interval'; + my $intervaltype = &get_intervaltype($name); + my $intervalmatch = &standard_interval_matches($intervaltype); + if (ref($intervalmatch) eq 'ARRAY') { + foreach my $item (@{$intervalmatch}) { + if (ref($item) eq 'ARRAY') { + my ($regexpname,$pattern) = @{$item}; + if ($pattern ne '') { + if ($data =~ /$pattern/) { + $valmatch = $regexpname; + $valchk = ''; + last; + } + } + } + } + } + } $typeof=$env{'form.typeof_'.$thiskey}; $text = &mt('Saved modified date for'); } @@ -3195,7 +3340,8 @@ sub parse_listdata_key { } sub listdata { - my ($r,$resourcedata,$listdata,$sortorder)=@_; + my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist)=@_; + # Start list output my $oldsection=''; @@ -3206,6 +3352,16 @@ sub listdata { my $foundkeys=0; my %keyorder=&standardkeyorder(); + my ($secidx,%grouphash); + if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) { + $secidx = &Apache::loncoursedata::CL_SECTION(); + if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) { + %grouphash = &Apache::longroup::coursegroups(); + } elsif ($env{'request.course.groups'} ne '') { + map { $grouphash{$_} = 1; } split(/,/,$env{'request.course.groups'}); + } + } + foreach my $thiskey (sort { my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata); my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata); @@ -3247,28 +3403,55 @@ sub listdata { $result; } keys(%{$listdata})) { + my $readonly; if ($$listdata{$thiskey.'.type'}) { - my $thistype=$$listdata{$thiskey.'.type'}; - if ($$resourcedata{$thiskey.'.type'}) { - $thistype=$$resourcedata{$thiskey.'.type'}; + my $thistype=$$listdata{$thiskey.'.type'}; + if ($$resourcedata{$thiskey.'.type'}) { + $thistype=$$resourcedata{$thiskey.'.type'}; } my ($middle,$part,$name)= ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); my $section=&mt('All Students'); if ($middle=~/^\[(.*)\]/) { - my $issection=$1; - if ($issection=~/^useropt\:($match_username)\:($match_domain)/) { - $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2); - } else { - $section=&mt('Group/Section').': '.$issection; - } - $middle=~s/^\[(.*)\]//; + my $issection=$1; + if ($issection=~/^useropt\:($match_username)\:($match_domain)/) { + my ($stuname,$studom) = ($1,$2); + if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) { + if (ref($classlist) eq 'HASH') { + if (ref($classlist->{$stuname.':'.$studom}) eq 'ARRAY') { + next unless ($classlist->{$stuname.':'.$studom}->[$secidx] eq $env{'request.course.sec'}); + } + } + } + $section=&mt('User').": ".&Apache::loncommon::plainname($stuname,$studom); + } else { + if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) { + if (exists($grouphash{$issection})) { + $section=&mt('Group').': '.$issection; + } elsif ($issection eq $env{'request.course.sec'}) { + $section = &mt('Section').': '.$issection; + } else { + next; + } + } else { + $section=&mt('Group/Section').': '.$issection; + } + } + $middle=~s/^\[(.*)\]//; + } elsif (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) { + $readonly = 1; } $middle=~s/\.+$//; $middle=~s/^\.+//; my $realm=''.&mt('All Resources').''; - if ($middle=~/^(.+)\_\_\_\(all\)$/) { - $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).'
('.$1.')
'; + if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) { + my $mapurl = $1; + my $maplevel = $2; + my $leveltitle = &mt('Folder/Map'); + if ($maplevel eq 'rec') { + $leveltitle = &mt('Recursive'); + } + $realm=''.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).'
('.$mapurl.')
'; } elsif ($middle) { my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle); $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).'
('.$url.' in '.$map.' id: '.$id.')
'; @@ -3305,64 +3488,55 @@ sub listdata { # Ready to print # my $parmitem = &standard_parameter_names($name); - $r->print(&tablestart(). + $r->print(&tablestart($readonly). &Apache::loncommon::start_data_table_row(). ''.&mt($parmitem). - ''); + ''); + unless ($readonly) { + $r->print(''); + } + $r->print(''); $foundkeys++; if (&isdateparm($thistype)) { - my $jskey='key_'.$pointer; - $pointer++; - $r->print( - &Apache::lonhtmlcommon::date_setter('parmform', - $jskey, - $$resourcedata{$thiskey}, - '',1,'',''). + my $jskey='key_'.$pointer; + my $state; + $pointer++; + if ($readonly) { + $state = 'disabled'; + } + $r->print( + &Apache::lonhtmlcommon::date_setter('parmform', + $jskey, + $$resourcedata{$thiskey}, + '',1,$state)); + unless ($readonly) { + $r->print( ''. (($$resourcedata{$thiskey}!=0)?''. &mt('Shift all dates based on this date').'':''). &date_sanity_info($$resourcedata{$thiskey}) - ); + ); + } } elsif ($thistype eq 'date_interval') { - $r->print(&date_interval_selector($thiskey, - $$resourcedata{$thiskey})); + $r->print(&date_interval_selector($thiskey,$name, + $$resourcedata{$thiskey},$readonly)); } elsif ($thistype =~ m/^string/) { - $r->print(&string_selector($thistype,$thiskey, - $$resourcedata{$thiskey},$name)); + $r->print(&string_selector($thistype,$thiskey, + $$resourcedata{$thiskey},$name,$readonly)); } else { - $r->print(&default_selector($thiskey,$$resourcedata{$thiskey})); + $r->print(&default_selector($thiskey,$$resourcedata{$thiskey},$readonly)); + } + unless ($readonly) { + $r->print(''); } - $r->print(''); $r->print(''.&Apache::loncommon::end_data_table_row()); } } return $foundkeys; } - -sub date_interval_selector { - my ($thiskey, $showval) = @_; - my $result; - foreach my $which (['days', 86400, 31], - ['hours', 3600, 23], - ['minutes', 60, 59], - ['seconds', 1, 59]) { - my ($name, $factor, $max) = @{ $which }; - my $amount = int($showval/$factor); - $showval %= $factor; - my %select = ((map {$_ => $_} (0..$max)), - 'select_form_order' => [0..$max]); - $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey, - \%select); - $result .= ' '.&mt($name); - } - $result .= ''; - return $result; - -} - sub get_date_interval_from_form { my ($key) = @_; my $seconds = 0; @@ -3375,17 +3549,24 @@ sub get_date_interval_from_form { $seconds += $env{'form.'.$name.'_'.$key} * $factor; } } + if (($key =~ /\.interval$/) && ($env{'form.done_'.$key} eq '_done')) { + $seconds .= $env{'form.done_'.$key}; + } return $seconds; } sub default_selector { - my ($thiskey, $showval) = @_; - return ''; + my ($thiskey, $showval, $readonly) = @_; + my $disabled; + if ($readonly) { + $disabled = ' disabled="disabled"'; + } + return ''; } sub string_ip_selector { - my ($thiskey, $showval) = @_; + my ($thiskey, $showval, $readonly) = @_; my %access = ( allow => [], deny => [], @@ -3411,6 +3592,12 @@ sub string_ip_selector { if (!@{$access{'deny'}}) { @{$access{'deny'}} = (''); } + my ($disabled,$addmore); + if ($disabled) { + $disabled=' disabled="disabled"'; + } else { + $addmore = "\n".''; + } my $output = ' '; foreach my $acctype ('allow','deny') { @@ -3420,7 +3607,7 @@ sub string_ip_selector {
'."\n"; my $num = 0; foreach my $curr (@{$access{$acctype}}) { - $output .= '
'; + $output .= '
'; if ($num > 0) { $output .= ''.&mt('Remove').''; } @@ -3428,8 +3615,7 @@ sub string_ip_selector { $num ++; } $output .= ' -
- +
'.$addmore.'
'; } @@ -3515,10 +3701,10 @@ sub get_stringtype { } sub string_selector { - my ($thistype, $thiskey, $showval, $name) = @_; + my ($thistype, $thiskey, $showval, $name, $readonly) = @_; if (!exists($strings{$thistype})) { - return &default_selector($thiskey,$showval); + return &default_selector($thiskey,$showval,$readonly); } my %skiptype; @@ -3563,10 +3749,14 @@ sub string_selector { } if ($thistype eq 'string_ip') { - return &string_ip_selector($thiskey,$showval); + return &string_ip_selector($thiskey,$showval,$readonly); } - my $result; + my ($result,$disabled); + + if ($readonly) { + $disabled = ' disabled="disabled"'; + } my $numinrow = 3; if ($thistype eq 'string_problemstatus') { $numinrow = 2; @@ -3631,7 +3821,7 @@ sub string_selector { foreach my $reltype ('corrchkd','corrunchkd','incorrchkd','incorrunchkd') { $add .= ''."\n". ''; } $add .= '
'.&mt('Allow from').''.&mt('Deny from').'
 '.$relatives{$reltype}.''. + ' value="'.$textval{$reltype}.'" size="3"'.$disabled.' />'. '
'."\n"; @@ -3642,7 +3832,7 @@ sub string_selector { $result .= ''. '