--- loncom/interface/lonparmset.pm 2009/07/14 13:53:03 1.467 +++ loncom/interface/lonparmset.pm 2013/07/15 14:32:44 1.537 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.467 2009/07/14 13:53:03 amueller Exp $ +# $Id: lonparmset.pm,v 1.537 2013/07/15 14:32:44 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -137,33 +137,41 @@ javascript function 'pjump'. =item extractResourceInformation() : -Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes. + extractResourceInformation extracts lots of information about all of the the course's resources into a variety of hashes. Input: See list below: -=item * B : An array that will contain all of the ids in the course. +=item * B : Current username -=item * B : hash, id->type, where "type" contains the extension of the file, thus, I. +=item * B : Domain of current user. -=item * B : hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id +=item * b : hash, name of parameter->display value (what is the display value?) +Outputs: See list below: -=item * B : hash, part identification->text representation of part, where the text representation is "[Part $part]" +=item * B (out) : An array that will contain all of the ids in the course. -=item * B : hash, full key to part->display value (what's display value?) +=item * B(out) : hash, id->type, where "type" contains the extension of the file, thus, I. -=item * B : hash, ??? +=item * B (out) : hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id -=item * B : ??? +=item * B (out) : hash, name of parameter->display value (what is the display value?) -=item * B : hash, ??? +=item * B (out) : hash, part identification->text representation of part, where the text representation is "[Part $part]" + +=item * B (out) : hash, ??? =item * B : ?? =item * B : hash, id->full sym? +=item * B + +=item * B + +=item * B +=item * B =item isdateparm() @@ -196,8 +204,8 @@ Input: See list below: Show assessment data and parameters. This is a large routine that should be simplified and shortened... someday. -Inputs: $r - +Inputs: $r - the Apache request object. + Returns: nothing Variables used (guessed by Jeremy): @@ -248,37 +256,6 @@ Variables used (guessed by Jeremy): =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 @@ -333,9 +310,35 @@ use Apache::lonlocal; use Apache::lonnavmaps; use Apache::longroup; use Apache::lonrss; +use HTML::Entities; use LONCAPA qw(:DEFAULT :match); +sub startSettingsScreen { + my ($r,$mode,$crstype)=@_; + + my $tabtext = &mt('Course Settings'); + if ($crstype eq 'Community') { + $tabtext = &mt('Community Settings'); + } + $r->print("\n".''."\n"); + $r->print('
'); +} + +sub endSettingsScreen { + my ($r)=@_; + $r->print('
'); +} + + + sub parmval { my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_; return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec, @@ -347,7 +350,7 @@ 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=''; @@ -375,13 +378,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 @@ -394,25 +397,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 '') { @@ -433,20 +436,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); } @@ -466,25 +469,25 @@ 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}; } } @@ -492,27 +495,27 @@ sub reset_caches { 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}; } } @@ -520,20 +523,20 @@ sub reset_caches { 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}; } } @@ -543,13 +546,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 ('','','','',''); } } @@ -614,12 +617,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=~/^(.*[\_\.])([^\_\.]+)$/); @@ -629,40 +632,40 @@ 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 ''; } sub log_parmset { - return &Apache::lonnet::instructor_log('parameterlog',@_); + return &Apache::lonnet::write_log('course','parameterlog',@_); } sub storeparm_by_symb_inner { @@ -703,62 +706,62 @@ sub storeparm_by_symb_inner { 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 ''; } @@ -769,11 +772,14 @@ sub valout { my $result = ''; # Values of zero are valid. if (! $value && $value ne '0') { - if ($editable) { - $result = '*'; - } else { - $result=' '; - } + if ($editable) { + $result = + ''.&mt('Change').''; + } else { + $result=' '; + } } else { if ($type eq 'date_interval') { my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value); @@ -811,10 +817,11 @@ 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=~s/\,/\, /gs; + $result = &HTML::Entities::encode($result,'"<>&'); } } return $result; @@ -825,7 +832,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]}; @@ -837,14 +844,14 @@ sub plink { 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; + \$hour, \$min, \$sec) { + $$item = &HTML::Entities::encode($$item,'"<>&'); + $$item =~ s/\'/\\\'/g; } return '
'. - ''. - $valout.'
'; + ''. + $valout.''; } sub page_js { @@ -855,16 +862,10 @@ sub page_js { return(< // + $selscript ENDJS } + +sub showhide_js { + return <<"COURSECONTENTSCRIPT"; + +function showHide_courseContent() { + var parmlevValue=document.getElementById("parmlev").value; + if (parmlevValue == 'general') { + document.getElementById('mapmenu').style.display="none"; + } else { + if ((parmlevValue == "full") || (parmlevValue == "map")) { + document.getElementById('mapmenu').style.display =""; + } else { + document.getElementById('mapmenu').style.display="none"; + } + } + return; +} + +COURSECONTENTSCRIPT +} + sub startpage { - my ($r) = @_; + my ($r,$psymb,$crstype) = @_; - my %loaditems = ('onunload' => "pclose()", - 'onload' => "group_or_section('cgroup')",); + my %loaditems = ( + 'onload' => "group_or_section('cgroup')", + ); + if (!$psymb) { + $loaditems{'onload'} = "showHide_courseContent(); group_or_section('cgroup'); resize_scrollbox('mapmenuscroll','1','1');"; + } if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) - && (!$env{'form.dis'})) || ($env{'form.symb'})) { - &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters', - text=>"Problem Parameters"}); + && (!$env{'form.dis'})) || ($env{'form.symb'})) { + &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters', + text=>"Problem Parameters"}); } else { - &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', - text=>"Table Mode", - help => 'Course_Setting_Parameters'}); + &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', + text=>"Table Mode", + help => 'Course_Setting_Parameters'}); } + my $js = &page_js().' + +'; my $start_page = - &Apache::loncommon::start_page('Set/Modify Course Parameters', - &page_js(), - {'add_entries' => \%loaditems,}); + &Apache::loncommon::start_page('Set/Modify Course Parameters',$js, + {'add_entries' => \%loaditems,}); my $breadcrumbs = - &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode'); + &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode'); + my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'}); + my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'}); + $r->print($start_page.$breadcrumbs); + &startSettingsScreen($r,'parmset',$crstype); $r->print(< + + 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; } } @@ -960,13 +999,13 @@ sub print_row { if ($parmlev eq 'full') { $r->print('' - .$$part{$which}.''); + .($$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.''); @@ -1018,16 +1057,16 @@ 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); @@ -1035,14 +1074,14 @@ sub print_row { &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.''); @@ -1071,6 +1110,10 @@ sub print_td { if ($which > 3) { $nolink = 1; } + } elsif ($mprefix =~ /examcode\&$/) { + unless ($which == 2) { + $nolink = 1; + } } if ($nolink) { $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); @@ -1159,81 +1202,81 @@ 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,$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 = $display; - } - $$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 Content'); + } 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); } } @@ -1244,6 +1287,11 @@ 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; @@ -1259,114 +1307,74 @@ sub parmmenu { displayOverview = "none" } - for (i=0; i ENDSCRIPT - $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('
  • print(' style="display:none"'); - } - $r->print('>' - .($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey} : $tempkey) - .'
  • ' - ); - } - $r->print('
' - .'

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

' - ); + $r->print('
'); &shortCuts($r,$allparms,$pscat,$keyorder); - - $r->print(&Apache::lonhtmlcommon::row_closure(1)); + $r->print('
'); } # return a hash sub categories { @@ -1393,10 +1401,13 @@ sub lookUpTableParameter { 'contentopen' => 'time_settings', 'contentclose' => 'time_settings', 'discussend' => 'time_settings', + 'printopendate' => 'time_settings', + 'printclosedate' => 'time_settings', 'weight' => 'grading', 'handgrade' => 'grading', 'maxtries' => 'tries', 'hinttries' => 'tries', + 'randomizeontries' => 'tries', 'type' => 'problem_appearance', 'problemstatus' => 'problem_appearance', 'display' => 'problem_appearance', @@ -1423,7 +1434,10 @@ sub lookUpTableParameter { 'acc' => 'misc', 'maxcollaborators' => 'misc', 'scoreformat' => 'misc', - + 'lenient' => 'grading', + 'retrypartial' => 'tries', + 'discussvote' => 'misc', + 'examcode' => 'high_level_randomization', ); } @@ -1453,7 +1467,7 @@ sub whatIsMyCategory { sub keysindisplayorderCategory { my ($name,$keyorder)=@_; return sort { - $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b}; + $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b}; } ( @{$name}); } @@ -1490,111 +1504,90 @@ sub parmboxes { 'slots' => [], 'file_submission' => [], 'misc' => [], - ); + ); + foreach $tempparameter (keys %$allparms) { &whatIsMyCategory($tempparameter, \%categoryList); } #part to print the parm-list - $r->print(''); + $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)=@_; - #part to print out the shortcuts for parmselection - $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').'' - .'' - .'
' - .'
'); + # 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)=@_; + my $selsize = 1+scalar(keys(%{$allparts})); + if ($selsize > 8) { + $selsize = 8; + } - $r->print(''); $r->print(''); my %temphash=(); foreach (@{$psprt}) { $temphash{$_}=1; } foreach my $tempkey (sort { - if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); } + if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); } } keys(%{$allparts})) { - unless ($tempkey =~ /\./) { - $r->print(''); - } + unless ($tempkey =~ /\./) { + $r->print(''); + } } $r->print(''); } @@ -1620,9 +1613,9 @@ sub usermenu { $sections .= qq| onchange="group_or_section('csec')" |; } $sections .= '>'; - foreach my $section ('',sort keys %sectionhash) { - $sections.=''; } $sections.=''; @@ -1696,114 +1689,189 @@ function group_or_section(caller) { ,$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(&Apache::lonhtmlcommon::topic_bar (2,&mt('Select Parameters'))); + my ($r,$allparms,$pscat,$psprt,$keyorder,$divid)=@_; + $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View'))); + &parmmenu($r,$allparms,$pscat,$keyorder); - $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(&Apache::loncommon::start_scrollbox('480px','440px','200px',$divid)); &parmboxes($r,$allparms,$pscat,$keyorder); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); - $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View'))); - &partmenu($r,$allparts,$psprt); + $r->print(&Apache::loncommon::end_scrollbox()); + $r->print(&Apache::lonhtmlcommon::row_closure(1)); $r->print(&Apache::lonhtmlcommon::end_pick_box()); + } sub mapmenu { - my ($r,$allmaps,$pschp,$maptitles)=@_; + my ($r,$allmaps,$pschp,$maptitles,$symbp)=@_; + my %allmaps_inverted = reverse %$allmaps; my $navmap = Apache::lonnavmaps::navmap->new(); my $tree=[]; my $treeinfo={}; if (defined($navmap)) { - my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef); + my $it=$navmap->getIterator(undef,undef,undef,1,1,undef); my $curRes; my $depth = 0; - + my %parent = (); + my $startcount = 5; + my $lastcontainer = $startcount; +# preparing what is to show ... while ($curRes = $it->next()) { if ($curRes == $it->BEGIN_MAP()) { $depth++; + $parent{$depth}= $lastcontainer; } if ($curRes == $it->END_MAP()) { $depth--; + $lastcontainer = $parent{$depth}; } if (ref($curRes)) { + my $symb = $curRes->symb(); + my $ressymb = $symb; if (($curRes->is_sequence()) || ($curRes->is_page())) { my $type = 'sequence'; if ($curRes->is_page()) { $type = 'page'; } my $id= $curRes->id(); - my ($mapid,$resid)=split(/\./,$id); - if(!exists($treeinfo->{$mapid})) { - push(@$tree,$mapid); - $treeinfo->{$mapid} = { + my $srcf = $curRes->src(); + my $resource_name = &Apache::lonnet::gettitle($srcf); + if(!exists($treeinfo->{$id})) { + push(@$tree,$id); + my $enclosing_map_folder = &Apache::lonnet::declutter($curRes->enclosing_map_src()); + $treeinfo->{$id} = { depth => $depth, type => $type, + name => $resource_name, + enclosing_map_folder => $enclosing_map_folder, }; } } } } } - - $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'))); +# Show it ... + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',' id="mapmenu"')); if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) { my $icon = ''; - $r->print(&Apache::loncommon::start_data_table() - .&Apache::loncommon::start_data_table_row() - .''.$icon - .'' - .&Apache::loncommon::end_data_table_row() + my $whitespace = + ''; + + # Info about selectable folders/maps + $r->print( + '
' + .&mt('You can only select maps and folders which have modifiable settings.') + .' '.&Apache::loncommon::help_open_topic('Parameter_Set_Folder') + .'
' + ); + + $r->print(&Apache::loncommon::start_scrollbox('700px','680px','400px','mapmenuscroll')); + $r->print(&Apache::loncommon::start_data_table(undef,'mapmenuinner')); + + # Display row: "All Maps or Folders" + $r->print( + &Apache::loncommon::start_data_table_row(undef,'picklevel') + .'' + .'' + .'
' + .&Apache::loncommon::end_data_table_row() ); - my $whitespace = ''; - foreach my $mapid (@{$tree}) { + + # Display row: "Main Content" + 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->{$mapid}->{'depth'}; + my $depth = $treeinfo->{$id}->{'depth'}; my $indent; for (my $i = 0; $i < $depth; $i++) { $indent.= $whitespace; } $icon = ''; - if ($treeinfo->{$mapid}->{'type'} eq 'page') { + if ($treeinfo->{$id}->{'type'} eq 'page') { $icon = ''; } - $r->print(&Apache::loncommon::start_data_table_row() - .''.$indent.$icon - .'' + .'' + .&Apache::loncommon::end_data_table_row() ); } - $r->print(&Apache::loncommon::end_data_table()); + + $r->print(&Apache::loncommon::end_data_table(). + '
'. + &Apache::loncommon::end_scrollbox()); } } +# 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(&Apache::lonhtmlcommon::row_title(&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(""); } @@ -1816,14 +1884,14 @@ sub sectionmenu { $r->print('\n"); } @@ -1835,14 +1903,14 @@ sub groupmenu { $r->print('\n"); } @@ -1856,26 +1924,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}); } @@ -1891,30 +1959,33 @@ 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_discussend' => 19, - 'parameter_0_discusshide' => 20); + '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, + 'parameter_0_discussvote' => 21, + 'parameter_0_printopendate' => 22, + 'parameter_0_printclosedate' => 23); } @@ -1922,6 +1993,9 @@ sub assessparms { my $r=shift; + + +# -------------------------------------------------------- Variable declaration my @ids=(); my %symbp=(); my %mapp=(); @@ -1929,9 +2003,6 @@ sub assessparms { my %keyp=(); my %uris=(); my %maptitles=(); - -# -------------------------------------------------------- Variable declaration - my %allmaps=(); my %alllevs=(); @@ -1950,14 +2021,16 @@ sub assessparms { my %allparms; my %allparts; +# ------------------------------------------------------------------------------ + # # Order in which these parameters will be displayed # my %keyorder=&standardkeyorder(); - @ids=(); - %symbp=(); - %typep=(); +# @ids=(); +# %symbp=(); # These seem defined above already. +# %typep=(); my $message=''; @@ -1968,13 +2041,17 @@ 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 (!@psprt) { $psprt[0]='all'; } + if (($env{'form.part'}) && ($psprt[0] ne 'all')) { $psprt[0]=$env{'form.part'}; } my $pssymb=''; my $parmlev=''; @@ -1988,63 +2065,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) { @@ -2060,8 +2136,8 @@ sub assessparms { # --------------------------------------------------------- Get all assessments &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, - \%mapp, \%symbp,\%maptitles,\%uris, - \%keyorder); + \%mapp, \%symbp,\%maptitles,\%uris, + \%keyorder); $mapp{'0.0'} = ''; $symbp{'0.0'} = ''; @@ -2071,10 +2147,16 @@ 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++) { + 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,$name); if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) { - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my (@ok_slots,@fail_slots,@del_slots); my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); my ($level,@all) = @@ -2104,31 +2186,60 @@ sub assessparms { } } } + } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote|examcode)\&\d+$/) { + $name = $1; + my $val = $values[$i]; + if ($name eq 'examcode') { + if (&Apache::lonnet::validCODE($values[$i])) { + $val = 'valid'; + } + } + $needsrelease = + $Apache::lonnet::needsrelease{"parameter:$name:$val"}; + if ($needsrelease) { + unless ($got_chostname) { + ($chostname,$cmajor,$cminor) = ¶meter_release_vars(); + $got_chostname = 1; + } + $needsnewer = ¶meter_releasecheck($name,$val, + $needsrelease, + $chostname, + $cmajor,$cminor); + } } - $message.=&storeparm(split(/\&/,$markers[$i]), - $values[$i], - $types[$i], - $uname,$udom,$csec,$cgroup); - } + if ($needsnewer) { + $message .= &oldversion_warning($name,$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); + my $crstype = &Apache::loncommon::course_type(); + &startpage($r,$pssymb,$crstype); 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 @@ -2144,64 +2255,84 @@ function parmsel_show() { // ]]> ENDPARMSELSCRIPT - my $parmselhiddenstyle=' style="display:none"'; - if($env{'form.hideparmsel'} eq 'hidden') { - $r->print('
'); - } else { - $r->print('
'); - } - - # Display parameter selection boxes + if (!$pssymb) { - $r->print(&Apache::lonhtmlcommon::topic_bar (1,&mt('General Parameters'))); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + 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'),'parmstep1')); + $r->print(' + +'); + $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel')); &levelmenu($r,\%alllevs,$parmlev); + $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()); - if ($parmlev ne 'general') { - $r->print(&Apache::lonhtmlcommon::row_closure()); - &mapmenu($r,\%allmaps,$pschp,\%maptitles); - } + # Step 2 + $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2')); + &displaymenu($r,\%allparms,\@pscat,\@psprt,\%keyorder,'parmmenuscroll'); + # Step 3 + $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3')); + $r->print(&Apache::lonhtmlcommon::start_pick_box()); + &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups); $r->print(&Apache::lonhtmlcommon::row_closure(1)); $r->print(&Apache::lonhtmlcommon::end_pick_box()); - - &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder); - } 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). - ''. - '

'); - } - $r->print(&Apache::lonhtmlcommon::topic_bar (3,&mt('User Selection'))); - $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()); - - # parm selection is shown: display parm update button - $r->print('

' + + # Update Display Button + $r->print('

' .'' + .' value="'.&mt('Update Display').'" />' .'' - .'

' - ); - - $r->print('
'); - # ----- End Parameter Selection + .'

'); + $r->print('
'); - # Offer link to display parameter selection again - $r->print(''); + } else { + # 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()); + &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('

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

'); + } + + # ----- End Parameter Selection # Display Messages $r->print('
'.$message.'
'); @@ -2222,91 +2353,97 @@ ENDPARMSELSCRIPT my $csudom=$env{'user.domain'}; if ($parmlev eq 'full') { - my $coursespan=$csec?8:5; - my $userspan=3; - if ($cgroup ne '') { - $coursespan += 3; - } +# +# This produces the cascading table output of parameters +# + 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 ++; + $r->print(&Apache::loncommon::start_data_table()); +# +# This produces the headers +# + $r->print(''); + $r->print(''); + if ($uname) { + if (@usersgroups > 1) { + $userspan ++; + } + $r->print('"); } - $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(< "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 my $rid (@ids) { - my $rid=$_; my ($inmapid)=($rid=~/\.(\d+)$/); if ((!$pssymb && - (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid}))) - || - ($pssymb && $pssymb eq $symbp{$rid})) { + (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid}))) + || + ($pssymb && $pssymb eq $symbp{$rid})) { # ------------------------------------------------------ Entry for one resource if ($defbgone eq '#E0E099') { $defbgone='#E0E0DD'; @@ -2333,11 +2470,18 @@ 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'); + my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display'); if ($allparms{$name{$_}} ne '') { my $identifier; @@ -2357,16 +2501,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(''); - foreach (&keysinorder_bytype(\%name,\%keyorder)) { + unless ($firstrow) { $r->print(''); } else { @@ -2397,7 +2541,7 @@ ENDTABLEHEADFOUR } } # end foreach ids # -------------------------------------------------- End entry for one resource - $r->print('
'.&mt('Any User').'
'.&mt('Any User').''); + $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom'); - $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"); @@ -2381,8 +2525,8 @@ ENDTABLEHEADFOUR $r->print('

'.$maptitles{$mapp{$rid}}.'
'); + $r->print(&Apache::loncommon::end_data_table); } # end of full #--------------------------------------------------- Entry for parm level map if ($parmlev eq 'map') { @@ -2415,7 +2559,7 @@ ENDTABLEHEADFOUR #-------------------------------------------- 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 @@ -2427,16 +2571,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"); #-------------------------------------------------------------------- @@ -2446,32 +2590,32 @@ 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'); - 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'); + 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 @@ -2479,7 +2623,7 @@ ENDTABLEHEADFOUR 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 { @@ -2510,7 +2654,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, @@ -2550,40 +2694,40 @@ 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'); - my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); - if ($allparms{$name{$tempkeyp}} ne '') { - my $identifier; - if ($parmdis =~ /(\s*\[Part.*)$/) { - $identifier = $1; + 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; } - $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'); - } + 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"); @@ -2601,7 +2745,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, @@ -2613,7 +2757,9 @@ ENDMAPONE ); } # end of $parmlev eq general } - $r->print(''.&Apache::loncommon::end_page()); + $r->print(''); + &endSettingsScreen($r); + $r->print(&Apache::loncommon::end_page()); } # end sub assessparms ################################################## @@ -2623,20 +2769,20 @@ my $tableopen; sub tablestart { if ($tableopen) { - return ''; + return ''; } else { - $tableopen=1; - return &Apache::loncommon::start_data_table().''.&mt('Parameter').''. - &mt('Delete').''.&mt('Set to ...').''; + $tableopen=1; + return &Apache::loncommon::start_data_table().''.&mt('Parameter').''. + &mt('Delete').''.&mt('Set to ...').''; } } sub tableend { if ($tableopen) { - $tableopen=0; - return &Apache::loncommon::end_data_table(); + $tableopen=0; + return &Apache::loncommon::end_data_table(); } else { - return''; + return''; } } @@ -2649,16 +2795,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; } @@ -2675,88 +2821,122 @@ 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{$_}; - $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; + $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./; + } + if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') { + my ($data, $typeof, $text, $name); + if ($cmd eq 'set') { + $data=$env{$key}; + $typeof=$env{'form.typeof_'.$thiskey}; + $text = &mt('Saved modified parameter for'); + if ($typeof eq 'string_questiontype') { + $name = 'type'; + } elsif ($typeof eq 'string_lenient') { + $name = 'lenient'; + } elsif ($typeof eq 'string_discussvote') { + $name = 'discussvote'; + } elsif ($typeof eq 'string_examcode') { + $name = 'examcode'; + } elsif ($typeof eq 'string_yesno') { + if ($thiskey =~ /\.retrypartial$/) { + $name = 'retrypartial'; + } + } + if ($name ne '') { + my ($needsrelease,$needsnewer); + $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$data"}; + if ($needsrelease) { + unless ($got_chostname) { + ($chostname,$cmajor,$cminor)=¶meter_release_vars(); + $got_chostname = 1; + } + $needsnewer = ¶meter_releasecheck($name,$data, + $needsrelease, + $chostname,$cmajor, + $cminor); + } + if ($needsnewer) { + $r->print('
'.&oldversion_warning($name,$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) { + 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'); - } - } - } + } + } 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); } } @@ -2770,14 +2950,14 @@ sub parse_listdata_key { # split into student/section affected, and # the realm (folder/resource part and parameter my ($student,$realm) = - ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/); + ($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=~/^(.*)\.(.*)$/); @@ -2798,135 +2978,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); + $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); - } - } + $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 (!$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(). - ''.&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(''.&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},$name)); + } else { + $r->print(&default_selector($thiskey,$$resourcedata{$thiskey})); + } + $r->print(''); + $r->print(''.&Apache::loncommon::end_data_table_row()); + } } return $foundkeys; } @@ -2936,17 +3117,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; @@ -2957,13 +3138,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; } @@ -2978,31 +3159,117 @@ 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', 'Bubblesheet Exam'], + [ 'anonsurvey', 'Anonymous Survey'], + [ 'randomizetry', 'New Randomization Each N Tries (default N=1)'], + [ 'practice', 'Practice'], + [ 'surveycred', 'Survey (credit for submission)']], + 'string_lenient' + => [['yes', 'Yes' ], + [ 'no', 'No' ], + [ 'default', 'Default - only bubblesheet grading is lenient' ]], + 'string_discussvote' + => [['yes','Yes'], + ['notended','Yes, unless discussion ended'], + ['no','No']], ); +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) = @_; + my ($thistype, $thiskey, $showval, $name) = @_; if (!exists($strings{$thistype})) { - return &default_selector($thiskey,$showval); + return &default_selector($thiskey,$showval); } + my %skiptype; + if (($thistype eq 'string_questiontype') || + ($thistype eq 'string_lenient') || + ($thistype eq 'string_discussvote') || + ($name eq 'retrypartial')) { + my ($got_chostname,$chostname,$cmajor,$cminor); + foreach my $possibilities (@{ $strings{$thistype} }) { + next unless (ref($possibilities) eq 'ARRAY'); + my ($parmval, $description) = @{ $possibilities }; + my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval"}; + if ($needsrelease) { + unless ($got_chostname) { + ($chostname,$cmajor,$cminor)=¶meter_release_vars(); + $got_chostname = 1; + } + my $needsnewer=¶meter_releasecheck($name,$parmval,$needsrelease, + $chostname,$cmajor, + $cminor); + if ($needsnewer) { + $skiptype{$parmval} = 1; + } + } + } + } + + my $result; - foreach my $possibilities (@{ $strings{$thistype} }) { - my ($name, $description) = @{ $possibilities }; - $result .= '