version 1.509.2.14.2.6, 2023/01/20 22:45:51
|
version 1.509.2.14.2.8, 2023/05/27 12:40:25
|
Line 534 my %colormap =
|
Line 534 my %colormap =
|
$resObj->EXCUSED => '#3333FF', |
$resObj->EXCUSED => '#3333FF', |
$resObj->PAST_DUE_ANSWER_LATER => '', |
$resObj->PAST_DUE_ANSWER_LATER => '', |
$resObj->PAST_DUE_NO_ANSWER => '', |
$resObj->PAST_DUE_NO_ANSWER => '', |
|
$resObj->PAST_DUE_ATMPT_ANS => '', |
|
$resObj->PAST_DUE_ATMPT_NOANS => '', |
|
$resObj->PAST_DUE_NO_ATMT_ANS => '', |
|
$resObj->PAST_DUE_NO_ATMT_NOANS => '', |
$resObj->ANSWER_OPEN => '#006600', |
$resObj->ANSWER_OPEN => '#006600', |
$resObj->OPEN_LATER => '', |
$resObj->OPEN_LATER => '', |
$resObj->TRIES_LEFT => '', |
$resObj->TRIES_LEFT => '', |
Line 679 sub getDescription {
|
Line 683 sub getDescription {
|
return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part).$slotinfo; |
return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part).$slotinfo; |
} |
} |
} |
} |
if ($status == $res->PAST_DUE_ANSWER_LATER) { |
if (($status == $res->PAST_DUE_ANSWER_LATER) || ($status == $res->PAST_DUE_ATMPT_ANS) || ($status == $res->PAST_DUE_NO_ATMT_ANS)) { |
return &mt("Answer open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($answer,'start'),$res->symb(),'answerdate',$part)); |
return &mt("Answer open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($answer,'start'),$res->symb(),'answerdate',$part)); |
} |
} |
if ($status == $res->PAST_DUE_NO_ANSWER) { |
if (($status == $res->PAST_DUE_NO_ANSWER) || ($status == $res->PAST_DUE_ATMPT_NOANS) || ($status == $res->PAST_DUE_NO_ATMT_NOANS)) { |
if ($res->is_practice()) { |
if ($res->is_practice()) { |
return &mt("Closed [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'answerdate,duedate',$part)); |
return &mt("Closed [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'answerdate,duedate',$part)); |
} else { |
} else { |
Line 1705 END
|
Line 1709 END
|
# mark as hidden for users who have $userCanSeeHidden. |
# mark as hidden for users who have $userCanSeeHidden. |
# Use DFS for speed, since structure actually doesn't matter, |
# Use DFS for speed, since structure actually doesn't matter, |
# except what map has what resources. |
# except what map has what resources. |
|
# |
|
# To ensure the "Selected Resources from selected folder in course" |
|
# printout generation option will work in sessions launched via a |
|
# deep link, the value of $args->{'filterFunc'} included in the |
|
# call to lonnavmaps::render() is omitted from the filter function |
|
# used with the DFS Iterator when $args->{'caller'} is 'printout'. |
|
# |
|
# As a result $sequence->{DATA}->{HAS_VISIBLE_CHILDREN} can be |
|
# set to 1 for folder(s) which include resources only accessible |
|
# for sessions launched via a deep link, when the current session |
|
# is of that type. |
|
|
my $dfsit = Apache::lonnavmaps::DFSiterator->new($navmap, |
my $dfsit = Apache::lonnavmaps::DFSiterator->new($navmap, |
$it->{FIRST_RESOURCE}, |
$it->{FIRST_RESOURCE}, |
$it->{FINISH_RESOURCE}, |
$it->{FINISH_RESOURCE}, |
{}, undef, 1); |
{}, undef, 1); |
|
|
|
my $dfsFilterFunc; |
|
if ($args->{'caller'} eq 'printout') { |
|
$dfsFilterFunc = sub { my $res = shift; return !$res->randomout() && |
|
($res->deeplink($args->{'caller'}) ne 'absent') && |
|
($res->deeplink($args->{'caller'}) ne 'grades') && |
|
!$res->deeplinkout();}; |
|
} else { |
|
$dfsFilterFunc = $filterFunc; |
|
} |
my $depth = 0; |
my $depth = 0; |
$dfsit->next(); |
$dfsit->next(); |
my $curRes = $dfsit->next(); |
my $curRes = $dfsit->next(); |
Line 1729 END
|
Line 1753 END
|
} elsif ($curRes->src()) { |
} elsif ($curRes->src()) { |
# Not a sequence: if it's filtered, ignore it, otherwise |
# Not a sequence: if it's filtered, ignore it, otherwise |
# rise up the stack and mark the sequences as having children |
# rise up the stack and mark the sequences as having children |
if (&$filterFunc($curRes)) { |
if (&$dfsFilterFunc($curRes)) { |
for my $sequence (@{$dfsit->getStack()}) { |
for my $sequence (@{$dfsit->getStack()}) { |
|
next unless ($sequence->is_map()); |
$sequence->{DATA}->{HAS_VISIBLE_CHILDREN} = 1; |
$sequence->{DATA}->{HAS_VISIBLE_CHILDREN} = 1; |
} |
} |
} |
} |
Line 5477 The problem will be opened later.
|
Line 5502 The problem will be opened later.
|
|
|
Open and not yet due. |
Open and not yet due. |
|
|
|
|
=item * B<PAST_DUE_ANSWER_LATER>: |
=item * B<PAST_DUE_ANSWER_LATER>: |
|
|
The due date has passed, but the answer date has not yet arrived. |
The due date has passed, but the answer date has not yet arrived. |
Line 5490 The due date has passed and there is no
|
Line 5514 The due date has passed and there is no
|
|
|
The answer date is here. |
The answer date is here. |
|
|
|
=item * B<NOTHING_SET>: |
|
|
|
No dates have been set for this problem at all. |
|
|
|
=item * B<PAST_DUE_ATMPT_ANS>: |
|
|
|
The due date has passed, feedback is suppressed, the problem was attempted, and the answer date has not yet arrived. |
|
|
|
=item * B<PAST_DUE_ATMPT_NOANS>: |
|
|
|
The due date has passed, feedback is suppressed, the problem was attempted, and there is no answer opening date set. |
|
|
|
=item * B<PAST_DUE_NO_ATMT_ANS>: |
|
|
|
The due date has passed, feedback is suppressed, the problem was not attempted, and the answer date has not yet arrived. |
|
|
|
=item * B<PAST_DUE_NO_ATMT_NOANS>: |
|
|
|
The due date has passed, feedback is suppressed, the problem was not attempted, and there is no answer opening date set. |
|
|
=item * B<NETWORK_FAILURE>: |
=item * B<NETWORK_FAILURE>: |
|
|
The information is unknown due to network failure. |
The information is unknown due to network failure. |
Line 5505 sub PAST_DUE_NO_ANSWER { return 2; }
|
Line 5549 sub PAST_DUE_NO_ANSWER { return 2; }
|
sub PAST_DUE_ANSWER_LATER { return 3; } |
sub PAST_DUE_ANSWER_LATER { return 3; } |
sub ANSWER_OPEN { return 4; } |
sub ANSWER_OPEN { return 4; } |
sub NOTHING_SET { return 5; } |
sub NOTHING_SET { return 5; } |
|
sub PAST_DUE_ATMPT_ANS { return 6; } |
|
sub PAST_DUE_ATMPT_NOANS { return 7; } |
|
sub PAST_DUE_NO_ATMT_ANS { return 8; } |
|
sub PAST_DUE_NO_ATMT_NOANS { return 9; } |
sub NETWORK_FAILURE { return 100; } |
sub NETWORK_FAILURE { return 100; } |
|
|
# getDateStatus gets the date status for a given problem part. |
# getDateStatus gets the date status for a given problem part. |
Line 5694 set.
|
Line 5742 set.
|
The problem is past due, not considered correct, and an answer date in |
The problem is past due, not considered correct, and an answer date in |
the future is set. |
the future is set. |
|
|
|
=item * B<PAST_DUE_ATMPT_ANS>: |
|
|
|
The problem is past due, feedback is suppressed, the problem was |
|
attempted and an answer date in the future is set. |
|
|
|
=item * B<PAST_DUE_ATMPT_NOANS>: |
|
|
|
The problem is past due, feedback is suppressed, the problem was |
|
attempted and no answer date is set. |
|
|
|
=item * B<PAST_DUE_NO_ATMT_ANS>: |
|
|
|
The problem is past due, feedback is suppressed, the problem was |
|
not attempted and an answer date in the future is set. |
|
|
|
=item * B<PAST_DUE_NO_ATMT_NOANS>: |
|
|
|
The problem is past due, feedback is suppressed, the problem was |
|
not attempted and no answer date is set. |
|
|
=item * B<ANSWER_OPEN>: |
=item * B<ANSWER_OPEN>: |
|
|
The problem is past due, not correct, and the answer is now available. |
The problem is past due, not correct, and the answer is now available. |
Line 5776 sub status {
|
Line 5844 sub status {
|
# There are a few whole rows we can dispose of: |
# There are a few whole rows we can dispose of: |
if ($completionStatus == CORRECT || |
if ($completionStatus == CORRECT || |
$completionStatus == CORRECT_BY_OVERRIDE ) { |
$completionStatus == CORRECT_BY_OVERRIDE ) { |
if ( $suppressFeedback ) { return ANSWER_SUBMITTED } |
if ( $suppressFeedback ) { |
|
if ($dateStatus == PAST_DUE_ANSWER_LATER || |
|
$dateStatus == PAST_DUE_NO_ANSWER ) { |
|
if ($dateStatus == PAST_DUE_ANSWER_LATER) { |
|
return PAST_DUE_ATMPT_ANS; |
|
} else { |
|
return PAST_DUE_ATMPT_NOANS; |
|
} |
|
} else { |
|
return ANSWER_SUBMITTED; |
|
} |
|
} |
my $awarded=$self->awarded($part); |
my $awarded=$self->awarded($part); |
if ($awarded < 1 && $awarded > 0) { |
if ($awarded < 1 && $awarded > 0) { |
return PARTIALLY_CORRECT; |
return PARTIALLY_CORRECT; |
Line 5815 sub status {
|
Line 5894 sub status {
|
|
|
if ($dateStatus == PAST_DUE_ANSWER_LATER || |
if ($dateStatus == PAST_DUE_ANSWER_LATER || |
$dateStatus == PAST_DUE_NO_ANSWER ) { |
$dateStatus == PAST_DUE_NO_ANSWER ) { |
return $suppressFeedback ? ANSWER_SUBMITTED : $dateStatus; |
if ($suppressFeedback) { |
|
if ($completionStatus == NOT_ATTEMPTED) { |
|
if ($dateStatus == PAST_DUE_ANSWER_LATER) { |
|
return PAST_DUE_NO_ATMT_ANS; |
|
} else { |
|
return PAST_DUE_NO_ATMT_NOANS; |
|
} |
|
} else { |
|
if ($dateStatus == PAST_DUE_ANSWER_LATER) { |
|
return PAST_DUE_ATMPT_ANS; |
|
} else { |
|
return PAST_DUE_ATMPT_NOANS; |
|
} |
|
} |
|
} else { |
|
return $dateStatus; |
|
} |
} |
} |
|
|
if ($dateStatus == ANSWER_OPEN) { |
if ($dateStatus == ANSWER_OPEN) { |
Line 6025 my %compositeToSimple =
|
Line 6120 my %compositeToSimple =
|
EXCUSED() => CORRECT, |
EXCUSED() => CORRECT, |
PAST_DUE_NO_ANSWER() => INCORRECT, |
PAST_DUE_NO_ANSWER() => INCORRECT, |
PAST_DUE_ANSWER_LATER() => INCORRECT, |
PAST_DUE_ANSWER_LATER() => INCORRECT, |
|
PAST_DUE_ATMPT_ANS() => ATTEMPTED, |
|
PAST_DUE_ATMPT_NOANS() => ATTEMPTED, |
|
PAST_DUE_NO_ATMT_ANS() => CLOSED, |
|
PAST_DUE_NO_ATMT_NOANS() => CLOSED, |
ANSWER_OPEN() => INCORRECT, |
ANSWER_OPEN() => INCORRECT, |
OPEN_LATER() => CLOSED, |
OPEN_LATER() => CLOSED, |
TRIES_LEFT() => OPEN, |
TRIES_LEFT() => OPEN, |