version 1.536, 2017/09/13 23:35:07
|
version 1.540, 2018/01/15 00:51:42
|
Line 658 sub getDescription {
|
Line 658 sub getDescription {
|
} elsif ($slot_status == $res->RESERVABLE) { |
} elsif ($slot_status == $res->RESERVABLE) { |
$slotmsg = &mt('Reservable, reservations close [_1]', |
$slotmsg = &mt('Reservable, reservations close [_1]', |
timeToHumanString($slot_time,'end')); |
timeToHumanString($slot_time,'end')); |
|
} elsif ($slot_status == $res->NEEDS_CHECKIN) { |
|
$slotmsg = &mt('Reserved, check-in needed - ends [_1]', |
|
timeToHumanString($slot_time,'end')); |
} elsif ($slot_status == $res->RESERVABLE_LATER) { |
} elsif ($slot_status == $res->RESERVABLE_LATER) { |
$slotmsg = &mt('Reservable, reservations open [_1]', |
$slotmsg = &mt('Reservable, reservations open [_1]', |
timeToHumanString($slot_time,'start')); |
timeToHumanString($slot_time,'start')); |
Line 699 sub getDescription {
|
Line 702 sub getDescription {
|
} |
} |
if (($status == $res->ANSWER_OPEN || $status == $res->PARTIALLY_CORRECT) |
if (($status == $res->ANSWER_OPEN || $status == $res->PARTIALLY_CORRECT) |
&& $res->handgrade($part) ne 'yes') { |
&& $res->handgrade($part) ne 'yes') { |
return &Apache::lonhtmlcommon::direct_parm_link(&mt("Answer available"),$res->symb(),'answerdate,duedate',$part); |
my $msg = &mt('Answer available'); |
|
my $parmlist = 'answerdate,duedate'; |
|
if (($res->is_tool) && ($res->is_gradable())) { |
|
if (($status == $res->PARTIALLY_CORRECT) && ($res->parmval('retrypartial',$part))) { |
|
$msg = &mt('Grade received'); |
|
$parmlist = 'retrypartial'; |
|
} else { |
|
$msg = &mt('Grade available'); |
|
} |
|
} |
|
return &Apache::lonhtmlcommon::direct_parm_link($msg,$res->symb(),$parmlist,$part); |
} |
} |
if ($status == $res->EXCUSED) { |
if ($status == $res->EXCUSED) { |
return &mt("Excused by instructor"); |
return &mt("Excused by instructor"); |
Line 953 sub render_resource {
|
Line 966 sub render_resource {
|
# links to open and close the folder |
# links to open and close the folder |
|
|
my $whitespace = $location.'/whitespace_21.gif'; |
my $whitespace = $location.'/whitespace_21.gif'; |
my $linkopen = "<img src='$whitespace' alt='' />"."<a href=\"$link\">"; |
my $linkopen = "<img src='$whitespace' alt='' />"; |
|
my $nomodal; |
|
if (($params->{'modalLink'}) && (!$resource->is_sequence())) { |
|
if ($link =~m{^(?:|/adm/wrapper)/ext/([^#]+)}) { |
|
my $exturl = $1; |
|
if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) { |
|
$nomodal = 1; |
|
} |
|
} elsif (($link eq "/public/$LONCAPA::match_domain/$LONCAPA::match_courseid/syllabus") && |
|
($env{'request.course.id'}) && ($ENV{'SERVER_PORT'} == 443) && |
|
($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { |
|
$nomodal = 1; |
|
} |
|
my $esclink = &js_escape($link); |
|
if ($nomodal) { |
|
$linkopen .= "<a href=\"#\" onclick=\"javascript:window.open('$esclink','resourcepreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1'); return false;\" />"; |
|
} else { |
|
$linkopen .= "<a href=\"$link\" onclick=\"javascript:openMyModal('$esclink',600,500,'yes','true'); return false;\">"; |
|
} |
|
} else { |
|
$linkopen .= "<a href=\"$link\">"; |
|
} |
my $linkclose = "</a>"; |
my $linkclose = "</a>"; |
|
|
# Default icon: unknown page |
# Default icon: unknown page |
Line 1081 sub render_resource {
|
Line 1115 sub render_resource {
|
} |
} |
|
|
if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) { |
if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) { |
$result .= "$curMarkerBegin<a href=\"$link\">$title$partLabel</a>$curMarkerEnd$editmapLink$nonLinkedText</td>"; |
$linkclose = '</a>'; |
} else { |
if ($params->{'modalLink'}) { |
$result .= "$curMarkerBegin$linkopen$title$partLabel</a>$curMarkerEnd$editmapLink$nonLinkedText</td>"; |
my $esclink = &js_escape($link); |
|
if ($nomodal) { |
|
$linkopen = "<a href=\"#\" onclick=\"javascript:window.open('$esclink','resourcepreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1'); return false;\" />"; |
|
} else { |
|
$linkopen = "<a href=\"$link\" onclick=\"javascript:openMyModal('$esclink',600,500,'yes','true'); return false;\">"; |
|
} |
|
} else { |
|
$linkopen = "<a href=\"$link\">"; |
|
} |
} |
} |
|
$result .= "$curMarkerBegin$linkopen$title$partLabel$linkclose$curMarkerEnd$editmapLink$nonLinkedText</td>"; |
|
|
return $result; |
return $result; |
} |
} |
Line 1146 sub render_quick_status {
|
Line 1189 sub render_quick_status {
|
my $linkclose = "</a>"; |
my $linkclose = "</a>"; |
|
|
$result .= '<td class="LC_middle">'; |
$result .= '<td class="LC_middle">'; |
if ($resource->is_problem() && |
if ($resource->is_gradable() && |
!$firstDisplayed) { |
!$firstDisplayed) { |
my $icon = $statusIconMap{$resource->simpleStatus($part)}; |
my $icon = $statusIconMap{$resource->simpleStatus($part)}; |
my $alt = $iconAltTags{$icon}; |
my $alt = $iconAltTags{$icon}; |
Line 1171 sub render_long_status {
|
Line 1214 sub render_long_status {
|
|
|
my $color; |
my $color; |
my $info = ''; |
my $info = ''; |
if ($resource->is_problem() || $resource->is_practice()) { |
if ($resource->is_gradable() || $resource->is_practice()) { |
$color = $colormap{$resource->status}; |
$color = $colormap{$resource->status}; |
|
|
if (dueInLessThan24Hours($resource, $part)) { |
if (dueInLessThan24Hours($resource, $part)) { |
Line 1185 sub render_long_status {
|
Line 1228 sub render_long_status {
|
} |
} |
} |
} |
} |
} |
|
|
if ($resource->kind() eq "res" && |
if (($resource->kind() eq "res") && |
$resource->is_raw_problem() && |
($resource->is_raw_problem() || $resource->is_gradable()) && |
!$firstDisplayed) { |
!$firstDisplayed) { |
if ($color) {$result .= '<span style="color:'.$color.'"'.$info.'><b>'; } |
if ($color) {$result .= '<span style="color:'.$color.'"'.$info.'><b>'; } |
$result .= getDescription($resource, $part); |
$result .= getDescription($resource, $part); |
Line 1234 my @statuses = ($resObj->CORRECT, $resOb
|
Line 1277 my @statuses = ($resObj->CORRECT, $resOb
|
|
|
sub render_parts_summary_status { |
sub render_parts_summary_status { |
my ($resource, $part, $params) = @_; |
my ($resource, $part, $params) = @_; |
if (!$resource->is_problem() && !$resource->contains_problem) { return '<td></td>'; } |
if (!$resource->is_gradable() && !$resource->contains_problem) { return '<td></td>'; } |
if ($params->{showParts}) { |
if ($params->{showParts}) { |
return '<td></td>'; |
return '<td></td>'; |
} |
} |
Line 1722 END
|
Line 1765 END
|
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
} |
} |
|
|
|
my $inhibitmenu; |
|
if ($args->{'modalLink'}) { |
|
$inhibitmenu = '&inhibitmenu=yes'; |
|
} |
|
|
while (1) { |
while (1) { |
if ($args->{'sort'}) { |
if ($args->{'sort'}) { |
$curRes = shift(@resources); |
$curRes = shift(@resources); |
Line 1875 END
|
Line 1923 END
|
} else { |
} else { |
$args->{"resourceLink"} = $src. |
$args->{"resourceLink"} = $src. |
($srcHasQuestion?'&':'?') . |
($srcHasQuestion?'&':'?') . |
'symb=' . &escape($symb).$anchor; |
'symb=' . &escape($symb).$inhibitmenu.$anchor; |
} |
} |
} |
} |
# Now, we've decided what parts to show. Loop through them and |
# Now, we've decided what parts to show. Loop through them and |
Line 2696 sub parmval_real {
|
Line 2744 sub parmval_real {
|
|
|
my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb); |
my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb); |
$mapname = &Apache::lonnet::deversion($mapname); |
$mapname = &Apache::lonnet::deversion($mapname); |
|
my $toolsymb = ''; |
|
if ($fn =~ /ext\.tool$/) { |
|
$toolsymb = $symb; |
|
} |
my ($recursed,@recurseup); |
my ($recursed,@recurseup); |
|
|
# ----------------------------------------------------- Cascading lookup scheme |
# ----------------------------------------------------- Cascading lookup scheme |
Line 2816 sub parmval_real {
|
Line 2868 sub parmval_real {
|
|
|
my $meta_rwhat=$rwhat; |
my $meta_rwhat=$rwhat; |
$meta_rwhat=~s/\./_/g; |
$meta_rwhat=~s/\./_/g; |
my $default=&Apache::lonnet::metadata($fn,$meta_rwhat); |
my $default=&Apache::lonnet::metadata($fn,$meta_rwhat,$toolsymb); |
if (defined($default)) { return [$default,'resource']} |
if (defined($default)) { return [$default,'resource']} |
$default=&Apache::lonnet::metadata($fn,'parameter_'.$meta_rwhat); |
$default=&Apache::lonnet::metadata($fn,'parameter_'.$meta_rwhat,$toolsymb); |
if (defined($default)) { return [$default,'resource']} |
if (defined($default)) { return [$default,'resource']} |
# --------------------------------------------------- fifth, check more course |
# --------------------------------------------------- fifth, check more course |
if (defined($courseopt)) { |
if (defined($courseopt)) { |
Line 2860 sub parmval_real {
|
Line 2912 sub parmval_real {
|
if (defined($partgeneral[0])) { return \@partgeneral; } |
if (defined($partgeneral[0])) { return \@partgeneral; } |
} |
} |
if ($recurse) { return []; } |
if ($recurse) { return []; } |
my $pack_def=&Apache::lonnet::packages_tab_default($fn,'resource.'.$rwhat); |
my $pack_def=&Apache::lonnet::packages_tab_default($fn,'resource.'.$rwhat,$toolsymb); |
if (defined($pack_def)) { return [$pack_def,'resource']; } |
if (defined($pack_def)) { return [$pack_def,'resource']; } |
return ['']; |
return ['']; |
} |
} |
Line 4475 sub is_problem {
|
Line 4527 sub is_problem {
|
} |
} |
return 0; |
return 0; |
} |
} |
|
sub is_tool { |
|
my $self=shift; |
|
my $src = $self->src(); |
|
return ($src =~ /ext\.tool$/); |
|
} |
|
sub is_gradable { |
|
my $self=shift; |
|
my $src = $self->src(); |
|
if (($src =~ /$LONCAPA::assess_re/) || |
|
(($self->is_tool()) && ($self->parmval('gradable',0) =~ /^yes$/i))) { |
|
return !($self->is_practice()); |
|
} |
|
} |
# |
# |
# The has below is the set of status that are considered 'incomplete' |
# The has below is the set of status that are considered 'incomplete' |
# |
# |
Line 5136 sub parts {
|
Line 5201 sub parts {
|
my $self = shift; |
my $self = shift; |
|
|
if ($self->ext) { return []; } |
if ($self->ext) { return []; } |
|
if (($self->is_tool()) && |
|
($self->is_gradable())) { return ['0']; } |
|
|
$self->extractParts(); |
$self->extractParts(); |
return $self->{PARTS}; |
return $self->{PARTS}; |
Line 5510 Attempted, and not yet graded.
|
Line 5577 Attempted, and not yet graded.
|
|
|
Attempted, and credit received for attempt (survey and anonymous survey only). |
Attempted, and credit received for attempt (survey and anonymous survey only). |
|
|
|
=item * B<INCORRECT_BY_PASSBACK>: |
|
|
|
Attempted, but wrong for LTI Tool Provider by passback of grade |
|
|
|
=item * B<CORRECT_BY_PASSBACK>: |
|
|
|
Correct for LTI Tool Provider by passback of grade |
|
|
=back |
=back |
|
|
=cut |
=cut |
Line 5522 sub CORRECT_BY_OVERRIDE { return 14; }
|
Line 5597 sub CORRECT_BY_OVERRIDE { return 14; }
|
sub EXCUSED { return 15; } |
sub EXCUSED { return 15; } |
sub ATTEMPTED { return 16; } |
sub ATTEMPTED { return 16; } |
sub CREDIT_ATTEMPTED { return 17; } |
sub CREDIT_ATTEMPTED { return 17; } |
|
sub INCORRECT_BY_PASSBACK { return 18; } |
|
sub CORRECT_BY_PASSBACK { return 19; } |
|
|
sub getCompletionStatus { |
sub getCompletionStatus { |
my $self = shift; |
my $self = shift; |
Line 5536 sub getCompletionStatus {
|
Line 5613 sub getCompletionStatus {
|
if ($status eq 'correct_by_override') { |
if ($status eq 'correct_by_override') { |
return $self->CORRECT_BY_OVERRIDE; |
return $self->CORRECT_BY_OVERRIDE; |
} |
} |
|
if ($status eq 'correct_by_passback') { |
|
return $self->CORRECT_BY_PASSBACK; |
|
} |
if ($status eq 'incorrect_attempted') {return $self->INCORRECT; } |
if ($status eq 'incorrect_attempted') {return $self->INCORRECT; } |
if ($status eq 'incorrect_by_override') {return $self->INCORRECT_BY_OVERRIDE; } |
if ($status eq 'incorrect_by_override') {return $self->INCORRECT_BY_OVERRIDE; } |
|
if ($status eq 'incorrect_by_passback') {return $self->INCORRECT_BY_PASSBACK; } |
if ($status eq 'excused') {return $self->EXCUSED; } |
if ($status eq 'excused') {return $self->EXCUSED; } |
if ($status eq 'ungraded_attempted') {return $self->ATTEMPTED; } |
if ($status eq 'ungraded_attempted') {return $self->ATTEMPTED; } |
if ($status eq 'credit_attempted') { |
if ($status eq 'credit_attempted') { |
Line 5691 sub status {
|
Line 5772 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 || |
|
$completionStatus == CORRECT_BY_PASSBACK ) { |
if ( $suppressFeedback ) { return ANSWER_SUBMITTED } |
if ( $suppressFeedback ) { return ANSWER_SUBMITTED } |
my $awarded=$self->awarded($part); |
my $awarded=$self->awarded($part); |
if ($awarded < 1 && $awarded > 0) { |
if ($awarded < 1 && $awarded > 0) { |
Line 5704 sub status {
|
Line 5786 sub status {
|
|
|
# If it's WRONG... and not open |
# If it's WRONG... and not open |
if ( ($completionStatus == INCORRECT || |
if ( ($completionStatus == INCORRECT || |
$completionStatus == INCORRECT_BY_OVERRIDE) |
$completionStatus == INCORRECT_BY_OVERRIDE || |
|
$completionStatus == INCORRECT_BY_PASSBACK) |
&& (!$self->opendate($part) || $self->opendate($part) > time()) ) { |
&& (!$self->opendate($part) || $self->opendate($part) > time()) ) { |
return INCORRECT; |
return INCORRECT; |
} |
} |
Line 5746 sub status {
|
Line 5829 sub status {
|
} |
} |
|
|
# If it's WRONG... |
# If it's WRONG... |
if ($completionStatus == INCORRECT || $completionStatus == INCORRECT_BY_OVERRIDE) { |
if ($completionStatus == INCORRECT || $completionStatus == INCORRECT_BY_OVERRIDE || |
|
$completionStatus == INCORRECT_BY_PASSBACK) { |
# and there are TRIES LEFT: |
# and there are TRIES LEFT: |
if ($self->tries($part) < $self->maxtries($part) || !$self->maxtries($part)) { |
if ($self->tries($part) < $self->maxtries($part) || !$self->maxtries($part)) { |
return $suppressFeedback ? ANSWER_SUBMITTED : TRIES_LEFT; |
return $suppressFeedback ? ANSWER_SUBMITTED : TRIES_LEFT; |
Line 5800 sub check_for_slot {
|
Line 5884 sub check_for_slot {
|
($checkedin,$checkedinslot) = $self->checkedin(); |
($checkedin,$checkedinslot) = $self->checkedin(); |
unless ((grep(/^\Q$checkedin\E/,@proctors)) && |
unless ((grep(/^\Q$checkedin\E/,@proctors)) && |
($checkedinslot eq $slot_name)) { |
($checkedinslot eq $slot_name)) { |
return (NEEDS_CHECKIN,undef,$slot_name); |
return (NEEDS_CHECKIN,$end,$slot_name); |
} |
} |
} |
} |
return (RESERVED,$end,$slot_name); |
return (RESERVED,$end,$slot_name); |