version 1.798, 2024/12/09 02:46:01
|
version 1.804, 2024/12/10 18:38:10
|
Line 1458 sub do_passback {
|
Line 1458 sub do_passback {
|
'format' => $scoretype, |
'format' => $scoretype, |
'scope' => $scope, |
'scope' => $scope, |
'clientip' => $pb{'clientip'}, |
'clientip' => $pb{'clientip'}, |
'linkprot' => $linkprotector, |
'linkprot' => $linkprotector.':'.$linkuri, |
'total' => $total, |
'total' => $total, |
'possible' => $possible, |
'possible' => $possible, |
'score' => $score, |
'score' => $score, |
Line 1726 sub passbacks_for_symb {
|
Line 1726 sub passbacks_for_symb {
|
} |
} |
|
|
sub process_passbacks { |
sub process_passbacks { |
my ($context,$symbs,$cdom,$cnum,$udom,$uname,$weights,$awardeds,$excuseds,$needpb, |
my ($context,$symbs,$cdom,$cnum,$udom,$uname,$usec,$weights,$awardeds,$excuseds,$needpb, |
$skip_passback,$pbsave,$pbids) = @_; |
$skip_passback,$pbsave,$pbids) = @_; |
if ((ref($needpb) eq 'HASH') && (ref($skip_passback) eq 'HASH') && (ref($pbsave) eq 'HASH')) { |
if ((ref($needpb) eq 'HASH') && (ref($skip_passback) eq 'HASH') && (ref($pbsave) eq 'HASH')) { |
my (%weight,%awarded,%excused); |
my (%weight,%awarded,%excused); |
Line 1827 sub process_passbacks {
|
Line 1827 sub process_passbacks {
|
'uname' => $uname, |
'uname' => $uname, |
'udom' => $udom, |
'udom' => $udom, |
'uhome' => $uhome, |
'uhome' => $uhome, |
|
'usec' => $usec, |
'pbid' => $pbid, |
'pbid' => $pbid, |
'pburl' => $pburl, |
'pburl' => $pburl, |
'pbtype' => $pb{'type'}, |
'pbtype' => $pb{'type'}, |
Line 1836 sub process_passbacks {
|
Line 1837 sub process_passbacks {
|
'format' => $pb{'scoretype'}, |
'format' => $pb{'scoretype'}, |
'scope' => $pb{'scope'}, |
'scope' => $pb{'scope'}, |
'clientip' => $pb{'clientip'}, |
'clientip' => $pb{'clientip'}, |
'linkprot' => $pb{'linkprotector'}, |
'linkprot' => $pb{'linkprotector'}.':'.$pb{'linkuri'}, |
'total_s' => \%total_by_symb, |
'total_s' => \%total_by_symb, |
'possible_s' => \%possible_by_symb, |
'possible_s' => \%possible_by_symb, |
}; |
}; |
push(@Apache::lonhomework::ltipassback,$ltigrade); |
push(@Apache::grades::ltipassback,$ltigrade); |
next; |
next; |
} |
} |
my ($total,$possible); |
my ($total,$possible); |
Line 1908 sub process_passbacks {
|
Line 1909 sub process_passbacks {
|
'format' => $pb{'scoretype'}, |
'format' => $pb{'scoretype'}, |
'scope' => $pb{'scope'}, |
'scope' => $pb{'scope'}, |
'clientip' => $pb{'clientip'}, |
'clientip' => $pb{'clientip'}, |
'linkprot' => $pb{'linkprotector'}, |
'linkprot' => $pb{'linkprotector'}.':'.$pb{'linkuri'}, |
'total' => $total, |
'total' => $total, |
'possible' => $possible, |
'possible' => $possible, |
'score' => $score, |
'score' => $score, |
Line 4240 sub processHandGrade {
|
Line 4241 sub processHandGrade {
|
foreach my $collabstr (@collabstrs) { |
foreach my $collabstr (@collabstrs) { |
my ($part,@collaborators) = split(/:/,$collabstr); |
my ($part,@collaborators) = split(/:/,$collabstr); |
foreach my $collaborator (@collaborators) { |
foreach my $collaborator (@collaborators) { |
my ($errorflag,$pts,$wgt) = |
my ($errorflag,$pts,$wgt,$numchg,$numupdate) = |
&saveHandGrade($request,$symb,$collaborator,$udom,$ctr, |
&saveHandGrade($request,$symb,$collaborator,$udom,$ctr, |
$env{'form.unamedom'.$ctr},$part,\%queueable,\%needpb,\%skip_passback,%pbsave); |
$env{'form.unamedom'.$ctr},$part,\%queueable); |
if ($errorflag eq 'not_allowed') { |
if ($errorflag eq 'not_allowed') { |
$request->print("<span class=\"LC_error\">".&mt('Not allowed to modify grades for [_1]',"$collaborator:$udom")."</span>"); |
$request->print("<span class=\"LC_error\">".&mt('Not allowed to modify grades for [_1]',"$collaborator:$udom")."</span>"); |
next; |
next; |
} else { |
} else { |
$pbcollab{$collaborator}{$part} = [$pts,$wgt]; |
if ($numchg || $numupdate) { |
|
$pbcollab{$collaborator}{$part} = [$pts,$wgt]; |
|
} |
if ($message ne '') { |
if ($message ne '') { |
my ($baseurl,$showsymb) = |
my ($baseurl,$showsymb) = |
&get_feedurl_and_symb($symb,$collaborator, |
&get_feedurl_and_symb($symb,$collaborator, |
$udom); |
$udom); |
if ($env{'form.withgrades'.$ctr}) { |
if ($env{'form.withgrades'.$ctr}) { |
$messagetail = " for <a href=\"". |
$messagetail = " for <a href=\"". |
$baseurl."?symb=$showsymb\">$restitle</a>"; |
$baseurl."?symb=$showsymb\">$restitle</a>"; |
|
} |
|
$msgstatus = |
|
&Apache::lonmsg::user_normal_msg($collaborator,$udom,$subject,$message.$messagetail,undef,$baseurl,undef,undef,undef,$showsymb,$restitle); |
} |
} |
$msgstatus = |
} |
&Apache::lonmsg::user_normal_msg($collaborator,$udom,$subject,$message.$messagetail,undef,$baseurl,undef,undef,undef,$showsymb,$restitle); |
|
} |
|
} |
} |
} |
} |
} |
} |
$ctr++; |
$ctr++; |
} |
} |
if ((keys(%pbcollab)) && (keys(%needpb))) { |
if ((keys(%pbcollab)) && (keys(%needpb))) { |
# FIXME passback scores for collaborators |
foreach my $user (keys(%pbcollab)) { |
|
my ($clbuname,$clbudom) = split(/:/,$user); |
|
my $clbusec = &Apache::lonnet::getsection($clbudom,$clbuname,$cdom.'_'.$cnum); |
|
if (ref($pbcollab{$user}) eq 'HASH') { |
|
my @clparts = keys(%{$pbcollab{$user}}); |
|
if (@clparts) { |
|
my $navmap = Apache::lonnavmaps::navmap->new($clbuname,$clbudom,$clbusec); |
|
if (ref($navmap)) { |
|
my $res = $navmap->getBySymb($symb); |
|
if (ref($res)) { |
|
my $partlist = $res->parts(); |
|
if (ref($partlist) eq 'ARRAY') { |
|
my (%weights,%awardeds,%excuseds); |
|
foreach my $part (@{$partlist}) { |
|
if ($res->status($part) eq $res->EXCUSED) { |
|
$excuseds{$symb}{$part} = 1; |
|
} else { |
|
$excuseds{$symb}{$part} = ''; |
|
} |
|
if ((exists($pbcollab{$user}{$part})) && (ref($pbcollab{$user}{$part}) eq 'ARRAY')) { |
|
my $pts = $pbcollab{$user}{$part}[0]; |
|
my $wt = $pbcollab{$user}{$part}[1]; |
|
if ($wt) { |
|
$awardeds{$symb}{$part} = $pts/$wt; |
|
$weights{$symb}{$part} = $wt; |
|
} else { |
|
$awardeds{$symb}{$part} = 0; |
|
$weights{$symb}{$part} = 0; |
|
} |
|
} else { |
|
$awardeds{$symb}{$part} = $res->awarded($part); |
|
$weights{$symb}{$part} = $res->weight($part); |
|
} |
|
} |
|
&process_passbacks('handgrade',[$symb],$cdom,$cnum,$clbudom,$clbuname,$clbusec,\%weights, |
|
\%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
} |
} |
} |
} |
|
|
Line 4428 sub saveHandGrade {
|
Line 4473 sub saveHandGrade {
|
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$domain,$stuname); |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$domain,$stuname); |
my @parts_graded; |
my @parts_graded; |
my %newrecord = (); |
my %newrecord = (); |
my ($pts,$wgt,$totchg) = ('','',0); |
my ($pts,$wgt,$totchg,$sendupdate) = ('','',0,0); |
my %aggregate = (); |
my %aggregate = (); |
my $aggregateflag = 0; |
my $aggregateflag = 0; |
my $sendupdate; |
|
if ($env{'form.HIDE'.$newflg}) { |
if ($env{'form.HIDE'.$newflg}) { |
my ($version,$parts) = split(/:/,$env{'form.HIDE'.$newflg},2); |
my ($version,$parts) = split(/:/,$env{'form.HIDE'.$newflg},2); |
my $numchgs = &makehidden($version,$parts,\%record,$symb,$domain,$stuname,1); |
my $numchgs = &makehidden($version,$parts,\%record,$symb,$domain,$stuname,1); |
$totchg += $numchgs; |
$totchg += $numchgs; |
if ($numchgs) { |
|
$sendupdate = 1; |
|
} |
|
} |
} |
my (%weights,%awardeds,%excuseds); |
my (%weights,%awardeds,%excuseds); |
my @parts = split(/:/,$env{'form.partlist'.$newflg}); |
my @parts = split(/:/,$env{'form.partlist'.$newflg}); |
foreach my $new_part (@parts) { |
foreach my $new_part (@parts) { |
#collaborator ($submi may vary for different parts |
#collaborator ($submitter may vary for different parts) |
if ($submitter && $new_part ne $part) { next; } |
if ($submitter && $new_part ne $part) { next; } |
my $dropMenu = $env{'form.GD_SEL'.$newflg.'_'.$new_part}; |
my $dropMenu = $env{'form.GD_SEL'.$newflg.'_'.$new_part}; |
if ($env{'form.WGT'.$newflg.'_'.$new_part} eq '') { |
if ($env{'form.WGT'.$newflg.'_'.$new_part} eq '') { |
Line 4460 sub saveHandGrade {
|
Line 4501 sub saveHandGrade {
|
$newrecord{'resource.'.$new_part.'.awarded'} = ''; |
$newrecord{'resource.'.$new_part.'.awarded'} = ''; |
} |
} |
$newrecord{'resource.'.$new_part.'.regrader'}="$env{'user.name'}:$env{'user.domain'}"; |
$newrecord{'resource.'.$new_part.'.regrader'}="$env{'user.name'}:$env{'user.domain'}"; |
$sendupdate = 1; |
$sendupdate ++; |
} |
} |
} elsif ($dropMenu eq 'reset status' |
} elsif ($dropMenu eq 'reset status' |
&& exists($record{'resource.'.$new_part.'.solved'})) { #don't bother if no old records -> no attempts |
&& exists($record{'resource.'.$new_part.'.solved'})) { #don't bother if no old records -> no attempts |
Line 4484 sub saveHandGrade {
|
Line 4525 sub saveHandGrade {
|
&decrement_aggs($symb,$new_part,\%aggregate,$aggtries,$totaltries,$solvedstatus); |
&decrement_aggs($symb,$new_part,\%aggregate,$aggtries,$totaltries,$solvedstatus); |
$aggregateflag = 1; |
$aggregateflag = 1; |
} |
} |
$sendupdate = 1; |
$sendupdate ++; |
$excuseds{$symb}{$new_part} = ''; |
$excuseds{$symb}{$new_part} = ''; |
$awardeds{$symb}{$new_part} = ''; |
$awardeds{$symb}{$new_part} = ''; |
} elsif ($dropMenu eq '') { |
} elsif ($dropMenu eq '') { |
Line 4505 sub saveHandGrade {
|
Line 4546 sub saveHandGrade {
|
next; |
next; |
} else { |
} else { |
push(@parts_graded,$new_part); |
push(@parts_graded,$new_part); |
$sendupdate = 1; |
$sendupdate ++; |
} |
} |
if ($record{'resource.'.$new_part.'.awarded'} ne $partial) { |
if ($record{'resource.'.$new_part.'.awarded'} ne $partial) { |
$newrecord{'resource.'.$new_part.'.awarded'} = $partial; |
$newrecord{'resource.'.$new_part.'.awarded'} = $partial; |
Line 4557 sub saveHandGrade {
|
Line 4598 sub saveHandGrade {
|
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, |
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, |
$cdom,$cnum); |
$cdom,$cnum); |
} |
} |
if (($sendupdate) && (!$submitter)) { |
if (($sendupdate || $totchg) && (!$submitter)) { |
if ((ref($needpb) eq 'HASH') && |
if ((ref($needpb) eq 'HASH') && |
(keys(%{$needpb}))) { |
(keys(%{$needpb}))) { |
&process_passbacks('handgrade',[$symb],$cdom,$cnum,$domain,$stuname,\%weights, |
&process_passbacks('handgrade',[$symb],$cdom,$cnum,$domain,$stuname,$usec,\%weights, |
\%awardeds,\%excuseds,$needpb,$skip_passback,$pbsave); |
\%awardeds,\%excuseds,$needpb,$skip_passback,$pbsave); |
} |
} |
} |
} |
return ('',$pts,$wgt,$totchg); |
return ('',$pts,$wgt,$totchg,$sendupdate); |
} |
} |
|
|
sub makehidden { |
sub makehidden { |
Line 5649 sub editgrades {
|
Line 5690 sub editgrades {
|
$updateCtr++; |
$updateCtr++; |
if (keys(%needpb)) { |
if (keys(%needpb)) { |
$weights{$symb} = \%weight; |
$weights{$symb} = \%weight; |
&process_passbacks('editgrades',[$symb],$cdom,$cnum,$udom,$uname,\%weights, |
&process_passbacks('editgrades',[$symb],$cdom,$cnum,$udom,$uname,$usec,\%weights, |
\%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave); |
\%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave); |
} |
} |
} else { |
} else { |
Line 6178 sub csvuploadassign {
|
Line 6219 sub csvuploadassign {
|
$request->print('.'); |
$request->print('.'); |
# Remove from grading queue |
# Remove from grading queue |
&Apache::bridgetask::remove_from_queue('gradingqueue',$symb,$cdom,$cnum, |
&Apache::bridgetask::remove_from_queue('gradingqueue',$symb,$cdom,$cnum, |
$domain,$username); |
$domain,$username); |
$countdone++; |
$countdone++; |
if ($passback) { |
if ($passback) { |
my @parts_in_upload; |
my @parts_in_upload; |
Line 6200 sub csvuploadassign {
|
Line 6241 sub csvuploadassign {
|
$awardeds{$symb}{$part} = $record{"resource.$part.awarded"}; |
$awardeds{$symb}{$part} = $record{"resource.$part.awarded"}; |
} |
} |
} |
} |
&process_passbacks('csvupload',[$symb],$cdom,$cnum,$domain,$username,\%weights, |
&process_passbacks('csvupload',[$symb],$cdom,$cnum,$domain,$username,$usec,\%weights, |
\%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave); |
\%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave); |
} |
} |
} else { |
} else { |
Line 6951 sub updateGradeByPage {
|
Line 6992 sub updateGradeByPage {
|
$request->print($hidemsg.$grademsg.$studentTable); |
$request->print($hidemsg.$grademsg.$studentTable); |
|
|
if (@updates) { |
if (@updates) { |
undef(@Apache::lonhomework::ltipassback); |
|
my (@allsymbs,$mapsymb,@recurseup,%parentmapsymbs,%possmappb,%possrespb); |
my (@allsymbs,$mapsymb,@recurseup,%parentmapsymbs,%possmappb,%possrespb); |
@allsymbs = @updates; |
@allsymbs = @updates; |
if (ref($map)) { |
if (ref($map)) { |
Line 7009 sub updateGradeByPage {
|
Line 7049 sub updateGradeByPage {
|
} |
} |
} |
} |
my @symbs = keys(%uniqsymbs); |
my @symbs = keys(%uniqsymbs); |
&process_passbacks('updatebypage',\@symbs,$cdom,$cnum,$udom,$uname,\%weights, |
&process_passbacks('updatebypage',\@symbs,$cdom,$cnum,$udom,$uname,$usec,\%weights, |
\%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave,\%pbids); |
\%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave,\%pbids); |
if (@Apache::lonhomework::ltipassback) { |
if (@Apache::grades::ltipassback) { |
unless ($registered_cleanup) { |
unless ($registered_cleanup) { |
my $handlers = $request->get_handlers('PerlCleanupHandler'); |
my $handlers = $request->get_handlers('PerlCleanupHandler'); |
$request->set_handlers('PerlCleanupHandler' => |
$request->set_handlers('PerlCleanupHandler' => |
[\&Apache::lonhomework::do_ltipassback,@{$handlers}]); |
[\&Apache::grades::make_passback,@{$handlers}]); |
|
$registered_cleanup=1; |
} |
} |
} |
} |
} |
} |
Line 7023 sub updateGradeByPage {
|
Line 7064 sub updateGradeByPage {
|
return ''; |
return ''; |
} |
} |
|
|
|
sub make_passback { |
|
if (@Apache::grades::ltipassback) { |
|
my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; |
|
my $ip = &Apache::lonnet::get_host_ip($lonhost); |
|
foreach my $item (@Apache::grades::ltipassback) { |
|
&Apache::lonhomework::run_passback($item,$lonhost,$ip); |
|
} |
|
undef(@Apache::grades::ltipassback); |
|
} |
|
} |
|
|
#-------- end of section for handling grading by page/sequence --------- |
#-------- end of section for handling grading by page/sequence --------- |
# |
# |
#------------------------------------------------------------------- |
#------------------------------------------------------------------- |
Line 12539 sub assign_clicker_grades {
|
Line 12591 sub assign_clicker_grades {
|
if ($res_error) { |
if ($res_error) { |
return &navmap_errormsg(); |
return &navmap_errormsg(); |
} |
} |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my %needpb = &passbacks_for_symb($cdom,$cnum,$symb); |
|
my (%skip_passback,%pbsave); |
# FIXME: This should probably look for the first handgradeable part |
# FIXME: This should probably look for the first handgradeable part |
my $part=$$partlist[0]; |
my $part=$$partlist[0]; |
# Start screen output |
# Start screen output |
Line 12648 sub assign_clicker_grades {
|
Line 12704 sub assign_clicker_grades {
|
$result.="<br /><span class=\"LC_error\">Failed to save student $username:$domain. Message when trying to save was ($returncode)</span>"; |
$result.="<br /><span class=\"LC_error\">Failed to save student $username:$domain. Message when trying to save was ($returncode)</span>"; |
} else { |
} else { |
$storecount++; |
$storecount++; |
#FIXME Do passback for $user if required |
if (keys(%needpb)) { |
|
my (%weights,%awardeds,%excuseds); |
|
my $usec = &Apache::lonnet::getsection($domain,$username,$env{'request.course.id'}); |
|
$weights{$symb}{$part} = &Apache::lonnet::EXT("resource.$part.weight",$symb,$domain,$username,$usec); |
|
$awardeds{$symb}{$part} = $ave; |
|
$excuseds{$symb}{$part} = ''; |
|
&process_passbacks('clickergrade',[$symb],$cdom,$cnum,$domain,$username,$usec,\%weights, |
|
\%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave); |
|
} |
} |
} |
} |
} |
} |
} |
Line 12807 sub handler {
|
Line 12871 sub handler {
|
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands)); |
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands)); |
} |
} |
|
|
|
# -------------------------------------- Flag and buffer for registered cleanup |
|
$registered_cleanup=0; |
|
undef(@Apache::grades::ltipassback); |
|
|
# see what the symb is |
# see what the symb is |
|
|
my $symb=$env{'form.symb'}; |
my $symb=$env{'form.symb'}; |