version 1.501, 2014/05/30 13:48:39
|
version 1.507, 2015/04/15 18:56:15
|
Line 1140 sub render_long_status {
|
Line 1140 sub render_long_status {
|
my $info = ''; |
my $info = ''; |
if ($resource->is_problem() || $resource->is_practice()) { |
if ($resource->is_problem() || $resource->is_practice()) { |
$color = $colormap{$resource->status}; |
$color = $colormap{$resource->status}; |
|
|
if (dueInLessThan24Hours($resource, $part) || |
if (dueInLessThan24Hours($resource, $part)) { |
lastTry($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 (lastTry($resource, $part)) { |
|
unless (($resource->problemstatus($part) eq 'no') || |
|
($resource->problemstatus($part) eq 'no_feedback_ever')) { |
|
$color = $hurryUpColor; |
|
$info = ' title="'.&mt('One try remaining!').'"'; |
|
} |
|
} |
} |
} |
|
|
if ($resource->kind() eq "res" && |
if ($resource->kind() eq "res" && |
Line 2112 sub change_user {
|
Line 2117 sub change_user {
|
$self->{PARM_CACHE} = {}; |
$self->{PARM_CACHE} = {}; |
|
|
my %parm_hash = {}; |
my %parm_hash = {}; |
foreach my $key (keys %big_hash) { |
foreach my $key (keys(%big_hash)) { |
if ($key =~ /^param\./) { |
if ($key =~ /^param\./) { |
my $param_key = $key; |
my $param_key = $key; |
$param_key =~ s/^param\.//; |
$param_key =~ s/^param\.//; |
Line 2185 sub generate_email_discuss_status {
|
Line 2190 sub generate_email_discuss_status {
|
my %lastread = &Apache::lonnet::dump('nohist_'.$cid.'_discuss', |
my %lastread = &Apache::lonnet::dump('nohist_'.$cid.'_discuss', |
$self->{DOMAIN},$self->{USERNAME},'lastread'); |
$self->{DOMAIN},$self->{USERNAME},'lastread'); |
my %lastreadtime = (); |
my %lastreadtime = (); |
foreach my $key (keys %lastread) { |
foreach my $key (keys(%lastread)) { |
my $shortkey = $key; |
my $shortkey = $key; |
$shortkey =~ s/_lastread$//; |
$shortkey =~ s/_lastread$//; |
$lastreadtime{$shortkey} = $lastread{$key}; |
$lastreadtime{$shortkey} = $lastread{$key}; |
Line 2922 resource appears multiple times in the c
|
Line 2927 resource appears multiple times in the c
|
will be returned (useful for maps), unless the multiple parameter has |
will be returned (useful for maps), unless the multiple parameter has |
been included, in which case all instances are returned in an array. |
been included, in which case all instances are returned in an array. |
|
|
=item * B<retrieveResources>(map, filterFunc, recursive, bailout, showall): |
=item * B<retrieveResources>(map, filterFunc, recursive, bailout, showall, noblockcheck): |
|
|
The map is a specification of a map to retreive the resources from, |
The map is a specification of a map to retreive the resources from, |
either as a url or as an object. The filterFunc is a reference to a |
either as a url or as an object. The filterFunc is a reference to a |
Line 2931 true if the resource should be included,
|
Line 2936 true if the resource should be included,
|
be. If recursive is true, the map will be recursively examined, |
be. If recursive is true, the map will be recursively examined, |
otherwise it will not be. If bailout is true, the function will return |
otherwise it will not be. If bailout is true, the function will return |
as soon as it finds a resource, if false it will finish. If showall is |
as soon as it finds a resource, if false it will finish. If showall is |
true it will not hide maps that contain nothing but one other map. By |
true it will not hide maps that contain nothing but one other map. The |
default, the map is the top-level map of the course, filterFunc is a |
noblockcheck arg is propagated to become the sixth arg in the call to |
function that always returns 1, recursive is true, bailout is false, |
lonnet::allowed when checking a resource's availability during collection |
showall is false. The resources will be returned in a list containing |
of resources using the iterator. noblockcheck needs to be true if |
the resource objects for the corresponding resources, with B<no |
retrieveResources() was called by a routine that itself was called by |
structure information> in the list; regardless of branching, |
lonnet::allowed, in order to avoid recursion. By default the map |
recursion, etc., it will be a flat list. |
is the top-level map of the course, filterFunc is a function that |
|
always returns 1, recursive is true, bailout is false, showall is |
|
false. The resources will be returned in a list containing the |
|
resource objects for the corresponding resources, with B<no structure |
|
information> in the list; regardless of branching, recursion, etc., |
|
it will be a flat list. |
|
|
Thus, this is suitable for cases where you don't want the structure, |
Thus, this is suitable for cases where you don't want the structure, |
just a list of all resources. It is also suitable for finding out how |
just a list of all resources. It is also suitable for finding out how |
Line 3004 sub retrieveResources {
|
Line 3014 sub retrieveResources {
|
my $bailout = shift; |
my $bailout = shift; |
if (!defined($bailout)) { $bailout = 0; } |
if (!defined($bailout)) { $bailout = 0; } |
my $showall = shift; |
my $showall = shift; |
|
my $noblockcheck = shift; |
# Create the necessary iterator. |
# Create the necessary iterator. |
if (!ref($map)) { # assume it's a url of a map. |
if (!ref($map)) { # assume it's a url of a map. |
$map = $self->getResourceByUrl($map); |
$map = $self->getResourceByUrl($map); |
Line 3033 sub retrieveResources {
|
Line 3044 sub retrieveResources {
|
# Run down the iterator and collect the resources. |
# Run down the iterator and collect the resources. |
my $curRes; |
my $curRes; |
|
|
while ($curRes = $it->next()) { |
while ($curRes = $it->next(undef,$noblockcheck)) { |
if (ref($curRes)) { |
if (ref($curRes)) { |
if (!&$filterFunc($curRes)) { |
if (!&$filterFunc($curRes)) { |
next; |
next; |
Line 3184 Note that inside of the loop, it's frequ
|
Line 3195 Note that inside of the loop, it's frequ
|
resource objects will be references, and any non-references will |
resource objects will be references, and any non-references will |
be the tokens described above. |
be the tokens described above. |
|
|
Also note there is some old code floating around that trys to track |
The next() routine can take two (optional) arguments: |
|
closeAllPages - if true will not recurse down a .page |
|
noblockcheck - passed to browsePriv() for passing as sixth arg to |
|
call to lonnet::allowed. This needs to be set if retrieveResources |
|
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 tries to track |
the depth of the iterator to see when it's done; do not copy that |
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 |
code. It is difficult to get right and harder to understand than |
this. They should be migrated to this new style. |
this. They should be migrated to this new style. |
Line 3360 sub new {
|
Line 3378 sub new {
|
sub next { |
sub next { |
my $self = shift; |
my $self = shift; |
my $closeAllPages=shift; |
my $closeAllPages=shift; |
|
my $noblockcheck = shift; |
if ($self->{FINISHED}) { |
if ($self->{FINISHED}) { |
return END_ITERATOR(); |
return END_ITERATOR(); |
} |
} |
Line 3509 sub next {
|
Line 3528 sub next {
|
# If this is a blank resource, don't actually return it. |
# If this is a blank resource, don't actually return it. |
# Should you ever find you need it, make sure to add an option to the code |
# Should you ever find you need it, make sure to add an option to the code |
# that you can use; other things depend on this behavior. |
# that you can use; other things depend on this behavior. |
my $browsePriv = $self->{HERE}->browsePriv(); |
my $browsePriv = $self->{HERE}->browsePriv($noblockcheck); |
if (!$self->{HERE}->src() || |
if (!$self->{HERE}->src() || |
(!($browsePriv eq 'F') && !($browsePriv eq '2')) ) { |
(!($browsePriv eq 'F') && !($browsePriv eq '2')) ) { |
return $self->next($closeAllPages); |
return $self->next($closeAllPages); |
Line 4869 sub extractParts {
|
Line 4888 sub extractParts {
|
} |
} |
} |
} |
} |
} |
my @sortedParts = sort keys %parts; |
my @sortedParts = sort(keys(%parts)); |
$self->{PARTS} = \@sortedParts; |
$self->{PARTS} = \@sortedParts; |
} |
} |
|
|
Line 4890 sub extractParts {
|
Line 4909 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. |
foreach my $data (split /,/, $metadata) { |
foreach my $data (split(/,/, $metadata)) { |
if ($data =~ /^([a-zA-Z]+)response_(.*)/ |
if ($data =~ /^([a-zA-Z]+)response_(.*)/ |
|| $data =~ /^(Task)_(.*)/) { |
|| $data =~ /^(Task)_(.*)/) { |
my $responseType = $1; |
my $responseType = $1; |
my $partStuff = $2; |
my $partStuff = $2; |
my $partIdSoFar = ''; |
my $partIdSoFar = ''; |
my @partChunks = split /_/, $partStuff; |
my @partChunks = split(/_/, $partStuff); |
my $i = 0; |
my $i = 0; |
for ($i = 0; $i < scalar(@partChunks); $i++) { |
for ($i = 0; $i < scalar(@partChunks); $i++) { |
if ($partIdSoFar) { $partIdSoFar .= '_'; } |
if ($partIdSoFar) { $partIdSoFar .= '_'; } |
Line 5397 sub check_for_slot {
|
Line 5416 sub check_for_slot {
|
} else { |
} else { |
if ($ip ne '') { |
if ($ip ne '') { |
if (!&Apache::loncommon::check_ip_acc($ip)) { |
if (!&Apache::loncommon::check_ip_acc($ip)) { |
return (RESERVED_LOCATION,$ip,$slot_name); |
return (RESERVED_LOCATION,$end,$slot_name); |
} |
} |
} |
} |
my @proctors; |
my @proctors; |
Line 5605 sub completable {
|
Line 5624 sub completable {
|
|
|
=pod |
=pod |
|
|
|
B<Answerable> |
|
|
|
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 |
=head2 Resource/Nav Map Navigation |
|
|
=over 4 |
=over 4 |
Line 5640 sub getPrevious {
|
Line 5692 sub getPrevious {
|
my $self = shift; |
my $self = shift; |
my @branches; |
my @branches; |
my $from = $self->from(); |
my $from = $self->from(); |
foreach my $branch ( split /,/, $from) { |
foreach my $branch ( split(/,/, $from)) { |
my $choice = $self->{NAV_MAP}->getById($branch); |
my $choice = $self->{NAV_MAP}->getById($branch); |
my $prev = $choice->comesfrom(); |
my $prev = $choice->comesfrom(); |
$prev = $self->{NAV_MAP}->getById($prev); |
$prev = $self->{NAV_MAP}->getById($prev); |
Line 5652 sub getPrevious {
|
Line 5704 sub getPrevious {
|
|
|
sub browsePriv { |
sub browsePriv { |
my $self = shift; |
my $self = shift; |
|
my $noblockcheck = shift; |
if (defined($self->{BROWSE_PRIV})) { |
if (defined($self->{BROWSE_PRIV})) { |
return $self->{BROWSE_PRIV}; |
return $self->{BROWSE_PRIV}; |
} |
} |
|
|
$self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(), |
$self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(), |
$self->symb()); |
$self->symb(),undef, |
|
undef,$noblockcheck); |
} |
} |
|
|
=pod |
=pod |