version 1.543, 2018/11/13 03:59:00
|
version 1.567, 2025/01/03 05:38:17
|
Line 357 user into thinking that if the sequence
|
Line 357 user into thinking that if the sequence
|
under it; for example, see the "Show Uncompleted Homework" view on the |
under it; for example, see the "Show Uncompleted Homework" view on the |
B<NAV> screen. |
B<NAV> screen. |
|
|
=item * B<suppressNavmaps>: default: false |
=item * B<suppressNavmap>: default: false |
|
|
If true, will not display Navigate Content resources. |
If true, will not display Navigate Content resources. |
|
|
Line 549 my %colormap =
|
Line 549 my %colormap =
|
$resObj->EXCUSED => '#3333FF', |
$resObj->EXCUSED => '#3333FF', |
$resObj->PAST_DUE_ANSWER_LATER => '', |
$resObj->PAST_DUE_ANSWER_LATER => '', |
$resObj->PAST_DUE_NO_ANSWER => '', |
$resObj->PAST_DUE_NO_ANSWER => '', |
|
$resObj->PAST_DUE_ATMPT_ANS => '', |
|
$resObj->PAST_DUE_ATMPT_NOANS => '', |
|
$resObj->PAST_DUE_NO_ATMT_ANS => '', |
|
$resObj->PAST_DUE_NO_ATMT_NOANS => '', |
$resObj->ANSWER_OPEN => '#006600', |
$resObj->ANSWER_OPEN => '#006600', |
$resObj->OPEN_LATER => '', |
$resObj->OPEN_LATER => '', |
$resObj->TRIES_LEFT => '', |
$resObj->TRIES_LEFT => '', |
Line 592 sub getLinkForResource {
|
Line 596 sub getLinkForResource {
|
my $anchor; |
my $anchor; |
if ($res->is_page()) { |
if ($res->is_page()) { |
foreach my $item (@$stack) { if (defined($item)) { $anchor = $item; } } |
foreach my $item (@$stack) { if (defined($item)) { $anchor = $item; } } |
$anchor=&escape($anchor->shown_symb()); |
if ($anchor->encrypted() && !&advancedUser()) { |
|
$anchor='LC_'.$anchor->id(); |
|
} else { |
|
$anchor=&escape($anchor->shown_symb()); |
|
} |
return ($res->link(),$res->shown_symb(),$anchor); |
return ($res->link(),$res->shown_symb(),$anchor); |
} |
} |
# in case folder was skipped over as "only sequence" |
# in case folder was skipped over as "only sequence" |
Line 690 sub getDescription {
|
Line 698 sub getDescription {
|
return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part).$slotinfo; |
return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part).$slotinfo; |
} |
} |
} |
} |
if ($status == $res->PAST_DUE_ANSWER_LATER) { |
if (($status == $res->PAST_DUE_ANSWER_LATER) || ($status == $res->PAST_DUE_ATMPT_ANS) || ($status == $res->PAST_DUE_NO_ATMT_ANS)) { |
return &mt("Answer open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($answer,'start'),$res->symb(),'answerdate',$part)); |
return &mt("Answer open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($answer,'start'),$res->symb(),'answerdate',$part)); |
} |
} |
if ($status == $res->PAST_DUE_NO_ANSWER) { |
if (($status == $res->PAST_DUE_NO_ANSWER) || ($status == $res->PAST_DUE_ATMPT_NOANS) || ($status == $res->PAST_DUE_NO_ATMT_NOANS)) { |
if ($res->is_practice()) { |
if ($res->is_practice()) { |
return &mt("Closed [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'answerdate,duedate',$part)); |
return &mt("Closed [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'answerdate,duedate',$part)); |
} else { |
} else { |
Line 1016 sub render_resource {
|
Line 1024 sub render_resource {
|
if ($it->{CONDITION}) { |
if ($it->{CONDITION}) { |
$nowOpen = !$nowOpen; |
$nowOpen = !$nowOpen; |
} |
} |
|
my $folderType; |
my $folderType = $resource->is_sequence() ? 'folder' : 'page'; |
if (&advancedUser() && $resource->is_missing_map()) { |
|
$folderType = 'none'; |
|
} else { |
|
$folderType = $resource->is_sequence() ? 'folder' : 'page'; |
|
} |
my $title=$resource->title; |
my $title=$resource->title; |
$title=~s/\"/\&qout;/g; |
$title=~s/\"/\&qout;/g; |
if (!$params->{'resource_no_folder_link'}) { |
if (!$params->{'resource_no_folder_link'}) { |
Line 1064 sub render_resource {
|
Line 1076 sub render_resource {
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
} elsif ($params->{'mapUnlisted'}) { |
} elsif ($params->{'mapUnlisted'}) { |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> '; |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> '; |
|
} elsif ($params->{'mapHiddenDeepLink'} || $resource->deeplinkout()) { |
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('not shown').')</span> '; |
} |
} |
} else { |
} else { |
if ($resource->randomout()) { |
if ($resource->randomout()) { |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
} elsif (($resource->deeplink($params->{caller}) eq 'absent') || |
} elsif ($resource->deeplinkout()) { |
($resource->deeplink($params->{caller}) eq 'grades')) { |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('not shown').')</span> '; |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> '; |
} else { |
|
my $deeplink = $resource->deeplink($params->{caller}); |
|
if ((($deeplink eq 'absent') || ($deeplink eq 'grades')) && |
|
&advancedUser()) { |
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> '; |
|
} elsif (($deeplink) && ($deeplink) ne 'full') { |
|
if (&advancedUser()) { |
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('deep-link access'). |
|
')</span> '; |
|
} else { |
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('access via external site'). |
|
')</span> '; |
|
} |
|
} |
} |
} |
} |
} |
if (!$resource->condval()) { |
if (!$resource->condval()) { |
Line 1397 sub render {
|
Line 1424 sub render {
|
$filterFunc = sub { my $res = shift; return !$res->randomout() && |
$filterFunc = sub { my $res = shift; return !$res->randomout() && |
($res->deeplink($args->{'caller'}) ne 'absent') && |
($res->deeplink($args->{'caller'}) ne 'absent') && |
($res->deeplink($args->{'caller'}) ne 'grades') && |
($res->deeplink($args->{'caller'}) ne 'grades') && |
|
!$res->deeplinkout() && |
&$oldFilterFunc($res);}; |
&$oldFilterFunc($res);}; |
} |
} |
|
|
my $condition = 0; |
my $condition = 0; |
if ($env{'form.condition'}) { |
if ($env{'form.condition'}) { |
$condition = 1; |
$condition = 1; |
|
} elsif (($env{'request.deeplink.login'}) && ($env{'request.course.id'}) && (!$userCanSeeHidden)) { |
|
if (!defined($navmap)) { |
|
$navmap = Apache::lonnavmaps::navmap->new(); |
|
} |
|
if (defined($navmap)) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $symb = &Apache::loncommon::symb_from_tinyurl($env{'request.deeplink.login'},$cnum,$cdom); |
|
if ($symb) { |
|
my $deeplink; |
|
my $res = $navmap->getBySymb($symb); |
|
if ($res->is_map()) { |
|
my $mapname = &Apache::lonnet::declutter($res->src()); |
|
$mapname = &Apache::lonnet::deversion($mapname); |
|
$deeplink = $navmap->get_mapparam(undef,$mapname,"0.deeplink"); |
|
} else { |
|
$deeplink = $res->deeplink(); |
|
} |
|
if ($deeplink ne '') { |
|
if ((split(/,/,$deeplink))[1] eq 'hide') { |
|
if ($res->is_map()) { |
|
map { $filterHash->{$_} = 1 if $_ } split(/,/,$res->map_hierarchy()); |
|
} else { |
|
my $mapurl = (&Apache::lonnet::decode_symb($symb))[0]; |
|
my $map = $navmap->getResourceByUrl($mapurl); |
|
map { $filterHash->{$_} = 1 if $_ } split(/,/,$map->map_hierarchy()); |
|
} |
|
} |
|
} |
|
} |
|
} |
} |
} |
|
|
if (!$env{'form.folderManip'} && !defined($args->{'iterator'})) { |
if (!$env{'form.folderManip'} && !defined($args->{'iterator'}) && !$args->{'nocurrloc'}) { |
# Step 1: Check to see if we have a navmap |
# Step 1: Check to see if we have a navmap |
if (!defined($navmap)) { |
if (!defined($navmap)) { |
$navmap = Apache::lonnavmaps::navmap->new(); |
$navmap = Apache::lonnavmaps::navmap->new(); |
Line 1444 sub render {
|
Line 1503 sub render {
|
my $mapIterator = $navmap->getIterator(undef, undef, undef, 1); |
my $mapIterator = $navmap->getIterator(undef, undef, undef, 1); |
my $curRes; |
my $curRes; |
my $found = 0; |
my $found = 0; |
|
my $here_is_navmaps = 0; |
|
if ($here =~ m{___\d+___adm/navmaps$}) { |
|
$here_is_navmaps = 1; |
|
} |
|
|
# We only need to do this if we need to open the maps to show the |
# We only need to do this if we need to open the maps to show the |
# current position. This will change the counter so we can't count |
# current position. This will change the counter so we can't count |
# for the jump marker with this loop. |
# for the jump marker with this loop. |
while ($here && ($curRes = $mapIterator->next()) && !$found) { |
while ($here && ($curRes = $mapIterator->next()) && !$found && !$here_is_navmaps) { |
if (ref($curRes) && $curRes->symb() eq $here) { |
if (ref($curRes) && $curRes->symb() eq $here) { |
my $mapStack = $mapIterator->getStack(); |
my $mapStack = $mapIterator->getStack(); |
|
|
Line 1490 sub render {
|
Line 1553 sub render {
|
if ($args->{'iterator_map'}) { |
if ($args->{'iterator_map'}) { |
my $map = $args->{'iterator_map'}; |
my $map = $args->{'iterator_map'}; |
$map = $navmap->getResourceByUrl($map); |
$map = $navmap->getResourceByUrl($map); |
my $firstResource = $map->map_start(); |
if (ref($map)) { |
my $finishResource = $map->map_finish(); |
my $firstResource = $map->map_start(); |
|
my $finishResource = $map->map_finish(); |
$args->{'iterator'} = $it = $navmap->getIterator($firstResource, $finishResource, $filterHash, $condition); |
$args->{'iterator'} = $it = $navmap->getIterator($firstResource, $finishResource, $filterHash, $condition); |
|
} else { |
|
return; |
|
} |
} else { |
} else { |
$args->{'iterator'} = $it = $navmap->getIterator(undef, undef, $filterHash, $condition,undef,$args->{'include_top_level_map'}); |
$args->{'iterator'} = $it = $navmap->getIterator(undef, undef, $filterHash, $condition,undef,$args->{'include_top_level_map'}); |
} |
} |
Line 1562 sub render {
|
Line 1628 sub render {
|
'&here='.&escape($here); |
'&here='.&escape($here); |
$text='Open all folders'; |
$text='Open all folders'; |
} |
} |
if ($env{'form.register'}) { |
|
$link .= '&register='.$env{'form.register'}; |
|
} |
|
if ($args->{'caller'} eq 'navmapsdisplay') { |
if ($args->{'caller'} eq 'navmapsdisplay') { |
unless ($args->{'notools'}) { |
unless ($args->{'notools'}) { |
&add_linkitem($args->{'linkitems'},'changefolder', |
&add_linkitem($args->{'linkitems'},'changefolder', |
Line 1578 sub render {
|
Line 1641 sub render {
|
|
|
# Check for any unread discussions in all resources. |
# Check for any unread discussions in all resources. |
if (($args->{'caller'} eq 'navmapsdisplay') && (!$args->{'notools'})) { |
if (($args->{'caller'} eq 'navmapsdisplay') && (!$args->{'notools'})) { |
|
my $markread = 'Mark all posts read'; |
&add_linkitem($args->{'linkitems'},'clearbubbles', |
&add_linkitem($args->{'linkitems'},'clearbubbles', |
'document.clearbubbles.submit()', |
'document.clearbubbles.submit()', |
'Mark all posts read'); |
$markread); |
my $time=time; |
my $time=time; |
|
my $submit = &mt($markread); |
my $querystr = &HTML::Entities::encode($ENV{'QUERY_STRING'},'<>&"'); |
my $querystr = &HTML::Entities::encode($ENV{'QUERY_STRING'},'<>&"'); |
$result .= (<<END); |
$result .= (<<END); |
<form name="clearbubbles" method="post" action="/adm/feedback"> |
<form name="clearbubbles" method="post" action="/adm/feedback" aria-hidden="true"> |
<input type="hidden" name="navurl" value="$querystr" /> |
<input type="hidden" name="navurl" value="$querystr" /> |
<input type="hidden" name="navtime" value="$time" /> |
<input type="hidden" name="navtime" value="$time" /> |
END |
END |
if ($env{'form.register'}) { |
if ($args->{'sort'} eq 'discussion') { |
$result .= '<input type="hidden" name="register" value="'.$env{'form.register'}.'" />'; |
|
} |
|
if ($args->{'sort'} eq 'discussion') { |
|
my $totdisc = 0; |
my $totdisc = 0; |
my $haveDisc = ''; |
my $haveDisc = ''; |
my @allres=$navmap->retrieveResources(); |
my @allres=$navmap->retrieveResources(); |
Line 1605 END
|
Line 1667 END
|
$haveDisc =~ s/:$//; |
$haveDisc =~ s/:$//; |
$result .= (<<END); |
$result .= (<<END); |
<input type="hidden" name="navmaps" value="$haveDisc" /> |
<input type="hidden" name="navmaps" value="$haveDisc" /> |
</form> |
|
END |
END |
} |
} |
} |
} |
$result.='</form>'; |
$result .= <<END; |
|
<input type="submit" value="$submit" class="LC_visually_hidden" tabindex="-1" disabled="disabled" /> |
|
</form> |
|
END |
} |
} |
if (($args->{'caller'} eq 'navmapsdisplay') && |
if (($args->{'caller'} eq 'navmapsdisplay') && ($env{'request.course.id'})) { |
((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) || |
|
(&Apache::lonnet::allowed('cev',$env{'request.course.id'})))) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
if ($env{'course.'.$env{'request.course.id'}.'.url'} eq |
if ($env{'course.'.$env{'request.course.id'}.'.url'} eq |
"uploaded/$cdom/$cnum/default.sequence") { |
"uploaded/$cdom/$cnum/default.sequence") { |
&add_linkitem($args->{'linkitems'},'edittoplevel', |
if ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) || |
"javascript:gocmd('/adm/coursedocs','editdocs');", |
(&Apache::lonnet::allowed('cev',$env{'request.course.id'}))) { |
'Content Editor'); |
&add_linkitem($args->{'linkitems'},'edittoplevel', |
|
"javascript:gocmd('/adm/coursedocs','editdocs');", |
|
'Content Editor'); |
|
} |
|
if ($counter) { |
|
&add_linkitem($args->{'linkitems'},'printout', |
|
"javascript:gopost('/adm/printout','/adm/navmaps');", |
|
'Prepare a printable document'); |
|
} |
} |
} |
} |
} |
|
|
Line 1666 END
|
Line 1736 END
|
# mark as hidden for users who have $userCanSeeHidden. |
# mark as hidden for users who have $userCanSeeHidden. |
# Use DFS for speed, since structure actually doesn't matter, |
# Use DFS for speed, since structure actually doesn't matter, |
# except what map has what resources. |
# except what map has what resources. |
|
# |
|
# To ensure the "Selected Resources from selected folder in course" |
|
# printout generation option will work in sessions launched via a |
|
# deep link, the value of $args->{'filterFunc'} included in the |
|
# call to lonnavmaps::render() is omitted from the filter function |
|
# used with the DFS Iterator when $args->{'caller'} is 'printout'. |
|
# |
|
# As a result $sequence->{DATA}->{HAS_VISIBLE_CHILDREN} can be |
|
# set to 1 for folder(s) which include resources only accessible |
|
# for sessions launched via a deep link, when the current session |
|
# is of that type. |
|
|
my $dfsit = Apache::lonnavmaps::DFSiterator->new($navmap, |
my $dfsit = Apache::lonnavmaps::DFSiterator->new($navmap, |
$it->{FIRST_RESOURCE}, |
$it->{FIRST_RESOURCE}, |
$it->{FINISH_RESOURCE}, |
$it->{FINISH_RESOURCE}, |
{}, undef, 1); |
{}, undef, 1); |
|
my $dfsFilterFunc; |
|
if ($args->{'caller'} eq 'printout') { |
|
$dfsFilterFunc = sub { my $res = shift; return !$res->randomout() && |
|
($res->deeplink($args->{'caller'}) ne 'absent') && |
|
($res->deeplink($args->{'caller'}) ne 'grades') && |
|
!$res->deeplinkout();}; |
|
} else { |
|
$dfsFilterFunc = $filterFunc; |
|
} |
my $depth = 0; |
my $depth = 0; |
$dfsit->next(); |
$dfsit->next(); |
my $curRes = $dfsit->next(); |
my $curRes = $dfsit->next(); |
Line 1689 END
|
Line 1779 END
|
} elsif ($curRes->src()) { |
} elsif ($curRes->src()) { |
# Not a sequence: if it's filtered, ignore it, otherwise |
# Not a sequence: if it's filtered, ignore it, otherwise |
# rise up the stack and mark the sequences as having children |
# rise up the stack and mark the sequences as having children |
if (&$filterFunc($curRes)) { |
if (&$dfsFilterFunc($curRes)) { |
for my $sequence (@{$dfsit->getStack()}) { |
for my $sequence (@{$dfsit->getStack()}) { |
|
next unless ($sequence->is_map()); |
$sequence->{DATA}->{HAS_VISIBLE_CHILDREN} = 1; |
$sequence->{DATA}->{HAS_VISIBLE_CHILDREN} = 1; |
} |
} |
} |
} |
Line 1814 END
|
Line 1905 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; |
$args->{'mapHidden'} = 0; |
$args->{'mapUnlisted'} = 0; |
$args->{'mapUnlisted'} = 0; |
|
$args->{'mapHiddenDeepLink'} = 0; |
if (($curRes->is_map()) && (!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN})) { |
if (($curRes->is_map()) && (!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN})) { |
if ($args->{'suppressEmptySequences'}) { |
if ($args->{'suppressEmptySequences'}) { |
next; |
next; |
Line 1826 END
|
Line 1918 END
|
} else { |
} else { |
next; |
next; |
} |
} |
|
} elsif ($curRes->deeplinkout) { |
|
if ($userCanSeeHidden) { |
|
$args->{'mapHiddenDeepLink'} = 1; |
|
} else { |
|
next; |
|
} |
} else { |
} else { |
my $deeplink = $navmap->get_mapparam(undef,$mapname,"0.deeplink"); |
my $deeplink = $navmap->get_mapparam(undef,$mapname,"0.deeplink"); |
if (($deeplink eq 'absent') || ($deeplink eq 'grades')) { |
my ($state,$others,$listed) = split(/,/,$deeplink); |
|
if (($listed eq 'absent') || ($listed eq 'grades')) { |
if ($userCanSeeHidden) { |
if ($userCanSeeHidden) { |
$args->{'mapUnlisted'} = 1; |
$args->{'mapUnlisted'} = 1; |
} else { |
} else { |
Line 1899 END
|
Line 1998 END
|
} |
} |
} |
} |
# If deep-link parameter is set (and is not set to full) suppress link |
# If deep-link parameter is set (and is not set to full) suppress link |
# unless priviliged user, or calling context is sequence, and parameter |
# unless privileged user, tinyurl used for login resolved to a map, and |
# set at map level |
# the resource is within the map. |
if ((!$curRes->deeplink($args->{'caller'})) || |
if ((!$curRes->deeplink($args->{'caller'})) || |
($curRes->deeplink($args->{'caller'}) eq 'full') || &advancedUser()) { |
($curRes->deeplink($args->{'caller'}) eq 'full') || &advancedUser()) { |
$args->{'resource_nolink'} = 0; |
$args->{'resource_nolink'} = 0; |
Line 1933 END
|
Line 2032 END
|
if ($env{'request.course.id'}) { |
if ($env{'request.course.id'}) { |
if (($is_ssl) && ($src =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) && |
if (($is_ssl) && ($src =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) && |
($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { |
($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { |
if ($hostname ne '') { |
unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) { |
$src = 'http://'.$hostname.$src; |
if ($hostname ne '') { |
|
$src = 'http://'.$hostname.$src; |
|
} |
|
$src .= ($srcHasQuestion? '&' : '?') . 'usehttp=1'; |
|
$srcHasQuestion = 1; |
} |
} |
$src .= ($srcHasQuestion? '&' : '?') . 'usehttp=1'; |
|
$srcHasQuestion = 1; |
|
} elsif (($is_ssl) && ($src =~ m{^\Q/adm/wrapper/ext/\E(?!https:)})) { |
} elsif (($is_ssl) && ($src =~ m{^\Q/adm/wrapper/ext/\E(?!https:)})) { |
if ($hostname ne '') { |
unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) { |
$src = 'http://'.$hostname.$src; |
if ($hostname ne '') { |
|
$src = 'http://'.$hostname.$src; |
|
} |
|
$src .= ($srcHasQuestion? '&' : '?') . 'usehttp=1'; |
|
$srcHasQuestion = 1; |
} |
} |
} |
} |
} |
} |
Line 1979 END
|
Line 2084 END
|
$currentJumpDelta) { |
$currentJumpDelta) { |
# Jam the anchor after the <td> tag; |
# Jam the anchor after the <td> tag; |
# necessary for valid HTML (which Mozilla requires) |
# necessary for valid HTML (which Mozilla requires) |
$colHTML =~ s/\>/\>\<a name="curloc" \/\>/; |
$colHTML =~ s/\>/\>\<a name="curloc" \>\<\/a\>/; |
$displayedJumpMarker = 1; |
$displayedJumpMarker = 1; |
} |
} |
$result .= $colHTML . "\n"; |
$result .= $colHTML . "\n"; |
Line 2053 sub show_linkitems_toolbar {
|
Line 2158 sub show_linkitems_toolbar {
|
$result .= '<td align="left">'."\n". |
$result .= '<td align="left">'."\n". |
'<ul id="LC_toolbar">'; |
'<ul id="LC_toolbar">'; |
my @linkorder = ('firsthomework','everything','uncompleted', |
my @linkorder = ('firsthomework','everything','uncompleted', |
'changefolder','clearbubbles','edittoplevel'); |
'changefolder','clearbubbles','printout','edittoplevel'); |
foreach my $link (@linkorder) { |
foreach my $link (@linkorder) { |
if (ref($args->{'linkitems'}{$link}) eq 'HASH') { |
if (ref($args->{'linkitems'}{$link}) eq 'HASH') { |
if ($args->{'linkitems'}{$link}{'text'} ne '') { |
if ($args->{'linkitems'}{$link}{'text'} ne '') { |
Line 2185 sub new {
|
Line 2290 sub new {
|
|
|
$self->{USERNAME} = shift || $env{'user.name'}; |
$self->{USERNAME} = shift || $env{'user.name'}; |
$self->{DOMAIN} = shift || $env{'user.domain'}; |
$self->{DOMAIN} = shift || $env{'user.domain'}; |
|
$self->{SECTION} = shift; |
$self->{CODE} = shift; |
$self->{CODE} = shift; |
$self->{NOHIDE} = shift; |
$self->{NOHIDE} = shift; |
|
|
|
|
|
if (($self->{SECTION} eq '') && ($env{'request.course.sec'} ne '')) { |
|
if (($self->{USERNAME} eq $env{'user.name'}) && |
|
($self->{USERNAME} eq $env{'user.domain'})) { |
|
$self->{SECTION} = $env{'request.course.sec'}; |
|
} |
|
} |
|
|
# Resource cache stores navmap resources as we reference them. We generate |
# Resource cache stores navmap resources as we reference them. We generate |
# them on-demand so we don't pay for creating resources unless we use them. |
# them on-demand so we don't pay for creating resources unless we use them. |
Line 2230 sub new {
|
Line 2342 sub new {
|
$self->{PARM_HASH} = \%parmhash; |
$self->{PARM_HASH} = \%parmhash; |
$self->{PARM_CACHE} = {}; |
$self->{PARM_CACHE} = {}; |
} else { |
} else { |
$self->change_user($self->{USERNAME}, $self->{DOMAIN}, $self->{CODE}, $self->{NOHIDE}); |
$self->change_user($self->{USERNAME}, $self->{DOMAIN}, $self->{SECTION}, $self->{CODE}, $self->{NOHIDE}); |
} |
} |
|
|
return $self; |
return $self; |
Line 2241 sub new {
|
Line 2353 sub new {
|
# username/domain associated with a navmap (e.g. to navigate for someone |
# username/domain associated with a navmap (e.g. to navigate for someone |
# else besides the current user...if sufficiently privileged. |
# else besides the current user...if sufficiently privileged. |
# Parameters: |
# Parameters: |
# user - New user. |
# user - New user. |
# domain- Domain the user belongs to. |
# domain - Domain to which the user belongs. |
# code - Anonymous CODE in use. |
# section - Section to which the user belongs. |
|
# code - Anonymous CODE in use. |
# Implicit inputs: |
# Implicit inputs: |
# |
# |
sub change_user { |
sub change_user { |
my $self = shift; |
my $self = shift; |
$self->{USERNAME} = shift; |
$self->{USERNAME} = shift; |
$self->{DOMAIN} = shift; |
$self->{DOMAIN} = shift; |
|
$self->{SECTION} = shift; |
$self->{CODE} = shift; |
$self->{CODE} = shift; |
$self->{NOHIDE} = shift; |
$self->{NOHIDE} = shift; |
|
|
Line 2466 sub getIterator {
|
Line 2580 sub getIterator {
|
my $self = shift; |
my $self = shift; |
my $iterator = Apache::lonnavmaps::iterator->new($self, shift, shift, |
my $iterator = Apache::lonnavmaps::iterator->new($self, shift, shift, |
shift, undef, shift, |
shift, undef, shift, |
shift, shift); |
shift, shift, shift); |
return $iterator; |
return $iterator; |
} |
} |
|
|
Line 2756 sub parmval_real {
|
Line 2870 sub parmval_real {
|
$self->generate_course_user_opt(); |
$self->generate_course_user_opt(); |
|
|
my $cid=$env{'request.course.id'}; |
my $cid=$env{'request.course.id'}; |
my $csec=$env{'request.course.sec'}; |
my $csec=$self->{SECTION}; |
my $cgroup=''; |
my $cgroup=''; |
my @cgrps=split(/:/,$env{'request.course.groups'}); |
my @cgrps=split(/:/,$env{'request.course.groups'}); |
if (@cgrps > 0) { |
if (@cgrps > 0) { |
Line 2945 sub parmval_real {
|
Line 3059 sub parmval_real {
|
} |
} |
|
|
sub recurseup_maps { |
sub recurseup_maps { |
my ($self,$mapname) = @_; |
my ($self,$mapname,$getsymb) = @_; |
my @recurseup; |
my @recurseup; |
if ($mapname) { |
if ($mapname) { |
my $res = $self->getResourceByUrl($mapname); |
my $res = $self->getResourceByUrl($mapname); |
Line 2953 sub recurseup_maps {
|
Line 3067 sub recurseup_maps {
|
my @pcs = split(/,/,$res->map_hierarchy()); |
my @pcs = split(/,/,$res->map_hierarchy()); |
shift(@pcs); |
shift(@pcs); |
if (@pcs) { |
if (@pcs) { |
@recurseup = map { &Apache::lonnet::declutter($self->getByMapPc($_)->src()); } reverse(@pcs); |
if ($getsymb) { |
|
@recurseup = map { &Apache::lonnet::declutter($self->getByMapPc($_)->symb()); } reverse(@pcs); |
|
} else { |
|
@recurseup = map { &Apache::lonnet::declutter($self->getByMapPc($_)->src()); } reverse(@pcs); |
|
} |
} |
} |
} |
} |
} |
} |
Line 2985 sub recursed_crumbs {
|
Line 3103 sub recursed_crumbs {
|
my $pc = $map->map_pc(); |
my $pc = $map->map_pc(); |
next if ((!$pc) || ($pc == 1)); |
next if ((!$pc) || ($pc == 1)); |
push(@links,$map); |
push(@links,$map); |
push(@revmapinfo,{'href' => $map->link().'?navmap=1','text' => $map->title(),'no_mt' => 1,}); |
my $text = $map->title(); |
$totallength += length($map->title()); |
if ($text eq '') { |
|
$text = '...'; |
|
} |
|
push(@revmapinfo,{'href' => $env{'request.use_absolute'}.$map->link().'?navmap=1','text' => $text,'no_mt' => 1,}); |
|
$totallength += length($text); |
} |
} |
my $numlinks = scalar(@links); |
my $numlinks = scalar(@links); |
if ($numlinks) { |
if ($numlinks) { |
Line 2998 sub recursed_crumbs {
|
Line 3120 sub recursed_crumbs {
|
} |
} |
@revmapinfo = (); |
@revmapinfo = (); |
foreach my $map (@links) { |
foreach my $map (@links) { |
my $showntitle = &truncate_crumb_text($map->title(),$avg); |
my $title = $map->title(); |
|
if ($title eq '') { |
|
$title = '...'; |
|
} |
|
my $showntitle = &truncate_crumb_text($title,$avg); |
if ($showntitle ne '') { |
if ($showntitle ne '') { |
push(@revmapinfo,{'href' => $map->link().'?navmap=1','text' => $showntitle,'no_mt' => 1,}); |
push(@revmapinfo,{'href' => $env{'request.use_absolute'}.$map->link().'?navmap=1','text' => $showntitle,'no_mt' => 1,}); |
} |
} |
} |
} |
} |
} |
Line 3073 sub get_mapparam {
|
Line 3199 sub get_mapparam {
|
# Get the course id and section if there is one. |
# Get the course id and section if there is one. |
|
|
my $cid=$env{'request.course.id'}; |
my $cid=$env{'request.course.id'}; |
my $csec=$env{'request.course.sec'}; |
my $csec=$self->{SECTION}; |
my $cgroup=''; |
my $cgroup=''; |
my @cgrps=split(/:/,$env{'request.course.groups'}); |
my @cgrps=split(/:/,$env{'request.course.groups'}); |
if (@cgrps > 0) { |
if (@cgrps > 0) { |
Line 3230 sub get_mapparam {
|
Line 3356 sub get_mapparam {
|
if (defined($$courseopt{$courselevelm})) { |
if (defined($$courseopt{$courselevelm})) { |
return $$courseopt{$courselevelm}; |
return $$courseopt{$courselevelm}; |
} |
} |
|
if (defined($$courseopt{$courseleveli})) { |
|
return $$courseopt{$courseleveli}; |
|
} |
unless ($recursed) { |
unless ($recursed) { |
@recurseup = $self->recurseup_maps($mapname); |
@recurseup = $self->recurseup_maps($mapname); |
$recursed = 1; |
$recursed = 1; |
Line 3271 sub getcourseparam {
|
Line 3400 sub getcourseparam {
|
|
|
my $uname = $self->{USERNAME}; |
my $uname = $self->{USERNAME}; |
my $udom = $self->{DOMAIN}; |
my $udom = $self->{DOMAIN}; |
|
my $csec = $self->{SECTION}; |
|
|
# Course, section, group ids come from the env: |
# Course and group ids come from the env: |
|
|
my $cid = $env{'request.course.id'}; |
my $cid = $env{'request.course.id'}; |
my $csec = $env{'request.course.sec'}; |
|
my $cgroup = ''; # Assume no group |
my $cgroup = ''; # Assume no group |
|
|
my @cgroups = split(/:/, $env{'request.course.groups'}); |
my @cgroups = split(/:/, $env{'request.course.groups'}); |
Line 3603 getIterator behaves as follows:
|
Line 3732 getIterator behaves as follows:
|
|
|
=over 4 |
=over 4 |
|
|
=item * B<getIterator>(firstResource, finishResource, filterHash, condition, forceTop, returnTopMap): |
=item * B<getIterator>(firstResource, finishResource, filterHash, condition, forceTop, returnTopMap, $deeplinklisted): |
|
|
All parameters are optional. firstResource is a resource reference |
All parameters are optional. firstResource is a resource reference |
corresponding to where the iterator should start. It defaults to |
corresponding to where the iterator should start. It defaults to |
Line 3620 that is not just a single, 'redirecting'
|
Line 3749 that is not just a single, 'redirecting'
|
will return all information, starting with the top-level map, |
will return all information, starting with the top-level map, |
regardless of content. returnTopMap, if true (default false), will |
regardless of content. returnTopMap, if true (default false), will |
cause the iterator to return the top-level map object (resource 0.0) |
cause the iterator to return the top-level map object (resource 0.0) |
before anything else. |
before anything else. deeplinklisted if true (default false), will |
|
check "listed" status of a resource with a deeplink, and unless "absent" |
|
will exclude deeplink checking when retrieving the browsePriv from |
|
lonnet::allowed(). |
|
|
Thus, by default, only top-level resources will be shown. Change the |
Thus, by default, only top-level resources will be shown. Change the |
condition to a 1 without changing the hash, and all resources will be |
condition to a 1 without changing the hash, and all resources will be |
Line 3757 sub new {
|
Line 3889 sub new {
|
# have we done that yet? |
# have we done that yet? |
$self->{HAVE_RETURNED_0} = 0; |
$self->{HAVE_RETURNED_0} = 0; |
|
|
|
# Do we want to check the "listed" status for a resource for which |
|
# deeplinking applies. |
|
$self->{DEEPLINKLISTED} = shift; |
|
|
# Now, we need to pre-process the map, by walking forward and backward |
# Now, we need to pre-process the map, by walking forward and backward |
# over the parts of the map we're going to look at. |
# over the parts of the map we're going to look at. |
|
|
Line 3848 sub new {
|
Line 3984 sub new {
|
$finishResource, $self->{FILTER}, |
$finishResource, $self->{FILTER}, |
$self->{ALREADY_SEEN}, |
$self->{ALREADY_SEEN}, |
$self->{CONDITION}, |
$self->{CONDITION}, |
$self->{FORCE_TOP}); |
$self->{FORCE_TOP}, |
|
undef,$self->{DEEPLINKLISTED}); |
} |
} |
|
|
# Set up some bookkeeping information. |
# Set up some bookkeeping information. |
Line 4008 sub next {
|
Line 4145 sub next {
|
# That ends the main iterator logic. Now, do we want to recurse |
# That ends the main iterator logic. Now, do we want to recurse |
# down this map (if this resource is a map)? |
# down this map (if this resource is a map)? |
if ( ($self->{HERE}->is_sequence() || (!$closeAllPages && $self->{HERE}->is_page())) && |
if ( ($self->{HERE}->is_sequence() || (!$closeAllPages && $self->{HERE}->is_page())) && |
(defined($self->{FILTER}->{$self->{HERE}->map_pc()}) xor $self->{CONDITION})) { |
(defined($self->{FILTER}->{$self->{HERE}->map_pc()}) xor $self->{CONDITION}) && |
|
($env{'request.role.adv'} || !$self->{HERE}->randomout())) { |
$self->{RECURSIVE_ITERATOR_FLAG} = 1; |
$self->{RECURSIVE_ITERATOR_FLAG} = 1; |
my $firstResource = $self->{HERE}->map_start(); |
my $firstResource = $self->{HERE}->map_start(); |
my $finishResource = $self->{HERE}->map_finish(); |
my $finishResource = $self->{HERE}->map_finish(); |
Line 4017 sub next {
|
Line 4155 sub next {
|
$finishResource, $self->{FILTER}, |
$finishResource, $self->{FILTER}, |
$self->{ALREADY_SEEN}, |
$self->{ALREADY_SEEN}, |
$self->{CONDITION}, |
$self->{CONDITION}, |
$self->{FORCE_TOP}); |
$self->{FORCE_TOP}, |
|
undef,$self->{DEEPLINKLISTED}); |
} |
} |
|
|
# 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($noblockcheck); |
my $browsePriv = $self->{HERE}->browsePriv($noblockcheck,$self->{DEEPLINKLISTED}); |
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 4451 sub from { my $self=shift; return $self-
|
Line 4590 sub from { my $self=shift; return $self-
|
sub goesto { my $self=shift; return $self->navHash("goesto_", 1); } |
sub goesto { my $self=shift; return $self->navHash("goesto_", 1); } |
sub kind { my $self=shift; return $self->navHash("kind_", 1); } |
sub kind { my $self=shift; return $self->navHash("kind_", 1); } |
sub randomout { my $self=shift; return $self->navHash("randomout_", 1); } |
sub randomout { my $self=shift; return $self->navHash("randomout_", 1); } |
|
sub deeplinkout { my $self=shift; return $self->navHash("deeplinkout_", 1); } |
sub randompick { |
sub randompick { |
my $self = shift; |
my $self = shift; |
my $randompick = $self->parmval('randompick'); |
my $randompick = $self->parmval('randompick'); |
Line 4690 sub is_sequence {
|
Line 4830 sub is_sequence {
|
return $self->navHash("is_map_", 1) && |
return $self->navHash("is_map_", 1) && |
$self->navHash("map_type_" . $self->map_pc()) eq 'sequence'; |
$self->navHash("map_type_" . $self->map_pc()) eq 'sequence'; |
} |
} |
|
sub is_missing_map { |
|
my $self=shift; |
|
return $self->navHash("is_map_", 1) && |
|
$self->navHash("map_type_" . $self->map_pc()) eq 'none'; |
|
} |
sub is_survey { |
sub is_survey { |
my $self = shift(); |
my $self = shift(); |
my $part = shift(); |
my $part = shift(); |
Line 5117 sub weight {
|
Line 5262 sub weight {
|
my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight', |
my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight', |
$self->{SYMB}, $self->{DOMAIN}, |
$self->{SYMB}, $self->{DOMAIN}, |
$self->{USERNAME}, |
$self->{USERNAME}, |
$env{'request.course.sec'}); |
$self->{SECTION}); |
return $weight; |
return $weight; |
} |
} |
sub part_display { |
sub part_display { |
Line 5139 sub slot_control {
|
Line 5284 sub slot_control {
|
return ($useslots,$availablestudent,$available); |
return ($useslots,$availablestudent,$available); |
} |
} |
sub deeplink { |
sub deeplink { |
my ($self,$caller) = @_; |
my ($self,$caller,$action) = @_; |
if ($caller eq 'sequence') { |
my $deeplink = $self->parmval("deeplink"); |
my @deeplink = $self->parmval("deeplink"); |
if ($deeplink) { |
if ($deeplink[1] eq 'resource') { |
my ($state,$others,$listed,$scope) = split(/,/,$deeplink); |
return $deeplink[0]; |
if ($action eq 'getlisted') { |
|
return $listed; |
|
} |
|
if ($env{'request.deeplink.login'}) { |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom); |
|
if ($deeplink_symb) { |
|
my ($loginmap,$mapname); |
|
if ($deeplink_symb =~ /\.(page|sequence)$/) { |
|
$mapname = $self->enclosing_map_src(); |
|
$loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[2]); |
|
return if ($mapname eq $loginmap); |
|
} else { |
|
return if ($deeplink_symb eq $self->symb()); |
|
if (($scope eq 'map') || ($scope eq 'rec')) { |
|
$mapname = $self->enclosing_map_src(); |
|
$loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[0]); |
|
return if ($mapname eq $loginmap); |
|
} |
|
} |
|
if ($scope eq 'rec') { |
|
my $map_pc = $self->navHash('map_pc_'.$mapname); |
|
my @recurseup = split(/,/,$self->navHash('map_hierarchy_'.$map_pc)); |
|
my $login_pc = $self->navHash('map_pc_'.$loginmap); |
|
return if (grep(/^\Q$login_pc\E$/,@recurseup)); |
|
} |
|
} |
|
} |
|
unless (($caller eq 'sequence') || ($state eq 'both')) { |
|
return $listed; |
} |
} |
} else { |
|
return $self->parmval("deeplink"); |
|
} |
} |
|
return; |
} |
} |
|
|
# Multiple things need this |
# Multiple things need this |
Line 5562 The problem will be opened later.
|
Line 5736 The problem will be opened later.
|
|
|
Open and not yet due. |
Open and not yet due. |
|
|
|
|
=item * B<PAST_DUE_ANSWER_LATER>: |
=item * B<PAST_DUE_ANSWER_LATER>: |
|
|
The due date has passed, but the answer date has not yet arrived. |
The due date has passed, but the answer date has not yet arrived. |
Line 5575 The due date has passed and there is no
|
Line 5748 The due date has passed and there is no
|
|
|
The answer date is here. |
The answer date is here. |
|
|
|
=item * B<NOTHING_SET>: |
|
|
|
No dates have been set for this problem at all. |
|
|
|
=item * B<PAST_DUE_ATMPT_ANS>: |
|
|
|
The due date has passed, feedback is suppressed, the problem was attempted, and the answer date has not yet arrived. |
|
|
|
=item * B<PAST_DUE_ATMPT_NOANS>: |
|
|
|
The due date has passed, feedback is suppressed, the problem was attempted, and there is no answer opening date set. |
|
|
|
=item * B<PAST_DUE_NO_ATMT_ANS>: |
|
|
|
The due date has passed, feedback is suppressed, the problem was not attempted, and the answer date has not yet arrived. |
|
|
|
=item * B<PAST_DUE_NO_ATMT_NOANS>: |
|
|
|
The due date has passed, feedback is suppressed, the problem was not attempted, and there is no answer opening date set. |
|
|
=item * B<NETWORK_FAILURE>: |
=item * B<NETWORK_FAILURE>: |
|
|
The information is unknown due to network failure. |
The information is unknown due to network failure. |
Line 5590 sub PAST_DUE_NO_ANSWER { return 2; }
|
Line 5783 sub PAST_DUE_NO_ANSWER { return 2; }
|
sub PAST_DUE_ANSWER_LATER { return 3; } |
sub PAST_DUE_ANSWER_LATER { return 3; } |
sub ANSWER_OPEN { return 4; } |
sub ANSWER_OPEN { return 4; } |
sub NOTHING_SET { return 5; } |
sub NOTHING_SET { return 5; } |
|
sub PAST_DUE_ATMPT_ANS { return 6; } |
|
sub PAST_DUE_ATMPT_NOANS { return 7; } |
|
sub PAST_DUE_NO_ATMT_ANS { return 8; } |
|
sub PAST_DUE_NO_ATMT_NOANS { return 9; } |
sub NETWORK_FAILURE { return 100; } |
sub NETWORK_FAILURE { return 100; } |
|
|
# getDateStatus gets the date status for a given problem part. |
# getDateStatus gets the date status for a given problem part. |
Line 5793 set.
|
Line 5990 set.
|
The problem is past due, not considered correct, and an answer date in |
The problem is past due, not considered correct, and an answer date in |
the future is set. |
the future is set. |
|
|
|
=item * B<PAST_DUE_ATMPT_ANS>: |
|
|
|
The problem is past due, feedback is suppressed, the problem was |
|
attempted and an answer date in the future is set. |
|
|
|
=item * B<PAST_DUE_ATMPT_NOANS>: |
|
|
|
The problem is past due, feedback is suppressed, the problem was |
|
attempted and no answer date is set. |
|
|
|
=item * B<PAST_DUE_NO_ATMT_ANS>: |
|
|
|
The problem is past due, feedback is suppressed, the problem was |
|
not attempted and an answer date in the future is set. |
|
|
|
=item * B<PAST_DUE_NO_ATMT_NOANS>: |
|
|
|
The problem is past due, feedback is suppressed, the problem was |
|
not attempted and no answer date is set. |
|
|
=item * B<ANSWER_OPEN>: |
=item * B<ANSWER_OPEN>: |
|
|
The problem is past due, not correct, and the answer is now available. |
The problem is past due, not correct, and the answer is now available. |
Line 5876 sub status {
|
Line 6093 sub status {
|
if ($completionStatus == CORRECT || |
if ($completionStatus == CORRECT || |
$completionStatus == CORRECT_BY_OVERRIDE || |
$completionStatus == CORRECT_BY_OVERRIDE || |
$completionStatus == CORRECT_BY_PASSBACK ) { |
$completionStatus == CORRECT_BY_PASSBACK ) { |
if ( $suppressFeedback ) { return ANSWER_SUBMITTED } |
if ( $suppressFeedback ) { |
|
if ($dateStatus == PAST_DUE_ANSWER_LATER || |
|
$dateStatus == PAST_DUE_NO_ANSWER ) { |
|
if ($dateStatus == PAST_DUE_ANSWER_LATER) { |
|
return PAST_DUE_ATMPT_ANS; |
|
} else { |
|
return PAST_DUE_ATMPT_NOANS; |
|
} |
|
} else { |
|
return ANSWER_SUBMITTED; |
|
} |
|
} |
my $awarded=$self->awarded($part); |
my $awarded=$self->awarded($part); |
if ($awarded < 1 && $awarded > 0) { |
if ($awarded < 1 && $awarded > 0) { |
return PARTIALLY_CORRECT; |
return PARTIALLY_CORRECT; |
Line 5916 sub status {
|
Line 6144 sub status {
|
|
|
if ($dateStatus == PAST_DUE_ANSWER_LATER || |
if ($dateStatus == PAST_DUE_ANSWER_LATER || |
$dateStatus == PAST_DUE_NO_ANSWER ) { |
$dateStatus == PAST_DUE_NO_ANSWER ) { |
return $suppressFeedback ? ANSWER_SUBMITTED : $dateStatus; |
if ($suppressFeedback) { |
|
if ($completionStatus == NOT_ATTEMPTED) { |
|
if ($dateStatus == PAST_DUE_ANSWER_LATER) { |
|
return PAST_DUE_NO_ATMT_ANS; |
|
} else { |
|
return PAST_DUE_NO_ATMT_NOANS; |
|
} |
|
} else { |
|
if ($dateStatus == PAST_DUE_ANSWER_LATER) { |
|
return PAST_DUE_ATMPT_ANS; |
|
} else { |
|
return PAST_DUE_ATMPT_NOANS; |
|
} |
|
} |
|
} else { |
|
return $dateStatus; |
|
} |
} |
} |
|
|
if ($dateStatus == ANSWER_OPEN) { |
if ($dateStatus == ANSWER_OPEN) { |
Line 6162 my %compositeToSimple =
|
Line 6406 my %compositeToSimple =
|
EXCUSED() => CORRECT, |
EXCUSED() => CORRECT, |
PAST_DUE_NO_ANSWER() => INCORRECT, |
PAST_DUE_NO_ANSWER() => INCORRECT, |
PAST_DUE_ANSWER_LATER() => INCORRECT, |
PAST_DUE_ANSWER_LATER() => INCORRECT, |
|
PAST_DUE_ATMPT_ANS() => ATTEMPTED, |
|
PAST_DUE_ATMPT_NOANS() => ATTEMPTED, |
|
PAST_DUE_NO_ATMT_ANS() => CLOSED, |
|
PAST_DUE_NO_ATMT_NOANS() => CLOSED, |
ANSWER_OPEN() => INCORRECT, |
ANSWER_OPEN() => INCORRECT, |
OPEN_LATER() => CLOSED, |
OPEN_LATER() => CLOSED, |
TRIES_LEFT() => OPEN, |
TRIES_LEFT() => OPEN, |
Line 6340 sub getPrevious {
|
Line 6588 sub getPrevious {
|
sub browsePriv { |
sub browsePriv { |
my $self = shift; |
my $self = shift; |
my $noblockcheck = shift; |
my $noblockcheck = shift; |
|
my $deeplinklisted = shift; |
if (defined($self->{BROWSE_PRIV})) { |
if (defined($self->{BROWSE_PRIV})) { |
return $self->{BROWSE_PRIV}; |
return $self->{BROWSE_PRIV}; |
} |
} |
|
my ($nodeeplinkcheck,$nodeeplinkout); |
|
if ($deeplinklisted) { |
|
my $deeplink = $self->deeplink(undef,'getlisted'); |
|
if (($deeplink) && ($deeplink ne 'absent')) { |
|
$nodeeplinkcheck = 1; |
|
} |
|
$nodeeplinkout = 1; |
|
} |
$self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(), |
$self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(), |
$self->{SYMB},undef, |
$self->{SYMB},undef, |
undef,$noblockcheck); |
undef,$noblockcheck, |
|
undef,$nodeeplinkcheck, |
|
$nodeeplinkout); |
} |
} |
|
|
=pod |
=pod |