--- loncom/interface/lonnavmaps.pm 2002/09/24 03:48:18 1.53 +++ loncom/interface/lonnavmaps.pm 2002/09/24 20:01:05 1.54 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.53 2002/09/24 03:48:18 bowersj2 Exp $ +# $Id: lonnavmaps.pm,v 1.54 2002/09/24 20:01:05 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -833,16 +833,17 @@ sub new_handle { # Defines a status->color mapping, null string means don't color my %colormap = - ( $res->NETWORK_FAILURE => '', - $res->CORRECT => '#BBFFBB', - $res->EXCUSED => '#BBBBFF', - $res->PAST_DUE => '#FFAA00', - $res->ANSWER_OPEN => '#FF00AA', - $res->OPEN_LATER => '', - $res->TRIES_LEFT => '#FFFF00', - $res->INCORRECT => '#FFAA00', - $res->OPEN => '#FFFF88', - $res->NOTHING_SET => '' ); + ( $res->NETWORK_FAILURE => '', + $res->CORRECT => '#BBFFBB', + $res->EXCUSED => '#BBBBFF', + $res->PAST_DUE_ANSWER_LATER => '#FFAA00', + $res->PAST_DUE_NO_ANSWER => '#FFAA00', + $res->ANSWER_OPEN => '#FF00AA', + $res->OPEN_LATER => '', + $res->TRIES_LEFT => '#FFFF00', + $res->INCORRECT => '#FFAA00', + $res->OPEN => '#FFFF88', + $res->NOTHING_SET => '' ); if (!defined($navmap)) { my $requrl = $r->uri; @@ -1045,15 +1046,17 @@ sub getDescription { return "Opens: " . timeToHumanString($res->opendate($part)); } if ($status == $res->OPEN) { - return "Due: " . timeToHumanString($res->duedate($part)); + return "Due: $status " . timeToHumanString($res->duedate($part)); } - if ($status == $res->PAST_DUE) { - return "Answer: " . timeToHumanString($res->duedate($part)); + if ($status == $res->PAST_DUE_ANSWER_LATER) { + return "Answer: " . timeToHumanString($res->answerdate($part)); + } + if ($status == $res->PAST_DUE_NO_ANSWER) { + return "Was Due: " . timeToHumanString($res->duedate($part)); } if ($status == $res->ANSWER_OPEN) { return "Answer available"; } - } # I want to change this into something more human-friendly. For @@ -2024,7 +2027,9 @@ B =item * B: Open and not yet due. -=item * B: The due date has passed, but the answer date has not yet arrived. +=item * B: The due date has passed, but the answer date has not yet arrived. + +=item * B: The due date has passed and there is no answer opening date set. =item * B: The answer date is here. @@ -2035,17 +2040,27 @@ B =cut # Apparently the compiler optimizes these into constants automatically -sub OPEN_LATER { return 0; } -sub OPEN { return 1; } -sub PAST_DUE { return 2; } -sub ANSWER_OPEN { return 3; } -sub NOTHING_SET { return 4; } -sub NETWORK_FAILURE { return 100; } +sub OPEN_LATER { return 0; } +sub OPEN { return 1; } +sub PAST_DUE_NO_ANSWER { return 2; } +sub PAST_DUE_ANSWER_LATER { return 3; } +sub ANSWER_OPEN { return 4; } +sub NOTHING_SET { return 5; } +sub NETWORK_FAILURE { return 100; } + +# getDateStatus gets the date status for a given problem part. +# Because answer date, due date, and open date are fully independent +# (i.e., it is perfectly possible to *only* have an answer date), +# we have to completely cover the 3x3 maxtrix of (answer, due, open) x +# (past, future, none given). This function handles this with a decision +# tree. Read the comments to follow the decision tree. sub getDateStatus { my $self = shift; my $part = shift; $part = "0" if (!defined($part)); + + # Always return network failure if there was one. return $self->NETWORK_FAILURE if ($self->{NAV_MAP}->{NETWORK_FAILURE}); my $now = time(); @@ -2054,15 +2069,16 @@ sub getDateStatus { my $due = $self->duedate($part); my $answer = $self->answerdate($part); - if ($open && $now < $open) {return $self->OPEN_LATER}; - if ($due && $now < $due) {return $self->OPEN}; - if ($answer && $now < $answer) {return $self->PAST_DUE}; if (!$open && !$due && !$answer) { # no data on the problem at all # should this be the same as "open later"? think multipart. return $self->NOTHING_SET; } - return $self->ANSWER_OPEN; + if (!$open || $now < $open) {return $self->OPEN_LATER}; + if (!$due || $now < $due) {return $self->OPEN}; + if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER}; + if ($answer) { return $self->ANSWER_OPEN; }; + return PAST_DUE_NO_ANSWER; } =pod @@ -2140,7 +2156,9 @@ Along with directly returning the date o =item * EXCUSED: For any reason at all, the problem is excused. -=item * PAST_DUE: The problem is past due, and not considered correct. +=item * PAST_DUE_NO_ANSWER: The problem is past due, not considered correct, and no answer date is set. + +=item * PAST_DUE_ANSWER_LATER: The problem is past due, not considered correct, and an answer date in the future is set. =item * ANSWER_OPEN: The problem is past due, not correct, and the answer is now available. @@ -2167,7 +2185,7 @@ sub status { # What we have is a two-dimensional matrix with 4 entries on one # dimension and 5 entries on the other, which we want to colorize, - # plus network failure and "no date data". + # plus network failure and "no date data at all". if ($completionStatus == NETWORK_FAILURE) { return NETWORK_FAILURE; } @@ -2189,8 +2207,9 @@ sub status { # Now we're down to a 3 (incorrect, incorrect_override, not_attempted) # by 4 matrix (date status). - if ($dateStatus == PAST_DUE) { - return PAST_DUE; + if ($dateStatus == PAST_DUE_ANSWER_LATER || + $dateStatus == PAST_DUE_NO_ANSWER) { + return $dateStatus; } if ($dateStatus == ANSWER_OPEN) {