version 1.498, 2014/01/19 21:12:35
|
version 1.505, 2015/04/13 16:30:28
|
Line 494 use HTML::Entities;
|
Line 494 use HTML::Entities;
|
|
|
# For debugging |
# For debugging |
|
|
use Data::Dumper; |
#use Data::Dumper; |
|
|
|
|
# symbolic constants |
# symbolic constants |
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 2015 sub new {
|
Line 2020 sub new {
|
my $proto = shift; |
my $proto = shift; |
my $class = ref($proto) || $proto; |
my $class = ref($proto) || $proto; |
my $self = {}; |
my $self = {}; |
bless($self); # So we can call change_user if neceesary |
bless($self); # So we can call change_user if necessary |
|
|
$self->{USERNAME} = shift || $env{'user.name'}; |
$self->{USERNAME} = shift || $env{'user.name'}; |
$self->{DOMAIN} = shift || $env{'user.domain'}; |
$self->{DOMAIN} = shift || $env{'user.domain'}; |
Line 2034 sub new {
|
Line 2039 sub new {
|
|
|
# We can only tie the nav hash as done below if the username/domain |
# We can only tie the nav hash as done below if the username/domain |
# match the env one. Otherwise change_user does everything we need...since we can't |
# match the env one. Otherwise change_user does everything we need...since we can't |
# assume there are course hashes for the specific requested user@domamin: |
# assume there are course hashes for the specific requested user:domain |
|
# Note: change_user is also called if we need the nav hash when printing CODEd |
|
# assignments or printing an exam, in which the enclosing folder for the items in |
|
# the exam has hidden set. |
# |
# |
|
|
if (($self->{USERNAME} eq $env{'user.name'}) && ($self->{DOMAIN} eq $env{'user.domain'}) && !$self->{CODE}) { |
if (($self->{USERNAME} eq $env{'user.name'}) && ($self->{DOMAIN} eq $env{'user.domain'}) && |
|
!$self->{CODE} && !$self->{NOHIDE}) { |
|
|
# tie the nav hash |
# tie the nav hash |
|
|
Line 2108 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 2118 sub change_user {
|
Line 2127 sub change_user {
|
|
|
$self->{PARM_HASH} = \%parm_hash; |
$self->{PARM_HASH} = \%parm_hash; |
|
|
|
} |
|
|
} |
|
|
|
sub generate_course_user_opt { |
sub generate_course_user_opt { |
my $self = shift; |
my $self = shift; |
Line 2183 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 2920 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 2929 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 3002 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 3031 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 3182 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 triess 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 3329 sub new {
|
Line 3349 sub new {
|
if ($resourceCount == 1 && $resource->is_sequence() && !$self->{FORCE_TOP}) { |
if ($resourceCount == 1 && $resource->is_sequence() && !$self->{FORCE_TOP}) { |
my $firstResource = $resource->map_start(); |
my $firstResource = $resource->map_start(); |
my $finishResource = $resource->map_finish(); |
my $finishResource = $resource->map_finish(); |
my $result; |
return Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, |
$result = Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, |
$finishResource, $self->{FILTER}, |
$finishResource, $self->{FILTER}, |
$self->{ALREADY_SEEN}, |
$self->{ALREADY_SEEN}, |
$self->{CONDITION}, |
$self->{CONDITION}, |
$self->{FORCE_TOP}); |
$self->{FORCE_TOP}); |
|
return $result; |
|
|
|
|
|
} |
} |
|
|
# Set up some bookkeeping information. |
# Set up some bookkeeping information. |
Line 3362 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 3511 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 4871 sub extractParts {
|
Line 4888 sub extractParts {
|
} |
} |
} |
} |
} |
} |
my @sortedParts = sort keys %parts; |
my @sortedParts = sort(keys(%parts)); |
$self->{PARTS} = \@sortedParts; |
$self->{PARTS} = \@sortedParts; |
} |
} |
|
|
Line 4892 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 5399 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 5642 sub getPrevious {
|
Line 5659 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 5654 sub getPrevious {
|
Line 5671 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 |