[LON-CAPA-cvs] cvs: loncom /interface loncoursedata.pm

matthew lon-capa-cvs@mail.lon-capa.org
Thu, 03 Mar 2005 18:57:36 -0000


This is a MIME encoded message

--matthew1109876256
Content-Type: text/plain

matthew		Thu Mar  3 13:57:36 2005 EDT

  Modified files:              
    /loncom/interface	loncoursedata.pm 
  Log:
  Removed the hideous blight that was &get_sequence_assessment_data.
  Refactored &populate_weight_table to use navmaps instead of the afforemented
  subroutine.  Minor documentation changes.
  
  
--matthew1109876256
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20050303135736.txt"

Index: loncom/interface/loncoursedata.pm
diff -u loncom/interface/loncoursedata.pm:1.143 loncom/interface/loncoursedata.pm:1.144
--- loncom/interface/loncoursedata.pm:1.143	Mon Feb 28 19:07:20 2005
+++ loncom/interface/loncoursedata.pm	Thu Mar  3 13:57:36 2005
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: loncoursedata.pm,v 1.143 2005/03/01 00:07:20 matthew Exp $
+# $Id: loncoursedata.pm,v 1.144 2005/03/03 18:57:36 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -66,151 +66,6 @@
 
 =cut
 
-####################################################
-####################################################
-
-=pod
-
-=item &get_sequence_assessment_data()
-
-Use lonnavmaps to build a data structure describing the order and 
-assessment contents of each sequence in the current course.
-
-The returned structure is a hash reference. 
-
-{ title => 'title',
-  symb  => 'symb',
-  src   => '/s/o/u/r/c/e',
-  type  => (container|assessment),
-  num_assess   => 2,               # only for container
-  parts        => [11,13,15],      # only for assessment
-  response_ids => [12,14,16],      # only for assessment
-  contents     => [........]       # only for container
-}
-
-$hash->{'contents'} is a reference to an array of hashes of the same structure.
-
-Also returned are array references to the sequences and assessments contained
-in the course.
-
-
-=cut
-
-####################################################
-####################################################
-sub get_sequence_assessment_data {
-    my $fn=$ENV{'request.course.fn'};
-    ##
-    ## use navmaps
-    my $navmap = Apache::lonnavmaps::navmap->new();
-    if (!defined($navmap)) {
-        return 'Can not open Coursemap';
-    }
-    # We explicity grab the top level map because I am not sure we
-    # are pulling it from the iterator.
-    my $top_level_map = $navmap->getById('0.0');
-    #
-    my $iterator = $navmap->getIterator(undef, undef, undef, 1);
-    my $curRes = $iterator->next(); # Top level sequence
-    ##
-    ## Prime the pump 
-    ## 
-    ## We are going to loop until we run out of sequences/pages to explore for
-    ## resources.  This means we have to start out with something to look
-    ## at.
-    my $title = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
-    my $symb  = $top_level_map->symb();
-    my $src   = $top_level_map->src();
-    my $randompick = $top_level_map->randompick();
-    #
-    my @Sequences; 
-    my @Assessments;
-    my @Nested_Sequences = ();   # Stack of sequences, keeps track of depth
-    my $top = { title    => $title,
-                src      => $src,
-                symb     => $symb,
-                type     => 'container',
-                num_assess => 0,
-                num_assess_parts => 0,
-                contents   => [], 
-                randompick => $randompick,
-            };
-    push (@Sequences,$top);
-    push (@Nested_Sequences, $top);
-    #
-    # We need to keep track of which sequences contain homework problems
-    # 
-    my $previous_too;
-    my $previous;
-    while (scalar(@Nested_Sequences)) {
-        $previous_too = $previous;
-        $previous = $curRes;
-        $curRes = $iterator->next();
-        my $currentmap = $Nested_Sequences[-1]; # Last one on the stack
-        if ($curRes == $iterator->BEGIN_MAP()) {
-            if (! ref($previous)) {
-                $previous = $previous_too;
-            }
-            if (! ref($previous)) {
-                next;
-            }
-            # get the map itself, instead of BEGIN_MAP
-            $title = $previous->compTitle;
-            $symb  = $previous->symb();
-            $src   = $previous->src();
-            $randompick = $previous->randompick();
-            my $newmap = { title    => $title,
-                           src      => $src,
-                           symb     => $symb,
-                           type     => 'container',
-                           num_assess => 0,
-                           randompick => $randompick,
-                           contents   => [],
-                       };
-            push (@{$currentmap->{'contents'}},$newmap); # this is permanent
-            push (@Sequences,$newmap);
-            push (@Nested_Sequences, $newmap); # this is a stack
-            next;
-        }
-        if ($curRes == $iterator->END_MAP()) {
-            pop(@Nested_Sequences);
-            next;
-        }
-        next if (! ref($curRes));
-        next if (! $curRes->is_problem() && $curRes->src() !~ /\.survey$/);
-        # Okay, from here on out we only deal with assessments
-        $title = $curRes->compTitle();
-        $symb  = $curRes->symb();
-        $src   = $curRes->src();
-        my $parts = $curRes->parts();
-        my %partdata;
-        foreach my $part (@$parts) {
-            my @Responses = $curRes->responseType($part);
-            my @Ids       = $curRes->responseIds($part);
-            $partdata{$part}->{'ResponseTypes'}= \@Responses;
-            $partdata{$part}->{'ResponseIds'}  = \@Ids;
-            $partdata{$part}->{'Survey'}       = $curRes->is_survey($part);
-            # Count how many responses of each type there are in this part
-            foreach (@Responses) {
-                $partdata{$part}->{$_}++;
-            }
-        }
-        my $assessment = { title => $title,
-                           src   => $src,
-                           symb  => $symb,
-                           type  => 'assessment',
-                           parts => $parts,
-                           num_parts => scalar(@$parts),
-                           partdata => \%partdata,
-                       };
-        push(@Assessments,$assessment);
-        push(@{$currentmap->{'contents'}},$assessment);
-        $currentmap->{'num_assess'}++;
-        $currentmap->{'num_assess_parts'}+= scalar(@$parts);
-    }
-    return ($top,\@Sequences,\@Assessments);
-}
-
 sub LoadDiscussion {
     my ($courseID)=@_;
     my %Discuss=();
@@ -777,6 +632,13 @@
 
 =item &delete_caches()
 
+This routine drops all the tables associated with a course from the 
+MySQL database.
+
+Input: course id (optional, determined by environment if omitted) 
+
+Returns: nothing
+
 =cut
 
 ################################################
@@ -1058,7 +920,6 @@
     undef(%students_by_id);
 }
 
-
 ################################################
 ################################################
 
@@ -2028,10 +1889,24 @@
     }
     #
     &setup_table_names($courseid);
-    my ($top,$sequences,$assessments) = get_sequence_assessment_data();
-    if (! defined($top) || ! ref($top)) {
-        # There has been an error, better report it
-        &Apache::lonnet::logthis('top is undefined');
+    my $navmap = Apache::lonnavmaps::navmap->new();
+    if (!defined($navmap)) {
+        &Apache::lonnet::logthis('loncoursedata::populate_weight_table:'.$/.
+                                 '  unable to get navmaps resource'.$/.
+                                 '  '.join(' ',(caller)));
+        return;
+    }
+    my @sequences = $navmap->retrieveResources(undef,
+                                               sub { shift->is_map(); },1,0,1);
+    my @resources;
+    foreach my $seq (@sequences) {
+        push(@resources,$navmap->retrieveResources($seq,
+                                                   sub {shift->is_problem();},
+                                                   0,0,0));
+    }
+    if (! scalar(@resources)) {
+        &Apache::lonnet::logthis('loncoursedata::populate_weight_table:'.$/.
+                                 ' no resources returned for '.$courseid);
         return;
     }
     #       Since we use lonnet::EXT to retrieve problem weights,
@@ -2041,12 +1916,12 @@
     my $request = 'INSERT IGNORE INTO '.$weight_table.
         "(symb_id,part_id,weight) VALUES ";
     my $weight;
-    foreach my $res (@$assessments) {
-        my $symb_id = &get_symb_id($res->{'symb'});
-        foreach my $part (@{$res->{'parts'}}) {
+    foreach my $res (@resources) {
+        my $symb_id = &get_symb_id($res->symb);
+        foreach my $part (@{$res->parts}) {
             my $part_id = &get_part_id($part);
             $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight',
-                                           $res->{'symb'},
+                                           $res->symb,
                                            undef,undef,undef);
             if (!defined($weight) || ($weight eq '')) { 
                 $weight=1;

--matthew1109876256--