version 1.191, 2003/05/16 14:17:08
|
version 1.200, 2003/06/12 16:21:20
|
Line 47 use Apache::Constants qw(:common :http);
|
Line 47 use Apache::Constants qw(:common :http);
|
use Apache::loncommon(); |
use Apache::loncommon(); |
use Apache::lonmenu(); |
use Apache::lonmenu(); |
use POSIX qw (floor strftime); |
use POSIX qw (floor strftime); |
|
use Data::Dumper; # for debugging, not always used |
|
|
# symbolic constants |
# symbolic constants |
sub SYMB { return 1; } |
sub SYMB { return 1; } |
Line 71 my %statusIconMap =
|
Line 72 my %statusIconMap =
|
$resObj->TRIES_LEFT => 'navmap.open.gif', |
$resObj->TRIES_LEFT => 'navmap.open.gif', |
$resObj->INCORRECT => 'navmap.wrong.gif', |
$resObj->INCORRECT => 'navmap.wrong.gif', |
$resObj->OPEN => 'navmap.open.gif', |
$resObj->OPEN => 'navmap.open.gif', |
$resObj->ATTEMPTED => 'navmap.open.gif', |
$resObj->ATTEMPTED => 'navmap.ellipsis.gif', |
$resObj->ANSWER_SUBMITTED => '' ); |
$resObj->ANSWER_SUBMITTED => '' ); |
|
|
my %iconAltTags = |
my %iconAltTags = |
Line 377 sub getDescription {
|
Line 378 sub getDescription {
|
return "Excused by instructor"; |
return "Excused by instructor"; |
} |
} |
if ($status == $res->ATTEMPTED) { |
if ($status == $res->ATTEMPTED) { |
return "Not yet graded."; |
return "Answer submitted, not yet graded."; |
} |
} |
if ($status == $res->TRIES_LEFT) { |
if ($status == $res->TRIES_LEFT) { |
my $tries = $res->tries($part); |
my $tries = $res->tries($part); |
Line 838 sub render_resource {
|
Line 839 sub render_resource {
|
my $icon = "<img src='/adm/lonIcons/html.gif' alt='' border='0' />"; |
my $icon = "<img src='/adm/lonIcons/html.gif' alt='' border='0' />"; |
|
|
if ($resource->is_problem()) { |
if ($resource->is_problem()) { |
if ($part eq "" || $params->{'condensed'}) { |
if ($part eq '0' || $params->{'condensed'}) { |
$icon = '<img src="/adm/lonIcons/problem.gif" alt="" border="0" />'; |
$icon = '<img src="/adm/lonIcons/problem.gif" alt="" border="0" />'; |
} else { |
} else { |
$icon = $params->{'indentString'}; |
$icon = $params->{'indentString'}; |
Line 908 sub render_resource {
|
Line 909 sub render_resource {
|
$params->{'displayedHereMarker'} = 1; |
$params->{'displayedHereMarker'} = 1; |
} |
} |
|
|
if ($resource->is_problem() && $part ne "" && |
if ($resource->is_problem() && $part ne '0' && |
!$params->{'condensed'}) { |
!$params->{'condensed'}) { |
$partLabel = " (Part $part)"; |
$partLabel = " (Part $part)"; |
$title = ""; |
$title = ""; |
Line 965 sub render_communication_status {
|
Line 966 sub render_communication_status {
|
} |
} |
} |
} |
|
|
|
if ($params->{'multipart'} && $part != '0') { |
|
$discussionHTML = $feedbackHTML = $errorHTML = ''; |
|
} |
|
|
return "<td width=\"75\" align=\"left\" valign=\"center\">$discussionHTML$feedbackHTML$errorHTML </td>"; |
return "<td width=\"75\" align=\"left\" valign=\"center\">$discussionHTML$feedbackHTML$errorHTML </td>"; |
|
|
} |
} |
Line 1000 sub render_long_status {
|
Line 1005 sub render_long_status {
|
$params->{'multipart'} && $part eq "0"; |
$params->{'multipart'} && $part eq "0"; |
|
|
my $color; |
my $color; |
if ($resource->is_problem()) { |
if ($resource->is_problem() && ($resource->countParts() <= 1 || $part ne '') ) { |
$color = $colormap{$resource->status}; |
$color = $colormap{$resource->status}; |
|
|
if (dueInLessThen24Hours($resource, $part) || |
if (dueInLessThen24Hours($resource, $part) || |
Line 1020 sub render_long_status {
|
Line 1025 sub render_long_status {
|
$result .= '(randomly select ' . $resource->randompick() .')'; |
$result .= '(randomly select ' . $resource->randompick() .')'; |
} |
} |
|
|
$result .= " </td>\n"; |
|
|
|
return $result; |
return $result; |
} |
} |
|
|
Line 1373 sub render {
|
Line 1376 sub render {
|
# Decide what parts to show. |
# Decide what parts to show. |
if ($curRes->is_problem() && $showParts) { |
if ($curRes->is_problem() && $showParts) { |
@parts = @{$curRes->parts()}; |
@parts = @{$curRes->parts()}; |
$args->{'multipart'} = scalar(@parts) > 1; |
$args->{'multipart'} = $curRes->multipart(); |
|
|
if ($condenseParts) { # do the condensation |
if ($condenseParts) { # do the condensation |
if (!$curRes->opendate("0")) { |
if (!$curRes->opendate("0")) { |
Line 1382 sub render {
|
Line 1385 sub render {
|
} |
} |
if (!$args->{'condensed'}) { |
if (!$args->{'condensed'}) { |
# Decide whether to condense based on similarity |
# Decide whether to condense based on similarity |
my $status = $curRes->status($parts[1]); |
my $status = $curRes->status($parts[0]); |
my $due = $curRes->duedate($parts[1]); |
my $due = $curRes->duedate($parts[0]); |
my $open = $curRes->opendate($parts[1]); |
my $open = $curRes->opendate($parts[0]); |
my $statusAllSame = 1; |
my $statusAllSame = 1; |
my $dueAllSame = 1; |
my $dueAllSame = 1; |
my $openAllSame = 1; |
my $openAllSame = 1; |
for (my $i = 2; $i < scalar(@parts); $i++) { |
for (my $i = 1; $i < scalar(@parts); $i++) { |
if ($curRes->status($parts[$i]) != $status){ |
if ($curRes->status($parts[$i]) != $status){ |
$statusAllSame = 0; |
$statusAllSame = 0; |
} |
} |
Line 1409 sub render {
|
Line 1412 sub render {
|
if (($statusAllSame && defined($condenseStatuses{$status})) || |
if (($statusAllSame && defined($condenseStatuses{$status})) || |
($dueAllSame && $status == $curRes->OPEN && $statusAllSame)|| |
($dueAllSame && $status == $curRes->OPEN && $statusAllSame)|| |
($openAllSame && $status == $curRes->OPEN_LATER && $statusAllSame) ){ |
($openAllSame && $status == $curRes->OPEN_LATER && $statusAllSame) ){ |
@parts = (); |
@parts = ($parts[0]); |
$args->{'condensed'} = 1; |
$args->{'condensed'} = 1; |
} |
} |
|
|
} |
} |
|
# Multipart problem with one part: always "condense" (happens |
|
# to match the desirable behavior) |
|
if ($curRes->countParts() == 1) { |
|
@parts = ($parts[0]); |
|
$args->{'condensed'} = 1; |
|
} |
} |
} |
} |
} |
|
|
# If the multipart problem was condensed, "forget" it was multipart |
# If the multipart problem was condensed, "forget" it was multipart |
if (scalar(@parts) == 1) { |
if (scalar(@parts) == 1) { |
$args->{'multipart'} = 0; |
$args->{'multipart'} = 0; |
|
} else { |
|
# Add part 0 so we display it correctly. |
|
unshift @parts, '0'; |
} |
} |
|
|
# Now, we've decided what parts to show. Loop through them and |
# Now, we've decided what parts to show. Loop through them and |
# show them. |
# show them. |
foreach my $part ('', @parts) { |
foreach my $part (@parts) { |
if ($part eq '0') { |
|
next; |
|
} |
|
$rownum ++; |
$rownum ++; |
my $backgroundColor = $backgroundColors[$rownum % scalar(@backgroundColors)]; |
my $backgroundColor = $backgroundColors[$rownum % scalar(@backgroundColors)]; |
|
|
Line 1661 sub init {
|
Line 1669 sub init {
|
my %emailstatus = &Apache::lonnet::dump('email_status'); |
my %emailstatus = &Apache::lonnet::dump('email_status'); |
my $logoutTime = $emailstatus{'logout'}; |
my $logoutTime = $emailstatus{'logout'}; |
my $courseLeaveTime = $emailstatus{'logout_'.$ENV{'request.course.id'}}; |
my $courseLeaveTime = $emailstatus{'logout_'.$ENV{'request.course.id'}}; |
$self->{LAST_CHECK} = ($courseLeaveTime < $logoutTime ? |
$self->{LAST_CHECK} = (($courseLeaveTime > $logoutTime) ? |
$courseLeaveTime : $logoutTime); |
$courseLeaveTime : $logoutTime); |
my %discussiontime = &Apache::lonnet::dump('discussiontimes', |
my %discussiontime = &Apache::lonnet::dump('discussiontimes', |
$cdom, $cnum); |
$cdom, $cnum); |
Line 1778 object for that resource. This method, o
|
Line 1786 object for that resource. This method, o
|
(as in the resource object) is the only proper way to obtain a |
(as in the resource object) is the only proper way to obtain a |
resource object. |
resource object. |
|
|
|
=item * B<getBySymb>(symb): |
|
|
|
Based on the symb of the resource, get a resource object for that |
|
resource. This is one of the proper ways to get a resource object. |
|
|
|
=item * B<getMapByMapPc>(map_pc): |
|
|
|
Based on the map_pc of the resource, get a resource object for |
|
the given map. This is one of the proper ways to get a resource object. |
|
|
=cut |
=cut |
|
|
# The strategy here is to cache the resource objects, and only construct them |
# The strategy here is to cache the resource objects, and only construct them |
Line 1808 sub getBySymb {
|
Line 1826 sub getBySymb {
|
return $self->getById($map->map_pc() . '.' . $id); |
return $self->getById($map->map_pc() . '.' . $id); |
} |
} |
|
|
|
sub getByMapPc { |
|
my $self = shift; |
|
my $map_pc = shift; |
|
my $map_id = $self->{NAV_HASH}->{'map_id_' . $map_pc}; |
|
$map_id = $self->{NAV_HASH}->{'ids_' . $map_id}; |
|
return $self->getById($map_id); |
|
} |
|
|
=pod |
=pod |
|
|
=item * B<firstResource>(): |
=item * B<firstResource>(): |
Line 3210 sub getErrors {
|
Line 3236 sub getErrors {
|
=item * B<parts>(): |
=item * B<parts>(): |
|
|
Returns a list reference containing sorted strings corresponding to |
Returns a list reference containing sorted strings corresponding to |
each part of the problem. To count the number of parts, use the list |
each part of the problem. Single part problems have only a part '0'. |
in a scalar context, and subtract one if greater than two. (One part |
Multipart problems do not return their part '0', since they typically |
problems have a part 0. Multi-parts have a part 0, plus a part for |
do not really matter. |
each part. Filtering part 0 if you want it is up to you.) |
|
|
|
=item * B<countParts>(): |
=item * B<countParts>(): |
|
|
Returns the number of parts of the problem a student can answer. Thus, |
Returns the number of parts of the problem a student can answer. Thus, |
for single part problems, returns 1. For multipart, it returns the |
for single part problems, returns 1. For multipart, it returns the |
number of parts in the problem, not including psuedo-part 0. Thus, |
number of parts in the problem, not including psuedo-part 0. |
B<parts> may return an array with more parts in it then countParts |
|
might lead you to believe. |
=item * B<multipart>(): |
|
|
|
Returns true if the problem is multipart, false otherwise. Use this instead |
|
of countParts if all you want is multipart/not multipart. |
|
|
=item * B<responseType>($part): |
=item * B<responseType>($part): |
|
|
Returns the response type of the part, without the word "response" on the |
Returns the response type of the part, without the word "response" on the |
end. Example return values: 'string', 'essay', 'numeric', etc. |
end. Example return values: 'string', 'essay', 'numeric', etc. |
|
|
=item * B<responseId>($part): |
=item * B<responseIds>($part): |
|
|
Retreives the response ID for the given part, which may be an empty string. |
Retreives the response IDs for the given part as an array reference containing |
|
strings naming the response IDs. This may be empty. |
|
|
=back |
=back |
|
|
Line 3239 Retreives the response ID for the given
|
Line 3268 Retreives the response ID for the given
|
sub parts { |
sub parts { |
my $self = shift; |
my $self = shift; |
|
|
if ($self->ext) { return ['0']; } |
if ($self->ext) { return []; } |
|
|
$self->extractParts(); |
$self->extractParts(); |
return $self->{PARTS}; |
return $self->{PARTS}; |
Line 3263 sub countParts {
|
Line 3292 sub countParts {
|
return scalar(@{$parts}); # + $delta; |
return scalar(@{$parts}); # + $delta; |
} |
} |
|
|
|
sub multipart { |
|
my $self = shift; |
|
return $self->countParts() > 1; |
|
} |
|
|
sub responseType { |
sub responseType { |
my $self = shift; |
my $self = shift; |
my $part = shift; |
my $part = shift; |
Line 3271 sub responseType {
|
Line 3305 sub responseType {
|
return $self->{RESPONSE_TYPE}->{$part}; |
return $self->{RESPONSE_TYPE}->{$part}; |
} |
} |
|
|
sub responseId { |
sub responseIds { |
my $self = shift; |
my $self = shift; |
my $part = shift; |
my $part = shift; |
|
|