--- loncom/interface/loncoursedata.pm 2002/07/25 21:23:51 1.6 +++ loncom/interface/loncoursedata.pm 2002/08/05 14:16:19 1.12 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: loncoursedata.pm,v 1.6 2002/07/25 21:23:51 stredwic Exp $ +# $Id: loncoursedata.pm,v 1.12 2002/08/05 14:16:19 stredwic Exp $ # # Copyright Michigan State University Board of Trustees # @@ -106,16 +106,16 @@ sub DownloadClasslist { my ($courseDomain,$courseNumber)=split(/\_/,$courseID); my %classlist; -# my $modifiedTime = &GetFileTimestamp($courseDomain, $courseNumber, -# 'classlist.db', -# $Apache::lonnet::perlvar{'lonUsersDir'}); - -# if($lastDownloadTime ne 'Not downloaded' && -# $lastDownloadTime >= $modifiedTime && $modifiedTime >= 0) { -# $classlist{'lastDownloadTime'}=time; -# $classlist{'UpToDate'} = 'true'; -# return \%classlist; -# } + my $modifiedTime = &GetFileTimestamp($courseDomain, $courseNumber, + 'classlist.db', + $Apache::lonnet::perlvar{'lonUsersDir'}); + + if($lastDownloadTime ne 'Not downloaded' && + $lastDownloadTime >= $modifiedTime && $modifiedTime >= 0) { + $classlist{'lastDownloadTime'}=time; + $classlist{'UpToDate'} = 'true'; + return \%classlist; + } %classlist=&Apache::lonnet::dump('classlist',$courseDomain, $courseNumber); my ($checkForError)=keys (%classlist); @@ -182,21 +182,25 @@ database. =cut sub DownloadCourseInformation { - my ($namedata,$courseID,$lastDownloadTime)=@_; + my ($namedata,$courseID,$lastDownloadTime,$WhatIWant)=@_; my %courseData; my ($name,$domain) = split(/\:/,$namedata); -# my $modifiedTime = &GetFileTimestamp($domain, $name, -# $courseID.'.db', -# $Apache::lonnet::perlvar{'lonUsersDir'}); -# if($lastDownloadTime >= $modifiedTime) { -# $courseData{'lastDownloadTime'}=time; -# $courseData{'UpToDate'} = 'true'; -# return \%courseData; -# } + my $modifiedTime = &GetFileTimestamp($domain, $name, + $courseID.'.db', + $Apache::lonnet::perlvar{'lonUsersDir'}); + + if($lastDownloadTime >= $modifiedTime) { + $courseData{'lastDownloadTime'}=time; + $courseData{'UpToDate'} = 'true'; + return \%courseData; + } # Download course data - %courseData=&Apache::lonnet::dump($courseID, $domain, $name); + if(!defined($WhatIWant)) { + $WhatIWant = '.'; + } + %courseData=&Apache::lonnet::dump($courseID, $domain, $name, $WhatIWant); $courseData{'UpToDate'} = 'false'; $courseData{'lastDownloadTime'}=time; return \%courseData; @@ -254,7 +258,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 +281,21 @@ sub ProcessTopResourceMap { $currentSequence=-1; my $topLevelSequenceNumber = $currentSequence; + my $problemCount=0; + my $problemCount2=0; + my %sequenceRecord; + my $sequenceCount=0; + my $sequenceCount2=0; 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})) { + $sequenceCount++; + $sequenceRecord{$currentResourceID}++; push(@sequences, $currentSequence); push(@currentResource, $currentResourceID); push(@finishResource, $lastResourceID); @@ -313,15 +325,23 @@ sub ProcessTopResourceMap { last; } } + next; } # Handle gradable resources: exams, problems, etc $currentResourceID=~/(\d+)\.(\d+)/; my $partA=$1; my $partB=$2; + if($hash{'src_'.$currentResourceID}=~/\.problem$/) { + $problemCount++; + } if($hash{'src_'.$currentResourceID}=~ /\.(problem|exam|quiz|assess|survey|form)$/ && - $partA eq $currentSequence) { + $partA eq $currentSequence && + !defined($sequenceRecord{$currentSequence.':'. + $currentResourceID})) { + $problemCount2++; + $sequenceRecord{$currentSequence.':'.$currentResourceID}++; my $Problem = &Apache::lonnet::symbclean( &Apache::lonnet::declutter($hash{'map_id_'.$partA}). '___'.$partB.'___'. @@ -341,38 +361,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) { @@ -381,6 +416,7 @@ sub ProcessTopResourceMap { $lastResourceID=pop(@finishResource); if(defined($cache->{$currentSequence.':problems'})) { + $sequenceCount2++; # Capture sequence information here $cache->{$currentSequence.':title'}= $hash{'title_'.$currentResourceID}; @@ -421,23 +457,34 @@ 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 $currentResourceID=pop(@currentResource); } + $cache->{'jasoncount'}=$problemCount; + $cache->{'jasoncount2'}=$problemCount2; + $cache->{'jasonseq'}=$sequenceCount; + $cache->{'jasonseq2'}=$sequenceCount2; unless (untie(%hash)) { &Apache::lonnet::logthis("WARNING: ". "Could not untie coursemap $fn (browse)". @@ -513,6 +560,7 @@ 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'; @@ -559,6 +607,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; @@ -769,9 +828,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;