version 1.284, 2004/08/30 18:45:52
|
version 1.290, 2004/09/15 21:10:11
|
Line 354 ENDSUBM
|
Line 354 ENDSUBM
|
} else { |
} else { |
&add_linkitem(\%toplinkitems,'firsthomework', |
&add_linkitem(\%toplinkitems,'firsthomework', |
'location.href="navmaps?jumpToFirstHomework"', |
'location.href="navmaps?jumpToFirstHomework"', |
"Go To My First Homework Problem"); |
"Show Me My First Homework Problem"); |
} |
} |
|
|
my $suppressEmptySequences = 0; |
my $suppressEmptySequences = 0; |
Line 396 ENDSUBM
|
Line 396 ENDSUBM
|
</nobr> |
</nobr> |
</form>"); |
</form>"); |
# renderer call |
# renderer call |
my $renderArgs = { 'cols' => [0,2,3], |
my $renderArgs = { 'cols' => [0,1,2,3], |
'sort' => $ENV{'form.sort'}, |
'sort' => $ENV{'form.sort'}, |
'url' => '/adm/navmaps', |
'url' => '/adm/navmaps', |
'navmap' => $navmap, |
'navmap' => $navmap, |
Line 1685 END
|
Line 1685 END
|
return &$oldFilterFunc($res); |
return &$oldFilterFunc($res); |
}; |
}; |
@resources=$navmap->retrieveResources(undef,$filterFunc); |
@resources=$navmap->retrieveResources(undef,$filterFunc); |
@resources= sort {lc($a->compTitle) cmp lc($b->compTitle)} @resources; |
@resources= sort { |
|
my ($atitle,$btitle) = (lc($a->compTitle),lc($b->compTitle)); |
|
$atitle=~s/^\s*//; |
|
$btitle=~s/^\s*//; |
|
return $atitle cmp $btitle |
|
} @resources; |
} elsif ($args->{'sort'} eq 'duedate') { |
} elsif ($args->{'sort'} eq 'duedate') { |
@resources=$navmap->retrieveResources(undef, |
@resources=$navmap->retrieveResources(undef, |
sub { shift->is_problem(); }); |
sub { shift->is_problem(); }); |
Line 3900 Returns the number of parts of the probl
|
Line 3905 Returns the number of parts of the probl
|
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. |
number of parts in the problem, not including psuedo-part 0. |
|
|
|
=item * B<countResponses>(): |
|
|
|
Returns the total number of responses in the problem a student can answer. |
|
|
|
=item * B<responseTypes>(): |
|
|
|
Returns a hash whose keys are the response types. The values are the number |
|
of times each response type is used. This is for the I<entire> problem, not |
|
just a single part. |
|
|
=item * B<multipart>(): |
=item * B<multipart>(): |
|
|
Returns true if the problem is multipart, false otherwise. Use this instead |
Returns true if the problem is multipart, false otherwise. Use this instead |
Line 3946 sub countParts {
|
Line 3961 sub countParts {
|
return scalar(@{$parts}); # + $delta; |
return scalar(@{$parts}); # + $delta; |
} |
} |
|
|
|
sub countResponses { |
|
my $self = shift; |
|
my $count; |
|
foreach my $part ($self->parts()) { |
|
$count+= $self->responseIds($part); |
|
} |
|
return $count; |
|
} |
|
|
|
sub responseTypes { |
|
my $self = shift; |
|
my %Responses; |
|
foreach my $part ($self->parts()) { |
|
foreach my $responsetype ($self->responseType($part)) { |
|
$Responses{$responsetype}++ if (defined($responsetype)); |
|
} |
|
} |
|
return %Responses; |
|
} |
|
|
sub multipart { |
sub multipart { |
my $self = shift; |
my $self = shift; |
return $self->countParts() > 1; |
return $self->countParts() > 1; |
Line 4049 sub extractParts {
|
Line 4084 sub extractParts {
|
# So we have to use our knowlege of part names to figure out |
# So we have to use our knowlege of part names to figure out |
# where the part names begin and end, and even then, it is possible |
# where the part names begin and end, and even then, it is possible |
# to construct ambiguous situations. |
# to construct ambiguous situations. |
# |
|
my %response_type_by_id; |
|
foreach (split /,/, $metadata) { |
foreach (split /,/, $metadata) { |
if ($_ =~ /^([a-zA-Z]+)response_(.*)/) { |
if ($_ =~ /^([a-zA-Z]+)response_(.*)/) { |
my $responseType = $1; |
my $responseType = $1; |
Line 4066 sub extractParts {
|
Line 4099 sub extractParts {
|
my $responseId = join('_', @otherChunks); |
my $responseId = join('_', @otherChunks); |
push @{$responseIdHash{$partIdSoFar}}, $responseId; |
push @{$responseIdHash{$partIdSoFar}}, $responseId; |
push @{$responseTypeHash{$partIdSoFar}}, $responseType; |
push @{$responseTypeHash{$partIdSoFar}}, $responseType; |
$response_type_by_id{$responseId} = $responseType; |
|
} |
} |
} |
} |
} |
} |
Line 4077 sub extractParts {
|
Line 4109 sub extractParts {
|
if ($resorder) { |
if ($resorder) { |
my @resorder=split(/,/,$resorder); |
my @resorder=split(/,/,$resorder); |
foreach my $part (keys(%responseIdHash)) { |
foreach my $part (keys(%responseIdHash)) { |
my %resids = map { ($_,1) } @{ $responseIdHash{$part} }; |
my $i=0; |
|
my %resids = map { ($_,$i++) } @{ $responseIdHash{$part} }; |
my @neworder; |
my @neworder; |
foreach my $possibleid (@resorder) { |
foreach my $possibleid (@resorder) { |
if (exists($resids{$possibleid})) { |
if (exists($resids{$possibleid})) { |
push(@neworder,$possibleid); |
push(@neworder,$resids{$possibleid}); |
} |
} |
} |
} |
$responseIdHash{$part}=\@neworder; |
my @ids; |
|
my @type; |
|
foreach my $element (@neworder) { |
|
push (@ids,$responseIdHash{$part}->[$element]); |
|
push (@type,$responseTypeHash{$part}->[$element]); |
|
} |
|
$responseIdHash{$part}=\@ids; |
|
$responseTypeHash{$part}=\@type; |
} |
} |
} |
} |
# |
|
# Reorder the response types |
|
foreach my $partid (keys(%responseIdHash)) { |
|
delete($responseTypeHash{$partid}); |
|
foreach my $respid (@{$responseIdHash{$partid}}) { |
|
push(@{$responseTypeHash{$partid}}, |
|
$response_type_by_id{$respid}); |
|
} |
|
} |
|
$self->{RESPONSE_IDS} = \%responseIdHash; |
$self->{RESPONSE_IDS} = \%responseIdHash; |
$self->{RESPONSE_TYPES} = \%responseTypeHash; |
$self->{RESPONSE_TYPES} = \%responseTypeHash; |
} |
} |
Line 4289 sub getCompletionStatus {
|
Line 4320 sub getCompletionStatus {
|
|
|
# Left as separate if statements in case we ever do more with this |
# Left as separate if statements in case we ever do more with this |
if ($status eq 'correct_by_student') {return $self->CORRECT;} |
if ($status eq 'correct_by_student') {return $self->CORRECT;} |
|
if ($status eq 'correct_by_scantron') {return $self->CORRECT;} |
if ($status eq 'correct_by_override') {return $self->CORRECT_BY_OVERRIDE; } |
if ($status eq 'correct_by_override') {return $self->CORRECT_BY_OVERRIDE; } |
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; } |