--- loncom/interface/lonnavmaps.pm 2003/06/13 13:58:06 1.203 +++ loncom/interface/lonnavmaps.pm 2003/06/25 18:32:06 1.212 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.203 2003/06/13 13:58:06 bowersj2 Exp $ +# $Id: lonnavmaps.pm,v 1.212 2003/06/25 18:32:06 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -92,7 +92,10 @@ my %colormap = $resObj->TRIES_LEFT => '', $resObj->INCORRECT => '', $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 # is not yet done and due in less then 24 hours my $hurryUpColor = "#FF0000"; @@ -161,7 +164,6 @@ sub real_handler { # Now that we've displayed some stuff to the user, init the navmap $navmap->init(); - $r->print('
 '); $r->rflush(); # Check that it's defined @@ -244,7 +246,7 @@ sub real_handler { } } else { $r->print("" . - "Go To My First Homework Problem
"); + "Go To My First Homework Problem    "); } my $suppressEmptySequences = 0; @@ -265,7 +267,7 @@ sub real_handler { $resource_no_folder_link = 1; } else { $r->print("" . - "Show Only Uncompleted Homework
"); + "Show Only Uncompleted Homework    "); } # renderer call @@ -414,7 +416,7 @@ sub dueInLessThen24Hours { my $part = shift; my $status = $res->status($part); - return ($status == $res->OPEN() || $status == $res->ATTEMPTED() || + return ($status == $res->OPEN() || $status == $res->TRIES_LEFT()) && $res->duedate() && $res->duedate() < time()+(24*60*60) && $res->duedate() > time(); @@ -556,9 +558,9 @@ Apache::lonnavmap - Subroutines to handl The main handler generates the navigational listing for the course, the other objects export this information in a usable fashion for -other modules +other modules. -=head1 Object: render +=head1 Subroutine: render The navmap renderer package provides a sophisticated rendering of the standard navigation maps interface into HTML. The provided nav map @@ -572,7 +574,7 @@ understand then "undef, undef, undef, 1, undef, 0" when you mostly want default behaviors. The package provides a function called 'render', called as -Apache::lonnavmaps::renderer->render({}). +Apache::lonnavmaps::render({}). =head2 Overview of Columns @@ -580,7 +582,7 @@ The renderer will build an HTML table fo it. The table is consists of several columns, and a row for each resource (or possibly each part). You tell the renderer how many 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. Any additional generally useful column types should be placed in the @@ -598,7 +600,7 @@ argument hash passed to the renderer, an be inserted into the HTML representation as it. 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 @@ -606,7 +608,7 @@ Apache::lonnavmaps::renderer namespace. 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 -the following parameter in the renderer hash: +the following parameters in the renderer hash: =over 4 @@ -839,8 +841,8 @@ sub render_resource { my $linkopen = ""; my $linkclose = ""; - # Default icon: HTML page - my $icon = ""; + # Default icon: unknown page + my $icon = ""; if ($resource->is_problem()) { if ($part eq '0' || $params->{'condensed'}) { @@ -848,6 +850,13 @@ sub render_resource { } else { $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 = ""; + } } # Display the correct map icon to open or shut map @@ -858,8 +867,10 @@ sub render_resource { $nowOpen = !$nowOpen; } + my $folderType = $resource->is_sequence() ? 'folder' : 'page'; + if (!$params->{'resource_no_folder_link'}) { - $icon = 'navmap.folder.' . ($nowOpen ? 'closed' : 'open') . '.gif'; + $icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif'; $icon = ""; $linkopen = ""; } else { # Don't allow users to manipulate folder - $icon = 'navmap.folder.' . ($nowOpen ? 'closed' : 'open') . + $icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.nomanip.gif'; $icon = ""; @@ -924,7 +935,7 @@ sub render_resource { } if (!$params->{'resource_nolink'} && $src !~ /^\/uploaded\// && - !$resource->is_map()) { + !$resource->is_sequence()) { $result .= " $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText"; } else { $result .= " $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText"; @@ -1010,7 +1021,7 @@ sub render_long_status { $params->{'multipart'} && $part eq "0"; my $color; - if ($resource->is_problem() && ($resource->countParts() <= 1 || $part ne '') ) { + if ($resource->is_problem()) { $color = $colormap{$resource->status}; if (dueInLessThen24Hours($resource, $part) || @@ -1029,6 +1040,8 @@ sub render_long_status { if ($resource->is_map() && advancedUser() && $resource->randompick()) { $result .= '(randomly select ' . $resource->randompick() .')'; } + + $result .= "\n"; return $result; } @@ -1488,6 +1501,16 @@ sub render { } } continue { $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 @@ -1543,7 +1566,7 @@ You must obtain resource objects through =over 4 =item * B(navHashFile, parmHashFile, genCourseAndUserOptions, - genMailDiscussStatus): + genMailDiscussStatus, getUserData): Binds a new navmap object to the compiled nav map hash and parm hash given as filenames. genCourseAndUserOptions is a flag saying whether @@ -1554,7 +1577,8 @@ documentation. genMailDiscussStatus caus information about the email and discussion status of resources. Returns the navmap object if this is successful, or B 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. =item * B(first, finish, filter, condition): @@ -1575,6 +1599,7 @@ sub new { $self->{PARM_HASH_FILE} = shift; $self->{GENERATE_COURSE_USER_OPT} = shift; $self->{GENERATE_EMAIL_DISCUSS_STATUS} = shift; + $self->{GET_USER_DATA} = shift; # 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. @@ -1712,7 +1737,15 @@ sub init { $self->{DISCUSSION_TIME} = \%discussiontime; $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->{INITED} = 1; @@ -2133,7 +2166,7 @@ corresponds to where you want the iterat navmap->finishResource(). filterHash is a hash used as a set containing strings representing the resource IDs, defaulting to 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 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 @@ -2205,11 +2238,6 @@ sub min { 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 { # magic invocation to create a class instance my $proto = shift; @@ -2265,6 +2293,9 @@ sub new { # that isn't just a redirector. 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** foreach my $pass (@iterations) { @@ -2943,7 +2974,8 @@ sub is_map { my $self=shift; return defi sub is_page { my $self=shift; 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 { my $self=shift; @@ -2953,7 +2985,8 @@ sub is_problem { sub is_sequence { my $self=shift; 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. @@ -3028,8 +3061,6 @@ sub map_type { return $self->navHash("map_type_$pc", 0); } - - ##### # Property queries ##### @@ -3067,6 +3098,11 @@ Get the Client IP/Name Access Control in Get the answer-reveal date for the problem. +=item * B: + +Gets the awarded value for the problem part. Requires genUserData set to +true when the navmap object was created. + =item * B: Get the due date for the problem. @@ -3120,7 +3156,11 @@ sub answerdate { } 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 { (my $self, my $part) = @_; return $self->parmval("duedate", $part); @@ -3161,7 +3201,12 @@ sub type { } sub weight { 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