--- loncom/interface/lonnavmaps.pm 2003/06/16 15:08:22 1.205
+++ loncom/interface/lonnavmaps.pm 2003/07/14 19:13:38 1.214
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.205 2003/06/16 15:08:22 bowersj2 Exp $
+# $Id: lonnavmaps.pm,v 1.214 2003/07/14 19:13:38 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();
@@ -1019,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) ||
@@ -1038,6 +1040,12 @@ sub render_long_status {
if ($resource->is_map() && advancedUser() && $resource->randompick()) {
$result .= '(randomly select ' . $resource->randompick() .')';
}
+
+ # Debugging code
+ #$result .= " " . $resource->awarded($part) . '/' . $resource->weight($part) .
+ # ' - Part: ' . $part;
+
+ $result .= "\n";
return $result;
}
@@ -1497,6 +1505,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
@@ -1552,7 +1570,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
@@ -1563,7 +1581,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):
@@ -1584,6 +1603,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.
@@ -1721,7 +1741,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;
@@ -2053,8 +2081,13 @@ sub retrieveResources {
$map = $self->getResourceByUrl($map);
}
+ # If nothing was passed, assume top-level map
+ if (!$map) {
+ $map = $self->getById('0.0');
+ }
+
# Check the map's validity.
- if (!$map || !$map->is_map()) {
+ if (!$map->is_map()) {
# Oh, to throw an exception.... how I'd love that!
return ();
}
@@ -2214,11 +2247,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;
@@ -2274,6 +2302,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) {
@@ -2900,7 +2931,14 @@ sub symb {
$self->navHash('map_id_'.$first))
. '___' . $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); }
sub to { my $self=shift; return $self->navHash("to_", 1); }
sub compTitle {
my $self = shift;
@@ -3076,6 +3114,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.
@@ -3129,7 +3172,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);
@@ -3170,7 +3217,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
@@ -3316,7 +3368,7 @@ sub responseType {
my $part = shift;
$self->extractParts();
- return $self->{RESPONSE_TYPE}->{$part};
+ return $self->{RESPONSE_TYPES}->{$part};
}
sub responseIds {