version 1.40, 2002/12/11 21:41:02
|
version 1.46, 2003/02/13 22:52:48
|
Line 218 sub DownloadCourseInformation {
|
Line 218 sub DownloadCourseInformation {
|
$courseID.'.db', |
$courseID.'.db', |
$Apache::lonnet::perlvar{'lonUsersDir'}); |
$Apache::lonnet::perlvar{'lonUsersDir'}); |
|
|
if($lastDownloadTime >= $modifiedTime && $modifiedTime >= 0) { |
if($lastDownloadTime ne 'Not downloaded' && |
|
$lastDownloadTime >= $modifiedTime && $modifiedTime >= 0) { |
# Data is not gathered so return UpToDate as true. This |
# Data is not gathered so return UpToDate as true. This |
# will be interpreted in ProcessClasslist |
# will be interpreted in ProcessClasslist |
$courseData{$namedata.':lastDownloadTime'}=time; |
$courseData{$namedata.':lastDownloadTime'}=time; |
Line 260 with stopping downloading then can not t
|
Line 261 with stopping downloading then can not t
|
|
|
# ----- PROCESSING FUNCTIONS --------------------------------------- |
# ----- PROCESSING FUNCTIONS --------------------------------------- |
|
|
|
|
|
|
|
=pod |
|
|
|
=item &get_sequence_assessment_data() |
|
|
|
AT THIS TIME THE USE OF THIS FUNCTION IS *NOT* RECOMMENDED |
|
|
|
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', |
|
source => '/s/o/u/r/c/e', |
|
type => (container|assessment), |
|
contents => [ {},{},{},{} ], # only for container |
|
parts => [11,13,15], # only for assessment |
|
response_ids => [12,14,16] # only for assessment |
|
} |
|
|
|
$hash->{'contents'} is a reference to an array of hashes of the same structure. |
|
|
|
=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", |
|
1,0); |
|
if (!defined($navmap)) { |
|
return 'Can not open Coursemap'; |
|
} |
|
my $iterator = $navmap->getIterator(undef, undef, undef, 1); |
|
## |
|
## 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 $curRes = $iterator->next(); # BEGIN_MAP |
|
$curRes = $iterator->next(); # The sequence itself |
|
# |
|
my $title = $curRes->title(); |
|
my $symb = $curRes->symb(); |
|
my $src = $curRes->src(); |
|
# |
|
my @Nested_Sequences = (); # Stack of sequences, keeps track of depth |
|
my $top = { title => $title, |
|
symb => $symb, |
|
type => 'container', |
|
num_assess => 0, |
|
contents => [], }; |
|
push (@Nested_Sequences, $top); |
|
# |
|
# We need to keep track of which sequences contain homework problems |
|
# |
|
while (scalar(@Nested_Sequences)) { |
|
$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(); |
|
my $newmap = { title => $title, |
|
src => $src, |
|
symb => $symb, |
|
type => 'container', |
|
num_assess => 0, |
|
contents => [], |
|
}; |
|
push (@{$currentmap->{'contents'}},$newmap); # this is permanent |
|
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->randomout); |
|
# Okay, from here on out we only deal with assessments |
|
$title = $curRes->title(); |
|
$symb = $curRes->symb(); |
|
$src = $curRes->src(); |
|
my $parts = $curRes->parts(); |
|
my $assessment = { title => $title, |
|
src => $src, |
|
symb => $symb, |
|
type => 'assessment', |
|
}; |
|
push(@{$currentmap->{'contents'}},$assessment); |
|
$currentmap->{'num_assess'}++; |
|
} |
|
return $top; |
|
} |
|
|
=pod |
=pod |
|
|
=item &ProcessTopResourceMap() |
=item &ProcessTopResourceMap() |
Line 519 sub ProcessTopResourceMap {
|
Line 623 sub ProcessTopResourceMap {
|
# big problem, need to handle. Next is probably wrong |
# big problem, need to handle. Next is probably wrong |
my $errorMessage = 'Big problem in '; |
my $errorMessage = 'Big problem in '; |
$errorMessage .= 'loncoursedata::ProcessTopLevelMap.'; |
$errorMessage .= 'loncoursedata::ProcessTopLevelMap.'; |
$errorMessage .= ' bighash to_$currentResourceID not defined!'; |
$errorMessage .= " bighash to_$currentResourceID not defined!"; |
&Apache::lonnet::logthis($errorMessage); |
&Apache::lonnet::logthis($errorMessage); |
last; |
if (!defined($currentResourceID)) {last;} |
} |
} |
my @nextResources=(); |
my @nextResources=(); |
foreach (split(/\,/,$hash{'to_'.$currentResourceID})) { |
foreach (split(/\,/,$hash{'to_'.$currentResourceID})) { |
Line 1180 sub DownloadStudentCourseData {
|
Line 1284 sub DownloadStudentCourseData {
|
my $WhatIWant; |
my $WhatIWant; |
$WhatIWant = '(^version:|'; |
$WhatIWant = '(^version:|'; |
$WhatIWant .= '^\d+:.+?:(resource\.\d+\.'; |
$WhatIWant .= '^\d+:.+?:(resource\.\d+\.'; |
$WhatIWant .= '(solved|tries|previous|awarded|(\d+\.submission))\s*$'; |
$WhatIWant .= '(solved|tries|previous|awarded|(\d+\.submission))\s*$';#' |
$WhatIWant .= '|timestamp)'; |
$WhatIWant .= '|timestamp)'; |
$WhatIWant .= ')'; |
$WhatIWant .= ')'; |
# $WhatIWant = '.'; |
# $WhatIWant = '.'; |
Line 1243 sub DownloadStudentCourseData {
|
Line 1347 sub DownloadStudentCourseData {
|
|
|
sub DownloadStudentCourseDataSeparate { |
sub DownloadStudentCourseDataSeparate { |
my ($students,$checkDate,$cacheDB,$extract,$status,$courseID,$r,$c)=@_; |
my ($students,$checkDate,$cacheDB,$extract,$status,$courseID,$r,$c)=@_; |
my $residualFile = '/home/httpd/perl/tmp/'.$courseID.'DownloadFile.db'; |
my $residualFile = $Apache::lonnet::tmpdir.$courseID.'DownloadFile.db'; |
my $title = 'LON-CAPA Statistics'; |
my $title = 'LON-CAPA Statistics'; |
my $heading = 'Download Course Data'; |
my $heading = 'Download Course Data'; |
|
|
my $WhatIWant; |
my $WhatIWant; |
$WhatIWant = '(^version:|'; |
$WhatIWant = '(^version:|'; |
$WhatIWant .= '^\d+:.+?:(resource\.\d+\.'; |
$WhatIWant .= '^\d+:.+?:(resource\.\d+\.'; |
$WhatIWant .= '(solved|tries|previous|awarded|(\d+\.submission))\s*$'; |
$WhatIWant .= '(solved|tries|previous|awarded|(\d+\.submission))\s*$';#' |
$WhatIWant .= '|timestamp)'; |
$WhatIWant .= '|timestamp)'; |
$WhatIWant .= ')'; |
$WhatIWant .= ')'; |
|
|
Line 1324 sub DownloadStudentCourseDataSeparate {
|
Line 1428 sub DownloadStudentCourseDataSeparate {
|
sub CheckForResidualDownload { |
sub CheckForResidualDownload { |
my ($cacheDB,$extract,$status,$courseID,$r,$c)=@_; |
my ($cacheDB,$extract,$status,$courseID,$r,$c)=@_; |
|
|
my $residualFile = '/home/httpd/perl/tmp/'.$courseID.'DownloadFile.db'; |
my $residualFile = $Apache::lonnet::tmpdir.$courseID.'DownloadFile.db'; |
if(!-e $residualFile) { |
if(!-e $residualFile) { |
return 'OK'; |
return 'OK'; |
} |
} |
Line 1388 sub CheckForResidualDownload {
|
Line 1492 sub CheckForResidualDownload {
|
return 'OK'; |
return 'OK'; |
} |
} |
|
|
|
|
|
################################################ |
|
################################################ |
|
|
|
=pod |
|
|
|
=item &get_current_state($sname,$sdom,$symb,$courseid); |
|
|
|
Retrive the current status of a students performance. $sname and |
|
$sdom are the only required parameters. If $symb is undef the results |
|
of a &Apache::lonnet::currentdump() will be returned. |
|
If $courseid is undef it will be retrieved from the environment. |
|
|
|
The return structure is based on &Apache::lonnet::currentdump. If |
|
$symb is unspecified, all the students data is returned in a hash of |
|
the form: |
|
( |
|
symb1 => { param1 => value1, param2 => value2 ... }, |
|
symb2 => { param1 => value1, param2 => value2 ... }, |
|
) |
|
|
|
If $symb is specified, a hash of |
|
( |
|
param1 => value1, |
|
param2 => value2, |
|
) |
|
is returned. |
|
|
|
Eventually this routine will cache the results locally. |
|
|
|
If no data is found for $symb, or if the student has not performance data, |
|
an empty list is returned. |
|
|
|
=cut |
|
|
|
################################################ |
|
################################################ |
|
|
|
sub get_current_state { |
|
my ($sname,$sdom,$symb,$courseid)=@_; |
|
return undef if (! defined($sname) || ! defined($sdom)); |
|
$courseid = $ENV{'request.course.id'} if (! defined($courseid)); |
|
# For a first pass, just get a currentdump and return the requested |
|
# results |
|
my @tmp = &Apache::lonnet::currentdump($courseid,$sdom,$sname); |
|
if (! ((scalar(@tmp) > 0) && ($tmp[0] !~ /^error:/)) ) { |
|
&Apache::lonnet::logthis('error getting data for '.$sname.':'.$sdom. |
|
'in course '.$courseid); |
|
return (); |
|
} |
|
my %student_data = @tmp; |
|
if (! defined($symb)) { |
|
return %student_data; |
|
} elsif (exists($student_data{$symb})) { |
|
return %{$student_data{$symb}}; |
|
} else { |
|
return (); |
|
} |
|
} |
|
|
################################################ |
################################################ |
################################################ |
################################################ |
|
|