[LON-CAPA-cvs] cvs: loncom /homework structuretags.pm /interface lonpdfupload.pm

raeburn raeburn at source.lon-capa.org
Fri Apr 3 14:09:24 EDT 2026


raeburn		Fri Apr  3 18:09:24 2026 EDT

  Modified files:              
    /loncom/interface	lonpdfupload.pm 
    /loncom/homework	structuretags.pm 
  Log:
  - Bug 6121. PDF Forms supported for questiontype set to "practice", albeit
    with no "permanent" recording of submissions.
  
  
-------------- next part --------------
Index: loncom/interface/lonpdfupload.pm
diff -u loncom/interface/lonpdfupload.pm:1.40 loncom/interface/lonpdfupload.pm:1.41
--- loncom/interface/lonpdfupload.pm:1.40	Fri Apr  3 17:35:03 2026
+++ loncom/interface/lonpdfupload.pm	Fri Apr  3 18:09:23 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # PDF Form Upload Handler
 #
-# $Id: lonpdfupload.pm,v 1.40 2026/04/03 17:35:03 raeburn Exp $
+# $Id: lonpdfupload.pm,v 1.41 2026/04/03 18:09:23 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -397,7 +397,8 @@
     my ($error, at pdfdata) = @_;
     my ($result,$meta,%grades,%problems,%foreigncourse,%mismatchuser,
         %types,%checkboxoff,%checkboxon,%checkboxtotal,%checkboxinfo,
-        %essaydraft,%symb_to_res,%possfields,%orderedsymb,$navmap,$count,$debug);
+        %essaydraft,%symb_to_res,%possfields,%orderedsymb,%practiceseed,
+        $navmap,$count,$debug);
 
     $navmap = Apache::lonnavmaps::navmap->new();
     if (!defined($navmap)) {
@@ -503,6 +504,8 @@
                             } elsif (($type eq 'essay') && ($HWVAL =~ /^HWDRAFT(.+)$/)) {
                                 $essaydraft{$symb.$part}{'HWVAL'.$1} = $value;
                                 next;
+                            } elsif ($HWVAL eq 'HWRNDSEED') {
+                                $practiceseed{$symb} = $value;
                             }
                             my $submit = $part;
                             $submit =~ s/part_(.*)/submit_$1/;
@@ -633,6 +636,12 @@
             if ($res->is_exam()) {
                 $ungradeable{$symb}{$part} = &mt('Question type set to "exam".');
             } else {
+                if ($res->is_practice($part)) {
+                    unless (exists($practiceseed{$symb})) {
+                        $ungradeable{$symb}{$part} = &mt('Question type set to "practice".');
+                        next;
+                    }
+                }
                 my ($status,$datemsg) = &Apache::lonhomework::check_slot_access($part,'problem',$symb);
                 if ($status eq 'CAN_ANSWER') {
                     %{$gradeable{$symb}{$part}} = %problem;
@@ -658,11 +667,13 @@
     }
     if (keys(%gradeable)) {
         $result .= '<h3 class="LC_heading_3">'.&mt('Saved').'</h3>'.
-                   &show_results('graded',$showparts{'graded'},\%symb_to_res,\%gradeable,\%orderedsymb);
+                   &show_results('graded',$showparts{'graded'},\%symb_to_res,
+                                 \%gradeable,\%orderedsymb,\%practiceseed);
     }
     if (keys(%ungradeable)) {
         $result .= '<h3 class="LC_heading_3">'.&mt('Not Saved').'</h3>'.
-                   &show_results('ungraded',$showparts{'ungraded'},\%symb_to_res,\%ungradeable,\%orderedsymb);
+                   &show_results('ungraded',$showparts{'ungraded'},\%symb_to_res,
+                                 \%ungradeable,\%orderedsymb);
     }
     if (keys(%foreigncourse)) {
         my ($numother,$othercrsmsg);
@@ -704,9 +715,12 @@
 }
 
 sub show_results {
-    my ($category,$showparts,$symb_to_res,$cathashref,$orderref) = @_;
+    my ($category,$showparts,$symb_to_res,$cathashref,$orderref,$practiceseedref) = @_;
     return unless ((ref($symb_to_res)) && (ref($cathashref) eq 'HASH') &&
                    (ref($orderref) eq 'HASH'));
+    if ($category eq 'graded') {
+        return unless (ref($practiceseedref) eq 'HASH');
+    }
     my %colheaders;
     if ($category eq 'graded') {
         %colheaders =
@@ -756,13 +770,18 @@
                    $title.'</a></td>';
         my $count = 1;
         foreach my $part (sort(keys(%{$cathashref->{$symb}}))) {
-            my $message;
+            my ($message,$practice);
             if ($category eq 'graded') {
                 my $problemstatus;
                 if (ref($res) eq 'Apache::lonnavmaps::resource') {
                     $problemstatus = $res->problemstatus($part);
+                    $practice = $res->is_practice($part);
+                    if (($practice) && (exists($practiceseedref->{$symb}))) {
+                        $cathashref->{$symb}{$part}{'rndseed'} = $practiceseedref->{$symb};
+                    }
                 }
-                $message = &grade_problem($symb,$part,$problemstatus,$cathashref->{$symb}{$part});
+                $message = &grade_problem($symb,$part,$problemstatus,$practice,
+                                          $cathashref->{$symb}{$part});
             } else {
                 $message = $cathashref->{$symb}{$part};
             }
@@ -787,11 +806,17 @@
 }
 
 sub grade_problem {
-    my ($symb,$part,$problemstatus,$to_grade) = @_;
+    my ($symb,$part,$problemstatus,$practice,$to_grade) = @_;
     return unless (ref($to_grade) eq 'HASH');
     my %problem = %{$to_grade};
     &Apache::loncommon::ssi_with_retries(&Apache::lonnet::clutter($problem{'resource'}), 5,%problem);
-    my %record = &Apache::lonnet::restore($symb);
+    my %record;
+    if ($practice) {
+        $env{'request.state'} = "published";
+        %record = &Apache::lonnet::tmprestore($symb);
+    } else {
+        %record = &Apache::lonnet::restore($symb);
+    }
     my $award = $record{"resource.$part.award"};
     my $awarded = $record{"resource.$part.awarded"};
     my $solved = $record{"resource.$part.solved"};
Index: loncom/homework/structuretags.pm
diff -u loncom/homework/structuretags.pm:1.598 loncom/homework/structuretags.pm:1.599
--- loncom/homework/structuretags.pm:1.598	Mon Mar 23 00:04:02 2026
+++ loncom/homework/structuretags.pm	Fri Apr  3 18:09:24 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: structuretags.pm,v 1.598 2026/03/23 00:04:02 raeburn Exp $
+# $Id: structuretags.pm,v 1.599 2026/04/03 18:09:24 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1970,6 +1970,7 @@
     my $accessmsg;
     my $resource_due;
     my $ipused;
+    my $practice_rndseed;
 
     my $name= &get_resource_name($parstack,$safeeval);
     my ($result,$form_tag_start,$slot_name,$slot,$probpartlist,$firstaccres);
@@ -2051,6 +2052,7 @@
 	if ($env{'request.state'} ne "construct" && 
 	    ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
             my $rndseedval = $rndseed;
+            $practice_rndseed = $rndseed;
             if (($symb eq '') && ($Apache::lonhomework::type eq 'randomizetry')) {
                 $rndseedval = $env{'form.rndseed'};
             }
@@ -2181,7 +2183,26 @@
 	} elsif ($target eq 'tex') {
 	    $result .= 'INSERTTEXFRONTMATTERHERE';
 	    $result .= &select_metadata_hyphenation();
-	}
+            if (($Apache::lonhomework::type eq 'practice') &&
+                ($status eq 'CAN_ANSWER') &&
+                ($env{'form.pdfFormFields'} eq 'yes')) {
+                my ($uname,$udom,$digest) = &Apache::lonxml::get_user_digest();
+                if (($env{'request.symb'}) && ($env{'request.course.id'})) {
+                    my %uuids = &Apache::lonnet::get('nohist_formfields',
+                                                     [$env{'request.course.id'}.':'.$env{'request.symb'}],
+                                                      $udom,$uname);
+                    if ((exists($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) &&
+                        ($uuids{$env{'request.course.id'}.':'.$env{'request.symb'}})) {
+                        my $fieldname = 'uuid\_'.$uuids{$env{'request.course.id'}.':'.$env{'request.symb'}}
+                                       .'&user\_'. $digest;
+                        my $escpart = $Apache::inputtags::part;
+                        $escpart =~ s{_}{\\_}g;
+                        $fieldname .= '\&part\_'.$escpart.'\&text\&HWRNDSEED';
+                        $result .= &Apache::lonxml::print_pdf_hidden_textfield($fieldname,$practice_rndseed);
+                    }
+                }
+            }
+        }
     } elsif ($target eq 'edit') {
 	$result .= $form_tag_start.&problem_edit_header();
 	$Apache::lonxml::warnings_error_header=


More information about the LON-CAPA-cvs mailing list