[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