--- loncom/interface/statistics/lonstathelpers.pm	2005/02/23 23:51:18	1.39
+++ loncom/interface/statistics/lonstathelpers.pm	2005/03/21 19:47:54	1.45
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstathelpers.pm,v 1.39 2005/02/23 23:51:18 matthew Exp $
+# $Id: lonstathelpers.pm,v 1.45 2005/03/21 19:47:54 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -68,8 +68,7 @@ use Storable qw(freeze thaw);
 
 =item &render_resource($resource)
 
-Input: a resource generated from 
-&Apache::loncoursedata::get_sequence_assessment_data().
+Input: a navmaps resource
 
 Retunrs: a scalar containing html for a rendering of the problem
 within a table.
@@ -82,11 +81,10 @@ sub render_resource {
     my ($resource) = @_;
     ##
     ## Render the problem
-    my $base;
-    ($base,undef) = ($resource->{'src'} =~ m|(.*/)[^/]*$|);
-    $base = "http://".$ENV{'SERVER_NAME'}.$base;
-    my $rendered_problem = 
-        &Apache::lonnet::ssi_body($resource->{'src'}.'?symb='.&Apache::lonnet::escape($resource->{'symb'}));
+    my ($base) = ($resource->src =~ m|^(.*/)[^/]*$|);
+    $base="http://".$ENV{'SERVER_NAME'}.$base;
+    my ($src,$symb)=($resource->src,&Apache::lonnet::escape($resource->symb));
+    my $rendered_problem = &Apache::lonnet::ssi_body($src.'?symb='.$symb);
     $rendered_problem =~ s/<\s*form\s*/<nop /g;
     $rendered_problem =~ s|(<\s*/form\s*>)|<\/nop>|g;
     return '<table bgcolor="ffffff"><tr><td>'.
@@ -100,7 +98,26 @@ sub render_resource {
 
 =pod
 
-=item &ProblemSelector($AcceptedResponseTypes)
+=item &get_resources
+
+=cut
+
+####################################################
+####################################################
+sub get_resources {
+    my ($navmap,$sequence) = @_;
+    my @resources = $navmap->retrieveResources($sequence,
+                                               sub { shift->is_problem(); },
+                                               0,0,0);
+    return @resources;
+}
+
+####################################################
+####################################################
+
+=pod
+
+=item &problem_selector($AcceptedResponseTypes)
 
 Input: scalar containing regular expression which matches response
 types to show.  '.' will yield all, '(option|radiobutton)' will match
@@ -114,23 +131,25 @@ Skips 'survey' problems.
 
 ####################################################
 ####################################################
-sub ProblemSelector {
+sub problem_selector {
     my ($AcceptedResponseTypes) = @_;
     my $Str;
     $Str = "\n<table>\n";
     my $rb_count =0;
-    foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess('all')) {
-        next if ($seq->{'num_assess'}<1);
+    my ($navmap,@sequences) = 
+        &Apache::lonstatistics::selected_sequences_with_assessments('all');
+    return $navmap if (! ref($navmap)); # error
+    foreach my $seq (@sequences) {
         my $seq_str = '';
-        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];
+        foreach my $res (&get_resources($navmap,$seq)) {
+            foreach my $part (@{$res->parts}) {
+                my @response_ids   = $res->responseIds($part);
+                my @response_types = $res->responseType($part);
+                for (my $i=0;$i<scalar(@response_types);$i++){
+                    my $respid = $response_ids[$i];
+                    my $resptype = $response_types[$i];
                     if ($resptype =~ m/$AcceptedResponseTypes/) {
-                        my $value = &make_target_id({symb=>$res->{'symb'},
+                        my $value = &make_target_id({symb=>$res->symb,
                                                      part=>$part,
                                                      respid=>$respid,
                                                      resptype=>$resptype});
@@ -138,19 +157,19 @@ sub ProblemSelector {
                         if ($ENV{'form.problemchoice'} eq $value) {
                             $checked = 'checked ';
                         }
-                        my $title = $res->{'title'};
+                        my $title = $res->compTitle;
                         if (! defined($title) || $title eq '') {
-                            ($title) = ($res->{'src'} =~ m:/([^/]*)$:);
+                            ($title) = ($res->src =~ m:/([^/]*)$:);
                         }
                         $seq_str .= '<tr>'.
                             qq{<td><input type="radio" id="$rb_count" name="problemchoice" value="$value" $checked /></td>}.
                             '<td><label for="'.$rb_count.'">'.$resptype.'</label></td>'.
                             '<td><label for="'.$rb_count.'">'.$title.'</label>';
-                        if (scalar(@{$partdata->{'ResponseIds'}}) > 1) {
+                        if (scalar(@response_ids) > 1) {
                             $seq_str .= &mt('response').' '.$respid;
                         }
-                        my $link = $res->{'src'}.'?symb='.
-                            &Apache::lonnet::escape($res->{'symb'});
+                        my $link = $res->src.'?symb='.
+                            &Apache::lonnet::escape($res->symb);
                         $seq_str .= ('&nbsp;'x2).
                             qq{<a target="preview" href="$link">view</a>};
                         $seq_str .= "</td></tr>\n";
@@ -160,7 +179,7 @@ sub ProblemSelector {
             }
         }
         if ($seq_str ne '') {
-            $Str .= '<tr><td>&nbsp</td><td colspan="2"><b>'.$seq->{'title'}.'</b></td>'.
+            $Str .= '<tr><td>&nbsp</td><td colspan="2"><b>'.$seq->compTitle.'</b></td>'.
                 "</tr>\n".$seq_str;
         }
     }
@@ -433,36 +452,40 @@ sub get_prev_curr_next {
     #
     # Build an array with the data we need to search through
     my @Resource;
-    foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess('all')) {
-        foreach my $res (@{$seq->{'contents'}}) {
-            next if ($res->{'type'} ne 'assessment');
-            foreach my $part (@{$res->{'parts'}}) {
-                my $partdata = $res->{'partdata'}->{$part};
-                if ($partdata->{'Survey'} && ($granularity eq 'part_survey')){
+    my ($navmap,@sequences) = 
+        &Apache::lonstatistics::selected_sequences_with_assessments('all');
+    return $navmap if (! ref($navmap));
+    foreach my $seq (@sequences) {
+        my @resources = &get_resources($navmap,$seq);
+        foreach my $res (@resources) {
+            foreach my $part (@{$res->parts}) {
+                if ($res->is_survey($part) && ($granularity eq 'part_survey')){
                     push (@Resource,
-                          { symb     => $res->{symb},
+                          { symb     => $res->symb,
                             part     => $part,
                             resource => $res,
                         } );
                 } elsif ($granularity eq 'part') {
                     push (@Resource,
-                          { symb     => $res->{symb},
+                          { symb     => $res->symb,
                             part     => $part,
                             resource => $res,
                         } );
                 } elsif ($granularity eq 'response') {
+                    my @response_ids   = $res->responseIds($part);
+                    my @response_types = $res->responseType($part);
                     for (my $i=0;
-                         $i<scalar(@{$partdata->{'ResponseTypes'}});
+                         $i<scalar(@response_ids);
                          $i++){
-                        my $respid = $partdata->{'ResponseIds'}->[$i];
-                        my $resptype = $partdata->{'ResponseTypes'}->[$i];
+                        my $respid   = $response_ids[$i];
+                        my $resptype = $response_types[$i];
                         next if ($resptype !~ m/$AcceptableResponseTypes/);
                         push (@Resource,
-                              { symb     => $res->{symb},
+                              { symb     => $res->symb,
                                 part     => $part,
-                                respid   => $partdata->{'ResponseIds'}->[$i],
+                                respid   => $respid,
+                                resptype => $resptype,
                                 resource => $res,
-                                resptype => $resptype
                                 } );
                     }
                 }
@@ -520,7 +543,7 @@ sub get_prev_curr_next {
         $curr = $Resource[$curr_idx  ];
         $next = $Resource[$curr_idx+1];
     }
-    return ($prev,$curr,$next);
+    return ($navmap,$prev,$curr,$next);
 }
 
 
@@ -1258,43 +1281,6 @@ sub get_time_limits {
     return ($starttime,$endtime);
 }
 
-
-
-####################################################
-####################################################
-
-=pod
-
-=item sections_description 
-
-Inputs: @Sections, an array of sections
-
-Returns: A text description of the sections selected.
-
-=cut
-
-####################################################
-####################################################
-sub sections_description {
-    my @Sections = @_;
-    my $sectionstring = '';
-    if (scalar(@Sections) > 1) {
-        if (scalar(@Sections) > 2) {
-            my $last = pop(@Sections);
-            $sectionstring = "Sections ".join(', ',@Sections).', and '.$last;
-        } else {
-            $sectionstring = "Sections ".join(' and ',@Sections);
-        }
-    } else {
-        if ($Sections[0] eq 'all') {
-            $sectionstring = "All sections";
-        } else {
-            $sectionstring = "Section ".$Sections[0];
-        }
-    }
-    return $sectionstring;
-}
-
 ####################################################
 ####################################################
 
@@ -1317,7 +1303,7 @@ sub manage_caches {
         join(',',
              map {
                      &Apache::lonnet::escape($_);
-                 } sort(@Apache::lonstatistics::SelectedSections)
+                 } sort(&Apache::lonstatistics::get_selected_sections())
              );
     my $statuskey = $Apache::lonstatistics::enrollment_status;
     if (exists($ENV{'form.ClearCache'}) || 
@@ -1331,6 +1317,9 @@ sub manage_caches {
         if (defined($update_message)) {
             $r->print($update_message);
         }
+        if (0) {
+            &Apache::lonnet::logthis('Updating mysql student data caches');
+        }
         &gather_full_student_data($r,$formname,$inputname);
     }
     #