--- loncom/interface/lonparmset.pm 2011/05/23 09:29:27 1.513 +++ loncom/interface/lonparmset.pm 2012/05/07 23:46:11 1.522.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.513 2011/05/23 09:29:27 foxr Exp $ +# $Id: lonparmset.pm,v 1.522.2.1 2012/05/07 23:46:11 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -314,27 +314,6 @@ use HTML::Entities; use LONCAPA qw(:DEFAULT :match); -sub startSettingsScreen { - my ($r,$mode)=@_; - - $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, @@ -813,6 +792,7 @@ sub valout { &date_sanity_info($value); } else { $result = $value; + $result=~s/\,/\, /gs; $result = &HTML::Entities::encode($result,'"<>&'); } } @@ -854,16 +834,10 @@ sub page_js { return(< // "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')"; + } if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) && (!$env{'form.dis'})) || ($env{'form.symb'})) { @@ -924,7 +901,6 @@ sub startpage { 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'); $r->print(< @@ -1297,8 +1273,9 @@ sub parmmenu { } function checkdisset() { - checkthis('discussend','pscat'); + checkthis('discussend','pscat'); checkthis('discusshide','pscat'); + checkthis('discussvote','pscat'); } function checkcontdates() { @@ -1395,6 +1372,9 @@ sub lookUpTableParameter { 'acc' => 'misc', 'maxcollaborators' => 'misc', 'scoreformat' => 'misc', + 'lenient' => 'grading', + 'retrypartial' => 'tries', + 'discussvote' => 'misc', ); } @@ -1942,10 +1922,11 @@ sub standardkeyorder { 'parameter_0_tol' => 16, 'parameter_0_sig' => 17, 'parameter_0_turnoffunit' => 18, - 'parameter_0_discussend' => 19, - 'parameter_0_discusshide' => 20, - 'parameter_0_printopendate' => 21, - 'parameter_0_printclosedate' => 22); + 'parameter_0_discussend' => 19, + 'parameter_0_discusshide' => 20, + 'parameter_0_discussvote' => 21, + 'parameter_0_printopendate' => 22, + 'parameter_0_printclosedate' => 23); } @@ -2115,7 +2096,7 @@ sub assessparms { for (my $i=0;$i<=$#markers;$i++) { - my ($needsrelease,$needsnewer); + my ($needsrelease,$needsnewer,$name); if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) { my (@ok_slots,@fail_slots,@del_slots); my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom); @@ -2146,22 +2127,23 @@ sub assessparms { } } } - } elsif ($markers[$i] =~ /_type\&\d+$/) { + } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote)\&\d+$/) { + $name = $1; $needsrelease = - $Apache::lonnet::needsrelease{'parameter:type:'.$values[$i]}; + $Apache::lonnet::needsrelease{"parameter:$name:$values[$i]"}; if ($needsrelease) { unless ($got_chostname) { - ($chostname,$cmajor,$cminor) = &questiontype_release_vars(); + ($chostname,$cmajor,$cminor) = ¶meter_release_vars(); $got_chostname = 1; } - $needsnewer = &questiontype_releasecheck($values[$i], - $needsrelease, - $chostname, - $cmajor,$cminor); + $needsnewer = ¶meter_releasecheck($name,$values[$i], + $needsrelease, + $chostname, + $cmajor,$cminor); } } if ($needsnewer) { - $message .= &oldversion_warning($values[$i],$chostname,$cmajor, + $message .= &oldversion_warning($name,$values[$i],$chostname,$cmajor, $cminor,$needsrelease); } else { $message.=&storeparm(split(/\&/,$markers[$i]), @@ -2185,7 +2167,7 @@ sub assessparms { if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);} # ------------------------------------------------------------------ Start page - &startpage($r); + &startpage($r,$pssymb); foreach ('tolerance','date_default','date_start','date_end', 'date_interval','int','float','string') { @@ -2277,6 +2259,7 @@ COURSECONTENTSCRIPT .'' .'

'); } else { + $r->print(); # parameter screen for a single resource. my ($map,$iid,$resource)=&Apache::lonnet::decode_symb($pssymb); my $title = &Apache::lonnet::gettitle($pssymb); @@ -2332,7 +2315,7 @@ COURSECONTENTSCRIPT $coursespan += 3; } - $r->print('

'); + $r->print(&Apache::loncommon::start_data_table()); # # This produces the headers # @@ -2512,7 +2495,7 @@ ENDTABLEHEADFOUR } } # end foreach ids # -------------------------------------------------- End entry for one resource - $r->print('
'); + $r->print(&Apache::loncommon::end_data_table); } # end of full #--------------------------------------------------- Entry for parm level map if ($parmlev eq 'map') { @@ -2729,7 +2712,6 @@ ENDMAPONE } # end of $parmlev eq general } $r->print(''); - &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } # end sub assessparms @@ -2803,25 +2785,38 @@ 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_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, + $chostname,$cmajor, + $cminor); } if ($needsnewer) { - $r->print('
'.&oldversion_warning($data,$chostname,$cmajor, + $r->print('
'.&oldversion_warning($name,$data, + $chostname,$cmajor, $cminor,$needsrelease)); next; } @@ -3056,7 +3051,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})); } @@ -3130,6 +3125,14 @@ my %strings = [ '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 { @@ -3141,33 +3144,37 @@ 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, + $chostname,$cmajor, + $cminor); if ($needsnewer) { - $skiptype{$name} = 1; + $skiptype{$parmval} = 1; } } } } + my $result; my $numinrow = 3; @@ -3263,7 +3270,6 @@ sub newoverview { my $start_page = &Apache::loncommon::start_page('Set Parameters'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print($start_page.$breadcrumbs); - &startSettingsScreen($r,'parmset'); $r->print(< ENDOVER @@ -3389,7 +3395,6 @@ ENDOVER $r->print(&tableend(). ((($env{'form.store'}) || ($env{'form.dis'}))?'

':''). ''); - &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -3438,7 +3443,6 @@ sub overview { my $start_page=&Apache::loncommon::start_page('Modify Parameters'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print($start_page.$breadcrumbs); - &startSettingsScreen($r,'parmset'); $r->print('
'); # Store modified @@ -3546,7 +3550,6 @@ ENDOVER $r->print(&Apache::loncommon::end_data_table().'

'. ''. '

'); - &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -3560,7 +3563,6 @@ sub date_shift_one { 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('
'. ''. @@ -3574,7 +3576,6 @@ ate_setter('shiftform', ''. ''. ''); - &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -3587,14 +3588,12 @@ sub date_shift_two { my $start_page=&Apache::loncommon::start_page('Shift Dates'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift'); $r->print($start_page.$breadcrumbs); - &startSettingsScreen($r,'parmset'); my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted'); $r->print(&mt('Shifting all dates such that [_1] becomes [_2]', &Apache::lonlocal::locallocaltime($env{'form.timebase'}), &Apache::lonlocal::locallocaltime($timeshifted))); my $delta=$timeshifted-$env{'form.timebase'}; &dateshift($delta); - &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -3639,7 +3638,7 @@ sub parse_key { sub header { - return &Apache::loncommon::start_page('Settings'); + return &Apache::loncommon::start_page('Parameter Manager'); } @@ -3648,8 +3647,7 @@ sub print_main_menu { my ($r,$parm_permission)=@_; # $r->print(&header()); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content and Problem Settings')); - &startSettingsScreen($r,'parmset'); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager')); $r->print(< @@ -3659,6 +3657,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 $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 $crstype = &Apache::loncommon::course_type(); my $lc_crstype = lc($crstype); @@ -3678,7 +3681,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, @@ -3725,7 +3733,6 @@ ENDMAINFORMHEAD }]} ); $r->print(&Apache::lonhtmlcommon::generate_menu(@menu)); - &endSettingsScreen($r); return; } @@ -3801,7 +3808,6 @@ sub order_meta_fields { text=>"Restrict Metadata"}, {text=>"Order Metadata"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata')); - &startSettingsScreen($r,'parmset'); if ($env{'form.storeorder'}) { my $newpos = $env{'form.newpos'} - 1; my $currentpos = $env{'form.currentpos'} - 1; @@ -3871,7 +3877,6 @@ sub order_meta_fields { $idx ++; } $r->print('
'.&mt('Currently set date:').''. &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'
'); - &endSettingsScreen($r); return 'ok'; } @@ -3891,7 +3896,6 @@ 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'}; if (exists($env{'form.undelete'})) { @@ -3933,7 +3937,6 @@ sub addmetafield { $r->print(''); } $r->print(''); - &endSettingsScreen($r); } @@ -3948,7 +3951,6 @@ 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 $key_base = $env{'course.'.$env{'request.course.id'}.'.'}; @@ -4021,7 +4023,6 @@ ENDButtons $buttons ENDenv - &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); return 'ok'; } @@ -4066,7 +4067,6 @@ sub defaultsetter { &Apache::loncommon::start_page('Parameter Setting Default Actions'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults'); $r->print($start_page.$breadcrumbs); - &startSettingsScreen($r,'parmset'); $r->print('
'); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -4213,7 +4213,6 @@ ENDYESNO $r->print(&Apache::loncommon::end_data_table(). "\n".'
'."\n"); - &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); return; } @@ -4304,16 +4303,22 @@ sub parm_change_log { my ($r)=@_; &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'}); if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); } - $r->print('
print('
'. + '
'.&mt('Display of Changes').''. + ''); my %saveable_parameters = ('show' => 'scalar',); @@ -4321,10 +4326,9 @@ 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'}); @@ -4474,7 +4478,6 @@ sub parm_change_log { || $shown<=$env{'form.show'})) { last; } } $r->print(&Apache::loncommon::end_data_table()); - &endSettingsScreen($r); $r->print(&Apache::loncommon::end_page()); } @@ -4572,7 +4575,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); @@ -4581,35 +4584,44 @@ sub questiontype_release_vars { return ($chostname,$cmajor,$cminor); } -sub questiontype_releasecheck { - my ($questiontype,$needsrelease,$chostname,$cmajor,$cminor) = @_; +sub parameter_releasecheck { + my ($name,$value,$needsrelease,$chostname,$cmajor,$cminor) = @_; my $needsnewer; my ($needsmajor,$needsminor) = split(/\./,$needsrelease); if (($cmajor < $needsmajor) || ($cmajor == $needsmajor && $cminor < $needsminor)) { $needsnewer = 1; } else { - &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:type:'.$questiontype}); + &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', + ); + if (exists($stringtypes{$name})) { + if (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). @@ -4636,7 +4648,7 @@ sub handler { &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset", - text=>"Content and Problem Settings", + text=>"Parameter Manager", faq=>10, bug=>'Instructor Interface', help =>