--- loncom/homework/grades.pm 2003/09/27 01:59:10 1.130.2.1.2.4
+++ loncom/homework/grades.pm 2003/09/21 21:40:06 1.141
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
-# $Id: grades.pm,v 1.130.2.1.2.4 2003/09/27 01:59:10 albertel Exp $
+# $Id: grades.pm,v 1.141 2003/09/21 21:40:06 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -218,7 +218,8 @@ sub commonJSfunctions {
}
}
} else {
- if (selectOne.selected) return selectOne.value;
+ // only one value it must be the selected one
+ return selectOne.value;
}
}
@@ -517,8 +518,8 @@ LISTJAVASCRIPT
my $saveStatus = $ENV{'form.Status'} eq '' ? 'Active' : $ENV{'form.Status'};
$ENV{'form.Status'} = $saveStatus;
- $gradeTable.=' last sub only'."\n".
- ' last sub & parts info'."\n".
+ $gradeTable.=' last submission only'."\n".
+ ' last submission & parts info'."\n".
' by dates and submissions'."\n".
' all details'."\n".
''."\n".
@@ -544,7 +545,7 @@ LISTJAVASCRIPT
$gradeTable.='" />'."\n";
-
+ $gradeTable.='Check For Plagiarism';
my (undef, undef, $fullname) = &getclasslist($getsec,'1');
$gradeTable.='
'.
'
';
@@ -1461,13 +1462,20 @@ KEYWORDS
my ($ressub,$subval) = split(/:/,$_,2);
# Similarity check
my $similar='';
- my ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval);
- if ($osim) {
- $osim=int($osim*100.0);
- $similar='
Essay is '.$osim.
- '% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom).
- '
'.
- &keywords_highlight($oessay).'
';
+ my $oname;
+ my $odom;
+ my $ocrsid;
+ my $oessay;
+ my $osim;
+ if($ENV{'form.checkPlag'}){
+ ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval);
+ if ($osim) {
+ $osim=int($osim*100.0);
+ $similar='
Essay is '.$osim.
+ '% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom).
+ '
'.
+ &keywords_highlight($oessay).'
';
+ }
}
$lastsubonly.='
Part '.
$partid.' ( ID '.$respid.
@@ -1480,7 +1488,7 @@ KEYWORDS
'this file may contain virusses ':'').
'Submitted Answer: '.
&cleanRecord($subval,$responsetype,$symb).
- '
');
+ }
if (length($array[0]) eq $$scantron_config{'Qlength'}) {
$record{"scantron.$questnum.answer"}='';
} else {
$record{"scantron.$questnum.answer"}=$alphabet[length($array[0])];
}
- if (scalar(@array) gt 2) {
- push(@{$record{'scantron.doubleerror'}},$currentquest);
- my @ans=@array;
- my $i=length($ans[0]);shift(@ans);
- while (@ans) {
- $i+=length($ans[0])+1;
- $record{"scantron.$questnum.answer"}.=$alphabet[$i];
- }
- }
}
$record{'scantron.maxquest'}=$questnum;
return \%record;
@@ -3372,294 +3337,9 @@ sub scantron_filter {
#and then get the instructor to fix all of these errors, then grade
#the corrected one, I'll still need to catch error conditions, but
#maybe most will taken care even before we start
-
-sub scantron_process_corrections {
- my ($r) = @_;
- if ($ENV{'form.scantron_corrections'} =~ /^(duplicate|incorrect)ID$/) {
- my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'});
- my $scanlines=&scantron_getfile();
- my $classlist=&Apache::loncoursedata::get_classlist();
- my $which=$ENV{'form.scantron_line'};
- my $line=&scantron_get_line($scanlines,$which);
- my ($skip,$err,$errmsg);
- if ($ENV{'form.scantron_skip_record'}) {
- $skip=1;
- } else {
- my $newstudent=$ENV{'form.scantron_username'}.':'.
- $ENV{'form.scantron_domain'};
- my $newid=$classlist->{$newstudent}->[&Apache::loncoursedata::CL_ID];
- ($line,$err,$errmsg)=
- &scantron_fixup_scanline(\%scantron_config,$line,'ID',$newid);
- }
- if ($err) {
- $r->print("Unable to accept last correction, an error occurred :$errmsg:");
- } else {
- &scantron_put_line($scanlines,$which,$line,$skip);
- &scantron_putfile($scanlines);
- }
- }
-}
-
-sub scantron_validate_file {
- my ($r) = @_;
- my ($symb,$url)=&get_symb_and_url($r);
- if (!$symb) {return '';}
- my $default_form_data=&defaultFormData($symb,$url);
-
- if ($ENV{'form.scantron_corrections'}) {
- &scantron_process_corrections($r);
- }
- #get the student pick code ready
- $r->print(&Apache::loncommon::studentbrowser_javascript());
- my $result= <
-
-
-
-
- $default_form_data
-SCANTRONFORM
- $r->print($result);
-
- my @validate_phases=( 'ID',
- 'CODE',
- 'doublebubble',
- 'missingbubbles');
- if (!$ENV{'form.validatepass'}) {
- $ENV{'form.valiadatepass'} = 0;
- }
- my $currentphase=$ENV{'form.valiadatepass'};
-
- if ($ENV{'form.scantron_selectfile'}=~m-^/-) {
- #first pass copy file to classdir
-
- }
- my $stop=0;
- while (!$stop && $currentphase < scalar(@validate_phases)) {
- my $which="scantron_validate_".$validate_phases[$currentphase];
- {
- no strict 'refs';
- ($stop,$currentphase)=&$which($r,$currentphase);
- }
- }
- $r->print("");
- return '';
-}
-
-sub scantron_getfile {
- #my $scanlines=Apache::File->new($Apache::lonnet::perlvar{'lonScansDir'}."/$ENV{'form.scantron_selectfile'}");
- #FIXME really would prefer a scantron directory but tokenwrapper
- # doesn't allow access to subdirs of userfiles
- my $lines;
- $lines=&Apache::lonnet::getfile('/uploaded/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.
- 'scantron_orig_'.$ENV{'form.scantron_selectfile'});
- if ($lines eq '-1') {
- #FIXME need to actually replicate file to course space
- }
- my %scanlines;
- $scanlines{'orig'}=[split("\n",$lines)];
- my $temp=$scanlines{'orig'};
- $scanlines{'count'}=$#$temp;
-
- $lines=&Apache::lonnet::getfile('/uploaded/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.
- 'scantron_corrected_'.$ENV{'form.scantron_selectfile'});
- if ($lines eq '-1') {
- $scanlines{'corrected'}=[];
- } else {
- $scanlines{'corrected'}=[split("\n",$lines)];
- }
- $lines=&Apache::lonnet::getfile('/uploaded/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.
- 'scantron_skipped_'.$ENV{'form.scantron_selectfile'});
- if ($lines eq '-1') {
- $scanlines{'skipped'}=[];
- } else {
- $scanlines{'skipped'}=[split("\n",$lines)];
- }
- return \%scanlines;
-}
-
-sub lonnet_putfile {
- my ($contents,$filename)=@_;
- my $docuname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
- my $docudom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
- my $docuhome=$ENV{'course.'.$ENV{'request.course.id'}.'.home'};
- $ENV{'form.sillywaytopassafilearound'}=$contents;
- &Apache::lonnet::finishuserfileupload($docuname,$docudom,$docuhome,'sillywaytopassafilearound',$filename);
-
-}
-
-sub scantron_putfile {
- my ($scanlines) = @_;
- #FIXME really would prefer a scantron directory but tokenwrapper
- # doesn't allow access to subdirs of userfiles
- my $prefix='/uploaded/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.
- 'scantron_';
- my $prefix='scantron_';
-# no need to update orig, shouldn't change
-# &lonnet_putfile(join("\n",@{$scanlines->{'orig'}}),$prefix.'orig_'.
-# $ENV{'form.scantron_selectfile'});
- &lonnet_putfile(join("\n",@{$scanlines->{'corrected'}}),
- $prefix.'corrected_'.
- $ENV{'form.scantron_selectfile'});
- &lonnet_putfile(join("\n",@{$scanlines->{'skipped'}}),
- $prefix.'skipped_'.
- $ENV{'form.scantron_selectfile'});
-}
-
-sub scantron_get_line {
- my ($scanlines,$i)=@_;
- if ($scanlines->{'skipped'}[$i]) {return undef;}
- if ($scanlines->{'corrected'}[$i]) {return $scanlines->{'corrected'}[$i];}
- return $scanlines->{'orig'}[$i];
-}
-
-sub scantron_put_line {
- my ($scanlines,$i,$newline,$skip)=@_;
- if ($skip) { $scanlines->{'skipped'}[$i]=$newline;return; }
- $scanlines->{'corrected'}[$i]=$newline;
-}
-
-sub scantron_validate_ID {
- my ($r,$currentphase) = @_;
-
- #get student info
- my $classlist=&Apache::loncoursedata::get_classlist();
- my %idmap=&username_to_idmap($classlist);
-
- #get scantron line setup
- my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'});
- my $scanlines=&scantron_getfile();
-
- my %found=('ids'=>{},'usernames'=>{});
- for (my $i=0;$i<=$scanlines->{'count'};$i++) {
- my $line=&scantron_get_line($scanlines,$i);
- if (!$line) { next; }
- my $scan_record=&scantron_parse_scanline($line,\%scantron_config);
- my $id=$$scan_record{'scantron.ID'};
- $r->print("
Checking ID ".$$scan_record{'scantron.ID'}.
- " on paper ID ".$$scan_record{'scantron.PaperID'}."
\n");
- my $found;
- foreach my $checkid (keys(%idmap)) {
- if (lc($checkid) eq lc($id)) {
- if ($checkid ne $id) {
- $r->print("
Using $checkid for encoded $id
\n");
- }
- $found=$checkid;last;
- }
- }
- if ($found) {
- if ($found{'ids'}{$found}) {
- #FIXME store away line we prviously saw the ID on
- &scantron_get_correction($r,$i,$scan_record,$line,
- 'duplicateID',$found);
- return(1);
- } else {
- $found{'ids'}{$found}++;
- }
- } else {
- &scantron_get_correction($r,$i,$scan_record,$line,
- 'incorrectID');
- return(1);
- }
- }
-
- return (0,$currentphase+1);
-}
-
-sub scantron_get_correction {
- my ($r,$i,$scan_record,$line,$error,$arg)=@_;
-
-#FIXME in the case of a duplicated ID the previous line, probaly need
-#to show both the current line and the previous one and allow skipping
-#the previous one or the current one
-
- $r->print("
This scantron record has an error.");
- if ( defined($$scan_record{'scantron.PaperID'}) ) {
- $r->print("The current PaperID is ".
- $$scan_record{'scantron.PaperID'}." \n");
- } else {
- $r->print("The current scanline is
".
- $line."
\n");
- }
- $r->print(''."\n");
- $r->print(''."\n");
- if ($error =~ /ID$/) {
- if ($error eq 'unknownID') {
- $r->print("The encoded ID is not in the classlist\n");
- } elsif ($error eq 'duplicateID') {
- $r->print("The encoded ID has also been used by a previous paper $arg\n");
- }
- $r->print("
Original ID is ".$$scan_record{'scantron.ID'}.
- " \n");
- $r->print("Name on paper is ".$$scan_record{'scantron.LastName'}.",".
- $$scan_record{'scantron.FirstName'}."
");
- $r->print("
Please correct \n");
- $r->print("\n
Pick a specific user -- username:");
- $r->print("\ndomain:".
- &Apache::loncommon::select_dom_form(undef,'scantron_domain'));
- #FIXME it would be nice if this sent back the user ID and
- #could do partial userID matches
- $r->print(&Apache::loncommon::selectstudent_link('scantronupload',
- 'scantron_username','scantron_domain'));
- } elsif ($error eq 'doublebubble') {
- $r->print("There have been muttiple bubbles scanned for a single question\n");
- foreach my $question (@{$arg}) {
- my $selected=$$scan_record{"scantron.$question.answer"};
- $r->print("
For question $question, selected bubbles were".
- join(" ",split('',$selected)).
- " Please pick which one should be used for grading");
- #FIXMENEXT need to have radio buttons to chose which one to use
-
- }
- }
- $r->print("
Skip this scanline saving it for later ");
- $r->print("\n
");
- &scantron_end_validate_form($r);
-}
-
-sub scantron_validate_CODE {
- my ($r,$currentphase) = @_;
- #FIXME doesn't do anything yet
- return (0,$currentphase+1);
-}
-
-sub scantron_validate_doublebubble {
- my ($r,$currentphase) = @_;
- #get student info
- my $classlist=&Apache::loncoursedata::get_classlist();
- my %idmap=&username_to_idmap($classlist);
-
- #get scantron line setup
- my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'});
- my $scanlines=&scantron_getfile();
- for (my $i=0;$i<=$scanlines->{'count'};$i++) {
- my $line=&scantron_get_line($scanlines,$i);
- if (!$line) { next; }
- my $scan_record=&scantron_parse_scanline($line,\%scantron_config);
- if (!defined($$scan_record{'scantron.doubleerror'})) { next; }
- &scantron_get_correction($r,$i,$scan_record,$line,'double',
- $$scan_record{'scantron.doubleerror'});
- return (1,$currentphase);
- }
- return (0,$currentphase+1);
-}
-
-sub scantron_end_validate_form {
- my ($r) = @_;
- $r->print('