[LON-CAPA-cvs] cvs: loncom /interface/statistics lonproblemanalysis.pm lonstathelpers.pm lonsubmissiontimeanalysis.pm

matthew lon-capa-cvs@mail.lon-capa.org
Tue, 20 Jan 2004 15:51:06 -0000


This is a MIME encoded message

--matthew1074613866
Content-Type: text/plain

matthew		Tue Jan 20 10:51:06 2004 EDT

  Modified files:              
    /loncom/interface/statistics	lonproblemanalysis.pm 
                                	lonstathelpers.pm 
                                	lonsubmissiontimeanalysis.pm 
  Log:
  Moved &ProblemSelector from lonproblemanalysis and lonsubmissiontimeanalysis
  to lonstathelpers.pm.  Reworked &ProblemSelector to work with either problem
  parts or responses.  Added previous and next buttons to submission time 
  analysis page.
  
  
--matthew1074613866
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20040120105106.txt"

Index: loncom/interface/statistics/lonproblemanalysis.pm
diff -u loncom/interface/statistics/lonproblemanalysis.pm:1.60 loncom/interface/statistics/lonproblemanalysis.pm:1.61
--- loncom/interface/statistics/lonproblemanalysis.pm:1.60	Mon Jan 19 16:31:08 2004
+++ loncom/interface/statistics/lonproblemanalysis.pm	Tue Jan 20 10:51:06 2004
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonproblemanalysis.pm,v 1.60 2004/01/19 21:31:08 matthew Exp $
+# $Id: lonproblemanalysis.pm,v 1.61 2004/01/20 15:51:06 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -115,9 +115,14 @@
         $r->rflush();
         #
         # Determine which problem we are to analyze
-        my $current_problem = &get_target_from_id($ENV{'form.problemchoice'});
+        my $current_problem = &Apache::lonstathelpers::get_target_from_id
+            ($ENV{'form.problemchoice'});
         #
-        my ($prev,$curr,$next) = &get_prev_curr_next($current_problem);
+        my ($prev,$curr,$next) = 
+            &Apache::lonstathelpers::get_prev_curr_next($current_problem,
+                                                     '(option|radiobutton)',
+                                                     'response',
+                                                        );
         if (exists($ENV{'form.PrevProblemAnalysis'}) && defined($prev)) {
             $current_problem = $prev;
         } elsif (exists($ENV{'form.NextProblemAnalysis'}) && defined($next)) {
@@ -127,7 +132,8 @@
         }
         #
         # Store the current problem choice and send it out in the form
-        $ENV{'form.problemchoice'} = &make_target_id($current_problem);
+        $ENV{'form.problemchoice'} = 
+            &Apache::lonstathelpers::make_target_id($current_problem);
         $r->print('<input type="hidden" name="problemchoice" value="'.
                   $ENV{'form.problemchoice'}.'" />');
         #
@@ -161,7 +167,8 @@
                   &mt('Analyze Problem').'" />');
         $r->print('&nbsp;'x5);
         $r->print('<h3>'.&mt('Please select a problem to analyze').'</h3>');
-        $r->print(&ProblemSelector());
+        $r->print(&Apache::lonstathelpers::ProblemSelector
+                  ('(option|radiobutton)'));
     }
 }
 
@@ -1475,180 +1482,6 @@
     $Str .= '</tr>'."\n";
     $Str .= '</table>'."\n";
     return $Str;
-}
-
-sub ProblemSelector {
-    my $Str;
-    $Str = "\n<table>\n";
-    foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
-        next if ($seq->{'num_assess'}<1);
-        my $seq_str = '';
-        foreach my $res (@{$seq->{'contents'}}) {
-            next if ($res->{'type'} ne 'assessment');
-            foreach my $part (@{$res->{'parts'}}) {
-                my $partdata = $res->{'partdata'}->{$part};
-#                &Apache::lonnet::logthis('----------------');
-#                while (my ($k,$v)=each(%$partdata)) {
-#                    if (ref($v) eq 'ARRAY') {
-#                        &Apache::lonnet::logthis($k.' = '.join(',',@$v));
-#                    } else {
-#                        &Apache::lonnet::logthis($k.' = '.$v);
-#                    }
-#                }
-                if ((! exists($partdata->{'option'}) || 
-                     $partdata->{'option'} == 0      ) &&
-                    (! exists($partdata->{'radiobutton'}) ||
-                     $partdata->{'radiobutton'} == 0)) {
-                    next;
-                }
-                for (my $i=0;$i<scalar(@{$partdata->{'ResponseTypes'}});$i++){
-                    my $respid = $partdata->{'ResponseIds'}->[$i];
-                    my $resptype = $partdata->{'ResponseTypes'}->[$i];
-#                    if ($resptype eq 'option' ){
-                    if ($resptype eq 'option' || $resptype eq 'radiobutton') {
-                        my $value = &make_target_id({symb=>$res->{'symb'},
-                                                     part=>$part,
-                                                     respid=>$respid,
-                                                     resptype=>$resptype});
-                        my $checked = '';
-                        if ($ENV{'form.problemchoice'} eq $value) {
-                            $checked = 'checked ';
-                        }
-                        my $title = $res->{'title'};
-                        if (! defined($title) || $title eq '') {
-                            ($title) = ($res->{'src'} =~ m:/([^/]*)$:);
-                        }
-                        $seq_str .= '<tr><td>'.
-  '<input type="radio" name="problemchoice" value="'.$value.'" '.$checked.'/>'.
-  '</td><td>'.          
-  $resptype.'</td><td>'.
-  '<a href="'.$res->{'src'}.'">'.$title.'</a> ';
-#  '<a href="'.$res->{'src'}.'">'.$resptype.' '.$res->{'title'}.'</a> ';
-                        if ($partdata->{'option'} > 1) {
-                            $seq_str .= &mt('response').' '.$respid;
-                        }
-                        $seq_str .= "</td></tr>\n";
-                    }
-                }
-            }
-        }
-        if ($seq_str ne '') {
-            $Str .= '<tr><td>&nbsp</td><td colspan="2"><b>'.$seq->{'title'}.'</b></td>'.
-                "</tr>\n".$seq_str;
-        }
-    }
-    $Str .= "</table>\n";
-    return $Str;
-}
-
-#########################################################
-#########################################################
-##
-##              Misc functions
-##
-#########################################################
-#########################################################
-sub get_problem_symb {
-    my $problemstring = shift();
-    my ($symb,$partid,$respid,$resptype) = split(':',$problemstring);
-    return ({ symb   => $symb,
-              part   => $partid,
-              respid => $respid,
-              type   => $resptype } );
-}
-
-sub get_resource_from_symb {
-    my ($symb) = @_;
-    foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
-        foreach my $res (@{$seq->{'contents'}}) {
-            if ($res->{'symb'} eq $symb) {
-                return $res;
-            }
-        }
-    }
-    return undef;
-}
-
-sub get_prev_curr_next {
-    my ($target) = @_;
-    #
-    # Build an array with the data we need to search through
-    my @Resource;
-    foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
-        foreach my $res (@{$seq->{'contents'}}) {
-            next if ($res->{'type'} ne 'assessment');
-            foreach my $part (@{$res->{'parts'}}) {
-                my $partdata = $res->{'partdata'}->{$part};
-                for (my $i=0;$i<scalar(@{$partdata->{'ResponseTypes'}});$i++){
-                    my $respid = $partdata->{'ResponseIds'}->[$i];
-                    my $resptype = $partdata->{'ResponseTypes'}->[$i];
-                    next if ($resptype ne 'option' && 
-                             $resptype ne 'radiobutton');
-                    push (@Resource,
-                            { symb     => $res->{symb},
-                              part     => $part,
-                              respid   => $partdata->{'ResponseIds'}->[$i],
-                              resource => $res,
-                              resptype => $resptype
-                            } );
-                }
-            }
-        }
-    }
-    #
-    #
-    # Get the index of the current situation
-    my $curr_idx;
-    for ($curr_idx=0;$curr_idx<$#Resource;$curr_idx++) {
-        my $curr_item = $Resource[$curr_idx];
-        last if ($curr_item->{'symb'} eq $target->{'symb'} &&
-                 $curr_item->{'part'} eq $target->{'part'} &&
-                 $curr_item->{'respid'} eq $target->{'respid'} &&
-                 $curr_item->{'resptype'} eq $target->{'resptype'});
-    }
-    my $curr_item = $Resource[$curr_idx];
-    if ($curr_item->{'symb'}     ne $target->{'symb'} ||
-        $curr_item->{'part'}     ne $target->{'part'} ||
-        $curr_item->{'respid'}   ne $target->{'respid'} ||
-        $curr_item->{'resptype'} ne $target->{'resptype'}){
-        # bogus symb - return nothing
-        return (undef,undef,undef);
-    }
-    #
-    # Now just pick up the data we need
-    my ($prev,$curr,$next);
-    if ($curr_idx == 0) {
-        $prev = undef;
-        $curr = $Resource[$curr_idx  ];
-        $next = $Resource[$curr_idx+1];
-    } elsif ($curr_idx == $#Resource) {
-        $prev = $Resource[$curr_idx-1];
-        $curr = $Resource[$curr_idx  ];
-        $next = undef;
-    } else {
-        $prev = $Resource[$curr_idx-1];
-        $curr = $Resource[$curr_idx  ];
-        $next = $Resource[$curr_idx+1];
-    }
-    return ($prev,$curr,$next);
-}
-
-sub make_target_id {
-    my ($target) = @_;
-    my $id = &Apache::lonnet::escape($target->{'symb'}).':'.
-             &Apache::lonnet::escape($target->{'part'}).':'.
-             &Apache::lonnet::escape($target->{'respid'}).':'.
-             &Apache::lonnet::escape($target->{'resptype'});
-    return $id;
-}
-
-sub get_target_from_id {
-    my ($id) = @_;
-    my ($symb,$part,$respid,$resptype) = split(':',$id);
-    return ({ symb    =>&Apache::lonnet::unescape($symb),
-             part     =>&Apache::lonnet::unescape($part),
-             respid   =>&Apache::lonnet::unescape($respid),
-             resptype =>&Apache::lonnet::unescape($resptype)});
 }
 
 #########################################################
Index: loncom/interface/statistics/lonstathelpers.pm
diff -u loncom/interface/statistics/lonstathelpers.pm:1.1 loncom/interface/statistics/lonstathelpers.pm:1.2
--- loncom/interface/statistics/lonstathelpers.pm:1.1	Mon Jan 19 16:29:46 2004
+++ loncom/interface/statistics/lonstathelpers.pm	Tue Jan 20 10:51:06 2004
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstathelpers.pm,v 1.1 2004/01/19 21:29:46 matthew Exp $
+# $Id: lonstathelpers.pm,v 1.2 2004/01/20 15:51:06 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -93,6 +93,267 @@
         $rendered_problem.
         '</td></tr></table>';
 }
+
+####################################################
+####################################################
+
+=pod
+
+=item &ProblemSelector($AcceptedResponseTypes)
+
+Input: scalar containing regular expression which matches response
+types to show.  '.' will yield all, '(option|radiobutton)' will match
+all option response and radiobutton problems.
+
+Returns: A string containing html for a table which lists the sequences
+and their contents.  A radiobutton is provided for each problem.
+
+=cut
+
+####################################################
+####################################################
+sub ProblemSelector {
+    my ($AcceptedResponseTypes) = @_;
+    my $Str;
+    $Str = "\n<table>\n";
+    foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
+        next if ($seq->{'num_assess'}<1);
+        my $seq_str = '';
+        foreach my $res (@{$seq->{'contents'}}) {
+            next if ($res->{'type'} ne 'assessment');
+            foreach my $part (@{$res->{'parts'}}) {
+                my $partdata = $res->{'partdata'}->{$part};
+                if ((! exists($partdata->{'option'}) || 
+                     $partdata->{'option'} == 0      ) &&
+                    (! exists($partdata->{'radiobutton'}) ||
+                     $partdata->{'radiobutton'} == 0)) {
+                    next;
+                }
+                for (my $i=0;$i<scalar(@{$partdata->{'ResponseTypes'}});$i++){
+                    my $respid = $partdata->{'ResponseIds'}->[$i];
+                    my $resptype = $partdata->{'ResponseTypes'}->[$i];
+                    if ($resptype =~ m/$AcceptedResponseTypes/) {
+                        my $value = &make_target_id({symb=>$res->{'symb'},
+                                                     part=>$part,
+                                                     respid=>$respid,
+                                                     resptype=>$resptype});
+                        my $checked = '';
+                        if ($ENV{'form.problemchoice'} eq $value) {
+                            $checked = 'checked ';
+                        }
+                        my $title = $res->{'title'};
+                        if (! defined($title) || $title eq '') {
+                            ($title) = ($res->{'src'} =~ m:/([^/]*)$:);
+                        }
+                        $seq_str .= '<tr><td>'.
+  '<input type="radio" name="problemchoice" value="'.$value.'" '.$checked.'/>'.
+  '</td><td>'.          
+  $resptype.'</td><td>'.
+  '<a href="'.$res->{'src'}.'">'.$title.'</a> ';
+#  '<a href="'.$res->{'src'}.'">'.$resptype.' '.$res->{'title'}.'</a> ';
+                        if ($partdata->{'option'} > 1) {
+                            $seq_str .= &mt('response').' '.$respid;
+                        }
+                        $seq_str .= "</td></tr>\n";
+                    }
+                }
+            }
+        }
+        if ($seq_str ne '') {
+            $Str .= '<tr><td>&nbsp</td><td colspan="2"><b>'.$seq->{'title'}.'</b></td>'.
+                "</tr>\n".$seq_str;
+        }
+    }
+    $Str .= "</table>\n";
+    return $Str;
+}
+
+####################################################
+####################################################
+
+=pod
+
+=item &make_target_id($target)
+
+Inputs: Hash ref with the following entries:
+    $target->{'symb'}, $target->{'part'}, $target->{'respid'}, 
+    $target->{'resptype'}.
+
+Returns: A string, suitable for a form parameter, which uniquely identifies
+the problem, part, and response to do statistical analysis on.
+
+Used by Apache::lonstathelpers::ProblemSelector().
+
+=cut
+
+####################################################
+####################################################
+sub make_target_id {
+    my ($target) = @_;
+    my $id = &Apache::lonnet::escape($target->{'symb'}).':'.
+             &Apache::lonnet::escape($target->{'part'}).':'.
+             &Apache::lonnet::escape($target->{'respid'}).':'.
+             &Apache::lonnet::escape($target->{'resptype'});
+    return $id;
+}
+
+####################################################
+####################################################
+
+=pod
+
+=item &get_target_from_id($id)
+
+Inputs: $id, a scalar string from Apache::lonstathelpers::make_target_id().
+
+Returns: A hash reference, $target, containing the following keys:
+    $target->{'symb'}, $target->{'part'}, $target->{'respid'}, 
+    $target->{'resptype'}.
+
+=cut
+
+####################################################
+####################################################
+sub get_target_from_id {
+    my ($id) = @_;
+    my ($symb,$part,$respid,$resptype) = split(':',$id);
+    return ({ symb    =>&Apache::lonnet::unescape($symb),
+             part     =>&Apache::lonnet::unescape($part),
+             respid   =>&Apache::lonnet::unescape($respid),
+             resptype =>&Apache::lonnet::unescape($resptype)});
+}
+
+####################################################
+####################################################
+
+=pod
+
+=item &get_prev_curr_next($target)
+
+Determine the problem parts or responses preceeding and following the
+current resource.
+
+Inputs: $target (see &Apache::lonstathelpers::get_target_from_id())
+  $AcceptableResponseTypes, regular expression matching acceptable
+                            response types,
+  $granularity, either 'part' or 'response'
+
+Returns: three hash references, $prev, $curr, $next, which refer to the
+preceeding, current, or following problem parts or responses, depending
+on the value of $granularity.  Values of undef indicate there is no
+previous or next part/response.  A value of undef for all three indicates
+there was no match found to the current part/resource.
+
+The hash references contain the following keys:
+    symb, part, resource
+
+If $granularity eq 'response', the following ADDITIONAL keys will be present:
+    respid, resptype
+
+=cut
+
+####################################################
+####################################################
+sub get_prev_curr_next {
+    my ($target,$AcceptableResponseTypes,$granularity) = @_;
+    #
+    # Build an array with the data we need to search through
+    my @Resource;
+    foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
+        foreach my $res (@{$seq->{'contents'}}) {
+            next if ($res->{'type'} ne 'assessment');
+            foreach my $part (@{$res->{'parts'}}) {
+                my $partdata = $res->{'partdata'}->{$part};
+                if ($granularity eq 'part') {
+                    push (@Resource,
+                          { symb     => $res->{symb},
+                            part     => $part,
+                            resource => $res,
+                        } );
+                } elsif ($granularity eq 'response') {
+                    for (my $i=0;
+                         $i<scalar(@{$partdata->{'ResponseTypes'}});
+                         $i++){
+                        my $respid = $partdata->{'ResponseIds'}->[$i];
+                        my $resptype = $partdata->{'ResponseTypes'}->[$i];
+                        next if ($resptype !~ m/$AcceptableResponseTypes/);
+                        push (@Resource,
+                              { symb     => $res->{symb},
+                                part     => $part,
+                                respid   => $partdata->{'ResponseIds'}->[$i],
+                                resource => $res,
+                                resptype => $resptype
+                                } );
+                    }
+                }
+            }
+        }
+    }
+    #
+    # Get the index of the current situation
+    my $curr_idx;
+    for ($curr_idx=0;$curr_idx<$#Resource;$curr_idx++) {
+        my $curr_item = $Resource[$curr_idx];
+        if ($granularity eq 'part') {
+            if ($curr_item->{'symb'} eq $target->{'symb'} &&
+                $curr_item->{'part'} eq $target->{'part'}) {
+                last;
+            }
+        } elsif ($granularity eq 'response') {
+            if ($curr_item->{'symb'} eq $target->{'symb'} &&
+                $curr_item->{'part'} eq $target->{'part'} &&
+                $curr_item->{'respid'} eq $target->{'respid'} &&
+                $curr_item->{'resptype'} eq $target->{'resptype'}) {
+                last;
+            }
+        }
+    }
+    my $curr_item = $Resource[$curr_idx];
+    if ($granularity eq 'part') {
+        if ($curr_item->{'symb'}     ne $target->{'symb'} ||
+            $curr_item->{'part'}     ne $target->{'part'}) {
+            # bogus symb - return nothing
+            return (undef,undef,undef);
+        }
+    } elsif ($granularity eq 'response') {
+        if ($curr_item->{'symb'}     ne $target->{'symb'} ||
+            $curr_item->{'part'}     ne $target->{'part'} ||
+            $curr_item->{'respid'}   ne $target->{'respid'} ||
+            $curr_item->{'resptype'} ne $target->{'resptype'}){
+            # bogus symb - return nothing
+            return (undef,undef,undef);
+        }
+    }
+    #
+    # Now just pick up the data we need
+    my ($prev,$curr,$next);
+    if ($curr_idx == 0) {
+        $prev = undef;
+        $curr = $Resource[$curr_idx  ];
+        $next = $Resource[$curr_idx+1];
+    } elsif ($curr_idx == $#Resource) {
+        $prev = $Resource[$curr_idx-1];
+        $curr = $Resource[$curr_idx  ];
+        $next = undef;
+    } else {
+        $prev = $Resource[$curr_idx-1];
+        $curr = $Resource[$curr_idx  ];
+        $next = $Resource[$curr_idx+1];
+    }
+    return ($prev,$curr,$next);
+}
+
+####################################################
+####################################################
+
+=pod
+
+=back
+
+=cut
+
+####################################################
+####################################################
 
 1;
 
Index: loncom/interface/statistics/lonsubmissiontimeanalysis.pm
diff -u loncom/interface/statistics/lonsubmissiontimeanalysis.pm:1.10 loncom/interface/statistics/lonsubmissiontimeanalysis.pm:1.11
--- loncom/interface/statistics/lonsubmissiontimeanalysis.pm:1.10	Mon Jan 19 16:31:08 2004
+++ loncom/interface/statistics/lonsubmissiontimeanalysis.pm	Tue Jan 20 10:51:06 2004
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonsubmissiontimeanalysis.pm,v 1.10 2004/01/19 21:31:08 matthew Exp $
+# $Id: lonsubmissiontimeanalysis.pm,v 1.11 2004/01/20 15:51:06 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -45,10 +45,14 @@
                   ]; 
 
 my @SubmitButtons = (
-                     { name => 'ProblemAnalyis',
+                     { name => 'PrevProblemAnalysis',
+                       text => 'Previous Problem' },
+                     { name => 'ProblemAnalysis',
                        text => 'Analyze Problem Again' },
+                     { name => 'NextProblemAnalysis',
+                       text => 'Next Problem' },
                      { name => 'SelectAnother',
-                       text => 'Choose a different resource' },
+                       text => 'Choose a different Problem' },
                      );
 
 sub BuildSubmissionTimePage {
@@ -92,23 +96,40 @@
                   &mt('Graph Problem Submission Times').'" />');
         $r->print('&nbsp;'x5);
         $r->print('<h3>'.&mt('Please select a problem to analyze').'</h3>');
-        $r->print(&ProblemSelector());
+        $r->print(&Apache::lonstathelpers::ProblemSelector('.'));
     } else {
         foreach my $button (@SubmitButtons) {
             $r->print('<input type="submit" name="'.$button->{'name'}.'" '.
                       'value="'.&mt($button->{'text'}).'" />');
             $r->print('&nbsp;'x5);
         }
+        #
+        # Determine which problem we are to analyze
+        my $current_problem = &Apache::lonstathelpers::get_target_from_id
+            ($ENV{'form.problemchoice'});
+        #
+        my ($prev,$curr,$next) = 
+            &Apache::lonstathelpers::get_prev_curr_next($current_problem,
+                                                        '.',
+                                                        'part');
+        if (exists($ENV{'form.PrevProblemAnalysis'}) && defined($prev)) {
+            $current_problem = $prev;
+        } elsif (exists($ENV{'form.NextProblemAnalysis'}) && defined($next)) {
+            $current_problem = $next;
+        } else {
+            $current_problem = $curr;
+        }
+        #
+        # Store the current problem choice and send it out in the form
+        $ENV{'form.problemchoice'} = 
+            &Apache::lonstathelpers::make_target_id($current_problem);
         $r->print('<input type="hidden" name="problemchoice" value="'.
                   $ENV{'form.problemchoice'}.'" />');
         #
         $r->print('<hr />');
-        #
-        my ($symb,$part) = &get_problem_symb(
-                  &Apache::lonnet::unescape($ENV{'form.problemchoice'}));
         $r->rflush();
         #
-        my $resource = &get_resource_from_symb($symb);
+        my $resource = $current_problem->{'resource'};
         if (! defined($resource)) {
             $r->print('resource is undefined');
         } else {
@@ -117,7 +138,8 @@
             $r->rflush();
             $r->print(&Apache::lonstathelpers::render_resource($resource));
             $r->rflush();
-            $r->print(&analyze_times($r,$resource,\@Students,$part));
+            $r->print(&analyze_times($r,$resource,\@Students,
+                                     $current_problem->{'part'}));
         }
         $r->print('<hr />');
     }
@@ -343,86 +365,6 @@
     $Str .= '</tr>'."\n";
     $Str .= '</table>'."\n";
     return $Str;
-}
-
-sub ProblemSelector {
-    my $Str;
-    $Str = "<table>\n";
-    foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
-        next if ($seq->{'num_assess'}<1);
-        my $seq_str = '';
-        foreach my $res (@{$seq->{'contents'}}) {
-            next if ($res->{'type'} ne 'assessment');
-            if (@{$res->{'parts'}} == 1) {
-                my $value = &Apache::lonnet::escape($res->{'symb'}.':'.
-                                                    $res->{'parts'}->[0]);
-                my $checked;
-                if ($ENV{'form.problemchoice'} eq $value) {
-                    $checked = 'checked ';
-                }
-                my $title = $res->{'title'};
-                if (! defined($title) || $title eq '') {
-                    ($title) = ($res->{'src'} =~ m:/([^/]*)$:);
-                }
-#                &Apache::lonnet::logthis('title = :'.$title.':');
-                $seq_str .= '<tr><td>'.
-  '<input type="radio" name="problemchoice" value="'.$value.'" '.$checked.'/>'.
-  '</td><td>'.
-  '<a href="'.$res->{'src'}.'">'.$title.'</a> ';
-            } else {
-                my $title = $res->{'title'};
-                if (! defined($title) || $title eq '') {
-                    ($title) = ($res->{'src'} =~ m:/([^/]*)$:);
-                }
-                $seq_str .= '<tr><td>'.
-                    '&nbsp;'.'</td><td>'.
-                    '<a href="'.$res->{'src'}.'">'.$title.'</a>'.
-                    "</td></tr>\n";
-                foreach my $part (@{$res->{'parts'}}) {
-                    my $value = &Apache::lonnet::escape
-                                               ($res->{'symb'}.':'.$part);
-                    my $checked;
-                    if ($ENV{'form.problemchoice'} eq $value) {
-                        $checked = 'checked ';
-                    }
-                    $seq_str .= '<tr><td>'.
-  '<input type="radio" name="problemchoice" value="'.$value.'" '.$checked.'/>'.
-  '</td><td>'.('&nbsp;'x5).'part '.$part."</td></tr>\n";
-                }
-            }
-        }
-        if ($seq_str ne '') {
-            $Str .= '<tr><td>&nbsp</td><td><b>'.$seq->{'title'}.'</b></td>'.
-                "</tr>\n".$seq_str;
-        }
-    }
-    $Str .= "</table>\n";
-    return $Str;
-}
-
-#########################################################
-#########################################################
-##
-##      Misc functions (ought to be put in a module)
-##
-#########################################################
-#########################################################
-sub get_problem_symb {
-    my $problemstring = shift();
-    my ($symb,$partid) = ($problemstring=~ /^(.*):([^:]*)$/);
-    return ($symb,$partid);
-}
-
-sub get_resource_from_symb {
-    my ($symb) = @_;
-    foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
-        foreach my $res (@{$seq->{'contents'}}) {
-            if ($res->{'symb'} eq $symb) {
-                return $res;
-            }
-        }
-    }
-    return undef;
 }
 
 1;

--matthew1074613866--