--- loncom/interface/lonparmset.pm 2003/06/04 18:24:33 1.97 +++ loncom/interface/lonparmset.pm 2004/07/02 08:12:23 1.165 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.97 2003/06/04 18:24:33 albertel Exp $ +# $Id: lonparmset.pm,v 1.165 2004/07/02 08:12:23 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -58,11 +58,10 @@ use Apache::lonnet; use Apache::Constants qw(:common :http REDIRECT); use Apache::lonhtmlcommon(); use Apache::loncommon; -use Apache::lonmenu; use GDBM_File; use Apache::lonhomework; use Apache::lonxml; - +use Apache::lonlocal; my %courseopt; my %useropt; @@ -132,12 +131,12 @@ sub parmval { # -------------------------------------------------------- first, check default - if ($def) { $outpar[11]=$def; $result=11; } + if (defined($def)) { $outpar[11]=$def; $result=11; } # ----------------------------------------------------- second, check map parms my $thisparm=$parmhash{$symbparm}; - if ($thisparm) { $outpar[10]=$thisparm; $result=10; } + if (defined($thisparm)) { $outpar[10]=$thisparm; $result=10; } # --------------------------------------------------------- third, check course @@ -286,18 +285,32 @@ sub plink { sub startpage { - my ($r,$id,$udom,$csec,$uname)=@_; - - my $bodytag=&Apache::lonmenu::registerurl(). - &Apache::loncommon::bodytag('Set Course Parameters','', - 'onUnload="'. - &Apache::lonmenu::unloadevents().';pclose();" onLoad="'. - &Apache::lonmenu::loadevents().'"'). - &Apache::lonmenu::regflush(); + my ($r,$id,$udom,$csec,$uname,$have_assesments,$trimheader)=@_; + + my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','', + 'onUnload="pclose()"'); my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '. &Apache::loncommon::selectstudent_link('parmform','uname','udom'); my $selscript=&Apache::loncommon::studentbrowser_javascript(); my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); + my %lt=&Apache::lonlocal::texthash( + 'cep' => "Course Environment Parameters", + 'scep' => "Set Course Environment Parameters", + 'smcap' => "Set/Modify Course Assessment Parameter", + 'mcap' => "Modify Course Assessment Parameters", + 'caphm' => "Course Assessment Parameter - Helper Mode", + 'capom' => "Course Assessment Parameters - Overview Mode", + 'captm' => "Course Assessments Parameters - Table Mode", + 'sg' => "Section/Group", + 'fu' => "For User", + 'oi' => "or ID", + 'ad' => "at Domain" + ); + my $overallhelp= + &Apache::loncommon::help_open_topic("Course_Setting_Parameters"). + &Apache::loncommon::help_open_faq(10). + &Apache::loncommon::help_open_bug('Instructor Interface'); + my $assessparmhelp=&Apache::loncommon::help_open_topic("Cascading_Parameters","Assessment Parameters"); $r->print(< @@ -347,31 +360,52 @@ $selscript $bodytag -Use Assignment Parameter Helper, a -simpler interface to set open, due, or answer open dates for problems or sequences. +ENDHEAD + unless ($trimheader) {$r->print(< -

Course Environment

- +

$lt{'cep'}

+ + +
+$assessparmhelp +
+

$lt{'caphm'}

+
+
+
+

$lt{'capom'}

+ +
+
+ENDHEAD2 +} + $r->print(< -

Course Assessments

+

$lt{'captm'}

+ENDHEAD3 + + if (!$have_assesments) { + $r->print(''.&mt('There are no assesment parameters in this course to set.').'
'); + } else { + $r->print(< -Section/Group: +$lt{'sg'}:
-For User +$lt{'fu'} -or ID +$lt{'oi'} -at Domain +$lt{'ad'} $chooseopt ENDHEAD - + } } sub print_row { @@ -463,21 +497,23 @@ sub print_row { } # end of $brief if/else } # end of $parmlev if/else - if ($parmlev eq 'full' || $parmlev eq 'brief') { - $r->print(''. + $r->print(''. &valout($outpar[$result],$typeoutpar[$result]).''); - } - my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}. + + if ($parmlev eq 'full' || $parmlev eq 'brief') { + my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}. '.'.$$name{$which},$symbp{$rid}); + # this doesn't seem to work, and I don't think is correct # my $sessionvaltype=&Apache::lonnet::EXT('resource.'.$$part{$which}. # '.'.$$name{$which}.'.type',$symbp{$rid}); # this seems to work - my $sessionvaltype=$typeoutpar[$result]; - if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; } - $r->print(''. + my $sessionvaltype=$typeoutpar[$result]; + if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; } + $r->print(''. &valout($sessionval,$sessionvaltype).' '. ''); + } $r->print(''); $r->print("\n"); } @@ -485,23 +521,15 @@ sub print_row { sub print_td { my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_; $r->print(''. - &plink($$typeoutpar[$which],$$display{$value},$$outpar[$which], - $mprefix."$which",'parmform.pres','psub').''."\n"); -} - -sub get_env_multiple { - my ($name) = @_; - my @values; - if (defined($ENV{$name})) { - # exists is it an array - if (ref($ENV{$name})) { - @values=@{ $ENV{$name} }; - } else { - $values[0]=$ENV{$name}; - } + ' align="center">'); + if ($which<10) { + $r->print(&plink($$typeoutpar[$which], + $$display{$value},$$outpar[$which], + $mprefix."$which",'parmform.pres','psub')); + } else { + $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); } - return(@values); + $r->print(''."\n"); } =pod @@ -559,7 +587,8 @@ sub extractResourceInformation { my $resid=$2; my $id=$mapid.'.'.$resid; my $srcf=$$bighash{$_}; - if ($srcf=~/\.(problem|exam|quiz|assess|survey|form)$/) { +# if ($srcf=~/\.(problem|exam|quiz|assess|survey|form)$/) { + if (1) { $$ids[$#$ids+1]=$id; $$typep{$id}=$1; $$keyp{$id}=''; @@ -638,9 +667,9 @@ sub assessparms { my $r=shift; # -------------------------------------------------------- Variable declaration - my %allkeys; - my %allmaps; - my %alllevs; + my %allkeys=(); + my %allmaps=(); + my %alllevs=(); $alllevs{'Resource Level'}='full'; # $alllevs{'Resource Level [BRIEF]'}='brief'; @@ -665,14 +694,15 @@ sub assessparms { $udom=$ENV{'form.udom'}; unless ($udom) { $udom=$r->dir_config('lonDefDomain'); } - my @pscat=&get_env_multiple('form.pscat'); + my @pscat=&Apache::loncommon::get_env_multiple('form.pscat'); my $pschp=$ENV{'form.pschp'}; - my @psprt=&get_env_multiple('form.psprt'); + my @psprt=&Apache::loncommon::get_env_multiple('form.psprt'); if (!@psprt) { $psprt[0]='0'; } my $showoptions=$ENV{'form.showoptions'}; my $pssymb=''; my $parmlev=''; + my $trimheader=''; my $prevvisit=$ENV{'form.prevvisit'}; # unless ($parmlev==$ENV{'form.parmlev'}) { @@ -695,11 +725,13 @@ sub assessparms { if (!@pscat) { @pscat=('all'); } $pschp=''; $parmlev = 'full'; + $trimheader='yes'; } elsif ($ENV{'form.symb'}) { $pssymb=$ENV{'form.symb'}; if (!@pscat) { @pscat=('all'); } $pschp=''; $parmlev = 'full'; + $trimheader='yes'; } else { $ENV{'form.url'}=''; } @@ -711,7 +743,8 @@ sub assessparms { $id=''; } else { $message= - "Unknown ID '$id' at domain '$udom'"; + "".&mt("Unknown ID")." '$id' ". + &mt('at domain')." '$udom'"; } } else { $uname=$ENV{'form.uname'}; @@ -722,24 +755,25 @@ sub assessparms { $uhome=&Apache::lonnet::homeserver($uname,$udom); if ($uhome eq 'no_host') { $message= - "Unknown user '$uname' at domain '$udom'"; + "".&mt("Unknown user")." '$uname' ". + &mt("at domain")." '$udom'"; $uname=''; } else { - $csec=&Apache::lonnet::usection($udom,$uname, - $ENV{'request.course.id'}); + $csec=&Apache::lonnet::getsection($udom,$uname, + $ENV{'request.course.id'}); if ($csec eq '-1') { $message="". - "User '$uname' at domain '$udom' not ". - "in this course"; + &mt("User")." '$uname' ".&mt("at domain")." '$udom' ". + &mt("not in this course").""; $uname=''; $csec=$ENV{'form.csec'}; } else { my %name=&Apache::lonnet::userenvironment($udom,$uname, ('firstname','middlename','lastname','generation','id')); - $message="\n

\nFull Name: ". + $message="\n

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

'; + "
\n".&mt('ID').": ".$name{'id'}.'

'; } } } @@ -766,6 +800,7 @@ sub assessparms { $mapp{'0.0'} = ''; $symbp{'0.0'} = ''; + # ---------------------------------------------------------- Anything to store? if ($ENV{'form.pres_marker'}) { my ($sresid,$spnam,$snum)=split(/\&/,$ENV{'form.pres_marker'}); @@ -848,12 +883,13 @@ sub assessparms { $message.="Write Error: $1"; } # ---------------------------------------------------------------- Done storing - $message.='

Changes can take up to 10 minutes before being active for all students

'; + $message.='

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

'; } # --------------------------------------------- Devalidate cache for this child - &Apache::lonnet::devalidatecourseresdata( + &Apache::lonnet::devalidatecourseresdata( $ENV{'course.'.$ENV{'request.course.id'}.'.num'}, $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}); + &Apache::lonnet::clear_EXT_cache_status(); # -------------------------------------------------------------- Get coursedata %courseopt = &Apache::lonnet::dump ('resourcedata', @@ -882,7 +918,16 @@ sub assessparms { if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);} # ------------------------------------------------------------------ Start page - &startpage($r,$id,$udom,$csec,$uname); + my $have_assesments=1; + if (scalar(keys(%allkeys)) eq 0) { $have_assesments=0; } + + &startpage($r,$id,$udom,$csec,$uname,$have_assesments,$trimheader); + + if (!$have_assesments) { + untie(%bighash); + untie(%parmhash); + return ''; + } # if ($ENV{'form.url'}) { # $r->print(''); @@ -897,16 +942,11 @@ sub assessparms { $r->print('

'.$message.'

'); - $r->print(''); - - my $submitmessage; - if (($prevvisit) || ($pschp) || ($pssymb)) { - $submitmessage = "Update Display"; - } else { - $submitmessage = "Display"; - } + my $submitmessage = &mt('Update Section or Specific User'); if (!$pssymb) { - $r->print('\n"); - - $r->print(''); - - $r->print(''); - $r->print(''); - $r->print('\n"); + $r->print(''); + if ($parmlev ne 'general') { + $r->print(''); + $r->print('\n"); + } } else { - my ($map,$id,$resource)=split(/___/,$pssymb); - $r->print(""); + my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb); + $r->print(""); $r->print(''); $r->print(''); $r->print(''); @@ -940,7 +979,7 @@ sub assessparms { $r->print(''); + $r->print(' name="showoptions" value="show">'.&mt('Show More Options').'
'); # $r->print(""); # $r->print(""); # $r->print(""); @@ -949,12 +988,12 @@ sub assessparms { if ($showoptions eq 'show') { my $tempkey; - $r->print(''); + $r->print(''); $r->print('

Select Parameter Level'); + $r->print('
'.&mt('Select Parameter Level'). + &Apache::loncommon::help_open_topic('Course_Parameter_Levels'). + ''); $r->print('

Select Enclosing Map or Folder
'.&mt('Select Enclosing Map or Folder').'
Specific Resource$resource
".&mt('Specific Resource')."$resource

print(" checked ");} - $r->print(' name="showoptions" value="show" onclick="form.submit();">Show More Options
Show: $showoptions
pscat: @pscat
psprt: @psprt
Select Parameters to View
'.&mt('Select Parameters to View').'
'); $r->print(''); + $r->print('>'.&mt('All Parameters').''); my $cnt=0; foreach $tempkey (sort { $allparms{$a} cmp $allparms{$b} } @@ -974,7 +1013,7 @@ sub assessparms { $r->print(''); - $r->print('
print(' checked') unless (@pscat); - $r->print('>All Parameters

Sort list by'); + $r->print('
'.&mt('Sort list by').''); $r->print('
'); + $r->print('

'); + if (($prevvisit) || ($pschp) || ($pssymb)) { + $submitmessage = &mt("Update Course Assessment Parameter Display"); + } else { + $submitmessage = &mt("Set/Modify Course Assessment Parameters"); + } + $r->print(''); # my @temp_psprt; # foreach my $t (@psprt) { @@ -1048,39 +1093,55 @@ sub assessparms { my $csuname=$ENV{'user.name'}; my $csudom=$ENV{'user.domain'}; - if ($parmlev eq 'full' || $parmlev eq 'brief') { - my $coursespan=$csec?8:5; $r->print('

'); $r->print(''); - $r->print(''); + $r->print(''); if ($uname) { $r->print(""); + $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom"); } + 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 - - - + + + + ENDTABLETWO if ($csec) { - $r->print(""); + $r->print(""); } $r->print(< - - - + + + + ENDTABLEHEADFOUR if ($csec) { - $r->print(''); + $r->print(''); } if ($uname) { - $r->print(''); + $r->print(''); } $r->print(''); @@ -1093,8 +1154,10 @@ ENDTABLEHEADFOUR my $rid=$_; my ($inmapid)=($rid=~/\.(\d+)$/); - if (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid}) || - ($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"'; @@ -1131,15 +1194,17 @@ ENDTABLEHEADFOUR my $totalparms=scalar keys %name; if ($totalparms>0) { my $firstrow=1; - + my $title=$bighash{'title_'.$rid}; + $title=~s/\:/:/g; $r->print(''); + } + } + + $r->print(&tableend().'

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

'); +} ################################################## ################################################## @@ -1583,28 +1890,49 @@ sub handler { my $r=shift; if ($r->header_only) { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); - $r->content_type('text/html'); - $r->send_http_header; +# ----------------------------------------------------------- Clear out garbage + + %courseopt=(); + %useropt=(); + %parmhash=(); + + @ids=(); + %symbp=(); + %mapp=(); + %typep=(); + %keyp=(); + + %maptitles=(); # ----------------------------------------------------- Needs to be in a course if (($ENV{'request.course.id'}) && - (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) { + (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}) || + &Apache::lonnet::allowed('opa',$ENV{'request.course.id'}.'/'. + $ENV{'request.course.sec'}) + )) { + + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; $coursename=$ENV{'course.'.$ENV{'request.course.id'}.'.description'}; - unless (($ENV{'form.crsenv'}) || (!$ENV{'request.course.fn'})) { -# --------------------------------------------------------- Bring up assessment - &assessparms($r); + if (($ENV{'form.crsenv'}) || (!$ENV{'request.course.fn'})) { # ---------------------------------------------- This is for course environment - } else { +# -------------------------- also call if toplevel map coudl not be initialized &crsenv($r); + } elsif ($ENV{'form.overview'}) { +# --------------------------------------------------------------- Overview mode + &overview($r); + } else { +# --------------------------------------------------------- Bring up assessment + &assessparms($r); } } else { # ----------------------------- Not in a course, or not allowed to modify parms
Any User'.&mt('Any User').'"); - $r->print("User $uname at Domain $udomCurrent Session Value
($csuname at $csudom)
Resource Levelin Course$lt{'pie'}$lt{'csv'}
($csuname $lt{'at'} $csudom)
$lt{'rl'}$lt{'ic'}in Section/Group $csec". + &mt("in Section/Group")." $csec
Assessment URL and TitleTypeEnclosing Map or FolderPart No.Parameter Namedefaultfrom Enclosing Map or Foldergeneralfor Enclosing Map or Folderfor Resource
$lt{'aut'}$lt{'type'}$lt{'emof'}$lt{'part'}$lt{'pn'}$lt{'def'}$lt{'femof'}$lt{'gen'}$lt{'foremf'}$lt{'fr'}generalfor Enclosing Map or Folderfor Resource'.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').'generalfor Enclosing Map or Folderfor Resource'.&mt('general').''.&mt('for Enclosing Map or Folder').''.&mt('for Resource').'
'. join(' / ',split(/\//,$uri)). '

'. - "$bighash{'title_'.$rid}"); + " TARGET=_self>$title"); if ($thistitle) { $r->print(' ('.$thistitle.')'); @@ -1241,12 +1306,12 @@ ENDTABLEHEADFOUR } # end loop through ids #---------------------------------------------------- print header information - my $foldermap=($maptitle=~/^uploaded/?'Folder':'Map'); + my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map'); my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':''); $r->print(<

-Set Defaults for All Resources in $foldermap
-$showtitle
+Set Defaults for All Resources in $foldermap
+$showtitle
Specifically for ENDMAPONE if ($uname) { @@ -1254,20 +1319,22 @@ ENDMAPONE ('firstname','middlename','lastname','generation', 'id')); my $person=$name{'firstname'}.' '.$name{'middlename'}.' ' .$name{'lastname'}.' '.$name{'generation'}; - $r->print("User $uname \($person\) in \n"); + $r->print(&mt("User")." $uname \($person\) ". + &mt('in')." \n"); } else { - $r->print("all users in \n"); + $r->print("".&mt('all').' '.&mt('users in')." \n"); } - if ($csec) {$r->print("Section $csec of \n")}; + if ($csec) {$r->print(&mt("Section")." $csec ". + &mt('of')." \n")}; - $r->print("$coursename
"); - $r->print("

\n"); + $r->print("$coursename
"); + $r->print("\n"); #---------------------------------------------------------------- print table $r->print('

'); - $r->print(''); - $r->print(''); - $r->print(''); + $r->print(''); + $r->print(''); + $r->print(''); foreach (sort keys %name) { &print_row($r,$_,\%part,\%name,$mapid,\%default, @@ -1323,28 +1390,28 @@ ENDMAPONE } # end loop through ids #---------------------------------------------------- print header information + my $setdef=&mt("Set Defaults for All Resources in Course"); $r->print(<

-Set Defaults for All Resources in Course -$coursename
+

$setdef +$coursename
ENDMAPONE if ($uname) { my %name=&Apache::lonnet::userenvironment($udom,$uname, ('firstname','middlename','lastname','generation', 'id')); my $person=$name{'firstname'}.' '.$name{'middlename'}.' ' .$name{'lastname'}.' '.$name{'generation'}; - $r->print(" User $uname \($person\) \n"); + $r->print(" ".&mt("User")." $uname \($person\) \n"); } else { - $r->print("ALL USERS \n"); + $r->print(" ".&mt("ALL")." ".&mt("USERS")." \n"); } - if ($csec) {$r->print("Section $csec\n")}; - $r->print("

\n"); + if ($csec) {$r->print(&mt("Section")." $csec\n")}; + $r->print("

\n"); #---------------------------------------------------------------- print table $r->print('

Parameter NameDefault ValueParameter in Effect
'.&mt('Parameter Name').''.&mt('Default Value').''.&mt('Parameter in Effect').'
'); - $r->print(''); - $r->print(''); - $r->print(''); + $r->print(''); + $r->print(''); + $r->print(''); foreach (sort keys %name) { &print_row($r,$_,\%part,\%name,$mapid,\%default, @@ -1367,7 +1434,7 @@ ENDMAPONE =item crsenv -Show course data and parameters. This is a large routine that should +Show and set course data and parameters. This is a large routine that should be simplified and shortened... someday. Inputs: $r @@ -1385,167 +1452,261 @@ sub crsenv { 'Set Course Environment Parameters'); my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; -# -------------------------------------------------- Go through list of changes + + # + # Go through list of changes foreach (keys %ENV) { - 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.='Backing up previous URL: '. - &Apache::lonnet::put - ('environment', - {'top level map backup '.$bkuptime => $tmp[1] }, - $dom,$crs). - '
'; + 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'); } - 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 default assessment spreadsheets - } + } + # + # Deal with the enrollment dates + if ($name =~ /^default_enrollment_(start|end)_date$/) { + $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value'); + } + # + # Let the user know we made the changes + if ($name && defined($value)) { + my $put_result = &Apache::lonnet::put('environment', + {$name=>$value},$dom,$crs); + if ($put_result eq 'ok') { + $setoutput.=&mt('Set').' '.$name.' '.&mt('to').' '.$value.'.
'; + } else { + $setoutput.=&mt('Unable to set').' '.$name.' '.&mt('to'). + ' '.$value.' '.&mt('due to').' '.$put_result.'.
'; } - - if ($name) { - $setoutput.='Setting '.$name.' to '. - $value.': '. - &Apache::lonnet::put - ('environment',{$name=>$value},$dom,$crs). - '
'; - } } } +# ------------------------- Re-init course environment entries for this session + + &Apache::lonnet::coursedescription($ENV{'request.course.id'}); + # -------------------------------------------------------- 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=''; if (! exists($values{'con_lost'})) { my %descriptions= - ('url' => 'Top Level Map '. + ('url' => ''.&mt('Top Level Map').' '. '". - 'Browse
'. - 'Modification may make assessment data '. - 'inaccessible', - 'description' => 'Course Description', - 'courseid' => 'Course ID or number
'. - '(internal, optional)', - 'default_xml_style' => 'Default XML Style File '. + &mt('Select Map').'
'. + &mt('Modification may make assessment data inaccessible'). + '', + 'description' => ''.&mt('Course Description').'', + 'courseid' => ''.&mt('Course ID or number'). + '
'. + '('.&mt('internal').', '.&mt('optional').')', + 'grading' => ''.&mt('Grading').'
'. + '"standard", "external", or "spreadsheet" '.&Apache::loncommon::help_open_topic('GradingOptions'), + 'default_xml_style' => ''.&mt('Default XML Style File').' '. 'Browse
", - 'question.email' => 'Feedback Addresses for Resource Content '. - 'Questions
(user:domain,'. + ",'sty')\">$SelectStyleFile
", + 'question.email' => ''.&mt('Feedback Addresses for Resource Content Question'). + '
(user:domain,'. 'user:domain(section;section;...;*;...),...)', - 'comment.email' => 'Feedback Addresses for Course Content Comments
'. + 'comment.email' => ''.&mt('Feedback Addresses for Course Content Comments').'
'. '(user:domain,user:domain(section;section;...;*;...),...)', - 'policy.email' => 'Feedback Addresses for Course Policy'. + 'policy.email' => ''.&mt('Feedback Addresses for Course Policy').''. '
(user:domain,user:domain(section;section;...;*;...),...)', - 'hideemptyrows' => 'Hide Empty Rows in Spreadsheets
'. - '("yes" for default hiding)', - 'pageseparators' => 'Visibly Separate Items on Pages
'. - '("yes" for visible separation, '. - 'changes will not show until next login)', - 'pch.roles.denied'=> 'Disallow Resource Discussion for '. - 'Roles
"st": '. + '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').')', + + 'plc.roles.denied'=> ''.&mt('Disallow live chatroom use for Roles'). + '
"st": '. + &mt('student').', "ta": '. + 'TA, "in": '. + &mt('instructor').';
'.&mt('role,role,...').') '. + Apache::loncommon::help_open_topic("Course_Disable_Discussion"), + 'plc.users.denied' => + ''.&mt('Disallow live chatroom use for Users').'
'. + '(user:domain,user:domain,...)', + + 'pch.roles.denied'=> ''.&mt('Disallow Resource Discussion for Roles'). + '
"st": '. 'student, "ta": '. 'TA, "in": '. 'instructor;
role,role,...) '. Apache::loncommon::help_open_topic("Course_Disable_Discussion"), 'pch.users.denied' => - 'Disallow Resource Discussion for Users
'. + ''.&mt('Disallow Resource Discussion for Users').'
'. '(user:domain,user:domain,...)', 'spreadsheet_default_classcalc' - => 'Default Course Spreadsheet '. + => ''.&mt('Default Course Spreadsheet').' '. 'Browse
", + ",'spreadsheet')\">$SelectSpreadsheetFile
", 'spreadsheet_default_studentcalc' - => 'Default Student Spreadsheet '. + => ''.&mt('Default Student Spreadsheet').' '. 'Browse
", + ",'spreadsheet')\">$SelectSpreadsheetFile
", 'spreadsheet_default_assesscalc' - => 'Default Assessment Spreadsheet '. + => ''.&mt('Default Assessment Spreadsheet').' '. 'Browse
", + ",'spreadsheet')\">$SelectSpreadsheetFile
", 'allow_limited_html_in_feedback' - => 'Allow limited HTML in discussion posts
'. - '(Set value to yes to allow)', + => ''.&mt('Allow limited HTML in discussion posts').'
'. + '('.&mt('Set value to "[_1]" to allow',"yes").')', 'rndseed' - => 'Randomization algorithm used
'. - 'Modifying this will make problems '. - 'have different numbers and answers', + => ''.&mt('Randomization algorithm used').'
'. + ''.&mt('Modifying this will make problems').' '. + &mt('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('yes if supress').')', 'problem_stream_switch' - => 'Allow problems to be splitted over pages
'. - ' (yes if allow anything else if not)' - ); - foreach (keys(%values)) { - unless ($descriptions{$_}) { - $descriptions{$_}=$_; - } + => ''.&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])', + 'anonymous_quiz' + => ''.&mt('Anonymous quiz/exam').'
'. + ' ('.&mt('yes').' '.&mt('to avoid print students names').' )', + 'default_enrollment_start_date' => ''.&mt('Default beginning date when enrolling students').'', + 'default_enrollment_end_date' => ''.&mt('Default ending date when enrolling students').'', + 'nothideprivileged' => ''.&mt('Privileged users that should not be hidden on staff listings').''. + '
(user:domain,user:domain,...)', + 'languages' => ''.&mt('Languages used').'', + 'disable_receipt_display' + => ''.&mt('Disable display of problem receipts').'
'. + ' ('.&mt('"[_1]" to disable, anything else if not','yes').')', + 'disablesigfigs' + => ''.&mt('Disable checking of Significant Figures').'
'. + ' ('.&mt('"[_1]" to disable, anything else if not','yes').')', + 'tthoptions' + => ''.&mt('Default set of options to pass to tth/m when converting tex').'' + ); + my @Display_Order = ('url','description','courseid','grading', + 'default_xml_style','pageseparators', + 'question.email','comment.email','policy.email', + 'plc.roles.denied','plc.users.denied', + 'pch.roles.denied','pch.users.denied', + 'allow_limited_html_in_feedback', + 'languages', + 'nothideprivileged', + 'rndseed', + 'receiptalg', + 'problem_stream_switch', + 'suppress_tries', + 'default_paper_size', + 'disable_receipt_display', + 'spreadsheet_default_classcalc', + 'spreadsheet_default_studentcalc', + 'spreadsheet_default_assesscalc', + 'hideemptyrows', + 'default_enrollment_start_date', + 'default_enrollment_end_date', + 'tthoptions', + 'disablesigfigs' + ); + foreach my $parameter (sort(keys(%values))) { + unless ($parameter =~ m/^internal\./) { + if (! $descriptions{$parameter}) { + $descriptions{$parameter}=$parameter; + push(@Display_Order,$parameter); + } + } } - foreach (sort keys %descriptions) { + 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[\''.$_.'_setparmval\']'. + "['envform'].elements['".$parameter."_setparmval']". '.checked=true;"'; - $output.='
'. - ''. - ''. - ''."\n"; + $output .= ''; + if ($parameter =~ /^default_enrollment_(start|end)_date$/) { + $output .= ''; + } else { + $output .= ''; + } + $output .= ''; + $output .= "\n"; } my $onchange = 'onFocus="javascript:window.document.forms'. '[\'envform\'].elements[\'newp_setparmval\']'. '.checked=true;"'; - $output.=''; } + my %lt=&Apache::lonlocal::texthash( + 'par' => 'Parameter', + 'val' => 'Value', + 'set' => 'Set', + 'sce' => 'Set Course Environment' + ); + + my $Parameter=&mt('Parameter'); + my $Value=&mt('Value'); + my $Set=&mt('Set'); + my $browse_js=&Apache::loncommon::browser_and_searcher_javascript(); $r->print(< LON-CAPA Course Environment @@ -1555,15 +1716,161 @@ $bodytag $setoutput

Parameter NameDefault ValueParameter in Effect
'.&mt('Parameter Name').''.&mt('Default Value').''.&mt('Parameter in Effect').'
'.$descriptions{$_}.'
'.$description.''. + &Apache::lonhtmlcommon::date_setter('envform', + $parameter.'_value', + $values{$parameter}, + $onchange). + ''. + &Apache::lonhtmlcommon::textbox($parameter.'_value', + $values{$parameter}, + 40,$onchange).''. + &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval'). + '
Create New Environment Variable
'. + $output.='
'.&mt('Create New Environment Variable').'
'. '
'. ''. '
- + $output
ParameterValueSet?
$lt{'par'}$lt{'val'}$lt{'set'}?
- + ENDENV } +################################################## + +my $tableopen; + +sub tablestart { + if ($tableopen) { + return ''; + } else { + $tableopen=1; + return ''; + } +} + +sub tableend { + if ($tableopen) { + $tableopen=0; + return '
'.&mt('Parameter').''. + &mt('Delete').''.&mt('Set to ...').'
'; + } else { + return''; + } +} + +sub overview { + my $r=shift; + my $bodytag=&Apache::loncommon::bodytag( + 'Set/Modify Course Assessment Parameters'); + my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + $r->print(< + +LON-CAPA Course Environment + +$bodytag +

+ +ENDOVER +# Setting + my %olddata=&Apache::lonnet::dump('resourcedata',$dom,$crs); + my %newdata=(); + undef %newdata; + my @deldata=(); + undef @deldata; + foreach (keys %ENV) { + if ($_=~/^form\.([a-z]+)\_(.+)$/) { + my $cmd=$1; + my $thiskey=$2; + if ($cmd eq 'set') { + my $data=$ENV{$_}; + if ($olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; } + } elsif ($cmd eq 'del') { + push (@deldata,$thiskey); + } elsif ($cmd eq 'datepointer') { + my $data=&Apache::lonhtmlcommon::get_date_from_form($ENV{$_}); + if (defined($data) and $olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; } + } + } + } +# Store + my $delentries=$#deldata+1; + my @newdatakeys=keys %newdata; + my $putentries=$#newdatakeys+1; + if ($delentries) { + if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') { + $r->print('

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

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

'. + &mt('Error deleting parameters').'

'); + } + } + if ($putentries) { + if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') { + $r->print('

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

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

'. + &mt('Error storing parameters').'

'); + } + } +# Read and display + my %resourcedata=&Apache::lonnet::dump('resourcedata',$dom,$crs); + my $oldsection=''; + my $oldrealm=''; + my $oldpart=''; + my $pointer=0; + $tableopen=0; + my $foundkeys=0; + foreach my $thiskey (sort keys %resourcedata) { + if ($resourcedata{$thiskey.'.type'}) { + my ($course,$middle,$part,$name)= + ($thiskey=~/^(\w+)\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); + my $section=&mt('All Students'); + if ($middle=~/^\[(.*)\]\./) { + $section=&mt('Group/Section').': '.$1; + $middle=~s/^\[(.*)\]\.//; + } + $middle=~s/\.$//; + my $realm=''.&mt('All Resources').''; + if ($middle=~/^(.+)\_\_\_\(all\)$/) { + $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).''; + } elsif ($middle) { + $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).''; + } + 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().'
'.$name. + ':'); + $foundkeys++; + if ($resourcedata{$thiskey.'.type'}=~/^date/) { + my $jskey='key_'.$pointer; + $pointer++; + $r->print( + &Apache::lonhtmlcommon::date_setter('overviewform', + $jskey, + $resourcedata{$thiskey}). +'' + ); + } else { + $r->print( + ''); + } + $r->print('