--- loncom/homework/lonhomework.pm 2013/08/21 16:07:49 1.340
+++ loncom/homework/lonhomework.pm 2016/08/06 23:23:18 1.344.2.3
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Homework handler
#
-# $Id: lonhomework.pm,v 1.340 2013/08/21 16:07:49 bisitz Exp $
+# $Id: lonhomework.pm,v 1.344.2.3 2016/08/06 23:23:18 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -208,7 +208,7 @@ sub proctor_checked_in {
}
sub check_slot_access {
- my ($id,$type)=@_;
+ my ($id,$type,$partlist)=@_;
# does it pass normal muster
my ($status,$datemsg)=&check_access($id);
@@ -271,7 +271,7 @@ sub check_slot_access {
$slotstatus=$status;
}
- my ($is_correct,$got_grade,$checkedin);
+ my ($is_correct,$got_grade,$checkinslot,$checkedin,$consumed_uniq);
if ($type eq 'Task') {
my $version=$Apache::lonhomework::history{'resource.0.version'};
$got_grade =
@@ -283,10 +283,56 @@ sub check_slot_access {
$checkedin =
$Apache::lonhomework::history{"resource.$version.0.checkedin"};
} elsif ($type eq 'problem') {
- $got_grade = 1;
$checkedin = $Apache::lonhomework::history{"resource.0.checkedin"};
- $is_correct =
- ($Apache::lonhomework::history{"resource.0.solved"} =~/^correct_/);
+ }
+ if ($checkedin) {
+ $checkinslot = $Apache::lonhomework::history{"$checkin.slot"};
+ my %slot=&Apache::lonnet::get_slot($checkinslot);
+ $consumed_uniq = $slot{'uniqueperiod'};
+ }
+ if ($type eq 'problem') {
+ if ((ref($partlist) eq 'ARRAY') && (@{$partlist} > 0)) {
+ my ($numcorrect,$numgraded) = (0,0);
+ foreach my $part (@{$partlist}) {
+ my $currtries = $Apache::lonhomework::history{"resource.$part.tries"};
+ my $maxtries = &Apache::lonnet::EXT("resource.$part.maxtries",$symb);
+ my $probstatus = &Apache::structuretags::get_problem_status($part);
+ my $earlyout;
+ unless (($probstatus eq 'no') ||
+ ($probstatus eq 'no_feedback_ever')) {
+ if ($Apache::lonhomework::history{"resource.$part.solved"} =~/^correct_/) {
+ $numcorrect ++;
+ } else {
+ $earlyout = 1;
+ }
+ }
+ if (($currtries == $maxtries) || ($is_correct)) {
+ $earlyout = 1;
+ } else {
+ $numgraded ++;
+ }
+ last if ($earlyout);
+ }
+ my $numparts = scalar(@{$partlist});
+ if ($numparts == $numcorrect) {
+ $is_correct = 1;
+ }
+ if ($numparts == $numgraded) {
+ $got_grade = 1;
+ }
+ } else {
+ my $currtries = $Apache::lonhomework::history{"resource.0.tries"};
+ my $maxtries = &Apache::lonnet::EXT("resource.0.maxtries",$symb);
+ my $probstatus = &Apache::structuretags::get_problem_status('0');
+ unless (($probstatus eq 'no') ||
+ ($probstatus eq 'no_feedback_ever')) {
+ $is_correct =
+ ($Apache::lonhomework::history{"resource.0.solved"} =~/^correct_/);
+ }
+ unless (($currtries == $maxtries) || ($is_correct)) {
+ $got_grade = 1;
+ }
+ }
}
&Apache::lonxml::debug(" slot is $slotstatus checkedin ($checkedin) got_grade ($got_grade) is_correct ($is_correct)");
@@ -317,15 +363,57 @@ sub check_slot_access {
&Apache::loncommon::get_future_slots($cnum,$cdom,$now,$symb);
if ((ref($reservable_now_order) eq 'ARRAY') && (ref($reservable_now) eq 'HASH')) {
if (@{$reservable_now_order} > 0) {
- $slotstatus = 'RESERVABLE';
- $datemsg = $reservable_now->{$reservable_now_order->[-1]}{'endreserve'};
+ if ((!$checkedin) || (ref($consumed_uniq) ne 'ARRAY')) {
+ $slotstatus = 'RESERVABLE';
+ $datemsg = $reservable_now->{$reservable_now_order->[-1]}{'endreserve'};
+ } else {
+ my ($uniqstart,$uniqend,$useslot);
+ if (ref($consumed_uniq) eq 'ARRAY') {
+ ($uniqstart,$uniqend)=@{$consumed_uniq};
+ }
+ foreach my $slot (reverse(@{$reservable_now_order})) {
+ if ($reservable_now->{$slot}{'uniqueperiod'} =~ /^(\d+)\,(\d+)$/) {
+ my ($new_uniq_start,$new_uniq_end) = ($1,$2);
+ next if (!
+ ($uniqstart < $new_uniq_start && $uniqend < $new_uniq_start) ||
+ ($uniqstart > $new_uniq_end && $uniqend > $new_uniq_end ));
+ }
+ $useslot = $slot;
+ last;
+ }
+ if ($useslot) {
+ $slotstatus = 'RESERVABLE';
+ $datemsg = $reservable_now->{$useslot}{'endreserve'};
+ }
+ }
}
}
unless ($slotstatus eq 'RESERVABLE') {
if ((ref($reservable_future_order) eq 'ARRAY') && (ref($reservable_future) eq 'HASH')) {
if (@{$reservable_future_order} > 0) {
- $slotstatus = 'RESERVABLE_LATER';
- $datemsg = $reservable_future->{$reservable_future_order->[0]}{'startreserve'};
+ if ((!$checkedin) || (ref($consumed_uniq) ne 'ARRAY')) {
+ $slotstatus = 'RESERVABLE_LATER';
+ $datemsg = $reservable_future->{$reservable_future_order->[0]}{'startreserve'};
+ } else {
+ my ($uniqstart,$uniqend,$useslot);
+ if (ref($consumed_uniq) eq 'ARRAY') {
+ ($uniqstart,$uniqend)=@{$consumed_uniq};
+ }
+ foreach my $slot (@{$reservable_future_order}) {
+ if ($reservable_future->{$slot}{'uniqueperiod'} =~ /^(\d+),(\d+)$/) {
+ my ($new_uniq_start,$new_uniq_end) = ($1,$2);
+ next if (!
+ ($uniqstart < $new_uniq_start && $uniqend < $new_uniq_start) ||
+ ($uniqstart > $new_uniq_end && $uniqend > $new_uniq_end ));
+ }
+ $useslot = $slot;
+ last;
+ }
+ if ($useslot) {
+ $slotstatus = 'RESERVABLE_LATER';
+ $datemsg = $reservable_future->{$useslot}{'startreserve'};
+ }
+ }
}
}
}
@@ -451,13 +539,14 @@ sub check_access {
$datemsg=$date;
} elsif ($type eq 'opendate') {
$status='CLOSED';
- $datemsg = &mt("will open on")." $date";
+ $datemsg = &mt('will open on [_1]',$date);
} elsif ($type eq 'duedate') {
$status='CAN_ANSWER';
- $datemsg = &mt("is due at")." $date";
+ $datemsg = &mt('is due at [_1]',$date);
} elsif ($type eq 'answerdate') {
$status='CLOSED';
- $datemsg = &mt("was due on")." $lastdate".&mt(", and answers will be available on")." $date";
+ $datemsg = &mt('was due on [_1], and answers will be available on [_2]',
+ $lastdate,$date);
}
}
if ($status eq 'CAN_ANSWER' ||
@@ -468,7 +557,6 @@ sub check_access {
if ( $tries eq '' ) { $tries = '0'; }
if ( $maxtries eq '' &&
$env{'request.state'} ne 'construct') { $maxtries = '2'; }
- $Apache::lonhomework::results{'resource.'.$id.'.maxtries'}=$maxtries;
if ($maxtries && $tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }
# if (correct and show prob status) or excused then CANNOT_ANSWER
if ( ($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/)
@@ -540,7 +628,7 @@ sub due_date {
} else {
$date = $due_date;
}
- return $date
+ return $date;
}
sub seconds_to_human_length {
@@ -589,7 +677,7 @@ sub showarray {
sub showhashsubset {
my ($hash,$keyre) = @_;
my $resultkey;
- foreach $resultkey (sort keys %$hash) {
+ foreach $resultkey (sort(keys(%$hash))) {
if ($resultkey !~ /$keyre/) { next; }
if (ref($$hash{$resultkey}) eq 'ARRAY' ) {
&Apache::lonxml::debug("$resultkey ---- ".
@@ -1130,9 +1218,10 @@ sub get_template_list {
'/templates/*.'.$glob_extension);
@files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title')),
(&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')),
- &mt(&Apache::lonnet::metadata($_, 'help'))]} (@files);
+ &Apache::lonnet::metadata($_, 'help')]} (@files);
@files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files);
my ($midpoint,$seconddiv,$numfiles);
+ my @noexamplelink = ('blank.problem','blank.library','script.library');
$numfiles = 0;
foreach my $file (@files) {
next if ($file->[1] !~ /\S/);
@@ -1171,11 +1260,16 @@ sub get_template_list {
if ($file->[3]) {
$result.=&Apache::loncommon::help_open_topic($file->[3]);
}
+ # Provide example link
my $filename=$file->[0];
$filename=~s{^\Q$londocroot\E}{};
- $result.=' '
- .&Apache::loncommon::modal_link($filename.'?inhibitmenu=yes',&mt('Example'),600,420,'sample')
- .'
'."\n";
+ if (!(grep($filename =~ /\Q$_\E$/,@noexamplelink))) {
+ $result .= ' '
+ .&Apache::loncommon::modal_link(
+ $filename.'?inhibitmenu=yes',&mt('Example'),600,420,'sample')
+ .'';
+ }
+ $result .= '
'."\n";
$count ++;
}
if ($numfiles > 0) {
@@ -1271,7 +1365,7 @@ sub handler {
my $file=&Apache::lonnet::filelocation("",$request->uri);
#check if we know where we are
- if ($env{'request.course.fn'} && !&Apache::lonnet::symbread()) {
+ if ($env{'request.course.fn'} && !&Apache::lonnet::symbread('','',1,1)) {
# if we are browsing we might not be able to know where we are
if ($Apache::lonhomework::browse ne 'F' &&
$env{'request.state'} ne "construct") {