version 1.803, 2024/12/10 17:04:38
|
version 1.806, 2024/12/14 17:47:39
|
Line 1263 sub do_passback {
|
Line 1263 sub do_passback {
|
my $cdom = $env{"course.$env{'request.course.id'}.domain"}; |
my $cdom = $env{"course.$env{'request.course.id'}.domain"}; |
my $cnum = $env{"course.$env{'request.course.id'}.num"}; |
my $cnum = $env{"course.$env{'request.course.id'}.num"}; |
my $crstype = &Apache::loncommon::course_type(); |
my $crstype = &Apache::loncommon::course_type(); |
my ($launcher,$appname,$setter,$linkuri,$linkprotector,$scope,$chosen); |
my ($launchsymb,$appname,$setter,$linkuri,$linkprotector,$scope,$chosen); |
if ($env{'form.passback'} ne '') { |
if ($env{'form.passback'} ne '') { |
$chosen = &unescape($env{'form.passback'}); |
$chosen = &unescape($env{'form.passback'}); |
($linkuri,$linkprotector,$scope) = split("\0",$chosen); |
($linkuri,$linkprotector,$scope) = split("\0",$chosen); |
($launcher,$appname,$setter) = &get_passback_launcher($cdom,$cnum,$chosen); |
($launchsymb,$appname,$setter) = &get_passback_launcher($cdom,$cnum,$chosen); |
} |
} |
if ($launcher ne '') { |
if ($launchsymb ne '') { |
$request->print(&launcher_info_box($launcher,$appname,$setter,$linkuri,$scope)); |
$request->print(&launcher_info_box($launchsymb,$appname,$setter,$linkuri,$scope)); |
} |
} |
my $error; |
my $error; |
if ($perm{'mgr'}) { |
if ($perm{'mgr'}) { |
if ($launcher ne '') { |
if ($launchsymb ne '') { |
my @poss_students = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
my @poss_students = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
if (@poss_students) { |
if (@poss_students) { |
my %possibles; |
my %possibles; |
Line 1312 sub do_passback {
|
Line 1312 sub do_passback {
|
if ($lti_in_use->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) { |
if ($lti_in_use->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) { |
$scoretype = $1; |
$scoretype = $1; |
} |
} |
my $pbsymb = &Apache::loncommon::symb_from_tinyurl($linkuri,$cnum,$cdom); |
|
my $pbmap; |
my $pbmap; |
if ($pbsymb =~ /\.(page|sequence)$/) { |
if ($launchsymb =~ /\.(page|sequence)$/) { |
$pbmap = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($pbsymb))[2]); |
$pbmap = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($launchsymb))[2]); |
} else { |
} else { |
$pbmap = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($pbsymb))[0]); |
$pbmap = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($launchsymb))[0]); |
} |
} |
$pbmap = &Apache::lonnet::clutter($pbmap); |
$pbmap = &Apache::lonnet::clutter($pbmap); |
my $pbscope; |
my $pbscope; |
Line 1332 sub do_passback {
|
Line 1331 sub do_passback {
|
my $numstudents = scalar(keys(%tosend)); |
my $numstudents = scalar(keys(%tosend)); |
my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($request,$numstudents); |
my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($request,$numstudents); |
my $outcome = &Apache::loncommon::start_data_table(). |
my $outcome = &Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(); |
&Apache::loncommon::start_data_table_header_row(); |
my $loop = 0; |
my $loop = 0; |
while ($loop < 2) { |
while ($loop < 2) { |
$outcome .= '<th>'.&mt('No.').'</th>'. |
$outcome .= '<th>'.&mt('No.').'</th>'. |
'<th>'.&nameUserString('header').' '.&mt('Section/Group').'</th>'. |
'<th>'.&nameUserString('header').' '.&mt('Section/Group').'</th>'. |
'<th>'.&mt('Score').'</th>'; |
'<th>'.&mt('Score').'</th>'; |
$loop++; |
$loop++; |
} |
} |
$outcome .= &Apache::loncommon::end_data_table_header_row()."\n"; |
$outcome .= &Apache::loncommon::end_data_table_header_row()."\n"; |
my $ctr=0; |
my $ctr=0; |
Line 1365 sub do_passback {
|
Line 1364 sub do_passback {
|
$possible = 0; |
$possible = 0; |
my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom); |
my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom); |
if (ref($navmap)) { |
if (ref($navmap)) { |
my $res = $navmap->getBySymb($pbsymb); |
my $res = $navmap->getBySymb($launchsymb); |
if (ref($res)) { |
if (ref($res)) { |
my $partlist = $res->parts(); |
my $partlist = $res->parts(); |
if (ref($partlist) eq 'ARRAY') { |
if (ref($partlist) eq 'ARRAY') { |
my %record = &Apache::lonnet::restore($pbsymb,$env{'request.course.id'},$udom,$uname); |
my %record = &Apache::lonnet::restore($launchsymb,$env{'request.course.id'},$udom,$uname); |
foreach my $part (@{$partlist}) { |
foreach my $part (@{$partlist}) { |
next if ($record{"resource.$part.solved"} =~/^excused/); |
next if ($record{"resource.$part.solved"} =~/^excused/); |
my $weight = &Apache::lonnet::EXT("resource.$part.weight",$pbsymb,$udom,$uname,$usec); |
my $weight = &Apache::lonnet::EXT("resource.$part.weight",$launchsymb,$udom,$uname,$usec); |
$possible += $weight; |
$possible += $weight; |
if (($record{'version'}) && (exists($record{"resource.$part.awarded"}))) { |
if (($record{'version'}) && (exists($record{"resource.$part.awarded"}))) { |
my $awarded = $record{"resource.$part.awarded"}; |
my $awarded = $record{"resource.$part.awarded"}; |
Line 1386 sub do_passback {
|
Line 1385 sub do_passback {
|
} |
} |
} elsif (($pbscope eq 'map') || ($pbscope eq 'nonrec')) { |
} elsif (($pbscope eq 'map') || ($pbscope eq 'nonrec')) { |
($total,$possible) = |
($total,$possible) = |
&Apache::lonhomework::get_lti_score($uname,$udom,$pbmap,$pbscope); |
&Apache::lonhomework::get_lti_score($uname,$udom,$usec,$pbmap,$pbscope); |
} |
} |
if (($id ne '') && ($url ne '') && ($possible)) { |
if (($id ne '') && ($url ne '') && ($possible)) { |
my ($sent,$score,$code,$result) = |
my ($sent,$score,$code,$result) = |
Line 1408 sub do_passback {
|
Line 1407 sub do_passback {
|
'id' => $id, |
'id' => $id, |
'clientip' => $pb{'clientip'}, |
'clientip' => $pb{'clientip'}, |
'whodoneit' => $env{'user.name'}.':'.$env{'user.domain'}, |
'whodoneit' => $env{'user.name'}.':'.$env{'user.domain'}, |
}; |
}; |
my $value=''; |
my $value=''; |
foreach my $key (keys(%{$store})) { |
foreach my $key (keys(%{$store})) { |
$value.=&escape($key).'='.&Apache::lonnet::freeze_escape($store->{$key}).'&'; |
$value.=&escape($key).'='.&Apache::lonnet::freeze_escape($store->{$key}).'&'; |
Line 1420 sub do_passback {
|
Line 1419 sub do_passback {
|
if ($ctr%2 ==1) { |
if ($ctr%2 ==1) { |
$outcome .= &Apache::loncommon::start_data_table_row(); |
$outcome .= &Apache::loncommon::start_data_table_row(); |
} |
} |
my $section = $classlist->{$student}->[&Apache::loncoursedata::CL_SECTION()]; |
|
my $group = $classlist->{$student}->[&Apache::loncoursedata::CL_GROUP()]; |
my $group = $classlist->{$student}->[&Apache::loncoursedata::CL_GROUP()]; |
$outcome .= '<td align="right">'.$ctr.' </td>'. |
$outcome .= '<td align="right">'.$ctr.' </td>'. |
'<td>'.&nameUserString(undef,$$fullname{$student},$uname,$udom). |
'<td>'.&nameUserString(undef,$$fullname{$student},$uname,$udom). |
' '.$section.($group ne '' ?'/'.$group:'').'</td>'. |
' '.$usec.($group ne '' ?'/'.$group:'').'</td>'. |
'<td>'.$score.'</td>'."\n"; |
'<td>'.$score.'</td>'."\n"; |
if ($ctr%2 ==0) { |
if ($ctr%2 ==0) { |
$outcome .= &Apache::loncommon::end_data_table_row()."\n"; |
$outcome .= &Apache::loncommon::end_data_table_row()."\n"; |
} |
} |
Line 1441 sub do_passback {
|
Line 1439 sub do_passback {
|
} |
} |
if ($no_passback) { |
if ($no_passback) { |
&Apache::lonnet::log($udom,$uname,$uhome,$no_passback." score: $score; total: $total; possible: $possible"); |
&Apache::lonnet::log($udom,$uname,$uhome,$no_passback." score: $score; total: $total; possible: $possible"); |
|
my $key = &Time::HiRes::time().':'.$uname.':'.$udom.':'. |
|
"$linkuri\0$linkprotector\0$scope"; |
my $ltigrade = { |
my $ltigrade = { |
'ltinum' => $ltinum, |
$key => { |
'lti' => $lti_in_use, |
'ltinum' => $ltinum, |
'crsdef' => $crsdef, |
'lti' => $lti_in_use, |
'cid' => $cdom.'_'.$cnum, |
'crsdef' => $crsdef, |
'uname' => $uname, |
'cid' => $cdom.'_'.$cnum, |
'udom' => $udom, |
'uname' => $uname, |
'uhome' => $uhome, |
'udom' => $udom, |
'pbid' => $id, |
'uhome' => $uhome, |
'pburl' => $url, |
'pbid' => $id, |
'pbtype' => $pb{'type'}, |
'pburl' => $url, |
'pbscope' => $pbscope, |
'pbtype' => $pb{'type'}, |
'pbmap' => $pbmap, |
'pbscope' => $pbscope, |
'pbsymb' => $pbsymb, |
'pbmap' => $pbmap, |
'format' => $scoretype, |
'pbsymb' => $launchsymb, |
'scope' => $scope, |
'format' => $scoretype, |
'clientip' => $pb{'clientip'}, |
'scope' => $scope, |
'linkprot' => $linkprotector.':'.$linkuri, |
'clientip' => $pb{'clientip'}, |
'total' => $total, |
'linkprot' => $linkprotector.':'.$linkuri, |
'possible' => $possible, |
'total' => $total, |
'score' => $score, |
'possible' => $possible, |
|
'score' => $score, |
|
}, |
}; |
}; |
&Apache::lonnet::put('linkprot_passback_pending',$ltigrade,$cdom,$cnum); |
&Apache::lonnet::put('linkprot_passback_pending',$ltigrade,$cdom,$cnum); |
} |
} |
Line 1575 sub get_passback_launcher {
|
Line 1577 sub get_passback_launcher {
|
} |
} |
} |
} |
} |
} |
if ($linkuri =~ m{^\Q/tiny/$cdom/\E(\w+)$}) { |
my $launchsymb = &Apache::loncommon::symb_from_tinyurl($linkuri,$cnum,$cdom); |
my $key = $1; |
if ($launchsymb eq '') { |
my $tinyurl; |
my %passback = &Apache::lonnet::dump('nohist_linkprot_passback',$cdom,$cnum); |
my ($result,$cached)=&Apache::lonnet::is_cached_new('tiny',$cdom."\0".$key); |
foreach my $poss_symb (keys(%passback)) { |
if (defined($cached)) { |
if (ref($passback{$poss_symb}) eq 'HASH') { |
$tinyurl = $result; |
if (exists($passback{$poss_symb}{$chosen})) { |
} else { |
$launchsymb = $poss_symb; |
my $configuname = &Apache::lonnet::get_domainconfiguser($cdom); |
last; |
my %currtiny = &Apache::lonnet::get('tiny',[$key],$cdom,$configuname); |
|
if ($currtiny{$key} ne '') { |
|
$tinyurl = $currtiny{$key}; |
|
&Apache::lonnet::do_cache_new('tiny',$cdom."\0".$key,$currtiny{$key},600); |
|
} |
|
} |
|
if ($tinyurl) { |
|
my ($crsnum,$launchsymb) = split(/\&/,$tinyurl); |
|
if ($crsnum eq $cnum) { |
|
my %passback = &Apache::lonnet::get('nohist_linkprot_passback',[$launchsymb],$cdom,$cnum); |
|
if (ref($passback{$launchsymb}) eq 'HASH') { |
|
if (exists($passback{$launchsymb}{$chosen})) { |
|
return ($launchsymb,$appname,$setter); |
|
} |
|
} |
} |
} |
} |
} |
} |
|
if ($launchsymb ne '') { |
|
return ($launchsymb,$appname,$setter); |
|
} |
|
} else { |
|
my %passback = &Apache::lonnet::get('nohist_linkprot_passback',[$launchsymb],$cdom,$cnum); |
|
if (ref($passback{$launchsymb}) eq 'HASH') { |
|
if (exists($passback{$launchsymb}{$chosen})) { |
|
return ($launchsymb,$appname,$setter); |
|
} |
|
} |
} |
} |
return (); |
return (); |
} |
} |
Line 1679 sub passbacks_for_symb {
|
Line 1677 sub passbacks_for_symb {
|
} |
} |
if (ref($passback{$symb}) eq 'HASH') { |
if (ref($passback{$symb}) eq 'HASH') { |
foreach my $launcher (keys(%{$passback{$symb}})) { |
foreach my $launcher (keys(%{$passback{$symb}})) { |
$needpb{$launcher} = 1; |
$needpb{$launcher} = $symb; |
} |
} |
} |
} |
} |
} |
Line 1696 sub passbacks_for_symb {
|
Line 1694 sub passbacks_for_symb {
|
} |
} |
if (ref($passback{$mapsymb}) eq 'HASH') { |
if (ref($passback{$mapsymb}) eq 'HASH') { |
foreach my $launcher (keys(%{$passback{$mapsymb}})) { |
foreach my $launcher (keys(%{$passback{$mapsymb}})) { |
$needpb{$launcher} = 1; |
$needpb{$launcher} = $mapsymb; |
} |
} |
} |
} |
} |
} |
Line 1713 sub passbacks_for_symb {
|
Line 1711 sub passbacks_for_symb {
|
foreach my $launcher (keys(%{$passback{$key}})) { |
foreach my $launcher (keys(%{$passback{$key}})) { |
my ($linkuri,$linkprotector,$scope) = split("\0",$launcher); |
my ($linkuri,$linkprotector,$scope) = split("\0",$launcher); |
next unless ($scope eq 'rec'); |
next unless ($scope eq 'rec'); |
$needpb{$launcher} = 1; |
$needpb{$launcher} = $key; |
} |
} |
} |
} |
} |
} |
Line 1778 sub process_passbacks {
|
Line 1776 sub process_passbacks {
|
if ($pb{'lti_in_use'}->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) { |
if ($pb{'lti_in_use'}->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) { |
$pb{'scoretype'} = $1; |
$pb{'scoretype'} = $1; |
} |
} |
$pb{'symb'} = &Apache::loncommon::symb_from_tinyurl($pb{'linkuri'},$cnum,$cdom); |
$pb{'symb'} = $needpb->{$launcher}; |
if ($pb{'symb'} =~ /\.(page|sequence)$/) { |
if ($pb{'symb'} =~ /\.(page|sequence)$/) { |
$pb{'map'} = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($pb{'symb'}))[2]); |
$pb{'map'} = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($pb{'symb'}))[2]); |
} else { |
} else { |
Line 1850 sub process_passbacks {
|
Line 1848 sub process_passbacks {
|
$possible = $possible_by_symb{$pb{'symb'}}; |
$possible = $possible_by_symb{$pb{'symb'}}; |
} elsif (($pb{'pbscope'} eq 'map') || ($pb{'pbscope'} eq 'nonrec')) { |
} elsif (($pb{'pbscope'} eq 'map') || ($pb{'pbscope'} eq 'nonrec')) { |
($total,$possible) = |
($total,$possible) = |
&Apache::lonhomework::get_lti_score($uname,$udom,$pb{'map'},$pb{'pbscope'}, |
&Apache::lonhomework::get_lti_score($uname,$udom,$usec,$pb{'map'},$pb{'pbscope'}, |
\%total_by_symb,\%possible_by_symb); |
\%total_by_symb,\%possible_by_symb); |
} |
} |
if (!$possible) { |
if (!$possible) { |
Line 7004 sub updateGradeByPage {
|
Line 7002 sub updateGradeByPage {
|
map { $parentmapsymbs{$_} = 1; } @recurseup; |
map { $parentmapsymbs{$_} = 1; } @recurseup; |
} |
} |
my %passback = &Apache::lonnet::get('nohist_linkprot_passback',\@allsymbs,$cdom,$cnum); |
my %passback = &Apache::lonnet::get('nohist_linkprot_passback',\@allsymbs,$cdom,$cnum); |
my (%uniqsymbs,$use_symbs_in_map); |
my (%uniqsymbs,$use_symbs_in_map,%launch_to_symb); |
if (keys(%passback)) { |
if (keys(%passback)) { |
foreach my $possible (keys(%passback)) { |
foreach my $possible (keys(%passback)) { |
if (ref($passback{$possible}) eq 'HASH') { |
if (ref($passback{$possible}) eq 'HASH') { |
if ($possible eq $mapsymb) { |
if ($possible eq $mapsymb) { |
foreach my $launcher (keys(%{$passback{$possible}})) { |
foreach my $launcher (keys(%{$passback{$possible}})) { |
$possmappb{$launcher} = 1; |
$possmappb{$launcher} = 1; |
|
$launch_to_symb{$launcher} = $possible; |
} |
} |
$use_symbs_in_map = 1; |
$use_symbs_in_map = 1; |
} elsif (exists($parentmapsymbs{$possible})) { |
} elsif (exists($parentmapsymbs{$possible})) { |
Line 7019 sub updateGradeByPage {
|
Line 7018 sub updateGradeByPage {
|
if ($scope eq 'rec') { |
if ($scope eq 'rec') { |
$possmappb{$launcher} = 1; |
$possmappb{$launcher} = 1; |
$use_symbs_in_map = 1; |
$use_symbs_in_map = 1; |
|
$launch_to_symb{$launcher} = $possible; |
} |
} |
} |
} |
} elsif (grep(/^\Q$possible$\E$/,@updates)) { |
} elsif (grep(/^\Q$possible$\E$/,@updates)) { |
foreach my $launcher (keys(%{$passback{$possible}})) { |
foreach my $launcher (keys(%{$passback{$possible}})) { |
$possrespb{$launcher} = 1; |
$possrespb{$launcher} = 1; |
|
$launch_to_symb{$launcher} = $possible; |
} |
} |
$uniqsymbs{$possible} = 1; |
$uniqsymbs{$possible} = 1; |
} |
} |
Line 7045 sub updateGradeByPage {
|
Line 7046 sub updateGradeByPage {
|
my %pbids = &Apache::lonnet::get('nohist_'.$cdom.'_'.$cnum.'_linkprot_pb',\@posslaunchers,$udom,$uname); |
my %pbids = &Apache::lonnet::get('nohist_'.$cdom.'_'.$cnum.'_linkprot_pb',\@posslaunchers,$udom,$uname); |
foreach my $key (keys(%pbids)) { |
foreach my $key (keys(%pbids)) { |
if (ref($pbids{$key}) eq 'ARRAY') { |
if (ref($pbids{$key}) eq 'ARRAY') { |
$needpb{$key} = 1; |
if ($launch_to_symb{$key}) { |
|
$needpb{$key} = $launch_to_symb{$key}; |
|
} |
} |
} |
} |
} |
my @symbs = keys(%uniqsymbs); |
my @symbs = keys(%uniqsymbs); |
Line 12591 sub assign_clicker_grades {
|
Line 12594 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 12700 sub assign_clicker_grades {
|
Line 12707 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); |
|
} |
} |
} |
} |
} |
} |
} |