--- loncom/interface/lonnavmaps.pm 2007/10/05 18:48:20 1.402 +++ loncom/interface/lonnavmaps.pm 2008/01/03 22:49:56 1.407 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.402 2007/10/05 18:48:20 albertel Exp $ +# $Id: lonnavmaps.pm,v 1.407 2008/01/03 22:49:56 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,9 +36,9 @@ use Apache::lonenc(); use Apache::lonlocal; use Apache::lonnet; use POSIX qw (floor strftime); -use Data::Dumper; # for debugging, not always use Time::HiRes qw( gettimeofday tv_interval ); use LONCAPA; +use DateTime(); # symbolic constants sub SYMB { return 1; } @@ -187,6 +187,10 @@ sub getDescription { my $part = shift; my $status = $res->status($part); + my $open = $res->opendate($part); + my $due = $res->duedate($part); + my $answer = $res->answerdate($part); + if ($status == $res->NETWORK_FAILURE) { return &mt("Having technical difficulties; please check status later"); } @@ -194,27 +198,27 @@ sub getDescription { return &mt("Not currently assigned."); } if ($status == $res->OPEN_LATER) { - return "Open " . timeToHumanString($res->opendate($part),'start'); + return "Open " .timeToHumanString($open,'start'); } if ($status == $res->OPEN) { - if ($res->duedate($part)) { + if ($due) { if ($res->is_practice()) { - return &mt("Closes ")." " .timeToHumanString($res->duedate($part),'start'); + return &mt("Closes ")." " .timeToHumanString($due,'start'); } else { - return &mt("Due")." " .timeToHumanString($res->duedate($part),'end'); + return &mt("Due")." " .timeToHumanString($due,'end'); } } else { return &mt("Open, no due date"); } } if ($status == $res->PAST_DUE_ANSWER_LATER) { - return &mt("Answer open")." " . timeToHumanString($res->answerdate($part),'start'); + return &mt("Answer open")." " .timeToHumanString($answer,'start'); } if ($status == $res->PAST_DUE_NO_ANSWER) { if ($res->is_practice()) { - return &mt("Closed")." " . timeToHumanString($res->duedate($part),'start'); + return &mt("Closed")." " . timeToHumanString($due,'start'); } else { - return &mt("Was due")." " . timeToHumanString($res->duedate($part),'end'); + return &mt("Was due")." " . timeToHumanString($due,'end'); } } if (($status == $res->ANSWER_OPEN || $status == $res->PARTIALLY_CORRECT) @@ -237,8 +241,8 @@ sub getDescription { $triesString = "$triesString"; } } - if ($res->duedate($part)) { - return &mt("Due")." " . timeToHumanString($res->duedate($part),'end') . + if ($due) { + return &mt("Due")." " . timeToHumanString($due,'end') . " $triesString"; } else { return &mt("No due date")." $triesString"; @@ -305,9 +309,6 @@ sub timeToHumanString { } my $now = time(); - my @time = localtime($time); - my @now = localtime($now); - # Positive = future my $delta = $time - $now; @@ -366,22 +367,25 @@ sub timeToHumanString { return "$prefix$hourString$minuteString$tense"; } + my $dt = DateTime->from_epoch(epoch => $time) + ->set_time_zone(&Apache::lonlocal::gettimezone()); + # If there's a caller supplied format, use it. - if($format ne '') { - my $timeStr = strftime($format, localtime($time)); - return $timeStr.&Apache::lonlocal::gettimezone($time); + if ($format ne '') { + my $timeStr = $dt->strftime($format); + return $timeStr.' ('.$dt->time_zone_short_name().')'; } # Less than 5 days away, display day of the week and # HH:MM if ( $delta < $day * 5 ) { - my $timeStr = strftime("%A, %b %e at %I:%M %P", localtime($time)); + my $timeStr = $dt->strftime("%A, %b %e at %I:%M %P (%Z)"); $timeStr =~ s/12:00 am/00:00/; $timeStr =~ s/12:00 pm/noon/; return ($inPast ? "last " : "this ") . - $timeStr.&Apache::lonlocal::gettimezone($time); + $timeStr; } my $conjunction='on'; @@ -391,19 +395,22 @@ sub timeToHumanString { $conjunction='by'; } # Is it this year? - if ( $time[5] == $now[5]) { + my $dt_now = DateTime->from_epoch(epoch => $now) + ->set_time_zone(&Apache::lonlocal::gettimezone()); + if ( $dt->year() == $dt_now->year()) { # Return on Month Day, HH:MM meridian - my $timeStr = strftime("$conjunction %A, %b %e at %I:%M %P", localtime($time)); + my $timeStr = $dt->strftime("$conjunction %A, %b %e at %I:%M %P (%Z)"); $timeStr =~ s/12:00 am/00:00/; $timeStr =~ s/12:00 pm/noon/; - return $timeStr.&Apache::lonlocal::gettimezone($time); + return $timeStr; } # Not this year, so show the year - my $timeStr = strftime("$conjunction %A, %b %e %Y at %I:%M %P", localtime($time)); + my $timeStr = + $dt->strftime("$conjunction %A, %b %e %Y at %I:%M %P (%Z)"); $timeStr =~ s/12:00 am/00:00/; $timeStr =~ s/12:00 pm/noon/; - return $timeStr.&Apache::lonlocal::gettimezone($time); + return $timeStr; } } @@ -1045,7 +1052,6 @@ my %statusStrings = ); my @statuses = ($resObj->CORRECT, $resObj->ATTEMPTED, $resObj->INCORRECT, $resObj->OPEN, $resObj->CLOSED, $resObj->ERROR); -use Data::Dumper; sub render_parts_summary_status { my ($resource, $part, $params) = @_; if (!$resource->is_problem() && !$resource->contains_problem) { return ''; } @@ -1289,7 +1295,6 @@ sub render { # Print key? if ($printKey) { $result .= ''; - my $date=localtime; $result.=''; my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc"); if ($navmap->{LAST_CHECK}) { @@ -2294,12 +2299,19 @@ sub parmval { my $hashkey = $what."|||".$symb; if (defined($self->{PARM_CACHE}->{$hashkey})) { - return $self->{PARM_CACHE}->{$hashkey}; + if (wantarray) { + return @{$self->{PARM_CACHE}->{$hashkey}}; + } else { + return $self->{PARM_CACHE}->{$hashkey}->[0]; + } } my $result = $self->parmval_real($what, $symb, $recurse); $self->{PARM_CACHE}->{$hashkey} = $result; - return $result; + if (wantarray) { + return @{$result}; + } + return $result->[0]; } sub parmval_real { @@ -2320,7 +2332,7 @@ sub parmval_real { my $uname=$env{'user.name'}; my $udom=$env{'user.domain'}; - unless ($symb) { return ''; } + unless ($symb) { return ['']; } my $result=''; my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb); @@ -2352,48 +2364,49 @@ sub parmval_real { # ---------------------------------------------------------- first, check user if ($uname and defined($useropt)) { - if (defined($$useropt{$courselevelr})) { return $$useropt{$courselevelr}; } - if (defined($$useropt{$courselevelm})) { return $$useropt{$courselevelm}; } - if (defined($$useropt{$courselevel})) { return $$useropt{$courselevel}; } + if (defined($$useropt{$courselevelr})) { return [$$useropt{$courselevelr},'resource']; } + if (defined($$useropt{$courselevelm})) { return [$$useropt{$courselevelm},'map']; } + if (defined($$useropt{$courselevel})) { return [$$useropt{$courselevel},'course']; } } # ------------------------------------------------------- second, check course if ($cgroup ne '' and defined($courseopt)) { - if (defined($$courseopt{$grplevelr})) { return $$courseopt{$grplevelr}; } - if (defined($$courseopt{$grplevelm})) { return $$courseopt{$grplevelm}; } - if (defined($$courseopt{$grplevel})) { return $$courseopt{$grplevel}; } + if (defined($$courseopt{$grplevelr})) { return [$$courseopt{$grplevelr},'resource']; } + if (defined($$courseopt{$grplevelm})) { return [$$courseopt{$grplevelm},'map']; } + if (defined($$courseopt{$grplevel})) { return [$$courseopt{$grplevel},'course']; } } if ($csec and defined($courseopt)) { - if (defined($$courseopt{$seclevelr})) { return $$courseopt{$seclevelr}; } - if (defined($$courseopt{$seclevelm})) { return $$courseopt{$seclevelm}; } - if (defined($$courseopt{$seclevel})) { return $$courseopt{$seclevel}; } + if (defined($$courseopt{$seclevelr})) { return [$$courseopt{$seclevelr},'resource']; } + if (defined($$courseopt{$seclevelm})) { return [$$courseopt{$seclevelm},'map']; } + if (defined($$courseopt{$seclevel})) { return [$$courseopt{$seclevel},'course']; } } if (defined($courseopt)) { - if (defined($$courseopt{$courselevelr})) { return $$courseopt{$courselevelr}; } + if (defined($$courseopt{$courselevelr})) { return [$$courseopt{$courselevelr},'resource']; } } # ----------------------------------------------------- third, check map parms my $thisparm=$$parmhash{$symbparm}; - if (defined($thisparm)) { return $thisparm; } + if (defined($thisparm)) { return [$thisparm,'map']; } # ----------------------------------------------------- fourth , check default my $meta_rwhat=$rwhat; $meta_rwhat=~s/\./_/g; my $default=&Apache::lonnet::metadata($fn,$meta_rwhat); - if (defined($default)) { return $default} + if (defined($default)) { return [$default,'resource']} $default=&Apache::lonnet::metadata($fn,'parameter_'.$meta_rwhat); - if (defined($default)) { return $default} - + if (defined($default)) { return [$default,'resource']} # --------------------------------------------------- fifth, check more course if (defined($courseopt)) { - if (defined($$courseopt{$courselevelm})) { return $$courseopt{$courselevelm}; } - if (defined($$courseopt{$courselevel})) { return $$courseopt{$courselevel}; } + if (defined($$courseopt{$courselevelm})) { return [$$courseopt{$courselevelm},'map']; } + if (defined($$courseopt{$courselevel})) { + my $ret = [$$courseopt{$courselevel},'course']; + return $ret; + } } - # --------------------------------------------------- sixth , cascade up parts my ($space,@qualifier)=split(/\./,$rwhat); @@ -2403,13 +2416,13 @@ sub parmval_real { my $id=pop(@parts); my $part=join('_',@parts); if ($part eq '') { $part='0'; } - my $partgeneral=$self->parmval($part.".$qualifier",$symb,1); - if (defined($partgeneral)) { return $partgeneral; } + my @partgeneral=$self->parmval($part.".$qualifier",$symb,1); + if (defined($partgeneral[0])) { return \@partgeneral; } } - if ($recurse) { return undef; } + if ($recurse) { return []; } my $pack_def=&Apache::lonnet::packages_tab_default($fn,'resource.'.$rwhat); - if (defined($pack_def)) { return $pack_def; } - return ''; + if (defined($pack_def)) { return [$pack_def,'resource']; } + return ['']; } =pod @@ -3810,13 +3823,15 @@ sub awarded { sub duedate { (my $self, my $part) = @_; my $date; - my $interval=$self->parmval("interval", $part); + my @interval=$self->parmval("interval", $part); my $due_date=$self->parmval("duedate", $part); - if ($interval =~ /\d+/) { - my $first_access=&Apache::lonnet::get_first_access('map',$self->symb); + if ($interval[0] =~ /\d+/) { + my $first_access=&Apache::lonnet::get_first_access($interval[1], + $self->symb); if (defined($first_access)) { - $interval = $first_access+$interval; - $date = ($interval < $due_date)? $interval : $due_date; + my $interval = $first_access+$interval[0]; + $date = (!$due_date || $interval < $due_date) ? $interval + : $due_date; } else { $date = $due_date; }
Key: