--- loncom/interface/lonnavmaps.pm 2010/03/29 17:55:55 1.447
+++ loncom/interface/lonnavmaps.pm 2011/01/24 16:18:41 1.456
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.447 2010/03/29 17:55:55 raeburn Exp $
+# $Id: lonnavmaps.pm,v 1.456 2011/01/24 16:18:41 www Exp $
#
# Copyright Michigan State University Board of Trustees
@@ -528,6 +528,7 @@ my %colormap =
$resObj->OPEN => '',
$resObj->NOTHING_SET => '',
$resObj->ATTEMPTED => '',
+ $resObj->CREDIT_ATTEMPTED => '',
$resObj->ANSWER_SUBMITTED => '',
$resObj->PARTIALLY_CORRECT => '#006600'
);
@@ -608,10 +609,10 @@ sub getDescription {
return &mt("Having technical difficulties; please check status later");
}
if ($status == $res->NOTHING_SET) {
- return &mt("Not currently assigned.");
+ return &Apache::lonhtmlcommon::direct_parm_link(&mt("Not currently assigned.",$res->symb(),'opendate'),$part);
}
if ($status == $res->OPEN_LATER) {
- return &mt("Open ") .timeToHumanString($open,'start');
+ return &mt("Open ") .&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($open,'start'),$res->symb(),'opendate',$part);
}
if ($res->simpleStatus($part) == $res->OPEN) {
unless (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) {
@@ -645,27 +646,27 @@ sub getDescription {
if ($status == $res->OPEN) {
if ($due) {
if ($res->is_practice()) {
- return &mt("Closes ")." " .timeToHumanString($due,'start');
+ return &mt("Closes ")." " .&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part);
} else {
- return &mt("Due")." " .timeToHumanString($due,'end');
+ return &mt("Due")." " .&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part);
}
} else {
- return &mt("Open, no due date");
+ return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part);
}
}
if ($status == $res->PAST_DUE_ANSWER_LATER) {
- return &mt("Answer open")." " .timeToHumanString($answer,'start');
+ return &mt("Answer open")." " .&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($answer,'start'),$res->symb(),'answerdate',$part);
}
if ($status == $res->PAST_DUE_NO_ANSWER) {
if ($res->is_practice()) {
- return &mt("Closed")." " . timeToHumanString($due,'start');
+ return &mt("Closed")." " . &Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'answerdate,duedate',$part);
} else {
- return &mt("Was due")." " . timeToHumanString($due,'end');
+ return &mt("Was due")." " .&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'answerdate,duedate',$part);
}
}
if (($status == $res->ANSWER_OPEN || $status == $res->PARTIALLY_CORRECT)
&& $res->handgrade($part) ne 'yes') {
- return &mt("Answer available");
+ return &Apache::lonhtmlcommon::direct_parm_link(&mt("Answer available"),$res->symb(),'answerdate,duedate',$part);
}
if ($status == $res->EXCUSED) {
return &mt("Excused by instructor");
@@ -677,6 +678,11 @@ sub getDescription {
return &mt("Answer submitted, not yet graded");
}
}
+ if ($status == $res->CREDIT_ATTEMPTED) {
+ if ($res->is_anonsurvey($part) || $res->is_survey($part)) {
+ return &mt("Credit for survey submission");
+ }
+ }
if ($status == $res->TRIES_LEFT) {
my $tries = $res->tries($part);
my $maxtries = $res->maxtries($part);
@@ -688,10 +694,10 @@ sub getDescription {
}
}
if ($due) {
- return &mt("Due")." " . timeToHumanString($due,'end') .
+ return &mt("Due")." " . &Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part) .
" $triesString";
} else {
- return &mt("No due date")." $triesString";
+ return &Apache::lonhtmlcommon::direct_parm_link(&mt("No due date"),$res->symb(),'duedate',$part)." $triesString";
}
}
if ($status == $res->ANSWER_SUBMITTED) {
@@ -1084,9 +1090,10 @@ sub render_long_status {
}
}
- if ($resource->kind() eq "res" &&
+ if (($resource->kind() eq "res" &&
($resource->is_problem() || $resource->is_practice()) &&
- !$firstDisplayed) {
+ !$firstDisplayed) &&
+ $resource->is_raw_problem()) {
if ($color) {$result .= ""; }
$result .= getDescription($resource, $part);
if ($color) {$result .= ""; }
@@ -1401,11 +1408,11 @@ sub render {
my ($link,$text);
if ($condition) {
$link='navmaps?condition=0&filter=&'.$queryString.
- '&here='.&escape($here);
+ '&here='.&escape($here);
$text='Close all folders';
} else {
$link='navmaps?condition=1&filter=&'.$queryString.
- '&here='.&escape($here);
+ '&here='.&escape($here);
$text='Open all folders';
}
if ($env{'form.register'}) {
@@ -1715,7 +1722,7 @@ END
if (defined($anchor)) { $anchor='#'.$anchor; }
my $srcHasQuestion = $src =~ /\?/;
$args->{"resourceLink"} = $src.
- ($srcHasQuestion?'&':'?') .
+ ($srcHasQuestion?'&':'?') .
'symb=' . &escape($symb).$anchor;
}
# Now, we've decided what parts to show. Loop through them and
@@ -1777,12 +1784,11 @@ END
# it's quite likely this might fix other browsers, too, and
# certainly won't hurt anything.
if ($displayedJumpMarker) {
- $result .= "
-";
+");
}
$result.=&Apache::loncommon::end_data_table();
@@ -1925,6 +1931,9 @@ sub new {
my $class = ref($proto) || $proto;
my $self = {};
+ $self->{USERNAME} = shift || $env{'user.name'};
+ $self->{DOMAIN} = shift || $env{'user.domain'};
+
# 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.
$self->{RESOURCE_CACHE} = {};
@@ -1963,8 +1972,9 @@ sub generate_course_user_opt {
my $self = shift;
if ($self->{COURSE_USER_OPT_GENERATED}) { return; }
- my $uname=$env{'user.name'};
- my $udom=$env{'user.domain'};
+ my $uname=$self->{USERNAME};
+ my $udom=$self->{DOMAIN};
+
my $cid=$env{'request.course.id'};
my $cdom=$env{'course.'.$cid.'.domain'};
my $cnum=$env{'course.'.$cid.'.num'};
@@ -2007,7 +2017,7 @@ sub generate_email_discuss_status {
my $cdom=$env{'course.'.$cid.'.domain'};
my $cnum=$env{'course.'.$cid.'.num'};
- my %emailstatus = &Apache::lonnet::dump('email_status');
+ my %emailstatus = &Apache::lonnet::dump('email_status',$self->{DOMAIN},$self->{USERNAME});
my $logoutTime = $emailstatus{'logout'};
my $courseLeaveTime = $emailstatus{'logout_'.$env{'request.course.id'}};
$self->{LAST_CHECK} = (($courseLeaveTime > $logoutTime) ?
@@ -2015,7 +2025,7 @@ sub generate_email_discuss_status {
my %discussiontime = &Apache::lonnet::dump('discussiontimes',
$cdom, $cnum);
my %lastread = &Apache::lonnet::dump('nohist_'.$cid.'_discuss',
- $env{'user.domain'},$env{'user.name'},'lastread');
+ $self->{DOMAIN},$self->{USERNAME},'lastread');
my %lastreadtime = ();
foreach my $key (keys %lastread) {
my $shortkey = $key;
@@ -2025,8 +2035,8 @@ sub generate_email_discuss_status {
my %feedback=();
my %error=();
- my @keys = &Apache::lonnet::getkeys('nohist_email',$env{'user.domain'},
- $env{'user.name'});
+ my @keys = &Apache::lonnet::getkeys('nohist_email',$self->{DOMAIN},
+ $self->{USERNAME});
foreach my $msgid (@keys) {
if ((!$emailstatus{$msgid}) || ($emailstatus{$msgid} eq 'new')) {
@@ -2074,8 +2084,8 @@ sub get_user_data {
# Retrieve performance data on problems
my %student_data = Apache::lonnet::currentdump($env{'request.course.id'},
- $env{'user.domain'},
- $env{'user.name'});
+ $self->{DOMAIN},
+ $self->{USERNAME});
$self->{STUDENT_DATA} = \%student_data;
$self->{RETRIEVED_USER_DATA} = 1;
@@ -2304,7 +2314,7 @@ resource object.
Based on the symb of the resource, get a resource object for that
resource. This is one of the proper ways to get a resource object.
-=item * B(map_pc):
+=item * B(map_pc):
Based on the map_pc of the resource, get a resource object for
the given map. This is one of the proper ways to get a resource object.
@@ -2426,8 +2436,8 @@ sub parmval_real {
@cgrps = sort(@cgrps);
$cgroup = $cgrps[0];
}
- my $uname=$env{'user.name'};
- my $udom=$env{'user.domain'};
+ my $uname=$self->{USERNAME};
+ my $udom=$self->{DOMAIN};
unless ($symb) { return ['']; }
my $result='';
@@ -2574,7 +2584,7 @@ in the filter function.
Retrieves version infomation for a url. Returns the version (a number, or
the string "mostrecent") for resources which have version information in
the big hash.
-
+
=cut
@@ -2829,6 +2839,9 @@ sub new {
weaken($self->{NAV_MAP} = shift);
return undef unless ($self->{NAV_MAP});
+ $self->{USERNAME} = $self->{NAV_MAP}->{USERNAME};
+ $self->{DOMAIN} = $self->{NAV_MAP}->{DOMAIN};
+
# Handle the parameters
$self->{FIRST_RESOURCE} = shift || $self->{NAV_MAP}->firstResource();
$self->{FINISH_RESOURCE} = shift || $self->{NAV_MAP}->finishResource();
@@ -3202,6 +3215,9 @@ sub new {
weaken($self->{NAV_MAP} = shift);
return undef unless ($self->{NAV_MAP});
+ $self->{USERNAME} = $self->{NAV_MAP}->{USERNAME};
+ $self->{DOMAIN} = $self->{NAV_MAP}->{DOMAIN};
+
$self->{FIRST_RESOURCE} = shift || $self->{NAV_MAP}->firstResource();
$self->{FINISH_RESOURCE} = shift || $self->{NAV_MAP}->finishResource();
@@ -3438,6 +3454,9 @@ sub new {
weaken($self->{NAV_MAP} = shift);
$self->{ID} = shift;
+ $self->{USERNAME} = $self->{NAV_MAP}->{USERNAME};
+ $self->{DOMAIN} = $self->{NAV_MAP}->{DOMAIN};
+
# Store this new resource in the parent nav map's cache.
$self->{NAV_MAP}->{RESOURCE_CACHE}->{$self->{ID}} = $self;
$self->{RESOURCE_ERROR} = 0;
@@ -3460,7 +3479,7 @@ sub navHash {
my $param = shift;
my $id = shift;
my $arg = $param . ($id?$self->{ID}:"");
- if (defined($arg)) {
+ if (ref($self) && ref($self->{NAV_MAP}) && defined($arg)) {
return $self->{NAV_MAP}->navhash($arg);
}
return;
@@ -3840,6 +3859,12 @@ resource of the map.
Returns a string with the type of the map in it.
+=item *B:
+
+Returns a string with a comma-separated ordered list of map_pc IDs
+for the hierarchy of maps containing a map, with the top level
+map first, then descending to deeper levels, with the enclosing map last.
+
=back
=cut
@@ -3870,6 +3895,11 @@ sub map_type {
my $pc = $self->map_pc();
return $self->navHash("map_type_$pc", 0);
}
+sub map_hierarchy {
+ my $self = shift;
+ my $pc = $self->map_pc();
+ return $self->navHash("map_hierarchy_$pc", 0);
+}
#####
# Property queries
@@ -4084,8 +4114,8 @@ sub weight {
my $self = shift; my $part = shift;
if (!defined($part)) { $part = '0'; }
my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight',
- $self->symb(), $env{'user.domain'},
- $env{'user.name'},
+ $self->symb(), $self->{DOMAIN},
+ $self->{USERNAME},
$env{'request.course.sec'});
return $weight;
}
@@ -4113,7 +4143,7 @@ sub getReturnHash {
my $self = shift;
if (!defined($self->{RETURN_HASH})) {
- my %tmpHash = &Apache::lonnet::restore($self->symb());
+ my %tmpHash = &Apache::lonnet::restore($self->symb(),undef,$self->{DOMAIN},$self->{USERNAME});
$self->{RETURN_HASH} = \%tmpHash;
}
}
@@ -4625,6 +4655,10 @@ Information not available due to network
Attempted, and not yet graded.
+=item * B:
+
+Attempted, and credit received for attempt (survey and anonymous survey only).
+
=back
=cut
@@ -4636,6 +4670,7 @@ sub CORRECT { return 13; }
sub CORRECT_BY_OVERRIDE { return 14; }
sub EXCUSED { return 15; }
sub ATTEMPTED { return 16; }
+sub CREDIT_ATTEMPTED { return 17; }
sub getCompletionStatus {
my $self = shift;
@@ -4654,6 +4689,13 @@ sub getCompletionStatus {
if ($status eq 'incorrect_by_override') {return $self->INCORRECT_BY_OVERRIDE; }
if ($status eq 'excused') {return $self->EXCUSED; }
if ($status eq 'ungraded_attempted') {return $self->ATTEMPTED; }
+ if ($status eq 'credit_attempted') {
+ if ($self->is_anonsurvey($part) || $self->is_survey($part)) {
+ return $self->CREDIT_ATTEMPTED;
+ } else {
+ return $self->ATTEMPTED;
+ }
+ }
return $self->NOT_ATTEMPTED;
}
@@ -4743,6 +4785,10 @@ The item is open and not yet tried.
The problem has been attempted.
+=item * B:
+
+The problem has been attempted, and credit given for the attempt (survey and anonymous survey only).
+
=item * B:
An answer has been submitted, but the student should not see it.
@@ -4816,6 +4862,10 @@ sub status {
return ATTEMPTED;
}
+ if ($completionStatus == CREDIT_ATTEMPTED) {
+ return CREDIT_ATTEMPTED;
+ }
+
# If it's EXCUSED, then return that no matter what
if ($completionStatus == EXCUSED) {
return EXCUSED;
@@ -5008,6 +5058,7 @@ my %compositeToSimple =
INCORRECT() => INCORRECT,
OPEN() => OPEN,
ATTEMPTED() => ATTEMPTED,
+ CREDIT_ATTEMPTED() => CORRECT,
ANSWER_SUBMITTED() => ATTEMPTED
);
@@ -5082,6 +5133,7 @@ sub completable {
# and it is not "attempted" (manually graded problem), it is
# not "complete"
if ($self->getCompletionStatus($part) == ATTEMPTED() ||
+ $self->getCompletionStatus($part) == CREDIT_ATTEMPTED() ||
$status == ANSWER_SUBMITTED() ) {
# did this part already, as well as we can
next;