--- loncom/interface/lonparmset.pm 2009/01/27 15:59:30 1.425 +++ loncom/interface/lonparmset.pm 2011/01/13 17:44:30 1.506 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.425 2009/01/27 15:59:30 schafran Exp $ +# $Id: lonparmset.pm,v 1.506 2011/01/13 17:44:30 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -214,19 +214,6 @@ Variables used (guessed by Jeremy): When storing information, store as part 0 When requesting information, request from full part -=item crsenv() - -Show and set course data and parameters. This is a large routine that should -be simplified and shortened... someday. - -Inputs: $r - -Returns: nothing - -=item can_modify_catsettings() - -=item assign_course_categories() - =item tablestart() =item tableend() @@ -261,37 +248,6 @@ Returns: nothing =item parse_key() -=item check_cloners() : - -Checks if new users included in list of allowed cloners -are valid users. Replaces supplied list with -cleaned list containing only users with valid usernames -and domains. - -Inputs: $clonelist, $oldcloner -where $clonelist is ref to array of requested cloners, -and $oldcloner is ref to array of currently allowed -cloners. - -Returns: string - comma separated list of requested -cloners (username:domain) who do not exist in system. - -=item change_clone() : - -Modifies the list of courses a user can clone (stored -in the user's environment.db file), called when a -change is made to the list of users allowed to clone -a course. - -Inputs: $action,$cloner -where $action is add or drop, and $cloner is identity of -user for whom cloning ability is to be changed in course. - - -=item check_cloners() - -=item change_clone() - =item header() Output html header for page @@ -322,7 +278,7 @@ Set portfolio metadata =item handler() : -Main handler. Calls &assessparms and &crsenv subroutines. +Main handler. Calls &assessparms subroutine. =back @@ -346,6 +302,7 @@ use Apache::lonlocal; use Apache::lonnavmaps; use Apache::longroup; use Apache::lonrss; +use HTML::Entities; use LONCAPA qw(:DEFAULT :match); @@ -360,13 +317,13 @@ sub parmval_by_symb { my $useropt; if ($uname ne '' && $udom ne '') { - $useropt = &Apache::lonnet::get_userresdata($uname,$udom); + $useropt = &Apache::lonnet::get_userresdata($uname,$udom); } my $result=''; my @outpar=(); # ----------------------------------------------------- Cascading lookup scheme - my $map=(&Apache::lonnet::decode_symb($symb))[0]; + my $map=(&Apache::lonnet::decode_symb($symb))[0]; $map = &Apache::lonnet::deversion($map); my $symbparm=$symb.'.'.$what; @@ -388,13 +345,13 @@ sub parmval_by_symb { # --------------------------------------------------------- first, check course if (defined($$courseopt{$courselevel})) { - $outpar[14]=$$courseopt{$courselevel}; - $result=14; + $outpar[14]=$$courseopt{$courselevel}; + $result=14; } if (defined($$courseopt{$courselevelm})) { - $outpar[13]=$$courseopt{$courselevelm}; - $result=13; + $outpar[13]=$$courseopt{$courselevelm}; + $result=13; } # ------------------------------------------------------- second, check default @@ -407,25 +364,25 @@ sub parmval_by_symb { if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; } if (defined($$courseopt{$courselevelr})) { - $outpar[10]=$$courseopt{$courselevelr}; - $result=10; + $outpar[10]=$$courseopt{$courselevelr}; + $result=10; } # ------------------------------------------------------ fourth, back to course if ($csec ne '') { if (defined($$courseopt{$seclevel})) { - $outpar[9]=$$courseopt{$seclevel}; - $result=9; - } + $outpar[9]=$$courseopt{$seclevel}; + $result=9; + } if (defined($$courseopt{$seclevelm})) { - $outpar[8]=$$courseopt{$seclevelm}; - $result=8; - } + $outpar[8]=$$courseopt{$seclevelm}; + $result=8; + } if (defined($$courseopt{$seclevelr})) { - $outpar[7]=$$courseopt{$seclevelr}; - $result=7; - } + $outpar[7]=$$courseopt{$seclevelr}; + $result=7; + } } # ------------------------------------------------------ fifth, check course group if ($cgroup ne '') { @@ -446,20 +403,20 @@ sub parmval_by_symb { # ---------------------------------------------------------- fifth, check user if ($uname ne '') { - if (defined($$useropt{$courselevel})) { - $outpar[3]=$$useropt{$courselevel}; - $result=3; - } - - if (defined($$useropt{$courselevelm})) { - $outpar[2]=$$useropt{$courselevelm}; - $result=2; - } - - if (defined($$useropt{$courselevelr})) { - $outpar[1]=$$useropt{$courselevelr}; - $result=1; - } + if (defined($$useropt{$courselevel})) { + $outpar[3]=$$useropt{$courselevel}; + $result=3; + } + + if (defined($$useropt{$courselevelm})) { + $outpar[2]=$$useropt{$courselevelm}; + $result=2; + } + + if (defined($$useropt{$courselevelr})) { + $outpar[1]=$$useropt{$courselevelr}; + $result=1; + } } return ($result,@outpar); } @@ -468,7 +425,7 @@ sub parmval_by_symb { # --- Caches local to lonparmset - + sub reset_caches { &resetparmhash(); &resetsymbcache(); @@ -479,74 +436,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()); - } - $symbsid=$env{'request.course.id'}; - } - return $symbs{$id}; + 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'}; + } + 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}; } } @@ -556,13 +513,13 @@ 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')); + return (&rulescache($type.'_hours'), + &rulescache($type.'_min'), + &rulescache($type.'_sec'), + &rulescache($type.'_value')); } else { # nothing there or something else - return ('','','','',''); + return ('','','','',''); } } @@ -627,12 +584,12 @@ sub storeparm_by_symb { my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_; unless ($recflag) { # first time call - %recstack=(); - $recflag=1; + %recstack=(); + $recflag=1; } # store parameter &storeparm_by_symb_inner - ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup); + ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup); # don't do anything if parameter was reset unless ($nval) { return; } my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/); @@ -642,33 +599,33 @@ sub storeparm_by_symb { foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) { # don't backfire unless ((!$triggered) || ($recstack{$triggered})) { - my $action=&rulescache($triggered.'_action'); - my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/); + 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/) { + 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); - } + 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 ''; @@ -683,7 +640,7 @@ sub storeparm_by_symb_inner { my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_; # ---------------------------------------------------------- Construct prefixes $spnam=~s/\_([^\_]+)$/\.$1/; - my $map=(&Apache::lonnet::decode_symb($symb))[0]; + my $map=(&Apache::lonnet::decode_symb($symb))[0]; $map = &Apache::lonnet::deversion($map); my $symbparm=$symb.'.'.$spnam; @@ -696,11 +653,11 @@ sub storeparm_by_symb_inner { my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam; my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm; my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm; - + my $courselevel=$env{'request.course.id'}.'.'.$spnam; my $courselevelr=$env{'request.course.id'}.'.'.$symbparm; my $courselevelm=$env{'request.course.id'}.'.'.$mapparm; - + my $storeunder=''; if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; } if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; } @@ -712,66 +669,66 @@ sub storeparm_by_symb_inner { if ($snum==5) { $storeunder=$grplevelm; } if ($snum==4) { $storeunder=$grplevelr; } - + my $delete; if ($nval eq '') { $delete=1;} my %storecontent = ($storeunder => $nval, - $storeunder.'.type' => $ntype); + $storeunder.'.type' => $ntype); my $reply=''; if ($snum>3) { # ---------------------------------------------------------------- Store Course # - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + 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'); - } + &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); + 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 { + $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'); - } + &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 ($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 ''; } @@ -782,11 +739,11 @@ sub valout { my $result = ''; # Values of zero are valid. if (! $value && $value ne '0') { - if ($editable) { - $result = '*'; - } else { - $result=' '; - } + if ($editable) { + $result = '*'; + } else { + $result=' '; + } } else { if ($type eq 'date_interval') { my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value); @@ -824,10 +781,10 @@ sub valout { $result.=join(", ",@timer); } elsif (&isdateparm($type)) { $result = &Apache::lonlocal::locallocaltime($value). - &date_sanity_info($value); + &date_sanity_info($value); } else { $result = $value; - $result = &HTML::Entities::encode($result,'"<>&'); + $result = &HTML::Entities::encode($result,'"<>&'); } } return $result; @@ -838,7 +795,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]}; @@ -848,15 +805,16 @@ sub plink { my ($hour,$min,$sec,$val)=&preset_defaults($parmname); unless (defined($winvalue)) { $winvalue=$val; } my $valout = &valout($value,$type,1); + my $unencmarker = $marker; foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call, - \$hour, \$min, \$sec) { - $$item = &HTML::Entities::encode($$item,'"<>&'); - $$item =~ s/\'/\\\'/g; - } - return '
'. - ''. - $valout.'
'; + \$hour, \$min, \$sec) { + $$item = &HTML::Entities::encode($$item,'"<>&'); + $$item =~ s/\'/\\\'/g; + } + return '
'. + ''. + $valout.'
'; } sub page_js { @@ -866,7 +824,7 @@ sub page_js { return(< - +// $selscript ENDJS @@ -914,23 +873,26 @@ sub startpage { my ($r) = @_; my %loaditems = ('onunload' => "pclose()", - 'onload' => "group_or_section('cgroup')",); + 'onload' => "showHide_courseContent(); group_or_section('cgroup')", + ); 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"}); + && (!$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'}); - } - my $start_page = - &Apache::loncommon::start_page('Set/Modify Course Parameters', - &page_js(), - {'add_entries' => \%loaditems,}); - my $breadcrumbs = - &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode'); + &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', + text=>"Table Mode", + help => 'Course_Setting_Parameters'}); + } + my $start_page = + &Apache::loncommon::start_page('Set/Modify Course Parameters', + &page_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(< + + ENDHEAD } sub print_row { my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone, - $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_; + $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); # get the values for the parameter in cascading order # empty levels will remain empty my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which}, - $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt); + $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt); # 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); + $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt); # cascade down manually my $cascadetype=$$defaulttype{$which}; for (my $i=14;$i>0;$i--) { - if ($typeoutpar[$i]) { + if ($typeoutpar[$i]) { $cascadetype=$typeoutpar[$i]; - } else { + } else { $typeoutpar[$i]=$cascadetype; } } @@ -971,16 +935,16 @@ sub print_row { if ($parmlev eq 'full') { $r->print('' - .$$part{$which}.''); - } else { + .($$part{$which} eq '0'?'0 ('.&mt('default').')':$$part{$which}).''); + } else { $parm=~s|\[.*\]\s||g; } 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.''); - + $r->print(''.$parm.''); + my $thismarker=$which; $thismarker=~s/^parameter\_//; my $mprefix=$rid.'&'.$thismarker.'&'; @@ -994,9 +958,9 @@ sub print_row { } elsif ($cgroup) { &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } elsif ($csec) { - &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } else { - &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } } elsif ($parmlev eq 'map') { @@ -1029,31 +993,31 @@ sub print_row { &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - - if ($csec) { - &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - } + &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + + if ($csec) { + &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } if ($cgroup) { &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } - - if ($uname) { + + if ($uname) { if ($othergrp) { $r->print($othergrp); } - &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - } + &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } } # end of $parmlev if/else $r->print(''.$effective_parm.''); @@ -1075,12 +1039,20 @@ sub print_td { my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_; $r->print(''); - if ($which<11 || $which > 12) { - $r->print(&plink($$typeoutpar[$which], - $$display{$value},$$outpar[$which], - $mprefix."$which",'parmform.pres','psub')); + my $nolink = 0; + if ($which == 11 || $which == 12) { + $nolink = 1; + } elsif ($mprefix =~ /availablestudent\&$/) { + if ($which > 3) { + $nolink = 1; + } + } + if ($nolink) { + $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); } else { - $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); + $r->print(&plink($$typeoutpar[$which], + $$display{$value},$$outpar[$which], + $mprefix."$which",'parmform.pres','psub')); } $r->print(''."\n"); } @@ -1098,7 +1070,7 @@ sub print_usergroups { $courseopt); my $bgcolor = $defbg; my $grp_parm; - if (($coursereply) && ($cgroup ne $resultgroup)) { + if (($coursereply) && ($cgroup ne $resultgroup)) { if ($result > 3) { $bgcolor = '#AAFFAA'; $grp_parm = &valout($coursereply,$resulttype); @@ -1162,75 +1134,80 @@ sub extractResourceInformation { my $navmap = Apache::lonnavmaps::navmap->new(); my @allres=$navmap->retrieveResources(undef,undef,1,undef,1); foreach my $resource (@allres) { - my $id=$resource->id(); + my $id=$resource->id(); my ($mapid,$resid)=split(/\./,$id); - if ($mapid eq '0') { next; } - $$ids[$#$ids+1]=$id; - my $srcf=$resource->src(); - $srcf=~/\.(\w+)$/; - $$typep{$id}=$1; - $$keyp{$id}=''; + if ($mapid eq '0') { next; } + $$ids[$#$ids+1]=$id; + my $srcf=$resource->src(); + $srcf=~/\.(\w+)$/; + $$typep{$id}=$1; + $$keyp{$id}=''; $$uris{$id}=$srcf; - foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) { - next if ($key!~/^parameter_/); + foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) { + next if ($key!~/^parameter_/); # Hidden parameters - next if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm'); + next if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm'); # # allparms is a hash of parameter names # - my $name=&Apache::lonnet::metadata($srcf,$key.'.name'); - if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) { - my $display= &Apache::lonnet::metadata($srcf,$key.'.display'); - my $parmdis = $display; - $parmdis =~ s/\s*\[Part.*$//g; - $$allparms{$name}=$parmdis; - if (ref($defkeytype)) { - $$defkeytype{$name}= - &Apache::lonnet::metadata($srcf,$key.'.type'); - } - } + my $name=&Apache::lonnet::metadata($srcf,$key.'.name'); + if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) { + my ($display,$parmdis); + $display = &standard_parameter_names($name); + if ($display eq '') { + $display= &Apache::lonnet::metadata($srcf,$key.'.display'); + $parmdis = $display; + $parmdis =~ s/\s*\[Part.*$//g; + } else { + $parmdis = &mt($display); + } + $$allparms{$name}=$parmdis; + if (ref($defkeytype)) { + $$defkeytype{$name}= + &Apache::lonnet::metadata($srcf,$key.'.type'); + } + } # # allparts is a hash of all parts # - my $part= &Apache::lonnet::metadata($srcf,$key.'.part'); - $$allparts{$part} = &mt('Part: [_1]',$part); + my $part= &Apache::lonnet::metadata($srcf,$key.'.part'); + $$allparts{$part} = &mt('Part: [_1]',$part); # # Remember all keys going with this resource # - if ($$keyp{$id}) { - $$keyp{$id}.=','.$key; - } else { - $$keyp{$id}=$key; - } + if ($$keyp{$id}) { + $$keyp{$id}.=','.$key; + } else { + $$keyp{$id}=$key; + } # # Put in order -# - unless ($$keyorder{$key}) { - $$keyorder{$key}=$keyordercnt; - $keyordercnt++; - } - } - - - if (!exists($$mapp{$mapid})) { - $$mapp{$id}= - &Apache::lonnet::declutter($resource->enclosing_map_src()); - $$mapp{$mapid}=$$mapp{$id}; - $$allmaps{$mapid}=$$mapp{$id}; - if ($mapid eq '1') { - $$maptitles{$mapid}=&mt('Main Course Documents'); - } else { - $$maptitles{$mapid}= - &Apache::lonnet::gettitle($$mapp{$id}); - } - $$maptitles{$$mapp{$id}}=$$maptitles{$mapid}; - $$symbp{$mapid}=$$mapp{$id}.'___(all)'; - } else { - $$mapp{$id} = $$mapp{$mapid}; - } - $$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf); +# + unless ($$keyorder{$key}) { + $$keyorder{$key}=$keyordercnt; + $keyordercnt++; + } + } + + + if (!exists($$mapp{$mapid})) { + $$mapp{$id}= + &Apache::lonnet::declutter($resource->enclosing_map_src()); + $$mapp{$mapid}=$$mapp{$id}; + $$allmaps{$mapid}=$$mapp{$id}; + if ($mapid eq '1') { + $$maptitles{$mapid}=&mt('Main Course Documents'); + } else { + $$maptitles{$mapid}=&Apache::lonnet::gettitle($$mapp{$id}); + } + $$maptitles{$$mapp{$id}}=$$maptitles{$mapid}; + $$symbp{$mapid}=$$mapp{$id}.'___(all)'; + } else { + $$mapp{$id} = $$mapp{$mapid}; + } + $$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf); } } @@ -1241,133 +1218,353 @@ sub isdateparm { return (($type=~/^date/) && (!($type eq 'date_interval'))); } +# +# parmmenu displays a list of the selected parameters. +# It also offers a link to show/hide the complete parameter list +# from which you can select all desired parameters. +# sub parmmenu { my ($r,$allparms,$pscat,$keyorder)=@_; my $tempkey; $r->print(< +// ENDSCRIPT - $r->print(); - $r->print("\n".''); - my $cnt=0; + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View'))); + + #part to print selected parms overview + $r->print(&mt('Selected Parameters:').'
'); + + #print out all possible parms and hide them by default + $r->print('
    '); foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) { - $r->print("\n".'
'); - $cnt++; - if ($cnt==3) { - $r->print("\n"); - $cnt=0; - } - } - $r->print('' - .'' - .'' - .'' - .'
' - .'
'.&mt('Parameter Selection').'' - .'' - .'• '.&mt('Select All').'' - .'' - .'
' - .'' - .'• '.&mt('Select Common Only').'' - .'' - .'
' - .'' - .'• '.&mt('Unselect All').'' - .'' - .'
' - .'
' - .'
'.&mt('Add Selection for...').'' - .'' - .'• '.&mt('Problem Dates').'' - .'' - .'' - .' • '.&mt('Content Dates').'' - .'' -# .'
' - .'' - .' • '.&mt('Discussion Settings').'' - .'' - .'' - .' • '.&mt('Visibilities').'' - .'' -# .'
' - .'' - .' • '.&mt('Part Parameters').'' - .'' - .'
' - .'
' + $r->print('
  • print(' style="display:none"'); + } + $r->print('>' + .($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey} : $tempkey) + .'
  • ' + ); + } + $r->print(''); + + $r->print('
    '); + &shortCuts($r,$allparms,$pscat,$keyorder); + $r->print('
    '); + + $r->print( + '

    ' + .&mt('Show detailed Parameter Selection') + .'

    ' + ); + + $r->print(&Apache::lonhtmlcommon::row_closure(1)); +} +# return a hash +sub categories { + return ('time_settings' => 'Time Settings', + 'grading' => 'Grading', + 'tries' => 'Tries', + 'problem_appearance' => 'Problem Appearance', + 'behaviour_of_input_fields' => 'Behaviour of Input Fields', + 'hiding' => 'Hiding', + 'high_level_randomization' => 'High Level Randomization', + 'slots' => 'Slots', + 'file_submission' => 'File Submission', + 'misc' => 'Miscellaneous' ); +} + +# return a hash. Like a look-up table +sub lookUpTableParameter { + + return ( + 'opendate' => 'time_settings', + 'duedate' => 'time_settings', + 'answerdate' => 'time_settings', + 'interval' => 'time_settings', + 'contentopen' => 'time_settings', + 'contentclose' => 'time_settings', + 'discussend' => 'time_settings', + 'weight' => 'grading', + 'handgrade' => 'grading', + 'maxtries' => 'tries', + 'hinttries' => 'tries', + 'randomizeontries' => 'tries', + 'type' => 'problem_appearance', + 'problemstatus' => 'problem_appearance', + 'display' => 'problem_appearance', + 'ordered' => 'problem_appearance', + 'numbubbles' => 'problem_appearance', + 'tol' => 'behaviour_of_input_fields', + 'sig' => 'behaviour_of_input_fields', + 'turnoffunit' => 'behaviour_of_input_fields', + 'hiddenresource' => 'hiding', + 'hiddenparts' => 'hiding', + 'discusshide' => 'hiding', + 'buttonshide' => 'hiding', + 'turnoffeditor' => 'hiding', + 'encrypturl' => 'hiding', + 'randomorder' => 'high_level_randomization', + 'randompick' => 'high_level_randomization', + 'available' => 'slots', + 'useslots' => 'slots', + 'availablestudent' => 'slots', + 'uploadedfiletypes' => 'file_submission', + 'maxfilesize' => 'file_submission', + 'cssfile' => 'misc', + 'mapalias' => 'misc', + 'acc' => 'misc', + 'maxcollaborators' => 'misc', + 'scoreformat' => 'misc', + + ); +} + +sub whatIsMyCategory { + my $name = shift; + my $catList = shift; + my @list; + my %lookUpList = &lookUpTableParameter; #Initilize the lookupList + my $cat = $lookUpList{$name}; + if (defined($cat)) { + if (!defined($$catList{$cat})){ + push @list, ($name); + $$catList{$cat} = \@list; + } else { + push @{${$catList}{$cat}}, ($name); + } + } else { + if (!defined($$catList{'misc'})){ + push @list, ($name); + $$catList{'misc'} = \@list; + } else { + push @{${$catList}{'misc'}}, ($name); + } + } +} + +sub keysindisplayorderCategory { + my ($name,$keyorder)=@_; + return sort { + $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b}; + } ( @{$name}); +} + +sub category_order { + return ( + 'time_settings' => 1, + 'grading' => 2, + 'tries' => 3, + 'problem_appearance' => 4, + 'hiding' => 5, + 'behaviour_of_input_fields' => 6, + 'high_level_randomization' => 7, + 'slots' => 8, + 'file_submission' => 9, + 'misc' => 10 + ); + +} + +sub parmboxes { + my ($r,$allparms,$pscat,$keyorder)=@_; + my $tempkey; + my $tempparameter; + my %categories = &categories; + my %category_order = &category_order(); + my %categoryList = ( + 'time_settings' => [], + 'grading' => [], + 'tries' => [], + 'problem_appearance' => [], + 'behaviour_of_input_fields' => [], + 'hiding' => [], + 'high_level_randomization' => [], + 'slots' => [], + 'file_submission' => [], + 'misc' => [], + ); + my $hidelink = + '

    ' + .'' + .&mt('Hide detailed Parameter Selection') + .'' + .'

    ' + ."\n"; +; + foreach $tempparameter (keys %$allparms) { + &whatIsMyCategory($tempparameter, \%categoryList); + } + #part to print the parm-list + $r->print( + '\n" + ); +} +# +# This function offers some links on the parameter section to get with one click a group a parameters +# +sub shortCuts { + my ($r,$allparms,$pscat,$keyorder)=@_; + + # Parameter Selection + $r->print( + &Apache::lonhtmlcommon::start_funclist(&mt('Parameter Selection')) + .&Apache::lonhtmlcommon::add_item_funclist( + ''.&mt('Select All').'') + .&Apache::lonhtmlcommon::add_item_funclist( + ''.&mt('Select Common Only').'') + .&Apache::lonhtmlcommon::add_item_funclist( + ''.&mt('Unselect All').'') + .&Apache::lonhtmlcommon::end_funclist() + ); + + # Add Selection for... + $r->print( + &Apache::lonhtmlcommon::start_funclist(&mt('Add Selection for...')) + .&Apache::lonhtmlcommon::add_item_funclist( + ''.&mt('Problem Dates').'') + .&Apache::lonhtmlcommon::add_item_funclist( + ''.&mt('Content Dates').'') + .&Apache::lonhtmlcommon::add_item_funclist( + ''.&mt('Discussion Settings').'') + .&Apache::lonhtmlcommon::add_item_funclist( + ''.&mt('Visibilities').'') + .&Apache::lonhtmlcommon::add_item_funclist( + ''.&mt('Part Parameters').'') + .&Apache::lonhtmlcommon::end_funclist() ); } sub partmenu { my ($r,$allparts,$psprt)=@_; + $r->print(''); } @@ -1409,9 +1606,9 @@ sub usermenu { $sections .= qq| onchange="group_or_section('csec')" |; } $sections .= '>'; - foreach my $section ('',sort keys %sectionhash) { - $sections.=''; } $sections.=''; @@ -1421,6 +1618,7 @@ sub usermenu { $sections .= ' '.&mt('or').' '; $sections .= qq| |; } else { $sections .= qq| |; - } + } if (%grouphash) { $groups=&mt('Group:').' ' ,' ' - ,$chooseopt) - .'' - .'' - ); + ,$chooseopt)); } +# +# This function shows on table Mode the available Parameters for the selected Resources +# sub displaymenu { my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_; - $r->print('
    '.&mt('Select Parameters to View').''. - &mt('Select Parts to View').'
    '); + $r->print(&Apache::lonhtmlcommon::start_pick_box()); &parmmenu($r,$allparms,$pscat,$keyorder); - $r->print(''); - &partmenu($r,$allparts,$psprt); - $r->print('
    '); + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + &parmboxes($r,$allparms,$pscat,$keyorder); } sub mapmenu { - my ($r,$allmaps,$pschp,$maptitles)=@_; - $r->print(''.&mt('Select Enclosing Map or Folder').' '); - $r->print('print(' checked="checked"') if ($pschp eq 'all' || !$pschp); + $r->print( + ' value="all" /> '.$icon.' ' + .&mt('All Maps or Folders') + .'' + .'
    ' + .&Apache::loncommon::end_data_table_row() + ); + + # Display row: "Main Course Documents" + if (exists($$allmaps{1})) { + $r->print( + &Apache::loncommon::start_data_table_row() + .'' + .'' + .'' + .&Apache::loncommon::end_data_table_row() + ); + } + + # Display rows for all course maps and folders + foreach my $id (@{$tree}) { + my ($mapid,$resid)=split(/\./,$id); + # Indentation + my $depth = $treeinfo->{$id}->{'depth'}; + my $indent; + for (my $i = 0; $i < $depth; $i++) { + $indent.= $whitespace; + } + $icon = ''; + if ($treeinfo->{$id}->{'type'} eq 'page') { + $icon = ''; + } + my $symb_name = $$symbp{$id}; + my ($front, $tail) = split (/___${resid}___/, $symb_name); + $symb_name = $tail; + $r->print( + &Apache::loncommon::start_data_table_row() + .'' + .'' + .'' + .&Apache::loncommon::end_data_table_row() + ); + } + + $r->print(&Apache::loncommon::end_data_table()); } - $r->print(""); } +# Build up the select Box to choose if your parameter specification should work for the resource, map/folder or the course level +# The value of default selection in the select box is set by the value that is given by the argument in $parmlev. sub levelmenu { my ($r,$alllevs,$parmlev)=@_; - $r->print(''.&mt('Select Parameter Level'). - &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' '); - $r->print(''); foreach (reverse sort keys %{$alllevs}) { - $r->print(''); + $r->print(''); } $r->print(""); } @@ -1534,14 +1867,14 @@ sub sectionmenu { $r->print('\n"); } @@ -1553,14 +1886,14 @@ sub groupmenu { $r->print('\n"); } @@ -1574,26 +1907,26 @@ sub keysplit { sub keysinorder { my ($name,$keyorder)=@_; return sort { - $$keyorder{$a} <=> $$keyorder{$b}; + $$keyorder{$a} <=> $$keyorder{$b}; } (keys %{$name}); } sub keysinorder_bytype { my ($name,$keyorder)=@_; return sort { - my $ta=(split('_',$a))[-1]; - my $tb=(split('_',$b))[-1]; - if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) { - return ($a cmp $b); - } - $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb}; + my $ta=(split('_',$a))[-1]; + my $tb=(split('_',$b))[-1]; + if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) { + return ($a cmp $b); + } + $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb}; } (keys %{$name}); } sub keysindisplayorder { my ($name,$keyorder)=@_; return sort { - $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b}; + $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b}; } (keys %{$name}); } @@ -1609,28 +1942,28 @@ sub sortmenu { $r->print(' checked="checked"'); } $r->print(' />'.&mt('Sort by student (group/section) first, then realm'). - ''); + ''); } sub standardkeyorder { return ('parameter_0_opendate' => 1, - 'parameter_0_duedate' => 2, - 'parameter_0_answerdate' => 3, - 'parameter_0_interval' => 4, - 'parameter_0_weight' => 5, - 'parameter_0_maxtries' => 6, - 'parameter_0_hinttries' => 7, - 'parameter_0_contentopen' => 8, - 'parameter_0_contentclose' => 9, - 'parameter_0_type' => 10, - 'parameter_0_problemstatus' => 11, - 'parameter_0_hiddenresource' => 12, - 'parameter_0_hiddenparts' => 13, - 'parameter_0_display' => 14, - 'parameter_0_ordered' => 15, - 'parameter_0_tol' => 16, - 'parameter_0_sig' => 17, - 'parameter_0_turnoffunit' => 18, + 'parameter_0_duedate' => 2, + 'parameter_0_answerdate' => 3, + 'parameter_0_interval' => 4, + 'parameter_0_weight' => 5, + 'parameter_0_maxtries' => 6, + 'parameter_0_hinttries' => 7, + 'parameter_0_contentopen' => 8, + 'parameter_0_contentclose' => 9, + 'parameter_0_type' => 10, + 'parameter_0_problemstatus' => 11, + 'parameter_0_hiddenresource' => 12, + 'parameter_0_hiddenparts' => 13, + 'parameter_0_display' => 14, + 'parameter_0_ordered' => 15, + 'parameter_0_tol' => 16, + 'parameter_0_sig' => 17, + 'parameter_0_turnoffunit' => 18, 'parameter_0_discussend' => 19, 'parameter_0_discusshide' => 20); } @@ -1659,7 +1992,7 @@ sub assessparms { my $csec; my $cgroup; my @usersgroups = (); - + my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'}; $alllevs{'Resource Level'}='full'; @@ -1686,17 +2019,21 @@ sub assessparms { } elsif ($udom=$env{'request.role.domain'}) { } elsif ($udom=$env{'user.domain'}) { } else { - $udom=$r->dir_config('lonDefDomain'); + $udom=$r->dir_config('lonDefDomain'); } + my @pscat=&Apache::loncommon::get_env_multiple('form.pscat'); my $pschp=$env{'form.pschp'}; + + my @psprt=&Apache::loncommon::get_env_multiple('form.psprt'); if (!@psprt) { $psprt[0]='0'; } + if (($env{'form.part'}) && ($psprt[0] ne 'all')) { $psprt[0]=$env{'form.part'}; } my $pssymb=''; my $parmlev=''; - + unless ($env{'form.parmlev'}) { $parmlev = 'map'; } else { @@ -1706,63 +2043,62 @@ sub assessparms { # ----------------------------------------------- Was this started from grades? if (($env{'form.command'} eq 'set') && ($env{'form.url'}) - && (!$env{'form.dis'})) { - my $url=$env{'form.url'}; - $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--; - $pssymb=&Apache::lonnet::symbread($url); - if (!@pscat) { @pscat=('all'); } - $pschp=''; + && (!$env{'form.dis'})) { + my $url=$env{'form.url'}; + $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--; + $pssymb=&Apache::lonnet::symbread($url); + if (!@pscat) { @pscat=('all'); } + $pschp=''; $parmlev = 'full'; } elsif ($env{'form.symb'}) { - $pssymb=$env{'form.symb'}; - if (!@pscat) { @pscat=('all'); } - $pschp=''; + $pssymb=$env{'form.symb'}; + if (!@pscat) { @pscat=('all'); } + $pschp=''; $parmlev = 'full'; } else { - $env{'form.url'}=''; + $env{'form.url'}=''; } my $id=$env{'form.id'}; if (($id) && ($udom)) { - $uname=(&Apache::lonnet::idget($udom,$id))[1]; - if ($uname) { - $id=''; - } else { - $message= - ''.&mt("Unknown ID")." '$id' ". - &mt('at domain')." '$udom'"; - } + $uname=(&Apache::lonnet::idget($udom,$id))[1]; + if ($uname) { + $id=''; + } else { + $message= + ''.&mt("Unknown ID")." '$id' ". + &mt('at domain')." '$udom'"; + } } else { - $uname=$env{'form.uname'}; + $uname=$env{'form.uname'}; } unless ($udom) { $uname=''; } $uhome=''; if ($uname) { - $uhome=&Apache::lonnet::homeserver($uname,$udom); + $uhome=&Apache::lonnet::homeserver($uname,$udom); if ($uhome eq 'no_host') { - $message= - ''.&mt("Unknown user")." '$uname' ". - &mt("at domain")." '$udom'"; - $uname=''; + $message= + ''.&mt("Unknown user")." '$uname' ". + &mt("at domain")." '$udom'"; + $uname=''; } else { - $csec=&Apache::lonnet::getsection($udom,$uname, - $env{'request.course.id'}); - - if ($csec eq '-1') { - $message=''. - &mt("User")." '$uname' ".&mt("at domain")." '$udom' ". - &mt("not in this course").""; - $uname=''; - $csec=$env{'form.csec'}; + $csec=&Apache::lonnet::getsection($udom,$uname, + $env{'request.course.id'}); + if ($csec eq '-1') { + $message=''. + &mt("User")." '$uname' ".&mt("at domain")." '$udom' ". + &mt("not in this course").""; + $uname=''; + $csec=$env{'form.csec'}; $cgroup=$env{'form.cgroup'}; - } else { - my %name=&Apache::lonnet::userenvironment($udom,$uname, - ('firstname','middlename','lastname','generation','id')); - $message="\n

    \n".&mt("Full Name").": ". - $name{'firstname'}.' '.$name{'middlename'}.' ' - .$name{'lastname'}.' '.$name{'generation'}. - "
    \n".&mt('ID').": ".$name{'id'}.'

    '; - } + } else { + my %name=&Apache::lonnet::userenvironment($udom,$uname, + ('firstname','middlename','lastname','generation','id')); + $message="\n

    \n".&mt("Full Name").": ". + $name{'firstname'}.' '.$name{'middlename'}.' ' + .$name{'lastname'}.' '.$name{'generation'}. + "
    \n".&mt('Student/Employee ID').": ".$name{'id'}.'

    '; + } @usersgroups = &Apache::lonnet::get_users_groups( $udom,$uname,$env{'request.course.id'}); if (@usersgroups > 0) { @@ -1777,9 +2113,9 @@ sub assessparms { unless ($cgroup) { $cgroup=''; } # --------------------------------------------------------- Get all assessments - &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, - \%mapp, \%symbp,\%maptitles,\%uris, - \%keyorder); + &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, + \%mapp, \%symbp,\%maptitles,\%uris, + \%keyorder); $mapp{'0.0'} = ''; $symbp{'0.0'} = ''; @@ -1789,54 +2125,204 @@ sub assessparms { my @markers=split(/\&\&\&/,$env{'form.pres_marker'}); my @values=split(/\&\&\&/,$env{'form.pres_value'}); my @types=split(/\&\&\&/,$env{'form.pres_type'}); - for (my $i=0;$i<=$#markers;$i++) { - $message.=&storeparm(split(/\&/,$markers[$i]), - $values[$i], - $types[$i], - $uname,$udom,$csec,$cgroup); - } + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $chome = $env{'course.'.$env{'request.course.id'}.'.home'}; + my ($got_chostname,$chostname,$cmajor,$cminor); + my $totalstored = 0; + for (my $i=0;$i<=$#markers;$i++) { + my ($needsrelease,$needsnewer); + if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) { + my (@ok_slots,@fail_slots,@del_slots); + my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); + my ($level,@all) = + &parmval_by_symb('0.availablestudent',$pssymb,'',$uname,$udom, + $csec,$cgroup,$courseopt); + foreach my $slot_name (split(/:/,$values[$i])) { + next if ($slot_name eq ''); + if (&update_slots($slot_name,$cdom,$cnum,$pssymb,$uname,$udom) eq 'ok') { + push(@ok_slots,$slot_name); + + } else { + push(@fail_slots,$slot_name); + } + } + if (@ok_slots) { + $values[$i] = join(':',@ok_slots); + } else { + $values[$i] = ''; + } + if ($all[$level] ne '') { + my @existing = split(/:/,$all[$level]); + foreach my $slot_name (@existing) { + if (!grep(/^\Q$slot_name\E$/,split(/:/,$values[$i]))) { + if (&delete_slots($slot_name,$cdom,$cnum,$uname,$udom,$pssymb) eq 'ok') { + push(@del_slots,$slot_name); + } + } + } + } + } elsif ($markers[$i] =~ /_type\&\d+$/) { + $needsrelease = + $Apache::lonnet::needsrelease{'parameter:type:'.$values[$i]}; + if ($needsrelease) { + unless ($got_chostname) { + ($chostname,$cmajor,$cminor) = &questiontype_release_vars(); + $got_chostname = 1; + } + $needsnewer = &questiontype_releasecheck($values[$i], + $needsrelease, + $chostname, + $cmajor,$cminor); + } + } + if ($needsnewer) { + $message .= &oldversion_warning($values[$i],$chostname,$cmajor, + $cminor,$needsrelease); + } else { + $message.=&storeparm(split(/\&/,$markers[$i]), + $values[$i], + $types[$i], + $uname,$udom,$csec,$cgroup); + $totalstored ++; + } + } # ---------------------------------------------------------------- Done storing - $message.='

    '.&mt('Changes can take up to 10 minutes before being active for all students.').&Apache::loncommon::help_open_topic('Caching').'

    '; + if ($totalstored) { + $message.='

    ' + .&mt('Changes can take up to 10 minutes before being active for all students.') + .&Apache::loncommon::help_open_topic('Caching') + .'

    '; + } } #----------------------------------------------- if all selected, fill in array if ($pscat[0] eq "all") {@pscat = (keys %allparms);} - if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') }; + if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries','type','problemstatus') }; if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);} # ------------------------------------------------------------------ Start page &startpage($r); foreach ('tolerance','date_default','date_start','date_end', - 'date_interval','int','float','string') { - $r->print(''). - '" name="recent_'.$_.'" />'); + 'date_interval','int','float','string') { + $r->print(''). + '" name="recent_'.$_.'" />'); } - + + # ----- Start Parameter Selection + + # Hide parm selection? + $r->print(< +// + +ENDPARMSELSCRIPT + if (!$pssymb) { - $r->print(''); - if ($parmlev ne 'general') { - $r->print(''); - } - $r->print('
    '); + my $parmselhiddenstyle=' style="display:none"'; + if($env{'form.hideparmsel'} eq 'hidden') { + $r->print('
    '); + } else { + $r->print('
    '); + } + + # Step 1 + $r->print(&Apache::lonhtmlcommon::topic_bar(1,&mt('Resource Specification'))); + $r->print(< +// + +COURSECONTENTSCRIPT + + $r->print(&Apache::lonhtmlcommon::start_pick_box()); &levelmenu($r,\%alllevs,$parmlev); - $r->print('
    '); - &mapmenu($r,\%allmaps,$pschp,\%maptitles); - $r->print('
    '); - &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder); + $r->print(&Apache::lonhtmlcommon::row_closure()); + &mapmenu($r,\%allmaps,$pschp,\%maptitles, \%symbp); + $r->print(&Apache::lonhtmlcommon::row_closure()); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View'))); + &partmenu($r,\%allparts,\@psprt); + $r->print(&Apache::lonhtmlcommon::row_closure(1)); + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + + # Step 2 + $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'))); + &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder); + + # Step 3 + $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'))); + $r->print(&Apache::lonhtmlcommon::start_pick_box()); + &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups); + $r->print(&Apache::lonhtmlcommon::row_closure(1)); + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + + # Update Display Button + $r->print('

    ' + .'' + .'' + .'

    '); + $r->print(''); + + # Offer link to display parameter selection again + $r->print(''); } else { - my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb); - my $title = &Apache::lonnet::gettitle($pssymb); - $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource). - ''. - '

    '); + # parameter screen for a single resource. + my ($map,$iid,$resource)=&Apache::lonnet::decode_symb($pssymb); + my $title = &Apache::lonnet::gettitle($pssymb); + $r->print(&mt('Specific Resource: [_1] ([_2])', + $title,''.$resource.''). + ''. + '
    '); + $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)'))); + $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')). + ''); + &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups); + $r->print(&Apache::lonhtmlcommon::row_closure(1)); + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print('

    ' + .'' + .'' + .'

    '); } - &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups); + + # ----- End Parameter Selection - $r->print('

    '.$message.'

    '); + # Display Messages + $r->print('
    '.$message.'
    '); - $r->print('
    '); my @temp_pscat; map { @@ -1853,91 +2339,98 @@ sub assessparms { my $csudom=$env{'user.domain'}; if ($parmlev eq 'full') { - my $coursespan=$csec?8:5; - my $userspan=3; - if ($cgroup ne '') { - $coursespan += 3; - } - - $r->print('

    '); - $r->print(''); - $r->print(''); - if ($uname) { - if (@usersgroups > 1) { - $userspan ++; +# +# This produces the cascading table output of parameters +# + my $coursespan=$csec?8:5; + my $userspan=3; + if ($cgroup ne '') { + $coursespan += 3; } - $r->print('"); - } - my %lt=&Apache::lonlocal::texthash( - 'pie' => "Parameter in Effect", - 'csv' => "Current Session Value", - 'at' => 'at', - 'rl' => "Resource Level", - 'ic' => 'in Course', - 'aut' => "Assessment URL and Title", - 'type' => 'Type', - 'emof' => "Enclosing Map or Folder", - 'part' => 'Part', - 'pn' => 'Parameter Name', - 'def' => 'default', - 'femof' => 'from Enclosing Map or Folder', - 'gen' => 'general', - 'foremf' => 'for Enclosing Map or Folder', - 'fr' => 'for Resource' - ); - $r->print(<print('

    '.&mt('Any User').''); - $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom
    '); +# +# This produces the headers +# + $r->print(''); + $r->print(''); + if ($uname) { + if (@usersgroups > 1) { + $userspan ++; + } + $r->print('"); + } + my %lt=&Apache::lonlocal::texthash( + 'pie' => "Parameter in Effect", + 'csv' => "Current Session Value", + 'rl' => "Resource Level", + 'ic' => 'in Course', + 'aut' => "Assessment URL and Title", + 'type' => 'Type', + 'emof' => "Enclosing Map or Folder", + 'part' => 'Part', + 'pn' => 'Parameter Name', + 'def' => 'default', + 'femof' => 'from Enclosing Map or Folder', + 'gen' => 'general', + 'foremf' => 'for Enclosing Map or Folder', + 'fr' => 'for Resource' + ); + $r->print(<$lt{'pie'} - + ENDTABLETWO - if ($csec) { - $r->print('"); - } - if ($cgroup) { + if ($csec) { + $r->print('"); + } + if ($cgroup) { $r->print('"); - } - $r->print(<"); + } + $r->print(< ENDTABLEHEADFOUR - if ($csec) { - $r->print(''); - } - - if ($cgroup) { - $r->print(''); - } + if ($csec) { + $r->print(''); + } - if ($uname) { - if (@usersgroups > 1) { - $r->print(''); + if ($cgroup) { + $r->print(''); } - $r->print(''); - } - $r->print(''); + if ($uname) { + if (@usersgroups > 1) { + $r->print(''); + } + $r->print(''); + } - my $defbgone=''; - my $defbgtwo=''; - my $defbgthree = ''; + $r->print(''); +# +# Done with the headers +# + my $defbgone=''; + my $defbgtwo=''; + my $defbgthree = ''; - foreach (@ids) { + foreach (@ids) { my $rid=$_; my ($inmapid)=($rid=~/\.(\d+)$/); - if ((!$pssymb && - (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid}))) - || - ($pssymb && $pssymb eq $symbp{$rid})) { + if ((!$pssymb && + (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid}))) + || + ($pssymb && $pssymb eq $symbp{$rid})) { # ------------------------------------------------------ Entry for one resource if ($defbgone eq '#E0E099') { $defbgone='#E0E0DD'; @@ -1964,12 +2457,29 @@ ENDTABLEHEADFOUR my %default=(); my $uri=&Apache::lonnet::declutter($uris{$rid}); + my $filter=$env{'form.filter'}; + foreach (&keysplit($keyp{$rid})) { my $tempkeyp = $_; if (grep $_ eq $tempkeyp, @catmarker) { + my $parmname=&Apache::lonnet::metadata($uri,$_.'.name'); +# We may only want certain parameters listed + if ($filter) { + unless ($filter=~/\Q$parmname\E/) { next; } + } + $name{$_}=$parmname; $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part'); - $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name'); - $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display'); + + my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display'); + if ($allparms{$name{$_}} ne '') { + my $identifier; + if ($parmdis =~ /(\s*\[Part.*)$/) { + $identifier = $1; + } + $display{$_} = $allparms{$name{$_}}.$identifier; + } else { + $display{$_} = $parmdis; + } unless ($display{$_}) { $display{$_}=''; } $display{$_}.=' ('.$name{$_}.')'; $default{$_}=&Apache::lonnet::metadata($uri,$_); @@ -1979,16 +2489,16 @@ ENDTABLEHEADFOUR } my $totalparms=scalar keys %name; if ($totalparms>0) { - my $firstrow=1; - my $title=&Apache::lonnet::gettitle($symbp{$rid}); + my $firstrow=1; + my $title=&Apache::lonnet::gettitle($symbp{$rid}); $r->print(''; - if ($parameter =~ /^default_enrollment_(start|end)_date$/) { - $output .= ''; - } elsif ($parameter eq 'timezone') { - my $includeempty = 1; - my $timezone = &Apache::lonlocal::gettimezone(); - $output .= ''; - } elsif ($parameter eq 'datelocale') { - my $includeempty = 1; - my $locale_obj = &Apache::lonlocal::getdatelocale(); - my $currdatelocale; - if (ref($locale_obj)) { - $currdatelocale = $locale_obj->id(); - } - $output .= ''; - } elsif ($parameter eq 'categories') { - my $catdisplay; - if ($values{'categories'} ne '') { - my @curritems = split(/\&/,$values{'categories'}); - foreach my $item (@curritems) { - my ($name,$parent,$pos) = split(/:/,$item); - $catdisplay .= &unescape($name).'&'; - } - $catdisplay =~ s/\&$//; - } - $output .= ''; - } else { - $output .= ''; - } - $output .= ''; - $output .= &Apache::loncommon::end_data_table_row()."\n"; - } - my $onchange = 'onFocus="javascript:window.document.forms'. - '[\'envform\'].elements[\'newp_setparmval\']'. - '.checked=true;"'; - $output.=&Apache::loncommon::start_data_table_row(). - ''. - &Apache::loncommon::end_data_table_row()."\n"; - } - my %lt=&Apache::lonlocal::texthash( - 'par' => 'Parameter', - 'val' => 'Value', - 'set' => 'Set?', - 'sav' => 'Save' - ); - - my $Parameter=&mt('Parameter'); - my $Value=&mt('Value'); - my $Set=&mt('Set'); - my ($jscript,$categorize_js); - my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset'); - if ($can_categorize) { - $categorize_js = <'; - my $start_page = - &Apache::loncommon::start_page('Set Course Environment', - $jscript); - my $end_page = - &Apache::loncommon::end_page(); - my $end_table=&Apache::loncommon::end_data_table(); - $r->print(< -$setoutput -
    -$start_table -$start_header_row -
    -$end_header_row -$output -$end_table - - -$end_page -ENDENV -} - -sub can_modify_catsettings { - my ($dom) = @_; - my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom); - my ($can_toggle_cat,$can_categorize); - if (ref($domconf{'coursecategories'}) eq 'HASH') { - if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') { - $can_toggle_cat = 1; - } - if ($domconf{'coursecategories'}{'categorize'} eq 'crs') { - $can_categorize = 1; - } - } - return ($can_toggle_cat,$can_categorize); -} - -sub assign_course_categories { - my ($r) = @_; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $hascats = 0; - my $cathash; - my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom); - if (ref($domconf{'coursecategories'}) eq 'HASH') { - $cathash = $domconf{'coursecategories'}{'cats'}; - if (ref($cathash) eq 'HASH') { - $hascats = 1; - } - } - my $catwin_js; - if ($hascats) { - my $alert = &mt('Use \"Save\" in the main window to save course categories'); - $catwin_js = < - -function updateCategories() { - var newcategories = ''; - var unescapedcats = ''; - if (document.chgcats.usecategory.length) { - for (var i=0; i 0) { - newcategories = newcategories.slice(0,-1); - } - if (unescapedcats.length > 0) { - unescapedcats = unescapedcats.slice(0,-3); - } - } else { - if (document.chgcats.usecategory.checked == true) { - newcategories = document.chgcats.usecategory.value; - unescapedcats = document.chgcats.catname.value; - } - } - opener.document.envform.categories_value.value = newcategories; - opener.document.envform.categories_display.value = unescapedcats; - opener.document.envform.categories_setparmval.checked = true; - alert("$alert"); - self.close(); - return; -} - - -ENDSCRIPT - } else { - my $onload; - } - my $start_page = - &Apache::loncommon::start_page('Course Categories',$catwin_js, - {'only_body' => 1,}); - my $end_page = &Apache::loncommon::end_page(); - my $categoriesform = '

    '.&mt('Categorize Course').'

    '; - if ($hascats) { - my %currsettings = - &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum); - $categoriesform .= &mt('Assign one or more categories to this course.').'

    '. - '
    '."\n" - .&Apache::loncommon::assign_categories_table($cathash, - $currsettings{'categories'})."\n" - .'

    '; - } else { - $categoriesform .= &mt('No categories defined for this domain'); - } - $r->print($start_page.$categoriesform.$end_page); - return; -} - ################################################## # Overview mode ################################################## @@ -2840,20 +2755,20 @@ my $tableopen; sub tablestart { if ($tableopen) { - return ''; + return ''; } else { - $tableopen=1; - return &Apache::loncommon::start_data_table().'
    '; + $tableopen=1; + return &Apache::loncommon::start_data_table().''; } } sub tableend { if ($tableopen) { - $tableopen=0; - return &Apache::loncommon::end_data_table(); + $tableopen=0; + return &Apache::loncommon::end_data_table(); } else { - return''; + return''; } } @@ -2866,16 +2781,16 @@ sub readdata { my $classlist=&Apache::loncoursedata::get_classlist(); foreach (keys %$classlist) { if ($_=~/^($match_username)\:($match_domain)$/) { - my ($tuname,$tudom)=($1,$2); - my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom); + my ($tuname,$tudom)=($1,$2); + my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom); foreach my $userkey (keys %{$useropt}) { - if ($userkey=~/^$env{'request.course.id'}/) { + if ($userkey=~/^$env{'request.course.id'}/) { my $newkey=$userkey; - $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./; - $$resourcedata{$newkey}=$$useropt{$userkey}; - } - } - } + $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./; + $$resourcedata{$newkey}=$$useropt{$userkey}; + } + } + } } return $resourcedata; } @@ -2892,88 +2807,107 @@ sub storedata { undef %newdata; my @deldata=(); undef @deldata; - foreach (keys %env) { - if ($_=~/^form\.([a-z]+)\_(.+)$/) { - my $cmd=$1; - my $thiskey=$2; - my ($tuname,$tudom)=&extractuser($thiskey); - my $tkey=$thiskey; + my ($got_chostname,$chostname,$cmajor,$cminor); + foreach my $key (keys(%env)) { + if ($key =~ /^form\.([a-z]+)\_(.+)$/) { + my $cmd=$1; + my $thiskey=$2; + my ($tuname,$tudom)=&extractuser($thiskey); + my $tkey=$thiskey; + if ($tuname) { + $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./; + } + if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') { + my ($data, $typeof, $text); + if ($cmd eq 'set') { + $data=$env{$key}; + $typeof=$env{'form.typeof_'.$thiskey}; + $text = &mt('Saved modified parameter for'); + if ($typeof eq 'string_questiontype') { + my ($needsrelease,$needsnewer); + $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$data}; + if ($needsrelease) { + unless ($got_chostname) { + ($chostname,$cmajor,$cminor)=&questiontype_release_vars(); + $got_chostname = 1; + } + $needsnewer = &questiontype_releasecheck($data,$needsrelease, + $chostname,$cmajor, + $cminor); + } + if ($needsnewer) { + $r->print('
    '.&oldversion_warning($data,$chostname,$cmajor, + $cminor,$needsrelease)); + next; + } + } + } elsif ($cmd eq 'datepointer') { + $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key}); + $typeof=$env{'form.typeof_'.$thiskey}; + $text = &mt('Saved modified date for'); + } elsif ($cmd eq 'dateinterval') { + $data=&get_date_interval_from_form($thiskey); + $typeof=$env{'form.typeof_'.$thiskey}; + $text = &mt('Saved modified date for'); + } + if (defined($data) and $$olddata{$thiskey} ne $data) { if ($tuname) { - $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./; - } - if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') { - my ($data, $typeof, $text); - if ($cmd eq 'set') { - $data=$env{$_}; - $typeof=$env{'form.typeof_'.$thiskey}; - $text = &mt('Saved modified parameter for'); - } elsif ($cmd eq 'datepointer') { - $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_}); - $typeof=$env{'form.typeof_'.$thiskey}; - $text = &mt('Saved modified date for'); - } elsif ($cmd eq 'dateinterval') { - $data=&get_date_interval_from_form($thiskey); - $typeof=$env{'form.typeof_'.$thiskey}; - $text = &mt('Saved modified date for'); - } - if (defined($data) and $$olddata{$thiskey} ne $data) { - if ($tuname) { - if (&Apache::lonnet::put('resourcedata',{$tkey=>$data, - $tkey.'.type' => $typeof}, - $tudom,$tuname) eq 'ok') { - &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom); - $r->print('
    '.$text.' '. - &Apache::loncommon::plainname($tuname,$tudom)); - } else { - $r->print('
    '. - &mt('Error saving parameters').'
    '); - } - &Apache::lonnet::devalidateuserresdata($tuname,$tudom); - } else { - $newdata{$thiskey}=$data; - $newdata{$thiskey.'.type'}=$typeof; - } - } - } elsif ($cmd eq 'del') { - if ($tuname) { - if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') { - &log_parmset({$tkey=>''},1,$tuname,$tudom); - $r->print('
    '.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom)); - } else { - $r->print('
    '. - &mt('Error deleting parameters').'
    '); - } - &Apache::lonnet::devalidateuserresdata($tuname,$tudom); - } else { - push (@deldata,$thiskey,$thiskey.'.type'); - } - } - } + if (&Apache::lonnet::put('resourcedata',{$tkey=>$data, + $tkey.'.type' => $typeof}, + $tudom,$tuname) eq 'ok') { + &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom); + $r->print('
    '.$text.' '. + &Apache::loncommon::plainname($tuname,$tudom)); + } else { + $r->print('
    '. + &mt('Error saving parameters').'
    '); + } + &Apache::lonnet::devalidateuserresdata($tuname,$tudom); + } else { + $newdata{$thiskey}=$data; + $newdata{$thiskey.'.type'}=$typeof; + } + } + } elsif ($cmd eq 'del') { + if ($tuname) { + if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') { + &log_parmset({$tkey=>''},1,$tuname,$tudom); + $r->print('
    '.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom)); + } else { + $r->print('
    '. + &mt('Error deleting parameters').'
    '); + } + &Apache::lonnet::devalidateuserresdata($tuname,$tudom); + } else { + push (@deldata,$thiskey,$thiskey.'.type'); + } + } + } } # Store all course level my $delentries=$#deldata+1; my @newdatakeys=keys %newdata; my $putentries=$#newdatakeys+1; if ($delentries) { - if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') { - my %loghash=map { $_ => '' } @deldata; - &log_parmset(\%loghash,1); - $r->print('

    '.&mt('Deleted [_1] parameter(s)

    ',$delentries)); - } else { - $r->print('
    '. - &mt('Error deleting parameters').'
    '); - } - &Apache::lonnet::devalidatecourseresdata($crs,$dom); + if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') { + my %loghash=map { $_ => '' } @deldata; + &log_parmset(\%loghash,1); + $r->print('

    '.&mt('Deleted [_1] parameter(s)

    ',$delentries)); + } else { + $r->print('
    '. + &mt('Error deleting parameters').'
    '); + } + &Apache::lonnet::devalidatecourseresdata($crs,$dom); } if ($putentries) { - if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') { - &log_parmset(\%newdata,0); - $r->print('

    '.&mt('Saved [_1] parameter(s)',$putentries/2).'

    '); - } else { - $r->print('
    '. - &mt('Error saving parameters').'
    '); - } - &Apache::lonnet::devalidatecourseresdata($crs,$dom); + if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') { + &log_parmset(\%newdata,0); + $r->print('

    '.&mt('Saved [_1] parameter(s)',$putentries/2).'

    '); + } else { + $r->print('
    '. + &mt('Error saving parameters').'
    '); + } + &Apache::lonnet::devalidatecourseresdata($crs,$dom); } } @@ -2986,15 +2920,15 @@ sub parse_listdata_key { my ($key,$listdata) = @_; # split into student/section affected, and # the realm (folder/resource part and parameter - my ($student,$realm) = - ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/); + my ($student,$realm) = + ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/); # if course wide student would be undefined if (!defined($student)) { - ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/); + ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/); } # strip off the .type if it's not the Question type parameter if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) { - $realm=~s/\.type//; + $realm=~s/\.type//; } # split into resource+part and parameter name my ($res, $parm) = ($realm=~/^(.*)\.(.*)$/); @@ -3015,135 +2949,136 @@ sub listdata { my %keyorder=&standardkeyorder(); foreach my $thiskey (sort { - my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata); - my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata); + my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata); + my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata); - # get the numerical order for the param - $aparm=$keyorder{'parameter_0_'.$aparm}; - $bparm=$keyorder{'parameter_0_'.$bparm}; + # get the numerical order for the param + $aparm=$keyorder{'parameter_0_'.$aparm}; + $bparm=$keyorder{'parameter_0_'.$bparm}; - my $result=0; + my $result=0; - if ($sortorder eq 'realmstudent') { + if ($sortorder eq 'realmstudent') { if ($ares ne $bres ) { - $result = ($ares cmp $bres); - } elsif ($astudent ne $bstudent) { - $result = ($astudent cmp $bstudent); - } elsif ($apart ne $bpart ) { - $result = ($apart cmp $bpart); - } - } else { - if ($astudent ne $bstudent) { - $result = ($astudent cmp $bstudent); - } elsif ($ares ne $bres ) { - $result = ($ares cmp $bres); - } elsif ($apart ne $bpart ) { - $result = ($apart cmp $bpart); - } - } - - if (!$result) { + $result = ($ares cmp $bres); + } elsif ($astudent ne $bstudent) { + $result = ($astudent cmp $bstudent); + } elsif ($apart ne $bpart ) { + $result = ($apart cmp $bpart); + } + } else { + if ($astudent ne $bstudent) { + $result = ($astudent cmp $bstudent); + } elsif ($ares ne $bres ) { + $result = ($ares cmp $bres); + } elsif ($apart ne $bpart ) { + $result = ($apart cmp $bpart); + } + } + + if (!$result) { if (defined($aparm) && defined($bparm)) { - $result = ($aparm <=> $bparm); + $result = ($aparm <=> $bparm); } elsif (defined($aparm)) { - $result = -1; + $result = -1; } elsif (defined($bparm)) { - $result = 1; - } - } + $result = 1; + } + } - $result; + $result; } keys %{$listdata}) { - if ($$listdata{$thiskey.'.type'}) { + if ($$listdata{$thiskey.'.type'}) { my $thistype=$$listdata{$thiskey.'.type'}; if ($$resourcedata{$thiskey.'.type'}) { - $thistype=$$resourcedata{$thiskey.'.type'}; - } - my ($middle,$part,$name)= - ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); - my $section=&mt('All Students'); - if ($middle=~/^\[(.*)\]/) { - my $issection=$1; - if ($issection=~/^useropt\:($match_username)\:($match_domain)/) { - $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2); - } else { - $section=&mt('Group/Section').': '.$issection; - } - $middle=~s/^\[(.*)\]//; - } - $middle=~s/\.+$//; - $middle=~s/^\.+//; - my $realm=''.&mt('All Resources').''; - if ($middle=~/^(.+)\_\_\_\(all\)$/) { - $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).'
    ('.$1.')
    '; - } elsif ($middle) { - my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle); - $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).'
    ('.$url.' in '.$map.' id: '.$id.')
    '; - } - if ($sortorder eq 'realmstudent') { - if ($realm ne $oldrealm) { - $r->print(&tableend()."\n

    $realm

    "); - $oldrealm=$realm; - $oldsection=''; - } - if ($section ne $oldsection) { - $r->print(&tableend()."\n

    $section

    "); - $oldsection=$section; - $oldpart=''; - } - } else { - if ($section ne $oldsection) { - $r->print(&tableend()."\n

    $section

    "); - $oldsection=$section; - $oldrealm=''; - } - if ($realm ne $oldrealm) { - $r->print(&tableend()."\n

    $realm

    "); - $oldrealm=$realm; - $oldpart=''; - } - } - if ($part ne $oldpart) { - $r->print(&tableend(). - "\n".''.&mt('Part').": $part"); - $oldpart=$part; - } + $thistype=$$resourcedata{$thiskey.'.type'}; + } + my ($middle,$part,$name)= + ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); + my $section=&mt('All Students'); + if ($middle=~/^\[(.*)\]/) { + my $issection=$1; + if ($issection=~/^useropt\:($match_username)\:($match_domain)/) { + $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2); + } else { + $section=&mt('Group/Section').': '.$issection; + } + $middle=~s/^\[(.*)\]//; + } + $middle=~s/\.+$//; + $middle=~s/^\.+//; + my $realm=''.&mt('All Resources').''; + if ($middle=~/^(.+)\_\_\_\(all\)$/) { + $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).'
    ('.$1.')
    '; + } elsif ($middle) { + my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle); + $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).'
    ('.$url.' in '.$map.' id: '.$id.')
    '; + } + if ($sortorder eq 'realmstudent') { + if ($realm ne $oldrealm) { + $r->print(&tableend()."\n

    $realm

    "); + $oldrealm=$realm; + $oldsection=''; + } + if ($section ne $oldsection) { + $r->print(&tableend()."\n

    $section

    "); + $oldsection=$section; + $oldpart=''; + } + } else { + if ($section ne $oldsection) { + $r->print(&tableend()."\n

    $section

    "); + $oldsection=$section; + $oldrealm=''; + } + if ($realm ne $oldrealm) { + $r->print(&tableend()."\n

    $realm

    "); + $oldrealm=$realm; + $oldpart=''; + } + } + if ($part ne $oldpart) { + $r->print(&tableend(). + "\n".''.&mt('Part').": $part"); + $oldpart=$part; + } # # Ready to print # - $r->print(&tablestart(). - &Apache::loncommon::start_data_table_row(). - ''.&Apache::loncommon::end_data_table_row()); - } + ); + } elsif ($thistype eq 'date_interval') { + $r->print(&date_interval_selector($thiskey, + $$resourcedata{$thiskey})); + } elsif ($thistype =~ m/^string/) { + $r->print(&string_selector($thistype,$thiskey, + $$resourcedata{$thiskey})); + } else { + $r->print(&default_selector($thiskey,$$resourcedata{$thiskey})); + } + $r->print(''); + $r->print(''.&Apache::loncommon::end_data_table_row()); + } } return $foundkeys; } @@ -3153,17 +3088,17 @@ sub date_interval_selector { my ($thiskey, $showval) = @_; my $result; foreach my $which (['days', 86400, 31], - ['hours', 3600, 23], - ['minutes', 60, 59], - ['seconds', 1, 59]) { - my ($name, $factor, $max) = @{ $which }; - my $amount = int($showval/$factor); - $showval %= $factor; - my %select = ((map {$_ => $_} (0..$max)), - 'select_form_order' => [0..$max]); - $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey, - %select); - $result .= ' '.&mt($name); + ['hours', 3600, 23], + ['minutes', 60, 59], + ['seconds', 1, 59]) { + my ($name, $factor, $max) = @{ $which }; + my $amount = int($showval/$factor); + $showval %= $factor; + my %select = ((map {$_ => $_} (0..$max)), + 'select_form_order' => [0..$max]); + $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey, + \%select); + $result .= ' '.&mt($name); } $result .= ''; return $result; @@ -3174,13 +3109,13 @@ sub get_date_interval_from_form { my ($key) = @_; my $seconds = 0; foreach my $which (['days', 86400], - ['hours', 3600], - ['minutes', 60], - ['seconds', 1]) { - my ($name, $factor) = @{ $which }; - if (defined($env{'form.'.$name.'_'.$key})) { - $seconds += $env{'form.'.$name.'_'.$key} * $factor; - } + ['hours', 3600], + ['minutes', 60], + ['seconds', 1]) { + my ($name, $factor) = @{ $which }; + if (defined($env{'form.'.$name.'_'.$key})) { + $seconds += $env{'form.'.$name.'_'.$key} * $factor; + } } return $seconds; } @@ -3191,35 +3126,109 @@ sub default_selector { return ''; } -my %strings = +my %strings = ( 'string_yesno' => [[ 'yes', 'Yes' ], - [ 'no', 'No' ]], + [ 'no', 'No' ]], 'string_problemstatus' => [[ 'yes', 'Yes' ], - [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ], - [ 'no', 'No, don\'t show correct/incorrect feedback.' ], - [ 'no_feedback_ever', 'No, show no feedback at all.' ]], + [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ], + [ 'no', 'No, don\'t show correct/incorrect feedback.' ], + [ 'no_feedback_ever', 'No, show no feedback at all.' ]], + 'string_questiontype' + => [[ 'problem', 'Standard Problem'], + [ 'survey', 'Survey'], + [ 'anonsurveycred', 'Anonymous Survey (credit for submission)'], + [ 'exam', 'Exam'], + [ 'anonsurvey', 'Anonymous Survey'], + [ 'randomizetry', 'New Randomization Each N Tries (default N=1)'], + [ 'practice', 'Practice'], + [ 'surveycred', 'Survey (credit for submission)']], ); +sub standard_string_options { + my ($string_type) = @_; + if (ref($strings{$string_type}) eq 'ARRAY') { + return $strings{$string_type}; + } + return; +} sub string_selector { my ($thistype, $thiskey, $showval) = @_; - + if (!exists($strings{$thistype})) { - return &default_selector($thiskey,$showval); + return &default_selector($thiskey,$showval); + } + + my %skiptype; + if ($thistype eq 'string_questiontype') { + my ($got_chostname,$chostname,$cmajor,$cminor); + foreach my $possibilities (@{ $strings{$thistype} }) { + next unless (ref($possibilities) eq 'ARRAY'); + my ($name, $description) = @{ $possibilities }; + my $needsrelease=$Apache::lonnet::needsrelease{'parameter:type:'.$name}; + if ($needsrelease) { + unless ($got_chostname) { + ($chostname,$cmajor,$cminor)=&questiontype_release_vars(); + $got_chostname = 1; + } + my $needsnewer=&questiontype_releasecheck($name,$needsrelease, + $chostname,$cmajor, + $cminor); + if ($needsnewer) { + $skiptype{$name} = 1; + } + } + } } my $result; - foreach my $possibilities (@{ $strings{$thistype} }) { - my ($name, $description) = @{ $possibilities }; - $result .= ''; + } + $result .= ''; + } + $result .= ''; + $i++; + } + $rem = @{ $strings{$thistype} }%($numinrow); + my $colsleft = $numinrow - $rem; + if ($colsleft > 1 ) { + $result .= ''; + } elsif ($colsleft == 1) { + $result .= ''; + } + $result .= ''; + } + if ($result) { + $result = '
    '.&mt('Any User').''); + $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom$lt{'csv'}
    ($csuname $lt{'at'} $csudom)
    $lt{'csv'}
    ($csuname:$csudom)
    $lt{'ic'}$lt{'rl'} $lt{'ic'}'. - &mt("in Section")." $csec'. + &mt("in Section")." $csec'. - &mt("in Group")." $cgroup
    $lt{'aut'}$lt{'type'} $lt{'emof'}$lt{'part'}$lt{'pn'} $lt{'gen'}$lt{'foremf'} $lt{'def'}$lt{'femof'}$lt{'fr'}'.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').''.&mt('Control by other group?').''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').'
    '.&mt('Control by other group?').''.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').'
    '. join(' / ',split(/\//,$uri)). '

    '. "$title"); @@ -2030,14 +2540,14 @@ ENDTABLEHEADFOUR my %maplist; if ($pschp eq 'all') { - %maplist = %allmaps; + %maplist = %allmaps; } else { %maplist = ($pschp => $mapp{$pschp}); } #-------------------------------------------- for each map, gather information my $mapid; - foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) { + foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) { my $maptitle = $maplist{$mapid}; #----------------------- loop through ids and get all parameter types for map @@ -2049,16 +2559,16 @@ ENDTABLEHEADFOUR my %default = (); my $map = 0; -# $r->print("Catmarker: @catmarker
    \n"); - +# $r->print("Catmarker: @catmarker
    \n"); + foreach (@ids) { - ($map)=(/([\d]*?)\./); - my $rid = $_; - + ($map)=(/([\d]*?)\./); + my $rid = $_; + # $r->print("$mapid:$map: $rid
    \n"); - if ($map eq $mapid) { - my $uri=&Apache::lonnet::declutter($uris{$rid}); + if ($map eq $mapid) { + my $uri=&Apache::lonnet::declutter($uris{$rid}); # $r->print("Keys: $keyp{$rid}
    \n"); #-------------------------------------------------------------------- @@ -2068,31 +2578,40 @@ ENDTABLEHEADFOUR # When storing information, store as part 0 # When requesting information, request from full part #------------------------------------------------------------------- - foreach (&keysplit($keyp{$rid})) { - my $tempkeyp = $_; - my $fullkeyp = $tempkeyp; - $tempkeyp =~ s/_\w+_/_0_/; - - if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) { - $part{$tempkeyp}="0"; - $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name'); - $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); - unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; } - $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')'; - $display{$tempkeyp} =~ s/_\w+_/_0_/; - $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp); - $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type'); + foreach (&keysplit($keyp{$rid})) { + my $tempkeyp = $_; + my $fullkeyp = $tempkeyp; + $tempkeyp =~ s/_\w+_/_0_/; + + if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) { + $part{$tempkeyp}="0"; + $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name'); + my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); + if ($allparms{$name{$tempkeyp}} ne '') { + my $identifier; + if ($parmdis =~ /(\s*\[Part.*)$/) { + $identifier = $1; + } + $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier; + } else { + $display{$tempkeyp} = $parmdis; + } + unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; } + $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')'; + $display{$tempkeyp} =~ s/_\w+_/_0_/; + $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp); + $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type'); + } + } # end loop through keys } - } # end loop through keys - } } # end loop through ids - + #---------------------------------------------------- print header information my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map'); my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':''); my $tmp=""; if ($uname) { - my $person=&Apache::loncommon::plainname($uname,$udom); + my $person=&Apache::loncommon::plainname($uname,$udom); $tmp.=&mt("User")." $uname \($person\) ". &mt('in')." \n"; } else { @@ -2123,7 +2642,7 @@ ENDTABLEHEADFOUR .&Apache::loncommon::end_data_table_header_row() ); - foreach (&keysinorder(\%name,\%keyorder)) { + foreach (&keysinorder(\%name,\%keyorder)) { $r->print(&Apache::loncommon::start_data_table_row()); &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default, \%type,\%display,$defbgone,$defbgtwo,$defbgthree, @@ -2149,10 +2668,10 @@ ENDTABLEHEADFOUR my %display = (); my %type = (); my %default = (); - + foreach (@ids) { my $rid = $_; - + my $uri=&Apache::lonnet::declutter($uris{$rid}); #-------------------------------------------------------------------- @@ -2163,36 +2682,45 @@ ENDTABLEHEADFOUR # When requesting information, request from full part #------------------------------------------------------------------- foreach (&keysplit($keyp{$rid})) { - my $tempkeyp = $_; - my $fullkeyp = $tempkeyp; - $tempkeyp =~ s/_\w+_/_0_/; - if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) { - $part{$tempkeyp}="0"; - $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name'); - $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); - unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; } - $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')'; - $display{$tempkeyp} =~ s/_\w+_/_0_/; - $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp); - $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type'); - } + my $tempkeyp = $_; + my $fullkeyp = $tempkeyp; + $tempkeyp =~ s/_\w+_/_0_/; + if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) { + $part{$tempkeyp}="0"; + $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name'); + my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); + if ($allparms{$name{$tempkeyp}} ne '') { + my $identifier; + if ($parmdis =~ /(\s*\[Part.*)$/) { + $identifier = $1; + } + $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier; + } else { + $display{$tempkeyp} = $parmdis; + } + unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; } + $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')'; + $display{$tempkeyp} =~ s/_\w+_/_0_/; + $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp); + $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type'); + } } # end loop through keys } # end loop through ids - + #---------------------------------------------------- print header information - my $setdef=&mt("Set Defaults for All Resources in Course"); + my $setdef=&mt("Set Defaults for All Resources in Course"); $r->print(<

    $setdef $coursename
    ENDMAPONE if ($uname) { - my $person=&Apache::loncommon::plainname($uname,$udom); + my $person=&Apache::loncommon::plainname($uname,$udom); $r->print(" ".&mt("User")." $uname \($person\) \n"); } else { $r->print(" ".&mt("ALL")." ".&mt("USERS")." \n"); } - + if ($csec) {$r->print(&mt("Section")." $csec\n")}; if ($cgroup) {$r->print(&mt("Group")." $cgroup\n")}; $r->print("

    \n"); @@ -2205,7 +2733,7 @@ ENDMAPONE .&Apache::loncommon::end_data_table_header_row() ); - foreach (&keysinorder(\%name,\%keyorder)) { + foreach (&keysinorder(\%name,\%keyorder)) { $r->print(&Apache::loncommon::start_data_table_row()); &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default, \%type,\%display,$defbgone,$defbgtwo,$defbgthree, @@ -2220,619 +2748,6 @@ ENDMAPONE $r->print(''.&Apache::loncommon::end_page()); } # end sub assessparms - - -sub crsenv { - my $r=shift; - my $setoutput=''; - - &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv', - text=>"Course Environment"}); - my $breadcrumbs = - &Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment'); - my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; - - my (%crsinfo,$chome); - - # - # Go through list of changes - foreach (keys %env) { - next if ($_!~/^form\.(.+)\_setparmval$/); - my $name = $1; - my $value = $env{'form.'.$name.'_value'}; - if ($name eq 'newp') { - $name = $env{'form.newp_name'}; - } - if ($name eq 'url') { - $value=~s/^\/res\///; - my $bkuptime=time; - my @tmp = &Apache::lonnet::get - ('environment',['url'],$dom,$crs); - $setoutput.=&mt('Backing up previous URL').': '. - &Apache::lonnet::put - ('environment', - {'top level map backup '.$bkuptime => $tmp[1] }, - $dom,$crs). - '
    '; - } - # - # Deal with modified default spreadsheets - if ($name =~ /^spreadsheet_default_(classcalc| - studentcalc| - assesscalc)$/x) { - my $sheettype = $1; - if ($sheettype eq 'classcalc') { - # no need to do anything since viewing the sheet will - # cause it to be updated. - } elsif ($sheettype eq 'studentcalc') { - # expire all the student spreadsheets - &Apache::lonnet::expirespread('','','studentcalc'); - } else { - # expire all the assessment spreadsheets - # this includes non-default spreadsheets, but better to - # be safe than sorry. - &Apache::lonnet::expirespread('','','assesscalc'); - # expire all the student spreadsheets - &Apache::lonnet::expirespread('','','studentcalc'); - } - } - # - # Deal with the enrollment dates - if ($name =~ /^default_enrollment_(start|end)_date$/) { - $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value'); - } - # - # Deal with the emails - if ($name =~ /\.email$/) { - foreach my $specifier (split(',',$value)) { - my ($user,$sections_or_groups)= - ($specifier=~/^([^\(]+)\(([^\)]+)\)/); - if (!$sections_or_groups) { - $user = $specifier; - } - my ($name,$domain) = split(':',$user); - if (!defined($user) || !defined($domain)) { - $setoutput.= '
    '. - &mt("Invalid e-mail address specified, address must be of the form username:domain what was specified was ([_1])",$user). - ''; - undef($value); - } elsif (&Apache::lonnet::homeserver($user,$domain) eq 'no_host') { - $setoutput.= '
    '. - &mt("Invalid e-mail address specified, user [_1] is unknown.",$name). - ''; - undef($value); - } - } - } - # Get existing cloners - my @oldcloner = (); - if ($name eq 'cloners') { - my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners'); - if ($clonenames{'cloners'} =~ /,/) { - @oldcloner = split/,/,$clonenames{'cloners'}; - } else { - $oldcloner[0] = $clonenames{'cloners'}; - } - } - # - # Let the user know we made the changes - if ($name && defined($value)) { - my %failed_cloners; - if ($name eq 'cloners') { - $value =~ s/\s//g; - $value =~ s/^,//; - $value =~ s/,$//; - # check requested clones are valid users. - %failed_cloners = &check_cloners(\$value,\@oldcloner); - } - my $put_result = &Apache::lonnet::put('environment', - {$name=>$value},$dom,$crs); - if ($put_result eq 'ok') { - $setoutput.=&mt('Set').' '.$name.' '.&mt('to').' '; - if ($name =~ /^default_enrollment_(start|end)_date$/) { - $setoutput .= &Apache::lonlocal::locallocaltime($value); - } elsif ($name eq 'categories') { - $setoutput .= $env{'form.categories_display'}; - } else { - $setoutput .= $value; - } - $setoutput .= '.
    '; - if ($name eq 'cloners') { - &change_clone($value,\@oldcloner); - } - # Update environment and nohist_courseids.db - if (($name eq 'description') || ($name eq 'cloners') || - ($name eq 'hidefromcat') || ($name eq 'categories')) { - if ($chome eq '') { - %crsinfo = - &Apache::lonnet::courseiddump($dom,'.',1,'.','.', - $crs,undef,undef,'.'); - $chome = &Apache::lonnet::homeserver($crs,$dom); - } - } - if ($name eq 'description' && defined($value)) { - &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.description' => $value}); - if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') { - $crsinfo{$env{'request.course.id'}}{'description'} = $value; - my $putresult = - &Apache::lonnet::courseidput($dom,\%crsinfo, - $chome,'notime'); - } - } - if (($name eq 'cloners') || ($name eq 'hidefromcat') || ($name eq 'categories')) { - if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') { - &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$name => $value}); - $crsinfo{$env{'request.course.id'}}{$name} = $value; - my $putresult = - &Apache::lonnet::courseidput($dom,\%crsinfo, - $chome,'notime'); - } - } - } else { - $setoutput.=&mt('Unable to set').' '.$name.' '.&mt('to'). - ' '.$value.' '.&mt('due to').' '.$put_result.'.
    '; - } - if (($name eq 'cloners') && (keys(%failed_cloners) > 0)) { - $setoutput.= &mt('Unable to include').': '; - my @fails; - my $num = 0; - if (defined($failed_cloners{'format'})) { - $fails[$num] .= ''.$failed_cloners{'format'}. - ', '.&mt('reason').' - '. - &mt('Invalid format'); - $num ++; - } - if (defined($failed_cloners{'domain'})) { - $fails[$num] .= ''.$failed_cloners{'domain'}. - ', '.&mt('reason').' - '. - &mt('Domain does not exist'); - $num ++; - } - if (defined($failed_cloners{'newuser'})) { - $fails[$num] .= ''.$failed_cloners{'newuser'}. ', '.&mt('reason').' - '. - &mt('LON-CAPA user(s) do(es) not exist.'). - '.
    '.&mt('Please '). - '
    '. - &mt('add the user(s)').', '. - &mt('and then return to the '). - ''. - &mt('Course Parameters page').' '. - &mt('to add the new user(s) to the list of possible cloners'); - } - $setoutput .= join(';  ',@fails).'.
    '; - } - } - } - - my $start_table =&Apache::loncommon::start_data_table(); - my $start_header_row=&Apache::loncommon::start_data_table_header_row(); - my $end_header_row =&Apache::loncommon::end_data_table_header_row(); -# ------------------------- Re-init course environment entries for this session - - &Apache::lonnet::coursedescription($env{'request.course.id'}, - {'freshen_cache' => 1}); - -# -------------------------------------------------------- Get parameters again - - my %values=&Apache::lonnet::dump('environment',$dom,$crs); - my $SelectStyleFile=&mt('Select Style File'); - my $SelectSpreadsheetFile=&mt('Select Spreadsheet File'); - my $output=''; - my $can_categorize; - if (! exists($values{'con_lost'})) { - my %descriptions= - ('url' => ''.&mt('Top Level Map').'
    '. - '". - &mt('Select Map').'
    '. - &mt('Modification may make assessment data inaccessible!'). - '', - 'description' => ''.&mt('Course Description').'', - 'courseid' => ''.&mt('Course ID or number'). - '
    '. - '('.&mt('internal, optional').')', - 'cloners' => ''.&mt('Users allowed to clone course').'
    ' - .'("'.&mt('user:domain,user:domain,*:domain').'")
    ' - .&mt('Users with active Course Coordinator role in this course are permitted to clone and need not be included.').'
    ' - .&mt('Use [_1] to allow course to be cloned by anyone in the specified domain.','"*:domain"').'
    ' - .&mt('Use [_1] to allow unrestricted cloning in all domains.','"*"'), - 'grading' => ''.&mt('Grading').'
    '. - &mt('[_1], [_2], or [_3]','"standard"','"external"','"spreadsheet"').&Apache::loncommon::help_open_topic('GradingOptions'), - 'task_grading' => ''.&mt('Bridge Task Grading').'
    ' - .&mt('Instructors and TAs in sections, when grading bridge tasks, should be allowed to grade other sections.').'
    ' - .'('.&mt('[_1]: they are allowed (this is the default). [_2]: no, they can only grade their own section.','"any"','"section"').')', - 'default_xml_style' => ''.&mt('Default XML Style File').'
    '. - '$SelectStyleFile
    ", - 'question.email' => ''.&mt('Feedback Addresses for Resource Content Question').'
    ' - .'("'.&mt('user:domain,user:domain(section;section;...;*;...),...').'")', - 'question.email.text' => ''.&mt('Custom Text for Resource Content Question Option in Feedback').'', - 'comment.email' => ''.&mt('Feedback Addresses for Course Content Comments').'
    ' - .'("'.&mt('user:domain,user:domain(section;section;...;*;...),...').'")', - 'comment.email.text' => ''.&mt('Custom Text for Course Content Option in Feedback').'', - 'policy.email' => ''.&mt('Feedback Addresses for Course Policy').'
    ' - .'("'.&mt('user:domain,user:domain(section;section;...;*;...),...').'")', - 'policy.email.text' => ''.&mt('Custom Text for Course Policy Option in Feedback').'', - 'hideemptyrows' => ''.&mt('Hide Empty Rows in Spreadsheets').'
    ' - .'('.&mt('[_1] for default hiding','"yes"').')', - 'pageseparators' => ''.&mt('Visibly Separate Items on Pages').'
    ' - .'('.&mt('[_1] for visible separation.','"yes"').' ' - .&mt('Changes will not show until next login.').')', - 'student_classlist_view' => ''.&mt('Allow students to view classlist.').'
    ' - .'('.&mt('[_1]: students can view all sections. [_2]: students can only view their own section. blank or [_3] prevents student view.','"all"','"section"','"disabled"').')', - 'student_classlist_portfiles' => ''.&mt('Include link to accessible portfolio files').'
    ' - .'('.&mt("[_1] for link to each a listing of each student's files.",'"yes"').')', - 'student_classlist_opt_in' => ''.&mt("Student's agreement needed for listing in student-viewable roster").'
    ' - .'('.&mt('[_1] to require students to opt-in to listing in the roster (on the roster page).','"yes"').')', - 'plc.roles.denied'=> ''.&mt('Disallow live chatroom use for Roles').'
    ' - .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st"','"ta"','"in"').')
    ' - .'("'.&mt('role,role,...').'") ' - .Apache::loncommon::help_open_topic("Course_Disable_Discussion"), - 'plc.users.denied' => - ''.&mt('Disallow live chatroom use for Users').'
    '. - '("'.&mt('user:domain,user:domain,...').'")', - - 'pch.roles.denied'=> ''.&mt('Disallow Resource Discussion for Roles').'
    ' - .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st"','"ta"','"in"') - .'("'.&mt('role,role,...').'") ' - .Apache::loncommon::help_open_topic("Course_Disable_Discussion"), - 'pch.users.denied' => - ''.&mt('Disallow Resource Discussion for Users').'
    '. - '("'.&mt('user:domain,user:domain,...').'")', - 'spreadsheet_default_classcalc' - => ''.&mt('Default Course Spreadsheet').' '. - '$SelectSpreadsheetFile
    ", - 'spreadsheet_default_studentcalc' - => ''.&mt('Default Student Spreadsheet').'
    '. - '$SelectSpreadsheetFile
    ", - 'spreadsheet_default_assesscalc' - => ''.&mt('Default Assessment Spreadsheet').' '. - '$SelectSpreadsheetFile
    ", - 'allow_limited_html_in_feedback' - => ''.&mt('Allow limited HTML in discussion posts').'
    '. - '('.&mt('Set value to [_1] to allow.','"yes"').')', - 'allow_discussion_post_editing' - => ''.&mt('Allow users with specified roles to edit/delete their own discussion posts').'
    ' - .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st"','"ta"','"in"').')
    ' - .'('.&mt('Set value to [_1] to allow all roles.','"yes"').')' - .'("'.&mt('role:section,role:section,...').'")
    ' - .'('.&mt('Example: "st:001,st:002,in,cc" would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').')', - 'rndseed' - => ''.&mt('Randomization algorithm used').'
    ' - .'' - .&mt('Modifying this will make problems have different numbers and answers!') - .'', - 'receiptalg' - => ''.&mt('Receipt algorithm used').'
    '. - &mt('This controls how receipt numbers are generated.'), - 'suppress_tries' - => ''.&mt('Suppress number of tries in printing').'
    '. - ' ('.&mt('[_1] to suppress, anything else to not suppress','"yes"').')', - 'problem_stream_switch' - => ''.&mt('Allow problems to be split over pages').'
    '. - ' ('.&mt('[_1] if allowed, anything else if not','"yes"').')', - 'default_paper_size' - => ''.&mt('Default paper type').'
    '. - ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. - ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. - ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])', - 'print_header_format' - => ' '.&mt('Print header format').'
    ' - .&mt('Substitutions:
    [_1]: student name, [_2]: course id, [_3]: assignment note. Numbers after the % limit the field size.','"%n"','"%c"','"%a"'), - 'default_enrollment_start_date' => ''.&mt('Default beginning date for student access.').'', - 'default_enrollment_end_date' => ''.&mt('Default ending date for student access.').'', - 'nothideprivileged' => ''.&mt('Privileged users that should not be hidden on staff listings').'
    ' - .'("'.&mt('user:domain,user:domain,*:domain').'")', - 'languages' => ''.&mt('Languages used').'', - 'disable_receipt_display' - => ''.&mt('Disable display of problem receipts').'
    '. - ' ('.&mt('"[_1]" to disable, anything else if not','yes').')', - 'task_messages' - => ''.&mt('Send message to student when clicking Done on Tasks').'
    ('.&mt('[_1] to send a message only to student, [_2] to send message to student and add record to user information page for instructors. Leave blank to disable.','"only_student"','"student_and_user_notes_screen"').')', - 'disablesigfigs' - => ''.&mt('Disable checking of Significant Figures').'
    '. - ' ('.&mt('"[_1]" to disable, anything else if not','yes').')', - 'disableexampointprint' - => ''.&mt('Disable automatically printing point values onto exams.').'
    '. - ' ('.&mt('"[_1]" to disable, anything else if not','yes').')', - 'externalsyllabus' - => ''.&mt('URL of Syllabus (not using internal handler)').'', - 'tthoptions' - => ''.&mt('Default set of options to pass to tth/m when converting tex').'', - - 'texengine' - => ''.&mt('Force all students in the course to use a specific math rendering engine.').'
    ' - .'('.&mt("[_1], [_2] (Convert to Images), [_3] (TeX to HTML), or blank for student's preference",'"jsMath"','"mimetex"','"tth"').')', - 'timezone' - => ''.&mt('Timezone in which the course takes place').'', - - 'suppress_embed_prompt' - => ''.&mt('Suppress prompt to upload items referenced in a web page being uploaded to portfolio, when current role is student.').'
    '. - ' ('.&mt('[_1] to suppress, anything else to not suppress','"yes"').')', - 'hidefromcat' - => ''.&mt('Exclude from course catalog').'
    '. - ' ('.&mt('[_1] to exclude, anything else to include - included if assigned an institutional code, or manually catagorized','"yes"').')', - 'categories' - => ''.&mt('Categorize course').' '. - &mt('Display Categories').'', - 'datelocale' - => ''.&mt('Locale used for course calendar').'', - ); - my @Display_Order = ('url','description','courseid','cloners'); - (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom); - if ($can_toggle_cat) { - push(@Display_Order,'hidefromcat'); - } - if ($can_categorize) { - push(@Display_Order,'categories'); - } - push (@Display_Order,('grading', - 'externalsyllabus', - 'default_xml_style','pageseparators', - 'question.email','question.email.text','comment.email', - 'comment.email.text','policy.email','policy.email.text', - 'student_classlist_view', - 'student_classlist_opt_in', - 'student_classlist_portfiles', - 'plc.roles.denied','plc.users.denied', - 'pch.roles.denied','pch.users.denied', - 'allow_limited_html_in_feedback', - 'allow_discussion_post_editing', - 'languages', - 'timezone', - 'datelocale', - 'nothideprivileged', - 'rndseed', - 'receiptalg', - 'problem_stream_switch', - 'suppress_tries', - 'suppress_embed_prompt', - 'default_paper_size', - 'print_header_format', - 'disable_receipt_display', - 'spreadsheet_default_classcalc', - 'spreadsheet_default_studentcalc', - 'spreadsheet_default_assesscalc', - 'hideemptyrows', - 'default_enrollment_start_date', - 'default_enrollment_end_date', - 'tthoptions', - 'texengine', - 'disablesigfigs', - 'disableexampointprint', - 'task_messages','task_grading')); - foreach my $parameter (sort(keys(%values))) { - unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) || - ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/) - || ($parameter eq 'type')) { - if (! $descriptions{$parameter}) { - $descriptions{$parameter}=$parameter; - push(@Display_Order,$parameter); - } - } - } - - foreach my $parameter (@Display_Order) { - my $description = $descriptions{$parameter}; - # onchange is javascript to automatically check the 'Set' button. - my $onchange = 'onFocus="javascript:window.document.forms'. - "['envform'].elements['".$parameter."_setparmval']". - '.checked=true;"'; - $output .= &Apache::loncommon::start_data_table_row(). - '
    '.$description.''. - &Apache::lonhtmlcommon::date_setter('envform', - $parameter.'_value', - $values{$parameter}, - $onchange). - ''. - &Apache::loncommon::select_timezone($parameter.'_value', - $timezone, - $onchange,$includeempty).''. - &Apache::loncommon::select_datelocale($parameter.'_value', - $currdatelocale, - $onchange,$includeempty).''. - ''. - ''. - &Apache::lonhtmlcommon::textbox($parameter.'_value', - $values{$parameter}, - 40,$onchange).''. - &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval'). - ''.&mt('Create New Environment Variable').'
    '. - '
    '. - ''. - '$lt{'par'}$lt{'val'}$lt{'set'}
    '.&mt('Parameter').''. - &mt('Delete').''.&mt('Set to ...').'
    '.&mt('Parameter').''. + &mt('Delete').''.&mt('Set to ...').'
    '.&standard_parameter_names($name). - ''); - $foundkeys++; - if (&isdateparm($thistype)) { - my $jskey='key_'.$pointer; - $pointer++; - $r->print( - &Apache::lonhtmlcommon::date_setter('parmform', - $jskey, - $$resourcedata{$thiskey}, - '',1,'',''). + my $parmitem = &standard_parameter_names($name); + $r->print(&tablestart(). + &Apache::loncommon::start_data_table_row(). + ''.&mt($parmitem). + ''); + $foundkeys++; + if (&isdateparm($thistype)) { + my $jskey='key_'.$pointer; + $pointer++; + $r->print( + &Apache::lonhtmlcommon::date_setter('parmform', + $jskey, + $$resourcedata{$thiskey}, + '',1,'',''). ''. (($$resourcedata{$thiskey}!=0)?''. &mt('Shift all dates based on this date').'':''). &date_sanity_info($$resourcedata{$thiskey}) - ); - } elsif ($thistype eq 'date_interval') { - $r->print(&date_interval_selector($thiskey, - $$resourcedata{$thiskey})); - } elsif ($thistype =~ m/^string/) { - $r->print(&string_selector($thistype,$thiskey, - $$resourcedata{$thiskey})); - } else { - $r->print(&default_selector($thiskey,$$resourcedata{$thiskey})); - } - $r->print(''); - $r->print('
    '. + ''. + '  
    '.$result.'
    '; } return $result; } @@ -3265,7 +3274,7 @@ sub newoverview { my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview', - text=>"Overview Mode"}); + text=>"Overview Mode"}); my $start_page = &Apache::loncommon::start_page('Set Parameters'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print(<print(' - '); + $r->print(&Apache::lonhtmlcommon::row_closure()); + &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp); } - $r->print('
    '); + $r->print('
    '); + #$r->print('

    Step 1

    '); + $r->print('
    '); + $r->print(&Apache::lonhtmlcommon::start_pick_box()); &levelmenu($r,\%alllevs,$parmlev); if ($parmlev ne 'general') { - $r->print('
    '); - &mapmenu($r,\%allmaps,$pschp,\%maptitles); - $r->print('
    '); - - $r->print(' -
    '); + $r->print(&Apache::lonhtmlcommon::row_closure(1)); + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(''); + + $r->print('
    '); + $r->print('
    '); + $r->print(&Apache::lonhtmlcommon::start_pick_box()); &parmmenu($r,\%allparms,\@pscat,\%keyorder); - $r->print('
    - '. + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + &parmboxes($r,\%allparms,\@pscat,\%keyorder); + $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View'))); + $r->print('
    '. '
    '.&mt('Parts').''.&mt('Section(s)'). ''.&mt('Group(s)').'
    '); &partmenu($r,\%allparts,\@psprt); @@ -3351,11 +3368,17 @@ ENDOVER $r->print(''); &groupmenu($r,\@selected_groups); $r->print('
    '); - $r->print('
    '); - + #$r->print(''); + $r->print(&Apache::lonhtmlcommon::row_closure(1)); + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(''); + + $r->print('

    '); + $r->print('
    '); my $sortorder=$env{'form.sortorder'}; unless ($sortorder) { $sortorder='realmstudent'; } &sortmenu($r,$sortorder); + $r->print('
    '); $r->print('

    '); @@ -3371,19 +3394,19 @@ ENDOVER if (($env{'form.store'}) || ($env{'form.dis'})) { - if ($env{'form.store'}) { &storedata($r,$crs,$dom); } + if ($env{'form.store'}) { &storedata($r,$crs,$dom); } # Read modified data - my $resourcedata=&readdata($crs,$dom); + my $resourcedata=&readdata($crs,$dom); # List data - &listdata($r,$resourcedata,$listdata,$sortorder); + &listdata($r,$resourcedata,$listdata,$sortorder); } $r->print(&tableend(). - ((($env{'form.store'}) || ($env{'form.dis'}))?'

    ':''). - ''.&Apache::loncommon::end_page()); + ((($env{'form.store'}) || ($env{'form.dis'}))?'

    ':''). + ''.&Apache::loncommon::end_page()); } sub secgroup_lister { @@ -3427,7 +3450,7 @@ sub overview { my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview', - text=>"Overview Mode"}); + text=>"Overview Mode"}); my $start_page=&Apache::loncommon::start_page('Modify Parameters'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print(<print(&tableend().'

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

    '. - &Apache::loncommon::end_page()); + ($foundkeys?'':&mt('There are no parameters.')).'

    '. + &Apache::loncommon::end_page()); } sub clean_parameters { @@ -3463,7 +3486,7 @@ sub clean_parameters { my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters', - text=>"Clean Parameters"}); + text=>"Clean Parameters"}); my $start_page=&Apache::loncommon::start_page('Clean Parameters'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Clean'); $r->print(<print('

    '. - &mt('These parameters refer to resources that do not exist.'). - '

    '. - ''.'
    '. - '
    '); + &mt('These parameters refer to resources that do not exist.'). + ''. + ''.'
    '. + '
    '); $r->print(&Apache::loncommon::start_data_table(). - ''. - ''.&mt('Delete').''. - ''.&mt('Parameter').''. - ''); + ''. + ''.&mt('Delete').''. + ''.&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); - } - $r->print(&mt('Parameter: "[_1]" with value: "[_2]"', - &standard_parameter_names($data{'parameter_name'}), - $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(''); - - } + 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(&Apache::loncommon::end_data_table().'

    '. - ''. - '

    '. - &Apache::loncommon::end_page()); + ''. + '

    '. + &Apache::loncommon::end_page()); } sub date_shift_one { @@ -3548,7 +3572,7 @@ sub date_shift_one { my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'}, - text=>"Shifting Dates"}); + text=>"Shifting Dates"}); my $start_page=&Apache::loncommon::start_page('Shift Dates'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift'); $r->print(<'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'}, - text=>"Shifting Dates"}); + text=>"Shifting Dates"}); my $start_page=&Apache::loncommon::start_page('Shift Dates'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift'); $r->print(<'Settings for this Course', - items => [ - { linktext => 'Course Environment', - url => '/adm/parmset?action=crsenv', - permission => $parm_permission, - linktitle =>'Edit environment settings for this course.' , - icon => 'preferences-desktop-remote-desktop.png' , - #help => 'Course_Environment', - }, - { linktext => 'Portfolio Metadata', - url => '/adm/parmset?action=setrestrictmeta', - permission => $parm_permission, - linktitle => 'Restrict metadata for this course.' , - icon =>'contact-new.png' , - }, - { linktext => 'Manage Course Slots', - url => '/adm/slotrequest?command=showslots', - permission => $vgr, - linktitle =>'Manage slots for this course.' , - icon => 'format-justify-fill.png' , - }, - { linktext => 'Reset Student Access Times', - url => '/adm/helper/resettimes.helper', - permission => $mgr, - linktitle =>'Reset access times for folders/maps, resources or the course.' , - icon => 'start-here.png' , - }, - - { linktext => 'Set Parameter Setting Default Actions', - url => '/adm/parmset?action=setdefaults', - permission => $parm_permission, - linktitle =>'Set default actions for parameters.' , - icon => 'folder-new.png' , - }]}, - { categorytitle => 'New and Existing Parameter Settings for Resources', - items => [ - { linktext => 'Edit Resource Parameters - Helper Mode', - url => '/adm/helper/parameter.helper', - permission => $parm_permission, - linktitle =>'Set/Modify resource parameters in helper mode.' , - icon => 'dialog-information.png' , - #help => 'Parameter_Helper', - }, - { linktext => 'Edit Resource Parameters - Overview Mode', - url => '/adm/parmset?action=newoverview', - permission => $parm_permission, - linktitle =>'Set/Modify resource parameters in overview mode.' , - icon => 'edit-find.png' , - #help => 'Parameter_Overview', - }, - { linktext => 'Edit Resource Parameters - Table Mode', - url => '/adm/parmset?action=settable', - permission => $parm_permission, - linktitle =>'Set/Modify resource parameters in table mode.' , - icon => 'edit-copy.png' , - #help => 'Table_Mode', - }]}, + ( { categorytitle=>"Settings for this $crstype", + items => [ + { linktext => 'Portfolio Metadata', + url => '/adm/parmset?action=setrestrictmeta', + permission => $parm_permission, + linktitle => "Restrict metadata for this $lc_crstype." , + icon =>'contact-new.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 => 'Set Parameter Setting Default Actions', + url => '/adm/parmset?action=setdefaults', + permission => $parm_permission, + linktitle =>'Set default actions for parameters.' , + icon => 'folder-new.png' , + }]}, + { categorytitle => 'New and Existing Parameter Settings for Resources', + items => [ + { linktext => 'Edit Resource Parameters - Helper Mode', + url => '/adm/helper/parameter.helper', + permission => $parm_permission, + linktitle =>'Set/Modify resource parameters in helper mode.' , + icon => 'dialog-information.png' , + #help => 'Parameter_Helper', + }, + { linktext => 'Edit Resource Parameters - Overview Mode', + url => '/adm/parmset?action=newoverview', + permission => $parm_permission, + linktitle =>'Set/Modify resource parameters in overview mode.' , + icon => 'edit-find.png' , + #help => 'Parameter_Overview', + }, + { linktext => 'Edit Resource Parameters - Table Mode', + url => '/adm/parmset?action=settable', + 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 => 'Modify Resource Parameters - Overview Mode', - url => '/adm/parmset?action=setoverview', - 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, - linktitle =>'View parameter and course blog posting/user notification change log.' , - icon => 'emblem-system.png' , - }]} + items => [ + { linktext => 'Modify Resource Parameters - Overview Mode', + url => '/adm/parmset?action=setoverview', + 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, + linktitle =>"View parameter and $lc_crstype blog posting/user notification change log." , + icon => 'document-properties.png', + }]} ); $r->print(&Apache::lonhtmlcommon::generate_menu(@menu)); return; @@ -3863,24 +3759,24 @@ sub output_row { my @options= ( ['active', 'Show to student'], ['stuadd', 'Provide text area for students to type metadata'], ['choices','Provide choices for students to select from']); -# ['onlyone','Student may select only one choice']); +# ['onlyone','Student may select only one choice']); if ($added_flag) { push @options,['deleted', 'Delete Metadata Field']; } $output = &Apache::loncommon::start_data_table_row(); - $output .= ''; + $output .= ''.$field_text.':'; $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 .= ''.(' ' x 5).' '; - $output .= &Apache::loncommon::end_data_table_row(); - } + my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ; + $output .= &Apache::loncommon::continue_data_table_row(); + $output .= ''.(' ' x 5).''; + $output .= &Apache::loncommon::end_data_table_row(); + } $output .= &Apache::loncommon::continue_data_table_row(); - $output .= ''.(' ' x 10).''; + $output .= ''.(' ' x 10).''; $output .= &Apache::loncommon::end_data_table_row(); my $multiple_checked; my $single_checked; @@ -3891,16 +3787,16 @@ sub output_row { $multiple_checked = ' checked="checked"'; $single_checked = ''; } - $output .= &Apache::loncommon::continue_data_table_row(); - $output .= ''.(' ' x 10).''; - $output .= &Apache::loncommon::end_data_table_row(); - $output .= &Apache::loncommon::continue_data_table_row(); - $output .= ''.(' ' x 10).''; - $output .= &Apache::loncommon::end_data_table_row(); + $output .= &Apache::loncommon::continue_data_table_row(); + $output .= ''.(' ' x 10).' + + '.&mt('Student may select multiple choices from list').''; + $output .= &Apache::loncommon::end_data_table_row(); + $output .= &Apache::loncommon::continue_data_table_row(); + $output .= ''.(' ' x 10).' + + '.&mt('Student may select only one choice from list').''; + $output .= &Apache::loncommon::end_data_table_row(); } return ($output); } @@ -3914,7 +3810,7 @@ sub order_meta_fields { my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; $r->print(&Apache::loncommon::start_page('Order Metadata Fields')); &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata', - text=>"Add Metadata Field"}); + text=>"Add Metadata Field"}); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/parmset?action=setrestrictmeta", text=>"Restrict Metadata"}, @@ -3929,32 +3825,32 @@ sub order_meta_fields { 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 - for ($i=0;$i<$newpos;$i++) { - $neworder[$i]=$oldorder[$i]; - } - $neworder[$newpos]=$oldorder[$currentpos]; - for ($i=$newpos+1;$i<$currentpos+1;$i++) { - $neworder[$i]=$oldorder[$i-1]; - } - for ($i=$currentpos+1;$i<=$#oldorder;$i++) { - $neworder[$i]=$oldorder[$i]; - } + for ($i=0;$i<$newpos;$i++) { + $neworder[$i]=$oldorder[$i]; + } + $neworder[$newpos]=$oldorder[$currentpos]; + for ($i=$newpos+1;$i<$currentpos+1;$i++) { + $neworder[$i]=$oldorder[$i-1]; + } + for ($i=$currentpos+1;$i<=$#oldorder;$i++) { + $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; @@ -3966,8 +3862,8 @@ sub order_meta_fields { $ordered_fields = join ",", @fields_in_order; } my $put_result = &Apache::lonnet::put('environment', - {'metadata.addedorder'=>$ordered_fields},$dom,$crs); - } + {'metadata.addedorder'=>$ordered_fields},$dom,$crs); + } $r->print(''); my $num_fields = scalar(@fields_in_order); foreach my $key (@fields_in_order) { @@ -4005,7 +3901,7 @@ sub continue { sub addmetafield { my ($r)=@_; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata', - text=>"Add Metadata Field"}); + text=>"Add Metadata Field"}); $r->print(&Apache::loncommon::start_page('Add Metadata Field')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field')); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -4018,7 +3914,7 @@ sub addmetafield { $options =~ s/,,/,/; my $put_result = &Apache::lonnet::put('environment', {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs); - + $r->print('Undeleted Metadata Field '.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}." with result ".$put_result.'
    '); } $r->print(&continue()); @@ -4060,7 +3956,7 @@ sub setrestrictmeta { my $item_num; my $put_result; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta', - text=>"Restrict Metadata"}); + text=>"Restrict Metadata"}); $r->print(&Apache::loncommon::start_page('Restrict Metadata')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata')); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -4075,21 +3971,21 @@ sub setrestrictmeta { my $meta_key = $2; if ($save_field ne $meta_field) { $save_field = $meta_field; - if ($env{'form.'.$meta_field.'_stuadd'}) { - $options.='stuadd,'; - } - if ($env{'form.'.$meta_field.'_choices'}) { - $options.='choices,'; - } - if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') { - $options.='onlyone,'; - } - if ($env{'form.'.$meta_field.'_active'}) { - $options.='active,'; - } - if ($env{'form.'.$meta_field.'_deleted'}) { - $options.='deleted,'; - } + if ($env{'form.'.$meta_field.'_stuadd'}) { + $options.='stuadd,'; + } + if ($env{'form.'.$meta_field.'_choices'}) { + $options.='choices,'; + } + if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') { + $options.='onlyone,'; + } + if ($env{'form.'.$meta_field.'_active'}) { + $options.='active,'; + } + if ($env{'form.'.$meta_field.'_deleted'}) { + $options.='deleted,'; + } my $name = $save_field; $put_result = &Apache::lonnet::put('environment', {'metadata.'.$meta_field.'.options'=>$options, @@ -4100,7 +3996,7 @@ sub setrestrictmeta { } } &Apache::lonnet::coursedescription($env{'request.course.id'}, - {'freshen_cache' => 1}); + {'freshen_cache' => 1}); # Get the default metadata fields my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio'); # Now get possible added metadata fields @@ -4110,8 +4006,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 = (< @@ -4129,7 +4025,7 @@ ENDButtons $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt); } $output .= &Apache::loncommon::end_data_table(); - $r->print(<print(< $output $buttons @@ -4174,9 +4070,9 @@ sub defaultsetter { my ($r) = @_; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults', - text=>"Set Defaults"}); - my $start_page = - &Apache::loncommon::start_page('Parameter Setting Default Actions'); + text=>"Set Defaults"}); + my $start_page = + &Apache::loncommon::start_page('Parameter Setting Default Actions'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults'); $r->print(< 'Days', - 'hours' => 'Hours', - 'min' => 'Minutes', - 'sec' => 'Seconds', - 'yes' => 'Yes', - 'no' => 'No'); + 'hours' => 'Hours', + 'min' => 'Minutes', + 'sec' => 'Seconds', + 'yes' => 'Yes', + 'no' => 'No'); my @standardoptions=('','default'); my @standarddisplay=('',&mt('Default value when manually setting')); 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.')); + &mt('Automatic setting rules apply to table mode interfaces only.')); $r->print("\n".&Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(). - "
    '. - &Apache::loncommon::end_data_table_header_row()); + &Apache::loncommon::start_data_table_header_row(). + "'. + &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(). - "'.&Apache::loncommon::end_data_table_row()); } $r->print(&Apache::loncommon::end_data_table(). - "\n".''."\n". - &Apache::loncommon::end_page()); + "\n".''."\n". + &Apache::loncommon::end_page()); return; } @@ -4336,90 +4232,100 @@ 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'); + my $realmdescription=&mt('all resources'); if ($middle=~/^(.+)\_\_\_\(all\)$/) { - $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).'
    ('.$1.')
    '; - $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1); + $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); + 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, - $what,$middle,$uname,$udom,$issection,$realmdescription); + $what,$middle,$uname,$udom,$issection,$realmdescription); } my %standard_parms; - +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; + } } close($config); $standard_parms{'int_pos'} = 'Positive Integer'; $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero'; - %standard_parms=&Apache::lonlocal::texthash(%standard_parms); } sub standard_parameter_names { my ($name)=@_; if (!%standard_parms) { - &load_parameter_names(); + &load_parameter_names(); } if ($standard_parms{$name}) { - return $standard_parms{$name}; - } else { - return $name; + return $standard_parms{$name}; + } else { + return $name; } } - +sub standard_parameter_types { + my ($name)=@_; + if (!%standard_parms_types) { + &load_parameter_names(); + } + if ($standard_parms_types{$name}) { + return $standard_parms_types{$name}; + } + return; +} sub parm_change_log { my ($r)=@_; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', - text=>"Parameter Change Log"}); + text=>"Parameter Change Log"}); $r->print(&Apache::loncommon::start_page('Parameter Change Log')); $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'}); + $env{'course.'.$env{'request.course.id'}.'.domain'}, + $env{'course.'.$env{'request.course.id'}.'.num'}); if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); } $r->print(''); - + my %saveable_parameters = ('show' => 'scalar',); &Apache::loncommon::store_course_settings('parameter_log', \%saveable_parameters); @@ -4427,148 +4333,297 @@ sub parm_change_log { \%saveable_parameters); $r->print(&Apache::loncommon::display_filter(). ''. - ''); + ' '.&mt('Include parameter types').''. + ''); my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}); + $env{'course.'.$env{'request.course.id'}.'.domain'}); $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row(). - ''. - &Apache::loncommon::end_data_table_header_row()); + ''. + &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; - } (keys(%parmlog))) { + 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 ((($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 $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 $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; - } - $output .=''.&Apache::loncommon::end_data_table_row(); - } + &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; + } + my $parmitem = &standard_parameter_names($parmname); + $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.' + $r->print($row_start.''.$output); - $shown++; - } - if (!($env{'form.show'} eq &mt('all') - || $shown<=$env{'form.show'})) { last; } + '
    '.$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()); $r->print(&Apache::loncommon::end_page()); } +sub update_slots { + my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_; + my %slot=&Apache::lonnet::get_slot($slot_name); + if (!keys(%slot)) { + return 'error: slot does not exist'; + } + my $max=$slot{'maxspace'}; + if (!defined($max)) { $max=99999; } + + my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum, + "^$slot_name\0"); + my ($tmp)=%consumed; + if ($tmp=~/^error: 2 / ) { + return 'error: unable to determine current slot status'; + } + my $last=0; + foreach my $key (keys(%consumed)) { + my $num=(split('\0',$key))[1]; + if ($num > $last) { $last=$num; } + if ($consumed{$key}->{'name'} eq $uname.':'.$udom) { + return 'ok'; + } + } + + if (scalar(keys(%consumed)) >= $max) { + return 'error: no space left in slot'; + } + my $wanted=$last+1; + + my %reservation=('name' => $uname.':'.$udom, + 'timestamp' => time, + 'symb' => $symb); + + my $success=&Apache::lonnet::newput('slot_reservations', + {"$slot_name\0$wanted" => + \%reservation}, + $cdom, $cnum); + if ($success eq 'ok') { + my %storehash = ( + symb => $symb, + slot => $slot_name, + action => 'reserve', + context => 'parameter', + ); + &Apache::lonnet::instructor_log('slotreservationslog',\%storehash, + '',$uname,$udom,$cnum,$cdom); + + &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash, + '',$uname,$udom,$uname,$udom); + } + return $success; +} + +sub delete_slots { + my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_; + my $delresult; + my %consumed = &Apache::lonnet::dump('slot_reservations',$cdom, + $cnum, "^$slot_name\0"); + if (&Apache::lonnet::error(%consumed)) { + return 'error: unable to determine current slot status'; + } + my ($tmp)=%consumed; + if ($tmp=~/^error: 2 /) { + return 'error: unable to determine current slot status'; + } + foreach my $key (keys(%consumed)) { + if ($consumed{$key}->{'name'} eq $uname.':'.$udom) { + my $num=(split('\0',$key))[1]; + my $entry = $slot_name.'\0'.$num; + $delresult = &Apache::lonnet::del('slot_reservations',[$entry], + $cdom,$cnum); + if ($delresult eq 'ok') { + my %storehash = ( + symb => $symb, + slot => $slot_name, + action => 'release', + context => 'parameter', + ); + &Apache::lonnet::instructor_log('slotreservationslog',\%storehash, + 1,$uname,$udom,$cnum,$cdom); + &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash, + 1,$uname,$udom,$uname,$udom); + } + } + } + return $delresult; +} + sub check_for_course_info { my $navmap = Apache::lonnavmaps::navmap->new(); return 1 if ($navmap); return 0; } +sub questiontype_release_vars { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $chome = $env{'course.'.$env{'request.course.id'}.'.home'}; + my $chostname = &Apache::lonnet::hostname($chome); + my ($cmajor,$cminor) = + split(/\./,&Apache::lonnet::get_server_loncaparev($cdom,$chome)); + return ($chostname,$cmajor,$cminor); +} + +sub questiontype_releasecheck { + my ($questiontype,$needsrelease,$chostname,$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:type:'.$questiontype}); + } + return $needsnewer; +} + +sub oldversion_warning { + my ($questiontype,$chostname,$cmajor,$cminor,$needsrelease) = @_; + my $desc; + if (ref($strings{'string_questiontype'}) eq 'ARRAY') { + foreach my $possibilities (@{ $strings{'string_questiontype'} }) { + next unless (ref($possibilities) eq 'ARRAY'); + my ($name, $description) = @{ $possibilities }; + if ($name eq $questiontype) { + $desc = $description; + last; + } + } + } + return '

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

    '; +} sub handler { my $r=shift; @@ -4580,25 +4635,27 @@ sub handler { return OK if $r->header_only; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['action','state', + ['action','state', 'pres_marker', 'pres_value', 'pres_type', + 'filter','part', 'udom','uname','symb','serial','timebase']); &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset", - text=>"Parameter Manager", - faq=>10, - bug=>'Instructor Interface', - help => 'Parameter_Manager'}); + text=>"Parameter Manager", + faq=>10, + bug=>'Instructor Interface', + help => + 'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'}); # ----------------------------------------------------- Needs to be in a course my $parm_permission = - (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) || - &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'. - $env{'request.course.sec'})); + (&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'} && $parm_permission && $exists) { @@ -4608,47 +4665,43 @@ sub handler { # Check first if coming from someone else headed directly for # the table mode if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) - && (!$env{'form.dis'})) || ($env{'form.symb'})) { - &assessparms($r); + && (!$env{'form.dis'})) || ($env{'form.symb'})) { + &assessparms($r); } elsif (! exists($env{'form.action'})) { &print_main_menu($r,$parm_permission); - } elsif ($env{'form.action'} eq 'crsenv') { - &crsenv($r); } elsif ($env{'form.action'} eq 'setoverview') { - &overview($r); - } elsif ($env{'form.action'} eq 'addmetadata') { - &addmetafield($r); - } elsif ($env{'form.action'} eq 'ordermetadata') { - &order_meta_fields($r); + &overview($r); + } elsif ($env{'form.action'} eq 'addmetadata') { + &addmetafield($r); + } elsif ($env{'form.action'} eq 'ordermetadata') { + &order_meta_fields($r); } elsif ($env{'form.action'} eq 'setrestrictmeta') { - &setrestrictmeta($r); + &setrestrictmeta($r); } elsif ($env{'form.action'} eq 'newoverview') { - &newoverview($r); + &newoverview($r); } elsif ($env{'form.action'} eq 'setdefaults') { - &defaultsetter($r); - } elsif ($env{'form.action'} eq 'settable') { - &assessparms($r); + &defaultsetter($r); + } elsif ($env{'form.action'} eq 'settable') { + &assessparms($r); } elsif ($env{'form.action'} eq 'parameterchangelog') { - &parm_change_log($r); + &parm_change_log($r); } elsif ($env{'form.action'} eq 'cleanparameters') { - &clean_parameters($r); + &clean_parameters($r); } elsif ($env{'form.action'} eq 'dateshift1') { &date_shift_one($r); } elsif ($env{'form.action'} eq 'dateshift2') { &date_shift_two($r); - } elsif ($env{'form.action'} eq 'categorizecourse') { - &assign_course_categories($r); - } + } } 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();
    ".&mt('Rule for parameter').''. - &mt('Action').''.&mt('Value').'".&mt('Rule for parameter').''. + &mt('Action').''.&mt('Value').'".$allparms{$tempkey}."\n
    (".$tempkey.')
    '); - my $action=&rulescache($tempkey.'_action'); - $r->print(''); - unless (&isdateparm($defkeytype{$tempkey})) { - $r->print("\n
    ".&mt('Triggering value(s) of other parameter (optional, comma-separated):'). - ''); - } - $r->print("\n
    \n"); + unless ($tempkey) { next; } + $r->print("\n".&Apache::loncommon::start_data_table_row(). + "".$allparms{$tempkey}."\n
    (".$tempkey.')
    '); + my $action=&rulescache($tempkey.'_action'); + $r->print(''); + unless (&isdateparm($defkeytype{$tempkey})) { + $r->print("\n
    ".&mt('Triggering value(s) of other parameter (optional, comma-separated):'). + ''); + } + $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(<print(<$lt{'days'}
    $lt{'hours'}
    $lt{'min'}
    $lt{'sec'} ENDINPUTDATE - } elsif ($defkeytype{$tempkey} eq 'string_yesno') { + } 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"'; } + if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; } + if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; } - $r->print(< $lt{'yes'}
    - + $r->print(< $lt{'yes'}
    + ENDYESNO } else { - $r->print(''); - } + $r->print(''); + } $r->print('
    '.&mt('Time').''.&mt('User').''.&mt('Extent').''.&mt('Users').''. - &mt('Parameter').''.&mt('Part').''.&mt('New Value').''.&mt('Announce').''.&mt('Time').''.&mt('User').''.&mt('Extent').''.&mt('Users').''. + &mt('Parameter').''.&mt('Part').''.&mt('New Value').''.&mt('Announce').''.$realm.''.$section.''. - &standard_parameter_names($parmname).''. - ($part?&mt('Part: [_1]',$part):&mt('All Parts')).''; - my $stillactive=0; - if ($parmlog{$id}{'delflag'}) { - $output .= &mt('Deleted'); - } else { - if ($typeflag) { - $output .= &mt('Type: [_1]',&standard_parameter_names($value)); - } else { - my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what), - $uname,$udom,$issection,$issection,$courseopt); - if (&isdateparm($istype{$parmname})) { - $output .= &Apache::lonlocal::locallocaltime($value); - } else { - $output .= $value; - } - if ($value ne $all[$level]) { - $output .= '
    '.&mt('Not active anymore').''; - } else { - $stillactive=1; - } - } - } - $output .= '
    '; - if ($stillactive) { - my $title=&mt('Changed [_1]',&standard_parameter_names($parmname)); - my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$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 .= ''.$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); + my $showvalue = $value; + if ($istype{$parmname} eq '') { + my $type = &standard_parameter_types($parmname); + if ($type ne '') { + if (&isdateparm($type)) { + $showvalue = + &Apache::lonlocal::locallocaltime($value); + } + } + } else { + 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 .= '
    '; + + 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 .= ''.$time.''.$time.' '.$about_me_link. - '
    '.$parmlog{$id}{'exe_uname'}. - ':'.$parmlog{$id}{'exe_udom'}.''. - $send_msg_link.'