version 1.71, 2002/10/08 20:39:43
|
version 1.73, 2002/10/11 18:39:55
|
Line 1
|
Line 1
|
|
|
# The LearningOnline Network with CAPA |
# The LearningOnline Network with CAPA |
# Navigate Maps Handler |
# Navigate Maps Handler |
# |
# |
Line 44 use strict;
|
Line 45 use strict;
|
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use Apache::lonnet(); |
use Apache::lonnet(); |
use Apache::loncommon(); |
use Apache::loncommon(); |
use HTML::TokeParser; |
|
use GDBM_File; |
use GDBM_File; |
|
use POSIX qw (floor strftime); |
|
|
# -------------------------------------------------------------- Module Globals |
# -------------------------------------------------------------- Module Globals |
my %hash; |
my %hash; |
Line 842 sub new_handle {
|
Line 843 sub new_handle {
|
$r->rflush(); |
$r->rflush(); |
if ($navmap->{LAST_CHECK}) { |
if ($navmap->{LAST_CHECK}) { |
$r->print('<img src="/adm/lonMisc/chat.gif"> New discussion since '. |
$r->print('<img src="/adm/lonMisc/chat.gif"> New discussion since '. |
timeToHumanString($navmap->{LAST_CHECK}). |
strftime("%A, %b %e at %I:%M %P", localtime($navmap->{LAST_CHECK})). |
'<br><img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>'); |
'<br><img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>'); |
} else { |
} else { |
$r->print('<img src="/adm/lonMisc/chat.gif"> Discussions'. |
$r->print('<img src="/adm/lonMisc/chat.gif"> Discussions'. |
Line 930 sub new_handle {
|
Line 931 sub new_handle {
|
} |
} |
|
|
my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash, $condition); |
my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash, $condition); |
my $curRes = $mapIterator->next(); |
|
undef $res; # so we don't accidentally use it later |
undef $res; # so we don't accidentally use it later |
my $indentLevel = -1; |
my $indentLevel = 0; |
my $indentString = "<img src=\"/adm/lonIcons/whitespace1.gif\" width=\"25\" height=\"1\" alt=\"\" border=\"0\" />"; |
my $indentString = "<img src=\"/adm/lonIcons/whitespace1.gif\" width=\"25\" height=\"1\" alt=\"\" border=\"0\" />"; |
|
|
my $isNewBranch = 0; |
my $isNewBranch = 0; |
my $now = time(); |
my $now = time(); |
my $in24Hours = $now + 24 * 60 * 60; |
my $in24Hours = $now + 24 * 60 * 60; |
|
my $depth = 1; |
|
|
while ($curRes != $mapIterator->END_MAP()) { |
# We know the first thing is a BEGIN_MAP (see "$self->{STARTED}" |
|
# code in iterator->next), so ignore the first one |
|
$mapIterator->next(); |
|
my $curRes = $mapIterator->next(); |
|
|
|
while ($depth > 0) { |
if ($curRes == $mapIterator->BEGIN_MAP() || |
if ($curRes == $mapIterator->BEGIN_MAP() || |
$curRes == $mapIterator->BEGIN_BRANCH()) { |
$curRes == $mapIterator->BEGIN_BRANCH()) { |
$indentLevel++; |
$indentLevel++; |
Line 951 sub new_handle {
|
Line 957 sub new_handle {
|
if ($curRes == $mapIterator->BEGIN_BRANCH()) { |
if ($curRes == $mapIterator->BEGIN_BRANCH()) { |
$isNewBranch = 1; |
$isNewBranch = 1; |
} |
} |
|
if ($curRes == $mapIterator->BEGIN_MAP()) { |
|
$depth++; |
|
} |
|
if ($curRes == $mapIterator->END_MAP()) { |
|
$depth--; |
|
} |
|
|
# Is this resource being blotted out? |
# Is this resource being blotted out? |
if (ref($curRes) && !advancedUser() && $curRes->randomout()) { |
if (ref($curRes) && !advancedUser() && $curRes->randomout()) { |
Line 1258 sub getDescription {
|
Line 1270 sub getDescription {
|
return "Not currently assigned."; |
return "Not currently assigned."; |
} |
} |
if ($status == $res->OPEN_LATER) { |
if ($status == $res->OPEN_LATER) { |
return "Opens: " . timeToHumanString($res->opendate($part)); |
return "Open " . timeToHumanString($res->opendate($part)); |
} |
} |
if ($status == $res->OPEN) { |
if ($status == $res->OPEN) { |
if ($res->duedate()) { |
if ($res->duedate()) { |
return "Due: $status " . timeToHumanString($res->duedate($part)); |
return "Due " . timeToHumanString($res->duedate($part)); |
} else { |
} else { |
return "Open, no due date"; |
return "Open, no due date"; |
} |
} |
} |
} |
if ($status == $res->PAST_DUE_ANSWER_LATER) { |
if ($status == $res->PAST_DUE_ANSWER_LATER) { |
return "Answer opens: " . timeToHumanString($res->answerdate($part)); |
return "Answer open " . timeToHumanString($res->answerdate($part)); |
} |
} |
if ($status == $res->PAST_DUE_NO_ANSWER) { |
if ($status == $res->PAST_DUE_NO_ANSWER) { |
return "Was Due: " . timeToHumanString($res->duedate($part)); |
return "Was due " . timeToHumanString($res->duedate($part)); |
} |
} |
if ($status == $res->ANSWER_OPEN) { |
if ($status == $res->ANSWER_OPEN) { |
return "Answer available"; |
return "Answer available"; |
Line 1287 sub getDescription {
|
Line 1299 sub getDescription {
|
my $maxtries = $res->maxtries(); |
my $maxtries = $res->maxtries(); |
my $triesString = "($tries of $maxtries tries used)"; |
my $triesString = "($tries of $maxtries tries used)"; |
if ($res->duedate()) { |
if ($res->duedate()) { |
return "Due: $status " . timeToHumanString($res->duedate($part)) . |
return "Due " . timeToHumanString($res->duedate($part)) . |
" $triesString"; |
" $triesString"; |
} else { |
} else { |
return "No due date $triesString"; |
return "No due date $triesString"; |
Line 1299 sub advancedUser {
|
Line 1311 sub advancedUser {
|
return $ENV{'user.adv'}; |
return $ENV{'user.adv'}; |
} |
} |
|
|
# I want to change this into something more human-friendly. For |
|
# now, this is a simple call to localtime. The final function |
# timeToHumanString takes a time number and converts it to a |
# probably belongs in loncommon. |
# human-readable representation, meant to be used in the following |
|
# manner: |
|
# print "Due $timestring" |
|
# print "Open $timestring" |
|
# print "Answer available $timestring" |
|
# Very, very, very, VERY English-only... goodness help a localizer on |
|
# this func... |
sub timeToHumanString { |
sub timeToHumanString { |
my ($time) = @_; |
my ($time) = @_; |
# zero, '0' and blank are bad times |
# zero, '0' and blank are bad times |
if ($time) { |
if (!$time) { |
return localtime($time); |
return 'never'; |
} else { |
} |
return 'Never'; |
|
|
my $now = time(); |
|
|
|
my @time = localtime($time); |
|
my @now = localtime($now); |
|
|
|
# Positive = future |
|
my $delta = $time - $now; |
|
|
|
my $minute = 60; |
|
my $hour = 60 * $minute; |
|
my $day = 24 * $hour; |
|
my $week = 7 * $day; |
|
my $inPast = 0; |
|
|
|
# Logic in comments: |
|
# Is it now? (extremely unlikely) |
|
if ( $delta == 0 ) { |
|
return "this instant"; |
|
} |
|
|
|
if ($delta < 0) { |
|
$inPast = 1; |
|
$delta = -$delta; |
|
} |
|
|
|
# Is it in the future? |
|
if ( $delta > 0 ) { |
|
# Is it less then a minute away? |
|
my $tense = $inPast ? " ago" : ""; |
|
my $prefix = $inPast ? "" : "in "; |
|
if ( $delta < $minute ) { |
|
if ($delta == 1) { return "${prefix}1 second$tense"; } |
|
return "$prefix$delta seconds$tense"; |
|
} |
|
|
|
# Is it less then an hour away? |
|
if ( $delta < $hour ) { |
|
# If so, use minutes |
|
my $minutes = floor($delta / 60); |
|
if ($minutes == 1) { return "${prefix}1 minute$tense"; } |
|
return "$prefix$minutes minutes$tense"; |
|
} |
|
|
|
# Is it less then 24 hours away? If so, |
|
# display hours + minutes |
|
if ( $delta < $hour * 24) { |
|
my $hours = floor($delta / $hour); |
|
my $minutes = floor(($delta % $hour) / $minute); |
|
my $hourString = "$hours hours"; |
|
my $minuteString = ", $minutes minutes"; |
|
if ($hours == 1) { |
|
$hourString = "1 hour"; |
|
} |
|
if ($minutes == 1) { |
|
$minuteString = ", 1 minute"; |
|
} |
|
if ($minutes == 0) { |
|
$minuteString = ""; |
|
} |
|
return "$prefix$hourString$minuteString$tense"; |
|
} |
|
|
|
# Less then 5 days away, display day of the week and |
|
# HH:MM |
|
if ( $delta < $day * 5 ) { |
|
my $timeStr = strftime("%A at %I:%M %P", localtime($time)); |
|
$timeStr =~ s/12:00 am/midnight/; |
|
$timeStr =~ s/12:00 pm/noon/; |
|
return ($inPast ? "last " : "next ") . |
|
$timeStr; |
|
} |
|
|
|
# Is it this year? |
|
if ( $time[5] == $now[5]) { |
|
# Return on Month Day, HH:MM meridian |
|
my $timeStr = strftime("on %A, %b %e at %I:%M %P", localtime($time)); |
|
$timeStr =~ s/12:00 am/midnight/; |
|
$timeStr =~ s/12:00 pm/noon/; |
|
return $timeStr; |
|
} |
|
|
|
# Not this year, so show the year |
|
my $timeStr = strftime("on %A, %b %e %G at %I:%M %P", localtime($time)); |
|
$timeStr =~ s/12:00 am/midnight/; |
|
$timeStr =~ s/12:00 pm/noon/; |
|
return $timeStr; |
} |
} |
} |
} |
|
|