version 1.444.2.7.2.1, 2012/02/17 19:42:10
|
version 1.462, 2011/07/18 11:56:23
|
Line 483 use POSIX qw (floor strftime);
|
Line 483 use POSIX qw (floor strftime);
|
use Time::HiRes qw( gettimeofday tv_interval ); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use LONCAPA; |
use LONCAPA; |
use DateTime(); |
use DateTime(); |
|
use Data::Dumper; |
# symbolic constants |
# symbolic constants |
sub SYMB { return 1; } |
sub SYMB { return 1; } |
sub URL { return 2; } |
sub URL { return 2; } |
Line 527 my %colormap =
|
Line 527 my %colormap =
|
$resObj->INCORRECT => '', |
$resObj->INCORRECT => '', |
$resObj->OPEN => '', |
$resObj->OPEN => '', |
$resObj->NOTHING_SET => '', |
$resObj->NOTHING_SET => '', |
$resObj->CREDIT_ATTEMPTED => '', |
|
$resObj->ATTEMPTED => '', |
$resObj->ATTEMPTED => '', |
|
$resObj->CREDIT_ATTEMPTED => '', |
$resObj->ANSWER_SUBMITTED => '', |
$resObj->ANSWER_SUBMITTED => '', |
$resObj->PARTIALLY_CORRECT => '#006600' |
$resObj->PARTIALLY_CORRECT => '#006600' |
); |
); |
Line 539 my $hurryUpColor = "#FF0000";
|
Line 539 my $hurryUpColor = "#FF0000";
|
my $future_slots_checked = 0; |
my $future_slots_checked = 0; |
my $future_slots = 0; |
my $future_slots = 0; |
|
|
sub close { |
|
if ($env{'environment.remotenavmap'} ne 'on') { return ''; } |
|
return(<<ENDCLOSE); |
|
<script type="text/javascript"> |
|
window.status='Accessing Nav Control'; |
|
menu=window.open("/adm/rat/empty.html","loncapanav", |
|
"height=600,width=400,scrollbars=1"); |
|
window.status='Closing Nav Control'; |
|
menu.close(); |
|
window.status='Done.'; |
|
</script> |
|
ENDCLOSE |
|
} |
|
|
|
sub update { |
|
if ($env{'environment.remotenavmap'} ne 'on') { return ''; } |
|
if (!$env{'request.course.id'}) { return ''; } |
|
if ($ENV{'REQUEST_URI'}=~m|^/adm/navmaps|) { return ''; } |
|
return(<<ENDUPDATE); |
|
<form name="navform"></form> |
|
<script type="text/javascript"> |
|
this.document.navform.action='/adm/navmaps#curloc'; |
|
this.document.navform.target='loncapanav'; |
|
this.document.navform.submit(); |
|
</script> |
|
ENDUPDATE |
|
} |
|
|
|
|
|
sub addToFilter { |
sub addToFilter { |
my $hashIn = shift; |
my $hashIn = shift; |
my $addition = shift; |
my $addition = shift; |
Line 638 sub getDescription {
|
Line 609 sub getDescription {
|
return &mt("Having technical difficulties; please check status later"); |
return &mt("Having technical difficulties; please check status later"); |
} |
} |
if ($status == $res->NOTHING_SET) { |
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) { |
if ($status == $res->OPEN_LATER) { |
return &mt("Open [_1]",&timeToHumanString($open,'start')); |
return &mt("Open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($open,'start')),$res->symb(),'opendate',$part); |
} |
} |
if ($res->simpleStatus($part) == $res->OPEN) { |
if ($res->simpleStatus($part) == $res->OPEN) { |
unless (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) { |
unless (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) { |
Line 675 sub getDescription {
|
Line 646 sub getDescription {
|
if ($status == $res->OPEN) { |
if ($status == $res->OPEN) { |
if ($due) { |
if ($due) { |
if ($res->is_practice()) { |
if ($res->is_practice()) { |
return &mt("Closes [_1]",&timeToHumanString($due,'start')); |
return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start')),$res->symb(),'duedate',$part); |
} else { |
} else { |
return &mt("Due [_1]",&timeToHumanString($due,'end')); |
return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end')),$res->symb(),'duedate',$part); |
} |
} |
} else { |
} 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) { |
if ($status == $res->PAST_DUE_ANSWER_LATER) { |
return &mt("Answer open [_1]",&timeToHumanString($answer,'start')); |
return &mt("Answer open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($answer,'start')),$res->symb(),'answerdate',$part); |
} |
} |
if ($status == $res->PAST_DUE_NO_ANSWER) { |
if ($status == $res->PAST_DUE_NO_ANSWER) { |
if ($res->is_practice()) { |
if ($res->is_practice()) { |
return &mt("Closed [_1]",&timeToHumanString($due,'start')); |
return &mt("Closed [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start')),$res->symb(),'answerdate,duedate',$part); |
} else { |
} else { |
return &mt("Was due [_1]",&timeToHumanString($due,'end')); |
return &mt("Was due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end')),$res->symb(),'answerdate,duedate',$part); |
} |
} |
} |
} |
if (($status == $res->ANSWER_OPEN || $status == $res->PARTIALLY_CORRECT) |
if (($status == $res->ANSWER_OPEN || $status == $res->PARTIALLY_CORRECT) |
&& $res->handgrade($part) ne 'yes') { |
&& $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) { |
if ($status == $res->EXCUSED) { |
return &mt("Excused by instructor"); |
return &mt("Excused by instructor"); |
Line 723 sub getDescription {
|
Line 694 sub getDescription {
|
} |
} |
} |
} |
if ($due) { |
if ($due) { |
return &mt("Due [_1]",&timeToHumanString($due,'end')) . |
return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end')),$res->symb(),'duedate',$part) . |
" $triesString"; |
" $triesString"; |
} else { |
} 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) { |
if ($status == $res->ANSWER_SUBMITTED) { |
Line 808 sub timeToHumanString {
|
Line 779 sub timeToHumanString {
|
|
|
# Less than an hour |
# Less than an hour |
if ( $delta < $hour ) { |
if ( $delta < $hour ) { |
# If so, use minutes; or minutes, seconds (if format requires) |
# If so, use minutes |
my $minutes = floor($delta / 60); |
my $minutes = floor($delta / 60); |
if (($format ne '') && ($format =~ /\%(T|S)/)) { |
|
my $display; |
|
if ($minutes == 1) { |
|
$display = "${prefix}1 minute"; |
|
} else { |
|
$display = "$prefix$minutes minutes"; |
|
} |
|
my $seconds = $delta % $minute; |
|
if ($seconds == 0) { |
|
$display .= $tense; |
|
} elsif ($seconds == 1) { |
|
$display .= ", 1 second$tense"; |
|
} else { |
|
$display .= ", $seconds seconds$tense"; |
|
} |
|
return $display; |
|
} |
|
if ($minutes == 1) { return "${prefix}1 minute$tense"; } |
if ($minutes == 1) { return "${prefix}1 minute$tense"; } |
return "$prefix$minutes minutes$tense"; |
return "$prefix$minutes minutes$tense"; |
} |
} |
|
|
# Is it less than 24 hours away? If so, |
# Is it less than 24 hours away? If so, |
# display hours + minutes, (and + seconds, if format specified it) |
# display hours + minutes |
if ( $delta < $hour * 24) { |
if ( $delta < $hour * 24) { |
my $hours = floor($delta / $hour); |
my $hours = floor($delta / $hour); |
my $minutes = floor(($delta % $hour) / $minute); |
my $minutes = floor(($delta % $hour) / $minute); |
Line 847 sub timeToHumanString {
|
Line 801 sub timeToHumanString {
|
if ($minutes == 0) { |
if ($minutes == 0) { |
$minuteString = ""; |
$minuteString = ""; |
} |
} |
if (($format ne '') && ($format =~ /\%(T|S)/)) { |
|
my $display = "$prefix$hourString$minuteString"; |
|
my $seconds = $delta-(($hours * $hour)+($minutes * $minute)); |
|
if ($seconds == 0) { |
|
$display .= $tense; |
|
} elsif ($seconds == 1) { |
|
$display .= ", 1 second$tense"; |
|
} else { |
|
$display .= ", $seconds seconds$tense"; |
|
} |
|
return $display; |
|
} |
|
return "$prefix$hourString$minuteString$tense"; |
return "$prefix$hourString$minuteString$tense"; |
} |
} |
|
|
# Date/time is more than 24 hours away |
|
|
|
my $dt = DateTime->from_epoch(epoch => $time) |
my $dt = DateTime->from_epoch(epoch => $time) |
->set_time_zone(&Apache::lonlocal::gettimezone()); |
->set_time_zone(&Apache::lonlocal::gettimezone()); |
|
|
# If there's a caller supplied format, use it, unless it only displays |
# If there's a caller supplied format, use it. |
# H:M:S or H:M. |
|
|
|
if (($format ne '') && ($format ne '%T') && ($format ne '%R')) { |
if ($format ne '') { |
my $timeStr = $dt->strftime($format); |
my $timeStr = $dt->strftime($format); |
return $timeStr.' ('.$dt->time_zone_short_name().')'; |
return $timeStr.' ('.$dt->time_zone_short_name().')'; |
} |
} |
Line 1053 sub render_resource {
|
Line 992 sub render_resource {
|
$nonLinkedText .= ' ('.&mt('[_1] parts', $resource->countParts()).')'; |
$nonLinkedText .= ' ('.&mt('[_1] parts', $resource->countParts()).')'; |
} |
} |
|
|
my $target; |
|
if ($env{'environment.remotenavmap'} eq 'on') { |
|
$target=' target="loncapaclient" '; |
|
} |
|
if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) { |
if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) { |
$result .= "$curMarkerBegin<a $target href=\"$link\">$title$partLabel</a>$curMarkerEnd$nonLinkedText</td>"; |
$result .= "$curMarkerBegin<a href=\"$link\">$title$partLabel</a>$curMarkerEnd$nonLinkedText</td>"; |
} else { |
} else { |
$result .= "$curMarkerBegin$linkopen$title$partLabel</a>$curMarkerEnd$nonLinkedText</td>"; |
$result .= "$curMarkerBegin$linkopen$title$partLabel</a>$curMarkerEnd$nonLinkedText</td>"; |
} |
} |
Line 1071 sub render_communication_status {
|
Line 1006 sub render_communication_status {
|
my $discussionHTML = ""; my $feedbackHTML = ""; my $errorHTML = ""; |
my $discussionHTML = ""; my $feedbackHTML = ""; my $errorHTML = ""; |
|
|
my $link = $params->{"resourceLink"}; |
my $link = $params->{"resourceLink"}; |
my $target; |
my $linkopen = "<a href=\"$link\">"; |
if ($env{'environment.remotenavmap'} eq 'on') { |
|
$target=' target="loncapaclient" '; |
|
} |
|
my $linkopen = "<a $target href=\"$link\">"; |
|
my $linkclose = "</a>"; |
my $linkclose = "</a>"; |
my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc"); |
my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc"); |
if ($resource->hasDiscussion()) { |
if ($resource->hasDiscussion()) { |
Line 1088 sub render_communication_status {
|
Line 1019 sub render_communication_status {
|
my $feedback = $resource->getFeedback(); |
my $feedback = $resource->getFeedback(); |
foreach my $msgid (split(/\,/, $feedback)) { |
foreach my $msgid (split(/\,/, $feedback)) { |
if ($msgid) { |
if ($msgid) { |
$feedbackHTML .= ' <a '.$target.' href="/adm/email?display=' |
$feedbackHTML .= ' <a href="/adm/email?display=' |
. &escape($msgid) . '">' |
. &escape($msgid) . '">' |
. '<img alt="'.&mt('New E-mail').'" src="'.$location.'/feedback.gif" title="'.&mt('New E-mail').'"/></a>'; |
. '<img alt="'.&mt('New E-mail').'" src="'.$location.'/feedback.gif" title="'.&mt('New E-mail').'"/></a>'; |
} |
} |
Line 1102 sub render_communication_status {
|
Line 1033 sub render_communication_status {
|
last if ($errorcount>=10); # Only output 10 bombs maximum |
last if ($errorcount>=10); # Only output 10 bombs maximum |
if ($msgid) { |
if ($msgid) { |
$errorcount++; |
$errorcount++; |
$errorHTML .= ' <a '.$target.' href="/adm/email?display=' |
$errorHTML .= ' <a href="/adm/email?display=' |
. &escape($msgid) . '">' |
. &escape($msgid) . '">' |
. '<img alt="'.&mt('New Error').'" src="'.$location.'/bomb.gif" title="'.&mt('New Error').'"/></a>'; |
. '<img alt="'.&mt('New Error').'" src="'.$location.'/bomb.gif" title="'.&mt('New Error').'"/></a>'; |
} |
} |
Line 1122 sub render_quick_status {
|
Line 1053 sub render_quick_status {
|
$params->{'multipart'} && $part eq "0"; |
$params->{'multipart'} && $part eq "0"; |
|
|
my $link = $params->{"resourceLink"}; |
my $link = $params->{"resourceLink"}; |
my $target; |
my $linkopen = "<a href=\"$link\">"; |
if ($env{'environment.remotenavmap'} eq 'on') { |
|
$target=' target="loncapaclient" '; |
|
} |
|
my $linkopen = "<a $target href=\"$link\">"; |
|
my $linkclose = "</a>"; |
my $linkclose = "</a>"; |
|
|
$result .= '<td class="LC_middle">'; |
$result .= '<td class="LC_middle">'; |
Line 1163 sub render_long_status {
|
Line 1090 sub render_long_status {
|
} |
} |
} |
} |
|
|
if ($resource->kind() eq "res" && |
if (($resource->kind() eq "res" && |
$resource->is_raw_problem() && |
($resource->is_problem() || $resource->is_practice()) && |
!$firstDisplayed) { |
!$firstDisplayed) && |
|
$resource->is_raw_problem()) { |
if ($color) {$result .= "<font color=\"$color\"><b>"; } |
if ($color) {$result .= "<font color=\"$color\"><b>"; } |
$result .= getDescription($resource, $part); |
$result .= getDescription($resource, $part); |
if ($color) {$result .= "</b></font>"; } |
if ($color) {$result .= "</b></font>"; } |
Line 1492 sub render {
|
Line 1420 sub render {
|
} |
} |
if ($args->{'caller'} eq 'navmapsdisplay') { |
if ($args->{'caller'} eq 'navmapsdisplay') { |
&add_linkitem($args->{'linkitems'},'changefolder', |
&add_linkitem($args->{'linkitems'},'changefolder', |
"location.href='$link'",$text); |
"location.href='$link'",$text); |
} else { |
} else { |
$result.= '<a href="'.$link.'">'.&mt($text).'</a>'; |
$result.= '<a href="'.$link.'">'.&mt($text).'</a>'; |
} |
} |
$result .= "\n"; |
$result .= "\n"; |
} |
} |
Line 1536 END
|
Line 1464 END
|
|
|
if ($args->{'caller'} eq 'navmapsdisplay') { |
if ($args->{'caller'} eq 'navmapsdisplay') { |
$result .= '<table><tr><td>'. |
$result .= '<table><tr><td>'. |
&Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT').'</td><td> </td>'. |
&Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT').'</td>'; |
'<td class="LC_middle">'.&mt('Tools:').'</td>'. |
$result .= '<td> </td>'; |
&show_linkitems_toolbar($args->{'linkitems'}); |
$result.='<td class="LC_middle">'.&mt('Tools:').'</td>'; |
|
$result.=&show_linkitems_toolbar($args->{'linkitems'}); |
if ($args->{'sort_html'}) { |
if ($args->{'sort_html'}) { |
if ($env{'environment.remotenavmap'} ne 'on') { |
$result.='<td> </td><td> </td><td> </td>'. |
$result .= '<td> </td><td> </td><td> </td>'. |
'<td align="right">'.$args->{'sort_html'}.'</td></tr>'; |
'<td align="right">'.$args->{'sort_html'}.'</td></tr>'; |
|
} else { |
|
$result .= '</tr><tr><td align="left" colspan="4"><br />'. |
|
$args->{'sort_html'}.'</td></tr>'; |
|
} |
|
} else { |
|
$result .= '</tr>'; |
|
} |
} |
$result .= '</table>'; |
$result .= '</table>'; |
} elsif ($args->{'sort_html'}) { |
} elsif ($args->{'sort_html'}) { |
Line 1888 sub add_linkitem {
|
Line 1810 sub add_linkitem {
|
|
|
sub show_linkitems_toolbar { |
sub show_linkitems_toolbar { |
my ($linkitems,$condition)=@_; |
my ($linkitems,$condition)=@_; |
my @linkorder = ("launchnav","closenav","firsthomework", |
my @linkorder = ('firsthomework','everything','uncompleted', |
"everything","uncompleted","changefolder","clearbubbles"); |
'changefolder','clearbubbles'); |
my $result .='<td align="left">'."\n". |
my $result .='<td align="left">'."\n". |
'<span class="LC_nobreak">'."\n". |
'<span class="LC_nobreak">'."\n". |
'<ul id="LC_toolbar">'; |
'<ul id="LC_toolbar">'; |
foreach my $link (@linkorder) { |
foreach my $link (@linkorder) { |
Line 2009 sub new {
|
Line 1931 sub new {
|
my $class = ref($proto) || $proto; |
my $class = ref($proto) || $proto; |
my $self = {}; |
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 |
# 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. |
$self->{RESOURCE_CACHE} = {}; |
$self->{RESOURCE_CACHE} = {}; |
Line 2047 sub generate_course_user_opt {
|
Line 1972 sub generate_course_user_opt {
|
my $self = shift; |
my $self = shift; |
if ($self->{COURSE_USER_OPT_GENERATED}) { return; } |
if ($self->{COURSE_USER_OPT_GENERATED}) { return; } |
|
|
my $uname=$env{'user.name'}; |
my $uname=$self->{USERNAME}; |
my $udom=$env{'user.domain'}; |
my $udom=$self->{DOMAIN}; |
|
|
my $cid=$env{'request.course.id'}; |
my $cid=$env{'request.course.id'}; |
my $cdom=$env{'course.'.$cid.'.domain'}; |
my $cdom=$env{'course.'.$cid.'.domain'}; |
my $cnum=$env{'course.'.$cid.'.num'}; |
my $cnum=$env{'course.'.$cid.'.num'}; |
Line 2091 sub generate_email_discuss_status {
|
Line 2017 sub generate_email_discuss_status {
|
my $cdom=$env{'course.'.$cid.'.domain'}; |
my $cdom=$env{'course.'.$cid.'.domain'}; |
my $cnum=$env{'course.'.$cid.'.num'}; |
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 $logoutTime = $emailstatus{'logout'}; |
my $courseLeaveTime = $emailstatus{'logout_'.$env{'request.course.id'}}; |
my $courseLeaveTime = $emailstatus{'logout_'.$env{'request.course.id'}}; |
$self->{LAST_CHECK} = (($courseLeaveTime > $logoutTime) ? |
$self->{LAST_CHECK} = (($courseLeaveTime > $logoutTime) ? |
Line 2099 sub generate_email_discuss_status {
|
Line 2025 sub generate_email_discuss_status {
|
my %discussiontime = &Apache::lonnet::dump('discussiontimes', |
my %discussiontime = &Apache::lonnet::dump('discussiontimes', |
$cdom, $cnum); |
$cdom, $cnum); |
my %lastread = &Apache::lonnet::dump('nohist_'.$cid.'_discuss', |
my %lastread = &Apache::lonnet::dump('nohist_'.$cid.'_discuss', |
$env{'user.domain'},$env{'user.name'},'lastread'); |
$self->{DOMAIN},$self->{USERNAME},'lastread'); |
my %lastreadtime = (); |
my %lastreadtime = (); |
foreach my $key (keys %lastread) { |
foreach my $key (keys %lastread) { |
my $shortkey = $key; |
my $shortkey = $key; |
Line 2109 sub generate_email_discuss_status {
|
Line 2035 sub generate_email_discuss_status {
|
|
|
my %feedback=(); |
my %feedback=(); |
my %error=(); |
my %error=(); |
my @keys = &Apache::lonnet::getkeys('nohist_email',$env{'user.domain'}, |
my @keys = &Apache::lonnet::getkeys('nohist_email',$self->{DOMAIN}, |
$env{'user.name'}); |
$self->{USERNAME}); |
|
|
foreach my $msgid (@keys) { |
foreach my $msgid (@keys) { |
if ((!$emailstatus{$msgid}) || ($emailstatus{$msgid} eq 'new')) { |
if ((!$emailstatus{$msgid}) || ($emailstatus{$msgid} eq 'new')) { |
Line 2158 sub get_user_data {
|
Line 2084 sub get_user_data {
|
|
|
# Retrieve performance data on problems |
# Retrieve performance data on problems |
my %student_data = Apache::lonnet::currentdump($env{'request.course.id'}, |
my %student_data = Apache::lonnet::currentdump($env{'request.course.id'}, |
$env{'user.domain'}, |
$self->{DOMAIN}, |
$env{'user.name'}); |
$self->{USERNAME}); |
$self->{STUDENT_DATA} = \%student_data; |
$self->{STUDENT_DATA} = \%student_data; |
|
|
$self->{RETRIEVED_USER_DATA} = 1; |
$self->{RETRIEVED_USER_DATA} = 1; |
Line 2473 sub parmval {
|
Line 2399 sub parmval {
|
my $self = shift; |
my $self = shift; |
my ($what,$symb,$recurse)=@_; |
my ($what,$symb,$recurse)=@_; |
my $hashkey = $what."|||".$symb; |
my $hashkey = $what."|||".$symb; |
|
my $cache = $self->{PARM_CACHE}; |
if (defined($self->{PARM_CACHE}->{$hashkey})) { |
if (defined($self->{PARM_CACHE}->{$hashkey})) { |
if (ref($self->{PARM_CACHE}->{$hashkey}) eq 'ARRAY') { |
if (ref($self->{PARM_CACHE}->{$hashkey}) eq 'ARRAY') { |
if (defined($self->{PARM_CACHE}->{$hashkey}->[0])) { |
if (defined($self->{PARM_CACHE}->{$hashkey}->[0])) { |
Line 2510 sub parmval_real {
|
Line 2436 sub parmval_real {
|
@cgrps = sort(@cgrps); |
@cgrps = sort(@cgrps); |
$cgroup = $cgrps[0]; |
$cgroup = $cgrps[0]; |
} |
} |
my $uname=$env{'user.name'}; |
my $uname=$self->{USERNAME}; |
my $udom=$env{'user.domain'}; |
my $udom=$self->{DOMAIN}; |
|
|
unless ($symb) { return ['']; } |
unless ($symb) { return ['']; } |
my $result=''; |
my $result=''; |
Line 2658 in the filter function.
|
Line 2584 in the filter function.
|
Retrieves version infomation for a url. Returns the version (a number, or |
Retrieves version infomation for a url. Returns the version (a number, or |
the string "mostrecent") for resources which have version information in |
the string "mostrecent") for resources which have version information in |
the big hash. |
the big hash. |
|
|
=cut |
=cut |
|
|
|
|
Line 2913 sub new {
|
Line 2839 sub new {
|
weaken($self->{NAV_MAP} = shift); |
weaken($self->{NAV_MAP} = shift); |
return undef unless ($self->{NAV_MAP}); |
return undef unless ($self->{NAV_MAP}); |
|
|
|
$self->{USERNAME} = $self->{NAV_MAP}->{USERNAME}; |
|
$self->{DOMAIN} = $self->{NAV_MAP}->{DOMAIN}; |
|
|
# Handle the parameters |
# Handle the parameters |
$self->{FIRST_RESOURCE} = shift || $self->{NAV_MAP}->firstResource(); |
$self->{FIRST_RESOURCE} = shift || $self->{NAV_MAP}->firstResource(); |
$self->{FINISH_RESOURCE} = shift || $self->{NAV_MAP}->finishResource(); |
$self->{FINISH_RESOURCE} = shift || $self->{NAV_MAP}->finishResource(); |
Line 3286 sub new {
|
Line 3215 sub new {
|
weaken($self->{NAV_MAP} = shift); |
weaken($self->{NAV_MAP} = shift); |
return undef unless ($self->{NAV_MAP}); |
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->{FIRST_RESOURCE} = shift || $self->{NAV_MAP}->firstResource(); |
$self->{FINISH_RESOURCE} = shift || $self->{NAV_MAP}->finishResource(); |
$self->{FINISH_RESOURCE} = shift || $self->{NAV_MAP}->finishResource(); |
|
|
Line 3522 sub new {
|
Line 3454 sub new {
|
weaken($self->{NAV_MAP} = shift); |
weaken($self->{NAV_MAP} = shift); |
$self->{ID} = 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. |
# Store this new resource in the parent nav map's cache. |
$self->{NAV_MAP}->{RESOURCE_CACHE}->{$self->{ID}} = $self; |
$self->{NAV_MAP}->{RESOURCE_CACHE}->{$self->{ID}} = $self; |
$self->{RESOURCE_ERROR} = 0; |
$self->{RESOURCE_ERROR} = 0; |
|
|
$self->{DUEDATE_CACHE} = undef; |
|
|
|
# A hash that can be used by two-pass algorithms to store data |
# A hash that can be used by two-pass algorithms to store data |
# about this resource in. Not used by the resource object |
# about this resource in. Not used by the resource object |
# directly. |
# directly. |
Line 3546 sub navHash {
|
Line 3479 sub navHash {
|
my $param = shift; |
my $param = shift; |
my $id = shift; |
my $id = shift; |
my $arg = $param . ($id?$self->{ID}:""); |
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 $self->{NAV_MAP}->navhash($arg); |
} |
} |
return; |
return; |
Line 3810 my %incomplete_hash =
|
Line 3743 my %incomplete_hash =
|
sub is_incomplete { |
sub is_incomplete { |
my $self = shift; |
my $self = shift; |
if ($self->is_problem()) { |
if ($self->is_problem()) { |
&Apache::lonnet::logthis('is problem'); |
|
foreach my $part (@{$self->parts()}) { |
foreach my $part (@{$self->parts()}) { |
&Apache::lonnet::logthis("$part status ".$self->status($part)); |
|
if (exists($incomplete_hash{$self->status($part)})) { |
if (exists($incomplete_hash{$self->status($part)})) { |
return 1; |
return 1; |
} |
} |
Line 3968 sub map_hierarchy {
|
Line 3899 sub map_hierarchy {
|
return $self->navHash("map_hierarchy_$pc", 0); |
return $self->navHash("map_hierarchy_$pc", 0); |
} |
} |
|
|
|
|
##### |
##### |
# Property queries |
# Property queries |
##### |
##### |
Line 3998 their code.)
|
Line 3928 their code.)
|
|
|
=over 4 |
=over 4 |
|
|
=item * B<acc>: |
=item * B<printable> |
|
|
|
returns true if the current date is such that the |
|
specified resource part is printable. |
|
|
|
=item * B<resprintable> |
|
|
|
Returns true if all parts in the resource are printable making the |
|
entire resource printable. |
|
|
|
=item * B<acc> |
|
|
Get the Client IP/Name Access Control information. |
Get the Client IP/Name Access Control information. |
|
|
Line 4051 Get the weight for the problem.
|
Line 3991 Get the weight for the problem.
|
|
|
=cut |
=cut |
|
|
|
sub printable { |
|
|
|
my ($self, $part) = @_; |
|
|
|
# Get the print open/close dates for the resource. |
|
|
|
my $start = $self->parmval("prinstartdate", $part); |
|
my $end = $self->parmval("printenddate", $part); |
|
|
|
# The following cases apply: |
|
# - No dates set: Printable. |
|
# - Start date set but no end date: Printable if now >= start date. |
|
# - End date set but no start date: Printable if now <= end date. |
|
# - both defined: printable if start <= now <= end |
|
# |
|
my $now = time(); |
|
|
|
my $startok = 1; |
|
my $endok = 1; |
|
|
|
if ((defined $start) && ($start ne '')) { |
|
$startok = $start <= $now; |
|
} |
|
if ((defined $end) && ($end != '')) { |
|
$endok = $end >= $now; |
|
} |
|
return $startok && $endok; |
|
} |
|
|
|
sub resprintable { |
|
my $self = shift; |
|
|
|
# get parts...or realize there are no parts. |
|
|
|
my $partsref = $self->parts(); |
|
my @parts = @$partsref; |
|
|
|
if ((!defined(@parts)) || (scalar(@parts) == 0)) { |
|
return $self->printable(0); |
|
} else { |
|
foreach my $part (@parts) { |
|
if (!$self->printable($part)) { |
|
return 0; |
|
} |
|
} |
|
return 1; |
|
} |
|
} |
|
|
sub acc { |
sub acc { |
(my $self, my $part) = @_; |
(my $self, my $part) = @_; |
my $acc = $self->parmval("acc", $part); |
my $acc = $self->parmval("acc", $part); |
Line 4103 sub checkedin {
|
Line 4092 sub checkedin {
|
} |
} |
} |
} |
# this should work exactly like the copy in lonhomework.pm |
# this should work exactly like the copy in lonhomework.pm |
|
# Why is there a copy in lonhomework? Why not centralized? |
|
# |
|
# TODO: Centralize duedate. |
|
# |
|
|
sub duedate { |
sub duedate { |
(my $self, my $part) = @_; |
(my $self, my $part) = @_; |
if (defined ($self->{DUEDATE_CACHE}->{$part})) { |
|
return $self->{DUEDATE_CACHE}->{$part}; |
|
} |
|
my $date; |
my $date; |
my @interval=$self->parmval("interval", $part); |
my @interval=$self->parmval("interval", $part); |
my $due_date=$self->parmval("duedate", $part); |
my $due_date=$self->parmval("duedate", $part); |
Line 4124 sub duedate {
|
Line 4115 sub duedate {
|
} else { |
} else { |
$date = $due_date; |
$date = $due_date; |
} |
} |
$self->{DUEDATE_CACHE}->{$part} = $date; |
|
return $date; |
return $date; |
} |
} |
sub handgrade { |
sub handgrade { |
Line 4186 sub weight {
|
Line 4176 sub weight {
|
my $self = shift; my $part = shift; |
my $self = shift; my $part = shift; |
if (!defined($part)) { $part = '0'; } |
if (!defined($part)) { $part = '0'; } |
my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight', |
my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight', |
$self->symb(), $env{'user.domain'}, |
$self->symb(), $self->{DOMAIN}, |
$env{'user.name'}, |
$self->{USERNAME}, |
$env{'request.course.sec'}); |
$env{'request.course.sec'}); |
return $weight; |
return $weight; |
} |
} |
Line 4215 sub getReturnHash {
|
Line 4205 sub getReturnHash {
|
my $self = shift; |
my $self = shift; |
|
|
if (!defined($self->{RETURN_HASH})) { |
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; |
$self->{RETURN_HASH} = \%tmpHash; |
} |
} |
} |
} |
Line 5204 sub completable {
|
Line 5194 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 ($self->getCompletionStatus($part) == ATTEMPTED() || |
if ($self->getCompletionStatus($part) == ATTEMPTED() || |
$self->getCompletionStatus($part) == CREDIT_ATTEMPTED() || |
$self->getCompletionStatus($part) == CREDIT_ATTEMPTED() || |
$status == ANSWER_SUBMITTED() ) { |
$status == ANSWER_SUBMITTED() ) { |
# did this part already, as well as we can |
# did this part already, as well as we can |
next; |
next; |
} |
} |