--- loncom/homework/grades.pm 2024/12/14 17:47:39 1.806 +++ loncom/homework/grades.pm 2025/06/28 14:35:00 1.811 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.806 2024/12/14 17:47:39 raeburn Exp $ +# $Id: grades.pm,v 1.811 2025/06/28 14:35:00 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -881,14 +881,20 @@ sub jscriptNform { -# Given the score (as a number [0-1] and the weight) what is the final -# point value? This function will round to the nearest tenth, third, -# or quarter if one of those is within the tolerance of .00001. +# Given the score (as a number [0-1], the weight, and a posible +# reduction for submission between duedate and overduedate) +# what is the final point value? This function will round to +# the nearest tenth, third, or quarter if one of those is +# within the tolerance of .00001. sub compute_points { - my ($score, $weight) = @_; + my ($score, $weight, $latefrac) = @_; my $tolerance = .00001; my $points = $score * $weight; + if (($latefrac ne '') && + ($latefrac < 1) && ($latefrac >= 0)) { + $points = $points * $latefrac; + } # Check for nearness to 1/x. my $check_for_nearness = sub { @@ -1414,7 +1420,7 @@ sub do_passback { } $value=~s/\&$//; &Apache::lonnet::courselog(&escape($linkuri).':'.$uname.':'.$udom.':EXPORT:'.$value); - &Apache::lonnet::cstore({'score' => $score},$chosen,$namespace,$udom,$uname,'',$pb{'ip'},1); + &Apache::lonnet::store_userdata({'score' => $score},$chosen,$namespace,$udom,$uname,$pb{'ip'}); $ctr++; if ($ctr%2 ==1) { $outcome .= &Apache::loncommon::start_data_table_row(); @@ -1881,7 +1887,7 @@ sub process_passbacks { } $value=~s/\&$//; &Apache::lonnet::courselog(&escape($pb{'linkuri'}).':'.$uname.':'.$udom.':EXPORT:'.$value); - &Apache::lonnet::cstore({'score' => $score},$launcher,$namespace,$udom,$uname,'',$pb{'ip'},1); + &Apache::lonnet::store_userdata({'score' => $score},$launcher,$namespace,$udom,$uname,$pb{'ip'}); } else { $no_passback = 1; } @@ -2951,7 +2957,8 @@ sub gradeBox { : ''.&mt('problem weight assigned by computer').''; $wgt = ($wgt > 0 ? $wgt : '1'); my $score = ($$record{'resource.'.$partid.'.awarded'} eq '' ? - '' : &compute_points($$record{'resource.'.$partid.'.awarded'},$wgt)); + '' : &compute_points($$record{'resource.'.$partid.'.awarded'},$wgt, + $$record{'resource.'.$partid.'.latefrac'})); my $data_WGT=''."\n"; my $display_part= &get_display_part($partid,$symb); my %last_resets = &get_last_resets($symb,$env{'request.course.id'}, @@ -4463,7 +4470,8 @@ sub processHandGrade { #---- Save the score and award for each student, if changed sub saveHandGrade { - my ($request,$symb,$stuname,$domain,$newflg,$submitter,$part,$queueable,$needpb,$skip_passback,$pbsave) = @_; + my ($request,$symb,$stuname,$domain,$newflg,$submitter, + $part,$queueable,$needpb,$skip_passback,$pbsave) = @_; my @version_parts; my $usec = &Apache::lonnet::getsection($domain,$stuname, $env{'request.course.id'}); @@ -4471,7 +4479,7 @@ sub saveHandGrade { my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$domain,$stuname); my @parts_graded; my %newrecord = (); - my ($pts,$wgt,$totchg,$sendupdate) = ('','',0,0); + my ($pts,$wgt,$totchg,$sendupdate,$poss_pb) = ('','',0,0,0); my %aggregate = (); my $aggregateflag = 0; if ($env{'form.HIDE'.$newflg}) { @@ -4479,13 +4487,19 @@ sub saveHandGrade { my $numchgs = &makehidden($version,$parts,\%record,$symb,$domain,$stuname,1); $totchg += $numchgs; } + if ((ref($needpb) eq 'HASH') && (keys(%{$needpb}))) { + $poss_pb = 1; + } my (%weights,%awardeds,%excuseds); my @parts = split(/:/,$env{'form.partlist'.$newflg}); foreach my $new_part (@parts) { #collaborator ($submitter may vary for different parts) if ($submitter && $new_part ne $part) { next; } my $dropMenu = $env{'form.GD_SEL'.$newflg.'_'.$new_part}; - if ($env{'form.WGT'.$newflg.'_'.$new_part} eq '') { + if ($poss_pb) { + $weights{$symb}{$new_part} = + &Apache::lonnet::EXT('resource.'.$new_part.'.weight',$symb,$domain,$stuname); + } elsif ($env{'form.WGT'.$newflg.'_'.$new_part} eq '') { $weights{$symb}{$new_part} = 1; } else { $weights{$symb}{$new_part} = $env{'form.WGT'.$newflg.'_'.$new_part}; @@ -4596,12 +4610,9 @@ sub saveHandGrade { &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, $cdom,$cnum); } - if (($sendupdate || $totchg) && (!$submitter)) { - if ((ref($needpb) eq 'HASH') && - (keys(%{$needpb}))) { - &process_passbacks('handgrade',[$symb],$cdom,$cnum,$domain,$stuname,$usec,\%weights, - \%awardeds,\%excuseds,$needpb,$skip_passback,$pbsave); - } + if (($sendupdate || $totchg) && (!$submitter) && ($poss_pb)) { + &process_passbacks('handgrade',[$symb],$cdom,$cnum,$domain,$stuname,$usec,\%weights, + \%awardeds,\%excuseds,$needpb,$skip_passback,$pbsave); } return ('',$pts,$wgt,$totchg,$sendupdate); } @@ -5415,6 +5426,7 @@ sub viewstudentgrade { foreach my $apart (@$parts) { my ($part,$type) = &split_part_type($apart); my $score=$record{"resource.$part.$type"}; + my $latefrac=$record{"resource.$part.latefrac"}; $result.='