version 1.509.2.3, 2016/08/10 21:29:52
|
version 1.511, 2015/10/05 16:23:49
|
Line 2
|
Line 2
|
# Navigate Maps Handler |
# Navigate Maps Handler |
# |
# |
# $Id$ |
# $Id$ |
|
|
# |
# |
# Copyright Michigan State University Board of Trustees |
# Copyright Michigan State University Board of Trustees |
# |
# |
Line 915 sub render_resource {
|
Line 914 sub render_resource {
|
my $nonLinkedText = ''; # stuff after resource title not in link |
my $nonLinkedText = ''; # stuff after resource title not in link |
|
|
my $link = $params->{"resourceLink"}; |
my $link = $params->{"resourceLink"}; |
if ($resource->ext()) { |
|
$link =~ s/\#.+(\?)/$1/g; |
|
} |
|
|
|
# The URL part is not escaped at this point, but the symb is... |
# The URL part is not escaped at this point, but the symb is... |
|
|
Line 1006 sub render_resource {
|
Line 1002 sub render_resource {
|
'</a>'; |
'</a>'; |
} |
} |
} |
} |
if ($params->{'mapHidden'} || $resource->randomout()) { |
} |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
|
} |
if ($resource->randomout()) { |
} else { |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
if ($resource->randomout()) { |
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
|
} |
|
} |
} |
if (!$resource->condval()) { |
if (!$resource->condval()) { |
$nonLinkedText .= ' <span class="LC_info">('.&mt('conditionally hidden').')</span> '; |
$nonLinkedText .= ' <span class="LC_info">('.&mt('conditionally hidden').')</span> '; |
Line 1587 END
|
Line 1580 END
|
$args->{'indentString'} = setDefault($args->{'indentString'}, "<img src='$location' alt='' />"); |
$args->{'indentString'} = setDefault($args->{'indentString'}, "<img src='$location' alt='' />"); |
$args->{'displayedHereMarker'} = 0; |
$args->{'displayedHereMarker'} = 0; |
|
|
# If we're suppressing empty sequences, look for them here. |
# If we're suppressing empty sequences, look for them here. Use DFS for speed, |
# We also do this even if $args->{'suppressEmptySequences'} |
# since structure actually doesn't matter, except what map has what resources. |
# is not true, so we can hide empty sequences for which the |
if ($args->{'suppressEmptySequences'}) { |
# hiddenresource parameter is set to yes (at map level), or |
my $dfsit = Apache::lonnavmaps::DFSiterator->new($navmap, |
# mark as hidden for users who have $userCanSeeHidden. |
$it->{FIRST_RESOURCE}, |
# Use DFS for speed, since structure actually doesn't matter, |
$it->{FINISH_RESOURCE}, |
# except what map has what resources. |
{}, undef, 1); |
|
my $depth = 0; |
my $dfsit = Apache::lonnavmaps::DFSiterator->new($navmap, |
$dfsit->next(); |
$it->{FIRST_RESOURCE}, |
my $curRes = $dfsit->next(); |
$it->{FINISH_RESOURCE}, |
while ($depth > -1) { |
{}, undef, 1); |
if ($curRes == $dfsit->BEGIN_MAP()) { $depth++; } |
|
if ($curRes == $dfsit->END_MAP()) { $depth--; } |
my $depth = 0; |
|
$dfsit->next(); |
if (ref($curRes)) { |
my $curRes = $dfsit->next(); |
# Parallel pre-processing: Do sequences have non-filtered-out children? |
while ($depth > -1) { |
if ($curRes->is_map()) { |
if ($curRes == $dfsit->BEGIN_MAP()) { $depth++; } |
$curRes->{DATA}->{HAS_VISIBLE_CHILDREN} = 0; |
if ($curRes == $dfsit->END_MAP()) { $depth--; } |
# Sequences themselves do not count as visible children, |
|
# unless those sequences also have visible children. |
if (ref($curRes)) { |
# This means if a sequence appears, there's a "promise" |
# Parallel pre-processing: Do sequences have non-filtered-out children? |
# that there's something under it if you open it, somewhere. |
if ($curRes->is_map()) { |
} else { |
$curRes->{DATA}->{HAS_VISIBLE_CHILDREN} = 0; |
# Not a sequence: if it's filtered, ignore it, otherwise |
# Sequences themselves do not count as visible children, |
# rise up the stack and mark the sequences as having children |
# unless those sequences also have visible children. |
if (&$filterFunc($curRes)) { |
# This means if a sequence appears, there's a "promise" |
for my $sequence (@{$dfsit->getStack()}) { |
# that there's something under it if you open it, somewhere. |
$sequence->{DATA}->{HAS_VISIBLE_CHILDREN} = 1; |
} elsif ($curRes->src()) { |
} |
# Not a sequence: if it's filtered, ignore it, otherwise |
|
# rise up the stack and mark the sequences as having children |
|
if (&$filterFunc($curRes)) { |
|
for my $sequence (@{$dfsit->getStack()}) { |
|
$sequence->{DATA}->{HAS_VISIBLE_CHILDREN} = 1; |
|
} |
} |
} |
} |
} |
} |
|
} continue { |
|
$curRes = $dfsit->next(); |
} |
} |
} continue { |
|
$curRes = $dfsit->next(); |
|
} |
} |
|
|
my $displayedJumpMarker = 0; |
my $displayedJumpMarker = 0; |
Line 1719 END
|
Line 1707 END
|
} |
} |
|
|
# If this is an empty sequence and we're filtering them, continue on |
# If this is an empty sequence and we're filtering them, continue on |
$args->{'mapHidden'} = 0; |
if ($curRes->is_map() && $args->{'suppressEmptySequences'} && |
if (($curRes->is_map()) && (!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN})) { |
!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN}) { |
if ($args->{'suppressEmptySequences'}) { |
next; |
next; |
|
} else { |
|
my $mapname = &Apache::lonnet::declutter($curRes->src()); |
|
$mapname = &Apache::lonnet::deversion($mapname); |
|
if (lc($navmap->get_mapparam(undef,$mapname,"0.hiddenresource")) eq 'yes') { |
|
if ($userCanSeeHidden) { |
|
$args->{'mapHidden'} = 1; |
|
} else { |
|
next; |
|
} |
|
} |
|
} |
|
} |
} |
|
|
# If we're suppressing navmaps and this is a navmap, continue on |
# If we're suppressing navmaps and this is a navmap, continue on |
Line 2743 sub map_printdates {
|
Line 2719 sub map_printdates {
|
|
|
|
|
|
|
my $opendate = $self->get_mapparam($res->symb(),'',"$part.printstartdate"); |
my $opendate = $self->get_mapparam($res->symb(), "$part.printstartdate"); |
my $closedate= $self->get_mapparam($res->symb(),'', "$part.printenddate"); |
my $closedate= $self->get_mapparam($res->symb(), "$part.printenddate"); |
|
|
|
|
return ($opendate, $closedate); |
return ($opendate, $closedate); |
} |
} |
|
|
sub get_mapparam { |
sub get_mapparam { |
my ($self, $symb, $mapname, $what) = @_; |
my ($self, $symb, $what) = @_; |
|
|
# Ensure the course option hash is populated: |
# Ensure the course option hash is populated: |
|
|
Line 2770 sub get_mapparam {
|
Line 2746 sub get_mapparam {
|
my $uname=$self->{USERNAME}; |
my $uname=$self->{USERNAME}; |
my $udom=$self->{DOMAIN}; |
my $udom=$self->{DOMAIN}; |
|
|
unless ($symb || $mapname) { return; } |
unless ($symb) { return ['']; } |
my $result=''; |
my $result=''; |
my ($recursed,@recurseup); |
|
|
|
# Figure out which map we are in. |
# Figure out which map we are in. |
|
|
if ($symb && !$mapname) { |
my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb); |
my ($id,$fn); |
$mapname = &Apache::lonnet::deversion($mapname); |
($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb); |
|
$mapname = &Apache::lonnet::deversion($mapname); |
|
} |
|
|
|
my $rwhat=$what; |
my $rwhat=$what; |
$what=~s/^parameter\_//; |
$what=~s/^parameter\_//; |
Line 2837 sub get_mapparam {
|
Line 2811 sub get_mapparam {
|
} |
} |
# Check the map parameters themselves: |
# Check the map parameters themselves: |
|
|
if ($symb) { |
my $thisparm = $$parmhash{$symbparm}; |
my $symbparm=$symb.'.'.$what; |
if (defined($thisparm)) { |
my $thisparm = $$parmhash{$symbparm}; |
return $thisparm; |
if (defined($thisparm)) { |
|
return $thisparm; |
|
} |
|
} |
} |
|
|
|
|
Line 2907 sub getcourseparam {
|
Line 2878 sub getcourseparam {
|
# |
# |
# We want the course level stuff from the way |
# We want the course level stuff from the way |
# parmval_real operates |
# parmval_real operates |
# TODO: Factor some of this stuff out of |
# TODO: Fator some of this stuff out of |
# both parmval_real and here |
# both parmval_real and here |
# |
# |
my $courselevel = $cid . '.' . $what; |
my $courselevel = $cid . '.' . $what; |
Line 2924 sub getcourseparam {
|
Line 2895 sub getcourseparam {
|
} |
} |
# Try for the group's course level option: |
# Try for the group's course level option: |
|
|
if ($cgroup ne '' and defined($courseopt)) { |
if ($uname ne '' and defined($courseopt)) { |
if (defined($$courseopt{$grplevel})) { |
if (defined($$courseopt{$grplevel})) { |
return $$courseopt{$grplevel}; |
return $$courseopt{$grplevel}; |
} |
} |
Line 2932 sub getcourseparam {
|
Line 2903 sub getcourseparam {
|
|
|
# Try for section level parameters: |
# Try for section level parameters: |
|
|
if ($csec ne '' and defined($courseopt)) { |
if ($csec and defined($courseopt)) { |
if (defined($$courseopt{$seclevel})) { |
if (defined($$courseopt{$seclevel})) { |
return $$courseopt{$seclevel}; |
return $$courseopt{$seclevel}; |
} |
} |
} |
} |
# Try for 'additional' course parameters: |
# Try for 'additional' course parameterse: |
|
|
if (defined($courseopt)) { |
if (defined($courseopt)) { |
if (defined($$courseopt{$courselevel})) { |
if (defined($$courseopt{$courselevel})) { |
Line 4558 sub duedate {
|
Line 4529 sub duedate {
|
my $due_date=$self->parmval("duedate", $part); |
my $due_date=$self->parmval("duedate", $part); |
if ($interval[0] =~ /\d+/) { |
if ($interval[0] =~ /\d+/) { |
my $first_access=&Apache::lonnet::get_first_access($interval[1], |
my $first_access=&Apache::lonnet::get_first_access($interval[1], |
$self->{SYMB}); |
$self->symb); |
if (defined($first_access)) { |
if (defined($first_access)) { |
my $interval = $first_access+$interval[0]; |
my $interval = $first_access+$interval[0]; |
$date = (!$due_date || $interval < $due_date) ? $interval |
$date = (!$due_date || $interval < $due_date) ? $interval |
Line 4640 sub part_display {
|
Line 4611 sub part_display {
|
my $self= shift(); my $partID = shift(); |
my $self= shift(); my $partID = shift(); |
if (! defined($partID)) { $partID = '0'; } |
if (! defined($partID)) { $partID = '0'; } |
my $display=&Apache::lonnet::EXT('resource.'.$partID.'.display', |
my $display=&Apache::lonnet::EXT('resource.'.$partID.'.display', |
$self->{SYMB}); |
$self->symb); |
if (! defined($display) || $display eq '') { |
if (! defined($display) || $display eq '') { |
$display = $partID; |
$display = $partID; |
} |
} |
Line 5436 sub check_for_slot {
|
Line 5407 sub check_for_slot {
|
my $cnum=$env{'course.'.$cid.'.num'}; |
my $cnum=$env{'course.'.$cid.'.num'}; |
my $now = time; |
my $now = time; |
my $num_usable_slots = 0; |
my $num_usable_slots = 0; |
my ($checkedin,$checkedinslot,%consumed_uniq,%slots); |
|
if (@slots > 0) { |
if (@slots > 0) { |
%slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum); |
my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum); |
if (&Apache::lonnet::error(%slots)) { |
if (&Apache::lonnet::error(%slots)) { |
return (UNKNOWN); |
return (UNKNOWN); |
} |
} |
my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime'); |
my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime'); |
|
my ($checkedin,$checkedinslot); |
foreach my $slot_name (@sorted_slots) { |
foreach my $slot_name (@sorted_slots) { |
next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name})); |
next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name})); |
my $end = $slots{$slot_name}->{'endtime'}; |
my $end = $slots{$slot_name}->{'endtime'}; |
Line 5476 sub check_for_slot {
|
Line 5447 sub check_for_slot {
|
$num_usable_slots ++; |
$num_usable_slots ++; |
} |
} |
} |
} |
my ($is_correct,$wait_for_grade); |
my ($is_correct,$got_grade); |
if ($self->is_task()) { |
if ($self->is_task()) { |
my $taskstatus = $self->taskstatus(); |
my $taskstatus = $self->taskstatus(); |
$is_correct = (($taskstatus eq 'pass') || |
$is_correct = (($taskstatus eq 'pass') || |
($self->solved() =~ /^correct_/)); |
($self->solved() =~ /^correct_/)); |
unless ($taskstatus =~ /^(?:pass|fail)$/) { |
$got_grade = ($taskstatus =~ /^(?:pass|fail)$/); |
$wait_for_grade = 1; |
|
} |
|
} else { |
} else { |
unless ($self->completable()) { |
$got_grade = 1; |
$wait_for_grade = 1; |
$is_correct = ($self->solved() =~ /^correct_/); |
} |
|
unless (($self->problemstatus($part) eq 'no') || |
|
($self->problemstatus($part) eq 'no_feedback_ever')) { |
|
$is_correct = ($self->solved($part) =~ /^correct_/); |
|
$wait_for_grade = 0; |
|
} |
|
} |
} |
($checkedin,$checkedinslot) = $self->checkedin(); |
($checkedin,$checkedinslot) = $self->checkedin(); |
if ($checkedin) { |
if ($checkedin) { |
if (ref($slots{$checkedinslot}) eq 'HASH') { |
if (!$got_grade) { |
$consumed_uniq{$checkedinslot} = $slots{$checkedinslot}{'uniqueperiod'}; |
|
} |
|
if ($wait_for_grade) { |
|
return (WAITING_FOR_GRADE); |
return (WAITING_FOR_GRADE); |
} elsif ($is_correct) { |
} elsif ($is_correct) { |
return (CORRECT); |
return (CORRECT); |
Line 5512 sub check_for_slot {
|
Line 5472 sub check_for_slot {
|
my $reservable = &Apache::lonnet::get_reservable_slots($cnum,$cdom,$env{'user.name'}, |
my $reservable = &Apache::lonnet::get_reservable_slots($cnum,$cdom,$env{'user.name'}, |
$env{'user.domain'}); |
$env{'user.domain'}); |
if (ref($reservable) eq 'HASH') { |
if (ref($reservable) eq 'HASH') { |
|
my ($map) = &Apache::lonnet::decode_symb($symb); |
if ((ref($reservable->{'now_order'}) eq 'ARRAY') && (ref($reservable->{'now'}) eq 'HASH')) { |
if ((ref($reservable->{'now_order'}) eq 'ARRAY') && (ref($reservable->{'now'}) eq 'HASH')) { |
foreach my $slot (reverse (@{$reservable->{'now_order'}})) { |
foreach my $slot (reverse (@{$reservable->{'now_order'}})) { |
my $canuse; |
my $canuse; |
if (($reservable->{'now'}{$slot}{'symb'} eq '') || |
if ($reservable->{'now'}{$slot}{'symb'} eq '') { |
($reservable->{'now'}{$slot}{'symb'} eq $symb)) { |
|
$canuse = 1; |
$canuse = 1; |
} |
} else { |
if ($canuse) { |
my %oksymbs; |
if ($checkedin) { |
my @slotsymbs = split(/\s*,\s*/,$reservable->{'now'}{$slot}{'symb'}); |
if (ref($consumed_uniq{$checkedinslot}) eq 'ARRAY') { |
map { $oksymbs{$_} = 1; } @slotsymbs; |
my ($uniqstart,$uniqend)=@{$consumed_uniq{$checkedinslot}}; |
if ($oksymbs{$symb}) { |
if ($reservable->{'now'}{$slot}{'uniqueperiod'} =~ /^(\d+),(\d+)$/) { |
$canuse = 1; |
my ($new_uniq_start,$new_uniq_end) = ($1,$2); |
} else { |
next if (! |
foreach my $item (@slotsymbs) { |
($uniqstart < $new_uniq_start && $uniqend < $new_uniq_start) || |
if ($item =~ /\.(page|sequence)$/) { |
($uniqstart > $new_uniq_end && $uniqend > $new_uniq_end )); |
(undef,undef, my $sloturl) = &Apache::lonnet::decode_symb($item); |
|
if (($map ne '') && ($map eq $sloturl)) { |
|
$canuse = 1; |
|
last; |
|
} |
} |
} |
} |
} |
} |
} |
|
} |
|
if ($canuse) { |
return(RESERVABLE,$reservable->{'now'}{$slot}{'endreserve'}); |
return(RESERVABLE,$reservable->{'now'}{$slot}{'endreserve'}); |
} |
} |
} |
} |
Line 5538 sub check_for_slot {
|
Line 5504 sub check_for_slot {
|
if ((ref($reservable->{'future_order'}) eq 'ARRAY') && (ref($reservable->{'future'}) eq 'HASH')) { |
if ((ref($reservable->{'future_order'}) eq 'ARRAY') && (ref($reservable->{'future'}) eq 'HASH')) { |
foreach my $slot (@{$reservable->{'future_order'}}) { |
foreach my $slot (@{$reservable->{'future_order'}}) { |
my $canuse; |
my $canuse; |
if (($reservable->{'future'}{$slot}{'symb'} eq '') || |
if ($reservable->{'future'}{$slot}{'symb'} eq '') { |
($reservable->{'future'}{$slot}{'symb'} eq $symb)) { |
|
$canuse = 1; |
$canuse = 1; |
} |
} elsif ($reservable->{'future'}{$slot}{'symb'} =~ /,/) { |
if ($canuse) { |
my %oksymbs; |
if ($checkedin) { |
my @slotsymbs = split(/\s*,\s*/,$reservable->{'future'}{$slot}{'symb'}); |
if (ref($consumed_uniq{$checkedinslot}) eq 'ARRAY') { |
map { $oksymbs{$_} = 1; } @slotsymbs; |
my ($uniqstart,$uniqend)=@{$consumed_uniq{$checkedinslot}}; |
if ($oksymbs{$symb}) { |
if ($reservable->{'future'}{$slot}{'uniqueperiod'} =~ /^(\d+),(\d+)$/) { |
$canuse = 1; |
my ($new_uniq_start,$new_uniq_end) = ($1,$2); |
} else { |
next if (! |
foreach my $item (@slotsymbs) { |
($uniqstart < $new_uniq_start && $uniqend < $new_uniq_start) || |
if ($item =~ /\.(page|sequence)$/) { |
($uniqstart > $new_uniq_end && $uniqend > $new_uniq_end )); |
(undef,undef, my $sloturl) = &Apache::lonnet::decode_symb($item); |
|
if (($map ne '') && ($map eq $sloturl)) { |
|
$canuse = 1; |
|
last; |
|
} |
} |
} |
} |
} |
} |
} |
|
} elsif ($reservable->{'future'}{$slot}{'symb'} eq $symb) { |
|
$canuse = 1; |
|
} |
|
if ($canuse) { |
return(RESERVABLE_LATER,$reservable->{'future'}{$slot}{'startreserve'}); |
return(RESERVABLE_LATER,$reservable->{'future'}{$slot}{'startreserve'}); |
} |
} |
} |
} |