--- loncom/interface/lonparmset.pm 2011/01/13 22:49:47 1.507 +++ loncom/interface/lonparmset.pm 2014/06/12 22:29:42 1.545 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.507 2011/01/13 22:49:47 www Exp $ +# $Id: lonparmset.pm,v 1.545 2014/06/12 22:29:42 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -46,8 +46,6 @@ This module sets coursewide and assessme =over -=pod - =item parmval() Figure out a cascading parameter. @@ -137,33 +135,49 @@ 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 + +=over 4 + +=item * B : Current username -Input: See list below: +=item * B : Domain of current user. -=item * B : An array that will contain all of the ids in the course. +=item * B : Course -=item * B : hash, id->type, where "type" contains the extension of the file, thus, I. +=back + +Outputs: See list below: -=item * B : hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id +=over 4 -=item * B : hash, name of parameter->display value (what is the display value?) +=item * B (out) : An array that will contain all of the ids in the course. -=item * B : hash, part identification->text representation of part, where the text representation is "[Part $part]" +=item * B(out) : hash, id->type, where "type" contains the extension of the file, thus, I. -=item * B : hash, full key to part->display value (what's display value?) +=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 : hash, ??? +=item * B (out) : hash, name of parameter->display value (what is the display value?) -=item * B : ??? +=item * B (out) : hash, part identification->text representation of part, where the text representation is "[Part $part]" -=item * B : hash, ??? +=item * B (out) : hash, ??? =item * B : ?? =item * B : hash, id->full sym? +=item * B + +=item * B +=item * B + +=item * B + +=back =item isdateparm() @@ -196,12 +210,14 @@ 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): +=over + =item * B: ParameterS CATegories? ends up a list of the types of parameters that exist, e.g., tol, weight, acc, opendate, duedate, answerdate, sig, maxtries, type. =item * B: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts? @@ -214,6 +230,8 @@ Variables used (guessed by Jeremy): When storing information, store as part 0 When requesting information, request from full part +=back + =item tablestart() =item tableend() @@ -280,7 +298,6 @@ Set portfolio metadata Main handler. Calls &assessparms subroutine. - =back =cut @@ -307,17 +324,21 @@ use LONCAPA qw(:DEFAULT :match); sub startSettingsScreen { - my ($r,$mode)=@_; + my ($r,$mode,$crstype)=@_; + my $tabtext = &mt('Course Settings'); + if ($crstype eq 'Community') { + $tabtext = &mt('Community Settings'); + } $r->print("\n".''."\n"); - $r->print('
'); + $r->print('
'); } sub endSettingsScreen { @@ -653,7 +674,7 @@ sub storeparm_by_symb { } sub log_parmset { - return &Apache::lonnet::instructor_log('parameterlog',@_); + return &Apache::lonnet::write_log('course','parameterlog',@_); } sub storeparm_by_symb_inner { @@ -760,11 +781,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); @@ -805,6 +829,7 @@ sub valout { &date_sanity_info($value); } else { $result = $value; + $result=~s/\,/\, /gs; $result = &HTML::Entities::encode($result,'"<>&'); } } @@ -846,16 +871,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' => "showHide_courseContent(); 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'})) { @@ -907,16 +951,23 @@ sub startpage { 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'); 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'); + &startSettingsScreen($r,'parmset',$crstype); $r->print(< @@ -1068,6 +1119,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])); @@ -1165,6 +1220,7 @@ sub extractResourceInformation { $$typep{$id}=$1; $$keyp{$id}=''; $$uris{$id}=$srcf; + foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) { next if ($key!~/^parameter_/); @@ -1220,7 +1276,7 @@ sub extractResourceInformation { $$mapp{$mapid}=$$mapp{$id}; $$allmaps{$mapid}=$$mapp{$id}; if ($mapid eq '1') { - $$maptitles{$mapid}=&mt('Main Course Documents'); + $$maptitles{$mapid}=&mt('Main Content'); } else { $$maptitles{$mapid}=&Apache::lonnet::gettitle($$mapp{$id}); } @@ -1264,14 +1320,12 @@ sub parmmenu { ele = document.forms.parmform.elements[i]; if (ele.name == checkName) { document.forms.parmform.elements[i].checked=value; - document.getElementById(document.forms.parmform.elements[i].value.concat(li)).style.display = displayOverview; } } } function checkthis(thisvalue, checkName) { - document.getElementById(thisvalue.concat("_li")).style.display = ""; 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('
'); $r->print('
'); &shortCuts($r,$allparms,$pscat,$keyorder); $r->print('
'); - - $r->print( - '

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

' - ); - - $r->print(&Apache::lonhtmlcommon::row_closure(1)); } # return a hash sub categories { @@ -1399,6 +1410,8 @@ sub lookUpTableParameter { 'contentopen' => 'time_settings', 'contentclose' => 'time_settings', 'discussend' => 'time_settings', + 'printstartdate' => 'time_settings', + 'printenddate' => 'time_settings', 'weight' => 'grading', 'handgrade' => 'grading', 'maxtries' => 'tries', @@ -1430,7 +1443,10 @@ sub lookUpTableParameter { 'acc' => 'misc', 'maxcollaborators' => 'misc', 'scoreformat' => 'misc', - + 'lenient' => 'grading', + 'retrypartial' => 'tries', + 'discussvote' => 'misc', + 'examcode' => 'high_level_randomization', ); } @@ -1498,56 +1514,30 @@ sub parmboxes { 'file_submission' => [], 'misc' => [], ); - my $hidelink = - '

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

' - ."\n"; -; + foreach $tempparameter (keys %$allparms) { &whatIsMyCategory($tempparameter, \%categoryList); } #part to print the parm-list - $r->print( - '\n" - ); + $r->print("\n"); } # # This function offers some links on the parameter section to get with one click a group a parameters @@ -1586,8 +1576,12 @@ sub shortCuts { sub partmenu { my ($r,$allparts,$psprt)=@_; + my $selsize = 1+scalar(keys(%{$allparts})); + if ($selsize > 8) { + $selsize = 8; + } - $r->print(''); $r->print(''); @@ -1708,11 +1702,19 @@ function group_or_section(caller) { # This function shows on table Mode the available Parameters for the selected Resources # sub displaymenu { - my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_; + 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::loncommon::end_scrollbox()); + + $r->print(&Apache::lonhtmlcommon::row_closure(1)); + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + } sub mapmenu { @@ -1775,17 +1777,17 @@ sub mapmenu { # Info about selectable folders/maps $r->print( '
' - .&mt('You can only select those maps and folders which can be currently parameterized.') - # .' '.&Apache::loncommon::help_open_topic('...') # Later: Add further help + .&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_data_table()); + $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() + &Apache::loncommon::start_data_table_row(undef,'picklevel') .'' .'
'); @@ -2324,18 +2336,12 @@ COURSECONTENTSCRIPT '
'); $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)'))); $r->print(&Apache::lonhtmlcommon::start_pick_box()); - $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')). - ''); &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups); $r->print(&Apache::lonhtmlcommon::row_closure(1)); $r->print(&Apache::lonhtmlcommon::end_pick_box()); $r->print('

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

'); } @@ -2370,7 +2376,7 @@ COURSECONTENTSCRIPT $coursespan += 3; } - $r->print('

'); + $r->print(&Apache::loncommon::start_data_table()); # # This produces the headers # @@ -2381,7 +2387,7 @@ COURSECONTENTSCRIPT $userspan ++; } $r->print('"); + $r->print(&mt('User [_1] at Domain [_2]',"'".$uname."'","'".$udom."'").''); } my %lt=&Apache::lonlocal::texthash( 'pie' => "Parameter in Effect", @@ -2444,9 +2450,8 @@ ENDTABLEHEADFOUR my $defbgtwo=''; my $defbgthree = ''; - foreach (@ids) { + foreach my $rid (@ids) { - my $rid=$_; my ($inmapid)=($rid=~/\.(\d+)$/); if ((!$pssymb && @@ -2480,7 +2485,6 @@ ENDTABLEHEADFOUR my $uri=&Apache::lonnet::declutter($uris{$rid}); my $filter=$env{'form.filter'}; - foreach (&keysplit($keyp{$rid})) { my $tempkeyp = $_; if (grep $_ eq $tempkeyp, @catmarker) { @@ -2535,8 +2539,8 @@ ENDTABLEHEADFOUR $r->print(''); - foreach (&keysinorder_bytype(\%name,\%keyorder)) { + unless ($firstrow) { $r->print(''); } else { @@ -2551,7 +2555,7 @@ ENDTABLEHEADFOUR } } # end foreach ids # -------------------------------------------------- End entry for one resource - $r->print('
'); - $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom'.$maptitles{$mapp{$rid}}.'
'); + $r->print(&Apache::loncommon::end_data_table); } # end of full #--------------------------------------------------- Entry for parm level map if ($parmlev eq 'map') { @@ -2842,25 +2846,39 @@ sub storedata { $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./; } if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') { - my ($data, $typeof, $text); + 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:type:'.$data}; + $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$data"}; if ($needsrelease) { unless ($got_chostname) { - ($chostname,$cmajor,$cminor)=&questiontype_release_vars(); + ($chostname,$cmajor,$cminor)=¶meter_release_vars(); $got_chostname = 1; } - $needsnewer = &questiontype_releasecheck($data,$needsrelease, - $chostname,$cmajor, - $cminor); + $needsnewer = ¶meter_releasecheck($name,$data, + $needsrelease, + $cmajor,$cminor); } if ($needsnewer) { - $r->print('
'.&oldversion_warning($data,$chostname,$cmajor, + $r->print('
'.&oldversion_warning($name,$data, + $chostname,$cmajor, $cminor,$needsrelease)); next; } @@ -2916,7 +2934,7 @@ sub storedata { 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)); + $r->print('

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

'); } else { $r->print('
'. &mt('Error deleting parameters').'
'); @@ -3095,7 +3113,7 @@ sub listdata { $$resourcedata{$thiskey})); } elsif ($thistype =~ m/^string/) { $r->print(&string_selector($thistype,$thiskey, - $$resourcedata{$thiskey})); + $$resourcedata{$thiskey},$name)); } else { $r->print(&default_selector($thiskey,$$resourcedata{$thiskey})); } @@ -3164,11 +3182,19 @@ my %strings = => [[ 'problem', 'Standard Problem'], [ 'survey', 'Survey'], [ 'anonsurveycred', 'Anonymous Survey (credit for submission)'], - [ 'exam', 'Exam'], + [ '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 { @@ -3180,33 +3206,36 @@ sub standard_string_options { } sub string_selector { - my ($thistype, $thiskey, $showval) = @_; + my ($thistype, $thiskey, $showval, $name) = @_; if (!exists($strings{$thistype})) { return &default_selector($thiskey,$showval); } my %skiptype; - if ($thistype eq 'string_questiontype') { + 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 ($name, $description) = @{ $possibilities }; - my $needsrelease=$Apache::lonnet::needsrelease{'parameter:type:'.$name}; + my ($parmval, $description) = @{ $possibilities }; + my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval"}; if ($needsrelease) { unless ($got_chostname) { - ($chostname,$cmajor,$cminor)=&questiontype_release_vars(); + ($chostname,$cmajor,$cminor)=¶meter_release_vars(); $got_chostname = 1; } - my $needsnewer=&questiontype_releasecheck($name,$needsrelease, - $chostname,$cmajor, - $cminor); + my $needsnewer=¶meter_releasecheck($name,$parmval,$needsrelease, + $cmajor,$cminor); if ($needsnewer) { - $skiptype{$name} = 1; + $skiptype{$parmval} = 1; } } } } + my $result; my $numinrow = 3; @@ -3297,12 +3326,27 @@ sub newoverview { my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview', text=>"Overview Mode"}); - my $start_page = &Apache::loncommon::start_page('Set Parameters'); + + my %loaditems = ( + 'onload' => "showHide_courseContent(); resize_scrollbox('mapmenuscroll','1','1');", + ); + my $js = ' + +'; + my $start_page = &Apache::loncommon::start_page('Set Parameters',$js, + {'add_entries' => \%loaditems,}); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print($start_page.$breadcrumbs); - &startSettingsScreen($r,'parmset'); + &startSettingsScreen($r,'parmset',$crstype); $r->print(< ENDOVER @@ -3331,7 +3375,7 @@ ENDOVER my $pschp=$env{'form.pschp'}; my @psprt=&Apache::loncommon::get_env_multiple('form.psprt'); - if (!@psprt) { $psprt[0]='0'; } + if (!@psprt) { $psprt[0]='all'; } my @selected_sections = &Apache::loncommon::get_env_multiple('form.Section'); @@ -3365,7 +3409,7 @@ ENDOVER $r->print('
'); #$r->print('

Step 1

'); $r->print('
'); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel')); &levelmenu($r,\%alllevs,$parmlev); if ($parmlev ne 'general') { $r->print(&Apache::lonhtmlcommon::row_closure()); @@ -3377,10 +3421,7 @@ ENDOVER $r->print('
'); $r->print('
'); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); - &parmmenu($r,\%allparms,\@pscat,\%keyorder); - $r->print(&Apache::lonhtmlcommon::end_pick_box()); - &parmboxes($r,\%allparms,\@pscat,\%keyorder); + &displaymenu($r,\%allparms,\@pscat,\%keyorder); $r->print(&Apache::lonhtmlcommon::start_pick_box()); $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View'))); $r->print(''. @@ -3474,13 +3515,14 @@ sub overview { my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview', text=>"Overview Mode"}); my $start_page=&Apache::loncommon::start_page('Modify Parameters'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print($start_page.$breadcrumbs); - &startSettingsScreen($r,'parmset'); + &startSettingsScreen($r,'parmset',$crstype); $r->print(''); # Store modified @@ -3501,7 +3543,7 @@ sub overview { my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder); $r->print(&tableend().'

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

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

'. &Apache::loncommon::end_page()); } @@ -3577,8 +3619,9 @@ ENDOVER } elsif ($data{'realm_type'} eq 'symb') { my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'}); - $r->print(&mt('Resource: [_1]
   with ID: [_2]
   in folder [_3]', - $url,$resid,$map)); + $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]', + $url.'
   ', + $resid.'
   ',$map)); } $r->print('
   '.&mt('Part: [_1]',$data{'parameter_part'})); $r->print(''); @@ -3596,14 +3639,15 @@ sub date_shift_one { my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'}, text=>"Shifting Dates"}); my $start_page=&Apache::loncommon::start_page('Shift Dates'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift'); $r->print($start_page.$breadcrumbs); - &startSettingsScreen($r,'parmset'); - $r->print(''. + &startSettingsScreen($r,'parmset',$crstype); + $r->print(''. '
'. ''. @@ -4563,11 +4636,11 @@ sub update_slots { action => 'reserve', context => 'parameter', ); - &Apache::lonnet::instructor_log('slotreservationslog',\%storehash, - '',$uname,$udom,$cnum,$cdom); + &Apache::lonnet::write_log('course','slotreservationslog',\%storehash, + '',$uname,$udom,$cnum,$cdom); - &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash, - '',$uname,$udom,$uname,$udom); + &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash, + '',$uname,$udom,$uname,$udom); } return $success; } @@ -4597,10 +4670,10 @@ sub delete_slots { action => 'release', context => 'parameter', ); - &Apache::lonnet::instructor_log('slotreservationslog',\%storehash, - 1,$uname,$udom,$cnum,$cdom); - &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash, - 1,$uname,$udom,$uname,$udom); + &Apache::lonnet::write_log('course','slotreservationslog',\%storehash, + 1,$uname,$udom,$cnum,$cdom); + &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash, + 1,$uname,$udom,$uname,$udom); } } } @@ -4613,7 +4686,7 @@ sub check_for_course_info { return 0; } -sub questiontype_release_vars { +sub parameter_release_vars { my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $chome = $env{'course.'.$env{'request.course.id'}.'.home'}; my $chostname = &Apache::lonnet::hostname($chome); @@ -4622,35 +4695,47 @@ sub questiontype_release_vars { return ($chostname,$cmajor,$cminor); } -sub questiontype_releasecheck { - my ($questiontype,$needsrelease,$chostname,$cmajor,$cminor) = @_; +sub parameter_releasecheck { + my ($name,$value,$needsrelease,$cmajor,$cminor) = @_; my $needsnewer; my ($needsmajor,$needsminor) = split(/\./,$needsrelease); if (($cmajor < $needsmajor) || ($cmajor == $needsmajor && $cminor < $needsminor)) { $needsnewer = 1; } else { - &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:type:'.$questiontype}); + &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value}); } return $needsnewer; } sub oldversion_warning { - my ($questiontype,$chostname,$cmajor,$cminor,$needsrelease) = @_; + my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_; my $desc; - if (ref($strings{'string_questiontype'}) eq 'ARRAY') { - foreach my $possibilities (@{ $strings{'string_questiontype'} }) { - next unless (ref($possibilities) eq 'ARRAY'); - my ($name, $description) = @{ $possibilities }; - if ($name eq $questiontype) { - $desc = $description; - last; + my %stringtypes = ( + type => 'string_questiontype', + lenient => 'string_lenient', + retrypartial => 'string_yesno', + discussvote => 'string_discussvote', + examcode => 'string_examcode', + ); + if (exists($stringtypes{$name})) { + if ($name eq 'examcode') { + $desc = $value; + } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') { + foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) { + next unless (ref($possibilities) eq 'ARRAY'); + my ($parmval, $description) = @{ $possibilities }; + if ($parmval eq $value) { + $desc = $description; + last; + } } } } + my $standard_name = &standard_parameter_names($name); return '

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

'.&mt('Currently set date:').''. &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'
'.&mt('Shifted date:').''. @@ -3623,18 +3667,25 @@ sub date_shift_two { my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'}, text=>"Shifting Dates"}); my $start_page=&Apache::loncommon::start_page('Shift Dates'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift'); $r->print($start_page.$breadcrumbs); - &startSettingsScreen($r,'parmset'); + &startSettingsScreen($r,'parmset',$crstype); my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted'); - $r->print(&mt('Shifting all dates such that [_1] becomes [_2]', + $r->print('

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

'. + '

'.&mt('Shifting all dates such that [_1] becomes [_2]', &Apache::lonlocal::locallocaltime($env{'form.timebase'}), - &Apache::lonlocal::locallocaltime($timeshifted))); + &Apache::lonlocal::locallocaltime($timeshifted)).'

'); my $delta=$timeshifted-$env{'form.timebase'}; &dateshift($delta); + $r->print( + &Apache::lonhtmlcommon::confirm_success(&mt('Done')). + '

'. + &Apache::lonhtmlcommon::actionbox( + [''.&mt('Content and Problem Settings').''])); &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -3690,7 +3741,10 @@ sub print_main_menu { # $r->print(&header()); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content and Problem Settings')); - &startSettingsScreen($r,'parmset'); + my $crstype = &Apache::loncommon::course_type(); + my $lc_crstype = lc($crstype); + + &startSettingsScreen($r,'parmset',$crstype); $r->print(< @@ -3700,9 +3754,11 @@ ENDMAINFORMHEAD my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}); my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'}); - - my $crstype = &Apache::loncommon::course_type(); - my $lc_crstype = lc($crstype); + my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}); + if ((!$dcm) && ($env{'request.course.sec'} ne '')) { + $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}. + '/'.$env{'request.course.sec'}); + } my @menu = ( { categorytitle=>"Content Settings for this $crstype", @@ -3719,7 +3775,12 @@ ENDMAINFORMHEAD linktitle => "Reset access times for folders/maps, resources or the $lc_crstype." , icon => 'start-here.png' , }, - + { linktext => 'Blocking Communication/Resource Access', + url => '/adm/setblock', + permission => $dcm, + linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam', + icon => 'comblock.png', + }, { linktext => 'Set Parameter Setting Default Actions', url => '/adm/parmset?action=setdefaults', permission => $parm_permission, @@ -3766,7 +3827,9 @@ ENDMAINFORMHEAD }]} ); $r->print(&Apache::lonhtmlcommon::generate_menu(@menu)); + $r->print(''); &endSettingsScreen($r); + $r->print(&Apache::loncommon::end_page()); return; } @@ -3834,6 +3897,7 @@ sub order_meta_fields { my $idx = 1; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};; $r->print(&Apache::loncommon::start_page('Order Metadata Fields')); &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata', text=>"Add Metadata Field"}); @@ -3842,7 +3906,7 @@ sub order_meta_fields { text=>"Restrict Metadata"}, {text=>"Order Metadata"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata')); - &startSettingsScreen($r,'parmset'); + &startSettingsScreen($r,'parmset',$crstype); if ($env{'form.storeorder'}) { my $newpos = $env{'form.newpos'} - 1; my $currentpos = $env{'form.currentpos'} - 1; @@ -3896,7 +3960,7 @@ sub order_meta_fields { foreach my $key (@fields_in_order) { $r->print('
'); $r->print('
'); - $r->print(''); for (my $i = 1;$i le $num_fields;$i ++) { if ($i eq $idx) { $r->print(''); @@ -3932,9 +3996,10 @@ sub addmetafield { text=>"Add Metadata Field"}); $r->print(&Apache::loncommon::start_page('Add Metadata Field')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field')); - &startSettingsScreen($r,'parmset'); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; + &startSettingsScreen($r,'parmset',$crstype); if (exists($env{'form.undelete'})) { my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield'); foreach my $meta_field(@meta_fields) { @@ -3989,9 +4054,10 @@ sub setrestrictmeta { text=>"Restrict Metadata"}); $r->print(&Apache::loncommon::start_page('Restrict Metadata')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata')); - &startSettingsScreen($r,'parmset'); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; + &startSettingsScreen($r,'parmset',$crstype); my $key_base = $env{'course.'.$env{'request.course.id'}.'.'}; my $save_field = ''; if ($env{'form.restrictmeta'}) { @@ -4103,15 +4169,16 @@ sub defaultsetter { &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults', text=>"Set Defaults"}); + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; my $start_page = - &Apache::loncommon::start_page('Parameter Setting Default Actions'); + &Apache::loncommon::start_page('Parameter Setting Default Actions'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults'); $r->print($start_page.$breadcrumbs); - &startSettingsScreen($r,'parmset'); + &startSettingsScreen($r,'parmset',$crstype); $r->print(''); - my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; my @ids=(); my %typep=(); my %keyp=(); @@ -4165,8 +4232,8 @@ sub defaultsetter { foreach my $key (keys %allparms) { $newrules{$key.'_triggers'}=$triggers{$key}; } - &Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs); - &Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs); + &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum); + &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum); &resetrulescache(); } my %lt=&Apache::lonlocal::texthash('days' => 'Days', @@ -4343,18 +4410,26 @@ sub standard_parameter_types { sub parm_change_log { my ($r)=@_; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'} &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', text=>"Parameter Change Log"}); - $r->print(&Apache::loncommon::start_page('Parameter Change Log')); + my $js = ''."\n"; + $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js)); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log')); - &startSettingsScreen($r,'parmset'); - my %parmlog=&Apache::lonnet::dump('nohist_parameterlog', - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); + &startSettingsScreen($r,'parmset',$crstype); + my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',$cdom,$cnum); if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); } - $r->print('print('
'. + '
'.&mt('Display of Changes').''. + ''); my %saveable_parameters = ('show' => 'scalar',); @@ -4362,13 +4437,11 @@ sub parm_change_log { \%saveable_parameters); &Apache::loncommon::restore_course_settings('parameter_log', \%saveable_parameters); - $r->print(&Apache::loncommon::display_filter(). - ''. - ''); + $r->print(&Apache::loncommon::display_filter('parmslog').' '."\n". + ''. + '

'); - my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}); + my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row(). '
'.&mt('Time').''.&mt('User').''.&mt('Extent').''.&mt('Users').''. &mt('Parameter').''.&mt('Part').''.&mt('New Value').''.&mt('Announce').'