--- loncom/interface/loncoursedata.pm 2002/09/17 15:34:42 1.32 +++ loncom/interface/loncoursedata.pm 2003/02/05 01:39:32 1.44 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: loncoursedata.pm,v 1.32 2002/09/17 15:34:42 matthew Exp $ +# $Id: loncoursedata.pm,v 1.44 2003/02/05 01:39:32 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -139,7 +139,7 @@ sub DownloadClasslist { %classlist=&Apache::lonnet::dump('classlist',$courseDomain, $courseNumber); foreach(keys (%classlist)) { if(/^(con_lost|error|no_such_host)/i) { - return \%classlist; + return; } } @@ -218,7 +218,8 @@ sub DownloadCourseInformation { $courseID.'.db', $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 # will be interpreted in ProcessClasslist $courseData{$namedata.':lastDownloadTime'}=time; @@ -310,6 +311,7 @@ sub ProcessTopResourceMap { } my $oldkeys; + delete $cache->{'OptionResponses'}; if(defined($cache->{'ResourceKeys'})) { $oldkeys = $cache->{'ResourceKeys'}; foreach (split(':::', $cache->{'ResourceKeys'})) { @@ -487,9 +489,9 @@ sub ProcessTopResourceMap { } my @titleLength=split(//,$cache->{$currentSequence. ':title'}); - # $extra is 3 for problems correct and 3 for space + # $extra is 5 for problems correct and 3 for space # between problems correct and problem output - my $extra = 6; + my $extra = 8; if(($totalProblems + $extra) > (scalar @titleLength)) { $cache->{$currentSequence.':columnWidth'}= $totalProblems + $extra; @@ -518,9 +520,9 @@ sub ProcessTopResourceMap { # big problem, need to handle. Next is probably wrong my $errorMessage = 'Big problem in '; $errorMessage .= 'loncoursedata::ProcessTopLevelMap.'; - $errorMessage .= ' bighash to_$currentResourceID not defined!'; + $errorMessage .= " bighash to_$currentResourceID not defined!"; &Apache::lonnet::logthis($errorMessage); - last; + if (!defined($currentResourceID)) {last;} } my @nextResources=(); foreach (split(/\,/,$hash{'to_'.$currentResourceID})) { @@ -1084,37 +1086,22 @@ sub ProcessFullName { my ($lastname, $generation, $firstname, $middlename)=@_; my $Str = ''; + # Strip whitespace preceeding & following name components. + $lastname =~ s/(\s+$|^\s+)//g; + $generation =~ s/(\s+$|^\s+)//g; + $firstname =~ s/(\s+$|^\s+)//g; + $middlename =~ s/(\s+$|^\s+)//g; + if($lastname ne '') { - $Str .= $lastname.' '; - if($generation ne '') { - $Str .= $generation; - } else { - chop($Str); - } - $Str .= ', '; - if($firstname ne '') { - $Str .= $firstname.' '; - } - if($middlename ne '') { - $Str .= $middlename; - } else { - chop($Str); - if($firstname eq '') { - chop($Str); - } - } + $Str .= $lastname; + $Str .= ' '.$generation if ($generation ne ''); + $Str .= ','; + $Str .= ' '.$firstname if ($firstname ne ''); + $Str .= ' '.$middlename if ($middlename ne ''); } else { - if($firstname ne '') { - $Str .= $firstname.' '; - } - if($middlename ne '') { - $Str .= $middlename.' '; - } - if($generation ne '') { - $Str .= $generation; - } else { - chop($Str); - } + $Str .= $firstname if ($firstname ne ''); + $Str .= ' '.$middlename if ($middlename ne ''); + $Str .= ' '.$generation if ($generation ne ''); } return $Str; @@ -1194,7 +1181,7 @@ sub DownloadStudentCourseData { my $WhatIWant; $WhatIWant = '(^version:|'; $WhatIWant .= '^\d+:.+?:(resource\.\d+\.'; - $WhatIWant .= '(solved|tries|previous|awarded|(\d+\.submission))\s*$'; + $WhatIWant .= '(solved|tries|previous|awarded|(\d+\.submission))\s*$';#' $WhatIWant .= '|timestamp)'; $WhatIWant .= ')'; # $WhatIWant = '.'; @@ -1402,7 +1389,95 @@ sub CheckForResidualDownload { return 'OK'; } +################################################ +################################################ + +=pod + +=item &get_classlist(); + +Retrieve the classist of a given class or of the current class. Student +information is returned from the classlist.db file and, if needed, +from the students environment. + +Optional arguments are $cid, $cdom, and $cnum (course id, course domain, +and course number, respectively). Any omitted arguments will be taken +from the current environment ($ENV{'request.course.id'}, +$ENV{'course.'.$cid.'.domain'}, and $ENV{'course.'.$cid.'.num'}). + +Returns a reference to a hash which contains: + keys '$sname:$sdom' + values [$end,$start,$id,$section,$fullname] + +=cut + +################################################ +################################################ + +sub get_classlist { + my ($cid,$cdom,$cnum) = @_; + $cid = $cid || $ENV{'request.course.id'}; + $cdom = $cdom || $ENV{'course.'.$cid.'.domain'}; + $cnum = $cnum || $ENV{'course.'.$cid.'.num'}; + my $now = time; + # + my %classlist=&Apache::lonnet::dump('classlist',$cdom,$cnum); + while (my ($student,$info) = each(%classlist)) { + return undef if ($student =~ /^(con_lost|error|no_such_host)/i); + my ($sname,$sdom) = split(/:/,$student); + my @Values = split(/:/,$info); + my ($end,$start,$id,$section,$fullname); + if (@Values > 2) { + ($end,$start,$id,$section,$fullname) = @Values; + } else { # We have to get the data ourselves + ($end,$start) = @Values; + $section = &Apache::lonnet::getsection($sdom,$sname,$cid); + my %info=&Apache::lonnet::get('environment', + ['firstname','middlename', + 'lastname','generation','id'], + $sdom, $sname); + my ($tmp) = keys(%info); + if ($tmp =~/^(con_lost|error|no_such_host)/i) { + $fullname = 'not available'; + $id = 'not available'; + &Apache::lonnet::logthis('unable to retrieve environment '. + 'for '.$sname.':'.$sdom); + } else { + $fullname = &ProcessFullName(@info{qw/lastname generation + firstname middlename/}); + $id = $info{'id'}; + } + # Update the classlist with this students information + if ($fullname ne 'not available') { + my $enrolldata = join(':',$end,$start,$id,$section,$fullname); + my $reply=&Apache::lonnet::cput('classlist', + {$student => $enrolldata}, + $cdom,$cnum); + if ($reply !~ /^(ok|delayed)/) { + &Apache::lonnet::logthis('Unable to update classlist for '. + 'student '.$sname.':'.$sdom. + ' error:'.$reply); + } + } + } + my $status='Expired'; + if(((!$end) || $now < $end) && ((!$start) || ($now > $start))) { + $status='Active'; + } + $classlist{$student} = + [$sdom,$sname,$end,$start,$id,$section,$fullname,$status]; + } + if (wantarray()) { + return (\%classlist,['domain','username','end','start','id', + 'section','fullname','status']); + } else { + return \%classlist; + } +} + # ----- END HELPER FUNCTIONS -------------------------------------------- 1; __END__ + +