[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /homework lonhomework.pm
raeburn
raeburn at source.lon-capa.org
Sat Aug 6 19:23:18 EDT 2016
raeburn Sat Aug 6 23:23:18 2016 EDT
Modified files: (Branch: version_2_11_X)
/loncom/homework lonhomework.pm
Log:
- For 2.11
- Backport 1.363
Index: loncom/homework/lonhomework.pm
diff -u loncom/homework/lonhomework.pm:1.344.2.2 loncom/homework/lonhomework.pm:1.344.2.3
--- loncom/homework/lonhomework.pm:1.344.2.2 Mon Apr 20 01:22:58 2015
+++ loncom/homework/lonhomework.pm Sat Aug 6 23:23:18 2016
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Homework handler
#
-# $Id: lonhomework.pm,v 1.344.2.2 2015/04/20 01:22:58 raeburn 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 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 @@
$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 @@
$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 @@
&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'};
+ }
+ }
}
}
}
More information about the LON-CAPA-cvs
mailing list