--- loncom/homework/grades.pm 2003/09/25 08:30:57 1.130.2.1.2.3
+++ loncom/homework/grades.pm 2003/09/17 17:43:34 1.137
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
-# $Id: grades.pm,v 1.130.2.1.2.3 2003/09/25 08:30:57 albertel Exp $
+# $Id: grades.pm,v 1.137 2003/09/17 17:43:34 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -517,8 +517,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 +544,7 @@ LISTJAVASCRIPT
$gradeTable.='" />'."\n";
-
+ $gradeTable.='Check For Plagiarism';
my (undef, undef, $fullname) = &getclasslist($getsec,'1');
$gradeTable.='
'.
'
';
@@ -1461,13 +1461,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 +1487,7 @@ KEYWORDS
'this file may contain virusses ':'').
'Submitted Answer: '.
&cleanRecord($subval,$responsetype,$symb).
- '
'.$similar."\n"
+ '
'.$similar."\n"
if ($ENV{'form.lastSub'} eq 'lastonly' ||
($ENV{'form.lastSub'} eq 'hdgrade' &&
$$handgrade{$part} =~ /:yes$/));
@@ -2726,7 +2733,9 @@ LISTJAVASCRIPT
$result.='
$grading_menu_button
SCANTRONFORM
@@ -3230,7 +3231,6 @@ sub get_scantron_config {
my ($which) = @_;
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
my %config;
- #FIXME probably should move to XML it has already gotten a bit much now
foreach my $line (<$fh>) {
my ($name,$descrip)=split(/:/,$line);
if ($name ne $which ) { next; }
@@ -3247,12 +3247,6 @@ sub get_scantron_config {
$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];
last;
}
return %config;
@@ -3268,22 +3262,6 @@ sub username_to_idmap {
return %idmap;
}
-sub scantron_fixup_scanline {
- my ($scantron_config,$line,$field,$newvalue) = @_;
- if ($field eq 'ID') {
- if ($newvalue > $$scantron_config{'IDlength'}) {
- return ($line,1,'New value to large');
- }
- if ($newvalue < $$scantron_config{'IDlength'}) {
- $newvalue=sprintf('%-'.$$scantron_config{'IDlength'}.'s',
- $newvalue);
- }
- substr($line,$$scantron_config{'IDstart'}-1,
- $$scantron_config{'IDlength'})=$newvalue;
- }
- return $line;
-}
-
sub scantron_parse_scanline {
my ($line,$scantron_config)=@_;
my %record;
@@ -3299,15 +3277,6 @@ sub scantron_parse_scanline {
}
$record{'scantron.ID'}=substr($data,$$scantron_config{'IDstart'}-1,
$$scantron_config{'IDlength'});
- $record{'scantron.paperID'}=
- substr($data,$$scantron_config{'PaperID'}-1,
- $$scantron_config{'PaperIDlength'});
- $record{'scantron.FirstName'}=
- substr($data,$$scantron_config{'FirstName'}-1,
- $$scantron_config{'FirstNamelength'});
- $record{'scantron.LastName'}=
- substr($data,$$scantron_config{'LastName'}-1,
- $$scantron_config{'LastNamelength'});
my @alphabet=('A'..'Z');
my $questnum=0;
while ($questions) {
@@ -3318,7 +3287,6 @@ sub scantron_parse_scanline {
my (@array)=split(/$$scantron_config{'Qon'}/,$currentquest);
if (scalar(@array) gt 2) {
#FIXME do something intelligent with double bubbles
- #actually not a concern right now, should be taking care of later
Apache->request->print(" Wha!!!
');
+ if (lc($id) eq lc($scanID)) { Apache->request->print('success');return $$idmap{$id}; }
}
return undef;
}
@@ -3362,241 +3321,9 @@ sub scantron_filter {
return 0;
}
-#FIXME I think I am doing this in the wrong order, I think it would be
-#better to make a several passes analyzing all of the lines in the
-#file for common errors wrong/invalid PID/username duplicated
-#PID/username, missing bubbles, double bubbles, missing/invalid CODE
-#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 $newstudent=$ENV{'form.scantron_username'}.':'.
- $ENV{'form.scantron_domain'};
- my $newid=$classlist->{$newstudent}->[&Apache::loncoursedata::CL_ID];
- ($line,my $err,my $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);
- &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'}."
\n");
- my $found;
- foreach my $checkid (keys(%idmap)) {
- if (lc($checkid) eq lc($id)) {
- if ($checkid ne $id) {
- $r->print("
Using $checkid for bubbled $id
\n");
- }
- $found=$checkid;last;
- }
- }
- if ($found) {
- if ($found{'ids'}{$found}) {
- #FIXME store away line we prviously saw the ID on
- &scantron_get_ID_correction($r,$i,$scan_record,
- 'duplicateID',$found);
- return(1);
- } else {
- $found{'ids'}{$found}++;
- }
- } else {
- &scantron_get_ID_correction($r,$i,$scan_record,'incorrectID');
- return(1);
- }
- }
-
- return (0,$currentphase+1);
-}
-
-sub scantron_get_ID_correction {
- my ($r,$i,$scan_record,$error,$arg)=@_;
-#FIXME allow th poosibility of skipping a line, or in the case of a duplicated ID the previous line, probaly need to show both the current line and the previous one.
- $r->print("
Name on paper is ".$$scan_record{'scantron.LastName'}.",".
- $$scan_record{'scantron.FirstName'}."
");
- $r->print("Corrected User -- ");
- $r->print("\nusername:");
- $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'));
- &scantron_end_validate_form($r);
-}
-
-sub scantron_end_validate_form {
- my ($r) = @_;
- $r->print('