version 1.723, 2014/02/27 02:28:51
|
version 1.784, 2021/01/25 14:21:17
|
Line 46 use Apache::lonenc;
|
Line 46 use Apache::lonenc;
|
use Apache::lonstathelpers; |
use Apache::lonstathelpers; |
use Apache::lonquickgrades; |
use Apache::lonquickgrades; |
use Apache::bridgetask(); |
use Apache::bridgetask(); |
|
use Apache::lontexconvert(); |
use String::Similarity; |
use String::Similarity; |
|
use HTML::Parser(); |
|
use File::MMagic; |
use LONCAPA; |
use LONCAPA; |
|
|
use POSIX qw(floor); |
use POSIX qw(floor); |
Line 116 sub getpartlist {
|
Line 119 sub getpartlist {
|
my $res = $navmap->getBySymb($symb); |
my $res = $navmap->getBySymb($symb); |
my $partlist = $res->parts(); |
my $partlist = $res->parts(); |
my $url = $res->src(); |
my $url = $res->src(); |
my @metakeys = split(/,/,&Apache::lonnet::metadata($url,'keys')); |
my $toolsymb; |
|
if ($url =~ /ext\.tool$/) { |
|
$toolsymb = $symb; |
|
} |
|
my @metakeys = split(/,/,&Apache::lonnet::metadata($url,'keys',$toolsymb)); |
|
|
my @stores; |
my @stores; |
foreach my $part (@{ $partlist }) { |
foreach my $part (@{ $partlist }) { |
Line 140 sub nameUserString {
|
Line 147 sub nameUserString {
|
} |
} |
|
|
#--- Get the partlist and the response type for a given problem. --- |
#--- Get the partlist and the response type for a given problem. --- |
#--- Indicate if a response type is coded handgraded or not. --- |
#--- Count responseIDs, essayresponse items, and dropbox items --- |
#--- Sets response_error pointer to "1" if navmaps object broken --- |
#--- Sets response_error pointer to "1" if navmaps object broken --- |
sub response_type { |
sub response_type { |
my ($symb,$response_error) = @_; |
my ($symb,$response_error) = @_; |
Line 158 sub response_type {
|
Line 165 sub response_type {
|
return; |
return; |
} |
} |
my $partlist = $res->parts(); |
my $partlist = $res->parts(); |
|
my ($numresp,$numessay,$numdropbox) = (0,0,0); |
my %vPart = |
my %vPart = |
map { $_ => 1 } (&Apache::loncommon::get_env_multiple('form.vPart')); |
map { $_ => 1 } (&Apache::loncommon::get_env_multiple('form.vPart')); |
my (%response_types,%handgrade); |
my (%response_types,%handgrade); |
Line 167 sub response_type {
|
Line 175 sub response_type {
|
my @types = $res->responseType($part); |
my @types = $res->responseType($part); |
my @ids = $res->responseIds($part); |
my @ids = $res->responseIds($part); |
for (my $i=0; $i < scalar(@ids); $i++) { |
for (my $i=0; $i < scalar(@ids); $i++) { |
|
$numresp ++; |
$response_types{$part}{$ids[$i]} = $types[$i]; |
$response_types{$part}{$ids[$i]} = $types[$i]; |
|
if ($types[$i] eq 'essay') { |
|
$numessay ++; |
|
if (&Apache::lonnet::EXT("resource.$part".'_'.$ids[$i].".uploadedfiletypes",$symb)) { |
|
$numdropbox ++; |
|
} |
|
} |
$handgrade{$part.'_'.$ids[$i]} = |
$handgrade{$part.'_'.$ids[$i]} = |
&Apache::lonnet::EXT('resource.'.$part.'_'.$ids[$i]. |
&Apache::lonnet::EXT('resource.'.$part.'_'.$ids[$i]. |
'.handgrade',$symb); |
'.handgrade',$symb); |
} |
} |
} |
} |
return ($partlist,\%handgrade,\%response_types); |
return ($partlist,\%handgrade,\%response_types,$numresp,$numessay,$numdropbox); |
} |
} |
|
|
sub flatten_responseType { |
sub flatten_responseType { |
Line 200 sub get_display_part {
|
Line 215 sub get_display_part {
|
return $display; |
return $display; |
} |
} |
|
|
|
#--- Show parts and response type |
|
sub showResourceInfo { |
|
my ($symb,$partlist,$responseType,$formname,$checkboxes,$uploads) = @_; |
|
unless ((ref($partlist) eq 'ARRAY') && (ref($responseType) eq 'HASH')) { |
|
return '<br clear="all">'; |
|
} |
|
my $coltitle = &mt('Problem Part Shown'); |
|
if ($checkboxes) { |
|
$coltitle = &mt('Problem Part'); |
|
} else { |
|
my $checkedparts = 0; |
|
foreach my $partid (&Apache::loncommon::get_env_multiple('form.vPart')) { |
|
if (grep(/^\Q$partid\E$/,@{$partlist})) { |
|
$checkedparts ++; |
|
} |
|
} |
|
if ($checkedparts == scalar(@{$partlist})) { |
|
return '<br clear="all">'; |
|
} |
|
if ($uploads) { |
|
$coltitle = &mt('Problem Part Selected'); |
|
} |
|
} |
|
my $result = '<div class="LC_left_float" style="display:inline-block;">'; |
|
if ($checkboxes) { |
|
my $legend = &mt('Parts to display'); |
|
if ($uploads) { |
|
$legend = &mt('Part(s) with dropbox'); |
|
} |
|
$result .= '<fieldset style="display:inline-block;"><legend>'.$legend.'</legend>'. |
|
'<span class="LC_nobreak">'. |
|
'<label><input type="radio" name="chooseparts" value="0" onclick="toggleParts('."'$formname'".');" checked="checked" />'. |
|
&mt('All parts').'</label>'.(' 'x2). |
|
'<label><input type="radio" name="chooseparts" value="1" onclick="toggleParts('."'$formname'".');" />'. |
|
&mt('Selected parts').'</label></span>'. |
|
'<div id="LC_partselector" style="display:none">'; |
|
} |
|
$result .= &Apache::loncommon::start_data_table() |
|
.&Apache::loncommon::start_data_table_header_row(); |
|
if ($checkboxes) { |
|
$result .= '<th>'.&mt('Display?').'</th>'; |
|
} |
|
$result .= '<th>'.$coltitle.'</th>' |
|
.'<th>'.&mt('Res. ID').'</th>' |
|
.'<th>'.&mt('Type').'</th>' |
|
.&Apache::loncommon::end_data_table_header_row(); |
|
my %partsseen; |
|
foreach my $partID (sort(keys(%$responseType))) { |
|
foreach my $resID (sort(keys(%{ $responseType->{$partID} }))) { |
|
my $responsetype = $responseType->{$partID}->{$resID}; |
|
if ($uploads) { |
|
next unless ($responsetype eq 'essay'); |
|
next unless (&Apache::lonnet::EXT("resource.$partID".'_'."$resID.uploadedfiletypes",$symb)); |
|
} |
|
my $display_part=&get_display_part($partID,$symb); |
|
if (exists($partsseen{$partID})) { |
|
$result.=&Apache::loncommon::continue_data_table_row(); |
|
} else { |
|
$partsseen{$partID}=scalar(keys(%{$responseType->{$partID}})); |
|
$result.=&Apache::loncommon::start_data_table_row(). |
|
'<td rowspan="'.$partsseen{$partID}.'" style="vertical-align:middle">'; |
|
if ($checkboxes) { |
|
$result.='<input type="checkbox" name="vPart" checked="checked" value="'.$partID.'" /></td>'. |
|
'<td rowspan="'.$partsseen{$partID}.'" style="vertical-align:middle">'.$display_part.'</td>'; |
|
} else { |
|
$result.=$display_part.'</td>'; |
|
} |
|
} |
|
$result.='<td>'.'<span class="LC_internal_info">'.$resID.'</span></td>' |
|
.'<td>'.&mt($responsetype).'</td>' |
|
.&Apache::loncommon::end_data_table_row(); |
|
} |
|
} |
|
$result.=&Apache::loncommon::end_data_table(); |
|
if ($checkboxes) { |
|
$result .= '</div></fieldset>'; |
|
} |
|
$result .= '</div><div style="padding:0;clear:both;margin:0;border:0"></div>'; |
|
if (!keys(%partsseen)) { |
|
$result = ''; |
|
if ($uploads) { |
|
return '<div style="padding:0;clear:both;margin:0;border:0"></div>'. |
|
'<p class="LC_info">'. |
|
&mt('No dropbox items or essayresponse items with uploadedfiletypes set.'). |
|
'</p>'; |
|
} else { |
|
return '<br clear="all" />'; |
|
} |
|
} |
|
return $result; |
|
} |
|
|
|
sub part_selector_js { |
|
my $js = <<"END"; |
|
function toggleParts(formname) { |
|
if (document.getElementById('LC_partselector')) { |
|
var index = ''; |
|
if (document.forms.length) { |
|
for (var i=0; i<document.forms.length; i++) { |
|
if (document.forms[i].name == formname) { |
|
index = i; |
|
break; |
|
} |
|
} |
|
} |
|
if ((index != '') && (document.forms[index].elements['chooseparts'].length > 1)) { |
|
for (var i=0; i<document.forms[index].elements['chooseparts'].length; i++) { |
|
if (document.forms[index].elements['chooseparts'][i].checked) { |
|
var val = document.forms[index].elements['chooseparts'][i].value; |
|
if (document.forms[index].elements['chooseparts'][i].value == 1) { |
|
document.getElementById('LC_partselector').style.display = 'block'; |
|
} else { |
|
document.getElementById('LC_partselector').style.display = 'none'; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
END |
|
return &Apache::lonhtmlcommon::scripttag($js); |
|
} |
|
|
sub reset_caches { |
sub reset_caches { |
&reset_analyze_cache(); |
&reset_analyze_cache(); |
&reset_perm(); |
&reset_perm(); |
Line 293 sub reset_caches {
|
Line 431 sub reset_caches {
|
} |
} |
|
|
sub scantron_partids_tograde { |
sub scantron_partids_tograde { |
my ($resource,$cid,$uname,$udom,$check_for_randomlist,$bubbles_per_row) = @_; |
my ($resource,$cid,$uname,$udom,$check_for_randomlist,$bubbles_per_row,$scancode) = @_; |
my (%analysis,@parts); |
my (%analysis,@parts); |
if (ref($resource)) { |
if (ref($resource)) { |
my $symb = $resource->symb(); |
my $symb = $resource->symb(); |
Line 301 sub reset_caches {
|
Line 439 sub reset_caches {
|
if ($check_for_randomlist) { |
if ($check_for_randomlist) { |
$add_to_form = { 'check_parts_withrandomlist' => 1,}; |
$add_to_form = { 'check_parts_withrandomlist' => 1,}; |
} |
} |
my $analyze = |
if ($scancode) { |
|
if (ref($add_to_form) eq 'HASH') { |
|
$add_to_form->{'code_for_randomlist'} = $scancode; |
|
} else { |
|
$add_to_form = { 'code_for_randomlist' => $scancode,}; |
|
} |
|
} |
|
my $analyze = |
&get_analyze($symb,$uname,$udom,undef,$add_to_form, |
&get_analyze($symb,$uname,$udom,undef,$add_to_form, |
undef,undef,undef,$bubbles_per_row); |
undef,undef,undef,$bubbles_per_row); |
if (ref($analyze) eq 'HASH') { |
if (ref($analyze) eq 'HASH') { |
Line 331 sub cleanRecord {
|
Line 476 sub cleanRecord {
|
if ($response =~ /^(option|rank)$/) { |
if ($response =~ /^(option|rank)$/) { |
my %answer=&Apache::lonnet::str2hash($answer); |
my %answer=&Apache::lonnet::str2hash($answer); |
my @answer = %answer; |
my @answer = %answer; |
%answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; |
%answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
my ($toprow,$bottomrow); |
my ($toprow,$bottomrow); |
foreach my $foil (@$order) { |
foreach my $foil (@$order) { |
Line 349 sub cleanRecord {
|
Line 494 sub cleanRecord {
|
} elsif ($response eq 'match') { |
} elsif ($response eq 'match') { |
my %answer=&Apache::lonnet::str2hash($answer); |
my %answer=&Apache::lonnet::str2hash($answer); |
my @answer = %answer; |
my @answer = %answer; |
%answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; |
%answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
my @items=&Apache::lonnet::str2array($record->{$version."resource.$partid.$respid.submissionitems"}); |
my @items=&Apache::lonnet::str2array($record->{$version."resource.$partid.$respid.submissionitems"}); |
my ($toprow,$middlerow,$bottomrow); |
my ($toprow,$middlerow,$bottomrow); |
Line 406 sub cleanRecord {
|
Line 551 sub cleanRecord {
|
$env{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : ''; |
$env{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : ''; |
$env{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob. |
$env{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob. |
} |
} |
$answer =~ s-\n-<br />-g; |
$answer = &Apache::lontexconvert::msgtexconverted($answer); |
return '<br /><br /><blockquote><tt>'.&keywords_highlight(&HTML::Entities::encode($answer, '"<>&')).'</tt></blockquote>'; |
return '<br /><br /><blockquote><tt>'.&keywords_highlight($answer).'</tt></blockquote>'; |
|
|
} elsif ( $response eq 'organic') { |
} elsif ( $response eq 'organic') { |
my $result=&mt('Smile representation: [_1]', |
my $result=&mt('Smile representation: [_1]', |
'"<tt>'.&HTML::Entities::encode($answer, '"<>&').'</tt>"'); |
'"<tt>'.&HTML::Entities::encode($answer, '"<>&').'</tt>"'); |
Line 492 COMMONJSFUNCTIONS
|
Line 636 COMMONJSFUNCTIONS
|
#--- Dumps the class list with usernames,list of sections, |
#--- Dumps the class list with usernames,list of sections, |
#--- section, ids and fullnames for each user. |
#--- section, ids and fullnames for each user. |
sub getclasslist { |
sub getclasslist { |
my ($getsec,$filterlist,$getgroup) = @_; |
my ($getsec,$filterbyaccstatus,$getgroup,$symb,$submitonly,$filterbysubmstatus) = @_; |
my @getsec; |
my @getsec; |
my @getgroup; |
my @getgroup; |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
Line 520 sub getclasslist {
|
Line 664 sub getclasslist {
|
# |
# |
my %sections; |
my %sections; |
my %fullnames; |
my %fullnames; |
|
my ($cdom,$cnum,$partlist); |
|
if (($filterbysubmstatus) && ($submitonly ne 'all') && ($symb ne '')) { |
|
$cdom = $env{"course.$env{'request.course.id'}.domain"}; |
|
$cnum = $env{"course.$env{'request.course.id'}.num"}; |
|
my $res_error; |
|
($partlist) = &response_type($symb,\$res_error); |
|
} |
foreach my $student (keys(%$classlist)) { |
foreach my $student (keys(%$classlist)) { |
my $end = |
my $end = |
$classlist->{$student}->[&Apache::loncoursedata::CL_END()]; |
$classlist->{$student}->[&Apache::loncoursedata::CL_END()]; |
Line 536 sub getclasslist {
|
Line 687 sub getclasslist {
|
my $group = |
my $group = |
$classlist->{$student}->[&Apache::loncoursedata::CL_GROUP()]; |
$classlist->{$student}->[&Apache::loncoursedata::CL_GROUP()]; |
# filter students according to status selected |
# filter students according to status selected |
if ($filterlist && (!($stu_status =~ /Any/))) { |
if ($filterbyaccstatus && (!($stu_status =~ /Any/))) { |
if (!($stu_status =~ $status)) { |
if (!($stu_status =~ $status)) { |
delete($classlist->{$student}); |
delete($classlist->{$student}); |
next; |
next; |
Line 553 sub getclasslist {
|
Line 704 sub getclasslist {
|
} |
} |
} |
} |
if (($grp eq 'none') && !$group) { |
if (($grp eq 'none') && !$group) { |
$exclude = 0; |
$exclude = 0; |
} |
} |
} |
} |
if ($exclude) { |
if ($exclude) { |
delete($classlist->{$student}); |
delete($classlist->{$student}); |
|
next; |
} |
} |
} |
} |
|
if (($filterbysubmstatus) && ($submitonly ne 'all') && ($symb ne '')) { |
|
my $udom = |
|
$classlist->{$student}->[&Apache::loncoursedata::CL_SDOM()]; |
|
my $uname = |
|
$classlist->{$student}->[&Apache::loncoursedata::CL_SNAME()]; |
|
if (($symb ne '') && ($udom ne '') && ($uname ne '')) { |
|
if ($submitonly eq 'queued') { |
|
my %queue_status = |
|
&Apache::bridgetask::get_student_status($symb,$cdom,$cnum, |
|
$udom,$uname); |
|
if (!defined($queue_status{'gradingqueue'})) { |
|
delete($classlist->{$student}); |
|
next; |
|
} |
|
} else { |
|
my (%status) =&student_gradeStatus($symb,$udom,$uname,$partlist); |
|
my $submitted = 0; |
|
my $graded = 0; |
|
my $incorrect = 0; |
|
foreach (keys(%status)) { |
|
$submitted = 1 if ($status{$_} ne 'nothing'); |
|
$graded = 1 if ($status{$_} =~ /^ungraded/); |
|
$incorrect = 1 if ($status{$_} =~ /^incorrect/); |
|
|
|
my ($foo,$partid,$foo1) = split(/\./,$_); |
|
if ($status{'resource.'.$partid.'.submitted_by'} ne '') { |
|
$submitted = 0; |
|
} |
|
} |
|
if (!$submitted && ($submitonly eq 'yes' || |
|
$submitonly eq 'incorrect' || |
|
$submitonly eq 'graded')) { |
|
delete($classlist->{$student}); |
|
next; |
|
} elsif (!$graded && ($submitonly eq 'graded')) { |
|
delete($classlist->{$student}); |
|
next; |
|
} elsif (!$incorrect && $submitonly eq 'incorrect') { |
|
delete($classlist->{$student}); |
|
next; |
|
} |
|
} |
|
} |
|
} |
$section = ($section ne '' ? $section : 'none'); |
$section = ($section ne '' ? $section : 'none'); |
if (&canview($section)) { |
if (&canview($section)) { |
if (!@getsec || grep(/^\Q$section\E$/,@getsec)) { |
if (!@getsec || grep(/^\Q$section\E$/,@getsec)) { |
Line 574 sub getclasslist {
|
Line 770 sub getclasslist {
|
delete($classlist->{$student}); |
delete($classlist->{$student}); |
} |
} |
} |
} |
my %seen = (); |
|
my @sections = sort(keys(%sections)); |
my @sections = sort(keys(%sections)); |
return ($classlist,\@sections,\%fullnames); |
return ($classlist,\@sections,\%fullnames); |
} |
} |
Line 590 sub canmodify {
|
Line 785 sub canmodify {
|
#can modify the requested section |
#can modify the requested section |
return 1; |
return 1; |
} else { |
} else { |
# can't modify the request section |
# can't modify the requested section |
return 0; |
return 0; |
} |
} |
} |
} |
Line 603 sub canview {
|
Line 798 sub canview {
|
my ($sec)=@_; |
my ($sec)=@_; |
if ($perm{'vgr'}) { |
if ($perm{'vgr'}) { |
if (!defined($perm{'vgr_section'})) { |
if (!defined($perm{'vgr_section'})) { |
# can modify whole class |
# can view whole class |
return 1; |
return 1; |
} else { |
} else { |
if ($sec eq $perm{'vgr_section'}) { |
if ($sec eq $perm{'vgr_section'}) { |
#can modify the requested section |
#can view the requested section |
return 1; |
return 1; |
} else { |
} else { |
# can't modify the request section |
# can't view the requested section |
return 0; |
return 0; |
} |
} |
} |
} |
} |
} |
#can't modify |
#can't view |
return 0; |
return 0; |
} |
} |
|
|
Line 756 sub initialverifyreceipt {
|
Line 951 sub initialverifyreceipt {
|
|
|
#--- Check whether a receipt number is valid.--- |
#--- Check whether a receipt number is valid.--- |
sub verifyreceipt { |
sub verifyreceipt { |
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
|
|
my $courseid = $env{'request.course.id'}; |
my $courseid = $env{'request.course.id'}; |
my $receipt = &Apache::lonnet::recprefix($courseid).'-'. |
my $receipt = &Apache::lonnet::recprefix($courseid).'-'. |
$env{'form.receipt'}; |
$env{'form.receipt'}; |
$receipt =~ s/[^\-\d]//g; |
$receipt =~ s/[^\-\d]//g; |
|
|
my $title.= |
my $title = |
'<h3><span class="LC_info">'. |
'<h3><span class="LC_info">'. |
&mt('Verifying Receipt Number [_1]',$receipt). |
&mt('Verifying Receipt Number [_1]',$receipt). |
'</span></h3>'."\n"; |
'</span></h3>'."\n"; |
Line 844 sub verifyreceipt {
|
Line 1039 sub verifyreceipt {
|
#--- Also called directly when one clicks on the subm button |
#--- Also called directly when one clicks on the subm button |
# on the problem page. |
# on the problem page. |
sub listStudents { |
sub listStudents { |
my ($request,$symb,$submitonly) = @_; |
my ($request,$symb,$submitonly,$divforres) = @_; |
|
|
|
my $is_tool = ($symb =~ /ext\.tool$/); |
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 $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'}; |
my $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'}; |
my $getgroup = $env{'form.group'} eq '' ? 'all' : $env{'form.group'}; |
my $getgroup = $env{'form.group'} eq '' ? 'all' : $env{'form.group'}; |
unless ($submitonly) { |
unless ($submitonly) { |
$submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'}; |
$submitonly = $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'}; |
} |
} |
|
|
my $result=''; |
my $result=''; |
my $res_error; |
my $res_error; |
my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error); |
my ($partlist,$handgrade,$responseType,$numresp,$numessay) = &response_type($symb,\$res_error); |
|
|
|
my $table; |
|
if (ref($partlist) eq 'ARRAY') { |
|
if (scalar(@$partlist) > 1 ) { |
|
$table = &showResourceInfo($symb,$partlist,$responseType,'gradesub',1); |
|
} elsif ($divforres) { |
|
$table = '<div style="padding:0;clear:both;margin:0;border:0"></div>'; |
|
} else { |
|
$table = '<br clear="all" />'; |
|
} |
|
} |
|
|
my %lt = &Apache::lonlocal::texthash ( |
my %js_lt = &Apache::lonlocal::texthash ( |
'multiple' => 'Please select a student or group of students before clicking on the Next button.', |
'multiple' => 'Please select a student or group of students before clicking on the Next button.', |
'single' => 'Please select the student before clicking on the Next button.', |
'single' => 'Please select the student before clicking on the Next button.', |
); |
); |
|
&js_escape(\%js_lt); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT)); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT)); |
function checkSelect(checkBox) { |
function checkSelect(checkBox) { |
var ctr=0; |
var ctr=0; |
Line 872 sub listStudents {
|
Line 1080 sub listStudents {
|
ctr++; |
ctr++; |
} |
} |
} |
} |
sense = '$lt{'multiple'}'; |
sense = '$js_lt{'multiple'}'; |
} else { |
} else { |
if (checkBox.checked) { |
if (checkBox.checked) { |
ctr = 1; |
ctr = 1; |
} |
} |
sense = '$lt{'single'}'; |
sense = '$js_lt{'single'}'; |
} |
} |
if (ctr == 0) { |
if (ctr == 0) { |
alert(sense); |
alert(sense); |
Line 897 LISTJAVASCRIPT
|
Line 1105 LISTJAVASCRIPT
|
$request->print($result); |
$request->print($result); |
|
|
my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'. |
my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'. |
"\n"; |
"\n".$table; |
|
|
$gradeTable .= &Apache::lonhtmlcommon::start_pick_box(); |
$gradeTable .= &Apache::lonhtmlcommon::start_pick_box(); |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Problem Text')) |
unless ($is_tool) { |
.'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n" |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Problem Text')) |
.'<label><input type="radio" name="vProb" value="yes" /> '.&mt('one student').' </label>'."\n" |
.'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n" |
.'<label><input type="radio" name="vProb" value="all" /> '.&mt('all students').' </label><br />'."\n" |
.'<label><input type="radio" name="vProb" value="yes" /> '.&mt('one student').' </label>'."\n" |
.&Apache::lonhtmlcommon::row_closure(); |
.'<label><input type="radio" name="vProb" value="all" /> '.&mt('all students').' </label><br />'."\n" |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Answer')) |
.&Apache::lonhtmlcommon::row_closure(); |
.'<label><input type="radio" name="vAns" value="no" /> '.&mt('no').' </label>'."\n" |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Answer')) |
.'<label><input type="radio" name="vAns" value="yes" /> '.&mt('one student').' </label>'."\n" |
.'<label><input type="radio" name="vAns" value="no" /> '.&mt('no').' </label>'."\n" |
.'<label><input type="radio" name="vAns" value="all" checked="checked" /> '.&mt('all students').' </label><br />'."\n" |
.'<label><input type="radio" name="vAns" value="yes" /> '.&mt('one student').' </label>'."\n" |
.&Apache::lonhtmlcommon::row_closure(); |
.'<label><input type="radio" name="vAns" value="all" checked="checked" /> '.&mt('all students').' </label><br />'."\n" |
|
.&Apache::lonhtmlcommon::row_closure(); |
|
} |
|
|
my $submission_options; |
|
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status; |
my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status; |
$env{'form.Status'} = $saveStatus; |
$env{'form.Status'} = $saveStatus; |
$submission_options.= |
my %optiontext; |
|
if ($is_tool) { |
|
%optiontext = &Apache::lonlocal::texthash ( |
|
lastonly => 'last transaction', |
|
last => 'last transaction with details', |
|
datesub => 'all transactions', |
|
all => 'all transactions with details', |
|
); |
|
} else { |
|
%optiontext = &Apache::lonlocal::texthash ( |
|
lastonly => 'last submission', |
|
last => 'last submission with details', |
|
datesub => 'all submissions', |
|
all => 'all submissions with details', |
|
); |
|
} |
|
my $submission_options = |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="lastonly" /> '. |
'<label><input type="radio" name="lastSub" value="lastonly" /> '. |
&mt('last submission').' </label></span>'."\n". |
$optiontext{'lastonly'}.' </label></span>'."\n". |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="last" /> '. |
'<label><input type="radio" name="lastSub" value="last" /> '. |
&mt('last submission with details').' </label></span>'."\n". |
$optiontext{'last'}.' </label></span>'."\n". |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '. |
'<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '. |
&mt('all submissions').'</label></span>'."\n". |
$optiontext{'datesub'}.'</label></span>'."\n". |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="all" /> '. |
'<label><input type="radio" name="lastSub" value="all" /> '. |
&mt('all submissions with details').'</label></span>'; |
$optiontext{'all'}.'</label></span>'; |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Submissions')) |
my $viewtitle; |
.$submission_options |
if ($is_tool) { |
|
$viewtitle = &mt('View Transactions'); |
|
} else { |
|
$viewtitle = &mt('View Submissions'); |
|
} |
|
my ($compmsg,$nocompmsg); |
|
$nocompmsg = ' checked="checked"'; |
|
if ($numessay) { |
|
$compmsg = $nocompmsg; |
|
$nocompmsg = ''; |
|
} |
|
$gradeTable .= &Apache::lonhtmlcommon::row_title($viewtitle) |
|
.$submission_options; |
|
# Check if any gradable |
|
my $showmore; |
|
if ($perm{'mgr'}) { |
|
my @sections; |
|
if ($env{'request.course.sec'} ne '') { |
|
@sections = ($env{'request.course.sec'}); |
|
} elsif ($env{'form.section'} eq '') { |
|
@sections = ('all'); |
|
} else { |
|
@sections = &Apache::loncommon::get_env_multiple('form.section'); |
|
} |
|
if (grep(/^all$/,@sections)) { |
|
$showmore = 1; |
|
} else { |
|
foreach my $sec (@sections) { |
|
if (&canmodify($sec)) { |
|
$showmore = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
|
|
if ($showmore) { |
|
$gradeTable .= |
|
&Apache::lonhtmlcommon::row_closure() |
|
.&Apache::lonhtmlcommon::row_title(&mt('Send Messages')) |
|
.'<span class="LC_nobreak">' |
|
.'<label><input type="radio" name="compmsg" value="0"'.$nocompmsg.' />' |
|
.&mt('No').(' 'x2).'</label>' |
|
.'<label><input type="radio" name="compmsg" value="1"'.$compmsg.' />' |
|
.&mt('Yes').(' 'x2).'</label>' |
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure(); |
|
|
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Grading Increments')) |
$gradeTable .= |
|
&Apache::lonhtmlcommon::row_title(&mt('Grading Increments')) |
.'<select name="increment">' |
.'<select name="increment">' |
.'<option value="1">'.&mt('Whole Points').'</option>' |
.'<option value="1">'.&mt('Whole Points').'</option>' |
.'<option value=".5">'.&mt('Half Points').'</option>' |
.'<option value=".5">'.&mt('Half Points').'</option>' |
.'<option value=".25">'.&mt('Quarter Points').'</option>' |
.'<option value=".25">'.&mt('Quarter Points').'</option>' |
.'<option value=".1">'.&mt('Tenths of a Point').'</option>' |
.'<option value=".1">'.&mt('Tenths of a Point').'</option>' |
.'</select>' |
.'</select>'; |
.&Apache::lonhtmlcommon::row_closure(); |
} |
|
|
$gradeTable .= |
$gradeTable .= |
&build_section_inputs(). |
&build_section_inputs(). |
'<input type="hidden" name="submitonly" value="'.$submitonly.'" />'."\n". |
'<input type="hidden" name="submitonly" value="'.$submitonly.'" />'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". |
'<input type="hidden" name="saveStatusOld" value="'.$saveStatus.'" />'."\n"; |
'<input type="hidden" name="saveStatusOld" value="'.$saveStatus.'" />'."\n"; |
|
|
if (exists($env{'form.Status'})) { |
if (exists($env{'form.Status'})) { |
$gradeTable .= '<input type="hidden" name="Status" value="'.$stu_status.'" />'."\n"; |
$gradeTable .= '<input type="hidden" name="Status" value="'.$env{'form.Status'}.'" />'."\n"; |
} else { |
} else { |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Student Status')) |
$gradeTable .= &Apache::lonhtmlcommon::row_closure() |
|
.&Apache::lonhtmlcommon::row_title(&mt('Student Status')) |
.&Apache::lonhtmlcommon::StatusOptions( |
.&Apache::lonhtmlcommon::StatusOptions( |
$saveStatus,undef,1,'javascript:reLoadList(this.form);') |
$saveStatus,undef,1,'javascript:reLoadList(this.form);'); |
.&Apache::lonhtmlcommon::row_closure(); |
|
} |
} |
|
if ($numessay) { |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Check For Plagiarism')) |
$gradeTable .= &Apache::lonhtmlcommon::row_closure() |
.'<input type="checkbox" name="checkPlag" checked="checked" />' |
.&Apache::lonhtmlcommon::row_title(&mt('Check For Plagiarism')) |
.&Apache::lonhtmlcommon::row_closure(1) |
.'<input type="checkbox" name="checkPlag" checked="checked" />'; |
|
} |
|
$gradeTable .= &Apache::lonhtmlcommon::row_closure(1) |
.&Apache::lonhtmlcommon::end_pick_box(); |
.&Apache::lonhtmlcommon::end_pick_box(); |
|
my $regrademsg; |
|
if ($is_tool) { |
|
$regrademsg =&mt("To view/grade/regrade, click on the check box(es) next to the student's name(s). Then click on the Next button."); |
|
} else { |
|
$regrademsg = &mt("To view/grade/regrade a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button."); |
|
} |
$gradeTable .= '<p>' |
$gradeTable .= '<p>' |
.&mt("To view/grade/regrade a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button.")."\n" |
.$regrademsg."\n" |
.'<input type="hidden" name="command" value="processGroup" />' |
.'<input type="hidden" name="command" value="processGroup" />' |
.'</p>'; |
.'</p>'; |
|
|
Line 1108 LISTJAVASCRIPT
|
Line 1383 LISTJAVASCRIPT
|
#---- Called from the listStudents routine |
#---- Called from the listStudents routine |
|
|
sub check_script { |
sub check_script { |
my ($form, $type)=@_; |
my ($form,$type) = @_; |
my $chkallscript= &Apache::lonhtmlcommon::scripttag(' |
my $chkallscript = &Apache::lonhtmlcommon::scripttag(' |
function checkall() { |
function checkall() { |
for (i=0; i<document.forms.'.$form.'.elements.length; i++) { |
for (i=0; i<document.forms.'.$form.'.elements.length; i++) { |
ele = document.forms.'.$form.'.elements[i]; |
ele = document.forms.'.$form.'.elements[i]; |
Line 1154 sub check_buttons {
|
Line 1429 sub check_buttons {
|
|
|
# Displays the submissions for one student or a group of students |
# Displays the submissions for one student or a group of students |
sub processGroup { |
sub processGroup { |
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
my $ctr = 0; |
my $ctr = 0; |
my @stuchecked = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
my @stuchecked = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
my $total = scalar(@stuchecked)-1; |
my $total = scalar(@stuchecked)-1; |
Line 1178 sub processGroup {
|
Line 1453 sub processGroup {
|
#--- Javascript to handle the submission page functionality --- |
#--- Javascript to handle the submission page functionality --- |
sub sub_page_js { |
sub sub_page_js { |
my $request = shift; |
my $request = shift; |
my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = '); |
my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = '); |
|
&js_escape(\$alertmsg); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); |
function updateRadio(formname,id,weight) { |
function updateRadio(formname,id,weight) { |
var gradeBox = formname["GD_BOX"+id]; |
var gradeBox = formname["GD_BOX"+id]; |
Line 1296 sub sub_page_js {
|
Line 1572 sub sub_page_js {
|
} |
} |
} |
} |
} |
} |
|
|
} |
} |
} |
} |
|
|
} |
} |
formname.submit(); |
formname.submit(); |
} |
} |
Line 1343 sub sub_page_js {
|
Line 1617 sub sub_page_js {
|
SUBJAVASCRIPT |
SUBJAVASCRIPT |
} |
} |
|
|
#--- javascript for essay type problem -- |
#--- javascript for grading message center |
sub sub_page_kw_js { |
sub sub_grademessage_js { |
my $request = shift; |
my $request = shift; |
my $iconpath = $request->dir_config('lonIconsURL'); |
my $iconpath = $request->dir_config('lonIconsURL'); |
&commonJSfunctions($request); |
&commonJSfunctions($request); |
Line 1390 sub sub_page_kw_js {
|
Line 1664 sub sub_page_kw_js {
|
</script> |
</script> |
INNERJS |
INNERJS |
|
|
my $inner_js_highlight_central= (<<INNERJS); |
my $start_page_msg_central = |
<script type="text/javascript"> |
|
function updateChoice(flag) { |
|
opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr); |
|
opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize); |
|
opener.document.SCORE.kwstyle.value = opener.radioSelection(document.hlCenter.kwdstyle); |
|
opener.document.SCORE.refresh.value = "on"; |
|
if (opener.document.SCORE.keywords.value!=""){ |
|
opener.document.SCORE.submit(); |
|
} |
|
self.close() |
|
} |
|
</script> |
|
INNERJS |
|
|
|
my $start_page_msg_central = |
|
&Apache::loncommon::start_page('Message Central',$inner_js_msg_central, |
&Apache::loncommon::start_page('Message Central',$inner_js_msg_central, |
{'js_ready' => 1, |
{'js_ready' => 1, |
'only_body' => 1, |
'only_body' => 1, |
'bgcolor' =>'#FFFFFF',}); |
'bgcolor' =>'#FFFFFF',}); |
my $end_page_msg_central = |
my $end_page_msg_central = |
&Apache::loncommon::end_page({'js_ready' => 1}); |
|
|
|
|
|
my $start_page_highlight_central = |
|
&Apache::loncommon::start_page('Highlight Central', |
|
$inner_js_highlight_central, |
|
{'js_ready' => 1, |
|
'only_body' => 1, |
|
'bgcolor' =>'#FFFFFF',}); |
|
my $end_page_highlight_central = |
|
&Apache::loncommon::end_page({'js_ready' => 1}); |
&Apache::loncommon::end_page({'js_ready' => 1}); |
|
|
my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); |
my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); |
$docopen=~s/^document\.//; |
$docopen=~s/^document\.//; |
my %lt = &Apache::lonlocal::texthash( |
|
keyw => 'Keywords list, separated by a space. Add/delete to list if desired.', |
my %html_js_lt = &Apache::lonlocal::texthash( |
plse => 'Please select a word or group of words from document and then click this link.', |
|
adds => 'Add selection to keyword list? Edit if desired.', |
|
comp => 'Compose Message for: ', |
comp => 'Compose Message for: ', |
incl => 'Include', |
incl => 'Include', |
type => 'Type', |
type => 'Type', |
Line 1437 INNERJS
|
Line 1684 INNERJS
|
new => 'New', |
new => 'New', |
save => 'Save', |
save => 'Save', |
canc => 'Cancel', |
canc => 'Cancel', |
kehi => 'Keyword Highlight Options', |
|
txtc => 'Text Color', |
|
font => 'Font Size', |
|
fnst => 'Font Style', |
|
col1 => 'red', |
|
col2 => 'green', |
|
col3 => 'blue', |
|
siz1 => 'normal', |
|
siz2 => '+1', |
|
siz3 => '+2', |
|
sty1 => 'normal', |
|
sty2 => 'italic', |
|
sty3 => 'bold', |
|
); |
); |
|
&html_escape(\%html_js_lt); |
|
&js_escape(\%html_js_lt); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); |
|
|
//===================== Show list of keywords ==================== |
|
function keywords(formname) { |
|
var nret = prompt("$lt{'keyw'}",formname.keywords.value); |
|
if (nret==null) return; |
|
formname.keywords.value = nret; |
|
|
|
if (formname.keywords.value != "") { |
|
formname.refresh.value = "on"; |
|
formname.submit(); |
|
} |
|
return; |
|
} |
|
|
|
//===================== Script to view submitted by ================== |
//===================== Script to view submitted by ================== |
function viewSubmitter(submitter) { |
function viewSubmitter(submitter) { |
document.SCORE.refresh.value = "on"; |
document.SCORE.refresh.value = "on"; |
Line 1475 INNERJS
|
Line 1698 INNERJS
|
return; |
return; |
} |
} |
|
|
//===================== Script to add keyword(s) ================== |
|
function getSel() { |
|
if (document.getSelection) txt = document.getSelection(); |
|
else if (document.selection) txt = document.selection.createRange().text; |
|
else return; |
|
var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," "); |
|
if (cleantxt=="") { |
|
alert("$lt{'plse'}"); |
|
return; |
|
} |
|
var nret = prompt("$lt{'adds'}",cleantxt); |
|
if (nret==null) return; |
|
document.SCORE.keywords.value = document.SCORE.keywords.value+" "+nret; |
|
if (document.SCORE.keywords.value != "") { |
|
document.SCORE.refresh.value = "on"; |
|
document.SCORE.submit(); |
|
} |
|
return; |
|
} |
|
|
|
//====================== Script for composing message ============== |
//====================== Script for composing message ============== |
// preload images |
// preload images |
img1 = new Image(); |
img1 = new Image(); |
Line 1565 INNERJS
|
Line 1768 INNERJS
|
|
|
pDoc.write("<form action=\\"inactive\\" name=\\"msgcenter\\">"); |
pDoc.write("<form action=\\"inactive\\" name=\\"msgcenter\\">"); |
pDoc.write("<input value=\\""+usrctr+"\\" name=\\"usrctr\\" type=\\"hidden\\">"); |
pDoc.write("<input value=\\""+usrctr+"\\" name=\\"usrctr\\" type=\\"hidden\\">"); |
pDoc.write("<h1> $lt{'comp'}\"+fullname+\"<\\/h1>"); |
pDoc.write("<h1> $html_js_lt{'comp'}\"+fullname+\"<\\/h1>"); |
|
|
pDoc.write('<table style="border:1px solid black;"><tr>'); |
pDoc.write('<table style="border:1px solid black;"><tr>'); |
pDoc.write("<td><b>$lt{'incl'}<\\/b><\\/td><td><b>$lt{'type'}<\\/b><\\/td><td><b>$lt{'mesa'}<\\/td><\\/tr>"); |
pDoc.write("<td><b>$html_js_lt{'incl'}<\\/b><\\/td><td><b>$html_js_lt{'type'}<\\/b><\\/td><td><b>$html_js_lt{'mesa'}<\\/td><\\/tr>"); |
} |
} |
function displaySubject(msg,shwsel) { |
function displaySubject(msg,shwsel) { |
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.write("<tr>"); |
pDoc.write("<tr>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"subchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"subchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>"); |
pDoc.write("<td>$lt{'subj'}<\\/td>"); |
pDoc.write("<td>$html_js_lt{'subj'}<\\/td>"); |
pDoc.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"40\\" maxlength=\\"80\\"><\\/td><\\/tr>"); |
pDoc.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"40\\" maxlength=\\"80\\"><\\/td><\\/tr>"); |
} |
} |
|
|
Line 1590 INNERJS
|
Line 1793 INNERJS
|
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.write("<tr>"); |
pDoc.write("<tr>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"newmsgchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"newmsgchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>"); |
pDoc.write("<td align=\\"center\\">$lt{'new'}<\\/td>"); |
pDoc.write("<td align=\\"center\\">$html_js_lt{'new'}<\\/td>"); |
pDoc.write("<td><textarea name=\\"newmsg\\" cols=\\"60\\" rows=\\"3\\" onchange=\\"javascript:this.form.newmsgchk.checked=true\\" >"+newmsg+"<\\/textarea><\\/td><\\/tr>"); |
pDoc.write("<td><textarea name=\\"newmsg\\" cols=\\"60\\" rows=\\"3\\" onchange=\\"javascript:this.form.newmsgchk.checked=true\\" >"+newmsg+"<\\/textarea><\\/td><\\/tr>"); |
} |
} |
|
|
Line 1598 INNERJS
|
Line 1801 INNERJS
|
pDoc = pWin.document; |
pDoc = pWin.document; |
//pDoc.write("<\\/table>"); |
//pDoc.write("<\\/table>"); |
pDoc.write("<\\/td><\\/tr><\\/table> "); |
pDoc.write("<\\/td><\\/tr><\\/table> "); |
pDoc.write("<input type=\\"button\\" value=\\"$lt{'save'}\\" onclick=\\"javascript:checkInput()\\"> "); |
pDoc.write("<input type=\\"button\\" value=\\"$html_js_lt{'save'}\\" onclick=\\"javascript:checkInput()\\"> "); |
pDoc.write("<input type=\\"button\\" value=\\"$lt{'canc'}\\" onclick=\\"self.close()\\"><br /><br />"); |
pDoc.write("<input type=\\"button\\" value=\\"$html_js_lt{'canc'}\\" onclick=\\"self.close()\\"><br /><br />"); |
pDoc.write("<\\/form>"); |
pDoc.write("<\\/form>"); |
pDoc.write('$end_page_msg_central'); |
pDoc.write('$end_page_msg_central'); |
pDoc.close(); |
pDoc.close(); |
} |
} |
|
|
|
SUBJAVASCRIPT |
|
} |
|
|
|
#--- javascript for essay type problem -- |
|
sub sub_page_kw_js { |
|
my $request = shift; |
|
|
|
unless ($env{'form.compmsg'}) { |
|
&commonJSfunctions($request); |
|
} |
|
|
|
my $inner_js_highlight_central= (<<INNERJS); |
|
<script type="text/javascript"> |
|
function updateChoice(flag) { |
|
opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr); |
|
opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize); |
|
opener.document.SCORE.kwstyle.value = opener.radioSelection(document.hlCenter.kwdstyle); |
|
opener.document.SCORE.refresh.value = "on"; |
|
if (opener.document.SCORE.keywords.value!=""){ |
|
opener.document.SCORE.submit(); |
|
} |
|
self.close() |
|
} |
|
</script> |
|
INNERJS |
|
|
|
my $start_page_highlight_central = |
|
&Apache::loncommon::start_page('Highlight Central', |
|
$inner_js_highlight_central, |
|
{'js_ready' => 1, |
|
'only_body' => 1, |
|
'bgcolor' =>'#FFFFFF',}); |
|
my $end_page_highlight_central = |
|
&Apache::loncommon::end_page({'js_ready' => 1}); |
|
|
|
my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); |
|
$docopen=~s/^document\.//; |
|
|
|
my %js_lt = &Apache::lonlocal::texthash( |
|
keyw => 'Keywords list, separated by a space. Add/delete to list if desired.', |
|
plse => 'Please select a word or group of words from document and then click this link.', |
|
adds => 'Add selection to keyword list? Edit if desired.', |
|
col1 => 'red', |
|
col2 => 'green', |
|
col3 => 'blue', |
|
siz1 => 'normal', |
|
siz2 => '+1', |
|
siz3 => '+2', |
|
sty1 => 'normal', |
|
sty2 => 'italic', |
|
sty3 => 'bold', |
|
); |
|
my %html_js_lt = &Apache::lonlocal::texthash( |
|
save => 'Save', |
|
canc => 'Cancel', |
|
kehi => 'Keyword Highlight Options', |
|
txtc => 'Text Color', |
|
font => 'Font Size', |
|
fnst => 'Font Style', |
|
); |
|
&js_escape(\%js_lt); |
|
&html_escape(\%html_js_lt); |
|
&js_escape(\%html_js_lt); |
|
$request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); |
|
|
|
//===================== Show list of keywords ==================== |
|
function keywords(formname) { |
|
var nret = prompt("$js_lt{'keyw'}",formname.keywords.value); |
|
if (nret==null) return; |
|
formname.keywords.value = nret; |
|
|
|
if (formname.keywords.value != "") { |
|
formname.refresh.value = "on"; |
|
formname.submit(); |
|
} |
|
return; |
|
} |
|
|
|
//===================== Script to add keyword(s) ================== |
|
function getSel() { |
|
if (document.getSelection) txt = document.getSelection(); |
|
else if (document.selection) txt = document.selection.createRange().text; |
|
else return; |
|
if (typeof(txt) != 'string') { |
|
txt = String(txt); |
|
} |
|
var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," "); |
|
if (cleantxt=="") { |
|
alert("$js_lt{'plse'}"); |
|
return; |
|
} |
|
var nret = prompt("$js_lt{'adds'}",cleantxt); |
|
if (nret==null) return; |
|
document.SCORE.keywords.value = document.SCORE.keywords.value+" "+nret; |
|
if (document.SCORE.keywords.value != "") { |
|
document.SCORE.refresh.value = "on"; |
|
document.SCORE.submit(); |
|
} |
|
return; |
|
} |
|
|
//====================== Script for keyword highlight options ============== |
//====================== Script for keyword highlight options ============== |
function kwhighlight() { |
function kwhighlight() { |
var kwclr = document.SCORE.kwclr.value; |
var kwclr = document.SCORE.kwclr.value; |
Line 1613 INNERJS
|
Line 1917 INNERJS
|
var redsel = ""; |
var redsel = ""; |
var grnsel = ""; |
var grnsel = ""; |
var blusel = ""; |
var blusel = ""; |
var txtcol1 = "$lt{'col1'}"; |
var txtcol1 = "$js_lt{'col1'}"; |
var txtcol2 = "$lt{'col2'}"; |
var txtcol2 = "$js_lt{'col2'}"; |
var txtcol3 = "$lt{'col3'}"; |
var txtcol3 = "$js_lt{'col3'}"; |
var txtsiz1 = "$lt{'siz1'}"; |
var txtsiz1 = "$js_lt{'siz1'}"; |
var txtsiz2 = "$lt{'siz2'}"; |
var txtsiz2 = "$js_lt{'siz2'}"; |
var txtsiz3 = "$lt{'siz3'}"; |
var txtsiz3 = "$js_lt{'siz3'}"; |
var txtsty1 = "$lt{'sty1'}"; |
var txtsty1 = "$js_lt{'sty1'}"; |
var txtsty2 = "$lt{'sty2'}"; |
var txtsty2 = "$js_lt{'sty2'}"; |
var txtsty3 = "$lt{'sty3'}"; |
var txtsty3 = "$js_lt{'sty3'}"; |
if (kwclr=="red") {var redsel="checked='checked'"}; |
if (kwclr=="red") {var redsel="checked='checked'"}; |
if (kwclr=="green") {var grnsel="checked='checked'"}; |
if (kwclr=="green") {var grnsel="checked='checked'"}; |
if (kwclr=="blue") {var blusel="checked='checked'"}; |
if (kwclr=="blue") {var blusel="checked='checked'"}; |
Line 1658 INNERJS
|
Line 1962 INNERJS
|
hDoc.$docopen; |
hDoc.$docopen; |
hDoc.write('$start_page_highlight_central'); |
hDoc.write('$start_page_highlight_central'); |
hDoc.write("<form action=\\"inactive\\" name=\\"hlCenter\\">"); |
hDoc.write("<form action=\\"inactive\\" name=\\"hlCenter\\">"); |
hDoc.write("<h1>$lt{'kehi'}<\\/h1>"); |
hDoc.write("<h1>$html_js_lt{'kehi'}<\\/h1>"); |
|
|
hDoc.write('<table border="0" width="100%"><tr style="background-color:#A1D676">'); |
hDoc.write('<table border="0" width="100%"><tr style="background-color:#A1D676">'); |
hDoc.write("<th>$lt{'txtc'}<\\/th><th>$lt{'font'}<\\/th><th>$lt{'fnst'}<\\/th><\\/tr>"); |
hDoc.write("<th>$html_js_lt{'txtc'}<\\/th><th>$html_js_lt{'font'}<\\/th><th>$html_js_lt{'fnst'}<\\/th><\\/tr>"); |
} |
} |
|
|
function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { |
function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { |
Line 1679 INNERJS
|
Line 1983 INNERJS
|
function highlightend() { |
function highlightend() { |
var hDoc = hwdWin.document; |
var hDoc = hwdWin.document; |
hDoc.write("<\\/table><br \\/>"); |
hDoc.write("<\\/table><br \\/>"); |
hDoc.write("<input type=\\"button\\" value=\\"$lt{'save'}\\" onclick=\\"javascript:updateChoice(1)\\" \\/> "); |
hDoc.write("<input type=\\"button\\" value=\\"$html_js_lt{'save'}\\" onclick=\\"javascript:updateChoice(1)\\" \\/> "); |
hDoc.write("<input type=\\"button\\" value=\\"$lt{'canc'}\\" onclick=\\"self.close()\\" \\/><br /><br />"); |
hDoc.write("<input type=\\"button\\" value=\\"$html_js_lt{'canc'}\\" onclick=\\"self.close()\\" \\/><br /><br />"); |
hDoc.write("<\\/form>"); |
hDoc.write("<\\/form>"); |
hDoc.write('$end_page_highlight_central'); |
hDoc.write('$end_page_highlight_central'); |
hDoc.close(); |
hDoc.close(); |
Line 1795 sub gradeBox {
|
Line 2099 sub gradeBox {
|
|
|
sub handback_box { |
sub handback_box { |
my ($symb,$uname,$udom,$counter,$partid,$record,$res_error_pointer) = @_; |
my ($symb,$uname,$udom,$counter,$partid,$record,$res_error_pointer) = @_; |
my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error_pointer); |
my ($partlist,$handgrade,$responseType,$numresp,$numessay) = &response_type($symb,$res_error_pointer); |
|
return unless ($numessay); |
my (@respids); |
my (@respids); |
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id = &flatten_responseType($responseType); |
foreach my $part_response_id (@part_response_id) { |
foreach my $part_response_id (@part_response_id) { |
Line 1814 sub handback_box {
|
Line 2119 sub handback_box {
|
if ($file =~ /\/portfolio\//) { |
if ($file =~ /\/portfolio\//) { |
$file_counter++; |
$file_counter++; |
my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|); |
my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|); |
my ($name,$version,$ext) = &file_name_version_ext($file_disp); |
my ($name,$version,$ext) = &Apache::lonnet::file_name_version_ext($file_disp); |
$file_disp = "$name.$ext"; |
$file_disp = "$name.$ext"; |
$file = $file_path.$file_disp; |
$file = $file_path.$file_disp; |
$result.=&mt('Return commented version of [_1] to student.', |
$result.=&mt('Return commented version of [_1] to student.', |
Line 1897 sub show_problem {
|
Line 2202 sub show_problem {
|
sub files_exist { |
sub files_exist { |
my ($r, $symb) = @_; |
my ($r, $symb) = @_; |
my @students = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
my @students = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
|
|
foreach my $student (@students) { |
foreach my $student (@students) { |
my ($uname,$udom,$fullname) = split(/:/,$student); |
my ($uname,$udom,$fullname) = split(/:/,$student); |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'}, |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'}, |
Line 1917 sub files_exist {
|
Line 2221 sub files_exist {
|
sub download_all_link { |
sub download_all_link { |
my ($r,$symb) = @_; |
my ($r,$symb) = @_; |
unless (&files_exist($r, $symb)) { |
unless (&files_exist($r, $symb)) { |
$r->print(&mt('There are currently no submitted documents.')); |
$r->print(&mt('There are currently no submitted documents.')); |
return; |
return; |
} |
} |
|
|
my $all_students = |
my $all_students = |
join("\n", &Apache::loncommon::get_env_multiple('form.stuinfo')); |
join("\n", &Apache::loncommon::get_env_multiple('form.stuinfo')); |
|
|
Line 1939 sub download_all_link {
|
Line 2242 sub download_all_link {
|
sub submit_download_link { |
sub submit_download_link { |
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
if (!$symb) { return ''; } |
if (!$symb) { return ''; } |
#FIXME: Figure out which type of problem this is and provide appropriate download |
my $res_error; |
&download_all_link($request,$symb); |
my ($partlist,$handgrade,$responseType,$numresp,$numessay,$numdropbox) = |
|
&response_type($symb,\$res_error); |
|
if ($res_error) { |
|
$request->print(&mt('An error occurred retrieving response types')); |
|
return; |
|
} |
|
unless ($numessay) { |
|
$request->print(&mt('No essayresponse items found')); |
|
return; |
|
} |
|
my @chosenparts = &Apache::loncommon::get_env_multiple('form.vPart'); |
|
if (@chosenparts) { |
|
$request->print(&showResourceInfo($symb,$partlist,$responseType, |
|
undef,undef,1)); |
|
} |
|
if ($numessay) { |
|
my $submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'}; |
|
my $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'}; |
|
my $getgroup = $env{'form.group'} eq '' ? 'all' : $env{'form.group'}; |
|
(undef,undef,my $fullname) = &getclasslist($getsec,1,$getgroup,$symb,$submitonly,1); |
|
if (ref($fullname) eq 'HASH') { |
|
my @students = map { $_.':'.$fullname->{$_} } (keys(%{$fullname})); |
|
if (@students) { |
|
@{$env{'form.stuinfo'}} = @students; |
|
if ($numdropbox) { |
|
&download_all_link($request,$symb); |
|
} else { |
|
$request->print(&mt('No essayrespose items with dropbox found')); |
|
} |
|
# FIXME Need a mechanism to download essays, i.e., if $numessay > $numdropbox |
|
# Needs to omit user's identity if resource instance is for an anonymous survey. |
|
} else { |
|
$request->print(&mt('No students match the criteria you selected')); |
|
} |
|
} else { |
|
$request->print(&mt('Could not retrieve student information')); |
|
} |
|
} else { |
|
$request->print(&mt('No essayresponse items found')); |
|
} |
|
return; |
} |
} |
|
|
sub build_section_inputs { |
sub build_section_inputs { |
Line 1958 sub build_section_inputs {
|
Line 2301 sub build_section_inputs {
|
|
|
# --------------------------- show submissions of a student, option to grade |
# --------------------------- show submissions of a student, option to grade |
sub submission { |
sub submission { |
my ($request,$counter,$total,$symb) = @_; |
my ($request,$counter,$total,$symb,$divforres,$calledby) = @_; |
my ($uname,$udom) = ($env{'form.student'},$env{'form.userdom'}); |
my ($uname,$udom) = ($env{'form.student'},$env{'form.userdom'}); |
$udom = ($udom eq '' ? $env{'user.domain'} : $udom); #has form.userdom changed for a student? |
$udom = ($udom eq '' ? $env{'user.domain'} : $udom); #has form.userdom changed for a student? |
my $usec = &Apache::lonnet::getsection($udom,$uname,$env{'request.course.id'}); |
my $usec = &Apache::lonnet::getsection($udom,$uname,$env{'request.course.id'}); |
$env{'form.fullname'} = &Apache::loncommon::plainname($uname,$udom,'lastname') if $env{'form.fullname'} eq ''; |
$env{'form.fullname'} = &Apache::loncommon::plainname($uname,$udom,'lastname') if $env{'form.fullname'} eq ''; |
|
|
my $probtitle=&Apache::lonnet::gettitle($symb); |
|
if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; } |
if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; } |
|
my $probtitle=&Apache::lonnet::gettitle($symb); |
|
my $is_tool = ($symb =~ /ext\.tool$/); |
|
my ($essayurl,%coursedesc_by_cid); |
|
|
if (!&canview($usec)) { |
if (!&canview($usec)) { |
$request->print( |
$request->print( |
Line 1977 sub submission {
|
Line 2322 sub submission {
|
return; |
return; |
} |
} |
|
|
|
my $res_error; |
|
my ($partlist,$handgrade,$responseType,$numresp,$numessay) = |
|
&response_type($symb,\$res_error); |
|
if ($res_error) { |
|
$request->print(&navmap_errormsg()); |
|
return; |
|
} |
|
|
if (!$env{'form.lastSub'}) { $env{'form.lastSub'} = 'datesub'; } |
if (!$env{'form.lastSub'}) { $env{'form.lastSub'} = 'datesub'; } |
if (!$env{'form.vProb'}) { $env{'form.vProb'} = 'yes'; } |
unless ($is_tool) { |
if (!$env{'form.vAns'}) { $env{'form.vAns'} = 'yes'; } |
if (!$env{'form.vProb'}) { $env{'form.vProb'} = 'yes'; } |
|
if (!$env{'form.vAns'}) { $env{'form.vAns'} = 'yes'; } |
|
} |
|
if (($numessay) && ($calledby eq 'submission') && (!exists($env{'form.compmsg'}))) { |
|
$env{'form.compmsg'} = 1; |
|
} |
my $last = ($env{'form.lastSub'} eq 'last' ? 'last' : ''); |
my $last = ($env{'form.lastSub'} eq 'last' ? 'last' : ''); |
my $checkIcon = '<img alt="'.&mt('Check Mark'). |
my $checkIcon = '<img alt="'.&mt('Check Mark'). |
'" src="'.$request->dir_config('lonIconsURL'). |
'" src="'.$request->dir_config('lonIconsURL'). |
Line 1987 sub submission {
|
Line 2345 sub submission {
|
|
|
# header info |
# header info |
if ($counter == 0) { |
if ($counter == 0) { |
|
my @chosenparts = &Apache::loncommon::get_env_multiple('form.vPart'); |
|
if (@chosenparts) { |
|
$request->print(&showResourceInfo($symb,$partlist,$responseType,'gradesub')); |
|
} elsif ($divforres) { |
|
$request->print('<div style="padding:0;clear:both;margin:0;border:0"></div>'); |
|
} else { |
|
$request->print('<br clear="all" />'); |
|
} |
&sub_page_js($request); |
&sub_page_js($request); |
&sub_page_kw_js($request); |
&sub_grademessage_js($request) if ($env{'form.compmsg'}); |
|
&sub_page_kw_js($request) if ($numessay); |
|
|
# option to display problem, only once else it cause problems |
# option to display problem, only once else it cause problems |
# with the form later since the problem has a form. |
# with the form later since the problem has a form. |
Line 2005 sub submission {
|
Line 2372 sub submission {
|
$request->print(&show_problem($request,$symb,$uname,$udom,0,1,$mode)); |
$request->print(&show_problem($request,$symb,$uname,$udom,0,1,$mode)); |
} |
} |
|
|
# kwclr is the only variable that is guaranteed not to be blank |
|
# if this subroutine has been called once. |
|
my %keyhash = (); |
my %keyhash = (); |
# if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') { |
if (($env{'form.kwclr'} eq '' && $numessay) || ($env{'form.compmsg'})) { |
if (1) { |
|
%keyhash = &Apache::lonnet::dump('nohist_handgrade', |
%keyhash = &Apache::lonnet::dump('nohist_handgrade', |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}); |
$env{'course.'.$env{'request.course.id'}.'.num'}); |
|
} |
|
# kwclr is the only variable that is guaranteed not to be blank |
|
# if this subroutine has been called once. |
|
if ($env{'form.kwclr'} eq '' && $numessay) { |
my $loginuser = $env{'user.name'}.':'.$env{'user.domain'}; |
my $loginuser = $env{'user.name'}.':'.$env{'user.domain'}; |
$env{'form.keywords'} = $keyhash{$symb.'_keywords'} ne '' ? $keyhash{$symb.'_keywords'} : ''; |
$env{'form.keywords'} = $keyhash{$symb.'_keywords'} ne '' ? $keyhash{$symb.'_keywords'} : ''; |
$env{'form.kwclr'} = $keyhash{$loginuser.'_kwclr'} ne '' ? $keyhash{$loginuser.'_kwclr'} : 'red'; |
$env{'form.kwclr'} = $keyhash{$loginuser.'_kwclr'} ne '' ? $keyhash{$loginuser.'_kwclr'} : 'red'; |
$env{'form.kwsize'} = $keyhash{$loginuser.'_kwsize'} ne '' ? $keyhash{$loginuser.'_kwsize'} : '0'; |
$env{'form.kwsize'} = $keyhash{$loginuser.'_kwsize'} ne '' ? $keyhash{$loginuser.'_kwsize'} : '0'; |
$env{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : ''; |
$env{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : ''; |
$env{'form.msgsub'} = $keyhash{$symb.'_subject'} ne '' ? |
} |
|
if ($env{'form.compmsg'}) { |
|
$env{'form.msgsub'} = $keyhash{$symb.'_subject'} ne '' ? |
$keyhash{$symb.'_subject'} : $probtitle; |
$keyhash{$symb.'_subject'} : $probtitle; |
$env{'form.savemsgN'} = $keyhash{$symb.'_savemsgN'} ne '' ? $keyhash{$symb.'_savemsgN'} : '0'; |
$env{'form.savemsgN'} = $keyhash{$symb.'_savemsgN'} ne '' ? $keyhash{$symb.'_savemsgN'} : '0'; |
} |
} |
|
|
my $overRideScore = $env{'form.overRideScore'} eq '' ? 'no' : $env{'form.overRideScore'}; |
my $overRideScore = $env{'form.overRideScore'} eq '' ? 'no' : $env{'form.overRideScore'}; |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
$request->print('<form action="/adm/grades" method="post" name="SCORE" enctype="multipart/form-data">'."\n". |
$request->print('<form action="/adm/grades" method="post" name="SCORE" enctype="multipart/form-data">'."\n". |
Line 2036 sub submission {
|
Line 2406 sub submission {
|
'<input type="hidden" name="vProb" value="'.$env{'form.vProb'}.'" />'."\n". |
'<input type="hidden" name="vProb" value="'.$env{'form.vProb'}.'" />'."\n". |
'<input type="hidden" name="vAns" value="'.$env{'form.vAns'}.'" />'."\n". |
'<input type="hidden" name="vAns" value="'.$env{'form.vAns'}.'" />'."\n". |
'<input type="hidden" name="lastSub" value="'.$env{'form.lastSub'}.'" />'."\n". |
'<input type="hidden" name="lastSub" value="'.$env{'form.lastSub'}.'" />'."\n". |
|
'<input type="hidden" name="compmsg" value="'.$env{'form.compmsg'}.'" />'."\n". |
&build_section_inputs(). |
&build_section_inputs(). |
'<input type="hidden" name="submitonly" value="'.$env{'form.submitonly'}.'" />'."\n". |
'<input type="hidden" name="submitonly" value="'.$env{'form.submitonly'}.'" />'."\n". |
'<input type="hidden" name="NCT"'. |
'<input type="hidden" name="NCT"'. |
' value="'.($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : $total+1).'" />'."\n"); |
' value="'.($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : $total+1).'" />'."\n"); |
# if ($env{'form.handgrade'} eq 'yes') { |
if ($env{'form.compmsg'}) { |
if (1) { |
$request->print('<input type="hidden" name="msgsub" value="'.$env{'form.msgsub'}.'" />'."\n". |
|
'<input type="hidden" name="shownSub" value="0" />'."\n". |
|
'<input type="hidden" name="savemsgN" value="'.$env{'form.savemsgN'}.'" />'."\n"); |
|
} |
|
if ($numessay) { |
$request->print('<input type="hidden" name="keywords" value="'.$env{'form.keywords'}.'" />'."\n". |
$request->print('<input type="hidden" name="keywords" value="'.$env{'form.keywords'}.'" />'."\n". |
'<input type="hidden" name="kwclr" value="'.$env{'form.kwclr'}.'" />'."\n". |
'<input type="hidden" name="kwclr" value="'.$env{'form.kwclr'}.'" />'."\n". |
'<input type="hidden" name="kwsize" value="'.$env{'form.kwsize'}.'" />'."\n". |
'<input type="hidden" name="kwsize" value="'.$env{'form.kwsize'}.'" />'."\n". |
'<input type="hidden" name="kwstyle" value="'.$env{'form.kwstyle'}.'" />'."\n". |
'<input type="hidden" name="kwstyle" value="'.$env{'form.kwstyle'}.'" />'."\n"); |
'<input type="hidden" name="msgsub" value="'.$env{'form.msgsub'}.'" />'."\n". |
|
'<input type="hidden" name="shownSub" value="0" />'."\n". |
|
'<input type="hidden" name="savemsgN" value="'.$env{'form.savemsgN'}.'" />'."\n"); |
|
foreach my $partid (&Apache::loncommon::get_env_multiple('form.vPart')) { |
|
$request->print('<input type="hidden" name="vPart" value="'.$partid.'" />'."\n"); |
|
} |
|
} |
} |
|
|
my ($cts,$prnmsg) = (1,''); |
my ($cts,$prnmsg) = (1,''); |
while ($cts <= $env{'form.savemsgN'}) { |
while ($cts <= $env{'form.savemsgN'}) { |
$prnmsg.='<input type="hidden" name="savemsg'.$cts.'" value="'. |
$prnmsg.='<input type="hidden" name="savemsg'.$cts.'" value="'. |
Line 2066 sub submission {
|
Line 2435 sub submission {
|
} |
} |
$request->print($prnmsg); |
$request->print($prnmsg); |
|
|
# if ($env{'form.handgrade'} eq 'yes') { |
if ($numessay) { |
if (1) { |
|
|
|
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
keyh => 'Keyword Highlighting for Essays', |
keyh => 'Keyword Highlighting for Essays', |
Line 2075 sub submission {
|
Line 2443 sub submission {
|
list => 'List', |
list => 'List', |
past => 'Paste Selection to List', |
past => 'Paste Selection to List', |
high => 'Highlight Attribute', |
high => 'Highlight Attribute', |
); |
); |
# |
# |
# Print out the keyword options line |
# Print out the keyword options line |
# |
# |
Line 2094 sub submission {
|
Line 2462 sub submission {
|
# |
# |
# Load the other essays for similarity check |
# Load the other essays for similarity check |
# |
# |
my (undef,undef,$essayurl) = &Apache::lonnet::decode_symb($symb); |
(undef,undef,$essayurl) = &Apache::lonnet::decode_symb($symb); |
my ($adom,$aname,$apath)=($essayurl=~/^($LONCAPA::domain_re)\/($LONCAPA::username_re)\/(.*)$/); |
if ($essayurl eq 'lib/templates/simpleproblem.problem') { |
$apath=&escape($apath); |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
$apath=~s/\W/\_/gs; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
&init_old_essays($symb,$apath,$adom,$aname); |
if ($cdom ne '' && $cnum ne '') { |
|
my ($map,$id,$res) = &Apache::lonnet::decode_symb($symb); |
|
if ($map =~ m{^\Quploaded/$cdom/$cnum/\E(default(?:|_\d+)\.(?:sequence|page))$}) { |
|
my $apath = $1.'_'.$id; |
|
$apath=~s/\W/\_/gs; |
|
&init_old_essays($symb,$apath,$cdom,$cnum); |
|
} |
|
} |
|
} else { |
|
my ($adom,$aname,$apath)=($essayurl=~/^($LONCAPA::domain_re)\/($LONCAPA::username_re)\/(.*)$/); |
|
$apath=&escape($apath); |
|
$apath=~s/\W/\_/gs; |
|
&init_old_essays($symb,$apath,$adom,$aname); |
|
} |
} |
} |
} |
} |
|
|
Line 2142 sub submission {
|
Line 2523 sub submission {
|
} |
} |
|
|
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$udom,$uname); |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$udom,$uname); |
my $res_error; |
|
my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error); |
|
if ($res_error) { |
|
$request->print(&navmap_errormsg()); |
|
return; |
|
} |
|
|
|
# Display student info |
# Display student info |
$request->print(($counter == 0 ? '' : '<br />')); |
$request->print(($counter == 0 ? '' : '<br />')); |
|
|
|
my $boxtitle = &mt('Submissions'); |
|
if ($is_tool) { |
|
$boxtitle = &mt('Transactions') |
|
} |
my $result='<div class="LC_Box">' |
my $result='<div class="LC_Box">' |
.'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>'; |
.'<h3 class="LC_hcell">'.$boxtitle.'</h3>'; |
$result.='<input type="hidden" name="name'.$counter. |
$result.='<input type="hidden" name="name'.$counter. |
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
# if ($env{'form.handgrade'} eq 'no') { |
if (($numresp > $numessay) && !$is_tool) { |
if (1) { |
|
$result.='<p class="LC_info">' |
$result.='<p class="LC_info">' |
.&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon) |
.&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon) |
."</p>\n"; |
."</p>\n"; |
} |
} |
|
|
# If any part of the problem is an essay-response (handgraded), then check for collaborators |
# If any part of the problem is an essayresponse, then check for collaborators |
my $fullname; |
my $fullname; |
my $col_fullnames = []; |
my $col_fullnames = []; |
# if ($env{'form.handgrade'} eq 'yes') { |
if ($numessay) { |
if (1) { |
|
(my $sub_result,$fullname,$col_fullnames)= |
(my $sub_result,$fullname,$col_fullnames)= |
&check_collaborators($symb,$uname,$udom,\%record,$handgrade, |
&check_collaborators($symb,$uname,$udom,\%record,$handgrade, |
$counter); |
$counter); |
$result.=$sub_result; |
$result.=$sub_result; |
} |
} |
$request->print($result."\n"); |
$request->print($result."\n"); |
|
|
# print student answer/submission |
# print student answer/submission |
# Options are (1) Handgraded submission only |
# Options are (1) Last submission only |
# (2) Last submission, includes submission that is not handgraded |
# (2) Last submission (with detailed information for that submission) |
# (for multi-response type part) |
# (3) All transactions (by date) |
# (3) Last submission plus the parts info |
# (4) The whole record (with detailed information for all transactions) |
# (4) The whole record for this student |
|
|
my ($string,$timestamp)= &get_last_submission(\%record,$is_tool); |
my ($string,$timestamp)= &get_last_submission(\%record); |
|
|
|
my $lastsubonly; |
my $lastsubonly; |
|
|
if ($$timestamp eq '') { |
if ($$timestamp eq '') { |
$lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; |
$lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; |
|
} elsif ($is_tool) { |
|
$lastsubonly = |
|
'<div class="LC_grade_submissions_body">' |
|
.'<b>'.&mt('Date Grade Passed Back:').'</b> '.$$timestamp."</div>\n"; |
} else { |
} else { |
$lastsubonly = |
$lastsubonly = |
'<div class="LC_grade_submissions_body">' |
'<div class="LC_grade_submissions_body">' |
Line 2196 sub submission {
|
Line 2576 sub submission {
|
my %seenparts; |
my %seenparts; |
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id = &flatten_responseType($responseType); |
foreach my $part (@part_response_id) { |
foreach my $part (@part_response_id) { |
next if ($env{'form.lastSub'} eq 'hdgrade' |
|
&& $$handgrade{$$part[0].'_'.$$part[1]} ne 'yes'); |
|
|
|
my ($partid,$respid) = @{ $part }; |
my ($partid,$respid) = @{ $part }; |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
if ($env{"form.$uname:$udom:$partid:submitted_by"}) { |
if ($env{"form.$uname:$udom:$partid:submitted_by"}) { |
Line 2213 sub submission {
|
Line 2590 sub submission {
|
$$fullname{$env{"form.$uname:$udom:$partid:submitted_by"}}.'</a>'). |
$$fullname{$env{"form.$uname:$udom:$partid:submitted_by"}}.'</a>'). |
'<br />'); |
'<br />'); |
next; |
next; |
} |
} |
my $responsetype = $responseType->{$partid}->{$respid}; |
my $responsetype = $responseType->{$partid}->{$respid}; |
if (!exists($record{"resource.$partid.$respid.submission"})) { |
if (!exists($record{"resource.$partid.$respid.submission"})) { |
$lastsubonly.="\n".'<div class="LC_grade_submission_part">'. |
$lastsubonly.="\n".'<div class="LC_grade_submission_part">'. |
Line 2227 sub submission {
|
Line 2604 sub submission {
|
foreach my $submission (@$string) { |
foreach my $submission (@$string) { |
my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/); |
my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/); |
if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; } |
if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; } |
my ($ressub,$hide,$subval) = split(/:/,$submission,3); |
my ($ressub,$hide,$draft,$subval) = split(/:/,$submission,4); |
# Similarity check |
# Similarity check |
my $similar=''; |
my $similar=''; |
my ($type,$trial,$rndseed); |
my ($type,$trial,$rndseed); |
Line 2237 sub submission {
|
Line 2614 sub submission {
|
$rndseed = $record{"resource.$partid.rndseed"}; |
$rndseed = $record{"resource.$partid.rndseed"}; |
} |
} |
if ($env{'form.checkPlag'}) { |
if ($env{'form.checkPlag'}) { |
my ($oname,$odom,$ocrsid,$oessay,$osim)= |
my ($oname,$odom,$ocrsid,$oessay,$osim)= |
&most_similar($uname,$udom,$symb,$subval); |
&most_similar($uname,$udom,$symb,$subval); |
if ($osim) { |
if ($osim) { |
$osim=int($osim*100.0); |
$osim=int($osim*100.0); |
my %old_course_desc = |
|
&Apache::lonnet::coursedescription($ocrsid, |
|
{'one_time' => 1}); |
|
|
|
if ($hide eq 'anon') { |
if ($hide eq 'anon') { |
$similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'. |
$similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'. |
&mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />'; |
&mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />'; |
} else { |
} else { |
$similar="<hr /><h3><span class=\"LC_warning\">". |
$similar='<hr />'; |
&mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', |
if ($essayurl eq 'lib/templates/simpleproblem.problem') { |
$osim, |
$similar .= '<h3><span class="LC_warning">'. |
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', |
&mt('Essay is [_1]% similar to an essay by [_2]', |
$old_course_desc{'description'}, |
$osim, |
$old_course_desc{'num'}, |
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')'). |
$old_course_desc{'domain'}). |
'</span></h3>'; |
'</span></h3><blockquote><i>'. |
} else { |
&keywords_highlight($oessay). |
my %old_course_desc; |
'</i></blockquote><hr />'; |
if ($ocrsid ne '') { |
|
if (ref($coursedesc_by_cid{$ocrsid}) eq 'HASH') { |
|
%old_course_desc = %{$coursedesc_by_cid{$ocrsid}}; |
|
} else { |
|
my $args; |
|
if ($ocrsid ne $env{'request.course.id'}) { |
|
$args = {'one_time' => 1}; |
|
} |
|
%old_course_desc = |
|
&Apache::lonnet::coursedescription($ocrsid,$args); |
|
$coursedesc_by_cid{$ocrsid} = \%old_course_desc; |
|
} |
|
$similar .= |
|
'<h3><span class="LC_warning">'. |
|
&mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', |
|
$osim, |
|
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', |
|
$old_course_desc{'description'}, |
|
$old_course_desc{'num'}, |
|
$old_course_desc{'domain'}). |
|
'</span></h3>'; |
|
} else { |
|
$similar .= |
|
'<h3><span class="LC_warning">'. |
|
&mt('Essay is [_1]% similar to an essay by [_2] in an unknown course', |
|
$osim, |
|
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')'). |
|
'</span></h3>'; |
|
} |
|
} |
|
$similar .= '<blockquote><i>'. |
|
&keywords_highlight($oessay). |
|
'</i></blockquote><hr />'; |
} |
} |
} |
} |
} |
} |
my $order=&get_order($partid,$respid,$symb,$uname,$udom, |
my $order=&get_order($partid,$respid,$symb,$uname,$udom, |
undef,$type,$trial,$rndseed); |
undef,$type,$trial,$rndseed); |
if ($env{'form.lastSub'} eq 'lastonly' || $env{'form.lastSub'} eq 'datesub' || $env{'form.lastSub'} =~ /^(last|all)$/ || ($env{'form.lastSub'} eq 'hdgrade' && |
if (($env{'form.lastSub'} eq 'lastonly') || |
$$handgrade{$$part[0].'_'.$$part[1]} eq 'yes')) { |
($env{'form.lastSub'} eq 'datesub') || |
|
($env{'form.lastSub'} =~ /^(last|all)$/)) { |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
$lastsubonly.='<div class="LC_grade_submission_part">'. |
$lastsubonly.='<div class="LC_grade_submission_part">'. |
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
Line 2273 sub submission {
|
Line 2679 sub submission {
|
'('.&mt('Response ID: [_1]',$respid).')'. |
'('.&mt('Response ID: [_1]',$respid).')'. |
'</span> '; |
'</span> '; |
my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record); |
my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record); |
|
|
if (@$files) { |
if (@$files) { |
if ($hide eq 'anon') { |
if ($hide eq 'anon') { |
$lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files})); |
$lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files})); |
Line 2285 sub submission {
|
Line 2690 sub submission {
|
} else { |
} else { |
$lastsubonly .= &mt('Like all files provided by users, these files may contain viruses!'); |
$lastsubonly .= &mt('Like all files provided by users, these files may contain viruses!'); |
} |
} |
$lastsubonly .= '</span>'; |
$lastsubonly .= '</span>'; |
foreach my $file (@$files) { |
foreach my $file (@$files) { |
&Apache::lonnet::allowuploaded('/adm/grades',$file); |
&Apache::lonnet::allowuploaded('/adm/grades',$file); |
$lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" alt="" /> '.$file.'</a>'; |
$lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" alt="" /> '.$file.'</a>'; |
Line 2296 sub submission {
|
Line 2701 sub submission {
|
if ($hide eq 'anon') { |
if ($hide eq 'anon') { |
$lastsubonly.='<br /><b>'.&mt('Anonymous Survey').'</b>'; |
$lastsubonly.='<br /><b>'.&mt('Anonymous Survey').'</b>'; |
} else { |
} else { |
$lastsubonly.='<br /><b>'.&mt('Submitted Answer:').' </b>'. |
$lastsubonly.='<br /><b>'.&mt('Submitted Answer:').' </b>'; |
|
if ($draft) { |
|
$lastsubonly.= ' <span class="LC_warning">'.&mt('Draft Copy').'</span>'; |
|
} |
|
$subval = |
&cleanRecord($subval,$responsetype,$symb,$partid, |
&cleanRecord($subval,$responsetype,$symb,$partid, |
$respid,\%record,$order,undef,$uname,$udom,$type,$trial,$rndseed); |
$respid,\%record,$order,undef,$uname,$udom,$type,$trial,$rndseed); |
|
if ($responsetype eq 'essay') { |
|
$subval =~ s{\n}{<br />}g; |
|
} |
|
$lastsubonly.=$subval."\n"; |
} |
} |
if ($similar) {$lastsubonly.="<br /><br />$similar\n";} |
if ($similar) {$lastsubonly.="<br /><br />$similar\n";} |
$lastsubonly.='</div>'; |
$lastsubonly.='</div>'; |
} |
} |
} |
} |
Line 2311 sub submission {
|
Line 2724 sub submission {
|
if ($env{'form.lastSub'} eq 'datesub') { |
if ($env{'form.lastSub'} eq 'datesub') { |
my ($parts,$handgrade,$responseType) = &response_type($symb,\$res_error); |
my ($parts,$handgrade,$responseType) = &response_type($symb,\$res_error); |
$request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom)); |
$request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom)); |
|
} |
} |
|
if ($env{'form.lastSub'} =~ /^(last|all)$/) { |
if ($env{'form.lastSub'} =~ /^(last|all)$/) { |
|
my $identifier = (&canmodify($usec)? $counter : ''); |
$request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, |
$request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, |
$env{'request.course.id'}, |
$env{'request.course.id'}, |
$last,'.submission', |
$last,'.submission', |
'Apache::grades::keywords_highlight')); |
'Apache::grades::keywords_highlight', |
|
$usec,$identifier)); |
} |
} |
$request->print('<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':' |
$request->print('<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':' |
.$udom.'" />'."\n"); |
.$udom.'" />'."\n"); |
Line 2329 sub submission {
|
Line 2743 sub submission {
|
$request->print('</div>'."\n"); |
$request->print('</div>'."\n"); |
} |
} |
|
|
# essay grading message center |
# grading message center |
# if ($env{'form.handgrade'} eq 'yes') { |
|
if (1) { |
if ($env{'form.compmsg'}) { |
my $result='<div class="LC_grade_message_center">'; |
my $result='<div class="LC_Box">'. |
|
'<h3 class="LC_hcell">'.&mt('Send Message').'</h3>'. |
$result.='<div class="LC_grade_message_center_header">'. |
'<div class="LC_grade_message_center_body">'; |
&mt('Send Message').'</div><div class="LC_grade_message_center_body">'; |
my ($lastname,$givenn) = split(/,/,$env{'form.fullname'}); |
my ($lastname,$givenn) = split(/,/,$env{'form.fullname'}); |
my $msgfor = $givenn.' '.$lastname; |
my $msgfor = $givenn.' '.$lastname; |
if (scalar(@$col_fullnames) > 0) { |
if (scalar(@$col_fullnames) > 0) { |
my $lastone = pop(@$col_fullnames); |
my $lastone = pop(@$col_fullnames); |
$msgfor .= ', '.(join ', ',@$col_fullnames).' and '.$lastone.'.'; |
$msgfor .= ', '.(join ', ',@$col_fullnames).' and '.$lastone.'.'; |
} |
} |
$msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript |
$msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript |
$result.='<input type="hidden" name="includemsg'.$counter.'" value="" />'."\n". |
$result.='<input type="hidden" name="includemsg'.$counter.'" value="" />'."\n". |
'<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n". |
'<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n"; |
' <a href="javascript:msgCenter(document.SCORE,'.$counter. |
$result.=' <a href="javascript:msgCenter(document.SCORE,'.$counter. |
',\''.$msgfor.'\');" target="_self">'. |
',\''.$msgfor.'\');" target="_self">'. |
&mt('Compose message to student'.(scalar(@$col_fullnames) >= 1 ? 's' : '')).'</a><label> ('. |
&mt('Compose message to student'.(scalar(@$col_fullnames) >= 1 ? 's' : '')).'</a><label> ('. |
&mt('incl. grades').' <input type="checkbox" name="withgrades'.$counter.'" /></label>)'. |
&mt('incl. grades').' <input type="checkbox" name="withgrades'.$counter.'" /></label>)'. |
' <img src="'.$request->dir_config('lonIconsURL'). |
' <img src="'.$request->dir_config('lonIconsURL'). |
'/mailbkgrd.gif" width="14" height="10" alt="" name="mailicon'.$counter.'" />'."\n". |
'/mailbkgrd.gif" width="14" height="10" alt="" name="mailicon'.$counter.'" />'."\n". |
'<br /> ('. |
'<br /> ('. |
&mt('Message will be sent when you click on Save & Next below.').")\n". |
&mt('Message will be sent when you click on Save & Next below.').")\n"; |
'</div></div>'; |
$result.='</div></div>'; |
$request->print($result); |
$request->print($result); |
|
} |
} |
|
|
my %seen = (); |
my %seen = (); |
my @partlist; |
my @partlist; |
my @gradePartRespid; |
my @gradePartRespid; |
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id; |
|
if ($is_tool) { |
|
@part_response_id = ([0,'']); |
|
} else { |
|
@part_response_id = &flatten_responseType($responseType); |
|
} |
$request->print( |
$request->print( |
'<div class="LC_Box">' |
'<div class="LC_Box">' |
.'<h3 class="LC_hcell">'.&mt('Assign Grades').'</h3>' |
.'<h3 class="LC_hcell">'.&mt('Assign Grades').'</h3>' |
Line 2371 sub submission {
|
Line 2789 sub submission {
|
my $part_resp = join('_',@{ $part_response_id }); |
my $part_resp = join('_',@{ $part_response_id }); |
next if ($seen{$partid} > 0); |
next if ($seen{$partid} > 0); |
$seen{$partid}++; |
$seen{$partid}++; |
next if ($$handgrade{$part_resp} ne 'yes' |
|
&& $env{'form.lastSub'} eq 'hdgrade'); |
|
push(@partlist,$partid); |
push(@partlist,$partid); |
push(@gradePartRespid,$partid.'.'.$respid); |
push(@gradePartRespid,$partid.'.'.$respid); |
$request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record)); |
$request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record)); |
Line 2486 sub check_collaborators {
|
Line 2902 sub check_collaborators {
|
|
|
#--- Retrieve the last submission for all the parts |
#--- Retrieve the last submission for all the parts |
sub get_last_submission { |
sub get_last_submission { |
my ($returnhash)=@_; |
my ($returnhash,$is_tool)=@_; |
my (@string,$timestamp,%lasthidden); |
my (@string,$timestamp,%lasthidden); |
if ($$returnhash{'version'}) { |
if ($$returnhash{'version'}) { |
my %lasthash=(); |
my %lasthash=(); |
Line 2536 sub get_last_submission {
|
Line 2952 sub get_last_submission {
|
} |
} |
unless ($hide) { |
unless ($hide) { |
if (@randomize) { |
if (@randomize) { |
foreach my $id (@hidden) { |
foreach my $id (@randomize) { |
if ($key =~ /^\Q$id\E/) { |
if ($key =~ /^\Q$id\E/) { |
$hide = 'rand'; |
$hide = 'rand'; |
last; |
last; |
Line 2545 sub get_last_submission {
|
Line 2961 sub get_last_submission {
|
} |
} |
} |
} |
my ($partid,$foo) = split(/submission$/,$key); |
my ($partid,$foo) = split(/submission$/,$key); |
my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ? |
my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ? 1 : 0; |
'<span class="LC_warning">'.&mt('Draft Copy').'</span> ' : ''; |
push(@string, join(':', $key, $hide, $draft, ( |
#push(@string, join(':', $key, $hide, $draft.$lasthash{$key})); |
|
push(@string, join(':', $key, $hide, $draft.( |
|
ref($lasthash{$key}) eq 'ARRAY' ? |
ref($lasthash{$key}) eq 'ARRAY' ? |
join(',', @{$lasthash{$key}}) : $lasthash{$key}) )); |
join(',', @{$lasthash{$key}}) : $lasthash{$key}) )); |
} |
} |
} |
} |
if (!@string) { |
if (!@string) { |
|
my $msg; |
|
if ($is_tool) { |
|
$msg = &mt('No grade passed back.'); |
|
} else { |
|
$msg = &mt('Nothing submitted - no attempts.'); |
|
} |
$string[0] = |
$string[0] = |
'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span>'; |
'<span class="LC_warning">'.$msg.'</span>'; |
} |
} |
return (\@string,\$timestamp); |
return (\@string,\$timestamp); |
} |
} |
Line 2769 sub processHandGrade {
|
Line 3189 sub processHandGrade {
|
my $ctr = 0; |
my $ctr = 0; |
while ($ctr < $ngrade) { |
while ($ctr < $ngrade) { |
my ($uname,$udom) = split(/:/,$env{'form.unamedom'.$ctr}); |
my ($uname,$udom) = split(/:/,$env{'form.unamedom'.$ctr}); |
my ($errorflag,$pts,$wgt) = &saveHandGrade($request,$symb,$uname,$udom,$ctr); |
my ($errorflag,$pts,$wgt,$numhidden) = |
|
&saveHandGrade($request,$symb,$uname,$udom,$ctr); |
if ($errorflag eq 'no_score') { |
if ($errorflag eq 'no_score') { |
$ctr++; |
$ctr++; |
next; |
next; |
Line 2782 sub processHandGrade {
|
Line 3203 sub processHandGrade {
|
$ctr++; |
$ctr++; |
next; |
next; |
} |
} |
|
if ($numhidden) { |
|
$request->print( |
|
'<span class="LC_info">' |
|
.&mt('For [_1]: [quant,_2,transaction] hidden',"$uname:$udom",$numhidden) |
|
.'</span><br />'); |
|
} |
my $includemsg = $env{'form.includemsg'.$ctr}; |
my $includemsg = $env{'form.includemsg'.$ctr}; |
my ($subject,$message,$msgstatus) = ('','',''); |
my ($subject,$message,$msgstatus) = ('','',''); |
my $restitle = &Apache::lonnet::gettitle($symb); |
my $restitle = &Apache::lonnet::gettitle($symb); |
Line 2840 sub processHandGrade {
|
Line 3267 sub processHandGrade {
|
} |
} |
} |
} |
|
|
# if ($env{'form.handgrade'} eq 'yes') { |
my $res_error; |
if (1) { |
my ($partlist,$handgrade,$responseType,$numresp,$numessay) = &response_type($symb,\$res_error); |
|
if ($res_error) { |
|
$request->print(&navmap_errormsg()); |
|
return; |
|
} |
|
|
|
my %keyhash = (); |
|
if ($numessay) { |
# Keywords sorted in alphabatical order |
# Keywords sorted in alphabatical order |
my $loginuser = $env{'user.name'}.':'.$env{'user.domain'}; |
my $loginuser = $env{'user.name'}.':'.$env{'user.domain'}; |
my %keyhash = (); |
|
$env{'form.keywords'} =~ s/,\s{0,}|\s+/ /g; |
$env{'form.keywords'} =~ s/,\s{0,}|\s+/ /g; |
$env{'form.keywords'} =~ s/^\s+|\s+$//; |
$env{'form.keywords'} =~ s/^\s+|\s+$//g; |
my (@keywords) = sort(split(/\s+/,$env{'form.keywords'})); |
my (@keywords) = sort(split(/\s+/,$env{'form.keywords'})); |
$env{'form.keywords'} = join(' ',@keywords); |
$env{'form.keywords'} = join(' ',@keywords); |
$keyhash{$symb.'_keywords'} = $env{'form.keywords'}; |
$keyhash{$symb.'_keywords'} = $env{'form.keywords'}; |
Line 2854 sub processHandGrade {
|
Line 3287 sub processHandGrade {
|
$keyhash{$loginuser.'_kwclr'} = $env{'form.kwclr'}; |
$keyhash{$loginuser.'_kwclr'} = $env{'form.kwclr'}; |
$keyhash{$loginuser.'_kwsize'} = $env{'form.kwsize'}; |
$keyhash{$loginuser.'_kwsize'} = $env{'form.kwsize'}; |
$keyhash{$loginuser.'_kwstyle'} = $env{'form.kwstyle'}; |
$keyhash{$loginuser.'_kwstyle'} = $env{'form.kwstyle'}; |
|
} |
|
|
|
if ($env{'form.compmsg'}) { |
# message center - Order of message gets changed. Blank line is eliminated. |
# message center - Order of message gets changed. Blank line is eliminated. |
# New messages are saved in env for the next student. |
# New messages are saved in env for the next student. |
# All messages are saved in nohist_handgrade.db |
# All messages are saved in nohist_handgrade.db |
Line 2869 sub processHandGrade {
|
Line 3304 sub processHandGrade {
|
$ctr = 0; |
$ctr = 0; |
while ($ctr < $ngrade) { |
while ($ctr < $ngrade) { |
if ($env{'form.newmsg'.$ctr} ne '') { |
if ($env{'form.newmsg'.$ctr} ne '') { |
$keyhash{$symb.'_savemsg'.$idx} = $env{'form.newmsg'.$ctr}; |
$keyhash{$symb.'_savemsg'.$idx} = $env{'form.newmsg'.$ctr}; |
$env{'form.savemsg'.$idx} = $env{'form.newmsg'.$ctr}; |
$env{'form.savemsg'.$idx} = $env{'form.newmsg'.$ctr}; |
$idx++; |
$idx++; |
} |
} |
$ctr++; |
$ctr++; |
} |
} |
$env{'form.savemsgN'} = --$idx; |
$env{'form.savemsgN'} = --$idx; |
$keyhash{$symb.'_savemsgN'} = $env{'form.savemsgN'}; |
$keyhash{$symb.'_savemsgN'} = $env{'form.savemsgN'}; |
my $putresult = &Apache::lonnet::put |
|
('nohist_handgrade',\%keyhash,$cdom,$cnum); |
|
} |
} |
|
if (($numessay) || ($env{'form.compmsg'})) { |
|
my $putresult = &Apache::lonnet::put |
|
('nohist_handgrade',\%keyhash,$cdom,$cnum); |
|
} |
|
|
# Called by Save & Refresh from Highlight Attribute Window |
# Called by Save & Refresh from Highlight Attribute Window |
my (undef,undef,$fullname) = &getclasslist($env{'form.section'},'1'); |
my (undef,undef,$fullname) = &getclasslist($env{'form.section'},'1'); |
if ($env{'form.refresh'} eq 'on') { |
if ($env{'form.refresh'} eq 'on') { |
Line 2919 sub processHandGrade {
|
Line 3357 sub processHandGrade {
|
} |
} |
return $a cmp $b; |
return $a cmp $b; |
} (keys(%$fullname))) { |
} (keys(%$fullname))) { |
# FIXME: this is fishy, looks like the button label |
|
if ($nextflg == 1 && $button =~ /Next$/) { |
if ($nextflg == 1 && $button =~ /Next$/) { |
push(@parsedlist,$item); |
push(@parsedlist,$item); |
} |
} |
Line 2930 sub processHandGrade {
|
Line 3367 sub processHandGrade {
|
} |
} |
} |
} |
$ctr = 0; |
$ctr = 0; |
# FIXME: this is fishy, looks like the button label |
|
@parsedlist = reverse @parsedlist if ($button eq 'Previous'); |
@parsedlist = reverse @parsedlist if ($button eq 'Previous'); |
my $res_error; |
|
my ($partlist) = &response_type($symb,\$res_error); |
|
if ($res_error) { |
|
$request->print(&navmap_errormsg()); |
|
return; |
|
} |
|
foreach my $student (@parsedlist) { |
foreach my $student (@parsedlist) { |
my $submitonly=$env{'form.submitonly'}; |
my $submitonly=$env{'form.submitonly'}; |
my ($uname,$udom) = split(/:/,$student); |
my ($uname,$udom) = split(/:/,$student); |
Line 3003 sub saveHandGrade {
|
Line 3433 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) = ('',''); |
my ($pts,$wgt,$totchg) = ('','',0); |
my %aggregate = (); |
my %aggregate = (); |
my $aggregateflag = 0; |
my $aggregateflag = 0; |
|
if ($env{'form.HIDE'.$newflg}) { |
|
my ($version,$parts) = split(/:/,$env{'form.HIDE'.$newflg},2); |
|
my $numchgs = &makehidden($version,$parts,\%record,$symb,$domain,$stuname,1); |
|
$totchg += $numchgs; |
|
} |
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 ($submi may vary for different parts |
Line 3108 sub saveHandGrade {
|
Line 3543 sub saveHandGrade {
|
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, |
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, |
$cdom,$cnum); |
$cdom,$cnum); |
} |
} |
return ('',$pts,$wgt); |
return ('',$pts,$wgt,$totchg); |
|
} |
|
|
|
sub makehidden { |
|
my ($version,$parts,$record,$symb,$domain,$stuname,$tolog) = @_; |
|
return unless (ref($record) eq 'HASH'); |
|
my %modified; |
|
my $numchanged = 0; |
|
if (exists($record->{$version.':keys'})) { |
|
my $partsregexp = $parts; |
|
$partsregexp =~ s/,/|/g; |
|
foreach my $key (split(/\:/,$record->{$version.':keys'})) { |
|
if ($key =~ /^resource\.(?:$partsregexp)\.([^\.]+)$/) { |
|
my $item = $1; |
|
unless (($item eq 'solved') || ($item =~ /^award(|msg|ed)$/)) { |
|
$modified{$key} = $record->{$version.':'.$key}; |
|
} |
|
} elsif ($key =~ m{^(resource\.(?:$partsregexp)\.[^\.]+\.)(.+)$}) { |
|
$modified{$1.'hidden'.$2} = $record->{$version.':'.$key}; |
|
} elsif ($key =~ /^(ip|timestamp|host)$/) { |
|
$modified{$key} = $record->{$version.':'.$key}; |
|
} |
|
} |
|
if (keys(%modified)) { |
|
if (&Apache::lonnet::putstore($env{'request.course.id'},$symb,$version,\%modified, |
|
$domain,$stuname,$tolog) eq 'ok') { |
|
$numchanged ++; |
|
} |
|
} |
|
} |
|
return $numchanged; |
} |
} |
|
|
sub check_and_remove_from_queue { |
sub check_and_remove_from_queue { |
Line 3152 sub handback_files {
|
Line 3617 sub handback_files {
|
my ($directory,$answer_file) = |
my ($directory,$answer_file) = |
($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter} =~ /^(.*?)([^\/]*)$/); |
($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter} =~ /^(.*?)([^\/]*)$/); |
my ($answer_name,$answer_ver,$answer_ext) = |
my ($answer_name,$answer_ver,$answer_ext) = |
&file_name_version_ext($answer_file); |
&Apache::lonnet::file_name_version_ext($answer_file); |
my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/); |
my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/); |
my $getpropath = 1; |
my $getpropath = 1; |
my ($dir_list,$listerror) = |
my ($dir_list,$listerror) = |
&Apache::lonnet::dirlist($portfolio_root.$portfolio_path, |
&Apache::lonnet::dirlist($portfolio_root.$portfolio_path, |
$domain,$stuname,$getpropath); |
$domain,$stuname,$getpropath); |
my $version = &get_next_version($answer_name,$answer_ext,$dir_list); |
my $version = &Apache::lonnet::get_next_version($answer_name,$answer_ext,$dir_list); |
# fix filename |
# fix filename |
my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/); |
my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/); |
my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain, |
my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain, |
Line 3307 sub version_portfiles {
|
Line 3772 sub version_portfiles {
|
my $version_parts = join('|',@$v_flag); |
my $version_parts = join('|',@$v_flag); |
my @returned_keys; |
my @returned_keys; |
my $parts = join('|', @$parts_graded); |
my $parts = join('|', @$parts_graded); |
my $portfolio_root = '/userfiles/portfolio'; |
|
foreach my $key (keys(%$record)) { |
foreach my $key (keys(%$record)) { |
my $new_portfiles; |
my $new_portfiles; |
if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) { |
if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) { |
my @versioned_portfiles; |
my @versioned_portfiles; |
my @portfiles = split(/\s*,\s*/,$$record{$key}); |
my @portfiles = split(/\s*,\s*/,$$record{$key}); |
foreach my $file (@portfiles) { |
if (@portfiles) { |
&Apache::lonnet::unmark_as_readonly($domain,$stu_name,[$symb,$env{'request.course.id'}],$file); |
&Apache::lonnet::portfiles_versioning($symb,$domain,$stu_name,\@portfiles, |
my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/); |
\@versioned_portfiles); |
my ($answer_name,$answer_ver,$answer_ext) = |
|
&file_name_version_ext($answer_file); |
|
my $getpropath = 1; |
|
my ($dir_list,$listerror) = |
|
&Apache::lonnet::dirlist($portfolio_root.$directory,$domain, |
|
$stu_name,$getpropath); |
|
my $version = &get_next_version($answer_name,$answer_ext,$dir_list); |
|
my $new_answer = &version_selected_portfile($domain, $stu_name, $directory, $answer_file, $version); |
|
if ($new_answer ne 'problem getting file') { |
|
push(@versioned_portfiles, $directory.$new_answer); |
|
&Apache::lonnet::mark_as_readonly($domain,$stu_name, |
|
[$directory.$new_answer], |
|
[$symb,$env{'request.course.id'},'graded']); |
|
} |
|
} |
} |
$$record{$key} = join(',',@versioned_portfiles); |
$$record{$key} = join(',',@versioned_portfiles); |
push(@returned_keys,$key); |
push(@returned_keys,$key); |
Line 3338 sub version_portfiles {
|
Line 3788 sub version_portfiles {
|
return (@returned_keys); |
return (@returned_keys); |
} |
} |
|
|
sub get_next_version { |
|
my ($answer_name, $answer_ext, $dir_list) = @_; |
|
my $version; |
|
if (ref($dir_list) eq 'ARRAY') { |
|
foreach my $row (@{$dir_list}) { |
|
my ($file) = split(/\&/,$row,2); |
|
my ($file_name,$file_version,$file_ext) = |
|
&file_name_version_ext($file); |
|
if (($file_name eq $answer_name) && |
|
($file_ext eq $answer_ext)) { |
|
# gets here if filename and extension match, |
|
# regardless of version |
|
if ($file_version ne '') { |
|
# a versioned file is found so save it for later |
|
if ($file_version > $version) { |
|
$version = $file_version; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
$version ++; |
|
return($version); |
|
} |
|
|
|
sub version_selected_portfile { |
|
my ($domain,$stu_name,$directory,$file_name,$version) = @_; |
|
my ($answer_name,$answer_ver,$answer_ext) = |
|
&file_name_version_ext($file_name); |
|
my $new_answer; |
|
$env{'form.copy'} = &Apache::lonnet::getfile("/uploaded/$domain/$stu_name/portfolio$directory$file_name"); |
|
if($env{'form.copy'} eq '-1') { |
|
$new_answer = 'problem getting file'; |
|
} else { |
|
$new_answer = $answer_name.'.'.$version.'.'.$answer_ext; |
|
my $copy_result = &Apache::lonnet::finishuserfileupload( |
|
$stu_name,$domain,'copy', |
|
'/portfolio'.$directory.$new_answer); |
|
} |
|
return ($new_answer); |
|
} |
|
|
|
sub file_name_version_ext { |
|
my ($file)=@_; |
|
my @file_parts = split(/\./, $file); |
|
my ($name,$version,$ext); |
|
if (@file_parts > 1) { |
|
$ext=pop(@file_parts); |
|
if (@file_parts > 1 && $file_parts[-1] =~ /^\d+$/) { |
|
$version=pop(@file_parts); |
|
} |
|
$name=join('.',@file_parts); |
|
} else { |
|
$name=join('.',@file_parts); |
|
} |
|
return($name,$version,$ext); |
|
} |
|
|
|
#-------------------------------------------------------------------------------------- |
#-------------------------------------------------------------------------------------- |
# |
# |
#-------------------------- Next few routines handles grading by section or whole class |
#-------------------------- Next few routines handles grading by section or whole class |
Line 3405 sub viewgrades_js {
|
Line 3797 sub viewgrades_js {
|
my ($request) = shift; |
my ($request) = shift; |
|
|
my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = '); |
my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = '); |
|
&js_escape(\$alertmsg); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<VIEWJAVASCRIPT)); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<VIEWJAVASCRIPT)); |
function writePoint(partid,weight,point) { |
function writePoint(partid,weight,point) { |
var radioButton = document.classgrade["RADVAL_"+partid]; |
var radioButton = document.classgrade["RADVAL_"+partid]; |
Line 3572 VIEWJAVASCRIPT
|
Line 3965 VIEWJAVASCRIPT
|
#--- show scores for a section or whole class w/ option to change/update a score |
#--- show scores for a section or whole class w/ option to change/update a score |
sub viewgrades { |
sub viewgrades { |
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
|
my ($is_tool,$toolsymb); |
|
if ($symb =~ /ext\.tool$/) { |
|
$is_tool = 1; |
|
$toolsymb = $symb; |
|
} |
&viewgrades_js($request); |
&viewgrades_js($request); |
|
|
#need to make sure we have the correct data for later EXT calls, |
#need to make sure we have the correct data for later EXT calls, |
Line 3594 sub viewgrades {
|
Line 3992 sub viewgrades {
|
&build_section_inputs(). |
&build_section_inputs(). |
'<input type="hidden" name="Status" value="'.$env{'stu_status'}.'" />'."\n". |
'<input type="hidden" name="Status" value="'.$env{'stu_status'}.'" />'."\n". |
|
|
my ($common_header,$specific_header); |
#retrieve selected groups |
if ($env{'form.section'} eq 'all') { |
my (@groups,$group_display); |
$common_header = &mt('Assign Common Grade to Class'); |
@groups = &Apache::loncommon::get_env_multiple('form.group'); |
$specific_header = &mt('Assign Grade to Specific Students in Class'); |
if (grep(/^all$/,@groups)) { |
} elsif ($env{'form.section'} eq 'none') { |
@groups = ('all'); |
$common_header = &mt('Assign Common Grade to Students in no Section'); |
} elsif (grep(/^none$/,@groups)) { |
$specific_header = &mt('Assign Grade to Specific Students in no Section'); |
@groups = ('none'); |
} else { |
} elsif (@groups > 0) { |
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
$group_display = join(', ',@groups); |
$common_header = &mt('Assign Common Grade to Students in Section(s) [_1]',$section_display); |
} |
$specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1]',$section_display); |
|
|
my ($common_header,$specific_header,@sections,$section_display); |
|
if ($env{'request.course.sec'} ne '') { |
|
@sections = ($env{'request.course.sec'}); |
|
} else { |
|
@sections = &Apache::loncommon::get_env_multiple('form.section'); |
} |
} |
$result.= '<h3>'.$common_header.'</h3>'.&Apache::loncommon::start_data_table(); |
|
|
# Check if Save button should be usable |
|
my $disabled = ' disabled="disabled"'; |
|
if ($perm{'mgr'}) { |
|
if (grep(/^all$/,@sections)) { |
|
undef($disabled); |
|
} else { |
|
foreach my $sec (@sections) { |
|
if (&canmodify($sec)) { |
|
undef($disabled); |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
if (grep(/^all$/,@sections)) { |
|
@sections = ('all'); |
|
if ($group_display) { |
|
$common_header = &mt('Assign Common Grade to Students in Group(s) [_1]',$group_display); |
|
$specific_header = &mt('Assign Grade to Specific Students in Group(s) [_1]',$group_display); |
|
} elsif (grep(/^none$/,@groups)) { |
|
$common_header = &mt('Assign Common Grade to Students not assigned to any groups'); |
|
$specific_header = &mt('Assign Grade to Specific Students not assigned to any groups'); |
|
} else { |
|
$common_header = &mt('Assign Common Grade to Class'); |
|
$specific_header = &mt('Assign Grade to Specific Students in Class'); |
|
} |
|
} elsif (grep(/^none$/,@sections)) { |
|
@sections = ('none'); |
|
if ($group_display) { |
|
$common_header = &mt('Assign Common Grade to Students in no Section and in Group(s) [_1]',$group_display); |
|
$specific_header = &mt('Assign Grade to Specific Students in no Section and in Group(s)',$group_display); |
|
} elsif (grep(/^none$/,@groups)) { |
|
$common_header = &mt('Assign Common Grade to Students in no Section and in no Group'); |
|
$specific_header = &mt('Assign Grade to Specific Students in no Section and in no Group'); |
|
} else { |
|
$common_header = &mt('Assign Common Grade to Students in no Section'); |
|
$specific_header = &mt('Assign Grade to Specific Students in no Section'); |
|
} |
|
} else { |
|
$section_display = join (", ",@sections); |
|
if ($group_display) { |
|
$common_header = &mt('Assign Common Grade to Students in Section(s) [_1], and in Group(s) [_2]', |
|
$section_display,$group_display); |
|
$specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1], and in Group(s) [_2]', |
|
$section_display,$group_display); |
|
} elsif (grep(/^none$/,@groups)) { |
|
$common_header = &mt('Assign Common Grade to Students in Section(s) [_1] and no Group',$section_display); |
|
$specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1] and no Group',$section_display); |
|
} else { |
|
$common_header = &mt('Assign Common Grade to Students in Section(s) [_1]',$section_display); |
|
$specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1]',$section_display); |
|
} |
|
} |
|
my %submit_types = &substatus_options(); |
|
my $submission_status = $submit_types{$env{'form.submitonly'}}; |
|
|
|
if ($env{'form.submitonly'} eq 'all') { |
|
$result.= '<h3>'.$common_header.'</h3>'; |
|
} else { |
|
my $text; |
|
if ($is_tool) { |
|
$text = &mt('(transaction status: "[_1]")',$submission_status); |
|
} else { |
|
$text = &mt('(submission status: "[_1]")',$submission_status); |
|
} |
|
$result.= '<h3>'.$common_header.' '.$text.'</h3>'; |
|
} |
|
$result .= &Apache::loncommon::start_data_table(); |
#radio buttons/text box for assigning points for a section or class. |
#radio buttons/text box for assigning points for a section or class. |
#handles different parts of a problem |
#handles different parts of a problem |
my $res_error; |
my $res_error; |
Line 3617 sub viewgrades {
|
Line 4088 sub viewgrades {
|
my %weight = (); |
my %weight = (); |
my $ctsparts = 0; |
my $ctsparts = 0; |
my %seen = (); |
my %seen = (); |
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id; |
|
if ($is_tool) { |
|
@part_response_id = ([0,'']); |
|
} else { |
|
@part_response_id = &flatten_responseType($responseType); |
|
} |
foreach my $part_response_id (@part_response_id) { |
foreach my $part_response_id (@part_response_id) { |
my ($partid,$respid) = @{ $part_response_id }; |
my ($partid,$respid) = @{ $part_response_id }; |
my $part_resp = join('_',@{ $part_response_id }); |
my $part_resp = join('_',@{ $part_response_id }); |
next if $seen{$partid}; |
next if $seen{$partid}; |
$seen{$partid}++; |
$seen{$partid}++; |
my $handgrade=$$handgrade{$part_resp}; |
|
my $wgt = &Apache::lonnet::EXT('resource.'.$partid.'.weight',$symb); |
my $wgt = &Apache::lonnet::EXT('resource.'.$partid.'.weight',$symb); |
$weight{$partid} = $wgt eq '' ? '1' : $wgt; |
$weight{$partid} = $wgt eq '' ? '1' : $wgt; |
|
|
Line 3669 sub viewgrades {
|
Line 4144 sub viewgrades {
|
|
|
#table listing all the students in a section/class |
#table listing all the students in a section/class |
#header of table |
#header of table |
$result.= '<h3>'.$specific_header.'</h3>'. |
if ($env{'form.submitonly'} eq 'all') { |
&Apache::loncommon::start_data_table(). |
$result.= '<h3>'.$specific_header.'</h3>'; |
|
} else { |
|
my $text; |
|
if ($is_tool) { |
|
$text = &mt('(transaction status: "[_1]")',$submission_status); |
|
} else { |
|
$text = &mt('(submission status: "[_1]")',$submission_status); |
|
} |
|
$result.= '<h3>'.$specific_header.' '.$text.'</h3>'; |
|
} |
|
$result.= &Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
'<th>'.&mt('No.').'</th>'. |
'<th>'.&mt('No.').'</th>'. |
'<th>'.&nameUserString('header')."</th>\n"; |
'<th>'.&nameUserString('header')."</th>\n"; |
Line 3682 sub viewgrades {
|
Line 4167 sub viewgrades {
|
my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); |
my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); |
my @partids = (); |
my @partids = (); |
foreach my $part (@parts) { |
foreach my $part (@parts) { |
my $display=&Apache::lonnet::metadata($url,$part.'.display'); |
my $display=&Apache::lonnet::metadata($url,$part.'.display',$toolsymb); |
my $narrowtext = &mt('Tries'); |
my $narrowtext = &mt('Tries'); |
$display =~ s|^Number of Attempts|$narrowtext <br />|; # makes the column narrower |
$display =~ s|^Number of Attempts|$narrowtext <br />|; # makes the column narrower |
if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); } |
if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name',$toolsymb); } |
my ($partid) = &split_part_type($part); |
my ($partid) = &split_part_type($part); |
push(@partids,$partid); |
push(@partids,$partid); |
# |
# |
Line 3716 sub viewgrades {
|
Line 4201 sub viewgrades {
|
|
|
#get info for each student |
#get info for each student |
#list all the students - with points and grade status |
#list all the students - with points and grade status |
my (undef,undef,$fullname) = &getclasslist($env{'form.section'},'1'); |
my (undef,undef,$fullname) = &getclasslist(\@sections,'1',\@groups); |
my $ctr = 0; |
my $ctr = 0; |
foreach (sort |
foreach (sort |
{ |
{ |
Line 3725 sub viewgrades {
|
Line 4210 sub viewgrades {
|
} |
} |
return $a cmp $b; |
return $a cmp $b; |
} (keys(%$fullname))) { |
} (keys(%$fullname))) { |
$ctr++; |
|
$result.=&viewstudentgrade($symb,$env{'request.course.id'}, |
$result.=&viewstudentgrade($symb,$env{'request.course.id'}, |
$_,$$fullname{$_},\@parts,\%weight,$ctr,\%last_resets); |
$_,$$fullname{$_},\@parts,\%weight,\$ctr,\%last_resets,$is_tool); |
} |
} |
$result.=&Apache::loncommon::end_data_table(); |
$result.=&Apache::loncommon::end_data_table(); |
$result.='<input type="hidden" name="total" value="'.$ctr.'" />'."\n"; |
$result.='<input type="hidden" name="total" value="'.$ctr.'" />'."\n"; |
$result.='<input type="button" value="'.&mt('Save').'" '. |
$result.='<input type="button" value="'.&mt('Save').'"'.$disabled.' '. |
'onclick="javascript:submit();" target="_self" /></form>'."\n"; |
'onclick="javascript:submit();" target="_self" /></form>'."\n"; |
if (scalar(%$fullname) eq 0) { |
if ($ctr == 0) { |
my $colspan=3+scalar(@parts); |
|
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
|
my $stu_status = join(' or ',&Apache::loncommon::get_env_multiple('form.Status')); |
my $stu_status = join(' or ',&Apache::loncommon::get_env_multiple('form.Status')); |
$result='<span class="LC_warning">'. |
$result='<h3><span class="LC_info">'.&mt('Manual Grading').'</span></h3>'. |
&mt('There are no students in section(s) [_1] with enrollment status [_2] to modify or grade.', |
'<span class="LC_warning">'; |
$section_display, $stu_status). |
if ($env{'form.submitonly'} eq 'all') { |
'</span>'; |
if (grep(/^all$/,@sections)) { |
|
if (grep(/^all$/,@groups)) { |
|
$result .= &mt('There are no students with enrollment status [_1] to modify or grade.', |
|
$stu_status); |
|
} elsif (grep(/^none$/,@groups)) { |
|
$result .= &mt('There are no students with no group assigned and with enrollment status [_1] to modify or grade.', |
|
$stu_status); |
|
} else { |
|
$result .= &mt('There are no students in group(s) [_1] with enrollment status [_2] to modify or grade.', |
|
$group_display,$stu_status); |
|
} |
|
} elsif (grep(/^none$/,@sections)) { |
|
if (grep(/^all$/,@groups)) { |
|
$result .= &mt('There are no students in no section with enrollment status [_1] to modify or grade.', |
|
$stu_status); |
|
} elsif (grep(/^none$/,@groups)) { |
|
$result .= &mt('There are no students in no section and no group with enrollment status [_1] to modify or grade.', |
|
$stu_status); |
|
} else { |
|
$result .= &mt('There are no students in no section in group(s) [_1] with enrollment status [_2] to modify or grade.', |
|
$group_display,$stu_status); |
|
} |
|
} else { |
|
if (grep(/^all$/,@groups)) { |
|
$result .= &mt('There are no students in section(s) [_1] with enrollment status [_2] to modify or grade.', |
|
$section_display,$stu_status); |
|
} elsif (grep(/^none$/,@groups)) { |
|
$result .= &mt('There are no students in section(s) [_1] and no group with enrollment status [_2] to modify or grade.', |
|
$section_display,$stu_status); |
|
} else { |
|
$result .= &mt('There are no students in section(s) [_1] and group(s) [_2] with enrollment status [_3] to modify or grade.', |
|
$section_display,$group_display,$stu_status); |
|
} |
|
} |
|
} else { |
|
if (grep(/^all$/,@sections)) { |
|
if (grep(/^all$/,@groups)) { |
|
$result .= &mt('There are no students with enrollment status [_1] and submission status "[_2]" to modify or grade.', |
|
$stu_status,$submission_status); |
|
} elsif (grep(/^none$/,@groups)) { |
|
$result .= &mt('There are no students with no group assigned with enrollment status [_1] and submission status "[_2]" to modify or grade.', |
|
$stu_status,$submission_status); |
|
} else { |
|
$result .= &mt('There are no students in group(s) [_1] with enrollment status [_2] and submission status "[_3]" to modify or grade.', |
|
$group_display,$stu_status,$submission_status); |
|
} |
|
} elsif (grep(/^none$/,@sections)) { |
|
if (grep(/^all$/,@groups)) { |
|
$result .= &mt('There are no students in no section with enrollment status [_1] and submission status "[_2]" to modify or grade.', |
|
$stu_status,$submission_status); |
|
} elsif (grep(/^none$/,@groups)) { |
|
$result .= &mt('There are no students in no section and no group with enrollment status [_1] and submission status "[_2]" to modify or grade.', |
|
$stu_status,$submission_status); |
|
} else { |
|
$result .= &mt('There are no students in no section in group(s) [_1] with enrollment status [_2] and submission status "[_3]" to modify or grade.', |
|
$group_display,$stu_status,$submission_status); |
|
} |
|
} else { |
|
if (grep(/^all$/,@groups)) { |
|
$result .= &mt('There are no students in section(s) [_1] with enrollment status [_2] and submission status "[_3]" to modify or grade.', |
|
$section_display,$stu_status,$submission_status); |
|
} elsif (grep(/^none$/,@groups)) { |
|
$result .= &mt('There are no students in section(s) [_1] and no group with enrollment status [_2] and submission status "[_3]" to modify or grade.', |
|
$section_display,$stu_status,$submission_status); |
|
} else { |
|
$result .= &mt('There are no students in section(s) [_1] and group(s) [_2] with enrollment status [_3] and submission status "[_4]" to modify or grade.', |
|
$section_display,$group_display,$stu_status,$submission_status); |
|
} |
|
} |
|
} |
|
$result .= '</span><br />'; |
} |
} |
return $result; |
return $result; |
} |
} |
|
|
#--- call by previous routine to display each student |
#--- call by previous routine to display each student who satisfies submission filter. |
sub viewstudentgrade { |
sub viewstudentgrade { |
my ($symb,$courseid,$student,$fullname,$parts,$weight,$ctr,$last_resets) = @_; |
my ($symb,$courseid,$student,$fullname,$parts,$weight,$ctr,$last_resets,$is_tool) = @_; |
my ($uname,$udom) = split(/:/,$student); |
my ($uname,$udom) = split(/:/,$student); |
my %record=&Apache::lonnet::restore($symb,$courseid,$udom,$uname); |
my %record=&Apache::lonnet::restore($symb,$courseid,$udom,$uname); |
my %aggregates = (); |
my $submitonly = $env{'form.submitonly'}; |
|
unless (($submitonly eq 'all') || ($submitonly eq 'queued')) { |
|
my %partstatus = (); |
|
if (ref($parts) eq 'ARRAY') { |
|
foreach my $apart (@{$parts}) { |
|
my ($part,$type) = &split_part_type($apart); |
|
my ($status,undef) = split(/_/,$record{"resource.$part.solved"},2); |
|
$status = 'nothing' if ($status eq ''); |
|
$partstatus{$part} = $status; |
|
my $subkey = "resource.$part.submitted_by"; |
|
$partstatus{$subkey} = $record{$subkey} if ($record{$subkey} ne ''); |
|
} |
|
my $submitted = 0; |
|
my $graded = 0; |
|
my $incorrect = 0; |
|
foreach my $key (keys(%partstatus)) { |
|
$submitted = 1 if ($partstatus{$key} ne 'nothing'); |
|
$graded = 1 if ($partstatus{$key} =~ /^ungraded/); |
|
$incorrect = 1 if ($partstatus{$key} =~ /^incorrect/); |
|
|
|
my $partid = (split(/\./,$key))[1]; |
|
if ($partstatus{'resource.'.$partid.'.'.$key.'.submitted_by'} ne '') { |
|
$submitted = 0; |
|
} |
|
} |
|
return if (!$submitted && ($submitonly eq 'yes' || |
|
$submitonly eq 'incorrect' || |
|
$submitonly eq 'graded')); |
|
return if (!$graded && ($submitonly eq 'graded')); |
|
return if (!$incorrect && $submitonly eq 'incorrect'); |
|
} |
|
} |
|
if ($submitonly eq 'queued') { |
|
my ($cdom,$cnum) = split(/_/,$courseid); |
|
my %queue_status = |
|
&Apache::bridgetask::get_student_status($symb,$cdom,$cnum, |
|
$udom,$uname); |
|
return if (!defined($queue_status{'gradingqueue'})); |
|
} |
|
$$ctr++; |
|
my %aggregates = (); |
my $result=&Apache::loncommon::start_data_table_row().'<td align="right">'. |
my $result=&Apache::loncommon::start_data_table_row().'<td align="right">'. |
'<input type="hidden" name="ctr'.($ctr-1).'" value="'.$student.'" />'. |
'<input type="hidden" name="ctr'.($$ctr-1).'" value="'.$student.'" />'. |
"\n".$ctr.' </td><td> '. |
"\n".$$ctr.' </td><td> '. |
'<a href="javascript:viewOneStudent(\''.$uname.'\',\''.$udom. |
'<a href="javascript:viewOneStudent(\''.$uname.'\',\''.$udom. |
'\');" target="_self">'.$fullname.'</a> '. |
'\');" target="_self">'.$fullname.'</a> '. |
'<span class="LC_internal_info">('.$uname.($env{'user.domain'} eq $udom ? '' : ':'.$udom).')</span></td>'."\n"; |
'<span class="LC_internal_info">('.$uname.($env{'user.domain'} eq $udom ? '' : ':'.$udom).')</span></td>'."\n"; |
Line 3765 sub viewstudentgrade {
|
Line 4357 sub viewstudentgrade {
|
my ($aggtries,$totaltries); |
my ($aggtries,$totaltries); |
unless (exists($aggregates{$part})) { |
unless (exists($aggregates{$part})) { |
$totaltries = $record{'resource.'.$part.'.tries'}; |
$totaltries = $record{'resource.'.$part.'.tries'}; |
|
|
$aggtries = $totaltries; |
$aggtries = $totaltries; |
if ($$last_resets{$part}) { |
if ($$last_resets{$part}) { |
$aggtries = &get_num_tries(\%record,$$last_resets{$part}, |
$aggtries = &get_num_tries(\%record,$$last_resets{$part}, |
Line 3814 sub viewstudentgrade {
|
Line 4405 sub viewstudentgrade {
|
# record does not get update if unchanged |
# record does not get update if unchanged |
sub editgrades { |
sub editgrades { |
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
|
my $toolsymb; |
|
if ($symb =~ /ext\.tool$/) { |
|
$toolsymb = $symb; |
|
} |
|
|
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
my $title='<h2>'.&mt('Current Grade Status').'</h2>'; |
my $title='<h2>'.&mt('Current Grade Status').'</h2>'; |
$title.='<h4>'.&mt('<b>Section: </b>[_1]',$section_display).'</h4>'."\n"; |
$title.='<h4><b>'.&mt('Section:').'</b> '.$section_display.'</h4>'."\n"; |
|
|
my $result= &Apache::loncommon::start_data_table(). |
my $result= &Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
Line 3851 sub editgrades {
|
Line 4446 sub editgrades {
|
$ctr++; |
$ctr++; |
} |
} |
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); |
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); |
|
my $totcolspan = 0; |
foreach my $partid (@partid) { |
foreach my $partid (@partid) { |
$header .= '<th align="center">'.&mt('Old Score').'</th>'. |
$header .= '<th align="center">'.&mt('Old Score').'</th>'. |
'<th align="center">'.&mt('New Score').'</th>'; |
'<th align="center">'.&mt('New Score').'</th>'; |
Line 3859 sub editgrades {
|
Line 4455 sub editgrades {
|
my ($part,$type) = &split_part_type($stores); |
my ($part,$type) = &split_part_type($stores); |
if ($part !~ m/^\Q$partid\E/) { next;} |
if ($part !~ m/^\Q$partid\E/) { next;} |
if ($type eq 'awarded' || $type eq 'solved') { next; } |
if ($type eq 'awarded' || $type eq 'solved') { next; } |
my $display=&Apache::lonnet::metadata($url,$stores.'.display'); |
my $display=&Apache::lonnet::metadata($url,$stores.'.display',$toolsymb); |
$display =~ s/\[Part: \Q$part\E\]//; |
$display =~ s/\[Part: \Q$part\E\]//; |
my $narrowtext = &mt('Tries'); |
my $narrowtext = &mt('Tries'); |
$display =~ s/Number of Attempts/$narrowtext/; |
$display =~ s/Number of Attempts/$narrowtext/; |
Line 3867 sub editgrades {
|
Line 4463 sub editgrades {
|
'<th align="center">'.&mt('New').' '.$display.'</th>'; |
'<th align="center">'.&mt('New').' '.$display.'</th>'; |
$columns{$partid}+=2; |
$columns{$partid}+=2; |
} |
} |
|
$totcolspan += $columns{$partid}; |
} |
} |
foreach my $partid (@partid) { |
foreach my $partid (@partid) { |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
Line 3882 sub editgrades {
|
Line 4479 sub editgrades {
|
my @noupdate; |
my @noupdate; |
my ($updateCtr,$noupdateCtr) = (1,1); |
my ($updateCtr,$noupdateCtr) = (1,1); |
for ($i=0; $i<$env{'form.total'}; $i++) { |
for ($i=0; $i<$env{'form.total'}; $i++) { |
my $line; |
|
my $user = $env{'form.ctr'.$i}; |
my $user = $env{'form.ctr'.$i}; |
my ($uname,$udom)=split(/:/,$user); |
my ($uname,$udom)=split(/:/,$user); |
my %newrecord; |
my %newrecord; |
my $updateflag = 0; |
my $updateflag = 0; |
$line .= '<td>'.&nameUserString(undef,$$fullname{$user},$uname,$udom).'</td>'; |
|
my $usec=$classlist->{"$uname:$udom"}[5]; |
my $usec=$classlist->{"$uname:$udom"}[5]; |
if (!&canmodify($usec)) { |
my $canmodify = &canmodify($usec); |
my $numcols=scalar(@partid)*4+2; |
my $line = '<td'.($canmodify?'':' colspan="2"').'>'. |
|
&nameUserString(undef,$$fullname{$user},$uname,$udom).'</td>'; |
|
if (!$canmodify) { |
push(@noupdate, |
push(@noupdate, |
$line."<td colspan=\"$numcols\"><span class=\"LC_warning\">". |
$line."<td colspan=\"$totcolspan\"><span class=\"LC_warning\">". |
&mt('Not allowed to modify student')."</span></td></tr>"); |
&mt('Not allowed to modify student')."</span></td>"); |
next; |
next; |
} |
} |
my %aggregate = (); |
my %aggregate = (); |
Line 4010 sub editgrades {
|
Line 4607 sub editgrades {
|
} |
} |
} |
} |
if (@noupdate) { |
if (@noupdate) { |
# my $numcols=(scalar(@partid)*(scalar(@parts)-1)*2)+3; |
my $numcols=$totcolspan+2; |
my $numcols=scalar(@partid)*4+2; |
|
$result .= &Apache::loncommon::start_data_table_row('LC_empty_row'). |
$result .= &Apache::loncommon::start_data_table_row('LC_empty_row'). |
'<td align="center" colspan="'.$numcols.'">'. |
'<td align="center" colspan="'.$numcols.'">'. |
&mt('No Changes Occurred For the Students Below'). |
&mt('No Changes Occurred For the Students Below'). |
Line 4052 sub split_part_type {
|
Line 4648 sub split_part_type {
|
# |
# |
#--- Javascript to handle csv upload |
#--- Javascript to handle csv upload |
sub csvupload_javascript_reverse_associate { |
sub csvupload_javascript_reverse_associate { |
my $error1=&mt('You need to specify the username or the student/employee ID'); |
my $error1=&mt('You need to specify the username, the student/employee ID, or the clicker ID'); |
my $error2=&mt('You need to specify at least one grading field'); |
my $error2=&mt('You need to specify at least one grading field'); |
|
&js_escape(\$error1); |
|
&js_escape(\$error2); |
return(<<ENDPICK); |
return(<<ENDPICK); |
function verify(vf) { |
function verify(vf) { |
var foundsomething=0; |
var foundsomething=0; |
var founduname=0; |
var founduname=0; |
var foundID=0; |
var foundID=0; |
|
var foundclicker=0; |
for (i=0;i<=vf.nfields.value;i++) { |
for (i=0;i<=vf.nfields.value;i++) { |
tw=eval('vf.f'+i+'.selectedIndex'); |
tw=eval('vf.f'+i+'.selectedIndex'); |
if (i==0 && tw!=0) { foundID=1; } |
if (i==0 && tw!=0) { foundID=1; } |
if (i==1 && tw!=0) { founduname=1; } |
if (i==1 && tw!=0) { founduname=1; } |
if (i!=0 && i!=1 && i!=2 && tw!=0) { foundsomething=1; } |
if (i==2 && tw!=0) { foundclicker=1; } |
|
if (i!=0 && i!=1 && i!=2 && i!=3 && tw!=0) { foundsomething=1; } |
} |
} |
if (founduname==0 && foundID==0) { |
if (founduname==0 && foundID==0 && foundclicker==0) { |
alert('$error1'); |
alert('$error1'); |
return; |
return; |
} |
} |
Line 4092 ENDPICK
|
Line 4692 ENDPICK
|
} |
} |
|
|
sub csvupload_javascript_forward_associate { |
sub csvupload_javascript_forward_associate { |
my $error1=&mt('You need to specify the username or the student/employee ID'); |
my $error1=&mt('You need to specify the username, the student/employee ID, or the clicker ID'); |
my $error2=&mt('You need to specify at least one grading field'); |
my $error2=&mt('You need to specify at least one grading field'); |
|
&js_escape(\$error1); |
|
&js_escape(\$error2); |
return(<<ENDPICK); |
return(<<ENDPICK); |
function verify(vf) { |
function verify(vf) { |
var foundsomething=0; |
var foundsomething=0; |
var founduname=0; |
var founduname=0; |
var foundID=0; |
var foundID=0; |
|
var foundclicker=0; |
for (i=0;i<=vf.nfields.value;i++) { |
for (i=0;i<=vf.nfields.value;i++) { |
tw=eval('vf.f'+i+'.selectedIndex'); |
tw=eval('vf.f'+i+'.selectedIndex'); |
if (tw==1) { foundID=1; } |
if (tw==1) { foundID=1; } |
if (tw==2) { founduname=1; } |
if (tw==2) { founduname=1; } |
if (tw>3) { foundsomething=1; } |
if (tw==3) { foundclicker=1; } |
|
if (tw>4) { foundsomething=1; } |
} |
} |
if (founduname==0 && foundID==0) { |
if (founduname==0 && foundID==0 && Æ’oundclicker==0) { |
alert('$error1'); |
alert('$error1'); |
return; |
return; |
} |
} |
Line 4163 ENDPICK
|
Line 4767 ENDPICK
|
|
|
sub csvupload_fields { |
sub csvupload_fields { |
my ($symb,$errorref) = @_; |
my ($symb,$errorref) = @_; |
|
my $toolsymb; |
|
if ($symb =~ /ext\.tool$/) { |
|
$toolsymb = $symb; |
|
} |
my (@parts) = &getpartlist($symb,$errorref); |
my (@parts) = &getpartlist($symb,$errorref); |
if (ref($errorref)) { |
if (ref($errorref)) { |
if ($$errorref) { |
if ($$errorref) { |
Line 4172 sub csvupload_fields {
|
Line 4780 sub csvupload_fields {
|
|
|
my @fields=(['ID','Student/Employee ID'], |
my @fields=(['ID','Student/Employee ID'], |
['username','Student Username'], |
['username','Student Username'], |
|
['clicker','Clicker ID'], |
['domain','Student Domain']); |
['domain','Student Domain']); |
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); |
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); |
foreach my $part (sort(@parts)) { |
foreach my $part (sort(@parts)) { |
my @datum; |
my @datum; |
my $display=&Apache::lonnet::metadata($url,$part.'.display'); |
my $display=&Apache::lonnet::metadata($url,$part.'.display',$toolsymb); |
my $name=$part; |
my $name=$part; |
if (!$display) { $display = $name; } |
if (!$display) { $display = $name; } |
@datum=($name,$display); |
@datum=($name,$display); |
if ($name=~/^stores_(.*)_awarded/) { |
if ($name=~/^stores_(.*)_awarded/) { |
push(@fields,['stores_'.$1.'_points',"Points [Part: $1]"]); |
push(@fields,['stores_'.$1.'_points',"Points [Part: $1]"]); |
Line 4202 ENDPICK
|
Line 4811 ENDPICK
|
|
|
sub checkforfile_js { |
sub checkforfile_js { |
my $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); |
my $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); |
|
&js_escape(\$alertmsg); |
my $result = &Apache::lonhtmlcommon::scripttag(<<CSVFORMJS); |
my $result = &Apache::lonhtmlcommon::scripttag(<<CSVFORMJS); |
function checkUpload(formname) { |
function checkUpload(formname) { |
if (formname.upfile.value == "") { |
if (formname.upfile.value == "") { |
Line 4245 ENDUPFORM
|
Line 4855 ENDUPFORM
|
|
|
|
|
sub csvuploadmap { |
sub csvuploadmap { |
my ($request,$symb)= @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
|
|
my $datatoken; |
my $datatoken; |
if (!$env{'form.datatoken'}) { |
if (!$env{'form.datatoken'}) { |
$datatoken=&Apache::loncommon::upfile_store($request); |
$datatoken=&Apache::loncommon::upfile_store($request); |
} else { |
} else { |
$datatoken=$env{'form.datatoken'}; |
$datatoken=&Apache::loncommon::valid_datatoken($env{'form.datatoken'}); |
&Apache::loncommon::load_tmp_file($request); |
if ($datatoken ne '') { |
|
&Apache::loncommon::load_tmp_file($request,$datatoken); |
|
} |
} |
} |
my @records=&Apache::loncommon::upfile_record_sep(); |
my @records=&Apache::loncommon::upfile_record_sep(); |
&csvuploadmap_header($request,$symb,$datatoken,$#records+1); |
&csvuploadmap_header($request,$symb,$datatoken,$#records+1); |
Line 4339 sub get_fields {
|
Line 4951 sub get_fields {
|
} |
} |
|
|
sub csvuploadassign { |
sub csvuploadassign { |
my ($request,$symb)= @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
my $error_msg = ''; |
my $error_msg = ''; |
&Apache::loncommon::load_tmp_file($request); |
my $datatoken = &Apache::loncommon::valid_datatoken($env{'form.datatoken'}); |
|
if ($datatoken ne '') { |
|
&Apache::loncommon::load_tmp_file($request,$datatoken); |
|
} |
my @gradedata = &Apache::loncommon::upfile_record_sep(); |
my @gradedata = &Apache::loncommon::upfile_record_sep(); |
my %fields=&get_fields(); |
my %fields=&get_fields(); |
my $courseid=$env{'request.course.id'}; |
my $courseid=$env{'request.course.id'}; |
Line 4365 sub csvuploadassign {
|
Line 4980 sub csvuploadassign {
|
if (!$username) { |
if (!$username) { |
my $id=$entries{$fields{'ID'}}; |
my $id=$entries{$fields{'ID'}}; |
$id=~s/\s//g; |
$id=~s/\s//g; |
my %ids=&Apache::lonnet::idget($domain,$id); |
if ($id ne '') { |
$username=$ids{$id}; |
my %ids=&Apache::lonnet::idget($domain,[$id]); |
|
$username=$ids{$id}; |
|
} else { |
|
if ($entries{$fields{'clicker'}}) { |
|
my $clicker = $entries{$fields{'clicker'}}; |
|
$clicker=~s/\s//g; |
|
if ($clicker ne '') { |
|
my %clickers = &Apache::lonnet::idget($domain,[$clicker],'clickers'); |
|
if ($clickers{$clicker} ne '') { |
|
my $match = 0; |
|
my @inclass; |
|
foreach my $poss (split(/,/,$clickers{$clicker})) { |
|
if (exists($$classlist{"$poss:$domain"})) { |
|
$username = $poss; |
|
push(@inclass,$poss); |
|
$match ++; |
|
|
|
} |
|
} |
|
if ($match > 1) { |
|
undef($username); |
|
$request->print('<p class="LC_warning">'. |
|
&mt('Score not saved for clicker: [_1] (matched multiple usernames: [_2])', |
|
$clicker,join(', ',@inclass)).'</p>'); |
|
} |
|
} |
|
} |
|
} |
|
} |
} |
} |
if (!exists($$classlist{"$username:$domain"})) { |
if (!exists($$classlist{"$username:$domain"})) { |
my $id=$entries{$fields{'ID'}}; |
my $id=$entries{$fields{'ID'}}; |
$id=~s/\s//g; |
$id=~s/\s//g; |
if ($id) { |
my $clicker = $entries{$fields{'clicker'}}; |
|
$clicker=~s/\s//g; |
|
if ($clicker) { |
|
push(@skipped,"$clicker:$domain"); |
|
} elsif ($id) { |
push(@skipped,"$id:$domain"); |
push(@skipped,"$id:$domain"); |
} else { |
} else { |
push(@skipped,"$username:$domain"); |
push(@skipped,"$username:$domain"); |
Line 4420 sub csvuploadassign {
|
Line 5067 sub csvuploadassign {
|
$grades{$store_key}=$entries{$fields{$dest}}; |
$grades{$store_key}=$entries{$fields{$dest}}; |
} |
} |
} |
} |
if (! %grades) { |
if (! %grades) { |
push(@skipped,&mt("[_1]: no data to save","$username:$domain")); |
push(@skipped,&mt("[_1]: no data to save","$username:$domain")); |
} else { |
} else { |
$grades{"resource.regrader"}="$env{'user.name'}:$env{'user.domain'}"; |
$grades{"resource.regrader"}="$env{'user.name'}:$env{'user.domain'}"; |
Line 4471 sub pickStudentPage {
|
Line 5118 sub pickStudentPage {
|
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
|
|
my $alertmsg = &mt('Please select the student you wish to grade.'); |
my $alertmsg = &mt('Please select the student you wish to grade.'); |
|
&js_escape(\$alertmsg); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT)); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT)); |
|
|
function checkPickOne(formname) { |
function checkPickOne(formname) { |
Line 4490 LISTJAVASCRIPT
|
Line 5138 LISTJAVASCRIPT
|
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 $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'}; |
my $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'}; |
|
my $getgroup = $env{'form.group'} eq '' ? 'all' : $env{'form.group'}; |
|
|
my $result='<h3><span class="LC_info"> '. |
my $result='<h3><span class="LC_info"> '. |
&mt('Manual Grading by Page or Sequence').'</span></h3>'; |
&mt('Manual Grading by Page or Sequence').'</span></h3>'; |
Line 4579 LISTJAVASCRIPT
|
Line 5228 LISTJAVASCRIPT
|
'<th>'.&nameUserString('header').'</th>'. |
'<th>'.&nameUserString('header').'</th>'. |
&Apache::loncommon::end_data_table_header_row(); |
&Apache::loncommon::end_data_table_header_row(); |
|
|
my (undef,undef,$fullname) = &getclasslist($getsec,'1'); |
my (undef,undef,$fullname) = &getclasslist($getsec,'1',$getgroup); |
my $ptr = 1; |
my $ptr = 1; |
foreach my $student (sort |
foreach my $student (sort |
{ |
{ |
Line 4629 sub getSymbMap {
|
Line 5278 sub getSymbMap {
|
my @sequences = $navmap->retrieveResources(undef, sub { shift->is_map(); }, |
my @sequences = $navmap->retrieveResources(undef, sub { shift->is_map(); }, |
1,0,1); |
1,0,1); |
for my $sequence ($navmap->getById('0.0'), @sequences) { |
for my $sequence ($navmap->getById('0.0'), @sequences) { |
if ($navmap->hasResource($sequence, sub { shift->is_problem(); }, 0) ) { |
if ($navmap->hasResource($sequence, sub { shift->is_gradable(); }, 0) ) { |
my $title = $minder.'.'. |
my $title = $minder.'.'. |
&HTML::Entities::encode($sequence->compTitle(),'"\'&'); |
&HTML::Entities::encode($sequence->compTitle(),'"\'&'); |
push(@titles, $title); # minder in case two titles are identical |
push(@titles, $title); # minder in case two titles are identical |
Line 4726 sub displayPage {
|
Line 5375 sub displayPage {
|
if($curRes == $iterator->BEGIN_MAP) { $depth++; } |
if($curRes == $iterator->BEGIN_MAP) { $depth++; } |
if($curRes == $iterator->END_MAP) { $depth--; } |
if($curRes == $iterator->END_MAP) { $depth--; } |
|
|
if (ref($curRes) && $curRes->is_problem()) { |
if (ref($curRes) && $curRes->is_gradable()) { |
my $parts = $curRes->parts(); |
my $parts = $curRes->parts(); |
my $title = $curRes->compTitle(); |
my $title = $curRes->compTitle(); |
my $symbx = $curRes->symb(); |
my $symbx = $curRes->symb(); |
|
my $is_tool = ($symbx =~ /ext\.tool$/); |
$studentTable.= |
$studentTable.= |
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td align="center" valign="top" >'.$prob. |
'<td align="center" valign="top" >'.$prob. |
Line 4740 sub displayPage {
|
Line 5390 sub displayPage {
|
'</td>'; |
'</td>'; |
$studentTable.='<td valign="top">'; |
$studentTable.='<td valign="top">'; |
my %form = ('CODE' => $env{'form.CODE'},); |
my %form = ('CODE' => $env{'form.CODE'},); |
if ($env{'form.vProb'} eq 'yes' ) { |
if ($is_tool) { |
$studentTable.=&show_problem($request,$symbx,$uname,$udom,1, |
$studentTable.=' <b>'.$title.'</b><br />'; |
undef,'both',\%form); |
} else { |
} else { |
if ($env{'form.vProb'} eq 'yes' ) { |
my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$env{'request.course.id'},%form); |
$studentTable.=&show_problem($request,$symbx,$uname,$udom,1, |
$companswer =~ s|<form(.*?)>||g; |
undef,'both',\%form); |
$companswer =~ s|</form>||g; |
} else { |
# while ($companswer =~ /(<a href\=\"javascript:newWindow.*?Script Vars<\/a>)/s) { #<a href="javascript:newWindow</a> |
my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$env{'request.course.id'},%form); |
# $companswer =~ s/$1/ /ms; |
$companswer =~ s|<form(.*?)>||g; |
# $request->print('match='.$1."<br />\n"); |
$companswer =~ s|</form>||g; |
# } |
# while ($companswer =~ /(<a href\=\"javascript:newWindow.*?Script Vars<\/a>)/s) { #<a href="javascript:newWindow</a> |
# $companswer =~ s|<table border=\"1\">|<table border=\"0\">|g; |
# $companswer =~ s/$1/ /ms; |
$studentTable.=' <b>'.$title.'</b> <br /> <b>'.&mt('Correct answer').':</b><br />'.$companswer; |
# $request->print('match='.$1."<br />\n"); |
|
# } |
|
# $companswer =~ s|<table border=\"1\">|<table border=\"0\">|g; |
|
$studentTable.=' <b>'.$title.'</b> <br /> <b>'.&mt('Correct answer').':</b><br />'.$companswer; |
|
} |
} |
} |
|
|
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); |
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); |
|
|
if ($env{'form.lastSub'} eq 'datesub') { |
if ($env{'form.lastSub'} eq 'datesub') { |
if ($record{'version'} eq '') { |
if ($record{'version'} eq '') { |
$studentTable.='<br /> <span class="LC_warning">'.&mt('No recorded submission for this problem.').'</span><br />'; |
my $msg = &mt('No recorded submission for this problem.'); |
|
if ($is_tool) { |
|
$msg = &mt('No recorded transactions for this external tool'); |
|
} |
|
$studentTable.='<br /> <span class="LC_warning">'.$msg.'</span><br />'; |
} else { |
} else { |
my %responseType = (); |
my %responseType = (); |
foreach my $partid (@{$parts}) { |
foreach my $partid (@{$parts}) { |
Line 4772 sub displayPage {
|
Line 5430 sub displayPage {
|
$responseType{$partid} = \%responseIds; |
$responseType{$partid} = \%responseIds; |
} |
} |
$studentTable.= &displaySubByDates($symbx,\%record,$parts,\%responseType,$checkIcon,$uname,$udom); |
$studentTable.= &displaySubByDates($symbx,\%record,$parts,\%responseType,$checkIcon,$uname,$udom); |
|
|
} |
} |
} elsif ($env{'form.lastSub'} eq 'all') { |
} elsif ($env{'form.lastSub'} eq 'all') { |
my $last = ($env{'form.lastSub'} eq 'last' ? 'last' : ''); |
my $last = ($env{'form.lastSub'} eq 'last' ? 'last' : ''); |
|
my $identifier = (&canmodify($usec)? $prob : ''); |
$studentTable.=&Apache::loncommon::get_previous_attempt($symbx,$uname,$udom, |
$studentTable.=&Apache::loncommon::get_previous_attempt($symbx,$uname,$udom, |
$env{'request.course.id'}, |
$env{'request.course.id'}, |
'','.submission'); |
'','.submission',undef, |
|
$usec,$identifier); |
|
|
} |
} |
if (&canmodify($usec)) { |
if (&canmodify($usec)) { |
Line 4796 sub displayPage {
|
Line 5455 sub displayPage {
|
} |
} |
$curRes = $iterator->next(); |
$curRes = $iterator->next(); |
} |
} |
|
my $disabled; |
|
unless (&canmodify($usec)) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
|
|
$studentTable.= |
$studentTable.= |
'</table>'."\n". |
'</table>'."\n". |
'<input type="button" value="'.&mt('Save').'" '. |
'<input type="button" value="'.&mt('Save').'"'.$disabled.' '. |
'onclick="javascript:checkSubmitPage(this.form,'.$question.');" />'. |
'onclick="javascript:checkSubmitPage(this.form,'.$question.');" />'. |
'</form>'."\n"; |
'</form>'."\n"; |
$request->print($studentTable); |
$request->print($studentTable); |
Line 4811 sub displaySubByDates {
|
Line 5474 sub displaySubByDates {
|
my ($symb,$record,$parts,$responseType,$checkIcon,$uname,$udom) = @_; |
my ($symb,$record,$parts,$responseType,$checkIcon,$uname,$udom) = @_; |
my $isCODE=0; |
my $isCODE=0; |
my $isTask = ($symb =~/\.task$/); |
my $isTask = ($symb =~/\.task$/); |
|
my $is_tool = ($symb =~/\.tool$/); |
if (exists($record->{'resource.CODE'})) { $isCODE=1; } |
if (exists($record->{'resource.CODE'})) { $isCODE=1; } |
my $studentTable=&Apache::loncommon::start_data_table(). |
my $studentTable=&Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
'<th>'.&mt('Date/Time').'</th>'. |
'<th>'.&mt('Date/Time').'</th>'. |
($isCODE?'<th>'.&mt('CODE').'</th>':''). |
($isCODE?'<th>'.&mt('CODE').'</th>':''). |
($isTask?'<th>'.&mt('Version').'</th>':''). |
($isTask?'<th>'.&mt('Version').'</th>':''). |
'<th>'.&mt('Submission').'</th>'. |
'<th>'.($is_tool?&mt('Grade'):&mt('Submission')).'</th>'. |
'<th>'.&mt('Status').'</th>'. |
'<th>'.&mt('Status').'</th>'. |
&Apache::loncommon::end_data_table_header_row(); |
&Apache::loncommon::end_data_table_header_row(); |
my ($version); |
my ($version); |
Line 4825 sub displaySubByDates {
|
Line 5489 sub displaySubByDates {
|
my %orders; |
my %orders; |
$mark{'correct_by_student'} = $checkIcon; |
$mark{'correct_by_student'} = $checkIcon; |
if (!exists($$record{'1:timestamp'})) { |
if (!exists($$record{'1:timestamp'})) { |
return '<br /> <span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br />'; |
if ($is_tool) { |
|
return '<br /> <span class="LC_warning">'.&mt('No grade passed back.').'</span><br />'; |
|
} else { |
|
return '<br /> <span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br />'; |
|
} |
} |
} |
|
|
my $interaction; |
my $interaction; |
my $no_increment = 1; |
my $no_increment = 1; |
my %lastrndseed; |
my (%lastrndseed,%lasttype); |
for ($version=1;$version<=$$record{'version'};$version++) { |
for ($version=1;$version<=$$record{'version'};$version++) { |
my $timestamp = |
my $timestamp = |
&Apache::lonlocal::locallocaltime($$record{$version.':timestamp'}); |
&Apache::lonlocal::locallocaltime($$record{$version.':timestamp'}); |
Line 4858 sub displaySubByDates {
|
Line 5526 sub displaySubByDates {
|
if (($type eq 'anonsurvey') || ($type eq 'anonsurveycred')) { |
if (($type eq 'anonsurvey') || ($type eq 'anonsurveycred')) { |
$hidden = 1; |
$hidden = 1; |
} |
} |
my @matchKey = ($isTask ? sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys) |
my @matchKey; |
: sort(grep /^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys)); |
if ($isTask) { |
|
@matchKey = sort(grep(/^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys)); |
|
} elsif ($is_tool) { |
|
@matchKey = sort(grep(/^resource\.\Q$partid\E\.awarded$/,@versionKeys)); |
|
} else { |
|
@matchKey = sort(grep(/^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys)); |
|
} |
# next if ($$record{"$version:resource.$partid.solved"} eq ''); |
# next if ($$record{"$version:resource.$partid.solved"} eq ''); |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
foreach my $matchKey (@matchKey) { |
foreach my $matchKey (@matchKey) { |
if (exists($$record{$version.':'.$matchKey}) && |
if (exists($$record{$version.':'.$matchKey}) && |
$$record{$version.':'.$matchKey} ne '') { |
$$record{$version.':'.$matchKey} ne '') { |
|
if ($is_tool) { |
my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) |
$displaySub[0].=$$record{"$version:resource.$partid.awarded"}; |
: ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/)); |
|
$displaySub[0].='<span class="LC_nobreak">'; |
|
$displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>' |
|
.' <span class="LC_internal_info">' |
|
.'('.&mt('Response ID: [_1]',$responseId).')' |
|
.'</span>' |
|
.' <b>'; |
|
if ($hidden) { |
|
$displaySub[0].= &mt('Anonymous Survey').'</b>'; |
|
} else { |
} else { |
my ($trial,$rndseed,$newvariation); |
my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) |
if ($type eq 'randomizetry') { |
: ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/)); |
$trial = $$record{"$where.$partid.tries"}; |
$displaySub[0].='<span class="LC_nobreak">'; |
$rndseed = $$record{"$where.$partid.rndseed"}; |
$displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>' |
} |
.' <span class="LC_internal_info">' |
if ($$record{"$where.$partid.tries"} eq '') { |
.'('.&mt('Response ID: [_1]',$responseId).')' |
$displaySub[0].=&mt('Trial not counted'); |
.'</span>' |
} else { |
.' <b>'; |
$displaySub[0].=&mt('Trial: [_1]', |
if ($hidden) { |
$$record{"$where.$partid.tries"}); |
$displaySub[0].= &mt('Anonymous Survey').'</b>'; |
if ($rndseed || $lastrndseed{$partid}) { |
} else { |
if ($rndseed ne $lastrndseed{$partid}) { |
my ($trial,$rndseed,$newvariation); |
$newvariation = ' ('.&mt('New variation this try').')'; |
if ($type eq 'randomizetry') { |
} |
$trial = $$record{"$where.$partid.tries"}; |
|
$rndseed = $$record{"$where.$partid.rndseed"}; |
} |
} |
$lastrndseed{$partid} = $rndseed; |
if ($$record{"$where.$partid.tries"} eq '') { |
} |
$displaySub[0].=&mt('Trial not counted'); |
my $responseType=($isTask ? 'Task' |
} else { |
|
$displaySub[0].=&mt('Trial: [_1]', |
|
$$record{"$where.$partid.tries"}); |
|
if (($rndseed ne '') && ($lastrndseed{$partid} ne '')) { |
|
if (($rndseed ne $lastrndseed{$partid}) && |
|
(($type eq 'randomizetry') || ($lasttype{$partid} eq 'randomizetry'))) { |
|
$newvariation = ' ('.&mt('New variation this try').')'; |
|
} |
|
} |
|
$lastrndseed{$partid} = $rndseed; |
|
$lasttype{$partid} = $type; |
|
} |
|
my $responseType=($isTask ? 'Task' |
: $responseType->{$partid}->{$responseId}); |
: $responseType->{$partid}->{$responseId}); |
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
if ((!exists($orders{$partid}->{$responseId})) || ($trial)) { |
if ((!exists($orders{$partid}->{$responseId})) || ($trial)) { |
$orders{$partid}->{$responseId}= |
$orders{$partid}->{$responseId}= |
&get_order($partid,$responseId,$symb,$uname,$udom, |
&get_order($partid,$responseId,$symb,$uname,$udom, |
$no_increment,$type,$trial,$rndseed); |
$no_increment,$type,$trial,$rndseed); |
} |
} |
$displaySub[0].='</b>'.$newvariation.'</span>'; # /nobreak |
$displaySub[0].='</b>'.$newvariation.'</span>'; # /nobreak |
$displaySub[0].=' '. |
$displaySub[0].=' '. |
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).'<br />'; |
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).'<br />'; |
|
} |
} |
} |
} |
} |
} |
} |
Line 4920 sub displaySubByDates {
|
Line 5598 sub displaySubByDates {
|
lc($$record{"$where.$partid.award"}).' '. |
lc($$record{"$where.$partid.award"}).' '. |
$mark{$$record{"$where.$partid.solved"}}. |
$mark{$$record{"$where.$partid.solved"}}. |
'<br />'; |
'<br />'; |
|
} elsif (($is_tool) && (exists($$record{"$version:resource.$partid.solved"}))) { |
|
if ($$record{"$version:resource.$partid.solved"} =~ /^(in|)correct_by_passback$/) { |
|
$displaySub[1].=&mt('Grade passed back by external tool'); |
|
} |
} |
} |
if (exists $$record{"$where.$partid.regrader"}) { |
if (exists $$record{"$where.$partid.regrader"}) { |
$displaySub[2].=$$record{"$where.$partid.regrader"}. |
$displaySub[2].=$$record{"$where.$partid.regrader"}; |
' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
unless ($is_tool) { |
|
$displaySub[2].=' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
|
} |
} elsif ($$record{"$version:resource.$partid.regrader"} =~ /\S/) { |
} elsif ($$record{"$version:resource.$partid.regrader"} =~ /\S/) { |
$displaySub[2].= |
$displaySub[2].= |
$$record{"$version:resource.$partid.regrader"}. |
$$record{"$version:resource.$partid.regrader"}; |
' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
unless ($is_tool) { |
|
$displaySub[2].=' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
|
} |
} |
} |
} |
} |
# needed because old essay regrader has not parts info |
# needed because old essay regrader has not parts info |
Line 4991 sub updateGradeByPage {
|
Line 5677 sub updateGradeByPage {
|
|
|
$iterator->next(); # skip the first BEGIN_MAP |
$iterator->next(); # skip the first BEGIN_MAP |
my $curRes = $iterator->next(); # for "current resource" |
my $curRes = $iterator->next(); # for "current resource" |
my ($depth,$question,$prob,$changeflag)= (1,1,1,0); |
my ($depth,$question,$prob,$changeflag,$hideflag)= (1,1,1,0,0); |
while ($depth > 0) { |
while ($depth > 0) { |
if($curRes == $iterator->BEGIN_MAP) { $depth++; } |
if($curRes == $iterator->BEGIN_MAP) { $depth++; } |
if($curRes == $iterator->END_MAP) { $depth--; } |
if($curRes == $iterator->END_MAP) { $depth--; } |
Line 5012 sub updateGradeByPage {
|
Line 5698 sub updateGradeByPage {
|
my @displayPts=(); |
my @displayPts=(); |
my %aggregate = (); |
my %aggregate = (); |
my $aggregateflag = 0; |
my $aggregateflag = 0; |
|
if ($env{'form.HIDE'.$prob}) { |
|
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); |
|
my ($version,$parts) = split(/:/,$env{'form.HIDE'.$prob},2); |
|
my $numchgs = &makehidden($version,$parts,\%record,$symbx,$udom,$uname,1); |
|
$hideflag += $numchgs; |
|
} |
foreach my $partid (@{$parts}) { |
foreach my $partid (@{$parts}) { |
my $newpts = $env{'form.GD_BOX'.$question.'_'.$partid}; |
my $newpts = $env{'form.GD_BOX'.$question.'_'.$partid}; |
my $oldpts = $env{'form.oldpts'.$question.'_'.$partid}; |
my $oldpts = $env{'form.oldpts'.$question.'_'.$partid}; |
Line 5102 sub updateGradeByPage {
|
Line 5794 sub updateGradeByPage {
|
$studentTable.=&Apache::loncommon::end_data_table(); |
$studentTable.=&Apache::loncommon::end_data_table(); |
my $grademsg=($changeflag == 0 ? &mt('No score was changed or updated.') : |
my $grademsg=($changeflag == 0 ? &mt('No score was changed or updated.') : |
&mt('The scores were changed for [quant,_1,problem].', |
&mt('The scores were changed for [quant,_1,problem].', |
$changeflag)); |
$changeflag).'<br />'); |
$request->print($grademsg.$studentTable); |
my $hidemsg=($hideflag == 0 ? '' : |
|
&mt('Submissions were marked "hidden" for [quant,_1,transaction].', |
|
$hideflag).'<br />'); |
|
$request->print($hidemsg.$grademsg.$studentTable); |
|
|
return ''; |
return ''; |
} |
} |
Line 5177 the homework problem.
|
Line 5872 the homework problem.
|
|
|
sub defaultFormData { |
sub defaultFormData { |
my ($symb)=@_; |
my ($symb)=@_; |
return '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'; |
return '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'; |
} |
} |
|
|
|
|
Line 5330 sub scantron_uploads {
|
Line 6025 sub scantron_uploads {
|
sub scantron_scantab { |
sub scantron_scantab { |
my $result='<select name="scantron_format">'."\n"; |
my $result='<select name="scantron_format">'."\n"; |
$result.='<option></option>'."\n"; |
$result.='<option></option>'."\n"; |
my @lines = &get_scantronformat_file(); |
my @lines = &Apache::lonnet::get_scantronformat_file(); |
if (@lines > 0) { |
if (@lines > 0) { |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
next if (($line =~ /^\#/) || ($line eq '')); |
next if (($line =~ /^\#/) || ($line eq '')); |
Line 5342 sub scantron_scantab {
|
Line 6037 sub scantron_scantab {
|
return $result; |
return $result; |
} |
} |
|
|
=pod |
|
|
|
=item get_scantronformat_file |
|
|
|
Returns an array containing lines from the scantron format file for |
|
the domain of the course. |
|
|
|
If a url for a custom.tab file is listed in domain's configuration.db, |
|
lines are from this file. |
|
|
|
Otherwise, if a default.tab has been published in RES space by the |
|
domainconfig user, lines are from this file. |
|
|
|
Otherwise, fall back to getting lines from the legacy file on the |
|
local server: /home/httpd/lonTabs/default_scantronformat.tab |
|
|
|
=cut |
|
|
|
sub get_scantronformat_file { |
|
my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$cdom); |
|
my $gottab = 0; |
|
my @lines; |
|
if (ref($domconfig{'scantron'}) eq 'HASH') { |
|
if ($domconfig{'scantron'}{'scantronformat'} ne '') { |
|
my $formatfile = &Apache::lonnet::getfile($Apache::lonnet::perlvar{'lonDocRoot'}.$domconfig{'scantron'}{'scantronformat'}); |
|
if ($formatfile ne '-1') { |
|
@lines = split("\n",$formatfile,-1); |
|
$gottab = 1; |
|
} |
|
} |
|
} |
|
if (!$gottab) { |
|
my $confname = $cdom.'-domainconfig'; |
|
my $default = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$cdom.'/'.$confname.'/default.tab'; |
|
my $formatfile = &Apache::lonnet::getfile($default); |
|
if ($formatfile ne '-1') { |
|
@lines = split("\n",$formatfile,-1); |
|
$gottab = 1; |
|
} |
|
} |
|
if (!$gottab) { |
|
my @domains = &Apache::lonnet::current_machine_domains(); |
|
if (grep(/^\Q$cdom\E$/,@domains)) { |
|
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
|
@lines = <$fh>; |
|
close($fh); |
|
} else { |
|
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab'); |
|
@lines = <$fh>; |
|
close($fh); |
|
} |
|
} |
|
return @lines; |
|
} |
|
|
|
=pod |
=pod |
|
|
=item scantron_CODElist |
=item scantron_CODElist |
Line 5476 sub scantron_selectphase {
|
Line 6115 sub scantron_selectphase {
|
|
|
$ssi_error = 0; |
$ssi_error = 0; |
|
|
if (&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || |
if (&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || $perm{'usc'}) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'})) { |
|
|
|
# Chunk of form to prompt for a scantron file upload. |
# Chunk of form to prompt for a scantron file upload. |
|
|
$r->print(' |
$r->print(' |
<br /> |
<br />'); |
'.&Apache::loncommon::start_data_table('LC_scantron_action').' |
|
'.&Apache::loncommon::start_data_table_header_row().' |
|
<th> |
|
'.&mt('Specify a bubblesheet data file to upload.').' |
|
</th> |
|
'.&Apache::loncommon::end_data_table_header_row().' |
|
'.&Apache::loncommon::start_data_table_row().' |
|
<td> |
|
'); |
|
my $default_form_data=&defaultFormData($symb); |
|
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 $csec= $env{'request.course.sec'}; |
|
my $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); |
|
&js_escape(\$alertmsg); |
|
my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($cdom); |
$r->print(&Apache::lonhtmlcommon::scripttag(' |
$r->print(&Apache::lonhtmlcommon::scripttag(' |
function checkUpload(formname) { |
function checkUpload(formname) { |
if (formname.upfile.value == "") { |
if (formname.upfile.value == "") { |
alert("'.&mt('Please use the browse button to select a file from your local directory.').'"); |
alert("'.$alertmsg.'"); |
return false; |
return false; |
} |
} |
formname.submit(); |
formname.submit(); |
}')); |
}'."\n".$formatjs)); |
$r->print(' |
$r->print(' |
<form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> |
<form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> |
'.$default_form_data.' |
'.$default_form_data.' |
<input name="courseid" type="hidden" value="'.$cnum.'" /> |
<input name="courseid" type="hidden" value="'.$cnum.'" /> |
|
<input name="coursesec" type="hidden" value="'.$csec.'" /> |
<input name="domainid" type="hidden" value="'.$cdom.'" /> |
<input name="domainid" type="hidden" value="'.$cdom.'" /> |
<input name="command" value="scantronupload_save" type="hidden" /> |
<input name="command" value="scantronupload_save" type="hidden" /> |
'.&mt('File to upload: [_1]','<input type="file" name="upfile" size="50" />').' |
'.&Apache::loncommon::start_data_table('LC_scantron_action').' |
<br /> |
'.&Apache::loncommon::start_data_table_header_row().' |
<input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> |
<th> |
</form> |
'.&mt('Specify a bubblesheet data file to upload.').' |
'); |
</th> |
|
'.&Apache::loncommon::end_data_table_header_row().' |
|
'.&Apache::loncommon::start_data_table_row().' |
|
<td> |
|
'.&mt('File to upload: [_1]','<input type="file" name="upfile" size="50" />').'<br />'."\n"); |
|
if ($formatoptions) { |
|
$r->print('</td> |
|
'.&Apache::loncommon::end_data_table_row().' |
|
'.&Apache::loncommon::start_data_table_row().' |
|
<td>'.$formattitle.(' 'x2).$formatoptions.' |
|
</td> |
|
'.&Apache::loncommon::end_data_table_row().' |
|
'.&Apache::loncommon::start_data_table_row().' |
|
<td>' |
|
); |
|
} else { |
|
$r->print(' <br />'); |
|
} |
|
$r->print('<input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> |
|
</td> |
|
'.&Apache::loncommon::end_data_table_row().' |
|
'.&Apache::loncommon::end_data_table().' |
|
</form>' |
|
); |
|
|
$r->print(' |
|
</td> |
|
'.&Apache::loncommon::end_data_table_row().' |
|
'.&Apache::loncommon::end_data_table().' |
|
'); |
|
} |
} |
|
|
# Chunk of form to prompt for a file to grade and how: |
# Chunk of form to prompt for a file to grade and how: |
Line 5569 sub scantron_selectphase {
|
Line 6220 sub scantron_selectphase {
|
|
|
$r->print($result); |
$r->print($result); |
|
|
|
|
|
|
# Chunk of the form that prompts to view a scoring office file, |
# Chunk of the form that prompts to view a scoring office file, |
# corrected file, skipped records in a file. |
# corrected file, skipped records in a file. |
|
|
Line 5632 sub scantron_selectphase {
|
Line 6281 sub scantron_selectphase {
|
return; |
return; |
} |
} |
|
|
=pod |
|
|
|
=item get_scantron_config |
|
|
|
Parse and return the bubblesheet configuration line selected as a |
|
hash of configuration file fields. |
|
|
|
Arguments: |
|
which - the name of the configuration to parse from the file. |
|
|
|
|
|
Returns: |
|
If the named configuration is not in the file, an empty |
|
hash is returned. |
|
a hash with the fields |
|
name - internal name for the this configuration setup |
|
description - text to display to operator that describes this config |
|
CODElocation - if 0 or the string 'none' |
|
- no CODE exists for this config |
|
if -1 || the string 'letter' |
|
- a CODE exists for this config and is |
|
a string of letters |
|
Unsupported value (but planned for future support) |
|
if a positive integer |
|
- The CODE exists as the first n items from |
|
the question section of the form |
|
if the string 'number' |
|
- The CODE exists for this config and is |
|
a string of numbers |
|
CODEstart - (only matter if a CODE exists) column in the line where |
|
the CODE starts |
|
CODElength - length of the CODE |
|
IDstart - column where the student/employee ID starts |
|
IDlength - length of the student/employee ID info |
|
Qstart - column where the information from the bubbled |
|
'questions' start |
|
Qlength - number of columns comprising a single bubble line from |
|
the sheet. (usually either 1 or 10) |
|
Qon - either a single character representing the character used |
|
to signal a bubble was chosen in the positional setup, or |
|
the string 'letter' if the letter of the chosen bubble is |
|
in the final, or 'number' if a number representing the |
|
chosen bubble is in the file (1->A 0->J) |
|
Qoff - the character used to represent that a bubble was |
|
left blank |
|
PaperID - if the scanning process generates a unique number for each |
|
sheet scanned the column that this ID number starts in |
|
PaperIDlength - number of columns that comprise the unique ID number |
|
for the sheet of paper |
|
FirstName - column that the first name starts in |
|
FirstNameLength - number of columns that the first name spans |
|
|
|
LastName - column that the last name starts in |
|
LastNameLength - number of columns that the last name spans |
|
BubblesPerRow - number of bubbles available in each row used to |
|
bubble an answer. (If not specified, 10 assumed). |
|
|
|
=cut |
|
|
|
sub get_scantron_config { |
|
my ($which) = @_; |
|
my @lines = &get_scantronformat_file(); |
|
my %config; |
|
#FIXME probably should move to XML it has already gotten a bit much now |
|
foreach my $line (@lines) { |
|
my ($name,$descrip)=split(/:/,$line); |
|
if ($name ne $which ) { next; } |
|
chomp($line); |
|
my @config=split(/:/,$line); |
|
$config{'name'}=$config[0]; |
|
$config{'description'}=$config[1]; |
|
$config{'CODElocation'}=$config[2]; |
|
$config{'CODEstart'}=$config[3]; |
|
$config{'CODElength'}=$config[4]; |
|
$config{'IDstart'}=$config[5]; |
|
$config{'IDlength'}=$config[6]; |
|
$config{'Qstart'}=$config[7]; |
|
$config{'Qlength'}=$config[8]; |
|
$config{'Qoff'}=$config[9]; |
|
$config{'Qon'}=$config[10]; |
|
$config{'PaperID'}=$config[11]; |
|
$config{'PaperIDlength'}=$config[12]; |
|
$config{'FirstName'}=$config[13]; |
|
$config{'FirstNamelength'}=$config[14]; |
|
$config{'LastName'}=$config[15]; |
|
$config{'LastNamelength'}=$config[16]; |
|
$config{'BubblesPerRow'}=$config[17]; |
|
last; |
|
} |
|
return %config; |
|
} |
|
|
|
=pod |
=pod |
|
|
=item username_to_idmap |
=item username_to_idmap |
|
|
creates a hash keyed by student/employee ID with values of the corresponding |
creates a hash keyed by student/employee ID with values of the corresponding |
student username:domain. |
student username:domain. If a single ID occurs for more than one student, |
|
the status of the student is checked, and if Active, the value in the hash |
|
will be set to the Active student. |
|
|
Arguments: |
Arguments: |
|
|
Line 5747 sub username_to_idmap {
|
Line 6306 sub username_to_idmap {
|
my ($classlist)= @_; |
my ($classlist)= @_; |
my %idmap; |
my %idmap; |
foreach my $student (keys(%$classlist)) { |
foreach my $student (keys(%$classlist)) { |
$idmap{$classlist->{$student}->[&Apache::loncoursedata::CL_ID]}= |
my $id = $classlist->{$student}->[&Apache::loncoursedata::CL_ID]; |
$student; |
unless ($id eq '') { |
|
if (!exists($idmap{$id})) { |
|
$idmap{$id} = $student; |
|
} else { |
|
my $status = $classlist->{$student}->[&Apache::loncoursedata::CL_STATUS]; |
|
if ($status eq 'Active') { |
|
$idmap{$id} = $student; |
|
} |
|
} |
|
} |
} |
} |
return %idmap; |
return %idmap; |
} |
} |
Line 5760 sub username_to_idmap {
|
Line 6328 sub username_to_idmap {
|
Process a requested correction to a scanline. |
Process a requested correction to a scanline. |
|
|
Arguments: |
Arguments: |
$scantron_config - hash from &get_scantron_config() |
$scantron_config - hash from &Apache::lonnet::get_scantron_config() |
$scan_data - hash of correction information |
$scan_data - hash of correction information |
(see &scantron_getfile()) |
(see &scantron_getfile()) |
$line - existing scanline |
$line - existing scanline |
Line 6443 sub scantron_filter {
|
Line 7011 sub scantron_filter {
|
|
|
sub scantron_process_corrections { |
sub scantron_process_corrections { |
my ($r) = @_; |
my ($r) = @_; |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $which=$env{'form.scantron_line'}; |
my $which=$env{'form.scantron_line'}; |
Line 6612 sub check_for_error {
|
Line 7180 sub check_for_error {
|
sub scantron_warning_screen { |
sub scantron_warning_screen { |
my ($button_text,$symb)=@_; |
my ($button_text,$symb)=@_; |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $CODElist; |
my $CODElist; |
if ($scantron_config{'CODElocation'} && |
if ($scantron_config{'CODElocation'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODEstart'} && |
Line 6629 sub scantron_warning_screen {
|
Line 7197 sub scantron_warning_screen {
|
'<tr><td><b>'.&mt('Hand-graded items: points from last bubble in row').'</b></td><td><tt>'. |
'<tr><td><b>'.&mt('Hand-graded items: points from last bubble in row').'</b></td><td><tt>'. |
$env{'form.scantron_lastbubblepoints'}.'</tt></td></tr>'; |
$env{'form.scantron_lastbubblepoints'}.'</tt></td></tr>'; |
} |
} |
return (' |
return ' |
<p> |
<p> |
<span class="LC_warning"> |
<span class="LC_warning"> |
'.&mt("Please double check the information below before clicking on '[_1]'",&mt($button_text)).'</span> |
'.&mt("Please double check the information below before clicking on '[_1]'",&mt($button_text)).'</span> |
Line 6641 sub scantron_warning_screen {
|
Line 7209 sub scantron_warning_screen {
|
</table> |
</table> |
<p> '.&mt("If this information is correct, please click on '[_1]'.",&mt($button_text)).'<br /> |
<p> '.&mt("If this information is correct, please click on '[_1]'.",&mt($button_text)).'<br /> |
'.&mt('If something is incorrect, please return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','<a href="/adm/grades?symb='.$symb.'&command=scantron_selectphase" class="LC_info">','</a>').'</p> |
'.&mt('If something is incorrect, please return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','<a href="/adm/grades?symb='.$symb.'&command=scantron_selectphase" class="LC_info">','</a>').'</p> |
|
'; |
<br /> |
|
'); |
|
} |
} |
|
|
=pod |
=pod |
Line 6669 sub scantron_do_warning {
|
Line 7235 sub scantron_do_warning {
|
} |
} |
if ( $env{'form.scantron_selectfile'} eq '') { |
if ( $env{'form.scantron_selectfile'} eq '') { |
$r->print('<p><span class="LC_error">'.&mt("You have not selected a file that contains the student's response data.").'</span></p>'); |
$r->print('<p><span class="LC_error">'.&mt("You have not selected a file that contains the student's response data.").'</span></p>'); |
} |
} |
if ( $env{'form.scantron_format'} eq '') { |
if ( $env{'form.scantron_format'} eq '') { |
$r->print('<p><span class="LC_error">'.&mt("You have not selected the format of the student's response data.").'</span></p>'); |
$r->print('<p><span class="LC_error">'.&mt("You have not selected the format of the student's response data.").'</span></p>'); |
} |
} |
} else { |
} else { |
my $warning=&scantron_warning_screen('Grading: Validate Records',$symb); |
my $warning=&scantron_warning_screen('Grading: Validate Records',$symb); |
|
my ($checksec,@possibles) = &gradable_sections(); |
|
my $gradesections; |
|
if ($checksec) { |
|
my $file=$env{'form.scantron_selectfile'}; |
|
if (&valid_file($file)) { |
|
my %bysec = &scantron_get_sections(); |
|
my $table; |
|
if ((keys(%bysec) > 1) || ((keys(%bysec) == 1) && ((keys(%bysec))[0] ne $checksec))) { |
|
$gradesections = &mt('Your current role is for section [_1].','<i>'.$checksec.'</i>').'<br />'; |
|
$table = &Apache::loncommon::start_data_table()."\n". |
|
&Apache::loncommon::start_data_table_header_row(). |
|
'<th>'.&mt('Section').'</th><th>'.&mt('Number of records').'</th>'. |
|
&Apache::loncommon::end_data_table_header_row()."\n"; |
|
if ($bysec{'none'}) { |
|
$table .= &Apache::loncommon::start_data_table_row(). |
|
'<td>'.&mt('None').'</td><td>'.$bysec{'none'}.'</td>'. |
|
&Apache::loncommon::end_data_table_row()."\n"; |
|
} |
|
foreach my $sec (sort { $a <=> $b } keys(%bysec)) { |
|
next if ($sec eq 'none'); |
|
$table .= &Apache::loncommon::start_data_table_row(). |
|
'<td>'.$sec.'</td><td>'.$bysec{$sec}.'</td>'. |
|
&Apache::loncommon::end_data_table_row()."\n"; |
|
} |
|
$table .= &Apache::loncommon::end_data_table()."\n"; |
|
$gradesections .= &mt('Sections represented in the bubblesheet data file (based on bubbled student IDs) are as follows:'). |
|
'<p>'.$table.'</p>'; |
|
if (@possibles) { |
|
$gradesections .= '<p>'. |
|
&mt('You have role(s) in [quant,_1,other section,other sections] with privileges to manage grades.', |
|
scalar(@possibles)).'<br />'. |
|
&mt('Check which of those section(s), in addition to section [_1], you wish to grade using this bubblesheet file:', |
|
'<i>'.$checksec.'</i>').' '; |
|
foreach my $sec (sort {$a <=> $b } @possibles) { |
|
$gradesections .= '<label><input type="checkbox" name="scantron_othersections" value="'.$sec.'" />'.$sec.'</label>'.(' 'x2); |
|
} |
|
$gradesections .= '</p>'; |
|
} |
|
} |
|
} else { |
|
$gradesections = '<p class="LC_error">'.&mt('The selected file is unavailable').'</p>'; |
|
} |
|
} |
my $bubbledbyhand=&hand_bubble_option(); |
my $bubbledbyhand=&hand_bubble_option(); |
$r->print(' |
$r->print(' |
'.$warning.$bubbledbyhand.' |
'.$warning.$gradesections.$bubbledbyhand.' |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
<input type="hidden" name="command" value="scantron_validate" /> |
<input type="hidden" name="command" value="scantron_validate" /> |
'); |
'); |
Line 6764 sub scantron_validate_file {
|
Line 7373 sub scantron_validate_file {
|
if ($env{'form.scantron_corrections'}) { |
if ($env{'form.scantron_corrections'}) { |
&scantron_process_corrections($r); |
&scantron_process_corrections($r); |
} |
} |
$r->print('<p>'.&mt('Gathering necessary information.').'</p>');$r->rflush(); |
|
|
$r->print('<p>'.&mt('Gathering necessary information.').'</p>'); |
|
my ($checksec,@gradable); |
|
if ($env{'request.course.sec'}) { |
|
($checksec,my @possibles) = &gradable_sections(); |
|
if ($checksec) { |
|
if (@possibles) { |
|
my @chosensecs = &Apache::loncommon::get_env_multiple('form.scantron_othersections'); |
|
if (@chosensecs) { |
|
foreach my $sec (@chosensecs) { |
|
if (grep(/^\Q$sec\E$/,@possibles)) { |
|
unless (grep(/^\Q$sec\E$/,@gradable)) { |
|
push(@gradable,$sec); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
$r->print('<p><table>'); |
|
if (@gradable) { |
|
my @showsections = sort { $a <=> $b } (@gradable,$checksec); |
|
$r->print( |
|
'<tr><td><b>'.&mt('Sections to be Graded:').'</b></td><td>'.join(', ',@showsections).'</td></tr>'); |
|
} else { |
|
$r->print( |
|
'<tr><td><b>'.&mt('Section to be Graded:').'</b></td><td>'.$checksec.'</td></tr>'); |
|
} |
|
$r->print('</table></p>'); |
|
} |
|
} |
|
$r->rflush(); |
|
|
#get the student pick code ready |
#get the student pick code ready |
$r->print(&Apache::loncommon::studentbrowser_javascript()); |
$r->print(&Apache::loncommon::studentbrowser_javascript()); |
my $nav_error; |
my $nav_error; |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config); |
my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config); |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
Line 6789 sub scantron_validate_file {
|
Line 7429 sub scantron_validate_file {
|
$env{'form.validatepass'} = 0; |
$env{'form.validatepass'} = 0; |
} |
} |
my $currentphase=$env{'form.validatepass'}; |
my $currentphase=$env{'form.validatepass'}; |
|
my %skipbysec=(); |
|
|
my $stop=0; |
my $stop=0; |
while (!$stop && $currentphase < scalar(@validate_phases)) { |
while (!$stop && $currentphase < scalar(@validate_phases)) { |
Line 6799 sub scantron_validate_file {
|
Line 7439 sub scantron_validate_file {
|
my $which="scantron_validate_".$validate_phases[$currentphase]; |
my $which="scantron_validate_".$validate_phases[$currentphase]; |
{ |
{ |
no strict 'refs'; |
no strict 'refs'; |
($stop,$currentphase)=&$which($r,$currentphase); |
my @extras=(); |
|
if ($validate_phases[$currentphase] eq 'ID') { |
|
@extras = (\%skipbysec,$checksec,@gradable); |
|
} |
|
($stop,$currentphase)=&$which($r,$currentphase,@extras); |
} |
} |
} |
} |
if (!$stop) { |
if (!$stop) { |
my $warning=&scantron_warning_screen('Start Grading',$symb); |
my $warning=&scantron_warning_screen('Start Grading',$symb); |
|
my $secinfo; |
|
if (keys(%skipbysec) > 0) { |
|
my $seclist = '<ul>'; |
|
foreach my $sec (sort { $a <=> $b } keys(%skipbysec)) { |
|
$seclist .= '<li>'.&mt('section [_1]: [_2]',$sec,$skipbysec{$sec}).'</li>'; |
|
} |
|
$seclist .= '</ul>'; |
|
$secinfo = '<p class="LC_info">'. |
|
&mt('Numbers of records for students in sections not being graded [_1]', |
|
$seclist). |
|
'</p>'; |
|
} |
$r->print(&mt('Validation process complete.').'<br />'. |
$r->print(&mt('Validation process complete.').'<br />'. |
$warning. |
$secinfo.$warning. |
&mt('Perform verification for each student after storage of submissions?'). |
&mt('Perform verification for each student after storage of submissions?'). |
' <span class="LC_nobreak"><label>'. |
' <span class="LC_nobreak"><label>'. |
'<input type="radio" name="verifyrecord" value="1" />'.&mt('Yes').'</label>'. |
'<input type="radio" name="verifyrecord" value="1" />'.&mt('Yes').'</label>'. |
Line 7221 sub scantron_validate_sequence {
|
Line 7877 sub scantron_validate_sequence {
|
|
|
|
|
sub scantron_validate_ID { |
sub scantron_validate_ID { |
my ($r,$currentphase) = @_; |
my ($r,$currentphase,$skipbysec,$checksec,@gradable) = @_; |
|
|
#get student info |
#get student info |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my %idmap=&username_to_idmap($classlist); |
my %idmap=&username_to_idmap($classlist); |
|
my $secidx = &Apache::loncoursedata::CL_SECTION(); |
|
|
#get scantron line setup |
#get scantron line setup |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
|
my $nav_error; |
my $nav_error; |
Line 7239 sub scantron_validate_ID {
|
Line 7896 sub scantron_validate_ID {
|
} |
} |
|
|
my %found=('ids'=>{},'usernames'=>{}); |
my %found=('ids'=>{},'usernames'=>{}); |
|
my $unsavedskips = 0; |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
my $line=&scantron_get_line($scanlines,$scan_data,$i); |
my $line=&scantron_get_line($scanlines,$scan_data,$i); |
if ($line=~/^[\s\cz]*$/) { next; } |
if ($line=~/^[\s\cz]*$/) { next; } |
Line 7251 sub scantron_validate_ID {
|
Line 7909 sub scantron_validate_ID {
|
} |
} |
if ($found) { |
if ($found) { |
my $username=$idmap{$found}; |
my $username=$idmap{$found}; |
|
if ($checksec) { |
|
if (ref($classlist->{$username}) eq 'ARRAY') { |
|
my $stusec = $classlist->{$username}->[$secidx]; |
|
if ($stusec ne $checksec) { |
|
unless ((@gradable > 0) && (grep(/^\Q$stusec\E$/,@gradable))) { |
|
my $skip=1; |
|
&scantron_put_line($scanlines,$scan_data,$i,$line,$skip); |
|
if (ref($skipbysec) eq 'HASH') { |
|
if ($stusec eq '') { |
|
$skipbysec->{'none'} ++; |
|
} else { |
|
$skipbysec->{$stusec} ++; |
|
} |
|
} |
|
$unsavedskips ++; |
|
next; |
|
} |
|
} |
|
} |
|
} |
if ($found{'ids'}{$found}) { |
if ($found{'ids'}{$found}) { |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
$line,'duplicateID',$found); |
$line,'duplicateID',$found); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} elsif ($found{'usernames'}{$username}) { |
} elsif ($found{'usernames'}{$username}) { |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
$line,'duplicateID',$username); |
$line,'duplicateID',$username); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} |
} |
#FIXME store away line we previously saw the ID on to use above |
#FIXME store away line we previously saw the ID on to use above |
Line 7266 sub scantron_validate_ID {
|
Line 7952 sub scantron_validate_ID {
|
} else { |
} else { |
if ($id =~ /^\s*$/) { |
if ($id =~ /^\s*$/) { |
my $username=&scan_data($scan_data,"$i.user"); |
my $username=&scan_data($scan_data,"$i.user"); |
if (defined($username) && $found{'usernames'}{$username}) { |
if (($checksec && $username ne '')) { |
|
if (ref($classlist->{$username}) eq 'ARRAY') { |
|
my $stusec = $classlist->{$username}->[$secidx]; |
|
if ($stusec ne $checksec) { |
|
unless ((@gradable > 0) && (grep(/^\Q$stusec\E$/,@gradable))) { |
|
my $skip=1; |
|
&scantron_put_line($scanlines,$scan_data,$i,$line,$skip); |
|
if (ref($skipbysec) eq 'HASH') { |
|
if ($stusec eq '') { |
|
$skipbysec->{'none'} ++; |
|
} else { |
|
$skipbysec->{$stusec} ++; |
|
} |
|
} |
|
$unsavedskips ++; |
|
next; |
|
} |
|
} |
|
} |
|
} elsif (defined($username) && $found{'usernames'}{$username}) { |
&scantron_get_correction($r,$i,$scan_record, |
&scantron_get_correction($r,$i,$scan_record, |
\%scantron_config, |
\%scantron_config, |
$line,'duplicateID',$username); |
$line,'duplicateID',$username); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} elsif (!defined($username)) { |
} elsif (!defined($username)) { |
&scantron_get_correction($r,$i,$scan_record, |
&scantron_get_correction($r,$i,$scan_record, |
\%scantron_config, |
\%scantron_config, |
$line,'incorrectID'); |
$line,'incorrectID'); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} |
} |
$found{'usernames'}{$username}++; |
$found{'usernames'}{$username}++; |
} else { |
} else { |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
$line,'incorrectID'); |
$line,'incorrectID'); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} |
} |
} |
} |
} |
} |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return (0,$currentphase+1); |
return (0,$currentphase+1); |
} |
} |
|
|
|
sub scantron_get_sections { |
|
my %bysec; |
|
if ($env{'form.scantron_format'} ne '') { |
|
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
|
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
my $classlist=&Apache::loncoursedata::get_classlist(); |
|
my %idmap=&username_to_idmap($classlist); |
|
foreach my $key (keys(%idmap)) { |
|
my $lckey = lc($key); |
|
$idmap{$lckey} = $idmap{$key}; |
|
} |
|
my $secidx = &Apache::loncoursedata::CL_SECTION(); |
|
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
|
my $line=&scantron_get_line($scanlines,$scan_data,$i); |
|
if ($line=~/^[\s\cz]*$/) { next; } |
|
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
|
$scan_data); |
|
my $id=lc($$scan_record{'scantron.ID'}); |
|
if (exists($idmap{$id})) { |
|
if (ref($classlist->{$idmap{$id}}) eq 'ARRAY') { |
|
my $stusec = $classlist->{$idmap{$id}}->[$secidx]; |
|
if ($stusec eq '') { |
|
$bysec{'none'} ++; |
|
} else { |
|
$bysec{$stusec} ++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return %bysec; |
|
} |
|
|
sub scantron_get_correction { |
sub scantron_get_correction { |
my ($r,$i,$scan_record,$scan_config,$line,$error,$arg, |
my ($r,$i,$scan_record,$scan_config,$line,$error,$arg, |
Line 7474 sub verify_bubbles_checked {
|
Line 8226 sub verify_bubbles_checked {
|
my (@ansnums) = @_; |
my (@ansnums) = @_; |
my $ansnumstr = join('","',@ansnums); |
my $ansnumstr = join('","',@ansnums); |
my $warning = &mt("A bubble or 'No bubble' selection has not been made for one or more lines."); |
my $warning = &mt("A bubble or 'No bubble' selection has not been made for one or more lines."); |
my $output = &Apache::lonhtmlcommon::scripttag((<<ENDSCRIPT)); |
&js_escape(\$warning); |
|
my $output = &Apache::lonhtmlcommon::scripttag(<<ENDSCRIPT); |
function verify_bubble_radio(form) { |
function verify_bubble_radio(form) { |
var ansnumArray = new Array ("$ansnumstr"); |
var ansnumArray = new Array ("$ansnumstr"); |
var need_bubble_count = 0; |
var need_bubble_count = 0; |
Line 7697 sub prompt_for_corrections {
|
Line 8450 sub prompt_for_corrections {
|
|
|
Arguments: |
Arguments: |
$r - Apache request object |
$r - Apache request object |
$scan_config - hash from &get_scantron_config() |
$scan_config - hash from &Apache::lonnet::get_scantron_config() |
$line - Number of the line being displayed. |
$line - Number of the line being displayed. |
$questionnum - Question number (may include subquestion) |
$questionnum - Question number (may include subquestion) |
$error - Type of error. |
$error - Type of error. |
Line 7861 sub get_codes {
|
Line 8614 sub get_codes {
|
|
|
sub scantron_validate_CODE { |
sub scantron_validate_CODE { |
my ($r,$currentphase) = @_; |
my ($r,$currentphase) = @_; |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
if ($scantron_config{'CODElocation'} && |
if ($scantron_config{'CODElocation'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODElength'}) { |
$scantron_config{'CODElength'}) { |
Line 7935 sub scantron_validate_doublebubble {
|
Line 8688 sub scantron_validate_doublebubble {
|
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
|
|
#get scantron line setup |
#get scantron line setup |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
Line 8117 sub scantron_validate_missingbubbles {
|
Line 8870 sub scantron_validate_missingbubbles {
|
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
|
|
#get scantron line setup |
#get scantron line setup |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
Line 8246 sub hand_bubble_option {
|
Line 8999 sub hand_bubble_option {
|
} |
} |
} |
} |
if ($needs_hand_bubbles) { |
if ($needs_hand_bubbles) { |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
return &mt('The sequence to be graded contains response types which are handgraded.').'<p>'. |
return &mt('The sequence to be graded contains response types which are handgraded.').'<p>'. |
&mt('If you have already graded these by bubbling sheets to indicate points awarded, [_1]what point value is assigned to a filled last bubble in each row?','<br />'). |
&mt('If you have already graded these by bubbling sheets to indicate points awarded, [_1]what point value is assigned to a filled last bubble in each row?','<br />'). |
Line 8265 sub scantron_process_students {
|
Line 9018 sub scantron_process_students {
|
} |
} |
my $default_form_data=&defaultFormData($symb); |
my $default_form_data=&defaultFormData($symb); |
|
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
Line 8305 sub scantron_process_students {
|
Line 9058 sub scantron_process_students {
|
SCANTRONFORM |
SCANTRONFORM |
$r->print($result); |
$r->print($result); |
|
|
|
my ($checksec,@possibles)=&gradable_sections(); |
my @delayqueue; |
my @delayqueue; |
my (%completedstudents,%scandata); |
my (%completedstudents,%scandata); |
|
|
my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam')); |
my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam')); |
my $count=&get_todo_count($scanlines,$scan_data); |
my $count=&get_todo_count($scanlines,$scan_data); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count); |
Line 8333 SCANTRONFORM
|
Line 9087 SCANTRONFORM
|
return ''; # Dunno why the other returns return '' rather than just returning. |
return ''; # Dunno why the other returns return '' rather than just returning. |
} |
} |
|
|
my %lettdig = &letter_to_digits(); |
my %lettdig = &Apache::lonnet::letter_to_digits(); |
my $numletts = scalar(keys(%lettdig)); |
my $numletts = scalar(keys(%lettdig)); |
my %orderedforcode; |
my %orderedforcode; |
|
|
Line 8367 SCANTRONFORM
|
Line 9121 SCANTRONFORM
|
next; |
next; |
} |
} |
my $usec = $classlist->{$uname}->[&Apache::loncoursedata::CL_SECTION]; |
my $usec = $classlist->{$uname}->[&Apache::loncoursedata::CL_SECTION]; |
|
if (($checksec ne '') && ($checksec ne $usec)) { |
|
unless (grep(/^\Q$usec\E$/,@possibles)) { |
|
&scantron_add_delay(\@delayqueue,$line, |
|
"No role with manage grades privilege in student's section ($usec)",3); |
|
next; |
|
} |
|
} |
my $user = $uname.':'.$usec; |
my $user = $uname.':'.$usec; |
($uname,$udom)=split(/:/,$uname); |
($uname,$udom)=split(/:/,$uname); |
|
|
Line 8395 SCANTRONFORM
|
Line 9156 SCANTRONFORM
|
} |
} |
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
|
my $currcode; |
|
if (exists($grader_randomlists_by_symb{$ressymb})) { |
|
$currcode = $scancode; |
|
} |
my ($analysis,$parts) = |
my ($analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
$uname,$udom,undef,$bubbles_per_row); |
$uname,$udom,undef,$bubbles_per_row, |
|
$currcode); |
$partids_by_symb{$ressymb} = $parts; |
$partids_by_symb{$ressymb} = $parts; |
} else { |
} else { |
$partids_by_symb{$ressymb} = $grader_partids_by_symb{$ressymb}; |
$partids_by_symb{$ressymb} = $grader_partids_by_symb{$ressymb}; |
Line 8653 sub grade_student_bubbles {
|
Line 9419 sub grade_student_bubbles {
|
} |
} |
|
|
sub scantron_upload_scantron_data { |
sub scantron_upload_scantron_data { |
my ($r,$symb)=@_; |
my ($r,$symb) = @_; |
my $dom = $env{'request.role.domain'}; |
my $dom = $env{'request.role.domain'}; |
|
my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($dom); |
my $domdesc = &Apache::lonnet::domain($dom,'description'); |
my $domdesc = &Apache::lonnet::domain($dom,'description'); |
$r->print(&Apache::loncommon::coursebrowser_javascript($dom)); |
$r->print(&Apache::loncommon::coursebrowser_javascript($dom)); |
my $select_link=&Apache::loncommon::selectcourse_link('rules','courseid', |
my $select_link=&Apache::loncommon::selectcourse_link('rules','courseid', |
Line 8664 sub scantron_upload_scantron_data {
|
Line 9431 sub scantron_upload_scantron_data {
|
(' 'x2).&mt('(shows course personnel)'); |
(' 'x2).&mt('(shows course personnel)'); |
my $default_form_data=&defaultFormData($symb); |
my $default_form_data=&defaultFormData($symb); |
my $nofile_alert = &mt('Please use the browse button to select a file from your local directory.'); |
my $nofile_alert = &mt('Please use the browse button to select a file from your local directory.'); |
|
&js_escape(\$nofile_alert); |
my $nocourseid_alert = &mt("Please use the 'Select Course' link to open a separate window where you can search for a course to which a file can be uploaded."); |
my $nocourseid_alert = &mt("Please use the 'Select Course' link to open a separate window where you can search for a course to which a file can be uploaded."); |
|
&js_escape(\$nocourseid_alert); |
$r->print(&Apache::lonhtmlcommon::scripttag(' |
$r->print(&Apache::lonhtmlcommon::scripttag(' |
function checkUpload(formname) { |
function checkUpload(formname) { |
if (formname.upfile.value == "") { |
if (formname.upfile.value == "") { |
Line 8692 sub scantron_upload_scantron_data {
|
Line 9461 sub scantron_upload_scantron_data {
|
return; |
return; |
} |
} |
|
|
|
'.$formatjs.' |
')); |
')); |
$r->print(' |
$r->print(' |
<h3>'.&mt('Send bubblesheet data to a course').'</h3> |
<h3>'.&mt('Send bubblesheet data to a course').'</h3> |
Line 8707 sub scantron_upload_scantron_data {
|
Line 9477 sub scantron_upload_scantron_data {
|
&Apache::lonhtmlcommon::row_closure(). |
&Apache::lonhtmlcommon::row_closure(). |
&Apache::lonhtmlcommon::row_title(&mt('Domain')). |
&Apache::lonhtmlcommon::row_title(&mt('Domain')). |
'<input name="domainid" type="hidden" />'.$domdesc. |
'<input name="domainid" type="hidden" />'.$domdesc. |
&Apache::lonhtmlcommon::row_closure(). |
&Apache::lonhtmlcommon::row_closure()); |
|
if ($formatoptions) { |
|
$r->print(&Apache::lonhtmlcommon::row_title($formattitle).$formatoptions. |
|
&Apache::lonhtmlcommon::row_closure()); |
|
} |
|
$r->print( |
&Apache::lonhtmlcommon::row_title(&mt('File to upload')). |
&Apache::lonhtmlcommon::row_title(&mt('File to upload')). |
'<input type="file" name="upfile" size="50" />'. |
'<input type="file" name="upfile" size="50" />'. |
&Apache::lonhtmlcommon::row_closure(1). |
&Apache::lonhtmlcommon::row_closure(1). |
Line 8720 sub scantron_upload_scantron_data {
|
Line 9495 sub scantron_upload_scantron_data {
|
return ''; |
return ''; |
} |
} |
|
|
|
sub scantron_upload_dataformat { |
|
my ($dom) = @_; |
|
my ($formatoptions,$formattitle,$formatjs); |
|
$formatjs = <<'END'; |
|
function toggleScantab(form) { |
|
return; |
|
} |
|
END |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$dom); |
|
if (ref($domconfig{'scantron'}) eq 'HASH') { |
|
if (ref($domconfig{'scantron'}{'config'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}}) > 1) { |
|
if (($domconfig{'scantron'}{'config'}{'dat'}) && |
|
(ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH')) { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}})) { |
|
my ($onclick,$formatextra,$singleline); |
|
my @lines = &Apache::lonnet::get_scantronformat_file(); |
|
my $count = 0; |
|
foreach my $line (@lines) { |
|
next if ($line =~ /^#/); |
|
$singleline = $line; |
|
$count ++; |
|
} |
|
if ($count > 1) { |
|
$formatextra = '<div style="display:none" id="bubbletype">'. |
|
'<span class="LC_nobreak">'. |
|
&mt('Bubblesheet type').': '. |
|
&scantron_scantab().'</span></div>'; |
|
$onclick = ' onclick="toggleScantab(this.form);"'; |
|
$formatjs = <<"END"; |
|
function toggleScantab(form) { |
|
var divid = 'bubbletype'; |
|
if (document.getElementById(divid)) { |
|
var radioname = 'fileformat'; |
|
var num = form.elements[radioname].length; |
|
if (num) { |
|
for (var i=0; i<num; i++) { |
|
if (form.elements[radioname][i].checked) { |
|
var chosen = form.elements[radioname][i].value; |
|
if (chosen == 'dat') { |
|
document.getElementById(divid).style.display = 'none'; |
|
} else if (chosen == 'csv') { |
|
document.getElementById(divid).style.display = 'block'; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
END |
|
} elsif ($count == 1) { |
|
my $formatname = (split(/:/,$singleline,2))[0]; |
|
$formatextra = '<input type="hidden" name="scantron_format" value="'.$formatname.'" />'; |
|
} |
|
$formattitle = &mt('File format'); |
|
$formatoptions = '<label><input name="fileformat" type="radio" value="dat" checked="checked"'.$onclick.' />'. |
|
&mt('Plain Text (no delimiters)'). |
|
'</label>'.(' 'x2). |
|
'<label><input name="fileformat" type="radio" value="csv"'.$onclick.' />'. |
|
&mt('Comma separated values').'</label>'.$formatextra; |
|
} |
|
} |
|
} |
|
} elsif (keys(%{$domconfig{'scantron'}{'config'}}) == 1) { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}})) { |
|
$formattitle = &mt('Bubblesheet type'); |
|
$formatoptions = &scantron_scantab(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return ($formatoptions,$formattitle,$formatjs); |
|
} |
|
|
sub scantron_upload_scantron_data_save { |
sub scantron_upload_scantron_data_save { |
my($r,$symb)=@_; |
my ($r,$symb) = @_; |
my $doanotherupload= |
my $doanotherupload= |
'<br /><form action="/adm/grades" method="post">'."\n". |
'<br /><form action="/adm/grades" method="post">'."\n". |
'<input type="hidden" name="command" value="scantronupload" />'."\n". |
'<input type="hidden" name="command" value="scantronupload" />'."\n". |
Line 8730 sub scantron_upload_scantron_data_save {
|
Line 9583 sub scantron_upload_scantron_data_save {
|
'</form>'."\n"; |
'</form>'."\n"; |
if (!&Apache::lonnet::allowed('usc',$env{'form.domainid'}) && |
if (!&Apache::lonnet::allowed('usc',$env{'form.domainid'}) && |
!&Apache::lonnet::allowed('usc', |
!&Apache::lonnet::allowed('usc', |
$env{'form.domainid'}.'_'.$env{'form.courseid'})) { |
$env{'form.domainid'}.'_'.$env{'form.courseid'}) && |
|
!&Apache::lonnet::allowed('usc', |
|
$env{'form.domainid'}.'_'.$env{'form.courseid'}.'/'.$env{'form.coursesec'})) { |
$r->print(&mt("You are not allowed to upload bubblesheet data to the requested course.")."<br />"); |
$r->print(&mt("You are not allowed to upload bubblesheet data to the requested course.")."<br />"); |
unless ($symb) { |
unless ($symb) { |
$r->print($doanotherupload); |
$r->print($doanotherupload); |
Line 8746 sub scantron_upload_scantron_data_save {
|
Line 9601 sub scantron_upload_scantron_data_save {
|
&mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.', |
&mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.', |
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1)); |
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1)); |
} else { |
} else { |
my $result = |
my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$env{'form.domainid'}); |
&Apache::lonnet::userfileupload('upfile','','scantron','','','', |
my $parser; |
|
if (ref($domconfig{'scantron'}) eq 'HASH') { |
|
if (ref($domconfig{'scantron'}{'config'}) eq 'HASH') { |
|
my $is_csv; |
|
my @possibles = keys(%{$domconfig{'scantron'}{'config'}}); |
|
if (@possibles > 1) { |
|
if ($env{'form.fileformat'} eq 'csv') { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH') { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}}) > 1) { |
|
$is_csv = 1; |
|
} |
|
} |
|
} |
|
} |
|
} elsif (@possibles == 1) { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH') { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}}) > 1) { |
|
$is_csv = 1; |
|
} |
|
} |
|
} |
|
} |
|
if ($is_csv) { |
|
$parser = $domconfig{'scantron'}{'config'}{'csv'}; |
|
} |
|
} |
|
} |
|
my $result = |
|
&Apache::lonnet::userfileupload('upfile','scantron','scantron',$parser,'','', |
$env{'form.courseid'},$env{'form.domainid'}); |
$env{'form.courseid'},$env{'form.domainid'}); |
if ($result =~ m{^/uploaded/}) { |
if ($result =~ m{^/uploaded/}) { |
$r->print( |
$r->print( |
Line 8756 sub scantron_upload_scantron_data_save {
|
Line 9641 sub scantron_upload_scantron_data_save {
|
(length($env{'form.upfile'})-1), |
(length($env{'form.upfile'})-1), |
'<span class="LC_filename">'.$result.'</span>')); |
'<span class="LC_filename">'.$result.'</span>')); |
($uploadedfile) = ($result =~ m{/([^/]+)$}); |
($uploadedfile) = ($result =~ m{/([^/]+)$}); |
|
if ($uploadedfile =~ /^scantron_orig_/) { |
|
my $logname = $uploadedfile; |
|
$logname =~ s/^scantron_orig_//; |
|
if ($logname ne '') { |
|
my $now = time; |
|
my %info = ($logname => { $now => $env{'user.name'}.':'.$env{'user.domain'} }); |
|
&Apache::lonnet::put('scantronupload',\%info,$env{'form.domainid'},$env{'form.courseid'}); |
|
} |
|
} |
$r->print(&validate_uploaded_scantron_file($env{'form.domainid'}, |
$r->print(&validate_uploaded_scantron_file($env{'form.domainid'}, |
$env{'form.courseid'},$uploadedfile)); |
$env{'form.courseid'},$symb,$uploadedfile)); |
} else { |
} else { |
$r->print( |
$r->print( |
&Apache::lonhtmlcommon::confirm_success(&mt('Upload failed'),1).'<br />'. |
&Apache::lonhtmlcommon::confirm_success(&mt('Upload failed'),1).'<br />'. |
Line 8775 sub scantron_upload_scantron_data_save {
|
Line 9669 sub scantron_upload_scantron_data_save {
|
} |
} |
|
|
sub validate_uploaded_scantron_file { |
sub validate_uploaded_scantron_file { |
my ($cdom,$cname,$fname) = @_; |
my ($cdom,$cname,$symb,$fname,$context,$countsref) = @_; |
|
|
my $scanlines=&Apache::lonnet::getfile('/uploaded/'.$cdom.'/'.$cname.'/'.$fname); |
my $scanlines=&Apache::lonnet::getfile('/uploaded/'.$cdom.'/'.$cname.'/'.$fname); |
my @lines; |
my @lines; |
if ($scanlines ne '-1') { |
if ($scanlines ne '-1') { |
@lines=split("\n",$scanlines,-1); |
@lines=split("\n",$scanlines,-1); |
} |
} |
my $output; |
my ($output,$secidx,$checksec,$priv,%crsroleshash,@possibles); |
|
$secidx = &Apache::loncoursedata::CL_SECTION(); |
|
if ($context eq 'download') { |
|
$priv = 'mgr'; |
|
} else { |
|
$priv = 'usc'; |
|
} |
|
unless ((&Apache::lonnet::allowed($priv,$env{'request.role.domain'})) || |
|
(($env{'request.course.id'}) && |
|
(&Apache::lonnet::allowed($priv,$env{'request.course.id'})))) { |
|
if ($env{'request.course.sec'} ne '') { |
|
unless (&Apache::lonnet::allowed($priv, |
|
"$env{'request.course.id'}/$env{'request.course.sec'}")) { |
|
unless ($context eq 'download') { |
|
$output = '<p class="LC_warning">'.&mt('You do not have permission to upload bubblesheet data').'</p>'; |
|
} |
|
return $output; |
|
} |
|
($checksec,@possibles)=&gradable_sections(); |
|
} |
|
} |
if (@lines) { |
if (@lines) { |
my (%counts,$max_match_format); |
my (%counts,$max_match_format); |
my ($found_match_count,$max_match_count,$max_match_pct) = (0,0,0); |
my ($found_match_count,$max_match_count,$max_match_pct) = (0,0,0); |
Line 8792 sub validate_uploaded_scantron_file {
|
Line 9707 sub validate_uploaded_scantron_file {
|
$idmap{$lckey} = $idmap{$key}; |
$idmap{$lckey} = $idmap{$key}; |
} |
} |
my %unique_formats; |
my %unique_formats; |
my @formatlines = &get_scantronformat_file(); |
my @formatlines = &Apache::lonnet::get_scantronformat_file(); |
foreach my $line (@formatlines) { |
foreach my $line (@formatlines) { |
chomp($line); |
chomp($line); |
my @config = split(/:/,$line); |
my @config = split(/:/,$line); |
Line 8811 sub validate_uploaded_scantron_file {
|
Line 9726 sub validate_uploaded_scantron_file {
|
%{$counts{$key}} = ( |
%{$counts{$key}} = ( |
'found' => 0, |
'found' => 0, |
'total' => 0, |
'total' => 0, |
|
'totalanysec' => 0, |
|
'othersec' => 0, |
); |
); |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
next if ($line =~ /^#/); |
next if ($line =~ /^#/); |
Line 8818 sub validate_uploaded_scantron_file {
|
Line 9735 sub validate_uploaded_scantron_file {
|
my $id = substr($line,$idstart-1,$idlength); |
my $id = substr($line,$idstart-1,$idlength); |
$id = lc($id); |
$id = lc($id); |
if (exists($idmap{$id})) { |
if (exists($idmap{$id})) { |
|
if ($checksec ne '') { |
|
$counts{$key}{'totalanysec'} ++; |
|
if (ref($classlist->{$idmap{$id}}) eq 'ARRAY') { |
|
my $stusec = $classlist->{$idmap{$id}}->[$secidx]; |
|
if ($stusec ne $checksec) { |
|
if (@possibles) { |
|
unless (grep(/^\Q$stusec\E$/,@possibles)) { |
|
$counts{$key}{'othersec'} ++; |
|
next; |
|
} |
|
} else { |
|
$counts{$key}{'othersec'} ++; |
|
next; |
|
} |
|
} |
|
} |
|
} |
$counts{$key}{'found'} ++; |
$counts{$key}{'found'} ++; |
} |
} |
$counts{$key}{'total'} ++; |
$counts{$key}{'total'} ++; |
Line 8832 sub validate_uploaded_scantron_file {
|
Line 9766 sub validate_uploaded_scantron_file {
|
} |
} |
} |
} |
} |
} |
if (ref($unique_formats{$max_match_format}) eq 'ARRAY') { |
if ((ref($unique_formats{$max_match_format}) eq 'ARRAY') && ($context ne 'download')) { |
my $format_descs; |
my $format_descs; |
my $numwithformat = @{$unique_formats{$max_match_format}}; |
my $numwithformat = @{$unique_formats{$max_match_format}}; |
for (my $i=0; $i<$numwithformat; $i++) { |
for (my $i=0; $i<$numwithformat; $i++) { |
Line 8877 sub validate_uploaded_scantron_file {
|
Line 9811 sub validate_uploaded_scantron_file {
|
'<li>'.&mt('The course roster is not up to date.').'</li>'. |
'<li>'.&mt('The course roster is not up to date.').'</li>'. |
'</ul>'; |
'</ul>'; |
} |
} |
|
if (($checksec ne '') && (ref($counts{$max_match_format}) eq 'HASH')) { |
|
if ($counts{$max_match_format}{'othersec'}) { |
|
my $percent_nongrade = (100*$counts{$max_match_format}{'othersec'})/($counts{$max_match_format}{'totalanysec'}); |
|
my $showpct = sprintf("%.0f",$percent_nongrade).'%'; |
|
my $confirmdel = &mt('Are you sure you want to permanently delete this file?'); |
|
&js_escape(\$confirmdel); |
|
$output .= '<p class="LC_warning">'. |
|
&mt('Comparison of student IDs in the uploaded file with the course roster found [_1][quant,_2,match,matches][_3] for students in section(s) for which none of your role(s) have privileges to modify grades', |
|
'<b>',$counts{$max_match_format}{'othersec'},'</b>'). |
|
'<br />'. |
|
&mt('Unless you are assigned role(s) which allow modification of grades in additional sections, [_1] of the records in this file will be automatically excluded when you perform bubblesheet grading.','<b>'.$showpct.'</b>'). |
|
'</p><p>'. |
|
&mt('If you prefer to delete the file now, use: [_1]'). |
|
'<form method="post" name="delupload" action="/adm/grades">'. |
|
'<input type="hidden" name="symb" value="'.$symb.'" />'. |
|
'<input type="hidden" name="domainid" value="'.$cdom.'" />'. |
|
'<input type="hidden" name="courseid" value="'.$cname.'" />'. |
|
'<input type="hidden" name="coursesec" value="'.$env{'request.course.sec'}.'" />'. |
|
'<input type="hidden" name="uploadedfile" value="'.$fname.'" />'. |
|
'<input type="hidden" name="command" value="scantronupload_delete" />'. |
|
'<input type="button" name="delbutton" value="'.&mt('Delete Uploaded File').'" onclick="javascript:if (confirm('."'$confirmdel'".')) { document.delupload.submit(); }" />'. |
|
'</form></p>'; |
|
} |
|
} |
} |
} |
} else { |
if (($context eq 'download') && ($checksec ne '')) { |
|
if ((ref($countsref) eq 'HASH') && (ref($counts{$max_match_format}) eq 'HASH')) { |
|
$countsref->{'totalanysec'} = $counts{$max_match_format}{'totalanysec'}; |
|
$countsref->{'othersec'} = $counts{$max_match_format}{'othersec'}; |
|
} |
|
} |
|
} elsif ($context ne 'download') { |
$output = '<p class="LC_warning">'.&mt('Uploaded file contained no data').'</p>'; |
$output = '<p class="LC_warning">'.&mt('Uploaded file contained no data').'</p>'; |
} |
} |
return $output; |
return $output; |
} |
} |
|
|
|
sub gradable_sections { |
|
my $checksec = $env{'request.course.sec'}; |
|
my @oksecs; |
|
if ($checksec) { |
|
my %availablesecs = §ions_grade_privs(); |
|
if (ref($availablesecs{'mgr'}) eq 'ARRAY') { |
|
foreach my $sec (@{$availablesecs{'mgr'}}) { |
|
unless (grep(/^\Q$sec\E$/,@oksecs)) { |
|
push(@oksecs,$sec); |
|
} |
|
} |
|
if (grep(/^all$/,@oksecs)) { |
|
undef($checksec); |
|
} |
|
} |
|
} |
|
return($checksec,@oksecs); |
|
} |
|
|
|
sub sections_grade_privs { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my %availablesecs = ( |
|
mgr => [], |
|
vgr => [], |
|
usc => [], |
|
); |
|
my $ccrole = 'cc'; |
|
if ($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Community') { |
|
$ccrole = 'co'; |
|
} |
|
my %crsroleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'}, |
|
'userroles',['active'], |
|
[$ccrole,'in','cr'],$cdom,1); |
|
my $crsid = $cnum.':'.$cdom; |
|
foreach my $item (keys(%crsroleshash)) { |
|
next unless ($item =~ /^$crsid\:/); |
|
my ($crsnum,$crsdom,$role,$sec) = split(/\:/,$item); |
|
my $suffix = "/$cdom/$cnum./$cdom/$cnum"; |
|
if ($sec ne '') { |
|
$suffix = "/$cdom/$cnum/$sec./$cdom/$cnum/$sec"; |
|
} |
|
if (($role eq $ccrole) || ($role eq 'in')) { |
|
foreach my $priv ('mgr','vgr','usc') { |
|
unless (grep(/^all$/,@{$availablesecs{$priv}})) { |
|
if ($sec eq '') { |
|
$availablesecs{$priv} = ['all']; |
|
} elsif ($sec ne $env{'request.course.sec'}) { |
|
unless (grep(/^\Q$sec\E$/,@{$availablesecs{$priv}})) { |
|
push(@{$availablesecs{$priv}},$sec); |
|
} |
|
} |
|
} |
|
} |
|
} elsif ($role =~ m{^cr/}) { |
|
foreach my $priv ('mgr','vgr','usc') { |
|
unless (grep(/^all$/,@{$availablesecs{$priv}})) { |
|
if ($env{"user.priv.$role.$suffix"} =~ /:$priv&/) { |
|
if ($sec eq '') { |
|
$availablesecs{$priv} = ['all']; |
|
} elsif ($sec ne $env{'request.course.sec'}) { |
|
unless (grep(/^\Q$sec\E$/,@{$availablesecs{$priv}})) { |
|
push(@{$availablesecs{$priv}},$sec); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return %availablesecs; |
|
} |
|
|
|
sub scantron_upload_delete { |
|
my ($r,$symb) = @_; |
|
my $filename = $env{'form.uploadedfile'}; |
|
if ($filename =~ /^scantron_orig_/) { |
|
if (&Apache::lonnet::allowed('usc',$env{'form.domainid'}) || |
|
&Apache::lonnet::allowed('usc', |
|
$env{'form.domainid'}.'_'.$env{'form.courseid'}) || |
|
&Apache::lonnet::allowed('usc', |
|
$env{'form.domainid'}.'_'.$env{'form.courseid'}.'/'.$env{'form.coursesec'})) { |
|
my $uploadurl = '/uploaded/'.$env{'form.domainid'}.'/'.$env{'form.courseid'}.'/'.$env{'form.uploadedfile'}; |
|
my $retrieval = &Apache::lonnet::getfile($uploadurl); |
|
if ($retrieval eq '-1') { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('File requested for deletion not found.')); |
|
} else { |
|
$filename =~ s/^scantron_orig_//; |
|
if ($filename ne '') { |
|
my ($is_valid,$numleft); |
|
my %info = &Apache::lonnet::get('scantronupload',[$filename],$env{'form.domainid'},$env{'form.courseid'}); |
|
if (keys(%info)) { |
|
if (ref($info{$filename}) eq 'HASH') { |
|
foreach my $timestamp (sort(keys(%{$info{$filename}}))) { |
|
if ($info{$filename}{$timestamp} eq $env{'user.name'}.':'.$env{'user.domain'}) { |
|
$is_valid = 1; |
|
delete($info{$filename}{$timestamp}); |
|
} |
|
} |
|
$numleft = scalar(keys(%{$info{$filename}})); |
|
} |
|
} |
|
if ($is_valid) { |
|
my $result = &Apache::lonnet::removeuploadedurl($uploadurl); |
|
if ($result eq 'ok') { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion successful')).'<br />'); |
|
if ($numleft) { |
|
&Apache::lonnet::put('scantronupload',\%info,$env{'form.domainid'},$env{'form.courseid'}); |
|
} else { |
|
&Apache::lonnet::del('scantronupload',[$filename],$env{'form.domainid'},$env{'form.courseid'}); |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('Result was [_1]',$result)); |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('File requested for deletion was uploaded by a different user.')); |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('Filename of bubblesheet data file requested for deletion is invalid.')); |
|
} |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('You are not permitted to delete bubblesheet data files from the requested course.')); |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('Filename of bubblesheet data file requested for deletion is invalid.')); |
|
} |
|
return; |
|
} |
|
|
sub valid_file { |
sub valid_file { |
my ($requested_file)=@_; |
my ($requested_file)=@_; |
foreach my $filename (sort(&scantron_filenames())) { |
foreach my $filename (sort(&scantron_filenames())) { |
Line 8893 sub valid_file {
|
Line 9993 sub valid_file {
|
} |
} |
|
|
sub scantron_download_scantron_data { |
sub scantron_download_scantron_data { |
my ($r,$symb)=@_; |
my ($r,$symb) = @_; |
my $default_form_data=&defaultFormData($symb); |
my $default_form_data=&defaultFormData($symb); |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
Line 8906 sub scantron_download_scantron_data {
|
Line 10006 sub scantron_download_scantron_data {
|
'); |
'); |
return; |
return; |
} |
} |
|
my (%uploader,$is_owner,%counts,$percent); |
|
my %uploader = &Apache::lonnet::get('scantronupload',[$file],$cdom,$cname); |
|
if (ref($uploader{$file}) eq 'HASH') { |
|
foreach my $timestamp (sort { $a <=> $b } keys(%{$uploader{$file}})) { |
|
if ($uploader{$file}{$timestamp} eq $env{'user.name'}.':'.$env{'user.domain'}) { |
|
$is_owner = 1; |
|
last; |
|
} |
|
} |
|
} |
|
unless ($is_owner) { |
|
&validate_uploaded_scantron_file($cdom,$cname,$symb,'scantron_orig_'.$file,'download',\%counts); |
|
if ($counts{'totalanysec'}) { |
|
my $percent_othersec = (100*$counts{'othersec'})/($counts{'totalanysec'}); |
|
if ($percent_othersec >= 10) { |
|
my $showpct = sprintf("%.0f",$percent_othersec).'%'; |
|
$r->print('<p class="LC_warning">'. |
|
&mt('The original uploaded file includes [_1] or more of records for students for which none of your roles have rights to modify grades, so files are unavailable for download.',$showpct). |
|
'</p>'); |
|
return; |
|
} |
|
} |
|
} |
my $orig='/uploaded/'.$cdom.'/'.$cname.'/scantron_orig_'.$file; |
my $orig='/uploaded/'.$cdom.'/'.$cname.'/scantron_orig_'.$file; |
my $corrected='/uploaded/'.$cdom.'/'.$cname.'/scantron_corrected_'.$file; |
my $corrected='/uploaded/'.$cdom.'/'.$cname.'/scantron_corrected_'.$file; |
my $skipped='/uploaded/'.$cdom.'/'.$cname.'/scantron_skipped_'.$file; |
my $skipped='/uploaded/'.$cdom.'/'.$cname.'/scantron_skipped_'.$file; |
Line 8933 sub checkscantron_results {
|
Line 10056 sub checkscantron_results {
|
my ($r,$symb) = @_; |
my ($r,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
my $cid = $env{'request.course.id'}; |
my $cid = $env{'request.course.id'}; |
my %lettdig = &letter_to_digits(); |
my %lettdig = &Apache::lonnet::letter_to_digits(); |
my $numletts = scalar(keys(%lettdig)); |
my $numletts = scalar(keys(%lettdig)); |
my $cnum = $env{'course.'.$cid.'.num'}; |
my $cnum = $env{'course.'.$cid.'.num'}; |
my $cdom = $env{'course.'.$cid.'.domain'}; |
my $cdom = $env{'course.'.$cid.'.domain'}; |
my (undef, undef, $sequence) = &Apache::lonnet::decode_symb($env{'form.selectpage'}); |
my (undef, undef, $sequence) = &Apache::lonnet::decode_symb($env{'form.selectpage'}); |
my %record; |
my %record; |
my %scantron_config = |
my %scantron_config = |
&Apache::grades::get_scantron_config($env{'form.scantron_format'}); |
&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my %idmap=&Apache::grades::username_to_idmap($classlist); |
my %idmap=&Apache::grades::username_to_idmap($classlist); |
my $navmap=Apache::lonnavmaps::navmap->new(); |
my $navmap=Apache::lonnavmaps::navmap->new(); |
Line 9050 sub checkscantron_results {
|
Line 10173 sub checkscantron_results {
|
my $ressymb = $resource->symb(); |
my $ressymb = $resource->symb(); |
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
|
my $currcode; |
|
if (exists($grader_randomlists_by_symb{$ressymb})) { |
|
$currcode = $scancode; |
|
} |
(my $analysis,$parts) = |
(my $analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
$username,$domain,undef, |
$username,$domain,undef, |
$bubbles_per_row); |
$bubbles_per_row,$currcode); |
} else { |
} else { |
$parts = $grader_partids_by_symb{$ressymb}; |
$parts = $grader_partids_by_symb{$ressymb}; |
} |
} |
Line 9260 sub verify_scantron_grading {
|
Line 10387 sub verify_scantron_grading {
|
return ($counter,$record); |
return ($counter,$record); |
} |
} |
|
|
sub letter_to_digits { |
|
my %lettdig = ( |
|
A => 1, |
|
B => 2, |
|
C => 3, |
|
D => 4, |
|
E => 5, |
|
F => 6, |
|
G => 7, |
|
H => 8, |
|
I => 9, |
|
J => 0, |
|
); |
|
return %lettdig; |
|
} |
|
|
|
|
|
#-------- end of section for handling grading scantron forms ------- |
#-------- end of section for handling grading scantron forms ------- |
# |
# |
#------------------------------------------------------------------- |
#------------------------------------------------------------------- |
Line 9322 sub grading_menu {
|
Line 10432 sub grading_menu {
|
|
|
$fields{'command'} = 'initialverifyreceipt'; |
$fields{'command'} = 'initialverifyreceipt'; |
my $url5 = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
my $url5 = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
|
|
|
my %permissions; |
|
if ($perm{'mgr'}) { |
|
$permissions{'either'} = 'F'; |
|
$permissions{'mgr'} = 'F'; |
|
} |
|
if ($perm{'vgr'}) { |
|
$permissions{'either'} = 'F'; |
|
$permissions{'vgr'} = 'F'; |
|
} |
|
|
my @menu = ({ categorytitle=>'Hand Grading', |
my @menu = ({ categorytitle=>'Hand Grading', |
items =>[ |
items =>[ |
{ linktext => 'Select individual students to grade', |
{ linktext => 'Select individual students to grade', |
url => $url1a, |
url => $url1a, |
permission => 'F', |
permission => $permissions{'either'}, |
icon => 'grade_students.png', |
icon => 'grade_students.png', |
linktitle => 'Grade current resource for a selection of students.' |
linktitle => 'Grade current resource for a selection of students.' |
}, |
}, |
{ linktext => 'Grade ungraded submissions.', |
{ linktext => 'Grade ungraded submissions', |
url => $url1b, |
url => $url1b, |
permission => 'F', |
permission => $permissions{'either'}, |
icon => 'ungrade_sub.png', |
icon => 'ungrade_sub.png', |
linktitle => 'Grade all submissions that have not been graded yet.' |
linktitle => 'Grade all submissions that have not been graded yet.' |
}, |
}, |
|
|
{ linktext => 'Grading table', |
{ linktext => 'Grading table', |
url => $url1c, |
url => $url1c, |
permission => 'F', |
permission => $permissions{'either'}, |
icon => 'grading_table.png', |
icon => 'grading_table.png', |
linktitle => 'Grade current resource for all students.' |
linktitle => 'Grade current resource for all students.' |
}, |
}, |
{ linktext => 'Grade page/folder for one student', |
{ linktext => 'Grade page/folder for one student', |
url => $url1d, |
url => $url1d, |
permission => 'F', |
permission => $permissions{'either'}, |
icon => 'grade_PageFolder.png', |
icon => 'grade_PageFolder.png', |
linktitle => 'Grade all resources in current page/sequence/folder for one student.' |
linktitle => 'Grade all resources in current page/sequence/folder for one student.' |
}, |
}, |
{ linktext => 'Download submissions', |
{ linktext => 'Download submissions', |
url => $url1e, |
url => $url1e, |
permission => 'F', |
permission => $permissions{'either'}, |
icon => 'download_sub.png', |
icon => 'download_sub.png', |
linktitle => 'Download all students submissions.' |
linktitle => 'Download all students submissions.' |
}]}, |
}]}, |
Line 9361 sub grading_menu {
|
Line 10481 sub grading_menu {
|
|
|
{ linktext => 'Upload Scores', |
{ linktext => 'Upload Scores', |
url => $url2, |
url => $url2, |
permission => 'F', |
permission => $permissions{'mgr'}, |
icon => 'uploadscores.png', |
icon => 'uploadscores.png', |
linktitle => 'Specify a file containing the class scores for current resource.' |
linktitle => 'Specify a file containing the class scores for current resource.' |
}, |
}, |
{ linktext => 'Process Clicker', |
{ linktext => 'Process Clicker', |
url => $url3, |
url => $url3, |
permission => 'F', |
permission => $permissions{'mgr'}, |
icon => 'addClickerInfoFile.png', |
icon => 'addClickerInfoFile.png', |
linktitle => 'Specify a file containing the clicker information for this resource.' |
linktitle => 'Specify a file containing the clicker information for this resource.' |
}, |
}, |
{ linktext => 'Grade/Manage/Review Bubblesheets', |
{ linktext => 'Grade/Manage/Review Bubblesheets', |
url => $url4, |
url => $url4, |
permission => 'F', |
permission => $permissions{'mgr'}, |
icon => 'bubblesheet.png', |
icon => 'bubblesheet.png', |
linktitle => 'Grade bubblesheet exams, upload/download bubblesheet data files, and review previously graded bubblesheet exams.' |
linktitle => 'Grade bubblesheet exams, upload/download bubblesheet data files, and review previously graded bubblesheet exams.' |
}, |
}, |
{ linktext => 'Verify Receipt Number', |
{ linktext => 'Verify Receipt Number', |
url => $url5, |
url => $url5, |
permission => 'F', |
permission => $permissions{'either'}, |
icon => 'receipt_number.png', |
icon => 'receipt_number.png', |
linktitle => 'Verify a system-generated receipt number for correct problem solution.' |
linktitle => 'Verify a system-generated receipt number for correct problem solution.' |
} |
} |
Line 9397 sub grading_menu {
|
Line 10517 sub grading_menu {
|
return $Str; |
return $Str; |
} |
} |
|
|
|
|
sub ungraded { |
sub ungraded { |
my ($request)=@_; |
my ($request)=@_; |
&submit_options($request); |
&submit_options($request); |
Line 9425 sub submit_options_table {
|
Line 10544 sub submit_options_table {
|
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
&commonJSfunctions($request); |
&commonJSfunctions($request); |
|
my $is_tool = ($symb =~ /ext\.tool$/); |
my $result; |
my $result; |
|
|
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
|
|
$result.=&selectfield(0). |
$result.=&selectfield(1,$is_tool). |
'<input type="hidden" name="command" value="viewgrades" /> |
'<input type="hidden" name="command" value="viewgrades" /> |
<div> |
<div> |
<input type="submit" value="'.&mt('Next').' →" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
Line 9444 sub submit_options_download {
|
Line 10564 sub submit_options_download {
|
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
|
|
|
my $res_error; |
|
my ($partlist,$handgrade,$responseType,$numresp,$numessay,$numdropbox) = |
|
&response_type($symb,\$res_error); |
|
if ($res_error) { |
|
$request->print(&mt('An error occurred retrieving response types')); |
|
return; |
|
} |
|
unless ($numessay) { |
|
$request->print(&mt('No essayresponse items found')); |
|
return; |
|
} |
|
my $table; |
|
if (ref($partlist) eq 'ARRAY') { |
|
if (scalar(@$partlist) > 1 ) { |
|
$table = &showResourceInfo($symb,$partlist,$responseType,'gradingMenu',1,1); |
|
} |
|
} |
|
|
|
my $is_tool = ($symb =~ /ext\.tool$/); |
&commonJSfunctions($request); |
&commonJSfunctions($request); |
|
|
my $result='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
my $result='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
$table."\n". |
|
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
$result.=' |
$result.=' |
<h2> |
<h2> |
'.&mt('Select Students for Which to Download Submissions').' |
'.&mt('Select Students for whom to Download Submissions').' |
</h2>'.&selectfield(1).' |
</h2>'.&selectfield(1,$is_tool).' |
<input type="hidden" name="command" value="downloadfileslink" /> |
<input type="hidden" name="command" value="downloadfileslink" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
</div> |
</div> |
Line 9467 sub submit_options {
|
Line 10607 sub submit_options {
|
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
|
|
|
my $is_tool = ($symb =~ /ext\.tool$/); |
&commonJSfunctions($request); |
&commonJSfunctions($request); |
my $result; |
my $result; |
|
|
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
$result.=&selectfield(1).' |
$result.=&selectfield(1,$is_tool).' |
<input type="hidden" name="command" value="submission" /> |
<input type="hidden" name="command" value="submission" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
</div> |
</div> |
</div> |
</div> |
|
|
|
|
</form>'; |
</form>'; |
return $result; |
return $result; |
} |
} |
|
|
sub selectfield { |
sub selectfield { |
my ($full)=@_; |
my ($full,$is_tool)=@_; |
my %options = |
my %options; |
(&Apache::lonlocal::texthash( |
if ($is_tool) { |
'yes' => 'with submissions', |
%options = |
'queued' => 'in grading queue', |
(&transtatus_options, |
'graded' => 'with ungraded submissions', |
'select_form_order' => ['yes','incorrect','all']); |
'incorrect' => 'with incorrect submissions', |
} else { |
'all' => 'with any status'), |
%options = |
'select_form_order' => ['yes','queued','graded','incorrect','all']); |
(&substatus_options, |
|
'select_form_order' => ['yes','queued','graded','incorrect','all']); |
|
} |
|
|
|
# |
|
# PrepareClasslist() needs to be called to avoid getting a sections list |
|
# for a different course from the @Sections global in lonstatistics.pm, |
|
# populated by an earlier request. |
|
# |
|
&Apache::lonstatistics::PrepareClasslist(); |
|
|
my $result='<div class="LC_columnSection"> |
my $result='<div class="LC_columnSection"> |
|
|
<fieldset> |
<fieldset> |
Line 9516 sub selectfield {
|
Line 10665 sub selectfield {
|
'.&Apache::lonhtmlcommon::StatusOptions(undef,undef,5,undef,'mult').' |
'.&Apache::lonhtmlcommon::StatusOptions(undef,undef,5,undef,'mult').' |
</fieldset>'; |
</fieldset>'; |
if ($full) { |
if ($full) { |
$result.=' |
my $heading = &mt('Submission Status'); |
|
if ($is_tool) { |
|
$heading = &mt('Transaction Status'); |
|
} |
|
$result.=' |
<fieldset> |
<fieldset> |
<legend> |
<legend> |
'.&mt('Submission Status').' |
'.$heading.' |
</legend>'. |
</legend>'. |
&Apache::loncommon::select_form('all','submitonly',\%options). |
&Apache::loncommon::select_form('all','submitonly',\%options). |
'</fieldset>'; |
'</fieldset>'; |
Line 9528 sub selectfield {
|
Line 10681 sub selectfield {
|
return $result; |
return $result; |
} |
} |
|
|
|
sub substatus_options { |
|
return &Apache::lonlocal::texthash( |
|
'yes' => 'with submissions', |
|
'queued' => 'in grading queue', |
|
'graded' => 'with ungraded submissions', |
|
'incorrect' => 'with incorrect submissions', |
|
'all' => 'with any status', |
|
); |
|
} |
|
|
|
sub transtatus_options { |
|
return &Apache::lonlocal::texthash( |
|
'yes' => 'with score transactions', |
|
'incorrect' => 'with less than full credit', |
|
'all' => 'with any status', |
|
); |
|
} |
|
|
sub reset_perm { |
sub reset_perm { |
undef(%perm); |
undef(%perm); |
} |
} |
|
|
sub init_perm { |
sub init_perm { |
&reset_perm(); |
&reset_perm(); |
foreach my $test_perm ('vgr','mgr','opa') { |
foreach my $test_perm ('vgr','mgr','opa','usc') { |
|
|
my $scope = $env{'request.course.id'}; |
my $scope = $env{'request.course.id'}; |
if (!($perm{$test_perm}=&Apache::lonnet::allowed($test_perm,$scope))) { |
if (!($perm{$test_perm}=&Apache::lonnet::allowed($test_perm,$scope))) { |
Line 9722 ENDUPFORM
|
Line 10893 ENDUPFORM
|
<input type="text" name="givenanswer" size="50" /> |
<input type="text" name="givenanswer" size="50" /> |
<input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" /> |
<input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" /> |
ENDGRADINGFORM |
ENDGRADINGFORM |
$result.='</td>'.&Apache::loncommon::end_data_table_row(). |
$result.='</td>'.&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::start_data_table_row().'<td>'.(<<ENDPERCFORM); |
&Apache::loncommon::start_data_table_row().'<td>'.(<<ENDPERCFORM); |
<label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label> |
<label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label> |
<br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label> |
<br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label> |
<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> |
<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> |
</form>' |
</form> |
ENDPERCFORM |
ENDPERCFORM |
$result.='</td>'. |
$result.='</td>'. |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
Line 9736 ENDPERCFORM
|
Line 10907 ENDPERCFORM
|
} |
} |
|
|
sub process_clicker_file { |
sub process_clicker_file { |
my ($r,$symb)=@_; |
my ($r,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
|
|
my %Saveable_Parameters=&clicker_grading_parameters(); |
my %Saveable_Parameters=&clicker_grading_parameters(); |
Line 9808 sub process_clicker_file {
|
Line 10979 sub process_clicker_file {
|
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1); |
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1); |
return $result; |
return $result; |
} |
} |
|
my $mimetype; |
|
if ($env{'form.upfiletype'} eq 'iclicker') { |
|
my $mm = new File::MMagic; |
|
$mimetype = $mm->checktype_contents($env{'form.upfile'}); |
|
unless (($mimetype eq 'text/plain') || ($mimetype eq 'text/html')) { |
|
$result.= '<p>'. |
|
&Apache::lonhtmlcommon::confirm_success( |
|
&mt('File format is neither csv (iclicker 6) nor xml (iclicker 7)'),1).'</p>'; |
|
return $result; |
|
} |
|
} elsif (($env{'form.upfiletype'} ne 'interwrite') && ($env{'form.upfiletype'} ne 'turning')) { |
|
$result .= '<p>'. |
|
&Apache::lonhtmlcommon::confirm_success( |
|
&mt('Invalid clicker type: choose one of: i>clicker, Interwrite PRS, or Turning Technologies.'),1).'</p>'; |
|
return $result; |
|
} |
|
|
# Were able to get all the info needed, now analyze the file |
# Were able to get all the info needed, now analyze the file |
|
|
Line 9834 ENDHEADER
|
Line 11021 ENDHEADER
|
my $errormsg=''; |
my $errormsg=''; |
my $number=0; |
my $number=0; |
if ($env{'form.upfiletype'} eq 'iclicker') { |
if ($env{'form.upfiletype'} eq 'iclicker') { |
($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses); |
if ($mimetype eq 'text/plain') { |
} |
($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses); |
if ($env{'form.upfiletype'} eq 'interwrite') { |
} elsif ($mimetype eq 'text/html') { |
|
($errormsg,$number)=&iclickerxml_eval(\@questiontitles,\%responses); |
|
} |
|
} elsif ($env{'form.upfiletype'} eq 'interwrite') { |
($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses); |
($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses); |
} |
} elsif ($env{'form.upfiletype'} eq 'turning') { |
if ($env{'form.upfiletype'} eq 'turning') { |
|
($errormsg,$number)=&turning_eval(\@questiontitles,\%responses); |
($errormsg,$number)=&turning_eval(\@questiontitles,\%responses); |
} |
} |
$result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'. |
$result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'. |
Line 9892 ENDHEADER
|
Line 11081 ENDHEADER
|
"\n".&mt("Username").": <input type='text' name='uname".$id."' /> ". |
"\n".&mt("Username").": <input type='text' name='uname".$id."' /> ". |
"\n".&mt("Domain").": ". |
"\n".&mt("Domain").": ". |
&Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).' '. |
&Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).' '. |
&Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id,0,$id); |
&Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id,'',$id); |
$unknown_count++; |
$unknown_count++; |
} |
} |
} |
} |
Line 9947 sub iclicker_eval {
|
Line 11136 sub iclicker_eval {
|
return ($errormsg,$number); |
return ($errormsg,$number); |
} |
} |
|
|
|
sub iclickerxml_eval { |
|
my ($questiontitles,$responses)=@_; |
|
my $number=0; |
|
my $errormsg=''; |
|
my @state; |
|
my %respbyid; |
|
my $p = HTML::Parser->new |
|
( |
|
xml_mode => 1, |
|
start_h => |
|
[sub { |
|
my ($tagname,$attr) = @_; |
|
push(@state,$tagname); |
|
if ("@state" eq "ssn p") { |
|
my $title = $attr->{qn}; |
|
$title =~ s/(^\s+|\s+$)//g; |
|
$questiontitles->[$number]=$title; |
|
} elsif ("@state" eq "ssn p v") { |
|
my $id = $attr->{id}; |
|
my $entry = $attr->{ans}; |
|
$id=~s/^[\#0]+//; |
|
$entry =~s/[^a-zA-Z0-9\.\*\-\+]+//g; |
|
$respbyid{$id}[$number] = $entry; |
|
} |
|
}, "tagname, attr"], |
|
end_h => |
|
[sub { |
|
my ($tagname) = @_; |
|
if ("@state" eq "ssn p") { |
|
$number++; |
|
} |
|
pop(@state); |
|
}, "tagname"], |
|
); |
|
|
|
$p->parse($env{'form.upfile'}); |
|
$p->eof; |
|
foreach my $id (keys(%respbyid)) { |
|
$responses->{$id}=join(',',@{$respbyid{$id}}); |
|
} |
|
return ($errormsg,$number); |
|
} |
|
|
sub interwrite_eval { |
sub interwrite_eval { |
my ($questiontitles,$responses)=@_; |
my ($questiontitles,$responses)=@_; |
my $number=0; |
my $number=0; |
Line 10005 sub turning_eval {
|
Line 11237 sub turning_eval {
|
|
|
|
|
sub assign_clicker_grades { |
sub assign_clicker_grades { |
my ($r,$symb)=@_; |
my ($r,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
# See which part we are saving to |
# See which part we are saving to |
my $res_error; |
my $res_error; |
Line 10016 sub assign_clicker_grades {
|
Line 11248 sub assign_clicker_grades {
|
# 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 |
my $result=&Apache::loncommon::start_data_table(). |
my $result = &Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
'<th>'.&mt('Assigning grades based on clicker file').'</th>'. |
'<th>'.&mt('Assigning grades based on clicker file').'</th>'. |
&Apache::loncommon::end_data_table_header_row(). |
&Apache::loncommon::end_data_table_header_row(). |
&Apache::loncommon::start_data_table_row().'<td>'; |
&Apache::loncommon::start_data_table_row().'<td>'; |
# Get correct result |
# Get correct result |
# FIXME: Possibly need delimiter other than ":" |
# FIXME: Possibly need delimiter other than ":" |
my @correct=(); |
my @correct=(); |
Line 10082 sub assign_clicker_grades {
|
Line 11314 sub assign_clicker_grades {
|
for (my $i=0;$i<$number;$i++) { |
for (my $i=0;$i<$number;$i++) { |
if ($correct[$i] eq '-') { |
if ($correct[$i] eq '-') { |
$realnumber--; |
$realnumber--; |
} elsif (($answer[$i]) || ($answer[$i]=~/^[0\.]+$/)) { |
} elsif (($answer[$i]) || ($answer[$i]=~/^[0\.]+$/)) { |
if ($gradingmechanism eq 'attendance') { |
if ($gradingmechanism eq 'attendance') { |
$sum+=$pcorrect; |
$sum+=$pcorrect; |
} elsif ($correct[$i] eq '*') { |
} elsif ($correct[$i] eq '*') { |
Line 10141 sub navmap_errormsg {
|
Line 11373 sub navmap_errormsg {
|
} |
} |
|
|
sub startpage { |
sub startpage { |
my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$js) = @_; |
my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$head_extra,$onload,$divforres) = @_; |
|
my %args; |
|
if ($onload) { |
|
my %loaditems = ( |
|
'onload' => $onload, |
|
); |
|
$args{'add_entries'} = \%loaditems; |
|
} |
if ($nomenu) { |
if ($nomenu) { |
$r->print(&Apache::loncommon::start_page("Student's Version",$js,{'only_body' => '1'})); |
$args{'only_body'} = 1; |
|
$r->print(&Apache::loncommon::start_page("Student's Version",$head_extra,\%args)); |
} else { |
} else { |
unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"}); |
unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"}); |
$r->print(&Apache::loncommon::start_page('Grading',$js, |
$args{'bread_crumbs'} = $crumbs; |
{'bread_crumbs' => $crumbs})); |
$r->print(&Apache::loncommon::start_page('Grading',$head_extra,\%args)); |
&Apache::lonquickgrades::startGradeScreen($r,($env{'form.symb'}?'probgrading':'grading')); |
if ($env{'request.course.id'}) { |
|
&Apache::lonquickgrades::startGradeScreen($r,($env{'form.symb'}?'probgrading':'grading')); |
|
} |
} |
} |
unless ($nodisplayflag) { |
unless ($nodisplayflag) { |
$r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp)); |
$r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp,$divforres)); |
} |
} |
} |
} |
|
|
sub select_problem { |
sub select_problem { |
my ($r)=@_; |
my ($r)=@_; |
$r->print('<h3>'.&mt('Select the problem or one of the problems you want to grade').'</h3><form action="/adm/grades">'); |
$r->print('<h3>'.&mt('Select the problem or one of the problems you want to grade').'</h3><form action="/adm/grades">'); |
$r->print(&Apache::lonstathelpers::problem_selector('.',undef,1)); |
$r->print(&Apache::lonstathelpers::problem_selector('.',undef,1,undef,undef,1,1)); |
$r->print('<input type="hidden" name="command" value="gradingmenu" />'); |
$r->print('<input type="hidden" name="command" value="gradingmenu" />'); |
$r->print('<input type="submit" value="'.&mt('Next').' →" /></form>'); |
$r->print('<input type="submit" value="'.&mt('Next').' →" /></form>'); |
} |
} |
Line 10215 sub handler {
|
Line 11457 sub handler {
|
&select_problem($request); |
&select_problem($request); |
} else { |
} else { |
if ($command eq 'submission' && $perm{'vgr'}) { |
if ($command eq 'submission' && $perm{'vgr'}) { |
my ($stuvcurrent,$stuvdisp,$versionform,$js); |
my ($stuvcurrent,$stuvdisp,$versionform,$js,$onload); |
if (($env{'form.student'} ne '') && ($env{'form.userdom'} ne '')) { |
if (($env{'form.student'} ne '') && ($env{'form.userdom'} ne '')) { |
($stuvcurrent,$stuvdisp,$versionform,$js) = |
($stuvcurrent,$stuvdisp,$versionform,$js) = |
&choose_task_version_form($symb,$env{'form.student'}, |
&choose_task_version_form($symb,$env{'form.student'}, |
$env{'form.userdom'}); |
$env{'form.userdom'}); |
} |
} |
&startpage($request,$symb,[{href=>"", text=>"Student Submissions"}],undef,undef,$stuvcurrent,$stuvdisp,undef,$js); |
my $divforres; |
|
if ($env{'form.student'} eq '') { |
|
$js .= &part_selector_js(); |
|
$onload = "toggleParts('gradesub');"; |
|
} else { |
|
$divforres = 1; |
|
} |
|
my $head_extra = $js; |
|
unless ($env{'form.vProb'} eq 'no') { |
|
my $csslinks = &Apache::loncommon::css_links($symb); |
|
if ($csslinks) { |
|
$head_extra .= "\n$csslinks"; |
|
} |
|
} |
|
&startpage($request,$symb,[{href=>"", text=>"Student Submissions"}],undef,undef, |
|
$stuvcurrent,$stuvdisp,undef,$head_extra,$onload,$divforres); |
if ($versionform) { |
if ($versionform) { |
|
if ($divforres) { |
|
$request->print('<div style="padding:0;clear:both;margin:0;border:0"></div>'); |
|
} |
$request->print($versionform); |
$request->print($versionform); |
} |
} |
$request->print('<br clear="all" />'); |
($env{'form.student'} eq '' ? &listStudents($request,$symb,'',$divforres) : &submission($request,0,0,$symb,$divforres,$command)); |
($env{'form.student'} eq '' ? &listStudents($request,$symb) : &submission($request,0,0,$symb)); |
|
} elsif ($command eq 'versionsub' && $perm{'vgr'}) { |
} elsif ($command eq 'versionsub' && $perm{'vgr'}) { |
my ($stuvcurrent,$stuvdisp,$versionform,$js) = |
my ($stuvcurrent,$stuvdisp,$versionform,$js) = |
&choose_task_version_form($symb,$env{'form.student'}, |
&choose_task_version_form($symb,$env{'form.student'}, |
$env{'form.userdom'}, |
$env{'form.userdom'}, |
$env{'form.inhibitmenu'}); |
$env{'form.inhibitmenu'}); |
&startpage($request,$symb,[{href=>"", text=>"Previous Student Version"}],undef,undef,$stuvcurrent,$stuvdisp,$env{'form.inhibitmenu'},$js); |
my $head_extra = $js; |
|
unless ($env{'form.vProb'} eq 'no') { |
|
my $csslinks = &Apache::loncommon::css_links($symb); |
|
if ($csslinks) { |
|
$head_extra .= "\n$csslinks"; |
|
} |
|
} |
|
&startpage($request,$symb,[{href=>"", text=>"Previous Student Version"}],undef,undef, |
|
$stuvcurrent,$stuvdisp,$env{'form.inhibitmenu'},$head_extra); |
if ($versionform) { |
if ($versionform) { |
$request->print($versionform); |
$request->print($versionform); |
} |
} |
Line 10243 sub handler {
|
Line 11510 sub handler {
|
{href=>'',text=>'Select student'}],1,1); |
{href=>'',text=>'Select student'}],1,1); |
&pickStudentPage($request,$symb); |
&pickStudentPage($request,$symb); |
} elsif ($command eq 'displayPage' && $perm{'vgr'}) { |
} elsif ($command eq 'displayPage' && $perm{'vgr'}) { |
|
my $csslinks; |
|
unless ($env{'form.vProb'} eq 'no') { |
|
$csslinks = &Apache::loncommon::css_links($symb,'map'); |
|
} |
&startpage($request,$symb, |
&startpage($request,$symb, |
[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'}, |
[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'}, |
{href=>'',text=>'Select student'}, |
{href=>'',text=>'Select student'}, |
{href=>'',text=>'Grade student'}],1,1); |
{href=>'',text=>'Grade student'}],1,1,undef,undef,undef,$csslinks); |
&displayPage($request,$symb); |
&displayPage($request,$symb); |
} elsif ($command eq 'gradeByPage' && $perm{'mgr'}) { |
} elsif ($command eq 'gradeByPage' && $perm{'mgr'}) { |
&startpage($request,$symb,[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'}, |
&startpage($request,$symb,[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'}, |
Line 10255 sub handler {
|
Line 11526 sub handler {
|
{href=>'',text=>'Store grades'}],1,1); |
{href=>'',text=>'Store grades'}],1,1); |
&updateGradeByPage($request,$symb); |
&updateGradeByPage($request,$symb); |
} elsif ($command eq 'processGroup' && $perm{'vgr'}) { |
} elsif ($command eq 'processGroup' && $perm{'vgr'}) { |
|
my $csslinks; |
|
unless ($env{'form.vProb'} eq 'no') { |
|
$csslinks = &Apache::loncommon::css_links($symb); |
|
} |
&startpage($request,$symb,[{href=>'',text=>'...'}, |
&startpage($request,$symb,[{href=>'',text=>'...'}, |
{href=>'',text=>'Modify grades'}]); |
{href=>'',text=>'Modify grades'}],undef,undef,undef,undef,undef,$csslinks,undef,1); |
&processGroup($request,$symb); |
&processGroup($request,$symb); |
} elsif ($command eq 'gradingmenu' && $perm{'vgr'}) { |
} elsif ($command eq 'gradingmenu' && $perm{'vgr'}) { |
&startpage($request,$symb); |
&startpage($request,$symb); |
Line 10265 sub handler {
|
Line 11540 sub handler {
|
&startpage($request,$symb,[{href=>'',text=>'Select individual students to grade'}]); |
&startpage($request,$symb,[{href=>'',text=>'Select individual students to grade'}]); |
$request->print(&submit_options($request,$symb)); |
$request->print(&submit_options($request,$symb)); |
} elsif ($command eq 'ungraded' && $perm{'vgr'}) { |
} elsif ($command eq 'ungraded' && $perm{'vgr'}) { |
&startpage($request,$symb,[{href=>'',text=>'Grade ungraded submissions'}]); |
my $js = &part_selector_js(); |
|
my $onload = "toggleParts('gradesub');"; |
|
&startpage($request,$symb,[{href=>'',text=>'Grade ungraded submissions'}], |
|
undef,undef,undef,undef,undef,$js,$onload); |
$request->print(&listStudents($request,$symb,'graded')); |
$request->print(&listStudents($request,$symb,'graded')); |
} elsif ($command eq 'table' && $perm{'vgr'}) { |
} elsif ($command eq 'table' && $perm{'vgr'}) { |
&startpage($request,$symb,[{href=>"", text=>"Grading table"}]); |
&startpage($request,$symb,[{href=>"", text=>"Grading table"}]); |
Line 10331 sub handler {
|
Line 11609 sub handler {
|
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
$request->print(&csvuploadassign($request,$symb)); |
$request->print(&csvuploadassign($request,$symb)); |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1, |
|
undef,undef,undef,undef,'toggleScantab(document.rules);'); |
$request->print(&scantron_selectphase($request,undef,$symb)); |
$request->print(&scantron_selectphase($request,undef,$symb)); |
} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
Line 10343 sub handler {
|
Line 11622 sub handler {
|
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
$request->print(&scantron_process_students($request,$symb)); |
$request->print(&scantron_process_students($request,$symb)); |
} elsif ($command eq 'scantronupload' && |
} elsif ($command eq 'scantronupload' && |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'})|| |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || $perm{'usc'})) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'}))) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1, |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
undef,undef,undef,undef,'toggleScantab(document.rules);'); |
$request->print(&scantron_upload_scantron_data($request,$symb)); |
$request->print(&scantron_upload_scantron_data($request,$symb)); |
} elsif ($command eq 'scantronupload_save' && |
} elsif ($command eq 'scantronupload_save' && |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'})|| |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || $perm{'usc'})) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'}))) { |
|
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
$request->print(&scantron_upload_scantron_data_save($request,$symb)); |
$request->print(&scantron_upload_scantron_data_save($request,$symb)); |
} elsif ($command eq 'scantron_download' && |
} elsif ($command eq 'scantron_download' && ($perm{'usc'} || $perm{'mgr'})) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'})) { |
|
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
$request->print(&scantron_download_scantron_data($request,$symb)); |
$request->print(&scantron_download_scantron_data($request,$symb)); |
|
} elsif ($command eq 'scantronupload_delete' && |
|
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || $perm{'usc'})) { |
|
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
|
&scantron_upload_delete($request,$symb); |
} elsif ($command eq 'checksubmissions' && $perm{'vgr'}) { |
} elsif ($command eq 'checksubmissions' && $perm{'vgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
$request->print(&checkscantron_results($request,$symb)); |
$request->print(&checkscantron_results($request,$symb)); |
} elsif ($command eq 'downloadfilesselect' && $perm{'vgr'}) { |
} elsif ($command eq 'downloadfilesselect' && $perm{'vgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Select which submissions to download'}]); |
my $js = &part_selector_js(); |
|
my $onload = "toggleParts('gradingMenu');"; |
|
&startpage($request,$symb,[{href=>'', text=>'Select which submissions to download'}], |
|
undef,undef,undef,undef,undef,$js,$onload); |
$request->print(&submit_options_download($request,$symb)); |
$request->print(&submit_options_download($request,$symb)); |
} elsif ($command eq 'downloadfileslink' && $perm{'vgr'}) { |
} elsif ($command eq 'downloadfileslink' && $perm{'vgr'}) { |
&startpage($request,$symb, |
&startpage($request,$symb, |
[{href=>&href_symb_cmd($symb,'downloadfilesselect'), text=>'Select which submissions to download'}, |
[{href=>&href_symb_cmd($symb,'downloadfilesselect'), text=>'Select which submissions to download'}, |
{href=>'', text=>'Download submissions'}]); |
{href=>'', text=>'Download submitted files'}], |
|
undef,undef,undef,undef,undef,undef,undef,1); |
|
$request->print('<div style="padding:0;clear:both;margin:0;border:0"></div>'); |
&submit_download_link($request,$symb); |
&submit_download_link($request,$symb); |
} elsif ($command) { |
} elsif ($command) { |
&startpage($request,$symb,[{href=>'', text=>'Access denied'}]); |
&startpage($request,$symb,[{href=>'', text=>'Access denied'}]); |
Line 10377 sub handler {
|
Line 11663 sub handler {
|
} |
} |
if ($env{'form.inhibitmenu'}) { |
if ($env{'form.inhibitmenu'}) { |
$request->print(&Apache::loncommon::end_page()); |
$request->print(&Apache::loncommon::end_page()); |
} else { |
} elsif ($env{'request.course.id'}) { |
&Apache::lonquickgrades::endGradeScreen($request); |
&Apache::lonquickgrades::endGradeScreen($request); |
} |
} |
&reset_caches(); |
&reset_caches(); |
Line 10528 Side Effects: None.
|
Line 11814 Side Effects: None.
|
$r - Apache request object |
$r - Apache request object |
$i - number of the current scanline |
$i - number of the current scanline |
$scan_record - hash ref as returned from &scantron_parse_scanline() |
$scan_record - hash ref as returned from &scantron_parse_scanline() |
$scan_config - hash ref as returned from &get_scantron_config() |
$scan_config - hash ref as returned from &Apache::lonnet::get_scantron_config() |
$line - full contents of the current scanline |
$line - full contents of the current scanline |
$error - error condition, valid values are |
$error - error condition, valid values are |
'incorrectCODE', 'duplicateCODE', |
'incorrectCODE', 'duplicateCODE', |
Line 10615 Side Effects: None.
|
Line 11901 Side Effects: None.
|
=item scantron_upload_scantron_data_save() : |
=item scantron_upload_scantron_data_save() : |
|
|
Adds a provided bubble information data file to the course if user |
Adds a provided bubble information data file to the course if user |
has the correct privileges to do so. |
has the correct privileges to do so. |
|
|
|
= item scantron_upload_delete() : |
|
|
|
Deletes a previously uploaded bubble information data file, if user |
|
was the one who uploaded the file, and has the privileges to do so. |
|
|
=item valid_file() : |
=item valid_file() : |
|
|