[LON-CAPA-cvs] cvs: loncom(BZ4492) /homework radiobuttonresponse.pm

foxr foxr at source.lon-capa.org
Mon Jan 30 06:36:55 EST 2012


foxr		Mon Jan 30 11:36:55 2012 EDT

  Modified files:              (Branch: BZ4492)
    /loncom/homework	radiobuttonresponse.pm 
  Log:
  BZ4492
  - Factor out foil filtering in displayallfoils
  - Factor out display_survey_htmlfrom displayallfoils.
  
  
  
-------------- next part --------------
Index: loncom/homework/radiobuttonresponse.pm
diff -u loncom/homework/radiobuttonresponse.pm:1.153.6.7 loncom/homework/radiobuttonresponse.pm:1.153.6.8
--- loncom/homework/radiobuttonresponse.pm:1.153.6.7	Wed Jan 25 12:00:33 2012
+++ loncom/homework/radiobuttonresponse.pm	Mon Jan 30 11:36:55 2012
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # mutliple choice style responses
 #
-# $Id: radiobuttonresponse.pm,v 1.153.6.7 2012/01/25 12:00:33 foxr Exp $
+# $Id: radiobuttonresponse.pm,v 1.153.6.8 2012/01/30 11:36:55 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -375,46 +375,25 @@
 
 }
 
-##
-sub displayallfoils{
-    my ( $direction, $target ) = @_;
-    my $result;
-    &Apache::lonxml::debug("survey style display");
-    my @names;
-    if ( $Apache::response::foilgroup{'names'} ) {
-        @names = @{ $Apache::response::foilgroup{'names'} };
-    }
-
-    # Figure out how to bracket the list of foils for
-    # the TeX target:
-    #
-
-    my $begin_environment;
-    my $end_environment;
-    
-    if ($target eq 'tex') {
-
-	# Decide how to bracket the list of foils:
-
+## 
+# Return the last survey response.  The logic is slightly different than that of 
+# get_last_responses.  TODO: See if there are chunks of code betweenthis and
+# get_last_reponses that are common and can be factored.
+#
+# @param $part - Problem part under consideration.
+# @param $showanswer - True if answers should be shown.
+# @param $id         - Problem id.
+#
+# @return hash reference.
+# @retval reference to the has indexed by answer selection that 
+#         indicates the most recent answer.
+#
+sub get_last_survey_response {
+    my ($part, $showanswer, $id) = @_;
 
-        if (   $env{'form.pdfFormFields'} eq 'yes'
-            && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
-        {
-            $begin_environment = '\begin{itemize}';
-	    $end_environment   = '\end{itemize}';
-        }
-        else {
-            $begin_environment = '\begin{enumerate}';
-	    $end_environment   = '\end{enumerate}';
-        }	
-	$result .= $begin_environment;
-    }
+    my $newvariation;
+    my $lastresponse;		# stringified last response.
 
-    my $temp = 0;
-    my $i    = 0;
-    my $id   = $Apache::inputtags::response['-1'];
-    my $part = $Apache::inputtags::part;
-    my ( $lastresponse, $newvariation, $showanswer );
     if (
         (
             (
@@ -432,7 +411,6 @@
             $newvariation = 1;
         }
     }
-    $showanswer = &Apache::response::show_answer();
     unless (
         (
             (
@@ -449,122 +427,237 @@
         $lastresponse =
           $Apache::lonhomework::history{"resource.$part.$id.submission"};
     }
-    if ( $direction eq 'horizontal' && $target ne 'tex') { 
-	$result .= '<table><tr>'; 
-    }
     my %lastresponse = &Apache::lonnet::str2hash($lastresponse);
+   
+
+    return \%lastresponse;
+
+}
+##
+# Removes the names from a foil group that are marked as unused.
+#
+# @param $names - reference to the array of names to filter.
+#
+# @return arrayref
+# @retval reference to the filtered array.
+#
+sub remove_unused {
+    my ($names) = @_;
+    my @result;
+
+    foreach my $name (@{$names}) {
+	if ($Apache::response::foilgroup{$name . '.value'} ne 'unused') {
+	    push(@result, $name);
+	}
+    }
+    return \@result;
+}
+## 
+# Displays all foils in a survey type problem for HTML rendition.
+# TODO: See if there is any logic in this sub that can be shared
+#      with display_foils_html
+#
+# @param $names        - ref to array of names of the foils to display.
+# @param $part         - Problem part number.
+# @param $showanswer   - If true, show the answers.
+# @param $lastresponse - Ref to the last response hash.
+# @param $direction    - Display direction of the radiobuttons.
+#
+# @return string
+# @retval HTML required to display the resource in a browser.
+#
+sub display_survey_html {
+    my ($names, $part, $showanswer, $lastresponse, $direction) = @_;
+    my $result;
+
+    # Figure out a few fragments of html that depend onthe 
+    # orientation of the radiobuttons:
+    # closing_html - HTML to emit at the end of the resource.
+    # pre_foil     - HTML to emit prior to each foil.
+    # post_foil    - HTML to emit following each foil.
+    #
+    #  The opening HTML is just added to the $result now
+    #
+    #  Figuring these outin advance compresses the loop over foils into something
+    #  pretty simple:
+    #
+    # NOTE: There's probably a really cool way to do this with style sheets
+    #       and picking the selector based on the orientation, if someone wants to puzzle
+    #       that out.  In that case, probably the whole thing lives in a <div> and each
+    #       foil lives in a <p>
+    #
+
+    my $closing_html;
+    my $pre_foil;
+    my $post_foil;
+	
+    if ($direction eq 'horizontal') {
+	$result       .= '<table><tr>';
+	$closing_html = '</tr></table>';
+	$pre_foil     = '<td>';
+	$post_foil    = '</td>';
+    } else {
+	$pre_foil     = '<br />';
+    }
+    # Different rendering depending on whether answers are shown:
+
+
     if ($showanswer) {
-        foreach my $name (@names) {
-            if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
-            {
-                if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
-                    $result .= "<td>";
-                }
-                else {
-                    if ( $target eq 'tex' ) {
-                        $result .= '\item \vskip -2mm ';
-                    }
-                    else {
-                        $result .= "<br />";
-                    }
-                }
-                if ( defined( $lastresponse{$name} ) ) {
-                    if ( $target eq 'tex' ) {
-                        $result .= '}';
-                    }
-                    else {
-                        $result .= '<b>';
-                    }
-                }
-                $result .= $Apache::response::foilgroup{ $name . '.text' };
-                if ( defined( $lastresponse{$name} ) && ( $target ne 'tex' ) ) {
-                    $result .= '</b>';
-                }
-                if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
-                    $result .= "</td>";
-                }
-            }
-        }
+	foreach my $name (@{$names}) {
+
+	    $result .= $pre_foil;
+	    my $foiltext =  $Apache::response::foilgroup{$name . '.text'};
+
+	    # Bold the prior  response:
+
+	    if (defined($lastresponse->{$name})) {
+		$result .= '<b>' . $foiltext . '</b>';
+	    } else {
+		$result .= $foiltext;
+	    }
+
+	    $result .= $post_foil;
+	}
+    } else {
+	my $temp = 0;
+	foreach my $name (@{$names}) {
+	    $result .=  $pre_foil;
+
+	    $result .= &html_radiobutton(
+		$part, $Apache::inputtags::response['-1'], $name, $lastresponse, $temp
+	     );
+
+	    $result .= $post_foil;
+	    $temp++;
+				       
+	}
     }
-    else {
-        foreach my $name (@names) {
-            if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
-            {
-                if ( $direction eq 'horizontal' && $target ne 'tex' ) {
-                    $result .= "<td>";
-                }
-                else {
-                    if ( $target eq 'tex' ) {
-                        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 ';
-                        }
-                    }
-                    else {
-                        $result .= "<br />";
-                    }
-                }
-                if ( $target eq 'tex' ) {
-                    if (   $env{'form.pdfFormFields'} ne 'yes'
-                        or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' )
-                    {
-                        $result .=
-                            '$\bigcirc$'
-                          . $Apache::response::foilgroup{ $name . '.text' }
-                          . '\\\\';    #' stupid emacs
-                    }
-                    $i++;
-                }
-                else {
-                    $result .= '<label>';
-                    $result .= "<input
-                       onchange=\"javascript:setSubmittedPart('$part');\"
-                       type=\"radio\"
-                       name=\"HWVAL_$Apache::inputtags::response['-1']\"
-                       value=\"$temp\"";
-
-                    if ( defined( $lastresponse{$name} ) ) {
-                        $result .= ' checked="checked"';
-                    }
-                    $result .= ' />'
-                      . $Apache::response::foilgroup{ $name . '.text' }
-                      . '</label>';
-                }
-                $temp++;
-                if ( $target ne 'tex' ) {
-                    if (   ( $direction eq 'horizontal' )
-                        && ( $target ne 'tex' ) )
-                    {
-                        $result .= "</td>";
-                    }
-                }
-                else {
-                    $result .= '\vskip 0 mm ';
-                }
-            }
+
+    $result .= $closing_html;
+    return $result;
+
+}
+
+
+##
+#
+#  Displays all the foils of a problem in a format suitable for
+#   surveys, surveys for credit, anonymous surveys and anonymous surveys for credit.
+#
+#  @param $direction - Display direction of the choices ('horiztonal' or not).
+#  @param $target    - Rendering target.
+#
+#  @return string
+#  @retval Text that renders for the selected target.
+# 
+sub displayallfoils{
+    my ( $direction, $target ) = @_;
+    my $result;
+    &Apache::lonxml::debug("survey style display");
+    my @names;
+    if ( $Apache::response::foilgroup{'names'} ) {
+        @names = @{ $Apache::response::foilgroup{'names'} };
+    }
+
+    # Figure out how to bracket the list of foils for
+    # the TeX target:
+    #
+
+    my $begin_environment;
+    my $end_environment;
+    
+    if ($target eq 'tex') {
+
+	# Decide how to bracket the list of foils:
+
+
+        if (   $env{'form.pdfFormFields'} eq 'yes'
+            && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
+        {
+            $begin_environment = '\begin{itemize}';
+	    $end_environment   = '\end{itemize}';
         }
+        else {
+            $begin_environment = '\begin{enumerate}';
+	    $end_environment   = '\end{enumerate}';
+        }	
+	$result .= $begin_environment;
     }
 
-    if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
-        $result .= '</tr></table>';
+    my $temp = 0;
+    my $i    = 0;
+    my $id   = $Apache::inputtags::response['-1'];
+    my $part = $Apache::inputtags::part;
+    my $showanswer;
+    my $lastresponse;
+    $showanswer = &Apache::response::show_answer();
+
+    my $lastresponse = &get_last_survey_response($part, $showanswer, $id);
+
+    my $used_names = &remove_unused(\@names);
+
+
+    if ($target ne 'tex') {
+	$result .= &display_survey_html($used_names, $part, $showanswer, $lastresponse, $direction);
+    } else {
+
+	if ($showanswer) {
+	    foreach my $name (@{$used_names}) {
+		if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
+		{
+		    
+		    $result .= '\item \vskip -2mm ';
+		    
+		    if ( defined( $lastresponse->{$name} ) ) {
+			$result .= '}';
+		    }
+		    $result .= $Apache::response::foilgroup{ $name . '.text' };
+		}
+	    }
+	} else {
+	    foreach my $name (@{$used_names}) {
+		if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
+		{
+		    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 ';
+		    }
+		    
+		    if (   $env{'form.pdfFormFields'} ne 'yes'
+			   or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' )
+		    {
+			$result .=
+			    '$\bigcirc$'
+			    . $Apache::response::foilgroup{ $name . '.text' }
+			. '\\\\';    #' stupid emacs
+		    }
+		    $i++;
+
+		    $temp++;
+		    
+		    $result .= '\vskip 0 mm ';
+		}
+	    }
+	}
     }
 
+
     # Close tex bracketing:
 
     if ($target eq 'tex') {
@@ -887,14 +980,13 @@
 # @param $target     - Rendition target...there are several html targets.
 # @param $direction  - 'horizontal' if layout is horizontal.
 # @param $part       - Part of the problem that's being displayed.
-# @param $solved     - Solution state of the problem.
 # @param $show_answer- True if answers should be shown.
 #
 # @return string
 # @retval generated html.
 #
 sub display_foils_html {
-    my ($whichfoils, $target, $direction, $part, $solved, $show_answer) = @_;
+    my ($whichfoils, $target, $direction, $part, $show_answer) = @_;
     my $result;
 
     # if the answers get shown, we need to label each item as correct or
@@ -1188,7 +1280,7 @@
     {
 
 	$result = &display_foils_html(
-	    $whichfoils, $target, $direction, $part, $solved, 1);
+	    $whichfoils, $target, $direction, $part,  1);
 	
 	# other html
     }  elsif ($target ne 'tex') {


More information about the LON-CAPA-cvs mailing list