version 1.575, 2025/05/27 23:31:49
|
version 1.577, 2025/06/28 17:34:00
|
Line 425 Convenience function, so others can use
|
Line 425 Convenience function, so others can use
|
Convenience function, so others can use it: Is there only one try remaining for the |
Convenience function, so others can use it: Is there only one try remaining for the |
part, with more than one try to begin with, not due yet and still can be done? |
part, with more than one try to begin with, not due yet and still can be done? |
|
|
|
=item graceEndsUnder24Hours() |
|
|
|
Convenience function, so others can use it: Is the problem past-due with a grace period |
|
which ends in less than 24 hours, and still can be done? |
|
|
=item advancedUser() |
=item advancedUser() |
|
|
This puts a human-readable name on the env variable. |
This puts a human-readable name on the env variable. |
Line 637 sub getDescription {
|
Line 642 sub getDescription {
|
|
|
my $open = $res->opendate($part); |
my $open = $res->opendate($part); |
my $due = $res->duedate($part); |
my $due = $res->duedate($part); |
|
my $overdue = $res->overduedate($part); |
my $answer = $res->answerdate($part); |
my $answer = $res->answerdate($part); |
|
|
if ($status == $res->NETWORK_FAILURE) { |
if ($status == $res->NETWORK_FAILURE) { |
Line 690 sub getDescription {
|
Line 696 sub getDescription {
|
} |
} |
if ($status == $res->OPEN) { |
if ($status == $res->OPEN) { |
if ($due) { |
if ($due) { |
if ($res->is_practice()) { |
my $now = time; |
return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part)).$slotinfo; |
if (($now >= $due) && ($overdue) && ($now < $overdue)) { |
} else { |
if ($res->is_practice()) { |
return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)).$slotinfo; |
return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($overdue,'start'),$res->symb(),'duedate',$part)).$slotinfo; |
} |
} else { |
|
return &mt("Grace period ends [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($overdue,'end'),$res->symb(),'grace',$part)).$slotinfo; |
|
} |
|
} else { |
|
if ($res->is_practice()) { |
|
return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part)).$slotinfo; |
|
} else { |
|
return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)).$slotinfo; |
|
} |
|
} |
} else { |
} else { |
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; |
} |
} |
Line 749 sub getDescription {
|
Line 764 sub getDescription {
|
} |
} |
} |
} |
if ($due) { |
if ($due) { |
return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)) . |
my $now = time; |
" $triesString"; |
if (($now >= $due) && ($overdue) && ($now < $overdue)) { |
|
return &mt("Grace period ends [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($overdue,'end'),$res->symb(),'grace',$part)). |
|
" $triesString"; |
|
} else { |
|
return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)) . |
|
" $triesString"; |
|
} |
} else { |
} else { |
return &Apache::lonhtmlcommon::direct_parm_link(&mt("No due date"),$res->symb(),'duedate',$part)." $triesString"; |
return &Apache::lonhtmlcommon::direct_parm_link(&mt("No due date"),$res->symb(),'duedate',$part)." $triesString"; |
} |
} |
Line 784 sub lastTry {
|
Line 805 sub lastTry {
|
$res->duedate($part) > time(); |
$res->duedate($part) > time(); |
} |
} |
|
|
|
sub graceEndsUnder24Hours { |
|
my $res = shift; |
|
my $part = shift; |
|
my $status = $res->status($part); |
|
my $now = time(); |
|
|
|
return ($status == $res->OPEN() || |
|
$status == $res->TRIES_LEFT()) && |
|
$res->duedate($part) && $res->duedate($part) < $now && |
|
$res->overduedate($part) && $res->overduedate($part) < time()+(24*60*60) && |
|
$res->duedate($part) && $res->duedate($part) < $now+(24*60*60) && |
|
$res->overduedate($part) > $now; |
|
} |
|
|
sub advancedUser { |
sub advancedUser { |
return $env{'request.role.adv'}; |
return $env{'request.role.adv'}; |
Line 1254 sub render_long_status {
|
Line 1288 sub render_long_status {
|
if (dueInLessThan24Hours($resource, $part)) { |
if (dueInLessThan24Hours($resource, $part)) { |
$color = $hurryUpColor; |
$color = $hurryUpColor; |
$info = ' title="'.&mt('Due in less than 24 hours!').'"'; |
$info = ' title="'.&mt('Due in less than 24 hours!').'"'; |
|
} elsif (graceEndsUnder24Hours($resource, $part)) { |
|
$color = $hurryUpColor; |
|
$info = ' title="'.&mt('Grace period ends in less than 24 hours!').'"'; |
} elsif (lastTry($resource, $part)) { |
} elsif (lastTry($resource, $part)) { |
unless (($resource->problemstatus($part) eq 'no') || |
unless (($resource->problemstatus($part) eq 'no') || |
($resource->problemstatus($part) eq 'no_feedback_ever')) { |
($resource->problemstatus($part) eq 'no_feedback_ever')) { |
Line 5177 sub awarded {
|
Line 5214 sub awarded {
|
if (!defined($part)) { $part = '0'; } |
if (!defined($part)) { $part = '0'; } |
return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->{SYMB}}->{'resource.'.$part.'.awarded'}; |
return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->{SYMB}}->{'resource.'.$part.'.awarded'}; |
} |
} |
|
sub latefrac { |
|
my $self = shift; my $part = shift; |
|
$self->{NAV_MAP}->get_user_data(); |
|
if (!defined($part)) { $part = '0'; } |
|
return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->{SYMB}}->{'resource.'.$part.'.latefrac'}; |
|
} |
sub taskversion { |
sub taskversion { |
my $self = shift; my $part = shift; |
my $self = shift; my $part = shift; |
$self->{NAV_MAP}->get_user_data(); |
$self->{NAV_MAP}->get_user_data(); |
Line 5266 sub opendate {
|
Line 5309 sub opendate {
|
} |
} |
return $opendate; |
return $opendate; |
} |
} |
|
sub overduedate { |
|
my ($self,$part) = @_; |
|
my $duedate = $self->parmval("duedate", $part); |
|
my $overduedate; |
|
if ($duedate) { |
|
my $grace = $self->parmval("grace", $part); |
|
if ($grace) { |
|
my $grace_end = (split(/,/,$grace))[-1]; |
|
my ($offset) = split(/:/,$grace_end,2); |
|
if ($offset > 0) { |
|
$overduedate = $offset + $duedate; |
|
} |
|
} |
|
} |
|
return $overduedate; |
|
} |
|
sub partial_credit_overdue { |
|
my ($self,$part) = @_; |
|
my $reduction; |
|
my $duedate = $self->parmval("duedate", $part); |
|
if ($duedate) { |
|
my $grace = $self->parmval("grace",$part); |
|
if ($grace) { |
|
my $lateness = time - $duedate; |
|
if ($lateness > 0) { |
|
my ($start,$end,$startfrac,$endfrac,$usegrad); |
|
$start = 0; |
|
$startfrac = 1.0; |
|
$usegrad = 0; |
|
foreach my $item (split(/,/,$grace)) { |
|
my ($offset,$frac,$grad) = split(/:/,$item); |
|
if ($lateness > $offset) { |
|
$start = $offset; |
|
$startfrac = $frac; |
|
next; |
|
} elsif ($lateness <= $offset) { |
|
$end = $offset; |
|
$endfrac = $frac; |
|
$usegrad = $grad; |
|
last; |
|
} |
|
} |
|
if ($end) { |
|
if (($end == $start) || ($startfrac == $endfrac)) { |
|
$reduction = $endfrac; |
|
} elsif ($end - $start > 0) { |
|
if (($endfrac <= 1.0) && ($endfrac >= 0)) { |
|
$reduction = $endfrac; |
|
if ($usegrad) { |
|
my $decline = $startfrac - $endfrac; |
|
my $fraction = ($lateness - $start)/($end - $start); |
|
if (($fraction <= 1) && ($fraction >= 0)) { |
|
my $value = $startfrac - ($decline*$fraction); |
|
$reduction = sprintf("%.2f", $value); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return $reduction; |
|
} |
|
|
sub problemstatus { |
sub problemstatus { |
(my $self, my $part) = @_; |
(my $self, my $part) = @_; |
my $problemstatus = $self->parmval("problemstatus", $part); |
my $problemstatus = $self->parmval("problemstatus", $part); |
Line 5844 sub getDateStatus {
|
Line 5952 sub getDateStatus {
|
|
|
my $open = $self->opendate($part); |
my $open = $self->opendate($part); |
my $due = $self->duedate($part); |
my $due = $self->duedate($part); |
|
my $overdue = $self->overduedate($part); |
my $answer = $self->answerdate($part); |
my $answer = $self->answerdate($part); |
|
|
if (!$open && !$due && !$answer) { |
if (!$open && !$due && !$answer) { |
Line 5853 sub getDateStatus {
|
Line 5962 sub getDateStatus {
|
} |
} |
if (!$open || $now < $open) {return $self->OPEN_LATER} |
if (!$open || $now < $open) {return $self->OPEN_LATER} |
if (!$due || $now < $due) {return $self->OPEN} |
if (!$due || $now < $due) {return $self->OPEN} |
|
if ($overdue && $now < $overdue) {return $self->OPEN} |
if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER} |
if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER} |
if ($answer) { return $self->ANSWER_OPEN; } |
if ($answer) { return $self->ANSWER_OPEN; } |
return PAST_DUE_NO_ANSWER; |
return PAST_DUE_NO_ANSWER; |
Line 6121 sub status {
|
Line 6231 sub status {
|
# If there's an answer date and we're past it, don't |
# If there's an answer date and we're past it, don't |
# suppress the feedback; student should know |
# suppress the feedback; student should know |
if ($self->duedate($part) && $self->duedate($part) < time() && |
if ($self->duedate($part) && $self->duedate($part) < time() && |
|
(!$self->overduedate($part) || $self->overduedate($part) < time()) && |
$self->answerdate($part) && $self->answerdate($part) < time()) { |
$self->answerdate($part) && $self->answerdate($part) < time()) { |
$suppressFeedback = 0; |
$suppressFeedback = 0; |
} |
} |