version 1.203, 2003/06/13 13:58:06
|
version 1.220, 2003/08/07 14:29:43
|
Line 73 my %statusIconMap =
|
Line 73 my %statusIconMap =
|
$resObj->INCORRECT => 'navmap.wrong.gif', |
$resObj->INCORRECT => 'navmap.wrong.gif', |
$resObj->OPEN => 'navmap.open.gif', |
$resObj->OPEN => 'navmap.open.gif', |
$resObj->ATTEMPTED => 'navmap.ellipsis.gif', |
$resObj->ATTEMPTED => 'navmap.ellipsis.gif', |
$resObj->ANSWER_SUBMITTED => '' ); |
$resObj->ANSWER_SUBMITTED => 'navmap.ellipsis.gif' ); |
|
|
my %iconAltTags = |
my %iconAltTags = |
( 'navmap.correct.gif' => 'Correct', |
( 'navmap.correct.gif' => 'Correct', |
Line 92 my %colormap =
|
Line 92 my %colormap =
|
$resObj->TRIES_LEFT => '', |
$resObj->TRIES_LEFT => '', |
$resObj->INCORRECT => '', |
$resObj->INCORRECT => '', |
$resObj->OPEN => '', |
$resObj->OPEN => '', |
$resObj->NOTHING_SET => '' ); |
$resObj->NOTHING_SET => '', |
|
$resObj->ATTEMPTED => '', |
|
$resObj->ANSWER_SUBMITTED => '' |
|
); |
# And a special case in the nav map; what to do when the assignment |
# And a special case in the nav map; what to do when the assignment |
# is not yet done and due in less then 24 hours |
# is not yet done and due in less then 24 hours |
my $hurryUpColor = "#FF0000"; |
my $hurryUpColor = "#FF0000"; |
Line 126 sub real_handler {
|
Line 129 sub real_handler {
|
$r->send_http_header; |
$r->send_http_header; |
|
|
# Create the nav map |
# Create the nav map |
my $navmap = Apache::lonnavmaps::navmap->new( |
my $navmap = Apache::lonnavmaps::navmap->new(1, 1); |
$ENV{"request.course.fn"}.".db", |
|
$ENV{"request.course.fn"}."_parms.db", 1, 1); |
|
|
|
|
|
if (!defined($navmap)) { |
if (!defined($navmap)) { |
Line 161 sub real_handler {
|
Line 162 sub real_handler {
|
# Now that we've displayed some stuff to the user, init the navmap |
# Now that we've displayed some stuff to the user, init the navmap |
$navmap->init(); |
$navmap->init(); |
|
|
$r->print('<br> '); |
|
$r->rflush(); |
$r->rflush(); |
|
|
# Check that it's defined |
# Check that it's defined |
Line 244 sub real_handler {
|
Line 244 sub real_handler {
|
} |
} |
} else { |
} else { |
$r->print("<a href='navmaps?jumpToFirstHomework'>" . |
$r->print("<a href='navmaps?jumpToFirstHomework'>" . |
"Go To My First Homework Problem</a><br />"); |
"Go To My First Homework Problem</a> "); |
} |
} |
|
|
my $suppressEmptySequences = 0; |
my $suppressEmptySequences = 0; |
Line 265 sub real_handler {
|
Line 265 sub real_handler {
|
$resource_no_folder_link = 1; |
$resource_no_folder_link = 1; |
} else { |
} else { |
$r->print("<a href='navmaps?showOnlyHomework'>" . |
$r->print("<a href='navmaps?showOnlyHomework'>" . |
"Show Only Uncompleted Homework</a><br />"); |
"Show Only Uncompleted Homework</a> "); |
} |
} |
|
|
# renderer call |
# renderer call |
Line 414 sub dueInLessThen24Hours {
|
Line 414 sub dueInLessThen24Hours {
|
my $part = shift; |
my $part = shift; |
my $status = $res->status($part); |
my $status = $res->status($part); |
|
|
return ($status == $res->OPEN() || $status == $res->ATTEMPTED() || |
return ($status == $res->OPEN() || |
$status == $res->TRIES_LEFT()) && |
$status == $res->TRIES_LEFT()) && |
$res->duedate() && $res->duedate() < time()+(24*60*60) && |
$res->duedate() && $res->duedate() < time()+(24*60*60) && |
$res->duedate() > time(); |
$res->duedate() > time(); |
Line 550 sub timeToHumanString {
|
Line 550 sub timeToHumanString {
|
|
|
=head1 NAME |
=head1 NAME |
|
|
Apache::lonnavmap - Subroutines to handle and render the navigation maps |
Apache::lonnavmap - Subroutines to handle and render the navigation |
|
maps |
|
|
=head1 SYNOPSIS |
=head1 SYNOPSIS |
|
|
The main handler generates the navigational listing for the course, |
The main handler generates the navigational listing for the course, |
the other objects export this information in a usable fashion for |
the other objects export this information in a usable fashion for |
other modules |
other modules. |
|
|
=head1 Object: render |
=head1 OVERVIEW |
|
|
|
X<lonnavmaps, overview> When a user enters a course, LON-CAPA examines the |
|
course structure and caches it in what is often referred to as the |
|
"big hash" X<big hash>. You can see it if you are logged into |
|
LON-CAPA, in a course, by going to /adm/test. (You may need to |
|
tweak the /home/httpd/lonTabs/htpasswd file to view it.) The |
|
content of the hash will be under the heading "Big Hash". |
|
|
|
Big Hash contains, among other things, how resources are related |
|
to each other (next/previous), what resources are maps, which |
|
resources are being chosen to not show to the student (for random |
|
selection), and a lot of other things that can take a lot of time |
|
to compute due to the amount of data that needs to be collected and |
|
processed. |
|
|
|
Apache::lonnavmaps provides an object model for manipulating this |
|
information in a higher-level fashion then directly manipulating |
|
the hash. It also provides access to several auxilary functions |
|
that aren't necessarily stored in the Big Hash, but are a per- |
|
resource sort of value, like whether there is any feedback on |
|
a given resource. |
|
|
|
Apache::lonnavmaps also abstracts away branching, and someday, |
|
conditions, for the times where you don't really care about those |
|
things. |
|
|
|
Apache::lonnavmaps also provides fairly powerful routines for |
|
rendering navmaps, and last but not least, provides the navmaps |
|
view for when the user clicks the NAV button. |
|
|
|
B<Note>: Apache::lonnavmaps I<only> works for the "currently |
|
logged in user"; if you want things like "due dates for another |
|
student" lonnavmaps can not directly retrieve information like |
|
that. You need the EXT function. This module can still help, |
|
because many things, such as the course structure, are constant |
|
between users, and Apache::lonnavmaps can help by providing |
|
symbs for the EXT call. |
|
|
|
The rest of this file will cover the provided rendering routines, |
|
which can often be used without fiddling with the navmap object at |
|
all, then documents the Apache::lonnavmaps::navmap object, which |
|
is the key to accessing the Big Hash information, covers the use |
|
of the Iterator (which provides the logic for traversing the |
|
somewhat-complicated Big Hash data structure), documents the |
|
Apache::lonnavmaps::Resource objects that are returned by |
|
|
|
=head1 Subroutine: render |
|
|
The navmap renderer package provides a sophisticated rendering of the |
The navmap renderer package provides a sophisticated rendering of the |
standard navigation maps interface into HTML. The provided nav map |
standard navigation maps interface into HTML. The provided nav map |
handler is actually just a glorified call to this. |
handler is actually just a glorified call to this. |
|
|
Because of the large number of parameters this function presents, |
Because of the large number of parameters this function accepts, |
instead of passing it arguments as is normal, pass it in an anonymous |
instead of passing it arguments as is normal, pass it in an anonymous |
hash with the given options. This is because there is no obvious order |
hash with the desired options. |
you may wish to override these in and a hash is easier to read and |
|
understand then "undef, undef, undef, 1, undef, undef, renderButton, |
|
undef, 0" when you mostly want default behaviors. |
|
|
|
The package provides a function called 'render', called as |
The package provides a function called 'render', called as |
Apache::lonnavmaps::renderer->render({}). |
Apache::lonnavmaps::render({}). |
|
|
=head2 Overview of Columns |
=head2 Overview of Columns |
|
|
Line 580 The renderer will build an HTML table fo
|
Line 625 The renderer will build an HTML table fo
|
it. The table is consists of several columns, and a row for each |
it. The table is consists of several columns, and a row for each |
resource (or possibly each part). You tell the renderer how many |
resource (or possibly each part). You tell the renderer how many |
columns to create and what to place in each column, optionally using |
columns to create and what to place in each column, optionally using |
one or more of the preparent columns, and the renderer will assemble |
one or more of the prepared columns, and the renderer will assemble |
the table. |
the table. |
|
|
Any additional generally useful column types should be placed in the |
Any additional generally useful column types should be placed in the |
Line 597 that takes a resource reference, a part
|
Line 642 that takes a resource reference, a part
|
argument hash passed to the renderer, and returns a string that will |
argument hash passed to the renderer, and returns a string that will |
be inserted into the HTML representation as it. |
be inserted into the HTML representation as it. |
|
|
|
All other parameters are ways of either changing how the columns |
|
are printing, or which rows are shown. |
|
|
The pre-packaged column names are refered to by constants in the |
The pre-packaged column names are refered to by constants in the |
Apache::lonnavmaps::renderer namespace. The following currently exist: |
Apache::lonnavmaps namespace. The following currently exist: |
|
|
=over 4 |
=over 4 |
|
|
=item * B<resource>: |
=item * B<Apache::lonnavmaps::resource>: |
|
|
The general info about the resource: Link, icon for the type, etc. The |
The general info about the resource: Link, icon for the type, etc. The |
first column in the standard nav map display. This column also accepts |
first column in the standard nav map display. This column provides the |
the following parameter in the renderer hash: |
indentation effect seen in the B<NAV> screen. This column also accepts |
|
the following parameters in the renderer hash: |
|
|
=over 4 |
=over 4 |
|
|
=item * B<resource_nolink>: |
=item * B<resource_nolink>: default false |
|
|
If true, the resource will not be linked. Default: false, resource |
If true, the resource will not be linked. By default, all non-folder |
will have links. |
resources are linked. |
|
|
=item * B<resource_part_count>: |
=item * B<resource_part_count>: default true |
|
|
If true (default), the resource will show a part count if the full |
If true, the resource will show a part count B<if> the full |
part list is not displayed. If false, the resource will never show a |
part list is not displayed. (See "condense_parts" later.) If false, |
part count. |
the resource will never show a part count. |
|
|
=item * B<resource_no_folder_link>: |
=item * B<resource_no_folder_link>: |
|
|
Line 629 can't close or open folders when this is
|
Line 678 can't close or open folders when this is
|
|
|
=back |
=back |
|
|
=item B<communication_status>: |
=item B<Apache::lonnavmaps::communication_status>: |
|
|
Whether there is discussion on the resource, email for the user, or |
Whether there is discussion on the resource, email for the user, or |
(lumped in here) perl errors in the execution of the problem. This is |
(lumped in here) perl errors in the execution of the problem. This is |
the second column in the main nav map. |
the second column in the main nav map. |
|
|
=item B<quick_status>: |
=item B<Apache::lonnavmaps::quick_status>: |
|
|
An icon for the status of a problem, with four possible states: |
An icon for the status of a problem, with five possible states: |
Correct, incorrect, open, or none (not open yet, not a problem). The |
Correct, incorrect, open, awaiting grading (for a problem where the |
|
computer's grade is suppressed, or the computer can't grade, like |
|
essay problem), or none (not open yet, not a problem). The |
third column of the standard navmap. |
third column of the standard navmap. |
|
|
=item B<long_status>: |
=item B<Apache::lonnavmaps::long_status>: |
|
|
A text readout of the details of the current status of the problem, |
A text readout of the details of the current status of the problem, |
such as "Due in 22 hours". The fourth column of the standard navmap. |
such as "Due in 22 hours". The fourth column of the standard navmap. |
Line 664 to override vertical and horizontal alig
|
Line 715 to override vertical and horizontal alig
|
|
|
=head2 Parameters |
=head2 Parameters |
|
|
Most of these parameters are only useful if you are *not* using the |
Minimally, you should be |
folder interface (i.e., the default first column), which is probably |
|
the common case. If you are using this interface, then you should be |
|
able to get away with just using 'cols' (to specify the columns |
able to get away with just using 'cols' (to specify the columns |
shown), 'url' (necessary for the folders to link to the current screen |
shown), 'url' (necessary for the folders to link to the current screen |
correctly), and possibly 'queryString' if your app calls for it. In |
correctly), and possibly 'queryString' if your app calls for it. In |
Line 675 automatically.
|
Line 724 automatically.
|
|
|
=over 4 |
=over 4 |
|
|
=item * B<iterator>: |
=item * B<iterator>: default: constructs one from %ENV |
|
|
A reference to a fresh ::iterator to use from the navmaps. The |
A reference to a fresh ::iterator to use from the navmaps. The |
rendering will reflect the options passed to the iterator, so you can |
rendering will reflect the options passed to the iterator, so you can |
Line 684 one is not passed, the renderer will att
|
Line 733 one is not passed, the renderer will att
|
ENV{'form.filter'} and ENV{'form.condition'} information, plus the |
ENV{'form.filter'} and ENV{'form.condition'} information, plus the |
'iterator_map' parameter if any. |
'iterator_map' parameter if any. |
|
|
=item * B<iterator_map>: |
=item * B<iterator_map>: default: not used |
|
|
If you are letting the renderer do the iterator handling, you can |
If you are letting the renderer do the iterator handling, you can |
instruct the renderer to render only a particular map by passing it |
instruct the renderer to render only a particular map by passing it |
the source of the map you want to process, like |
the source of the map you want to process, like |
'/res/103/jerf/navmap.course.sequence'. |
'/res/103/jerf/navmap.course.sequence'. |
|
|
=item * B<navmap>: |
=item * B<navmap>: default: constructs one from %ENV |
|
|
A reference to a navmap, used only if an iterator is not passed in. If |
A reference to a navmap, used only if an iterator is not passed in. If |
this is necessary to make an iterator but it is not passed in, a new |
this is necessary to make an iterator but it is not passed in, a new |
one will be constructed based on ENV info. This is useful to do basic |
one will be constructed based on ENV info. This is useful to do basic |
error checking before passing it off to render. |
error checking before passing it off to render. |
|
|
=item * B<r>: |
=item * B<r>: default: must be passed in |
|
|
The standard Apache response object. This must be passed to the |
The standard Apache response object. This must be passed to the |
renderer or the course hash will be locked. |
renderer or the course hash will be locked. |
|
|
=item * B<cols>: |
=item * B<cols>: default: empty (useless) |
|
|
An array reference |
An array reference |
|
|
=item * B<showParts>: |
=item * B<showParts>:default true |
|
|
A flag. If yes (default), a line for the resource itself, and a line |
A flag. If true, a line for the resource itself, and a line |
for each part will be displayed. If not, only one line for each |
for each part will be displayed. If not, only one line for each |
resource will be displayed. |
resource will be displayed. |
|
|
=item * B<condenseParts>: |
=item * B<condenseParts>: default true |
|
|
A flag. If yes (default), if all parts of the problem have the same |
A flag. If true, if all parts of the problem have the same |
status and that status is Nothing Set, Correct, or Network Failure, |
status and that status is Nothing Set, Correct, or Network Failure, |
then only one line will be displayed for that resource anyhow. If no, |
then only one line will be displayed for that resource anyhow. If no, |
all parts will always be displayed. If showParts is 0, this is |
all parts will always be displayed. If showParts is 0, this is |
ignored. |
ignored. |
|
|
=item * B<jumpCount>: |
=item * B<jumpCount>: default: determined from %ENV |
|
|
A string identifying the URL to place the anchor 'curloc' at. Default |
A string identifying the URL to place the anchor 'curloc' at. |
to no anchor at all. It is the responsibility of the renderer user to |
It is the responsibility of the renderer user to |
ensure that the #curloc is in the URL. By default, determined through |
ensure that the #curloc is in the URL. By default, determined through |
the use of the ENV{} 'jump' information, and should normally "just |
the use of the ENV{} 'jump' information, and should normally "just |
work" correctly. |
work" correctly. |
|
|
=item * B<here>: |
=item * B<here>: default: empty string |
|
|
A Symb identifying where to place the 'here' marker. Default empty, |
A Symb identifying where to place the 'here' marker. The empty |
which means no marker. |
string means no marker. |
|
|
=item * B<indentString>: |
=item * B<indentString>: default: 25 pixel whitespace image |
|
|
A string identifying the indentation string to use. By default, this |
A string identifying the indentation string to use. |
is a 25 pixel whitespace image with no alt text. |
|
|
|
=item * B<queryString>: |
=item * B<queryString>: default: empty |
|
|
A string which will be prepended to the query string used when the |
A string which will be prepended to the query string used when the |
folders are opened or closed. |
folders are opened or closed. You can use this to pass |
|
application-specific values. |
|
|
=item * B<url>: |
=item * B<url>: default: none |
|
|
The url the folders will link to, which should be the current |
The url the folders will link to, which should be the current |
page. Required if the resource info column is shown. |
page. Required if the resource info column is shown, and you |
|
are allowing the user to open and close folders. |
|
|
=item * B<currentJumpIndex>: |
=item * B<currentJumpIndex>: default: no jumping |
|
|
Describes the currently-open row number to cause the browser to jump |
Describes the currently-open row number to cause the browser to jump |
to, because the user just opened that folder. By default, pulled from |
to, because the user just opened that folder. By default, pulled from |
the Jump information in the ENV{'form.*'}. |
the Jump information in the ENV{'form.*'}. |
|
|
=item * B<printKey>: |
=item * B<printKey>: default: false |
|
|
If true, print the key that appears on the top of the standard |
If true, print the key that appears on the top of the standard |
navmaps. Default is false. |
navmaps. |
|
|
=item * B<printCloseAll>: |
=item * B<printCloseAll>: default: true |
|
|
If true, print the "Close all folders" or "open all folders" |
If true, print the "Close all folders" or "open all folders" |
links. Default is true. |
links. |
|
|
=item * B<filterFunc>: |
=item * B<filterFunc>: default: sub {return 1;} (accept everything) |
|
|
A function that takes the resource object as its only parameter and |
A function that takes the resource object as its only parameter and |
returns a true or false value. If true, the resource is displayed. If |
returns a true or false value. If true, the resource is displayed. If |
false, it is simply skipped in the display. By default, all resources |
false, it is simply skipped in the display. |
are shown. |
|
|
|
=item * B<suppressEmptySequences>: |
=item * B<suppressEmptySequences>: default: false |
|
|
If you're using a filter function, and displaying sequences to orient |
If you're using a filter function, and displaying sequences to orient |
the user, then frequently some sequences will be empty. Setting this to |
the user, then frequently some sequences will be empty. Setting this to |
true will cause those sequences not to display, so as not to confuse the |
true will cause those sequences not to display, so as not to confuse the |
user into thinking that if the sequence is there there should be things |
user into thinking that if the sequence is there there should be things |
under it. |
under it; for example, see the "Show Uncompleted Homework" view on the |
|
B<NAV> screen. |
|
|
=item * B<suppressNavmaps>: |
=item * B<suppressNavmaps>: default: false |
|
|
If true, will not display Navigate Content resources. Default to |
If true, will not display Navigate Content resources. |
false. |
|
|
|
=back |
=back |
|
|
Line 794 be passed through unchange to the column
|
Line 843 be passed through unchange to the column
|
generate the following information which your renderer may find |
generate the following information which your renderer may find |
useful: |
useful: |
|
|
If you want to know how many rows were printed, the 'counter' element |
|
of the hash passed into the render function will contain the |
|
count. You may want to check whether any resources were printed at |
|
all. |
|
|
|
=over 4 |
=over 4 |
|
|
|
=item * B<counter>: |
|
|
|
Contains the number of rows printed. Useful after calling the render |
|
function, as you can detect whether anything was printed at all. |
|
|
|
=item * B<isNewBranch>: |
|
|
|
Useful for renderers: If this resource is currently the first resource |
|
of a new branch, this will be true. The Resource column (leftmost in the |
|
navmaps screen) uses this to display the "new branch" icon |
|
|
=back |
=back |
|
|
=cut |
=cut |
Line 839 sub render_resource {
|
Line 894 sub render_resource {
|
my $linkopen = "<a href='$link'>"; |
my $linkopen = "<a href='$link'>"; |
my $linkclose = "</a>"; |
my $linkclose = "</a>"; |
|
|
# Default icon: HTML page |
# Default icon: unknown page |
my $icon = "<img src='/adm/lonIcons/html.gif' alt='' border='0' />"; |
my $icon = "<img src='/adm/lonIcons/unknown.gif' alt='' border='0' />"; |
|
|
if ($resource->is_problem()) { |
if ($resource->is_problem()) { |
if ($part eq '0' || $params->{'condensed'}) { |
if ($part eq '0' || $params->{'condensed'}) { |
Line 848 sub render_resource {
|
Line 903 sub render_resource {
|
} else { |
} else { |
$icon = $params->{'indentString'}; |
$icon = $params->{'indentString'}; |
} |
} |
|
} else { |
|
my $curfext= (split (/\./,$resource->src))[-1]; |
|
my $embstyle = &Apache::loncommon::fileembstyle($curfext); |
|
# The unless conditional that follows is a bit of overkill |
|
if (!(!defined($embstyle) || $embstyle eq 'unk' || $embstyle eq 'hdn')) { |
|
$icon = "<img src='/adm/lonIcons/$curfext.gif' alt='' border='0' />"; |
|
} |
} |
} |
|
|
# Display the correct map icon to open or shut map |
# Display the correct map icon to open or shut map |
Line 858 sub render_resource {
|
Line 920 sub render_resource {
|
$nowOpen = !$nowOpen; |
$nowOpen = !$nowOpen; |
} |
} |
|
|
|
my $folderType = $resource->is_sequence() ? 'folder' : 'page'; |
|
|
if (!$params->{'resource_no_folder_link'}) { |
if (!$params->{'resource_no_folder_link'}) { |
$icon = 'navmap.folder.' . ($nowOpen ? 'closed' : 'open') . '.gif'; |
$icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif'; |
$icon = "<img src='/adm/lonIcons/$icon' alt='' border='0' />"; |
$icon = "<img src='/adm/lonIcons/$icon' alt='' border='0' />"; |
|
|
$linkopen = "<a href='" . $params->{'url'} . '?' . |
$linkopen = "<a href='" . $params->{'url'} . '?' . |
Line 875 sub render_resource {
|
Line 939 sub render_resource {
|
"&folderManip=1'>"; |
"&folderManip=1'>"; |
} else { |
} else { |
# Don't allow users to manipulate folder |
# Don't allow users to manipulate folder |
$icon = 'navmap.folder.' . ($nowOpen ? 'closed' : 'open') . |
$icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . |
'.nomanip.gif'; |
'.nomanip.gif'; |
$icon = "<img src='/adm/lonIcons/$icon' alt='' border='0' />"; |
$icon = "<img src='/adm/lonIcons/$icon' alt='' border='0' />"; |
|
|
Line 924 sub render_resource {
|
Line 988 sub render_resource {
|
} |
} |
|
|
if (!$params->{'resource_nolink'} && $src !~ /^\/uploaded\// && |
if (!$params->{'resource_nolink'} && $src !~ /^\/uploaded\// && |
!$resource->is_map()) { |
!$resource->is_sequence()) { |
$result .= " $curMarkerBegin<a href='$link'>$title$partLabel</a>$curMarkerEnd $nonLinkedText</td>"; |
$result .= " $curMarkerBegin<a href='$link'>$title$partLabel</a>$curMarkerEnd $nonLinkedText</td>"; |
} else { |
} else { |
$result .= " $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText</td>"; |
$result .= " $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText</td>"; |
Line 1010 sub render_long_status {
|
Line 1074 sub render_long_status {
|
$params->{'multipart'} && $part eq "0"; |
$params->{'multipart'} && $part eq "0"; |
|
|
my $color; |
my $color; |
if ($resource->is_problem() && ($resource->countParts() <= 1 || $part ne '') ) { |
if ($resource->is_problem()) { |
$color = $colormap{$resource->status}; |
$color = $colormap{$resource->status}; |
|
|
if (dueInLessThen24Hours($resource, $part) || |
if (dueInLessThen24Hours($resource, $part) || |
Line 1029 sub render_long_status {
|
Line 1093 sub render_long_status {
|
if ($resource->is_map() && advancedUser() && $resource->randompick()) { |
if ($resource->is_map() && advancedUser() && $resource->randompick()) { |
$result .= '(randomly select ' . $resource->randompick() .')'; |
$result .= '(randomly select ' . $resource->randompick() .')'; |
} |
} |
|
|
|
# Debugging code |
|
#$result .= " " . $resource->awarded($part) . '/' . $resource->weight($part) . |
|
# ' - Part: ' . $part; |
|
|
|
$result .= "</td>\n"; |
|
|
return $result; |
return $result; |
} |
} |
Line 1100 sub render {
|
Line 1170 sub render {
|
if (!$ENV{'form.folderManip'} && !defined($args->{'iterator'})) { |
if (!$ENV{'form.folderManip'} && !defined($args->{'iterator'})) { |
# 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(1, 1); |
$ENV{"request.course.fn"}.".db", |
|
$ENV{"request.course.fn"}."_parms.db", 1, 1); |
|
$mustCloseNavMap = 1; |
$mustCloseNavMap = 1; |
} |
} |
$navmap->init(); |
$navmap->init(); |
Line 1166 sub render {
|
Line 1234 sub render {
|
|
|
# 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($r, |
$navmap = Apache::lonnavmaps::navmap->new(1, 1); |
$ENV{"request.course.fn"}.".db", |
|
$ENV{"request.course.fn"}."_parms.db", 1, 1); |
|
$mustCloseNavMap = 1; |
$mustCloseNavMap = 1; |
} |
} |
# Paranoia: Make sure it's ready |
# Paranoia: Make sure it's ready |
Line 1488 sub render {
|
Line 1554 sub render {
|
} |
} |
} continue { |
} continue { |
$curRes = $it->next(); |
$curRes = $it->next(); |
|
|
|
if ($r) { |
|
# If we have the connection, make sure the user is still connected |
|
my $c = $r->connection; |
|
if ($c->aborted()) { |
|
Apache::lonnet::logthis("navmaps aborted"); |
|
# Who cares what we do, nobody will see it anyhow. |
|
return ''; |
|
} |
|
} |
} |
} |
|
|
# Print out the part that jumps to #curloc if it exists |
# Print out the part that jumps to #curloc if it exists |
Line 1520 package Apache::lonnavmaps::navmap;
|
Line 1596 package Apache::lonnavmaps::navmap;
|
|
|
=pod |
=pod |
|
|
lonnavmaps provides functions and objects for dealing with the |
=head1 Object: Apache::lonnavmaps::navmap |
compiled course hashes generated when a user enters the course, the |
|
Apache handler for the "Navigation Map" button, and a flexible |
|
prepared renderer for navigation maps that are easy to use anywhere. |
|
|
|
=head1 Object: navmap |
=head2 Overview |
|
|
Encapsulating the compiled nav map |
The navmap object's job is to provide access to the resources |
|
in the course as Apache::lonnavmaps::resource objects, and to |
|
query and manage the relationship between those resource objects. |
|
|
navmap is an object that encapsulates a compiled course map and |
Generally, you'll use the navmap object in one of three basic ways. |
provides a reasonable interface to it. |
In order of increasing complexity and power: |
|
|
Most notably it provides a way to navigate the map sensibly and a |
=over 4 |
flexible iterator that makes it easy to write various renderers based |
|
on nav maps. |
|
|
|
You must obtain resource objects through the navmap object. |
=item * C<$navmap-E<gt>getByX>, where X is B<Id>, B<Symb>, B<Url> or B<MapPc>. This provides |
|
various ways to obtain resource objects, based on various identifiers. |
|
Use this when you want to request information about one object or |
|
a handful of resources you already know the identities of, from some |
|
other source. For more about Ids, Symbs, and MapPcs, see the |
|
Resource documentation. Note that Url should be a B<last resort>, |
|
not your first choice; it only works when there is only one |
|
instance of the resource in the course, which only applies to |
|
maps, and even that may change in the future. |
|
|
|
=item * C<my @resources = $navmap-E<gt>retrieveResources(args)>. This |
|
retrieves resources matching some criterion and returns them |
|
in a flat array, with no structure information. Use this when |
|
you are manipulating a series of resources, based on what map |
|
the are in, but do not care about branching, or exactly how |
|
the maps and resources are related. This is the most common case. |
|
|
|
=item * C<$it = $navmap-E<gt>getIterator(args)>. This allows you traverse |
|
the course's navmap in various ways without writing the traversal |
|
code yourself. See iterator documentation below. Use this when |
|
you need to know absolutely everything about the course, including |
|
branches and the precise relationship between maps and resources. |
|
|
=head2 Methods |
=back |
|
|
|
=head2 Creation And Destruction |
|
|
|
To create a navmap object, use the following function: |
|
|
=over 4 |
=over 4 |
|
|
=item * B<new>(navHashFile, parmHashFile, genCourseAndUserOptions, |
=item * B<Apache::lonnavmaps::navmap-E<gt>new>( |
genMailDiscussStatus): |
genCourseAndUserOptions, genMailDiscussStatus, getUserData): |
|
|
Binds a new navmap object to the compiled nav map hash and parm hash |
Creates a new navmap object. genCourseAndUserOptions is a flag saying whether |
given as filenames. genCourseAndUserOptions is a flag saying whether |
|
the course options and user options hash should be generated. This is |
the course options and user options hash should be generated. This is |
for when you are using the parameters of the resources that require |
for when you are using the parameters of the resources that require |
them; see documentation in resource object |
them; see documentation in resource object |
Line 1554 documentation. genMailDiscussStatus caus
|
Line 1651 documentation. genMailDiscussStatus caus
|
information about the email and discussion status of |
information about the email and discussion status of |
resources. Returns the navmap object if this is successful, or |
resources. Returns the navmap object if this is successful, or |
B<undef> if not. You must check for undef; errors will occur when you |
B<undef> if not. You must check for undef; errors will occur when you |
try to use the other methods otherwise. |
try to use the other methods otherwise. getUserData, if true, will |
|
retreive the user's performance data for various problems. |
|
|
|
=back |
|
|
|
Once you have the $navmap object, call ->init() on it when you are ready |
|
to use it. This allows you to check if the course map is defined (see |
|
B<courseMapDefined> below) before engaging in potentially expensive |
|
initialization routines for the genCourseAndUserOptions and |
|
genMailDiscussStatus option. |
|
|
|
When you are done with the $navmap object, you I<must> call |
|
$navmap->untieHashes(), or you'll prevent the current user from using that |
|
course until the web server is restarted. (!) |
|
|
|
=head2 Methods |
|
|
|
=over 4 |
|
|
=item * B<getIterator>(first, finish, filter, condition): |
=item * B<getIterator>(first, finish, filter, condition): |
|
|
Line 1571 sub new {
|
Line 1685 sub new {
|
my $class = ref($proto) || $proto; |
my $class = ref($proto) || $proto; |
my $self = {}; |
my $self = {}; |
|
|
$self->{NAV_HASH_FILE} = shift; |
|
$self->{PARM_HASH_FILE} = shift; |
|
$self->{GENERATE_COURSE_USER_OPT} = shift; |
$self->{GENERATE_COURSE_USER_OPT} = shift; |
$self->{GENERATE_EMAIL_DISCUSS_STATUS} = shift; |
$self->{GENERATE_EMAIL_DISCUSS_STATUS} = shift; |
|
$self->{GET_USER_DATA} = shift; |
|
|
# 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 1588 sub new {
|
Line 1701 sub new {
|
|
|
my %navmaphash; |
my %navmaphash; |
my %parmhash; |
my %parmhash; |
if (!(tie(%navmaphash, 'GDBM_File', $self->{NAV_HASH_FILE}, |
my $courseFn = $ENV{"request.course.fn"}; |
|
if (!(tie(%navmaphash, 'GDBM_File', "${courseFn}.db", |
&GDBM_READER(), 0640))) { |
&GDBM_READER(), 0640))) { |
return undef; |
return undef; |
} |
} |
|
|
if (!(tie(%parmhash, 'GDBM_File', $self->{PARM_HASH_FILE}, |
if (!(tie(%parmhash, 'GDBM_File', "${courseFn}_parms.db", |
&GDBM_READER(), 0640))) |
&GDBM_READER(), 0640))) |
{ |
{ |
untie %{$self->{PARM_HASH}}; |
untie %{$self->{PARM_HASH}}; |
Line 1712 sub init {
|
Line 1826 sub init {
|
$self->{DISCUSSION_TIME} = \%discussiontime; |
$self->{DISCUSSION_TIME} = \%discussiontime; |
$self->{EMAIL_STATUS} = \%emailstatus; |
$self->{EMAIL_STATUS} = \%emailstatus; |
|
|
} |
} |
|
|
|
if ($self->{GET_USER_DATA}) { |
|
# Retreive performance data on problems |
|
my %student_data = Apache::lonnet::currentdump($ENV{'request.course.id'}, |
|
$ENV{'user.domain'}, |
|
$ENV{'user.name'}); |
|
$self->{STUDENT_DATA} = \%student_data; |
|
} |
|
|
$self->{PARM_CACHE} = {}; |
$self->{PARM_CACHE} = {}; |
$self->{INITED} = 1; |
$self->{INITED} = 1; |
Line 1725 sub navhash {
|
Line 1847 sub navhash {
|
return $self->{NAV_HASH}->{$key}; |
return $self->{NAV_HASH}->{$key}; |
} |
} |
|
|
|
=pod |
|
|
|
=item * B<courseMapDefined>(): Returns true if the course map is defined, |
|
false otherwise. Undefined course maps indicate an error somewhere in |
|
LON-CAPA, and you will not be able to proceed with using the navmap. |
|
See the B<NAV> screen for an example of using this. |
|
|
|
=cut |
|
|
# Checks to see if coursemap is defined, matching test in old lonnavmaps |
# Checks to see if coursemap is defined, matching test in old lonnavmaps |
sub courseMapDefined { |
sub courseMapDefined { |
my $self = shift; |
my $self = shift; |
Line 1806 the given map. This is one of the proper
|
Line 1937 the given map. This is one of the proper
|
# The strategy here is to cache the resource objects, and only construct them |
# The strategy here is to cache the resource objects, and only construct them |
# as we use them. The real point is to prevent reading any more from the tied |
# as we use them. The real point is to prevent reading any more from the tied |
# hash then we have to, which should hopefully alleviate speed problems. |
# hash then we have to, which should hopefully alleviate speed problems. |
# Caching is just an incidental detail I throw in because it makes sense. |
|
|
|
sub getById { |
sub getById { |
my $self = shift; |
my $self = shift; |
Line 1889 sub parmval {
|
Line 2019 sub parmval {
|
|
|
sub parmval_real { |
sub parmval_real { |
my $self = shift; |
my $self = shift; |
my ($what,$symb) = @_; |
my ($what,$symb,$recurse) = @_; |
|
|
my $cid=$ENV{'request.course.id'}; |
my $cid=$ENV{'request.course.id'}; |
my $csec=$ENV{'request.course.sec'}; |
my $csec=$ENV{'request.course.sec'}; |
Line 1961 sub parmval_real {
|
Line 2091 sub parmval_real {
|
my $id=pop(@parts); |
my $id=pop(@parts); |
my $part=join('_',@parts); |
my $part=join('_',@parts); |
if ($part eq '') { $part='0'; } |
if ($part eq '') { $part='0'; } |
my $partgeneral=$self->parmval($part.".$qualifier",$symb); |
my $partgeneral=$self->parmval($part.".$qualifier",$symb,1); |
if (defined($partgeneral)) { return $partgeneral; } |
if (defined($partgeneral)) { return $partgeneral; } |
} |
} |
|
if ($recurse) { return undef; } |
|
my $pack_def=&Apache::lonnet::packages_tab_default($fn,'resource.'.$what); |
|
if (defined($pack_def)) { return $pack_def; } |
return ''; |
return ''; |
} |
} |
|
|
Line 2044 sub retrieveResources {
|
Line 2177 sub retrieveResources {
|
$map = $self->getResourceByUrl($map); |
$map = $self->getResourceByUrl($map); |
} |
} |
|
|
|
# If nothing was passed, assume top-level map |
|
if (!$map) { |
|
$map = $self->getById('0.0'); |
|
} |
|
|
# Check the map's validity. |
# Check the map's validity. |
if (!$map || !$map->is_map()) { |
if (!$map->is_map()) { |
# Oh, to throw an exception.... how I'd love that! |
# Oh, to throw an exception.... how I'd love that! |
return (); |
return (); |
} |
} |
|
|
# Get an iterator. |
# Get an iterator. |
my $it = $self->getIterator($map->map_start(), $map->map_finish(), |
my $it = $self->getIterator($map->map_start(), $map->map_finish(), |
!$recursive); |
undef, $recursive); |
|
|
my @resources = (); |
my @resources = (); |
|
|
Line 2081 sub retrieveResources {
|
Line 2219 sub retrieveResources {
|
} |
} |
} |
} |
|
|
|
} continue { |
$curRes = $it->next(); |
$curRes = $it->next(); |
} |
} |
|
|
Line 2133 corresponds to where you want the iterat
|
Line 2272 corresponds to where you want the iterat
|
navmap->finishResource(). filterHash is a hash used as a set |
navmap->finishResource(). filterHash is a hash used as a set |
containing strings representing the resource IDs, defaulting to |
containing strings representing the resource IDs, defaulting to |
empty. Condition is a 1 or 0 that sets what to do with the filter |
empty. Condition is a 1 or 0 that sets what to do with the filter |
hash: If a 0, then only resource that exist IN the filterHash will be |
hash: If a 0, then only resources that exist IN the filterHash will be |
recursed on. If it is a 1, only resources NOT in the filterHash will |
recursed on. If it is a 1, only resources NOT in the filterHash will |
be recursed on. Defaults to 0. forceTop is a boolean value. If it is |
be recursed on. Defaults to 0. forceTop is a boolean value. If it is |
false (default), the iterator will only return the first level of map |
false (default), the iterator will only return the first level of map |
Line 2157 new branch. The possible tokens are:
|
Line 2296 new branch. The possible tokens are:
|
|
|
=over 4 |
=over 4 |
|
|
=item * BEGIN_MAP: |
=item * B<BEGIN_MAP>: |
|
|
A new map is being recursed into. This is returned I<after> the map |
A new map is being recursed into. This is returned I<after> the map |
resource itself is returned. |
resource itself is returned. |
|
|
=item * END_MAP: |
=item * B<END_MAP>: |
|
|
The map is now done. |
The map is now done. |
|
|
=item * BEGIN_BRANCH: |
=item * B<BEGIN_BRANCH>: |
|
|
A branch is now starting. The next resource returned will be the first |
A branch is now starting. The next resource returned will be the first |
in that branch. |
in that branch. |
|
|
=item * END_BRANCH: |
=item * B<END_BRANCH>: |
|
|
The branch is now done. |
The branch is now done. |
|
|
Line 2205 sub min {
|
Line 2344 sub min {
|
if ($a < $b) { return $a; } else { return $b; } |
if ($a < $b) { return $a; } else { return $b; } |
} |
} |
|
|
# In the CVS repository, documentation of this algorithm is included |
|
# in /doc/lonnavdocs, as a PDF and .tex source. Markers like **1** |
|
# will reference the same location in the text as the part of the |
|
# algorithm is running through. |
|
|
|
sub new { |
sub new { |
# magic invocation to create a class instance |
# magic invocation to create a class instance |
my $proto = shift; |
my $proto = shift; |
Line 2265 sub new {
|
Line 2399 sub new {
|
# that isn't just a redirector. |
# that isn't just a redirector. |
my $resource; my $resourceCount = 0; |
my $resource; my $resourceCount = 0; |
|
|
|
# Documentation on this algorithm can be found in the CVS repository at |
|
# /docs/lonnavdocs; these "**#**" markers correspond to documentation |
|
# in that file. |
# **1** |
# **1** |
|
|
foreach my $pass (@iterations) { |
foreach my $pass (@iterations) { |
Line 2730 use Apache::lonnet;
|
Line 2867 use Apache::lonnet;
|
|
|
=pod |
=pod |
|
|
=head1 Object: resource |
=head1 Object: resource |
|
|
|
X<resource, navmap object> |
A resource object encapsulates a resource in a resource map, allowing |
A resource object encapsulates a resource in a resource map, allowing |
easy manipulation of the resource, querying the properties of the |
easy manipulation of the resource, querying the properties of the |
resource (including user properties), and represents a reference that |
resource (including user properties), and represents a reference that |
Line 2751 writing, there is no way to override thi
|
Line 2889 writing, there is no way to override thi
|
parts will never be returned, nor will their response types or ids be |
parts will never be returned, nor will their response types or ids be |
stored. |
stored. |
|
|
=head2 Public Members |
=head2 Overview |
|
|
resource objects have a hash called DATA ($resourceRef->{DATA}) that |
|
you can store whatever you want in. This allows you to easily do |
|
two-pass algorithms without worrying about managing your own |
|
resource->data hash. |
|
|
|
=head2 Methods |
A B<Resource> is the most granular type of object in LON-CAPA that can |
|
be included in a course. It can either be a particular resource, like |
=over 4 |
an HTML page, external resource, problem, etc., or it can be a |
|
container sequence, such as a "page" or a "map". |
=item * B<new>($navmapRef, $idString): |
|
|
To see a sequence from the user's point of view, please see the |
The first arg is a reference to the parent navmap object. The second |
B<Creating a Course: Maps and Sequences> chapter of the Author's |
is the idString of the resource itself. Very rarely, if ever, called |
Manual. |
directly. Use the nav map->getByID() method. |
|
|
A Resource Object, once obtained from a navmap object via a B<getBy*> |
=back |
method of the navmap, or from an iterator, allows you to query |
|
information about that resource. |
|
|
|
Generally, you do not ever want to create a resource object yourself, |
|
so creation has been left undocumented. Always retrieve resources |
|
from navmap objects. |
|
|
|
=head3 Identifying Resources |
|
|
|
X<big hash>Every resource is identified by a Resource ID in the big hash that is |
|
unique to that resource for a given course. X<resource ID, in big hash> |
|
The Resource ID has the form #.#, where the first number is the same |
|
for every resource in a map, and the second is unique. For instance, |
|
for a course laid out like this: |
|
|
|
* Problem 1 |
|
* Map |
|
* Resource 2 |
|
* Resource 3 |
|
|
|
C<Problem 1> and C<Map> will share a first number, and C<Resource 2> |
|
C<Resource 3> will share a first number. The second number may end up |
|
re-used between the two groups. |
|
|
|
The resource ID is only used in the big hash, but can be used in the |
|
context of a course to identify a resource easily. (For instance, the |
|
printing system uses it to record which resources from a sequence you |
|
wish to print.) |
|
|
|
X<symb> X<resource, symb> |
|
All resources also have B<symb>s, which uniquely identify a resource |
|
in a course. Many internal LON-CAPA functions expect a symb. A symb |
|
carries along with it the URL of the resource, and the map it appears |
|
in. Symbs are much larger then resource IDs. |
|
|
=cut |
=cut |
|
|
Line 2807 sub navHash {
|
Line 2973 sub navHash {
|
|
|
=pod |
=pod |
|
|
B<Metadata Retreival> |
=head2 Methods |
|
|
|
Once you have a resource object, here's what you can do with it: |
|
|
|
=head3 Attribute Retrieval |
|
|
These are methods that help you retrieve metadata about the resource: |
Every resource has certain attributes that can be retrieved and used: |
Method names are based on the fields in the compiled course |
|
representation. |
|
|
|
=over 4 |
=over 4 |
|
|
|
=item * B<ID>: Every resource has an ID that is unique for that |
|
resource in the course it is in. The ID is actually in the hash |
|
representing the resource, so for a resource object $res, obtain |
|
it via C<$res->{ID}). |
|
|
=item * B<compTitle>: |
=item * B<compTitle>: |
|
|
Returns a "composite title", that is equal to $res->title() if the |
Returns a "composite title", that is equal to $res->title() if the |
Line 2825 resource has a title, and is otherwise t
|
Line 2998 resource has a title, and is otherwise t
|
|
|
Returns true if the resource is external. |
Returns true if the resource is external. |
|
|
=item * B<goesto>: |
|
|
|
Returns the "goesto" value from the compiled nav map. (It is likely |
|
you want to use B<getNext> instead.) |
|
|
|
=item * B<kind>: |
=item * B<kind>: |
|
|
Returns the kind of the resource from the compiled nav map. |
Returns the kind of the resource from the compiled nav map. |
Line 2857 Returns the symb for the resource.
|
Line 3025 Returns the symb for the resource.
|
|
|
Returns the title of the resource. |
Returns the title of the resource. |
|
|
=item * B<to>: |
|
|
|
Returns the "to" value from the compiled nav map. (It is likely you |
|
want to use B<getNext> instead.) |
|
|
|
=back |
=back |
|
|
=cut |
=cut |
Line 2871 want to use B<getNext> instead.)
|
Line 3034 want to use B<getNext> instead.)
|
sub comesfrom { my $self=shift; return $self->navHash("comesfrom_", 1); } |
sub comesfrom { my $self=shift; return $self->navHash("comesfrom_", 1); } |
sub ext { my $self=shift; return $self->navHash("ext_", 1) eq 'true:'; } |
sub ext { my $self=shift; return $self->navHash("ext_", 1) eq 'true:'; } |
sub from { my $self=shift; return $self->navHash("from_", 1); } |
sub from { my $self=shift; return $self->navHash("from_", 1); } |
|
# considered private and undocumented |
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); } |
Line 2891 sub symb {
|
Line 3055 sub symb {
|
$self->navHash('map_id_'.$first)) |
$self->navHash('map_id_'.$first)) |
. '___' . $second . '___' . $symbSrc; |
. '___' . $second . '___' . $symbSrc; |
} |
} |
sub title { my $self=shift; return $self->navHash("title_", 1); } |
sub title { |
|
my $self=shift; |
|
if ($self->{ID} eq '0.0') { |
|
# If this is the top-level map, return the title of the course |
|
# since this map can not be titled otherwise. |
|
return $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; |
|
} |
|
return $self->navHash("title_", 1); } |
|
# considered private and undocumented |
sub to { my $self=shift; return $self->navHash("to_", 1); } |
sub to { my $self=shift; return $self->navHash("to_", 1); } |
sub compTitle { |
sub compTitle { |
my $self = shift; |
my $self = shift; |
Line 2943 sub is_map { my $self=shift; return defi
|
Line 3115 sub is_map { my $self=shift; return defi
|
sub is_page { |
sub is_page { |
my $self=shift; |
my $self=shift; |
my $src = $self->src(); |
my $src = $self->src(); |
return ($src =~ /page$/); |
return $self->navHash("is_map_", 1) && |
|
$self->navHash("map_type_" . $self->map_pc()) eq 'page'; |
} |
} |
sub is_problem { |
sub is_problem { |
my $self=shift; |
my $self=shift; |
Line 2953 sub is_problem {
|
Line 3126 sub is_problem {
|
sub is_sequence { |
sub is_sequence { |
my $self=shift; |
my $self=shift; |
my $src = $self->src(); |
my $src = $self->src(); |
return ($src =~ /sequence$/); |
return $self->navHash("is_map_", 1) && |
|
$self->navHash("map_type_" . $self->map_pc()) eq 'sequence'; |
} |
} |
|
|
# Private method: Shells out to the parmval in the nav map, handler parts. |
# Private method: Shells out to the parmval in the nav map, handler parts. |
Line 3028 sub map_type {
|
Line 3202 sub map_type {
|
return $self->navHash("map_type_$pc", 0); |
return $self->navHash("map_type_$pc", 0); |
} |
} |
|
|
|
|
|
|
##### |
##### |
# Property queries |
# Property queries |
##### |
##### |
Line 3067 Get the Client IP/Name Access Control in
|
Line 3239 Get the Client IP/Name Access Control in
|
|
|
Get the answer-reveal date for the problem. |
Get the answer-reveal date for the problem. |
|
|
|
=item * B<awarded>: |
|
|
|
Gets the awarded value for the problem part. Requires genUserData set to |
|
true when the navmap object was created. |
|
|
=item * B<duedate>: |
=item * B<duedate>: |
|
|
Get the due date for the problem. |
Get the due date for the problem. |
Line 3120 sub answerdate {
|
Line 3297 sub answerdate {
|
} |
} |
return $self->parmval("answerdate", $part); |
return $self->parmval("answerdate", $part); |
} |
} |
sub awarded { my $self = shift; return $self->queryRestoreHash('awarded', shift); } |
sub awarded { |
|
my $self = shift; my $part = shift; |
|
if (!defined($part)) { $part = '0'; } |
|
return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->symb()}->{'resource.'.$part.'.awarded'}; |
|
} |
sub duedate { |
sub duedate { |
(my $self, my $part) = @_; |
(my $self, my $part) = @_; |
return $self->parmval("duedate", $part); |
return $self->parmval("duedate", $part); |
Line 3161 sub type {
|
Line 3342 sub type {
|
} |
} |
sub weight { |
sub weight { |
my $self = shift; my $part = shift; |
my $self = shift; my $part = shift; |
return $self->parmval("weight", $part); |
if (!defined($part)) { $part = '0'; } |
|
return &Apache::lonnet::EXT('resource.'.$part.'.weight', |
|
$self->symb(), $ENV{'user.domain'}, |
|
$ENV{'user.name'}, |
|
$ENV{'request.course.sec'}); |
|
|
} |
} |
|
|
# Multiple things need this |
# Multiple things need this |
Line 3307 sub responseType {
|
Line 3493 sub responseType {
|
my $part = shift; |
my $part = shift; |
|
|
$self->extractParts(); |
$self->extractParts(); |
return $self->{RESPONSE_TYPE}->{$part}; |
return $self->{RESPONSE_TYPES}->{$part}; |
} |
} |
|
|
sub responseIds { |
sub responseIds { |
Line 3791 sub completable {
|
Line 3977 sub completable {
|
# "If any of the parts are open, or have tries left (implies open), |
# "If any of the parts are open, or have tries left (implies open), |
# and it is not "attempted" (manually graded problem), it is |
# and it is not "attempted" (manually graded problem), it is |
# not "complete" |
# not "complete" |
if (!(($status == OPEN() || $status == TRIES_LEFT()) |
if ($self->getCompletionStatus($part) == ATTEMPTED() || |
&& $self->getCompletionStatus($part) != ATTEMPTED() |
$status == ANSWER_SUBMITTED() ) { |
&& $status != ANSWER_SUBMITTED())) { |
# did this part already, as well as we can |
return 0; |
next; |
} |
} |
|
if ($status == OPEN() || $status == TRIES_LEFT()) { |
|
return 1; |
|
} |
} |
} |
|
|
# If all the parts were complete, so was this problem. |
# If all the parts were complete, so was this problem. |
return 1; |
return 0; |
} |
} |
|
|
=pod |
=pod |