--- loncom/homework/radiobuttonresponse.pm 2008/09/05 12:50:45 1.135 +++ loncom/homework/radiobuttonresponse.pm 2010/12/19 04:24:29 1.147 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # mutliple choice style responses # -# $Id: radiobuttonresponse.pm,v 1.135 2008/09/05 12:50:45 onken Exp $ +# $Id: radiobuttonresponse.pm,v 1.147 2010/12/19 04:24:29 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,6 +25,8 @@ # http://www.lon-capa.org/ # + + package Apache::radiobuttonresponse; use strict; use HTML::Entities(); @@ -65,19 +67,21 @@ sub start_radiobuttonresponse { if ($target eq 'meta') { $result=&Apache::response::meta_package_write('radiobuttonresponse'); } elsif ($target eq 'edit' ) { - $result.=&Apache::edit::start_table($token). - ''.&Apache::lonxml::description($token). - &Apache::loncommon::help_open_topic('Radio_Response_Problems'). - "Delete:". - &Apache::edit::deletelist($target,$token) - ." ".&Apache::edit::end_row() - .&Apache::edit::start_spanning_row(); + $result.=&Apache::edit::start_table($token) + .''.&Apache::lonxml::description($token) + .&Apache::loncommon::help_open_topic('Radio_Response_Problems') + .'' + .''.&mt('Delete?').' ' + .&Apache::edit::deletelist($target,$token) + .'' + .' '.&Apache::edit::end_row() + .&Apache::edit::start_spanning_row(); $result.= &Apache::edit::text_arg('Max Number Of Shown Foils:','max', - $token,'4'). - &Apache::edit::select_arg('Randomize Foil Order','randomize', - ['yes','no'],$token). - &Apache::edit::select_arg('Display Direction','direction', + $token,'4').' 'x 3 . + &Apache::edit::select_arg('Randomize Foil Order:','randomize', + ['yes','no'],$token).' 'x 3 . + &Apache::edit::select_arg('Display Direction:','direction', ['vertical','horizontal'],$token). &Apache::edit::end_row(). &Apache::edit::start_spanning_row()."\n"; @@ -100,9 +104,8 @@ sub start_radiobuttonresponse { } else { $result .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}'; } - if($env{'form.pdfFormFields'} eq 'yes') { - $result .= &Apache::lonxml::print_pdf_hiddenfield('meta', $env{'user.name'}, $env{'user.domain'}); - $result .= "\n\\\\\n\\\\\n"; + if($env{'form.pdfFormFields'} eq 'yes' && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') { + $result .= '\begin{itemize}'; } else { $result .= '\begin{enumerate}'; } @@ -118,8 +121,12 @@ sub end_radiobuttonresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; if ($target eq 'edit') { $result=&Apache::edit::end_table(); } - if ($target eq 'tex' and $env{'form.pdfFormFields'} ne 'yes') { - $result .= '\end{enumerate}'; + if ($target eq 'tex' ) { + if($env{'form.pdfFormFields'} eq 'yes' and $Apache::inputtags::status[-1] eq 'CAN_ANSWER') { + $result .= '\end{itemize}'; + } else { + $result .= '\end{enumerate}'; + } } &Apache::response::end_response; pop @Apache::lonxml::namespace; @@ -134,7 +141,7 @@ sub start_foilgroup { my $result; %Apache::response::foilgroup=(); $Apache::radiobuttonresponse::conceptgroup=0; - &Apache::response::pushrandomnumber(); + &Apache::response::pushrandomnumber(undef,$target); if ($target eq 'tex' && $Apache::lonhomework::type eq 'exam') { $result.='\item[\textbf{'.$Apache::lonxml::counter.'}.]'; } @@ -142,6 +149,7 @@ sub start_foilgroup { } sub storesurvey { + my ($style) = @_; if ( !&Apache::response::submitted() ) { return ''; } my $response = $env{'form.HWVAL_'.$Apache::inputtags::response['-1']}; &Apache::lonxml::debug("Here I am!:$response:"); @@ -155,7 +163,16 @@ sub storesurvey { $Apache::lonhomework::results{"resource.$part.$id.submission"}= $responsestr; my %previous=&Apache::response::check_for_previous($responsestr,$part,$id); - my $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED'; + my $ad; + if ($style eq 'anonsurvey') { + $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS'; + } elsif ($style eq 'anonsurveycred') { + $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS_CREDIT'; + } elsif ($style eq 'surveycred') { + $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED_CREDIT'; + } else { + $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED'; + } &Apache::response::handle_previous(\%previous,$ad); &Apache::lonxml::debug("submitted a $response
\n"); return ''; @@ -220,13 +237,15 @@ sub end_foilgroup { my $style = $Apache::lonhomework::type; my $direction = &Apache::lonxml::get_param('direction',$parstack, $safeeval,'-2'); - if ( $style eq 'survey' && $target ne 'analyze') { + if ( (($style eq 'survey') || ($style eq 'surveycred') || + ($style eq 'anonsurvey') || ($style eq 'anonsurveycred')) + && ($target ne 'analyze')) { if ($target eq 'web' || $target eq 'tex') { $result=&displayallfoils($direction, $target); } elsif ( $target eq 'answer' ) { $result=&displayallanswers(); } elsif ( $target eq 'grade' ) { - $result=&storesurvey(); + $result=&storesurvey($style); } $answer_count = scalar(@{$Apache::response::foilgroup{'names'}}); @@ -317,11 +336,25 @@ sub displayallfoils { my $i =0; my $id=$Apache::inputtags::response['-1']; my $part=$Apache::inputtags::part; - my $lastresponse= - $Apache::lonhomework::history{"resource.$part.$id.submission"}; + my $lastresponse; + my ($lastresponse,$newvariation,$showanswer); + if ((($Apache::lonhomework::history{"resource.$part.type"} eq 'randomizetry') || + ($Apache::lonhomework::type eq 'randomizetry')) && + ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) { + if ($env{'form.'.$part.'.rndseed'} ne + $Apache::lonhomework::history{"resource.$part.rndseed"}) { + $newvariation = 1; + } + } + $showanswer = &Apache::response::show_answer(); + unless ((($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurvey') || ($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurveycred')) && (defined($env{'form.grade_symb'})) || + ($newvariation && !$showanswer)) { + $lastresponse = + $Apache::lonhomework::history{"resource.$part.$id.submission"}; + } if ($direction eq 'horizontal') { $result.=''; } my %lastresponse=&Apache::lonnet::str2hash($lastresponse); - if (&Apache::response::show_answer() ) { + if ($showanswer) { foreach my $name (@names) { if ($Apache::response::foilgroup{$name.'.value'} ne 'unused') { if (($direction eq 'horizontal') && ($target ne 'tex')) { @@ -354,16 +387,11 @@ sub displayallfoils { $result.="
"; } else { if ($target eq 'tex') { - if($env{'form.pdfFormFields'} eq 'yes') { - my $fieldname = $env{'request.symb'}. - '&part_'. $Apache::inputtags::part. - '&radiobuttonresponse'. - '&HWVAL_' . $Apache::inputtags::response['-1']; - my $value = $temp; - my $text = $Apache::response::foilgroup{$name.'.text'}; - $result .= &Apache::lonxml::print_pdf_radiobutton($fieldname, - $value, - $text)."\n"; + if($env{'form.pdfFormFields'} eq 'yes' && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') { + my $fieldname = $env{'request.symb'}.'&part_'. $Apache::inputtags::part + .'&radiobuttonresponse'.'&HWVAL_'.$Apache::inputtags::response['-1']; + $result .= '\item[{'.&Apache::lonxml::print_pdf_radiobutton($fieldname,$temp).'}]' + .$Apache::response::foilgroup{$name.'.text'}."\n"; } else { $result .= '\item \vskip -2mm '; } @@ -372,7 +400,7 @@ sub displayallfoils { } } if ($target eq 'tex') { - if($env{'form.pdfFormFields'} ne 'yes') { + if($env{'form.pdfFormFields'} ne 'yes' or $Apache::inputtags::status[-1] ne 'CAN_ANSWER') { $result .= '$\bigcirc$'.$Apache::response::foilgroup{$name.'.text'}.'\\\\'; #' stupid emacs } $i++; @@ -382,8 +410,9 @@ sub displayallfoils { onchange=\"javascript:setSubmittedPart('$part');\" type=\"radio\" name=\"HWVAL_$Apache::inputtags::response['-1']\" - value=\"$temp\" "; - if (defined($lastresponse{$name})) { $result .= 'checked="on"'; } + value=\"$temp\""; + + if (defined($lastresponse{$name})) { $result .= ' checked="checked"'; } $result .= ' />'.$Apache::response::foilgroup{$name.'.text'}. ''; } @@ -401,33 +430,6 @@ sub displayallfoils { return $result; } -=pod - -=item &whichfoils($max,$randomize) - -Randomizes the list of foils. -Respects - - each foils desire to be randomized - - the existance of Concept groups of foils (select 1 foil from each) - - and selects a single correct statement from all possilble true statments - - and limits it to a toal of $max foils - -WARNING: this routine uses the random number generator, it should only -be called once per target, otherwise it can cause randomness changes in -homework problems. - -Arguments - $max - maximum number of foils to select (including the true one) - (so a max of 5 is: 1 true, 4 false) - - $randomize - whether to randomize the listing of foils, by default - will randomize, only if randomize is 'no' will it not - -Returns - $answer - location in the array of the correct answer - @foils - array of foil names in to display order - -=cut sub whichfoils { my ($max,$randomize)=@_; @@ -462,7 +464,11 @@ sub whichfoils { &Apache::lonxml::error(&HTML::Entities::encode("No valid value assigned ($Apache::response::foilgroup{$name.'.value'}) for foil $name in ",'<>&"')); } } - if (!$havetrue && $Apache::lonhomework::type ne 'survey') { + if ((!$havetrue) && + ($Apache::lonhomework::type ne 'survey') && + ($Apache::lonhomework::type ne 'surveycred') && + ($Apache::lonhomework::type ne 'anonsurvey') && + ($Apache::lonhomework::type ne 'anonsurveycred')) { &Apache::lonxml::error(&mt('There are no true statements available.').'
'); } } else { @@ -522,7 +528,11 @@ sub whichfoils { &Apache::lonxml::debug("Answer wants $answer"); my $truename=$truelist[$whichtrue]; my $dosplice=1; - if ($notrue && $Apache::lonhomework::type ne 'survey') { + if (($notrue) && + ($Apache::lonhomework::type ne 'survey') && + ($Apache::lonhomework::type ne 'surveycred') && + ($Apache::lonhomework::type ne 'anonsurvey') && + ($Apache::lonhomework::type ne 'anonsurveycred')) { $dosplice=0; &Apache::lonxml::error(&mt('There are no true statements available.').'
'); } @@ -619,7 +629,18 @@ sub displayfoils { my $temp=0; my $id=$Apache::inputtags::response['-1']; my $part=$Apache::inputtags::part; - my $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"}; + my ($lastresponse,$newvariation); + if ((($Apache::lonhomework::history{"resource.$part.type"} eq 'randomizetry') || + ($Apache::lonhomework::type eq 'randomizetry')) && + ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) { + if ($env{'form.'.$part.'.rndseed'} ne + $Apache::lonhomework::history{"resource.$part.rndseed"}) { + $newvariation = 1; + } + } + unless ($newvariation) { + $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"}; + } my %lastresponse=&Apache::lonnet::str2hash($lastresponse); if ($target ne 'tex' && $direction eq 'horizontal') { $result.=""; @@ -638,8 +659,8 @@ sub displayfoils { ""; } else { if ($Apache::lonhomework::type eq 'exam') { @@ -653,18 +674,14 @@ sub displayfoils { $i++; $bubble_number++; } else { - if($env{'form.pdfFormFields'} eq 'yes') { - - my $fieldname = $env{'request.symb'}. - '&part_'. $Apache::inputtags::part. - '&radiobuttonresponse'. - '&HWVAL_' . $Apache::inputtags::response['-1']; - my $value = $temp; - my $text = $Apache::response::foilgroup{$name.'.text'}; - $result .= &Apache::lonxml::print_pdf_radiobutton($fieldname, $value, $text).'\newline'."\n"; - } else { - $result .= '\vspace*{-2 mm}\item '.$Apache::response::foilgroup{$name.'.text'}; - } + if($env{'form.pdfFormFields'} eq 'yes' && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') { + my $fieldname = $env{'request.symb'}.'&part_'. $Apache::inputtags::part + .'&radiobuttonresponse'.'&HWVAL_'.$Apache::inputtags::response['-1']; + $result .= '\item[{'.&Apache::lonxml::print_pdf_radiobutton($fieldname,$temp).'}]' + .$Apache::response::foilgroup{$name.'.text'}."\n"; + } else { + $result .= '\vspace*{-2 mm}\item '.$Apache::response::foilgroup{$name.'.text'}; + } } } if ($target ne 'tex' && $direction eq 'horizontal') { @@ -831,4 +848,87 @@ sub insert_foil { } 1; __END__ + + + +=head1 NAME + +Apache::radiobuttonresponse + +=head1 SYNOPSIS + +Handles multiple-choice style responses. + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over + +=item start_radiobuttonresponse() + +=item bubble_line_count() + +=item end_radiobuttonresponse() + +=item start_foilgroup() + +=item storesurvey() + +=item grade_response() + +=item end_foilgroup() + +=item getfoilcounts() + +=item format_prior_answer() + +=item displayallfoils() + +=item &whichfoils($max,$randomize) + +Randomizes the list of foils. +Respects + - each foils desire to be randomized + - the existance of Concept groups of foils (select 1 foil from each) + - and selects a single correct statement from all possilble true statments + - and limits it to a toal of $max foils + +WARNING: this routine uses the random number generator, it should only +be called once per target, otherwise it can cause randomness changes in +homework problems. + +Arguments + $max - maximum number of foils to select (including the true one) + (so a max of 5 is: 1 true, 4 false) + + $randomize - whether to randomize the listing of foils, by default + will randomize, only if randomize is 'no' will it not + +Returns + $answer - location in the array of the correct answer + @foils - array of foil names in to display order + +=item displayfoils() + +=item displayallanswers() + +=item displayanswers() + +=item start_conceptgroup() + +=item end_conceptgroup() + +=item insert_conceptgroup() + +=item start_foil() + +=item end_foil() + +=item insert_foil() + +=back + +=cut