version 1.52, 2002/09/24 02:41:21
|
version 1.53, 2002/09/24 03:48:18
|
Line 841 sub new_handle {
|
Line 841 sub new_handle {
|
$res->OPEN_LATER => '', |
$res->OPEN_LATER => '', |
$res->TRIES_LEFT => '#FFFF00', |
$res->TRIES_LEFT => '#FFFF00', |
$res->INCORRECT => '#FFAA00', |
$res->INCORRECT => '#FFAA00', |
$res->OPEN => '#FFFF88' ); |
$res->OPEN => '#FFFF88', |
|
$res->NOTHING_SET => '' ); |
|
|
if (!defined($navmap)) { |
if (!defined($navmap)) { |
my $requrl = $r->uri; |
my $requrl = $r->uri; |
Line 863 sub new_handle {
|
Line 864 sub new_handle {
|
|
|
my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash); |
my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash); |
my $curRes = $mapIterator->next(); |
my $curRes = $mapIterator->next(); |
|
undef $res; # so we don't accidentally use it later |
my $indentLevel = -1; |
my $indentLevel = -1; |
my $indentString = " "; |
my $indentString = " "; |
|
|
Line 966 sub new_handle {
|
Line 968 sub new_handle {
|
|
|
if ($curRes->kind() eq "res" and |
if ($curRes->kind() eq "res" and |
$curRes->is_problem() ) { |
$curRes->is_problem() ) { |
$r->print (" Due: " . localtime($curRes->duedate())); |
$r->print (getDescription($curRes, $part)); |
} |
} |
} |
} |
} |
} |
Line 1024 sub getLinkForResource {
|
Line 1026 sub getLinkForResource {
|
return $res->src(); |
return $res->src(); |
} |
} |
|
|
|
# Convenience function: This seperates the logic of how to create |
|
# the problem text strings ("Due: DATE", "Open: DATE", "Not yet assigned", |
|
# etc.) into a seperate function. It takes a resource object as the |
|
# first parameter, and the part number of the resource as the second. |
|
# It's basically a big switch statement on the status of the resource. |
|
|
|
sub getDescription { |
|
my $res = shift; |
|
my $part = shift; |
|
my $status = $res->getDateStatus(); |
|
|
|
if ($status == $res->NETWORK_FAILURE) { return ""; } |
|
if ($status == $res->NOTHING_SET) { |
|
return "Not currently assigned."; |
|
} |
|
if ($status == $res->OPEN_LATER) { |
|
return "Opens: " . timeToHumanString($res->opendate($part)); |
|
} |
|
if ($status == $res->OPEN) { |
|
return "Due: " . timeToHumanString($res->duedate($part)); |
|
} |
|
if ($status == $res->PAST_DUE) { |
|
return "Answer: " . timeToHumanString($res->duedate($part)); |
|
} |
|
if ($status == $res->ANSWER_OPEN) { |
|
return "Answer available"; |
|
} |
|
|
|
} |
|
|
|
# I want to change this into something more human-friendly. For |
|
# now, this is a simple call to localtime. The final function |
|
# probably belongs in loncommon. |
|
sub timeToHumanString { |
|
return localtime(shift); |
|
} |
|
|
1; |
1; |
|
|
package Apache::lonnavmaps::navmap; |
package Apache::lonnavmaps::navmap; |
Line 2000 sub OPEN_LATER { return 0; }
|
Line 2039 sub OPEN_LATER { return 0; }
|
sub OPEN { return 1; } |
sub OPEN { return 1; } |
sub PAST_DUE { return 2; } |
sub PAST_DUE { return 2; } |
sub ANSWER_OPEN { return 3; } |
sub ANSWER_OPEN { return 3; } |
|
sub NOTHING_SET { return 4; } |
sub NETWORK_FAILURE { return 100; } |
sub NETWORK_FAILURE { return 100; } |
|
|
sub getDateStatus { |
sub getDateStatus { |
Line 2010 sub getDateStatus {
|
Line 2050 sub getDateStatus {
|
|
|
my $now = time(); |
my $now = time(); |
|
|
my $o = $now - $self->opendate($part); |
my $open = $self->opendate($part); |
my $d = $now - $self->duedate($part); |
my $due = $self->duedate($part); |
my $a = $now - $self->answerdate($part); |
my $answer = $self->answerdate($part); |
|
|
if ($o < 0) {return $self->OPEN_LATER}; |
if ($open && $now < $open) {return $self->OPEN_LATER}; |
if ($d < 0) {return $self->OPEN}; |
if ($due && $now < $due) {return $self->OPEN}; |
if ($a < 0) {return $self->PAST_DUE}; |
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; |
return $self->ANSWER_OPEN; |
} |
} |
|
|
Line 2052 B<Completion Codes>
|
Line 2097 B<Completion Codes>
|
|
|
=cut |
=cut |
|
|
sub NOT_ATTEMPTED { return 0; } |
sub NOT_ATTEMPTED { return 10; } |
sub INCORRECT { return 1; } |
sub INCORRECT { return 11; } |
sub INCORRECT_BY_OVERRIDE { return 2; } |
sub INCORRECT_BY_OVERRIDE { return 12; } |
sub CORRECT { return 3; } |
sub CORRECT { return 13; } |
sub CORRECT_BY_OVERRIDE { return 4; } |
sub CORRECT_BY_OVERRIDE { return 14; } |
sub EXCUSED { return 5; } |
sub EXCUSED { return 15; } |
|
|
sub getCompletionStatus { |
sub getCompletionStatus { |
my $self = shift; |
my $self = shift; |
Line 2089 Along with directly returning the date o
|
Line 2134 Along with directly returning the date o
|
|
|
=item * NETWORK_FAILURE: The network has failed and the information is not available. |
=item * NETWORK_FAILURE: The network has failed and the information is not available. |
|
|
|
=item * NOTHING_SET: No dates have been set for this problem (part) at all. (Because only certain parts of a multi-part problem may be assigned, this can not be collapsed into "open later", as we don't know a given part will EVER be opened.) |
|
|
=item * CORRECT: For any reason at all, the part is considered correct. |
=item * CORRECT: For any reason at all, the part is considered correct. |
|
|
=item * EXCUSED: For any reason at all, the problem is excused. |
=item * EXCUSED: For any reason at all, the problem is excused. |
Line 2120 sub status {
|
Line 2167 sub status {
|
|
|
# What we have is a two-dimensional matrix with 4 entries on one |
# 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, |
# dimension and 5 entries on the other, which we want to colorize, |
# plus network failure. |
# plus network failure and "no date data". |
|
|
# Don't colorize on network failure. |
if ($completionStatus == NETWORK_FAILURE) { return NETWORK_FAILURE; } |
if ($completionStatus == NETWORK_FAILURE()) { return $self->NETWORK_FAILURE(); } |
|
|
|
# There are a few whole rows we can dispose of: |
# There are a few whole rows we can dispose of: |
# If the problem is CORRECT, color it green no matter what |
if ($completionStatus == CORRECT || |
if ($completionStatus == CORRECT() || |
$completionStatus == CORRECT_BY_OVERRIDE ) { |
$completionStatus == CORRECT_BY_OVERRIDE() ) { |
return CORRECT(); |
return $self->CORRECT(); # Return a nice green. |
} |
|
|
|
# If it's EXCUSED, then return that no matter what |
|
if ($completionStatus == EXCUSED) { |
|
return EXCUSED; |
} |
} |
|
|
# If it's EXCUSED, then return something no matter what |
if ($dateStatus == NOTHING_SET) { |
if ($completionStatus == EXCUSED()) { |
return NOTHING_SET; |
return $self->EXCUSED(); # return a nice blue |
|
} |
} |
|
|
# Now we're down to a 3 (incorrect, incorrect_override, not_attempted) |
# Now we're down to a 3 (incorrect, incorrect_override, not_attempted) |
# by 4 matrix (date status). |
# by 4 matrix (date status). |
|
|
# If it's Past Due and we didn't bail earlier because it's correct, |
if ($dateStatus == PAST_DUE) { |
# color it orange. (Red is sort inappropriate; too drastic a color |
return PAST_DUE; |
# for something the student can't fix. |
|
if ($dateStatus == PAST_DUE()) { |
|
return $self->PAST_DUE(); # return orange |
|
} |
} |
|
|
if ($dateStatus == ANSWER_OPEN()) { |
if ($dateStatus == ANSWER_OPEN) { |
return $self->ANSWER_OPEN(); |
return ANSWER_OPEN; |
} |
} |
|
|
# Now: (incorrect, incorrect_override, not_attempted) x |
# Now: (incorrect, incorrect_override, not_attempted) x |
# (open_later), (open) |
# (open_later), (open) |
|
|
# If it's open later, then don't colorize |
if ($dateStatus == OPEN_LATER) { |
if ($dateStatus == OPEN_LATER()) { |
return OPEN_LATER; |
return $self->OPEN_LATER(); |
|
} |
} |
|
|
# If it's WRONG... |
# If it's WRONG... |
if ($completionStatus == INCORRECT() || $completionStatus == INCORRECT_BY_OVERRIDE()) { |
if ($completionStatus == INCORRECT || $completionStatus == INCORRECT_BY_OVERRIDE) { |
# and there are TRIES LEFT: |
# and there are TRIES LEFT: |
if ($self->tries() < $self->maxtries()) { |
if ($self->tries() < $self->maxtries()) { |
return $self->TRIES_LEFT(); # return red: The student can fix this |
return TRIES_LEFT; |
} |
} |
return $self->INCORRECT(); # otherwise, return orange; student can't fix this |
return INCORRECT; # otherwise, return orange; student can't fix this |
} |
} |
|
|
# Otherwise, it's untried and open |
# Otherwise, it's untried and open |
return $self->OPEN(); # Light yellow |
return OPEN; |
} |
} |
|
|
=pod |
=pod |