--- loncom/interface/lonnavmaps.pm 2015/04/13 16:30:28 1.505 +++ loncom/interface/lonnavmaps.pm 2015/04/15 18:56:15 1.507 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.505 2015/04/13 16:30:28 raeburn Exp $ +# $Id: lonnavmaps.pm,v 1.507 2015/04/15 18:56:15 raeburn Exp $ # # Copyright Michigan State University Board of Trustees @@ -3014,7 +3014,7 @@ sub retrieveResources { my $bailout = shift; if (!defined($bailout)) { $bailout = 0; } my $showall = shift; - my $noblockcheck = shift + my $noblockcheck = shift; # Create the necessary iterator. if (!ref($map)) { # assume it's a url of a map. $map = $self->getResourceByUrl($map); @@ -3202,7 +3202,7 @@ call to lonnet::allowed. This needs to b was already called from another routine called within lonnet::allowed, so as to prevent recursion. -Also note there is some old code floating around that triess to track +Also note there is some old code floating around that tries to track the depth of the iterator to see when it's done; do not copy that code. It is difficult to get right and harder to understand than this. They should be migrated to this new style. @@ -5622,6 +5622,39 @@ sub completable { return 0; } +=pod + +B + +The answerable method differs from the completable method in its handling of problem parts +for which feedback on correctness is suppressed, but the student still has tries left, and +the problem part is not past due, (i.e., the student could submit a different answer if +he/she so chose). For that case completable will return 0, whereas answerable will return 1. + +=cut + +sub answerable { + my $self = shift; + if (!$self->is_problem()) { return 0; } + my $partCount = $self->countParts(); + foreach my $part (@{$self->parts()}) { + if ($part eq '0' && $partCount != 1) { next; } + my $status = $self->status($part); + if ($self->getCompletionStatus($part) == ATTEMPTED() || + $self->getCompletionStatus($part) == CREDIT_ATTEMPTED() || + $status == ANSWER_SUBMITTED() ) { + if ($self->tries($part) < $self->maxtries($part) || !$self->maxtries($part)) { + return 1; + } + } + if ($status == OPEN() || $status == TRIES_LEFT() || $status == NETWORK_FAILURE()) { + return 1; + } + } + # None of the parts were answerable, so neither is this problem. + return 0; +} + =pod =head2 Resource/Nav Map Navigation