--- loncom/interface/lonparmset.pm 2017/04/02 13:39:05 1.522.2.23 +++ loncom/interface/lonparmset.pm 2016/07/12 20:30:20 1.560 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.522.2.23 2017/04/02 13:39:05 raeburn Exp $ +# $Id: lonparmset.pm,v 1.560 2016/07/12 20:30:20 damieng Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,7 +36,11 @@ lonparmset - Handler to set parameters f =head1 SYNOPSIS -lonparmset provides an interface to setting course parameters. +lonparmset provides an interface to setting course parameters. + +It contains all the code for the "Content and Problem Settings" UI, except +for the helpers parameter.helper and resettimes.helper, and lonhelper.pm, +and lonblockingmenu.pm. =head1 DESCRIPTION @@ -54,21 +58,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() @@ -149,7 +157,7 @@ Input: See list below =back -Outputs: See list below +Outputs: See list below: =over 4 @@ -323,6 +331,42 @@ use HTML::Entities; use LONCAPA qw(:DEFAULT :match); +################################################## +# CONTENT AND PROBLEM SETTINGS HTML PAGE HEADER/FOOTER +################################################## + +# Page header +sub startSettingsScreen { + my ($r,$mode,$crstype)=@_; + + my $tabtext = &mt('Course Settings'); + if ($crstype eq 'Community') { + $tabtext = &mt('Community Settings'); + } + $r->print("\n".''."\n"); + $r->print('
'); +} + +# Page footer +sub endSettingsScreen { + my ($r)=@_; + $r->print('
'); +} + + + +################################################## +# TABLE MODE +# (parmval is also used for the log of parameter changes) +################################################## + sub parmval { my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_; return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec, @@ -344,84 +388,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; } @@ -453,74 +519,74 @@ sub reset_caches { my $parmhashid; my %parmhash; sub resetparmhash { - undef($parmhashid); - undef(%parmhash); + undef($parmhashid); + undef(%parmhash); } sub cacheparmhash { - if ($parmhashid eq $env{'request.course.fn'}) { return; } - my %parmhashfile; - if (tie(%parmhashfile,'GDBM_File', - $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) { - %parmhash=%parmhashfile; - untie(%parmhashfile); - $parmhashid=$env{'request.course.fn'}; - } + if ($parmhashid eq $env{'request.course.fn'}) { return; } + my %parmhashfile; + if (tie(%parmhashfile,'GDBM_File', + $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) { + %parmhash=%parmhashfile; + untie(%parmhashfile); + $parmhashid=$env{'request.course.fn'}; + } } sub parmhash { - my ($id) = @_; - &cacheparmhash(); - return $parmhash{$id}; + my ($id) = @_; + &cacheparmhash(); + return $parmhash{$id}; } - } +} { my $symbsid; my %symbs; sub resetsymbcache { - undef($symbsid); - undef(%symbs); + undef($symbsid); + undef(%symbs); } sub symbcache { - my $id=shift; - if ($symbsid ne $env{'request.course.id'}) { - undef(%symbs); - } - if (!$symbs{$id}) { - my $navmap = Apache::lonnavmaps::navmap->new(); - if ($id=~/\./) { - my $resource=$navmap->getById($id); - $symbs{$id}=$resource->symb(); - } else { - my $resource=$navmap->getByMapPc($id); - $symbs{$id}=&Apache::lonnet::declutter($resource->src()); + my $id=shift; + if ($symbsid ne $env{'request.course.id'}) { + undef(%symbs); + } + if (!$symbs{$id}) { + my $navmap = Apache::lonnavmaps::navmap->new(); + if ($id=~/\./) { + my $resource=$navmap->getById($id); + $symbs{$id}=$resource->symb(); + } else { + my $resource=$navmap->getByMapPc($id); + $symbs{$id}=&Apache::lonnet::declutter($resource->src()); + } + $symbsid=$env{'request.course.id'}; } - $symbsid=$env{'request.course.id'}; - } - return $symbs{$id}; + return $symbs{$id}; } - } +} { my $rulesid; my %rules; sub resetrulescache { - undef($rulesid); - undef(%rules); + undef($rulesid); + undef(%rules); } sub rulescache { - my $id=shift; - if ($rulesid ne $env{'request.course.id'} - && !defined($rules{$id})) { - my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; - %rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs); - $rulesid=$env{'request.course.id'}; - } - return $rules{$id}; + my $id=shift; + if ($rulesid ne $env{'request.course.id'} + && !defined($rules{$id})) { + my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + %rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs); + $rulesid=$env{'request.course.id'}; + } + return $rules{$id}; } } @@ -529,14 +595,14 @@ sub reset_caches { sub preset_defaults { my $type=shift; if (&rulescache($type.'_action') eq 'default') { -# yes, there is something - return (&rulescache($type.'_hours'), - &rulescache($type.'_min'), - &rulescache($type.'_sec'), - &rulescache($type.'_value')); + # yes, there is something + return (&rulescache($type.'_hours'), + &rulescache($type.'_min'), + &rulescache($type.'_sec'), + &rulescache($type.'_value')); } else { -# nothing there or something else - return ('','','','',''); + # nothing there or something else + return ('','','','',''); } } @@ -600,50 +666,51 @@ my %recstack; sub storeparm_by_symb { my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_; unless ($recflag) { -# first time call - %recstack=(); - $recflag=1; + # first time call + %recstack=(); + $recflag=1; } -# store parameter + # store parameter &storeparm_by_symb_inner ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup); -# don't do anything if parameter was reset + # don't do anything if parameter was reset unless ($nval) { return; } my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/); -# remember that this was set + # remember that this was set $recstack{$parm}=1; -# what does this trigger? + # what does this trigger? foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) { -# don't backfire - unless ((!$triggered) || ($recstack{$triggered})) { - my $action=&rulescache($triggered.'_action'); - my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/); -# set triggered parameter on same level - my $newspnam=$prefix.$triggered; - my $newvalue=''; - my $active=1; - if ($action=~/^when\_setting/) { -# are there restrictions? - if (&rulescache($triggered.'_triggervalue')=~/\w/) { - $active=0; - foreach my $possiblevalue (split(/\s*\,\s*/,&rulescache($triggered.'_triggervalue'))) { - if (lc($possiblevalue) eq lc($nval)) { $active=1; } - } - } - $newvalue=&rulescache($triggered.'_value'); - } else { - my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec'); - if ($action=~/^later\_than/) { - $newvalue=$nval+$totalsecs; - } else { - $newvalue=$nval-$totalsecs; - } - } - if ($active) { - &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'), - $uname,$udom,$csec,$recflag,$cgroup); - } - } + # don't backfire + unless ((!$triggered) || ($recstack{$triggered})) { + my $action=&rulescache($triggered.'_action'); + my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/); + # set triggered parameter on same level + my $newspnam=$prefix.$triggered; + my $newvalue=''; + my $active=1; + if ($action=~/^when\_setting/) { + # are there restrictions? + if (&rulescache($triggered.'_triggervalue')=~/\w/) { + $active=0; + foreach my $possiblevalue (split(/\s*\, + \s*/,&rulescache($triggered.'_triggervalue'))) { + if (lc($possiblevalue) eq lc($nval)) { $active=1; } + } + } + $newvalue=&rulescache($triggered.'_value'); + } else { + my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec'); + if ($action=~/^later\_than/) { + $newvalue=$nval+$totalsecs; + } else { + $newvalue=$nval-$totalsecs; + } + } + if ($active) { + &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'), + $uname,$udom,$csec,$recflag,$cgroup); + } + } } return ''; } @@ -661,30 +728,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; @@ -692,67 +766,68 @@ 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)) { - &Apache::lonnet::expirespread('','','assesscalc',$symb); - } elsif (($snum==11) || ($snum==8) || ($snum==5)) { - &Apache::lonnet::expirespread('','','assesscalc',$map); - } else { - &Apache::lonnet::expirespread('','','assesscalc'); - } -# Store parameter - if ($delete) { - $reply=&Apache::lonnet::del - ('resourcedata',[keys(%storecontent)],$cdom,$cnum); - &log_parmset(\%storecontent,1); - } else { - $reply=&Apache::lonnet::cput - ('resourcedata',\%storecontent,$cdom,$cnum); - &log_parmset(\%storecontent); - } - &Apache::lonnet::devalidatecourseresdata($cnum,$cdom); + 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==13) || ($snum==9) || ($snum==5)) { + &Apache::lonnet::expirespread('','','assesscalc',$symb); + } elsif (($snum==14) || ($snum==10) || ($snum==6)) { + &Apache::lonnet::expirespread('','','assesscalc',$map); + } else { + &Apache::lonnet::expirespread('','','assesscalc'); + } + # Store parameter + if ($delete) { + $reply=&Apache::lonnet::del + ('resourcedata',[keys(%storecontent)],$cdom,$cnum); + &log_parmset(\%storecontent,1); + } else { + $reply=&Apache::lonnet::cput + ('resourcedata',\%storecontent,$cdom,$cnum); + &log_parmset(\%storecontent); + } + &Apache::lonnet::devalidatecourseresdata($cnum,$cdom); } else { # ------------------------------------------------------------------ Store User # -# Expire sheets - &Apache::lonnet::expirespread($uname,$udom,'studentcalc'); - if ($snum==1) { - &Apache::lonnet::expirespread - ($uname,$udom,'assesscalc',$symb); - } elsif ($snum==2) { - &Apache::lonnet::expirespread - ($uname,$udom,'assesscalc',$map); - } else { - &Apache::lonnet::expirespread($uname,$udom,'assesscalc'); - } -# Store parameter - if ($delete) { - $reply=&Apache::lonnet::del - ('resourcedata',[keys(%storecontent)],$udom,$uname); - &log_parmset(\%storecontent,1,$uname,$udom); - } else { - $reply=&Apache::lonnet::cput - ('resourcedata',\%storecontent,$udom,$uname); - &log_parmset(\%storecontent,0,$uname,$udom); - } - &Apache::lonnet::devalidateuserresdata($uname,$udom); + # Expire sheets + &Apache::lonnet::expirespread($uname,$udom,'studentcalc'); + if ($snum==1) { + &Apache::lonnet::expirespread + ($uname,$udom,'assesscalc',$symb); + } elsif ($snum==2) { + &Apache::lonnet::expirespread + ($uname,$udom,'assesscalc',$map); + } else { + &Apache::lonnet::expirespread($uname,$udom,'assesscalc'); + } + # Store parameter + if ($delete) { + $reply=&Apache::lonnet::del + ('resourcedata',[keys(%storecontent)],$udom,$uname); + &log_parmset(\%storecontent,1,$uname,$udom); + } else { + $reply=&Apache::lonnet::cput + ('resourcedata',\%storecontent,$udom,$uname); + &log_parmset(\%storecontent,0,$uname,$udom); + } + &Apache::lonnet::devalidateuserresdata($uname,$udom); } if ($reply=~/^error\:(.*)/) { - return "Write Error: $1"; + return "Write Error: $1"; } return ''; } sub valout { - my ($value,$type,$editable)=@_; + my ($value,$type,$name,$editable)=@_; my $result = ''; # Values of zero are valid. if (! $value && $value ne '0') { @@ -766,7 +841,17 @@ sub valout { } } else { if ($type eq 'date_interval') { - my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value); + my ($totalsecs,$donesuffix) = split(/_/,$value,2); + my ($usesdone,$donebuttontext,$proctor,$secretkey); + if ($donesuffix =~ /^done\:([^\:]+)\:(.*)$/) { + $donebuttontext = $1; + (undef,$proctor,$secretkey) = split(/_/,$2); + $usesdone = 'done'; + } elsif ($donesuffix =~ /^done(|_.+)$/) { + $donebuttontext = &mt('Done'); + ($usesdone,$proctor,$secretkey) = split(/_/,$donesuffix); + } + my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs); my @timer; $year=$year-70; $mday--; @@ -799,13 +884,20 @@ sub valout { push(@timer,&mt('[quant,_1,sec]',0)); } $result.=join(", ",@timer); + if ($usesdone eq 'done') { + if ($secretkey) { + $result .= ' '.&mt('+ "[_1]" with proctor key: [_2]',$donebuttontext,$secretkey); + } else { + $result .= ' + "'.$donebuttontext.'"'; + } + } } elsif (&isdateparm($type)) { $result = &Apache::lonlocal::locallocaltime($value). - &date_sanity_info($value); + &date_sanity_info($value); } else { $result = $value; $result=~s/\,/\, /gs; - $result = &HTML::Entities::encode($result,'"<>&'); + $result = &HTML::Entities::encode($result,'"<>&'); } } return $result; @@ -816,7 +908,7 @@ sub plink { my ($type,$dis,$value,$marker,$return,$call)=@_; my $winvalue=$value; unless ($winvalue) { - if (&isdateparm($type)) { + if (&isdateparm($type)) { $winvalue=$env{'form.recent_'.$type}; } else { $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]}; @@ -825,12 +917,12 @@ 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) { - $$item = &HTML::Entities::encode($$item,'"<>&'); - $$item =~ s/\'/\\\'/g; + $$item = &HTML::Entities::encode($$item,'"<>&'); + $$item =~ s/\'/\\\'/g; } return ''); 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,$_,\@typeoutpar,$display,'',$readonly); + &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } elsif ($cgroup) { - &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly); + &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); } elsif ($csec) { - &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); + &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } else { - &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); + &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } } elsif ($parmlev eq 'map') { - if ($uname) { - &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); + &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } elsif ($cgroup) { - &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly); + &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); + &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); } elsif ($csec) { - &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); + &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); } else { - &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); + &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) { @@ -1026,7 +1304,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; @@ -1037,33 +1315,36 @@ sub print_row { } } - &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - - &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - - if ($csec) { - &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - } + &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,17,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + + if ($csec) { + &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,11,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + } if ($cgroup) { - &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly); - &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly); - &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly); + &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); + &print_td($r,7,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); + &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); + &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp); } - if ($uname) { + if ($uname) { if ($othergrp) { $r->print($othergrp); } - &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly); - } + &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display); + } } # end of $parmlev if/else $r->print(''); @@ -1072,9 +1353,11 @@ sub print_row { my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}. '.'.$$name{$which},$$symbp{$rid}); my $sessionvaltype=$typeoutpar[$result]; - if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; } + if (!defined($sessionvaltype)) { + $sessionvaltype=$$defaulttype{$which}; + } $r->print(''); } $r->print(''); @@ -1082,27 +1365,29 @@ sub print_row { } sub print_td { - my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp,$readonly)=@_; + my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_; $r->print('
'. ' + $selscript ENDJS @@ -905,8 +999,189 @@ function showHide_courseContent() { COURSECONTENTSCRIPT } +sub toggleparmtextbox_js { + return <<"ENDSCRIPT"; + +if (!document.getElementsByClassName) { + function getElementsByClassName(node, classname) { + var a = []; + var re = new RegExp('(^| )'+classname+'( |$)'); + var els = node.getElementsByTagName("*"); + for(var i=0,j=els.length; i$remove'); + }); + + \$(wrapper).delegate(".LC_remove_ipacc","click", function(e){ + e.preventDefault(); \$(this).closest("div").remove(); + }) +}); + + +END +} + +sub done_proctor_js { + return <<"END"; +function toggleSecret(form,radio,key) { + var radios = form[radio+key]; + if (radios.length) { + for (var i=0; i "group_or_section('cgroup')", @@ -915,14 +1190,14 @@ sub startpage { $loaditems{'onload'} = "showHide_courseContent(); group_or_section('cgroup'); resize_scrollbox('mapmenuscroll','1','1');"; } - if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) - && (!$env{'form.dis'})) || ($env{'form.symb'})) { - &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters', - text=>"Problem Parameters"}); + if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) && + (!$env{'form.dis'})) || ($env{'form.symb'})) { + &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters', + text=>"Problem Parameters"}); } else { - &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', - text=>"Table Mode", - help => 'Course_Setting_Parameters'}); + &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', + text=>"Table Mode", + help => 'Course_Setting_Parameters'}); } my $js = &page_js().' '; my $start_page = - &Apache::loncommon::start_page('Set/Modify Course Parameters',$js, - {'add_entries' => \%loaditems,}); + &Apache::loncommon::start_page('Set/Modify Course Parameters',$js, + {'add_entries' => \%loaditems,}); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode'); my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'}); my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'}); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); $r->print(< @@ -954,26 +1230,26 @@ ENDHEAD sub print_row { my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone, - $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp, - $readonly)=@_; + $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp)=@_; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); -# get the values for the parameter in cascading order -# empty levels will remain empty + + # get the values for the parameter in cascading order + # empty levels will remain empty my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which}, $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt); -# get the type for the parameters -# problem: these may not be set for all levels + # get the type for the parameters + # problem: these may not be set for all levels my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'. $$name{$which}.'.type',$rid, $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt); -# cascade down manually + # cascade down manually my $cascadetype=$$defaulttype{$which}; - for (my $i=14;$i>0;$i--) { - if ($typeoutpar[$i]) { + for (my $i=18;$i>0;$i--) { + if ($typeoutpar[$i]) { $cascadetype=$typeoutpar[$i]; - } else { + } else { $typeoutpar[$i]=$cascadetype; } } @@ -987,37 +1263,39 @@ sub print_row { } my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers'); if ($automatic) { - $parm.='
'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'
'; + $parm.='
'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'
'; } $r->print('
'.$parm.''.$effective_parm.''. - &valout($sessionval,$sessionvaltype).' '. + &valout($sessionval,$sessionvaltype,$$name{$which}).' '. '
'); my $nolink = 0; - if ($readonly) { + if ($which == 14 || $which == 15) { $nolink = 1; - } else { - if ($which == 11 || $which == 12) { + } elsif (($env{'request.course.sec'} ne '') && ($which > 12)) { + $nolink = 1; + } elsif ($which == 5 || $which == 6 || $which == 7 || $which == 8) { + if ($noeditgrp) { + $nolink = 1; + } + } elsif ($mprefix =~ /availablestudent\&$/) { + if ($which > 4) { + $nolink = 1; + } + } elsif ($mprefix =~ /examcode\&$/) { + unless ($which == 2) { $nolink = 1; - } elsif ($mprefix =~ /availablestudent\&$/) { - if ($which > 3) { - $nolink = 1; - } - } elsif ($mprefix =~ /examcode\&$/) { - unless ($which == 2) { - $nolink = 1; - } } } if ($nolink) { - $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); + $r->print(&valout($$outpar[$which],$$typeoutpar[$which],$mprefix)); } else { $r->print(&plink($$typeoutpar[$which], $$display{$value},$$outpar[$which], @@ -1118,18 +1403,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; @@ -1144,11 +1430,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++) { @@ -1258,7 +1544,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}; } @@ -1387,8 +1675,8 @@ sub lookUpTableParameter { 'contentopen' => 'time_settings', 'contentclose' => 'time_settings', 'discussend' => 'time_settings', - 'printstartdate' => 'time_settings', - 'printenddate' => 'time_settings', + 'printstartdate' => 'time_settings', + 'printenddate' => 'time_settings', 'weight' => 'grading', 'handgrade' => 'grading', 'maxtries' => 'tries', @@ -1423,7 +1711,7 @@ sub lookUpTableParameter { 'lenient' => 'grading', 'retrypartial' => 'tries', 'discussvote' => 'misc', - 'examcode' => 'high_level_randomization', + 'examcode' => 'high_level_randomization', ); } @@ -1475,9 +1763,7 @@ sub category_order { sub parmboxes { my ($r,$allparms,$pscat,$keyorder)=@_; - my $tempkey; - my $tempparameter; - my %categories = &categories; + my %categories = &categories(); my %category_order = &category_order(); my %categoryList = ( 'time_settings' => [], @@ -1492,34 +1778,29 @@ sub parmboxes { 'misc' => [], ); - foreach $tempparameter (keys %$allparms) { + foreach my $tempparameter (keys(%$allparms)) { &whatIsMyCategory($tempparameter, \%categoryList); } #part to print the parm-list - $r->print('
'."\n"); - - #Print parameters - for my $key (sort { $category_order{$a} <=> $category_order{$b} } keys %categoryList) { - next if(@{$categoryList{$key}} == 0); + foreach my $key (sort { $category_order{$a} <=> $category_order{$b} } keys(%categoryList)) { + next if (@{$categoryList{$key}} == 0); + next if ($key eq ''); $r->print('
' - .'

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

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

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

'."\n"); + foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) { $r->print('' .'
'."\n"); } - $r->print("
\n"); + $r->print('
'); } - - $r->print("\n"); + $r->print("\n"); } # # This function offers some links on the parameter section to get with one click a group a parameters @@ -1570,21 +1851,21 @@ sub partmenu { my %temphash=(); foreach (@{$psprt}) { $temphash{$_}=1; } foreach my $tempkey (sort { - if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); } - } keys(%{$allparts})) { - unless ($tempkey =~ /\./) { - $r->print(''); } - $r->print('>'.$$allparts{$tempkey}.''); - } } $r->print(''); } 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(); @@ -1593,18 +1874,29 @@ 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:').' '; } - if (%sectionhash && %grouphash && $parmlev ne 'full') { + if (%sectionhash && %grouphash && $parmlev ne 'full' && $currsec eq '') { $sections .= ' '.&mt('or').' '; $sections .= qq| '; + my $start_page = &Apache::loncommon::start_page('Set Parameters',$js, {'add_entries' => \%loaditems,}); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); $r->print(< +
ENDOVER my @ids=(); my %typep=(); @@ -3438,7 +4290,7 @@ ENDOVER my $pschp=$env{'form.pschp'}; my @psprt=&Apache::loncommon::get_env_multiple('form.psprt'); - if (!@psprt) { $psprt[0]='0'; } + if (!@psprt) { $psprt[0]='all'; } my @selected_sections = &Apache::loncommon::get_env_multiple('form.Section'); @@ -3448,6 +4300,9 @@ ENDOVER @selected_sections = ('all'); } } + if ($env{'request.course.sec'} ne '') { + @selected_sections = ($env{'request.course.sec'}); + } my @selected_groups = &Apache::loncommon::get_env_multiple('form.Group'); @@ -3487,16 +4342,26 @@ ENDOVER &displaymenu($r,\%allparms,\@pscat,\%keyorder); $r->print(&Apache::lonhtmlcommon::start_pick_box()); $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View'))); + my $sectionselector = §ionmenu(\@selected_sections); + my $groupselector = &groupmenu(\@selected_groups); $r->print(''. - ''); + if ($sectionselector) { + $r->print(''); + } + if ($groupselector) { + $r->print(''); + } + $r->print('
'.&mt('Parts').''.&mt('Section(s)'). - ''.&mt('Group(s)').'
'); + '
'.&mt('Parts').''.&mt('Section(s)').''.&mt('Group(s)').'
'); &partmenu($r,\%allparts,\@psprt); - $r->print(''); - §ionmenu($r,\@selected_sections); - $r->print(''); - &groupmenu($r,\@selected_groups); - $r->print('
'); - #$r->print('
'); + $r->print(''); + if ($sectionselector) { + $r->print(''.$sectionselector.''); + } + if ($groupselector) { + $r->print(''.$groupselector.''); + } + $r->print(''); $r->print(&Apache::lonhtmlcommon::row_closure(1)); $r->print(&Apache::lonhtmlcommon::end_pick_box()); $r->print(''); @@ -3530,13 +4395,12 @@ ENDOVER # List data - &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly); - } - $r->print(&tableend()); - unless ($readonly) { - $r->print(((($env{'form.store'}) || ($env{'form.dis'}))?'

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

':''). + ''); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -3555,11 +4419,14 @@ sub secgroup_lister { $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat}; } elsif ($parmlev eq 'map') { # map-level parameter - foreach my $mapid (keys %{$allmaps}) { + foreach my $mapid (keys(%{$allmaps})) { if (($pschp ne 'all') && ($pschp ne $mapid)) { next; } my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat; $$listdata{$newparmkey}=1; $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat}; + $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(rec).'.$part.'.'.$cat; + $$listdata{$newparmkey}=1; + $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat}; } } else { # resource-level parameter @@ -3575,25 +4442,35 @@ sub secgroup_lister { } } +# Display all existing parameter settings. sub overview { - my ($r,$parm_permission) = @_; + my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $readonly = 1; - if ($parm_permission->{'edit'}) { - undef($readonly); - } + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; + my $js = ''."\n"; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview', text=>"Overview Mode"}); - my $start_page=&Apache::loncommon::start_page('Modify Parameters'); + my %loaditems = ( + 'onload' => "showHideLenient();", + ); + + my $start_page=&Apache::loncommon::start_page('Modify Parameters',$js,{'add_entries' => \%loaditems,}); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print($start_page.$breadcrumbs); - $r->print('
'); + &startSettingsScreen($r,'parmset',$crstype); + $r->print(''); # Store modified - unless ($readonly) { - &storedata($r,$crs,$dom); - } + + &storedata($r,$crs,$dom); # Read modified data @@ -3604,28 +4481,15 @@ sub overview { unless ($sortorder) { $sortorder='realmstudent'; } &sortmenu($r,$sortorder); - my $submitbutton = ''; - - if ($readonly) { - $r->print('

'.$submitbutton.'

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

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

'.$submitbutton.'

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

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

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

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

'. + &Apache::loncommon::end_page()); } +# Unused sub. sub clean_parameters { my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -3661,68 +4525,72 @@ ENDOVER ''.&mt('Parameter').''. ''); foreach my $thiskey (sort(keys(%{$resourcedata}))) { - next if (!exists($resourcedata->{$thiskey.'.type'}) - && $thiskey=~/\.type$/); - my %data = &parse_key($thiskey); - if (1) { #exists($data{'realm_exists'}) - #&& !$data{'realm_exists'}) { - $r->print(&Apache::loncommon::start_data_table_row(). - ''. - '' ); - - $r->print(''); - my $display_value = $resourcedata->{$thiskey}; - if (&isdateparm($resourcedata->{$thiskey.'.type'})) { - $display_value = - &Apache::lonlocal::locallocaltime($display_value); - } + next if (!exists($resourcedata->{$thiskey.'.type'}) + && $thiskey=~/\.type$/); + my %data = &parse_key($thiskey); + if (1) { #exists($data{'realm_exists'}) + #&& !$data{'realm_exists'}) { + $r->print(&Apache::loncommon::start_data_table_row(). + ''. + '' ); + + $r->print(''); + my $display_value = $resourcedata->{$thiskey}; + if (&isdateparm($resourcedata->{$thiskey.'.type'})) { + $display_value = + &Apache::lonlocal::locallocaltime($display_value); + } my $parmitem = &standard_parameter_names($data{'parameter_name'}); $parmitem = &mt($parmitem); - $r->print(&mt('Parameter: "[_1]" with value: "[_2]"', - $parmitem,$resourcedata->{$thiskey})); - $r->print('
'); - if ($data{'scope_type'} eq 'all') { - $r->print(&mt('All users')); - } elsif ($data{'scope_type'} eq 'user') { - $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}}))); - } elsif ($data{'scope_type'} eq 'section') { - $r->print(&mt('Section: [_1]',$data{'scope'})); - } elsif ($data{'scope_type'} eq 'group') { - $r->print(&mt('Group: [_1]',$data{'scope'})); - } - $r->print('
'); - if ($data{'realm_type'} eq 'all') { - $r->print(&mt('All Resources')); - } elsif ($data{'realm_type'} eq 'folder') { - $r->print(&mt('Folder: [_1]'),$data{'realm'}); - } elsif ($data{'realm_type'} eq 'symb') { - my ($map,$resid,$url) = - &Apache::lonnet::decode_symb($data{'realm'}); - $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]', - $url.'
   ', - $resid.'
   ',$map)); - } - $r->print('
   '.&mt('Part: [_1]',$data{'parameter_part'})); - $r->print(''); + $r->print(&mt('Parameter: "[_1]" with value: "[_2]"', + $parmitem,$resourcedata->{$thiskey})); + $r->print('
'); + if ($data{'scope_type'} eq 'all') { + $r->print(&mt('All users')); + } elsif ($data{'scope_type'} eq 'user') { + $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}}))); + } elsif ($data{'scope_type'} eq 'section') { + $r->print(&mt('Section: [_1]',$data{'scope'})); + } elsif ($data{'scope_type'} eq 'group') { + $r->print(&mt('Group: [_1]',$data{'scope'})); + } + $r->print('
'); + if ($data{'realm_type'} eq 'all') { + $r->print(&mt('All Resources')); + } elsif ($data{'realm_type'} eq 'folder') { + $r->print(&mt('Folder: [_1]'),$data{'realm'}); + } elsif ($data{'realm_type'} eq 'symb') { + my ($map,$resid,$url) = + &Apache::lonnet::decode_symb($data{'realm'}); + $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]', + $url.'
   ', + $resid.'
   ',$map)); + } + $r->print('
   '.&mt('Part: [_1]',$data{'parameter_part'})); + $r->print(''); - } + } } $r->print(&Apache::loncommon::end_data_table().'

'. ''. '

'); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } +# Overview mode, UI to shift all dates. sub date_shift_one { my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'}, text=>"Shifting Dates"}); my $start_page=&Apache::loncommon::start_page('Shift Dates'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift'); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); $r->print('
'. ''. @@ -3735,18 +4603,22 @@ sub date_shift_one { ''. ''. ''); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } +# Overview mode, UI to shift all dates (second form). sub date_shift_two { my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'}, text=>"Shifting Dates"}); my $start_page=&Apache::loncommon::start_page('Shift Dates'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift'); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted'); $r->print('

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

'. '

'.&mt('Shifting all dates such that [_1] becomes [_2]', @@ -3759,6 +4631,7 @@ sub date_shift_two { '

'. &Apache::lonhtmlcommon::actionbox( [''.&mt('Content and Problem Settings').''])); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -3769,30 +4642,30 @@ sub parse_key { ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); $data{'scope_type'} = 'all'; if ($middle=~/^\[(.*)\]/) { - $data{'scope'} = $1; - if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) { - $data{'scope_type'} = 'user'; - $data{'scope'} = [$1,$2]; - } else { - #FIXME check for group scope - $data{'scope_type'} = 'section'; - } - $middle=~s/^\[(.*)\]//; + $data{'scope'} = $1; + if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) { + $data{'scope_type'} = 'user'; + $data{'scope'} = [$1,$2]; + } else { + #FIXME check for group scope + $data{'scope_type'} = 'section'; + } + $middle=~s/^\[(.*)\]//; } $middle=~s/\.+$//; $middle=~s/^\.+//; $data{'realm_type'}='all'; if ($middle=~/^(.+)\_\_\_\(all\)$/) { - $data{'realm'} = $1; - $data{'realm_type'} = 'folder'; - $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'}); - ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'}); + $data{'realm'} = $1; + $data{'realm_type'} = 'folder'; + $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'}); + ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'}); } elsif ($middle) { - $data{'realm'} = $middle; - $data{'realm_type'} = 'symb'; - $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'}); - my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'}); - $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url); + $data{'realm'} = $middle; + $data{'realm_type'} = 'symb'; + $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'}); + my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'}); + $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url); } $data{'parameter_part'} = $part; @@ -3803,11 +4676,15 @@ sub parse_key { sub header { - return &Apache::loncommon::start_page('Content and Problem Settings'); + return &Apache::loncommon::start_page('Settings'); } +################################################## +# MAIN MENU +################################################## + sub print_main_menu { my ($r,$parm_permission)=@_; # @@ -3816,6 +4693,7 @@ sub print_main_menu { my $crstype = &Apache::loncommon::course_type(); my $lc_crstype = lc($crstype); + &startSettingsScreen($r,'parmset',$crstype); $r->print(< @@ -3826,73 +4704,35 @@ ENDMAINFORMHEAD my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}); my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'}); my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}); - my $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'}); - my $vpa = &Apache::lonnet::allowed('vpa',$env{'request.course.id'}); if ((!$dcm) && ($env{'request.course.sec'} ne '')) { $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}. '/'.$env{'request.course.sec'}); } - if ((!$vcb) && ($env{'request.course.sec'} ne '')) { - $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'}. - '/'.$env{'request.course.sec'}); - } - my (%linktext,%linktitle,%url); - if ($parm_permission->{'edit'}) { - %linktext = ( - newoverview => 'Edit Resource Parameters - Overview Mode', - settable => 'Edit Resource Parameters - Table Mode', - setoverview => 'Modify Resource Parameters - Overview Mode', - ); - %linktitle = ( - newoverview => 'Set/Modify resource parameters in overview mode.', - settable => 'Set/Modify resource parameters in table mode.', - setoverview => 'Set/Modify existing resource parameters in overview mode.', - ); - } else { - %linktext = ( - newoverview => 'View Resource Parameters - Overview Mode', - settable => 'View Resource Parameters - Table Mode', - setoverview => 'View Resource Parameters - Overview Mode', - ); - %linktitle = ( - newoverview => 'Display resource parameters in overview mode.', - settable => 'Display resource parameters in table mode.', - setoverview => 'Display existing resource parameters in overview mode.', - ); - } - if ($mgr) { - $linktext{'resettimes'} = 'Reset Student Access Times'; - $linktitle{'resettimes'} = "Reset access times for folders/maps, resources or the $lc_crstype."; - $url{'resettimes'} = '/adm/helper/resettimes.helper'; - } elsif ($vgr) { - $linktext{'resettimes'} = 'Display Student Access Times', - $linktitle{'resettimes'} = "Display access times for folders/maps, resources or the $lc_crstype.", - $url{'resettimes'} = '/adm/accesstimes'; - } + my @menu = ( { categorytitle=>"Content Settings for this $crstype", items => [ { linktext => 'Portfolio Metadata', url => '/adm/parmset?action=setrestrictmeta', - permission => $parm_permission->{'setrestrictmeta'}, + permission => $parm_permission, linktitle => "Restrict metadata for this $lc_crstype." , icon =>'contact-new.png' , }, - { linktext => $linktext{'resettimes'}, - url => $url{'resettimes'}, - permission => ($vgr || $mgr), - linktitle => $linktitle{'resettimes'}, - icon => 'start-here.png', + { linktext => 'Reset Student Access Times', + url => '/adm/helper/resettimes.helper', + permission => $mgr, + linktitle => "Reset access times for folders/maps, resources or the $lc_crstype." , + icon => 'start-here.png' , }, { linktext => 'Blocking Communication/Resource Access', url => '/adm/setblock', - permission => ($vcb || $dcm), + permission => $dcm, linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam', icon => 'comblock.png', }, { linktext => 'Set Parameter Setting Default Actions', url => '/adm/parmset?action=setdefaults', - permission => $parm_permission->{'setdefaults'}, + permission => $parm_permission, linktitle =>'Set default actions for parameters.' , icon => 'folder-new.png' , }]}, @@ -3900,48 +4740,54 @@ ENDMAINFORMHEAD items => [ { linktext => 'Edit Resource Parameters - Helper Mode', url => '/adm/helper/parameter.helper', - permission => $parm_permission->{'helper'}, + permission => $parm_permission, linktitle =>'Set/Modify resource parameters in helper mode.' , icon => 'dialog-information.png' , #help => 'Parameter_Helper', }, - { linktext => $linktext{'newoverview'}, + { linktext => 'Edit Resource Parameters - Overview Mode', url => '/adm/parmset?action=newoverview', - permission => $parm_permission->{'newoverview'}, - linktitle => $linktitle{'newoverview'}, - icon => 'edit-find.png', + permission => $parm_permission, + linktitle =>'Set/Modify resource parameters in overview mode.' , + icon => 'edit-find.png' , #help => 'Parameter_Overview', }, - { linktext => $linktext{'settable'}, + { linktext => 'Edit Resource Parameters - Table Mode', url => '/adm/parmset?action=settable', - permission => $parm_permission->{'settable'}, - linktitle => $linktitle{'settable'}, - icon => 'edit-copy.png', + permission => $parm_permission, + linktitle =>'Set/Modify resource parameters in table mode.' , + icon => 'edit-copy.png' , #help => 'Table_Mode', }]}, { categorytitle => 'Existing Parameter Settings for Resources', items => [ - { linktext => $linktext{'setoverview'}, + { linktext => 'Modify Resource Parameters - Overview Mode', url => '/adm/parmset?action=setoverview', - permission => $parm_permission->{'setoverview'}, - linktitle => $linktitle{'setoverview'}, - icon => 'preferences-desktop-wallpaper.png', + permission => $parm_permission, + linktitle =>'Set/Modify existing resource parameters in overview mode.' , + icon => 'preferences-desktop-wallpaper.png' , #help => 'Parameter_Overview', }, { linktext => 'Change Log', url => '/adm/parmset?action=parameterchangelog', - permission => $parm_permission->{'parameterchangelog'}, + permission => $parm_permission, linktitle =>"View parameter and $lc_crstype blog posting/user notification change log." , icon => 'document-properties.png', }]} ); $r->print(&Apache::lonhtmlcommon::generate_menu(@menu)); - $r->print(''.&Apache::loncommon::end_page()); + $r->print(''); + &endSettingsScreen($r); + $r->print(&Apache::loncommon::end_page()); return; } +################################################## +# PORTFOLIO METADATA +################################################## + sub output_row { my ($r, $field_name, $field_text, $added_flag) = @_; my $output; @@ -3963,14 +4809,14 @@ sub output_row { $output .= '

'; $output .= &Apache::loncommon::end_data_table_row(); foreach my $opt (@options) { - my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ; - $output .= &Apache::loncommon::continue_data_table_row(); - $output .= ''; - $output .= &Apache::loncommon::end_data_table_row(); - } + my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ; + $output .= &Apache::loncommon::continue_data_table_row(); + $output .= ''; + $output .= &Apache::loncommon::end_data_table_row(); + } $output .= &Apache::loncommon::continue_data_table_row(); $output .= ''; $output .= &Apache::loncommon::end_data_table_row(); @@ -3983,52 +4829,55 @@ sub output_row { $multiple_checked = ' checked="checked"'; $single_checked = ''; } - $output .= &Apache::loncommon::continue_data_table_row(); - $output .= ''; - $output .= &Apache::loncommon::end_data_table_row(); - $output .= &Apache::loncommon::continue_data_table_row(); - $output .= ''; - $output .= &Apache::loncommon::end_data_table_row(); + $output .= &Apache::loncommon::continue_data_table_row(); + $output .= ''; + $output .= &Apache::loncommon::end_data_table_row(); + $output .= &Apache::loncommon::continue_data_table_row(); + $output .= ''; + $output .= &Apache::loncommon::end_data_table_row(); } return ($output); } - +# UI to order portfolio metadata fields. sub order_meta_fields { my ($r)=@_; my $idx = 1; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};; $r->print(&Apache::loncommon::start_page('Order Metadata Fields')); - &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata', + &Apache::lonhtmlcommon::add_breadcrumb( + {href=>'/adm/parmset?action=addmetadata', text=>"Add Metadata Field"}); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"/adm/parmset?action=setrestrictmeta", - text=>"Restrict Metadata"}, - {text=>"Order Metadata"}); + &Apache::lonhtmlcommon::add_breadcrumb( + {href=>"/adm/parmset?action=setrestrictmeta", + text=>"Restrict Metadata"}, + {text=>"Order Metadata"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata')); + &startSettingsScreen($r,'parmset',$crstype); if ($env{'form.storeorder'}) { my $newpos = $env{'form.newpos'} - 1; my $currentpos = $env{'form.currentpos'} - 1; my @neworder = (); - my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}; + my @oldorder = split(/,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}); my $i; if ($newpos > $currentpos) { # moving stuff up for ($i=0;$i<$currentpos;$i++) { - $neworder[$i]=$oldorder[$i]; + $neworder[$i]=$oldorder[$i]; } for ($i=$currentpos;$i<$newpos;$i++) { - $neworder[$i]=$oldorder[$i+1]; + $neworder[$i]=$oldorder[$i+1]; } $neworder[$newpos]=$oldorder[$currentpos]; for ($i=$newpos+1;$i<=$#oldorder;$i++) { - $neworder[$i]=$oldorder[$i]; + $neworder[$i]=$oldorder[$i]; } } else { # moving stuff down @@ -4043,17 +4892,17 @@ sub order_meta_fields { $neworder[$i]=$oldorder[$i]; } } - my $ordered_fields = join ",", @neworder; + my $ordered_fields = join ",", @neworder; my $put_result = &Apache::lonnet::put('environment', - {'metadata.addedorder'=>$ordered_fields},$dom,$crs); - &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields}); + {'metadata.addedorder'=>$ordered_fields},$dom,$crs); + &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields}); } my $fields = &get_added_meta_fieldnames($env{'request.course.id'}); my $ordered_fields; - my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}; + my @fields_in_order = split(/,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}); if (!@fields_in_order) { # no order found, pick sorted order then create metadata.addedorder key. - foreach my $key (sort keys %$fields) { + foreach my $key (sort(keys(%$fields))) { push @fields_in_order, $key; $ordered_fields = join ",", @fields_in_order; } @@ -4081,6 +4930,7 @@ sub order_meta_fields { $idx ++; } $r->print('
'.&mt('Currently set date:').''. &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'
'.$field_text.':'.(' ' x 5).''.(' ' x 5).''.(' ' x 10).''.(' ' x 10).' - - '.&mt('Student may select multiple choices from list').''.(' ' x 10).' - - '.&mt('Student may select only one choice from list').''.(' ' x 10).' + + '.&mt('Student may select multiple choices from list').''.(' ' x 10).' + + '.&mt('Student may select only one choice from list').'
'); + &endSettingsScreen($r); return 'ok'; } @@ -4102,6 +4952,8 @@ sub addmetafield { $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field')); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; + &startSettingsScreen($r,'parmset',$crstype); if (exists($env{'form.undelete'})) { my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield'); foreach my $meta_field(@meta_fields) { @@ -4136,15 +4988,17 @@ sub addmetafield { $r->print(''); $r->print(''); } - $r->print('
Or you may enter a new metadata field name.
'); + $r->print('
Or you may enter a new metadata field name.print('
'); $r->print(''); } $r->print('
'); + &endSettingsScreen($r); } +# Display or save portfolio metadata. sub setrestrictmeta { my ($r)=@_; my $next_meta; @@ -4157,6 +5011,8 @@ sub setrestrictmeta { $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata')); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; + &startSettingsScreen($r,'parmset',$crstype); my $key_base = $env{'course.'.$env{'request.course.id'}.'.'}; my $save_field = ''; if ($env{'form.restrictmeta'}) { @@ -4183,10 +5039,10 @@ sub setrestrictmeta { $options.='deleted,'; } my $name = $save_field; - $put_result = &Apache::lonnet::put('environment', - {'metadata.'.$meta_field.'.options'=>$options, - 'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'}, - },$dom,$crs); + $put_result = &Apache::lonnet::put('environment', + {'metadata.'.$meta_field.'.options'=>$options, + 'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'}, + },$dom,$crs); } } } @@ -4202,8 +5058,8 @@ sub setrestrictmeta { foreach my $field (sort(keys(%metadata_fields))) { if ($field ne 'courserestricted') { $row_alt = $row_alt ? 0 : 1; - $output.= &output_row($r, $field, $metadata_fields{$field}); - } + $output.= &output_row($r, $field, $metadata_fields{$field}); + } } my $buttons = (< @@ -4227,12 +5083,12 @@ ENDButtons $buttons ENDenv + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); return 'ok'; } - sub get_added_meta_fieldnames { my ($cid) = @_; my %fields; @@ -4247,7 +5103,6 @@ sub get_added_meta_fieldnames { } - sub get_deleted_meta_fieldnames { my ($cid) = @_; my %fields; @@ -4262,19 +5117,28 @@ sub get_deleted_meta_fieldnames { } return \%fields; } + + +################################################## +# PARAMETER SETTINGS DEFAULT ACTIONS +################################################## + +# UI to change parameter setting default actions sub defaultsetter { my ($r) = @_; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults', text=>"Set Defaults"}); + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; my $start_page = - &Apache::loncommon::start_page('Parameter Setting Default Actions'); + &Apache::loncommon::start_page('Parameter Setting Default Actions'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults'); $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); $r->print('
'); - my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; my @ids=(); my %typep=(); my %keyp=(); @@ -4292,45 +5156,45 @@ sub defaultsetter { \%mapp, \%symbp,\%maptitles,\%uris, \%keyorder,\%defkeytype); if ($env{'form.storerules'}) { - my %newrules=(); - my @delrules=(); - my %triggers=(); - foreach my $key (keys(%env)) { + my %newrules=(); + my @delrules=(); + my %triggers=(); + foreach my $key (keys(%env)) { if ($key=~/^form\.(\w+)\_action$/) { - my $tempkey=$1; - my $action=$env{$key}; + my $tempkey=$1; + my $action=$env{$key}; if ($action) { - $newrules{$tempkey.'_action'}=$action; - if ($action ne 'default') { - my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/); - $triggers{$whichparm}.=$tempkey.':'; - } - $newrules{$tempkey.'_type'}=$defkeytype{$tempkey}; - if (&isdateparm($defkeytype{$tempkey})) { - $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'}; - $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'}; - $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'}; - $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'}; - } else { - $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'}; - $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'}; + $newrules{$tempkey.'_action'}=$action; + if ($action ne 'default') { + my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/); + $triggers{$whichparm}.=$tempkey.':'; + } + $newrules{$tempkey.'_type'}=$defkeytype{$tempkey}; + if (&isdateparm($defkeytype{$tempkey})) { + $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'}; + $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'}; + $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'}; + $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'}; + } else { + $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'}; + $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'}; + } + } else { + push(@delrules,$tempkey.'_action'); + push(@delrules,$tempkey.'_type'); + push(@delrules,$tempkey.'_hours'); + push(@delrules,$tempkey.'_min'); + push(@delrules,$tempkey.'_sec'); + push(@delrules,$tempkey.'_value'); + } } - } else { - push(@delrules,$tempkey.'_action'); - push(@delrules,$tempkey.'_type'); - push(@delrules,$tempkey.'_hours'); - push(@delrules,$tempkey.'_min'); - push(@delrules,$tempkey.'_sec'); - push(@delrules,$tempkey.'_value'); } + foreach my $key (keys(%allparms)) { + $newrules{$key.'_triggers'}=$triggers{$key}; } - } - foreach my $key (keys %allparms) { - $newrules{$key.'_triggers'}=$triggers{$key}; - } - &Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs); - &Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs); - &resetrulescache(); + &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum); + &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum); + &resetrulescache(); } my %lt=&Apache::lonlocal::texthash('days' => 'Days', 'hours' => 'Hours', @@ -4343,15 +5207,15 @@ sub defaultsetter { my @dateoptions=('','default'); my @datedisplay=('',&mt('Default value when manually setting')); foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) { - unless ($tempkey) { next; } - push @standardoptions,'when_setting_'.$tempkey; - push @standarddisplay,&mt('Automatically set when setting ').$tempkey; - if (&isdateparm($defkeytype{$tempkey})) { - push @dateoptions,'later_than_'.$tempkey; - push @datedisplay,&mt('Automatically set later than ').$tempkey; - push @dateoptions,'earlier_than_'.$tempkey; - push @datedisplay,&mt('Automatically set earlier than ').$tempkey; - } + unless ($tempkey) { next; } + push @standardoptions,'when_setting_'.$tempkey; + push @standarddisplay,&mt('Automatically set when setting ').$tempkey; + if (&isdateparm($defkeytype{$tempkey})) { + push @dateoptions,'later_than_'.$tempkey; + push @datedisplay,&mt('Automatically set later than ').$tempkey; + push @dateoptions,'earlier_than_'.$tempkey; + push @datedisplay,&mt('Automatically set earlier than ').$tempkey; + } } $r->print(&mt('Manual setting rules apply to all interfaces.').'
'. &mt('Automatic setting rules apply to table mode interfaces only.')); @@ -4361,98 +5225,113 @@ $r->print(&mt('Manual setting rules appl &mt('Action').''.&mt('Value').''. &Apache::loncommon::end_data_table_header_row()); foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) { - unless ($tempkey) { next; } - $r->print("\n".&Apache::loncommon::start_data_table_row(). - "".$allparms{$tempkey}."\n
(".$tempkey.')'); - my $action=&rulescache($tempkey.'_action'); - $r->print(''); + if (&isdateparm($defkeytype{$tempkey})) { + for (my $i=0;$i<=$#dateoptions;$i++) { + if ($dateoptions[$i]=~/\_$tempkey$/) { next; } + $r->print("\n"); + } + } else { + for (my $i=0;$i<=$#standardoptions;$i++) { + if ($standardoptions[$i]=~/\_$tempkey$/) { next; } + $r->print("\n"); + } } - } else { - for (my $i=0;$i<=$#standardoptions;$i++) { - if ($standardoptions[$i]=~/\_$tempkey$/) { next; } - $r->print("\n"); + $r->print(''); + unless (&isdateparm($defkeytype{$tempkey})) { + $r->print("\n
".&mt('Triggering value(s) of other parameter (optional, comma-separated):'). + ''); } - } - $r->print(''); - unless (&isdateparm($defkeytype{$tempkey})) { - $r->print("\n
".&mt('Triggering value(s) of other parameter (optional, comma-separated):'). - ''); - } - $r->print("\n\n"); + $r->print("\n\n"); if (&isdateparm($defkeytype{$tempkey})) { - my $days=&rulescache($tempkey.'_days'); - my $hours=&rulescache($tempkey.'_hours'); - my $min=&rulescache($tempkey.'_min'); - my $sec=&rulescache($tempkey.'_sec'); - $r->print(<$lt{'days'}
-$lt{'hours'}
-$lt{'min'}
-$lt{'sec'} -ENDINPUTDATE - } elsif ($defkeytype{$tempkey} eq 'string_yesno') { - my $yeschecked=''; - my $nochecked=''; - if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; } - if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; } - - $r->print(< $lt{'yes'}
- -ENDYESNO + my $days=&rulescache($tempkey.'_days'); + my $hours=&rulescache($tempkey.'_hours'); + my $min=&rulescache($tempkey.'_min'); + my $sec=&rulescache($tempkey.'_sec'); + $r->print(<$lt{'days'}
+ $lt{'hours'}
+ $lt{'min'}
+ $lt{'sec'} + ENDINPUTDATE + } elsif ($defkeytype{$tempkey} eq 'string_yesno') { + my $yeschecked=''; + my $nochecked=''; + if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; } + if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; } + + $r->print(< $lt{'yes'}
+ + ENDYESNO } else { - $r->print(''); - } + $r->print(''); + } $r->print(''.&Apache::loncommon::end_data_table_row()); } $r->print(&Apache::loncommon::end_data_table(). "\n".''."\n"); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); return; } +################################################## +# PARAMETER CHANGES LOG +################################################## + sub components { my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_; if ($typeflag) { - $key=~s/\.type$//; + $key=~s/\.type$//; } my ($middle,$part,$name)= - ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); + ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); my $issection; my $section=&mt('All Students'); if ($middle=~/^\[(.*)\]/) { - $issection=$1; - $section=&mt('Group/Section').': '.$issection; - $middle=~s/^\[(.*)\]//; + $issection=$1; + $section=&mt('Group/Section').': '.$issection; + $middle=~s/^\[(.*)\]//; } $middle=~s/\.+$//; $middle=~s/^\.+//; if ($uname) { - $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom); - $issection=''; + $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom); + $issection=''; } my $realm=''.&mt('All Resources').''; my $realmdescription=&mt('all resources'); - if ($middle=~/^(.+)\_\_\_\(all\)$/) { - $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).'
('.$1.')
'; - $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1); - } elsif ($middle) { - my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle); - $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).'
('.$url.' in '.$map.' id: '.$id.')
'; - $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle); + if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) { + my $mapurl = $1; + my $maplevel = $2; + my $leveltitle = &mt('Folder/Map'); + if ($maplevel eq 'rec') { + $leveltitle = &mt('Recursive'); + } + $realm=''.$leveltitle. + ': '.&Apache::lonnet::gettitle($mapurl).'
('. + $mapurl.')
'; + $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($mapurl); + } elsif ($middle) { + my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle); + $realm=''.&mt('Resource'). + ': '.&Apache::lonnet::gettitle($middle).'
('.$url. + ' in '.$map.' id: '.$id.')
'; + $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle); } my $what=$part.'.'.$name; return ($realm,$section,$name,$part, @@ -4465,14 +5344,14 @@ my %standard_parms_types; sub load_parameter_names { open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab"); while (my $configline=<$config>) { - if ($configline !~ /\S/ || $configline=~/^\#/) { next; } - chomp($configline); - my ($short,$plain)=split(/:/,$configline); - my (undef,$name,$type)=split(/\&/,$short,3); - if ($type eq 'display') { - $standard_parms{$name} = $plain; + if ($configline !~ /\S/ || $configline=~/^\#/) { next; } + chomp($configline); + my ($short,$plain)=split(/:/,$configline); + my (undef,$name,$type)=split(/\&/,$short,3); + if ($type eq 'display') { + $standard_parms{$name} = $plain; } elsif ($type eq 'type') { - $standard_parms_types{$name} = $plain; + $standard_parms_types{$name} = $plain; } } close($config); @@ -4483,12 +5362,12 @@ sub load_parameter_names { sub standard_parameter_names { my ($name)=@_; if (!%standard_parms) { - &load_parameter_names(); + &load_parameter_names(); } if ($standard_parms{$name}) { - return $standard_parms{$name}; + return $standard_parms{$name}; } else { - return $name; + return $name; } } @@ -4503,8 +5382,26 @@ sub standard_parameter_types { return; } +sub standard_parameter_levels { + my ($name)=@_; + my %levels = ( + 'resourcelevel' => 'a single resource', + 'maplevel' => 'the enclosing map/folder', + 'maplevelrecurse' => 'the enclosing map/folder (recursive into sub-folders)', + 'courselevel' => 'the general (course) level', + ); + if ($levels{$name}) { + return $levels{$name}; + } + return; +} + +# Display log for parameter changes, blog postings, user notification changes. sub parm_change_log { - my ($r,$parm_permission)=@_; + my ($r)=@_; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'} &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', text=>"Parameter Change Log"}); my $js = ''."\n"; $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js)); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log')); - my %parmlog=&Apache::lonnet::dump('nohist_parameterlog', - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); + &startSettingsScreen($r,'parmset',$crstype); + my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',$cdom,$cnum); if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); } @@ -4533,99 +5429,98 @@ sub parm_change_log { $r->print(&Apache::loncommon::display_filter('parmslog').' '."\n". ''. '
'); - my $readonly = 1; - if ($parm_permission->{'edit'}) { - undef($readonly); - } - my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}); + + my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row(). ''.&mt('Time').''.&mt('User').''.&mt('Extent').''.&mt('Users').''. - &mt('Parameter').''.&mt('Part').''.&mt('New Value').''); - unless ($readonly) { - $r->print(''.&mt('Announce').''); - } - $r->print(&Apache::loncommon::end_data_table_header_row()); + &mt('Parameter').''.&mt('Part').''.&mt('New Value').''.&mt('Announce').''. + &Apache::loncommon::end_data_table_header_row()); my $shown=0; my $folder=''; if ($env{'form.displayfilter'} eq 'currentfolder') { - my $last=''; - if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', - &GDBM_READER(),0640)) { - $last=$hash{'last_known'}; - untie(%hash); - } - if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); } - } - foreach my $id (sort - { - if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) { - return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'} - } - my $aid = (split('00000',$a))[-1]; - my $bid = (split('00000',$b))[-1]; - return $bid<=>$aid; + my $last=''; + if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', + &GDBM_READER(),0640)) { + $last=$hash{'last_known'}; + untie(%hash); + } + if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); } + } + foreach my $id (sort { + if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) { + return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'} + } + my $aid = (split('00000',$a))[-1]; + my $bid = (split('00000',$b))[-1]; + return $bid<=>$aid; } (keys(%parmlog))) { my @changes=keys(%{$parmlog{$id}{'logentry'}}); - my $count = 0; - my $time = - &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'}); - my $plainname = - &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'}, - $parmlog{$id}{'exe_udom'}); - my $about_me_link = - &Apache::loncommon::aboutmewrapper($plainname, - $parmlog{$id}{'exe_uname'}, - $parmlog{$id}{'exe_udom'}); - my $send_msg_link=''; - if ((!$readonly) && - (($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) - || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) { - $send_msg_link ='
'. - &Apache::loncommon::messagewrapper(&mt('Send message'), - $parmlog{$id}{'exe_uname'}, - $parmlog{$id}{'exe_udom'}); - } - my $row_start=&Apache::loncommon::start_data_table_row(); - my $makenewrow=0; - my %istype=(); - my $output; - foreach my $changed (reverse(sort(@changes))) { - my $value=$parmlog{$id}{'logentry'}{$changed}; - my $typeflag = ($changed =~/\.type$/ && - !exists($parmlog{$id}{'logentry'}{$changed.'.type'})); + my $count = 0; + my $time = + &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'}); + my $plainname = + &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'}, + $parmlog{$id}{'exe_udom'}); + my $about_me_link = + &Apache::loncommon::aboutmewrapper($plainname, + $parmlog{$id}{'exe_uname'}, + $parmlog{$id}{'exe_udom'}); + my $send_msg_link=''; + if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) + || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) { + $send_msg_link ='
'. + &Apache::loncommon::messagewrapper(&mt('Send message'), + $parmlog{$id}{'exe_uname'}, + $parmlog{$id}{'exe_udom'}); + } + my $row_start=&Apache::loncommon::start_data_table_row(); + my $makenewrow=0; + my %istype=(); + my $output; + foreach my $changed (reverse(sort(@changes))) { + my $value=$parmlog{$id}{'logentry'}{$changed}; + my $typeflag = ($changed =~/\.type$/ && + !exists($parmlog{$id}{'logentry'}{$changed.'.type'})); my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)= - &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag); - if ($env{'form.displayfilter'} eq 'currentfolder') { - if ($folder) { - if ($middle!~/^\Q$folder\E/) { next; } - } - } - if ($typeflag) { - $istype{$parmname}=$value; - if (!$env{'form.includetypes'}) { next; } - } - $count++; - if ($makenewrow) { - $output .= $row_start; - } else { - $makenewrow=1; - } + &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag); + if ($env{'request.course.sec'} ne '') { + next if (($issection ne '') && ($issection ne $env{'request.course.sec'})); + if ($uname ne '') { + my $stusection = &Apache::lonnet::getsection($uname,$udom,$env{'request.course.id'}); + next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'})); + } + } + if ($env{'form.displayfilter'} eq 'currentfolder') { + if ($folder) { + if ($middle!~/^\Q$folder\E/) { next; } + } + } + if ($typeflag) { + $istype{$parmname}=$value; + if (!$env{'form.includetypes'}) { next; } + } + $count++; + if ($makenewrow) { + $output .= $row_start; + } else { + $makenewrow=1; + } my $parmitem = &standard_parameter_names($parmname); - $output .=''.$realm.''.$section.''. - &mt($parmitem).''. - ($part?&mt('Part: [_1]',$part):&mt('All Parts')).''; - my $stillactive=0; - if ($parmlog{$id}{'delflag'}) { - $output .= &mt('Deleted'); - } else { - if ($typeflag) { + $output .=''.$realm.''.$section.''. + &mt($parmitem).''. + ($part?&mt('Part: [_1]',$part):&mt('All Parts')).''; + my $stillactive=0; + if ($parmlog{$id}{'delflag'}) { + $output .= &mt('Deleted'); + } else { + if ($typeflag) { my $parmitem = &standard_parameter_names($value); $parmitem = &mt($parmitem); - $output .= &mt('Type: [_1]',$parmitem); - } else { - my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what), - $uname,$udom,$issection,$issection,$courseopt); + $output .= &mt('Type: [_1]',$parmitem); + } else { + my ($level,@all)=&parmval_by_symb($what,$middle, + &Apache::lonnet::metadata($middle,$what), + $uname,$udom,$issection,$issection,$courseopt); my $showvalue = $value; if ($istype{$parmname} eq '') { my $type = &standard_parameter_types($parmname); @@ -4636,66 +5531,67 @@ sub parm_change_log { } } } else { - if (&isdateparm($istype{$parmname})) { - $showvalue = - &Apache::lonlocal::locallocaltime($value); - } + if (&isdateparm($istype{$parmname})) { + $showvalue = &Apache::lonlocal::locallocaltime($value); + } } $output .= $showvalue; - if ($value ne $all[$level]) { - $output .= '
'.&mt('Not active anymore').''; - } else { - $stillactive=1; - } - } - } - $output .= ''; - - unless ($readonly) { - $output .= ''; - if ($stillactive) { - my $parmitem = &standard_parameter_names($parmname); - $parmitem = &mt($parmitem); - my $title=&mt('Changed [_1]',$parmitem); - my $description=&mt('Changed [_1] for [_2] to [_3]', - $parmitem,$realmdescription, - (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value)); - if (($uname) && ($udom)) { - $output .= - &Apache::loncommon::messagewrapper('Notify User', - $uname,$udom,$title, - $description); + if ($value ne $all[$level]) { + $output .= '
'.&mt('Not active anymore').''; } else { - $output .= - &Apache::lonrss::course_blog_link($id,$title, - $description); + $stillactive=1; } } - $output .= ''; } - $output .= &Apache::loncommon::end_data_table_row(); - } + $output .= ''; + + if ($stillactive) { + my $parmitem = &standard_parameter_names($parmname); + $parmitem = &mt($parmitem); + my $title=&mt('Changed [_1]',$parmitem); + my $description=&mt('Changed [_1] for [_2] to [_3]', + $parmitem,$realmdescription, + (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value)); + if (($uname) && ($udom)) { + $output .= + &Apache::loncommon::messagewrapper('Notify User', + $uname,$udom,$title, + $description); + } else { + $output .= + &Apache::lonrss::course_blog_link($id,$title, + $description); + } + } + $output .= ''.&Apache::loncommon::end_data_table_row(); + } if ($env{'form.displayfilter'} eq 'containing') { - my $wholeentry=$about_me_link.':'. - $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'. - $output; - if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; } - } + my $wholeentry=$about_me_link.':'. + $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'. + $output; + if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; } + } if ($count) { - $r->print($row_start.''.$time.' - '.$about_me_link. - '
'.$parmlog{$id}{'exe_uname'}. - ':'.$parmlog{$id}{'exe_udom'}.''. - $send_msg_link.''.$output); - $shown++; - } - if (!($env{'form.show'} eq &mt('all') - || $shown<=$env{'form.show'})) { last; } + $r->print($row_start.''.$time.' + '.$about_me_link. + '
'.$parmlog{$id}{'exe_uname'}. + ':'.$parmlog{$id}{'exe_udom'}.''. + $send_msg_link.''.$output); + $shown++; + } + if (!($env{'form.show'} eq &mt('all') + || $shown<=$env{'form.show'})) { last; } } $r->print(&Apache::loncommon::end_data_table()); + &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } +################################################## +# MISC ! +################################################## + +# Used by table UI sub update_slots { my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_; my %slot=&Apache::lonnet::get_slot($slot_name); @@ -4741,14 +5637,15 @@ sub update_slots { context => 'parameter', ); &Apache::lonnet::write_log('course','slotreservationslog',\%storehash, - '',$uname,$udom,$cnum,$cdom); + '',$uname,$udom,$cnum,$cdom); &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash, - '',$uname,$udom,$uname,$udom); + '',$uname,$udom,$uname,$udom); } return $success; } +# Used by table UI sub delete_slots { my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_; my $delresult; @@ -4775,15 +5672,16 @@ sub delete_slots { context => 'parameter', ); &Apache::lonnet::write_log('course','slotreservationslog',\%storehash, - 1,$uname,$udom,$cnum,$cdom); + 1,$uname,$udom,$cnum,$cdom); &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash, - 1,$uname,$udom,$uname,$udom); + 1,$uname,$udom,$uname,$udom); } } } return $delresult; } +# Used by handler sub check_for_course_info { my $navmap = Apache::lonnavmaps::navmap->new(); return 1 if ($navmap); @@ -4800,105 +5698,45 @@ sub parameter_release_vars { } sub parameter_releasecheck { - my ($name,$value,$needsrelease,$cmajor,$cminor) = @_; + my ($name,$value,$valmatch,$namematch,$needsrelease,$cmajor,$cminor) = @_; my $needsnewer; my ($needsmajor,$needsminor) = split(/\./,$needsrelease); if (($cmajor < $needsmajor) || ($cmajor == $needsmajor && $cminor < $needsminor)) { $needsnewer = 1; - } else { - &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value}); + } elsif ($name) { + if ($valmatch) { + &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.'::'.$valmatch.':'}); + } elsif ($value) { + &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value.'::'}); + } + } elsif ($namematch) { + &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter::::'.$namematch}); } return $needsnewer; } -sub oldversion_warning { - my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_; - my $desc; - my %stringtypes = ( - type => 'string_questiontype', - lenient => 'string_lenient', - retrypartial => 'string_yesno', - discussvote => 'string_discussvote', - examcode => 'string_examcode', - ); - if (exists($stringtypes{$name})) { - if ($name eq 'examcode') { - $desc = $value; - } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') { - foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) { - next unless (ref($possibilities) eq 'ARRAY'); - my ($parmval, $description) = @{ $possibilities }; - if ($parmval eq $value) { - $desc = $description; - last; - } - } - } - } elsif (($name eq 'printstartdate') || ($name eq 'printenddate')) { - my $now = time; - if ($value =~ /^\d+$/) { - if ($name eq 'printstartdate') { - if ($value > $now) { - $desc = &Apache::lonlocal::locallocaltime($value); - } - } elsif ($name eq 'printenddate') { - if ($value < $now) { - $desc = &Apache::lonlocal::locallocaltime($value); - } - } - } - } - my $standard_name = &standard_parameter_names($name); - return '

'. - &mt('[_1] was [_2]not[_3] set to [_4].', - $standard_name,'','','"'.$desc.'"').'
'. - &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).', - $cmajor.'.'.$cminor,$chostname, - $needsrelease). - '

'; -} - -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 +################################################## +# Main handler for lonparmset. +# Sub called based on request parameters action and command: +# no command or action: print_main_menu +# command 'set': assessparms (direct access to table mode for a resource) +# (this can also be accessed simply with the symb parameter) +# action 'setoverview': overview (display all existing parameter settings) +# action 'addmetadata': addmetafield (called to add a portfolio metadata field) +# action 'ordermetadata': order_meta_fields (called to order portfolio metadata fields) +# action 'setrestrictmeta': setrestrictmeta (display or save portfolio metadata) +# action 'newoverview': newoverview (overview mode) +# action 'setdefaults': defaultsetter (UI to change parameter setting default actions) +# action 'settable': assessparms (table mode) +# action 'parameterchangelog': parm_change_log (display log for parameter changes, +# blog postings, user notification changes) +# action 'cleanparameters': clean_parameters (unused) +# action 'dateshift1': date_shift_one (overview mode, shift all dates) +# action 'dateshift2': date_shift_two (overview mode, shift all dates) sub handler { my $r=shift; @@ -4926,25 +5764,25 @@ sub handler { 'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'}); # ----------------------------------------------------- Needs to be in a course - my ($parm_permission,$allowed) = &get_permission(); + my $parm_permission = + (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) || + &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'. + $env{'request.course.sec'})); my $exists = &check_for_course_info(); - if ($env{'request.course.id'} && $allowed && $exists) { + if ($env{'request.course.id'} && $parm_permission && $exists) { # # Main switch on form.action and form.state, as appropriate # # Check first if coming from someone else headed directly for # the table mode - if (($parm_permission->{'set'}) && - ((($env{'form.command'} eq 'set') && ($env{'form.url'}) - && (!$env{'form.dis'})) || ($env{'form.symb'}))) { - &assessparms($r,$parm_permission); + if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) + && (!$env{'form.dis'})) || ($env{'form.symb'})) { + &assessparms($r); } elsif (! exists($env{'form.action'})) { &print_main_menu($r,$parm_permission); - } elsif (!$parm_permission->{$env{'form.action'}}) { - &print_main_menu($r,$parm_permission); } elsif ($env{'form.action'} eq 'setoverview') { - &overview($r,$parm_permission); + &overview($r); } elsif ($env{'form.action'} eq 'addmetadata') { &addmetafield($r); } elsif ($env{'form.action'} eq 'ordermetadata') { @@ -4952,13 +5790,13 @@ sub handler { } elsif ($env{'form.action'} eq 'setrestrictmeta') { &setrestrictmeta($r); } elsif ($env{'form.action'} eq 'newoverview') { - &newoverview($r,$parm_permission); + &newoverview($r); } elsif ($env{'form.action'} eq 'setdefaults') { &defaultsetter($r); } elsif ($env{'form.action'} eq 'settable') { - &assessparms($r,$parm_permission); + &assessparms($r); } elsif ($env{'form.action'} eq 'parameterchangelog') { - &parm_change_log($r,$parm_permission); + &parm_change_log($r); } elsif ($env{'form.action'} eq 'cleanparameters') { &clean_parameters($r); } elsif ($env{'form.action'} eq 'dateshift1') { @@ -4968,14 +5806,14 @@ sub handler { } } else { # ----------------------------- Not in a course, or not allowed to modify parms - if ($exists) { - $env{'user.error.msg'}= - "/adm/parmset:opa:0:0:Cannot modify assessment parameters"; - } else { - $env{'user.error.msg'}= - "/adm/parmset::0:1:Course environment gone, reinitialize the course"; - } - return HTTP_NOT_ACCEPTABLE; + if ($exists) { + $env{'user.error.msg'}= + "/adm/parmset:opa:0:0:Cannot modify assessment parameters"; + } else { + $env{'user.error.msg'}= + "/adm/parmset::0:1:Course environment gone, reinitialize the course"; + } + return HTTP_NOT_ACCEPTABLE; } &reset_caches();