--- loncom/interface/loncoursedata.pm 2003/02/14 21:45:19 1.48 +++ loncom/interface/loncoursedata.pm 2003/03/05 14:39:08 1.56 @@ -1,7 +1,6 @@ # The LearningOnline Network with CAPA -# (Publication Handler # -# $Id: loncoursedata.pm,v 1.48 2003/02/14 21:45:19 matthew Exp $ +# $Id: loncoursedata.pm,v 1.56 2003/03/05 14:39:08 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -120,9 +119,10 @@ sub DownloadClasslist { my ($courseDomain,$courseNumber)=split(/\_/,$courseID); my %classlist; - my $modifiedTime = &Apache::lonnet::GetFileTimestamp($courseDomain, $courseNumber, + my $modifiedTime = &Apache::lonnet::GetFileTimestamp($courseDomain, + $courseNumber, 'classlist.db', - $Apache::lonnet::perlvar{'lonUsersDir'}); + $Apache::lonnet::perlvar{'lonUsersDir'}); # Always download the information if lastDownloadTime is set to # Not downloaded, otherwise it is only downloaded if the file @@ -261,7 +261,8 @@ with stopping downloading then can not t # ----- PROCESSING FUNCTIONS --------------------------------------- - +#################################################### +#################################################### =pod @@ -278,19 +279,24 @@ The returned structure is a hash referen symb => 'symb', source => '/s/o/u/r/c/e', type => (container|assessment), - contents => [ {},{},{},{} ], # only for container + num_assess => 2, # only for container parts => [11,13,15], # only for assessment - response_ids => [12,14,16] # 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 { - return undef; my $fn=$ENV{'request.course.fn'}; - &Apache::lonnet::logthis('filename = '.$fn); ## ## use navmaps my $navmap = Apache::lonnavmaps::navmap->new($fn.".db",$fn."_parms.db", @@ -305,32 +311,37 @@ sub get_sequence_assessment_data { ## 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 $curRes = $iterator->next(); # BEGIN_MAP - $curRes = $iterator->next(); # The sequence itself - # - my $title = $curRes->title(); - my $symb = $curRes->symb(); - my $src = $curRes->src(); + my $title = $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; + my $symb = 'top'; + my $src = 'not applicable'; # + 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 => [], }; + push (@Sequences,$top); push (@Nested_Sequences, $top); # # We need to keep track of which sequences contain homework problems # + my $previous; + my $curRes = $iterator->next(); # BEGIN_MAP + $curRes = $iterator->next(); # The first item in the top level map. while (scalar(@Nested_Sequences)) { + $previous = $curRes; $curRes = $iterator->next(); my $currentmap = $Nested_Sequences[-1]; # Last one on the stack if ($curRes == $iterator->BEGIN_MAP()) { # get the map itself, instead of BEGIN_MAP - $curRes = $iterator->next(); - $title = $curRes->title(); - $symb = $curRes->symb(); - $src = $curRes->src(); + $title = $previous->title(); + $symb = $previous->symb(); + $src = $previous->src(); my $newmap = { title => $title, src => $src, symb => $symb, @@ -339,6 +350,7 @@ sub get_sequence_assessment_data { contents => [], }; push (@{$currentmap->{'contents'}},$newmap); # this is permanent + push (@Sequences,$newmap); push (@Nested_Sequences, $newmap); # this is a stack next; } @@ -347,7 +359,7 @@ sub get_sequence_assessment_data { next; } next if (! ref($curRes)); - next if (! $curRes->is_problem() && !$curRes->randomout); + next if (! $curRes->is_problem());# && !$curRes->randomout); # Okay, from here on out we only deal with assessments $title = $curRes->title(); $symb = $curRes->symb(); @@ -357,13 +369,20 @@ sub get_sequence_assessment_data { src => $src, symb => $symb, type => 'assessment', + parts => $parts, + num_parts => scalar(@$parts), }; + push(@Assessments,$assessment); push(@{$currentmap->{'contents'}},$assessment); $currentmap->{'num_assess'}++; + $currentmap->{'num_assess_parts'}+= scalar(@$parts); } - return $top; + return ($top,\@Sequences,\@Assessments); } +################################################# +################################################# + =pod =item &ProcessTopResourceMap() @@ -1289,21 +1308,20 @@ sub DownloadStudentCourseData { $WhatIWant .= ')'; # $WhatIWant = '.'; + my %prog_state; if($status eq 'true') { - &Apache::lonhtmlcommon::Create_PrgWin($r, $title, $heading); + %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r, $title, + $heading,($#$students)+1); } - my $displayString; - my $count=0; foreach (@$students) { my %cache; if($c->aborted()) { return 'Aborted'; } if($status eq 'true') { - $count++; - my $displayString = $count.'/'.$studentCount.': '.$_; - &Apache::lonhtmlcommon::Update_PrgWin($displayString, $r); + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, + 'last student '.$_); } my $downloadTime='Not downloaded'; @@ -1340,7 +1358,7 @@ sub DownloadStudentCourseData { next; } } - if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r); } + if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); } return 'OK'; } @@ -1361,10 +1379,11 @@ sub DownloadStudentCourseDataSeparate { &CheckForResidualDownload($cacheDB, 'true', 'true', $courseID, $r, $c); my $studentCount = scalar(@$students); + my %prog_state; if($status eq 'true') { - &Apache::lonhtmlcommon::Create_PrgWin($r, $title, $heading); + %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r, $title, + $heading,($#$students)+1); } - my $count=0; my $displayString=''; foreach (@$students) { if($c->aborted()) { @@ -1372,9 +1391,8 @@ sub DownloadStudentCourseDataSeparate { } if($status eq 'true') { - $count++; - $displayString = $count.'/'.$studentCount.': '.$_; - &Apache::lonhtmlcommon::Update_PrgWin($displayString, $r); + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, + 'last student '.$_); } my %cache; @@ -1419,7 +1437,8 @@ sub DownloadStudentCourseDataSeparate { } untie(%downloadData); } - if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r); } + if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r, + \%prog_state); } return &CheckForResidualDownload($cacheDB, 'true', 'true', $courseID, $r, $c); @@ -1458,8 +1477,10 @@ sub CheckForResidualDownload { my $heading = 'Process Course Data'; my $title = 'LON-CAPA Statistics'; my $studentCount = scalar(@students); + my %prog_state; if($status eq 'true') { - &Apache::lonhtmlcommon::Create_PrgWin($r, $title, $heading); + %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r, $title, + $heading,$#students+1); } my $count=1; @@ -1467,8 +1488,8 @@ sub CheckForResidualDownload { last if($c->aborted()); if($status eq 'true') { - my $displayString = $count.'/'.$studentCount.': '.$name; - &Apache::lonhtmlcommon::Update_PrgWin($displayString, $r); + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, + 'last student '.$name); } if($extract eq 'true') { @@ -1479,7 +1500,8 @@ sub CheckForResidualDownload { $count++; } - if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r); } + if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r, + \%prog_state); } untie(%cache); untie(%downloadData); @@ -1558,9 +1580,14 @@ sub get_current_state { # $courseid = $ENV{'request.course.id'} if (! defined($courseid)); # +# my $cachefilename = $Apache::lonnet::tmpdir.$ENV{'user.name'}.'_'. +# $ENV{'user.domain'}.'_'. +# $courseid.'_student_data.db'; my $cachefilename = $Apache::lonnet::tmpdir.$ENV{'user.name'}.'_'. $ENV{'user.domain'}.'_'. - $courseid.'_student_data.db'; + $courseid.'_'. + $sname.'_'.$sdom. + '_student_data.db'; my %cache; # my %student_data; # return values go here @@ -1572,18 +1599,16 @@ sub get_current_state { if (tie(%cache,'GDBM_File',$cachefilename,&GDBM_READER(),0640)) { if (exists($cache{$key.'time'})) { $updatetime = $cache{$key.'time'}; -# &Apache::lonnet::logthis('got updatetime of '.$updatetime); } untie(%cache); } - # timestamp/devalidation + # timestamp/devalidation check should go here. my $modifiedtime = 1; # Take whatever steps are neccessary at this point to give $modifiedtime a # new value # if (($updatetime < $modifiedtime) || (defined($forcedownload) && $forcedownload)) { -# &Apache::lonnet::logthis("loading data"); # Get all the students current data my $time_of_retrieval = time; my @tmp = &Apache::lonnet::currentdump($courseid,$sdom,$sname); @@ -1605,7 +1630,6 @@ sub get_current_state { # keys instead of unescaping every key. # if (tie(%cache,'GDBM_File',$cachefilename,&GDBM_WRCREAT(),0640)) { -# &Apache::lonnet::logthis("writing data"); while (my ($current_symb,$param_hash) = each(%student_data)) { my @Parameters = %{$param_hash}; my $value = join(':',map { &Apache::lonnet::escape($_); } @@ -1617,7 +1641,6 @@ sub get_current_state { untie(%cache); } } else { - &Apache::lonnet::logthis('retrieving cached data '); if (tie(%cache,'GDBM_File',$cachefilename,&GDBM_READER(),0640)) { if (defined($symb)) { my $searchkey = $key.&Apache::lonnet::escape($symb); @@ -1630,7 +1653,6 @@ sub get_current_state { if ($testkey =~ /$searchkey/) { # \Q \E? May be necc. my $tmpsymb = $1; next if ($tmpsymb =~ 'time'); -# &Apache::lonnet::logthis('found '.$tmpsymb.':'); $student_data{&Apache::lonnet::unescape($tmpsymb)} = &make_into_hash($params); } @@ -1640,10 +1662,8 @@ sub get_current_state { } } if (! defined($symb)) { -# &Apache::lonnet::logthis("returning all data"); return %student_data; } elsif (exists($student_data{$symb})) { -# &Apache::lonnet::logthis("returning data for symb=".$symb); return %{$student_data{$symb}}; } else { return (); @@ -1668,13 +1688,26 @@ $ENV{'course.'.$cid.'.domain'}, and $ENV Returns a reference to a hash which contains: keys '$sname:$sdom' - values [$end,$start,$id,$section,$fullname] + values [$sdom,$sname,$end,$start,$id,$section,$fullname,$status] + +The constant values CL_SDOM, CL_SNAME, CL_END, etc. can be used +as indices into the returned list to future-proof clients against +changes in the list order. =cut ################################################ ################################################ +sub CL_SDOM { return 0; } +sub CL_SNAME { return 1; } +sub CL_END { return 2; } +sub CL_START { return 3; } +sub CL_ID { return 4; } +sub CL_SECTION { return 5; } +sub CL_FULLNAME { return 6; } +sub CL_STATUS { return 7; } + sub get_classlist { my ($cid,$cdom,$cnum) = @_; $cid = $cid || $ENV{'request.course.id'};