version 1.459, 2007/10/15 09:47:47
|
version 1.465, 2007/10/26 00:27:55
|
Line 57 my %first_bubble_line = (); # First bubb
|
Line 57 my %first_bubble_line = (); # First bubb
|
|
|
|
|
sub save_bubble_lines { |
sub save_bubble_lines { |
&Apache::lonnet::logthis("Saving bubble_lines..."); |
|
foreach my $line (keys(%bubble_lines_per_response)) { |
foreach my $line (keys(%bubble_lines_per_response)) { |
&Apache::lonnet::logthis("Saving form.scantron.bubblelines.$line value: $bubble_lines_per_response{$line}"); |
|
$env{"form.scantron.bubblelines.$line"} = $bubble_lines_per_response{$line}; |
$env{"form.scantron.bubblelines.$line"} = $bubble_lines_per_response{$line}; |
$env{"form.scantron.first_bubble_line.$line"} = |
$env{"form.scantron.first_bubble_line.$line"} = |
$first_bubble_line{$line}; |
$first_bubble_line{$line}; |
Line 72 sub restore_bubble_lines {
|
Line 70 sub restore_bubble_lines {
|
%bubble_lines_per_response = (); |
%bubble_lines_per_response = (); |
while ($env{"form.scantron.bubblelines.$line"}) { |
while ($env{"form.scantron.bubblelines.$line"}) { |
my $value = $env{"form.scantron.bubblelines.$line"}; |
my $value = $env{"form.scantron.bubblelines.$line"}; |
&Apache::lonnet::logthis("Restoring form.scantron.bubblelines.$line value: $value"); |
|
$bubble_lines_per_response{$line} = $value; |
$bubble_lines_per_response{$line} = $value; |
$first_bubble_line{$line} = |
$first_bubble_line{$line} = |
$env{"form.scantron.first_bubble_line.$line"}; |
$env{"form.scantron.first_bubble_line.$line"}; |
Line 87 sub restore_bubble_lines {
|
Line 84 sub restore_bubble_lines {
|
sub get_response_bubbles { |
sub get_response_bubbles { |
my ($parsed_line, $response) = @_; |
my ($parsed_line, $response) = @_; |
|
|
my $bubble_line = $first_bubble_line{$response}; |
|
my $bubble_lines= $bubble_lines_per_response{$response}; |
my $bubble_line = $first_bubble_line{$response-1} +1; |
|
my $bubble_lines= $bubble_lines_per_response{$response-1}; |
|
|
my $selected = ""; |
my $selected = ""; |
|
|
for (my $bline = 0; $bline < $bubble_lines; $bline++) { |
for (my $bline = 0; $bline < $bubble_lines; $bline++) { |
$selected .= $$parsed_line{"scantron.$bubble_line.answer"}; |
$selected .= $$parsed_line{"scantron.$bubble_line.answer"}.":"; |
$bubble_line++; |
$bubble_line++; |
} |
} |
return $selected; |
return $selected; |
Line 1481 INNERJS
|
Line 1480 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("<h3><span class=\\"LC_info\\"> Compose Message for \"+fullname+\"</span></h3><br /><br />"); |
pDoc.write("<h3><span class=\\"LC_info\\"> Compose Message for \"+fullname+\"<\\/span><\\/h3><br /><br />"); |
|
|
pDoc.write("<table border=0 width=100%><tr><td bgcolor=\\"#777777\\">"); |
pDoc.write("<table border=0 width=100%><tr><td bgcolor=\\"#777777\\">"); |
pDoc.write("<table border=0 width=100%><tr bgcolor=\\"#ddffff\\">"); |
pDoc.write("<table border=0 width=100%><tr bgcolor=\\"#ddffff\\">"); |
pDoc.write("<td><b>Type</b></td><td><b>Include</b></td><td><b>Message</td></tr>"); |
pDoc.write("<td><b>Type<\\/b><\\/td><td><b>Include<\\/b><\\/td><td><b>Message<\\/td><\\/tr>"); |
} |
} |
function displaySubject(msg,shwsel) { |
function displaySubject(msg,shwsel) { |
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<td>Subject</td>"); |
pDoc.write("<td>Subject<\\/td>"); |
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><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"60\\" maxlength=\\"80\\"></td></tr>"); |
pDoc.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"60\\" maxlength=\\"80\\"><\\/td><\\/tr>"); |
} |
} |
|
|
function displaySavedMsg(ctr,msg,shwsel) { |
function displaySavedMsg(ctr,msg,shwsel) { |
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<td align=\\"center\\">"+ctr+"</td>"); |
pDoc.write("<td align=\\"center\\">"+ctr+"<\\/td>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"msgn"+ctr+"\\" type=\\"checkbox\\"" +shwsel+"></td>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"msgn"+ctr+"\\" type=\\"checkbox\\"" +shwsel+"><\\/td>"); |
pDoc.write("<td><textarea name=\\"msg"+ctr+"\\" cols=\\"60\\" rows=\\"3\\">"+msg+"</textarea></td></tr>"); |
pDoc.write("<td><textarea name=\\"msg"+ctr+"\\" cols=\\"60\\" rows=\\"3\\">"+msg+"<\\/textarea><\\/td><\\/tr>"); |
} |
} |
|
|
function newMsg(newmsg,shwsel) { |
function newMsg(newmsg,shwsel) { |
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<td align=\\"center\\">New</td>"); |
pDoc.write("<td align=\\"center\\">New<\\/td>"); |
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><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>"); |
} |
} |
|
|
function msgTail() { |
function msgTail() { |
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=\\"Save\\" onClick=\\"javascript:checkInput()\\"> "); |
pDoc.write("<input type=\\"button\\" value=\\"Save\\" onClick=\\"javascript:checkInput()\\"> "); |
pDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onClick=\\"self.close()\\"><br /><br />"); |
pDoc.write("<input type=\\"button\\" value=\\"Cancel\\" 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(); |
} |
} |
Line 1566 INNERJS
|
Line 1565 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("<h3><span class=\\"LC_info\\"> Keyword Highlight Options</span></h3><br /><br />"); |
hDoc.write("<h3><span class=\\"LC_info\\"> Keyword Highlight Options<\\/span><\\/h3><br /><br />"); |
|
|
hDoc.write("<table border=0 width=100%><tr><td bgcolor=\\"#777777\\">"); |
hDoc.write("<table border=0 width=100%><tr><td bgcolor=\\"#777777\\">"); |
hDoc.write("<table border=0 width=100%><tr bgcolor=\\"#ddffff\\">"); |
hDoc.write("<table border=0 width=100%><tr bgcolor=\\"#ddffff\\">"); |
hDoc.write("<td><b>Text Color</b></td><td><b>Font Size</b></td><td><b>Font Style</td></tr>"); |
hDoc.write("<td><b>Text Color<\\/b><\\/td><td><b>Font Size<\\/b><\\/td><td><b>Font Style<\\/td><\\/tr>"); |
} |
} |
|
|
function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { |
function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { |
var hDoc = hwdWin.document; |
var hDoc = hwdWin.document; |
hDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
hDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
hDoc.write("<td align=\\"left\\">"); |
hDoc.write("<td align=\\"left\\">"); |
hDoc.write("<input name=\\"kwdclr\\" type=\\"radio\\" value=\\""+clrval+"\\" "+clrsel+"> "+clrtxt+"</td>"); |
hDoc.write("<input name=\\"kwdclr\\" type=\\"radio\\" value=\\""+clrval+"\\" "+clrsel+"> "+clrtxt+"<\\/td>"); |
hDoc.write("<td align=\\"left\\">"); |
hDoc.write("<td align=\\"left\\">"); |
hDoc.write("<input name=\\"kwdsize\\" type=\\"radio\\" value=\\""+szval+"\\" "+szsel+"> "+sztxt+"</td>"); |
hDoc.write("<input name=\\"kwdsize\\" type=\\"radio\\" value=\\""+szval+"\\" "+szsel+"> "+sztxt+"<\\/td>"); |
hDoc.write("<td align=\\"left\\">"); |
hDoc.write("<td align=\\"left\\">"); |
hDoc.write("<input name=\\"kwdstyle\\" type=\\"radio\\" value=\\""+syval+"\\" "+sysel+"> "+sytxt+"</td>"); |
hDoc.write("<input name=\\"kwdstyle\\" type=\\"radio\\" value=\\""+syval+"\\" "+sysel+"> "+sytxt+"<\\/td>"); |
hDoc.write("</tr>"); |
hDoc.write("<\\/tr>"); |
} |
} |
|
|
function highlightend() { |
function highlightend() { |
var hDoc = hwdWin.document; |
var hDoc = hwdWin.document; |
hDoc.write("</table>"); |
hDoc.write("<\\/table>"); |
hDoc.write("</td></tr></table> "); |
hDoc.write("<\\/td><\\/tr><\\/table> "); |
hDoc.write("<input type=\\"button\\" value=\\"Save\\" onClick=\\"javascript:updateChoice(1)\\"> "); |
hDoc.write("<input type=\\"button\\" value=\\"Save\\" onClick=\\"javascript:updateChoice(1)\\"> "); |
hDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onClick=\\"self.close()\\"><br /><br />"); |
hDoc.write("<input type=\\"button\\" value=\\"Cancel\\" 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 1961 KEYWORDS
|
Line 1960 KEYWORDS
|
|
|
# This is where output for one specific student would start |
# This is where output for one specific student would start |
my $bgcolor='#DDEEDD'; |
my $bgcolor='#DDEEDD'; |
if (int($counter/2) eq $counter) { $bgcolor='#DDDDEE'; } |
if ($counter%2) { $bgcolor='#DDDDEE'; } |
$request->print("\n\n". |
$request->print("\n\n". |
'<p><table border="2"><tr><th bgcolor="'.$bgcolor.'">'.$env{'form.fullname'}.'</th></tr><tr><td bgcolor="'.$bgcolor.'">'); |
'<p><table border="2"><tr><th bgcolor="'.$bgcolor.'">'.$env{'form.fullname'}.'</th></tr><tr><td bgcolor="'.$bgcolor.'">'); |
|
|
Line 1991 KEYWORDS
|
Line 1990 KEYWORDS
|
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
|
|
# If any part of the problem is an essay-response (handgraded), then check for collaborators |
# If any part of the problem is an essay-response (handgraded), then check for collaborators |
my @col_fullnames; |
my $fullname; |
my ($classlist,$fullname); |
my $col_fullnames = []; |
if ($env{'form.handgrade'} eq 'yes') { |
if ($env{'form.handgrade'} eq 'yes') { |
($classlist,undef,$fullname) = &getclasslist('all','0'); |
(my $sub_result,$fullname,$col_fullnames)= |
for (keys (%$handgrade)) { |
&check_collaborators($symb,$uname,$udom,\%record,$handgrade, |
my $ncol = &Apache::lonnet::EXT('resource.'.$_. |
$counter); |
'.maxcollaborators', |
$result.=$sub_result; |
$symb,$udom,$uname); |
|
next if ($ncol <= 0); |
|
s/\_/\./g; |
|
next if ($record{'resource.'.$_.'.collaborators'} eq ''); |
|
my @goodcollaborators = (); |
|
my @badcollaborators = (); |
|
foreach (split(/,?\s+/,$record{'resource.'.$_.'.collaborators'})) { |
|
$_ =~ s/[\$\^\(\)]//g; |
|
next if ($_ eq ''); |
|
my ($co_name,$co_dom) = split /\@|:/,$_; |
|
$co_dom = $udom if (! defined($co_dom) || $co_dom =~ /^domain$/i); |
|
next if ($co_name eq $uname && $co_dom eq $udom); |
|
# Doing this grep allows 'fuzzy' specification |
|
my @Matches = grep /^$co_name:$co_dom$/i,keys %$classlist; |
|
if (! scalar(@Matches)) { |
|
push @badcollaborators,$_; |
|
} else { |
|
push @goodcollaborators, @Matches; |
|
} |
|
} |
|
if (scalar(@goodcollaborators) != 0) { |
|
$result.='<b>Collaborators: </b>'; |
|
foreach (@goodcollaborators) { |
|
my ($lastname,$givenn) = split(/,/,$$fullname{$_}); |
|
push @col_fullnames, $givenn.' '.$lastname; |
|
$result.=$$fullname{$_}.' '; |
|
} |
|
$result.='<br />'."\n"; |
|
my ($part)=split(/\./,$_); |
|
$result.='<input type="hidden" name="collaborator'.$counter. |
|
'" value="'.$part.':'.(join ':',@goodcollaborators).'" />'. |
|
"\n"; |
|
} |
|
if (scalar(@badcollaborators) > 0) { |
|
$result.='<table border="0"><tr bgcolor="#ffbbbb"><td>'; |
|
$result.='This student has submitted '; |
|
$result.=(scalar(@badcollaborators) == 1) ? 'an invalid collaborator' : 'invalid collaborators'; |
|
$result .= ': '.join(', ',@badcollaborators); |
|
$result .= '</td></tr></table>'; |
|
} |
|
if (scalar(@badcollaborators > $ncol)) { |
|
$result .= '<table border="0"><tr bgcolor="#ffbbbb"><td>'; |
|
$result .= 'This student has submitted too many '. |
|
'collaborators. Maximum is '.$ncol.'.'; |
|
$result .= '</td></tr></table>'; |
|
} |
|
} |
|
} |
} |
$request->print($result."\n"); |
$request->print($result."\n"); |
|
|
Line 2180 KEYWORDS
|
Line 2132 KEYWORDS
|
if ($env{'form.handgrade'} eq 'yes') { |
if ($env{'form.handgrade'} eq 'yes') { |
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"; |
$result.=' <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" name="mailicon'.$counter.'" />'."\n". |
'/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n". |
Line 2267 KEYWORDS
|
Line 2219 KEYWORDS
|
return ''; |
return ''; |
} |
} |
|
|
|
sub check_collaborators { |
|
my ($symb,$uname,$udom,$record,$handgrade,$counter) = @_; |
|
my ($result,@col_fullnames); |
|
my ($classlist,undef,$fullname) = &getclasslist('all','0'); |
|
foreach my $part (keys(%$handgrade)) { |
|
my $ncol = &Apache::lonnet::EXT('resource.'.$part. |
|
'.maxcollaborators', |
|
$symb,$udom,$uname); |
|
next if ($ncol <= 0); |
|
$part =~ s/\_/\./g; |
|
next if ($record->{'resource.'.$part.'.collaborators'} eq ''); |
|
my (@good_collaborators, @bad_collaborators); |
|
foreach my $possible_collaborator |
|
(split(/,?\s+/,$record->{'resource.'.$part.'.collaborators'})) { |
|
$possible_collaborator =~ s/[\$\^\(\)]//g; |
|
next if ($possible_collaborator eq ''); |
|
my ($co_name,$co_dom) = split(/\@|:/,$possible_collaborator); |
|
$co_dom = $udom if (! defined($co_dom) || $co_dom =~ /^domain$/i); |
|
next if ($co_name eq $uname && $co_dom eq $udom); |
|
# Doing this grep allows 'fuzzy' specification |
|
my @matches = grep(/^\Q$co_name\E:\Q$co_dom\E$/i, |
|
keys(%$classlist)); |
|
if (! scalar(@matches)) { |
|
push(@bad_collaborators, $possible_collaborator); |
|
} else { |
|
push(@good_collaborators, @matches); |
|
} |
|
} |
|
if (scalar(@good_collaborators) != 0) { |
|
$result.='<b>Collaborators: </b>'; |
|
foreach my $name (@good_collaborators) { |
|
my ($lastname,$givenn) = split(/,/,$$fullname{$name}); |
|
push(@col_fullnames, $givenn.' '.$lastname); |
|
$result.=$fullname->{$name}.' '; |
|
} |
|
$result.='<br />'."\n"; |
|
my ($part)=split(/\./,$_); |
|
$result.='<input type="hidden" name="collaborator'.$counter. |
|
'" value="'.$part.':'.(join ':',@good_collaborators).'" />'. |
|
"\n"; |
|
} |
|
if (scalar(@bad_collaborators) > 0) { |
|
$result.='<div class="LC_error">'; |
|
$result.=&mt('This student has submitted [quant,_1,invalid collaborator]: [_2]',scalar(@bad_collaborators),join(', ',@bad_collaborators)); |
|
$result .= '</div>'; |
|
} |
|
if (scalar(@bad_collaborators > $ncol)) { |
|
$result .= '<div class="LC_error">'; |
|
$result .= &mt('This student has submitted too many '. |
|
'collaborators. Maximum is [_1].',$ncol); |
|
$result .= '</div>'; |
|
} |
|
} |
|
return ($result,$fullname,\@col_fullnames); |
|
} |
|
|
#--- 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)=@_; |
Line 3913 sub csvuploadassign {
|
Line 3921 sub csvuploadassign {
|
if ($wgt) { |
if ($wgt) { |
$entries{$fields{$dest}}=~s/\s//g; |
$entries{$fields{$dest}}=~s/\s//g; |
my $pcr=$entries{$fields{$dest}} / $wgt; |
my $pcr=$entries{$fields{$dest}} / $wgt; |
my $award='correct_by_override'; |
my $award=($pcr == 0) ? 'incorrect_by_override' |
|
: 'correct_by_override'; |
$grades{"resource.$part.awarded"}=$pcr; |
$grades{"resource.$part.awarded"}=$pcr; |
$grades{"resource.$part.solved"}=$award; |
$grades{"resource.$part.solved"}=$award; |
$points{$part}=1; |
$points{$part}=1; |
Line 5269 sub scantron_parse_scanline {
|
Line 5278 sub scantron_parse_scanline {
|
|| (&occurence_count($currentquest, "[A-Z]") > 1)) { |
|| (&occurence_count($currentquest, "[A-Z]") > 1)) { |
push(@{$record{'scantron.doubleerror'}},$questnum); |
push(@{$record{'scantron.doubleerror'}},$questnum); |
for (my $ans = 0; $ans < $answers_needed; $ans++) { |
for (my $ans = 0; $ans < $answers_needed; $ans++) { |
$record{"scantron.$ansnum.answer"}=''; |
my $bubble = substr($currentquest, $ans, 1); |
|
if ($bubble =~ /[A-Z]/ ) { |
|
$record{"scantron.$ansnum.answer"} = $bubble; |
|
} else { |
|
$record{"scantron.$ansnum.answer"}=''; |
|
} |
$ansnum++; |
$ansnum++; |
} |
} |
|
|
Line 5304 sub scantron_parse_scanline {
|
Line 5318 sub scantron_parse_scanline {
|
|| (&occurence_count($currentquest, '\d') > 1)) { |
|| (&occurence_count($currentquest, '\d') > 1)) { |
push(@{$record{'scantron.doubleerror'}},$questnum); |
push(@{$record{'scantron.doubleerror'}},$questnum); |
for (my $ans = 0; $ans < $answers_needed; $ans++) { |
for (my $ans = 0; $ans < $answers_needed; $ans++) { |
$record{"scantron.$ansnum.answer"}=''; |
my $bubble = substr($currentquest, $ans, 1); |
|
if ($bubble =~ /\d/) { |
|
$record{"scantron.$ansnum.answer"} = $alphabet[$bubble]; |
|
} else { |
|
$record{"scantron.$ansnum.answer"}=' '; |
|
} |
$ansnum++; |
$ansnum++; |
} |
} |
|
|
Line 5374 sub scantron_parse_scanline {
|
Line 5393 sub scantron_parse_scanline {
|
|
|
my $first_answer = $ansnum; |
my $first_answer = $ansnum; |
for (my $ans =0; $ans < $answers_needed; $ans++) { |
for (my $ans =0; $ans < $answers_needed; $ans++) { |
$record{"scantron.$ansnum.answer"} = ''; |
my $item = $first_answer+$ans; |
$ans++; |
$record{"scantron.$item.answer"} = ''; |
} |
} |
|
|
my @ans=@array; |
my @ans=@array; |
my $i=length($ans[0]);shift(@ans); |
my $i=0; |
|
my $increment = 0; |
while ($#ans) { |
while ($#ans) { |
$i+=length($ans[0])+1; |
$i+=length($ans[0]) + $increment; |
my $line = $i/$$scantron_config{'Qlength'} + $first_answer; |
my $line = int($i/$$scantron_config{'Qlength'} + $first_answer); |
my $bubble = $i%$$scantron_config{'Qlength'}; |
my $bubble = $i%$$scantron_config{'Qlength'}; |
|
|
$record{"scantron.$line.answer"}.=$alphabet[$bubble]; |
$record{"scantron.$line.answer"}.=$alphabet[$bubble]; |
shift(@ans); |
shift(@ans); |
|
$increment = 1; |
} |
} |
|
$ansnum += $answers_needed; |
} |
} |
} |
} |
} |
} |
Line 5747 SCANTRONFORM
|
Line 5768 SCANTRONFORM
|
|
|
my $line = 0; |
my $line = 0; |
while (defined($env{"form.scantron.bubblelines.$line"})) { |
while (defined($env{"form.scantron.bubblelines.$line"})) { |
&Apache::lonnet::logthis("Saving chunk for $line"); |
|
my $chunk = |
my $chunk = |
'<input type="hidden" name="scantron.bubblelines.'.$line.'" value="'.$env{"form.scantron.bubblelines.$line"}.'" />'."\n"; |
'<input type="hidden" name="scantron.bubblelines.'.$line.'" value="'.$env{"form.scantron.bubblelines.$line"}.'" />'."\n"; |
$chunk .= |
$chunk .= |
Line 5813 sub scantron_validate_file {
|
Line 5833 sub scantron_validate_file {
|
} |
} |
my $currentphase=$env{'form.validatepass'}; |
my $currentphase=$env{'form.validatepass'}; |
|
|
&Apache::lonnet::logthis("Phase: $currentphase"); |
|
|
|
my $stop=0; |
my $stop=0; |
while (!$stop && $currentphase < scalar(@validate_phases)) { |
while (!$stop && $currentphase < scalar(@validate_phases)) { |
Line 6424 ENDSCRIPT
|
Line 6443 ENDSCRIPT
|
$r->print($message); |
$r->print($message); |
$r->print("<p>Please indicate which bubble should be used for grading</p>"); |
$r->print("<p>Please indicate which bubble should be used for grading</p>"); |
foreach my $question (@{$arg}) { |
foreach my $question (@{$arg}) { |
|
|
my $selected = &get_response_bubbles($scan_record, $question); |
my $selected = &get_response_bubbles($scan_record, $question); |
|
my @select_array = split(/:/,$selected); |
&scantron_bubble_selector($r,$scan_config,$question, |
&scantron_bubble_selector($r,$scan_config,$question, |
split('',$selected)); |
@select_array); |
} |
} |
} elsif ($error eq 'missingbubble') { |
} elsif ($error eq 'missingbubble') { |
$r->print("<p>There have been <b>no</b> bubbles scanned for some question(s)</p>\n"); |
$r->print("<p>There have been <b>no</b> bubbles scanned for some question(s)</p>\n"); |
Line 6458 ENDSCRIPT
|
Line 6477 ENDSCRIPT
|
$r - Apache request object |
$r - Apache request object |
$scan_config - hash from &get_scantron_config() |
$scan_config - hash from &get_scantron_config() |
$quest - number of the bubble line to make a corrector for |
$quest - number of the bubble line to make a corrector for |
$selected - array of letters of previously selected bubbles |
$lines - array of answer lines. |
|
|
=cut |
=cut |
|
|
sub scantron_bubble_selector { |
sub scantron_bubble_selector { |
my ($r,$scan_config,$quest,@selected)=@_; |
my ($r,$scan_config,$quest,@lines)=@_; |
my $max=$$scan_config{'Qlength'}; |
my $max=$$scan_config{'Qlength'}; |
|
|
|
|
my $scmode=$$scan_config{'Qon'}; |
my $scmode=$$scan_config{'Qon'}; |
|
|
|
my $bubble_length = scalar(@lines); |
|
|
|
|
if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; } |
if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; } |
|
|
my $response = $quest-1; |
my $response = $quest-1; |
my $lines = $bubble_lines_per_response{$response}; |
my $lines = $bubble_lines_per_response{$response}; |
&Apache::lonnet::logthis("Question $quest, lines: $lines"); |
|
|
|
my $total_lines = $lines*2; |
my $total_lines = $lines*2; |
my @alphabet=('A'..'Z'); |
my @alphabet=('A'..'Z'); |
Line 6483 sub scantron_bubble_selector {
|
Line 6504 sub scantron_bubble_selector {
|
if ($l != 0) { |
if ($l != 0) { |
$r->print('<tr>'); |
$r->print('<tr>'); |
} |
} |
|
my @selected = split(//,$lines[$l]); |
# FIXME: This loop probably has to be considerably more clever for |
|
# multiline bubbles: User can multibubble by having bubbles in |
|
# several lines. User can skip lines legitimately etc. etc. |
|
|
|
for (my $i=0;$i<$max;$i++) { |
for (my $i=0;$i<$max;$i++) { |
$r->print("\n".'<td align="center">'); |
$r->print("\n".'<td align="center">'); |
if ($selected[0] eq $alphabet[$i]) { |
if ($selected[0] eq $alphabet[$i]) { |
Line 6737 sub scantron_validate_doublebubble {
|
Line 6754 sub scantron_validate_doublebubble {
|
=cut |
=cut |
|
|
sub scantron_get_maxbubble { |
sub scantron_get_maxbubble { |
&Apache::lonnet::logthis("get_max_bubble"); |
|
if (defined($env{'form.scantron_maxbubble'}) && |
if (defined($env{'form.scantron_maxbubble'}) && |
$env{'form.scantron_maxbubble'}) { |
$env{'form.scantron_maxbubble'}) { |
&Apache::lonnet::logthis("cached"); |
|
&restore_bubble_lines(); |
&restore_bubble_lines(); |
return $env{'form.scantron_maxbubble'}; |
return $env{'form.scantron_maxbubble'}; |
} |
} |
&Apache::lonnet::logthis("computing"); |
|
|
|
my (undef, undef, $sequence) = |
my (undef, undef, $sequence) = |
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
Line 6782 sub scantron_get_maxbubble {
|
Line 6796 sub scantron_get_maxbubble {
|
|
|
|
|
foreach my $part_id (@{$analysis{'parts'}}) { |
foreach my $part_id (@{$analysis{'parts'}}) { |
my ($trash, $part) = split(/\./, $part_id); |
|
|
|
my $lines = $analysis{"$part_id.bubble_lines"}[0]; |
|
|
my $lines = $analysis{"$part_id.bubble_lines"};; |
|
|
# TODO - make this a persistent hash not an array. |
# TODO - make this a persistent hash not an array. |
|
|
Line 7190 sub grading_menu {
|
Line 7204 sub grading_menu {
|
my $probTitle = &Apache::lonnet::gettitle($symb); |
my $probTitle = &Apache::lonnet::gettitle($symb); |
my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle); |
my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle); |
|
|
# |
|
# Define menu data |
|
$env{'form.probTitle'} = &Apache::lonnet::gettitle($symb); |
|
my ($table) = &showResourceInfo($symb,$env{'form.probTitle'}); |
|
$request->print($table); |
$request->print($table); |
my %fields = ('symb'=>&Apache::lonenc::check_encrypt($symb), |
my %fields = ('symb'=>&Apache::lonenc::check_encrypt($symb), |
'handgrade'=>$hdgrade, |
'handgrade'=>$hdgrade, |
Line 8071 sub handler {
|
Line 8081 sub handler {
|
} elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) { |
} elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) { |
$request->print(&csvuploadassign($request)); |
$request->print(&csvuploadassign($request)); |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
&Apache::lonnet::logthis("Selecting pyhase"); |
|
$request->print(&scantron_selectphase($request)); |
$request->print(&scantron_selectphase($request)); |
} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) { |
$request->print(&scantron_do_warning($request)); |
$request->print(&scantron_do_warning($request)); |