--- loncom/interface/loncoursedata.pm 2002/07/24 14:52:32 1.4 +++ loncom/interface/loncoursedata.pm 2002/08/03 18:47:24 1.11 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: loncoursedata.pm,v 1.4 2002/07/24 14:52:32 stredwic Exp $ +# $Id: loncoursedata.pm,v 1.11 2002/08/03 18:47:24 stredwic Exp $ # # Copyright Michigan State University Board of Trustees # @@ -189,6 +189,7 @@ sub DownloadCourseInformation { my $modifiedTime = &GetFileTimestamp($domain, $name, $courseID.'.db', $Apache::lonnet::perlvar{'lonUsersDir'}); + if($lastDownloadTime >= $modifiedTime) { $courseData{'lastDownloadTime'}=time; $courseData{'UpToDate'} = 'true'; @@ -196,6 +197,12 @@ sub DownloadCourseInformation { } # Download course data + my $WhatIWant = '(version:(\w|\/|\.)+?$|'; + $WhatIWant .= '\d+?:(\w|\/|\.)+?:(resource\.\d+\.'; + $WhatIWant .= '(solved|tries|previous|awarded|(\d+\.submission))'; + $WhatIWant .= '|timestamp)'; + $WhatIWant .= ')'; +# %courseData=&Apache::lonnet::dump($courseID, $domain, $name, $WhatIWant); %courseData=&Apache::lonnet::dump($courseID, $domain, $name); $courseData{'UpToDate'} = 'false'; $courseData{'lastDownloadTime'}=time; @@ -254,7 +261,7 @@ sub ProcessTopResourceMap { if($c->aborted()) { return; } - if(tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) { + if(tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640)) { last; } $tieTries++; @@ -277,13 +284,16 @@ sub ProcessTopResourceMap { $currentSequence=-1; my $topLevelSequenceNumber = $currentSequence; + my %sequenceRecord; while(1) { if($c->aborted()) { last; } # HANDLE NEW SEQUENCE! #if page || sequence - if(defined($hash{'map_pc_'.$hash{'src_'.$currentResourceID}})) { + if(defined($hash{'map_pc_'.$hash{'src_'.$currentResourceID}}) && + !defined($sequenceRecord{$currentResourceID})) { + $sequenceRecord{$currentResourceID}++; push(@sequences, $currentSequence); push(@currentResource, $currentResourceID); push(@finishResource, $lastResourceID); @@ -321,7 +331,10 @@ sub ProcessTopResourceMap { my $partB=$2; if($hash{'src_'.$currentResourceID}=~ /\.(problem|exam|quiz|assess|survey|form)$/ && - $partA eq $currentSequence) { + $partA eq $currentSequence && + !defined($sequenceRecord{$currentSequence.':'. + $currentResourceID})) { + $sequenceRecord{$currentSequence.':'.$currentResourceID}++; my $Problem = &Apache::lonnet::symbclean( &Apache::lonnet::declutter($hash{'map_id_'.$partA}). '___'.$partB.'___'. @@ -341,38 +354,53 @@ sub ProcessTopResourceMap { # &Apache::lonnet::metdata($meta,'title'); $cache->{$currentResourceID.':title'}= $hash{'title_'.$currentResourceID}; + $cache->{$currentResourceID.':source'}= + $hash{'src_'.$currentResourceID}; # Get Parts for problem - foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) { - if($_=~/^stores\_(\d+)\_tries$/) { - my $Part=&Apache::lonnet::metadata($meta,$_.'.part'); - if(!defined($cache->{$currentSequence.':'. - $currentResourceID.':parts'})) { - $cache->{$currentSequence.':'.$currentResourceID. - ':parts'}=$Part; - } else { - $cache->{$currentSequence.':'.$currentResourceID. - ':parts'}.=':'.$Part; + my %beenHere; + foreach (split(/\,/,&Apache::lonnet::metadata($meta,'packages'))) { + if(/^\w+response_\d+.*/) { + my (undef, $partId, $responseId) = split(/_/,$_); + if($beenHere{'p:'.$partId} == 0) { + $beenHere{'p:'.$partId}++; + if(!defined($cache->{$currentSequence.':'. + $currentResourceID.':parts'})) { + $cache->{$currentSequence.':'.$currentResourceID. + ':parts'}=$partId; + } else { + $cache->{$currentSequence.':'.$currentResourceID. + ':parts'}.=':'.$partId; + } + } + if($beenHere{'r:'.$partId.':'.$responseId} == 0) { + $beenHere{'r:'.$partId.':'.$responseId}++; + if(!defined($cache->{$currentSequence.':'. + $currentResourceID.':'.$partId. + ':responseIDs'})) { + $cache->{$currentSequence.':'.$currentResourceID. + ':'.$partId.':responseIDs'}=$responseId; + } else { + $cache->{$currentSequence.':'.$currentResourceID. + ':'.$partId.':responseIDs'}.=':'. + $responseId; + } } - foreach (split(/\,/, - &Apache::lonnet::metadata($meta,'packages'))) { - if($_=~/^optionresponse\_($Part)\_(\w+)$/) { - if(defined($cache->{'OptionResponses'})) { - $cache->{'OptionResponses'}.= ':::'. - $hash{'src_'.$currentResourceID}.'::'. - $hash{'title_'.$currentResourceID}.'::'. - $Part.'::'.$Problem; - } else { - $cache->{'OptionResponses'}= - $hash{'src_'.$currentResourceID}.'::'. - $hash{'title_'.$currentResourceID}.'::'. - $Part.'::'.$Problem; - } + if(/^optionresponse/ && + $beenHere{'o:'.$partId.':'.$currentResourceID} == 0) { + $beenHere{'o:'.$partId.$currentResourceID}++; + if(defined($cache->{'OptionResponses'})) { + $cache->{'OptionResponses'}.= ':::'. + $currentResourceID.':'. + $partId.':'.$responseId; + } else { + $cache->{'OptionResponses'}= $currentResourceID. + ':'.$partId.':'.$responseId; } } } - } - } + } + } # if resource == finish resource, then it is the end of a sequence/page if($currentResourceID eq $lastResourceID) { @@ -421,17 +449,24 @@ sub ProcessTopResourceMap { if($currentSequence eq $topLevelSequenceNumber) { last; } - } + } # MOVE!!! # move to next resource unless(defined($hash{'to_'.$currentResourceID})) { # big problem, need to handle. Next is probably wrong + my $errorMessage = 'Big problem in '; + $errorMessage .= 'loncoursedata::ProcessTopLevelMap.'; + $errorMessage .= ' bighash to_$currentResourceID not defined!'; + &Apache::lonnet::logthis($errorMessage); last; } my @nextResources=(); foreach (split(/\,/,$hash{'to_'.$currentResourceID})) { - push(@nextResources, $hash{'goesto_'.$_}); + if(!defined($sequenceRecord{$currentSequence.':'. + $hash{'goesto_'.$_}})) { + push(@nextResources, $hash{'goesto_'.$_}); + } } push(@currentResource, @nextResources); # Set the next resource to be processed @@ -513,8 +548,10 @@ sub ProcessClasslist { $cache->{$name.':username'}=$studentName; $cache->{$name.':domain'}=$studentDomain; + # Initialize timestamp for student if(!defined($cache->{$name.':lastDownloadTime'})) { $cache->{$name.':lastDownloadTime'}='Not downloaded'; + $cache->{$name.':updateTime'}=' Not updated'; } my ($checkForError)=keys(%$studentInformation); @@ -558,6 +595,17 @@ sub ProcessClasslist { } $cache->{$name.':Status'}=$status; $cache->{$name.':section'}=$sec; + + if($sec eq '' || !defined($sec) || $sec eq ' ') { + $sec = 'none'; + } + if(defined($cache->{'sectionList'})) { + if($cache->{'sectionList'} !~ /(^$sec:|^$sec$|:$sec$|:$sec:)/) { + $cache->{'sectionList'} .= ':'.$sec; + } + } else { + $cache->{'sectionList'} = $sec; + } } $cache->{'ClasslistTimestamp'}=time; @@ -604,6 +652,12 @@ sub ProcessStudentData { if($courseData->{'UpToDate'} eq 'true') { $cache->{$name.':lastDownloadTime'}=$courseData->{'lastDownloadTime'}; + if($courseData->{'lastDownloadTime'} eq 'Not downloaded') { + $cache->{$name.':updateTime'} = ' Not updated'; + } else { + $cache->{$name.':updateTime'}= + localtime($courseData->{'lastDownloadTime'}); + } return; } @@ -617,6 +671,12 @@ sub ProcessStudentData { } $cache->{$name.':lastDownloadTime'}=$courseData->{'lastDownloadTime'}; + if($courseData->{'lastDownloadTime'} eq 'Not downloaded') { + $cache->{$name.':updateTime'} = ' Not updated'; + } else { + $cache->{$name.':updateTime'}= + localtime($courseData->{'lastDownloadTime'}); + } foreach (@courseKeys) { $cache->{$name.':'.$_}=$courseData->{$_}; } @@ -625,30 +685,27 @@ sub ProcessStudentData { } sub LoadDiscussion { -# my $symb=shift; -# $r->print('
$cid ... '.$symb); -# my %contrib=&Apache::lonnet::dump('msu_2964385f9033c63msul1','msu','2964385f9033c63msul1'); - my ($name, $courseID, $Discuss)=@_; - my %contrib=&DownloadCourseInformation($name, $courseID, 0); - + my ( $courseID)=@_; + my %Discuss=(); + my %contrib=&Apache::lonnet::dump( + $courseID, + $ENV{'course.'.$courseID.'.domain'}, + $ENV{'course.'.$courseID.'.num'}); + + #my %contrib=&DownloadCourseInformation($name, $courseID, 0); + foreach my $temp(keys %contrib) { if ($temp=~/^version/) { my $ver=$contrib{$temp}; my ($dummy,$prb)=split(':',$temp); for (my $idx=1; $idx<=$ver; $idx++ ) { my $name=$contrib{"$idx:$prb:sendername"}; - $Discuss->{"$name:$prb"}=$idx; + $Discuss{"$name:$prb"}=$idx; } } } -# $r->print('
cid='.$cid); -# my %contrib=&Apache::lonnet::restore($symb,$cid, -# $ENV{$cid.'.domain'}, -# $ENV{'course.'.$cid.'.num'}); - -# $Apache::lonxml::debug=1; -# &Apache::lonhomework::showhash(%Discuss); -# $Apache::lonxml::debug=0; + + return \%Discuss; } # ----- END PROCESSING FUNCTIONS --------------------------------------- @@ -759,9 +816,9 @@ sub TestCacheData { while($tieTries < $totalDelay) { my $result=0; if($isCached) { - $result=tie(%testData,'GDBM_File',$ChartDB,&GDBM_READER,0640); + $result=tie(%testData,'GDBM_File',$ChartDB,&GDBM_READER(),0640); } else { - $result=tie(%testData,'GDBM_File',$ChartDB,&GDBM_NEWDB,0640); + $result=tie(%testData,'GDBM_File',$ChartDB,&GDBM_NEWDB(),0640); } if($result) { last;