[LON-CAPA-cvs] cvs: loncom /homework grades.pm
ng
lon-capa-cvs@mail.lon-capa.org
Thu, 27 Jun 2002 21:34:18 -0000
This is a MIME encoded message
--ng1025213658
Content-Type: text/plain
ng Thu Jun 27 17:34:18 2002 EDT
Modified files:
/loncom/homework grades.pm
Log:
Include automatic selection by javascript. Partially finish Save & Next, Next functions.
--ng1025213658
Content-Type: text/plain
Content-Disposition: attachment; filename="ng-20020627173418.txt"
Index: loncom/homework/grades.pm
diff -u loncom/homework/grades.pm:1.32 loncom/homework/grades.pm:1.33
--- loncom/homework/grades.pm:1.32 Wed Jun 26 17:25:31 2002
+++ loncom/homework/grades.pm Thu Jun 27 17:34:18 2002
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
-# $Id: grades.pm,v 1.32 2002/06/26 21:25:31 ng Exp $
+# $Id: grades.pm,v 1.33 2002/06/27 21:34:18 ng Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -87,6 +87,7 @@
}
}
$request->printf('<p>'.$matches." match%s</p>",$matches <= 1 ? '' : 'es');
+# needs to print who is matched
}
return '';
}
@@ -183,8 +184,8 @@
'<input type="radio" name="vProb" value="no" checked> no '.
'<input type="radio" name="vProb" value="yes"> yes </td>');
$request->print('<td>'.
- '<input type="radio" name="submission" value="last" checked> last '.
- '<input type="radio" name="submission" value="all"> all </td>');
+ '<input type="radio" name="lastSub" value="last" checked> last '.
+ '<input type="radio" name="lastSub" value="all"> all </td>');
my ($type,$status) = &student_gradeStatus($ENV{'form.url'},$cdom,$sname);
$request->print(
'<td align="middle">'.$status.' </td>');
@@ -272,7 +273,7 @@
my ($status,$foo)=split(/_/,$score,2);
$result.="<td align=\"middle\"><select name=\"GRADE.$student.$part.$type\">\n";
my $optsel = '<option>correct</option><option>incorrect</option><option>excused</option>'.
- '<option>ungraded</option><option>handgraded</option><option>nothing</option>'."\n";
+ '<option>ungraded</option><option>partial</option><option>nothing</option>'."\n";
$status = 'nothing' if ($status eq '');
$optsel =~ s/<option>$status/<option selected="on">$status/;
$result.=$optsel;
@@ -338,45 +339,63 @@
return $result;
}
-# --------------------------- show submissions of a student, option to grade --------
#
+# --------------------------- show submissions of a student, option to grade --------
sub submission {
my ($request) = @_;
+
$request->print(<<JAVASCRIPT);
<script type="text/javascript" language="javascript">
- function updateRadio() {
- var pts = document.SCORE.GRADE_BOX.value;
- var radioButton = document.SCORE.radval;
- var checked =true;
- var unchecked=false;
- var resetbox =false;
- if (isNaN(pts) || pts < 0) {
- alert("A number equal or greater than 0 is expected. Entered value = "+pts);
- for (var i=0; i<radioButton.length; i++) {
- if (radioButton[i].checked) {
- document.SCORE.GRADE_BOX.value = i;
- resetbox = true;
- }
- }
- if (!resetbox) {
- document.SCORE.GRADE_BOX.value = "";
- }
- return;
+ function updateRadio(radioButton,formtextbox,formsel,wgt) {
+ var pts = formtextbox.value;
+ var resetbox =false;
+ if (isNaN(pts) || pts < 0) {
+ alert("A number equal or greater than 0 is expected. Entered value = "+pts);
+ for (var i=0; i<radioButton.length; i++) {
+ if (radioButton[i].checked) {
+ formtextbox.value = i;
+ resetbox = true;
+ }
}
+ if (!resetbox) {
+ formtextbox.value = "";
+ }
+ return;
+ }
- for (var i=0; i<radioButton.length; i++) {
- radioButton[i].checked=unchecked;
- if (pts == i) {
- radioButton[i].checked=checked;
- }
+ for (var i=0; i<radioButton.length; i++) {
+ radioButton[i].checked=false;
+ if (pts == i) {
+ radioButton[i].checked=true;
}
}
+ updateSelect(formsel,pts,wgt);
+ }
+
+ function writeBox(formrad,formsel,pts,wgt) {
+ formrad.value = pts;
+ updateSelect(formsel,pts,wgt);
+ return;
+ }
+
+ function updateSelect(formsel,pts,wgt) {
+ if (pts == 0) {
+ formsel[1].selected = true;
+ }
+ if (pts > 0 && pts < wgt) {
+ formsel[4].selected = true;
+ }
+ if (pts == wgt) {
+ formsel[0].selected = true;
+ }
+ return;
+ }
</script>
JAVASCRIPT
- my $url=$ENV{'form.url'};
- $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
+ (my $url=$ENV{'form.url'})=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
if ($ENV{'form.student'} eq '') { &moreinfo($request,"Need student login id"); return ''; }
+ print "formstu=$ENV{'form.student'}:<br>";
my ($uname,$udom) = &finduser($ENV{'form.student'});
if ($uname eq '') { &moreinfo($request,"Unable to find student"); return ''; }
@@ -385,7 +404,8 @@
#
# header info
my $result='<h2><font color="#339933">Submission Record</font></h2>';
- $result.='<table border="0"><tr><td><b>Username: </b>'.$uname.'</td><td><b>Fullname: </b>'.$ENV{'form.fullname'}.'</td><td><b>Domain: </b>'.$udom.'</td></tr>';
+ $result.='<table border="0"><tr><td><b>Username: </b>'.$uname.
+ '</td><td><b>Fullname: </b>'.$ENV{'form.fullname'}.'</td><td><b>Domain: </b>'.$udom.'</td></tr>';
$result.='<tr><td colspan=3><b>Resource: </b>'.$url.'</td></tr></table>';
#
# option to display problem
@@ -394,15 +414,14 @@
$ENV{'request.course.id'});
my $companswer=&Apache::loncommon::get_student_answers($symb,$uname,$udom,
$ENV{'request.course.id'});
- $result.='<table border="0"><tr><td bgcolor="#777777">';
- $result.='<table border="0"><tr><td bgcolor="#e6ffff">';
+ $result.='<table border="0" width="100%"><tr><td bgcolor="#777777">';
+ $result.='<table border="0" width="100%"><tr><td bgcolor="#e6ffff">';
$result.='<b>Student\'s view of the problem</b></td></tr><tr><td bgcolor="#ffffff">'.$rendered.'<br />';
$result.='<b>Correct answer:</b><br />'.$companswer;
$result.='</td></tr></table>';
$result.='</td></tr></table><br />';
}
- my $last = '';
- $last = 'last' if ($ENV{'form.submission'} eq 'last');
+ my $last = ($ENV{'form.lastSub'} eq 'last' ? 'last' : '');
my $answer=&Apache::loncommon::get_previous_attempt($symb,$uname,$udom,
$ENV{'request.course.id'},$last);
$result.=$answer;
@@ -414,42 +433,133 @@
$result.= '<form action="/adm/grades" method="post" name="SCORE">'."\n".
'<input type="hidden" name="symb" value="'.$symb.'" />'."\n".
'<input type="hidden" name="url" value="'.$url.'" />'."\n".
- '<input type="hidden" name="command" value="handgrade" />'."\n";
-
+ '<input type="hidden" name="vProb" value="'.$ENV{'form.vProb'}.'" />'."\n".
+ '<input type="hidden" name="lastSub" value="'.$last.'" />'."\n".
+ '<input type="hidden" name="command" value="handgrade" />'."\n".
+ '<input type="hidden" name="NCT"'.
+ ' value="'.($ENV{'form.NTSTU'} ne '' ? $ENV{'form.NTSTU'} : '1').'" />'."\n";
+
+ my $counter = 0;
+ $result.='<input type="hidden" name="WGT'.$counter.'" value="'.$wgt.'" />'.
+ '<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':'.$udom.'" />'."\n";
$result.='<table border="0"><tr><td><b>Points</b></td><td>';
my $ctr = 0;
while ($ctr<=$wgt) {
- $result.= '<input type="radio" name="radval" '.
-# 'onclick="javascript:writeBox(\'GRADE_'.$ENV{'form.student'}.'\',\''.$ctr.'\')" '.
- 'onclick="javascript:SCORE.GRADE_BOX.value='.$ctr.'" '.
- ($score == $ctr? 'checked':'').' /> '.$ctr."\n";
+ $result.= '<input type="radio" name="RADVAL'.$counter.'" '.
+ 'onclick="javascript:writeBox(this.form.GRADE_BOX'.$counter.
+ ',this.form.GRADE_SEL'.$counter.',\''.$ctr.'\',\''.$wgt.'\')" '.
+ ($score == $ctr? 'checked':'').' /> '.$ctr."\n";
$ctr++;
}
$result.='</td><td> <b>or</b> </td>';
- $result.='<td><input type="text" name="GRADE_BOX"'.
+ $result.='<td><input type="text" name="GRADE_BOX'.$counter.'"'.
($score ne ''? ' value = "'.$score.'"':'').' size="4" '.
- 'onChange="javascript:updateRadio()" /></td>'."\n";
- $result.='<td>/'.$wgt.' (problem weight)</td></tr>';
+ 'onChange="javascript:updateRadio(this.form.RADVAL'.$counter.
+ ',this.form.GRADE_BOX'.$counter.
+ ',this.form.GRADE_SEL'.$counter.',\''.$wgt.'\')" /></td>'."\n";
+ $result.='<td>/'.($wgt > 0 ? $wgt.' (problem weight)' : '<font color="red">invalid problem weight</font>' ).
+ ' </td><td>';
+
+ foreach my $part (&getpartlist($url)) {
+ my ($temp,$part,$type)=split(/_/,$part);
+ if ($type eq 'solved') {
+ my ($status,$foo)=split(/_/,$record{"resource.$part.$type"},2);
+ $result.='<select name="GRADE_SEL'.$counter.'">'."\n";
+ my $optsel = '<option>correct</option><option>incorrect</option>'.
+ '<option>excused</option><option>ungraded</option>'.
+ '<option>partial</option><option>nothing</option>'."\n";
+ $status = 'nothing' if ($status eq '');
+ $optsel =~ s/<option>$status/<option selected="on">$status/;
+ $result.=$optsel;
+ $result.="</select></td></tr>\n";
+ }
+ }
- $result.='<input type="hidden" name="GRADE_'.$uname.':'.$udom.'" value="handgraded" />'."\n";
- $result.='<tr><td colspan="5"><input type="submit" name="gradeOpt" value="Save & Next" /> ';
+ $result.='<tr><td colspan="6"><input type="submit" name="gradeOpt" value="Save & Next" />';
+ my $ntstu ='<select name="NTSTU">'.
+ '<option>1</option><option>2</option>'.
+ '<option>3</option><option>5</option>'.
+ '<option>7</option><option>10</option></select>'."\n";
+ my $nsel = ($ENV{'form.NTSTU'} ne '' ? $ENV{'form.NTSTU'} : '1');
+ $ntstu =~ s/<option>$nsel/<option selected="on">$nsel/;
+ $result.=$ntstu.'student(s) '."\n <br />";
$result.='<input type="submit" name="gradeOpt" value="Next" /> ';
$result.='<input type="submit" name="gradeOpt" value="Previous" /> ';
+ $result.='(Next and Previous do not save the scores.)';
$result.='</td><tr></table></form>';
return $result;
}
sub processHandGrade {
- my ($url,$symb,$courseid,$student,@parts) = @_;
+ my ($request) = @_;
+ my $result='';
- my ($stuname,$domain) = split(/:/,$student);
- my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$stuname);
+ my $url = $ENV{'form.url'};
+ my $symb = $ENV{'form.symb'};
+ my $button = $ENV{'form.gradeOpt'};
+ my $ngrade = $ENV{'form.NCT'};
+ my $ntstu = $ENV{'form.NTSTU'};
+ my $vProb = $ENV{'form.vProb'};
+ my $lastSub= $ENV{'form.lastSub'};
+
+ my (@parts) = sort(&getpartlist($url));
+ if ($button eq 'Save & Next') {
+ my $ctr = 0;
+ while ($ctr < $ENV{'form.NCT'}) {
+ my $pts = ($ENV{'form.GRADE_BOX'.$ctr} ne '' ? $ENV{'form.GRADE_BOX'.$ctr} : $ENV{'form.RADVAL'.$ctr});
+ my $wgt = $ENV{'form.WGT'.$ctr};
+ my $sel = $ENV{'form.GRADE_SEL'.$ctr};
+ my $score = $pts/$wgt if ($wgt != 0);
+ my ($uname,$udom) = split(/:/,$ENV{'form.unamedom'.$ctr});
+ &saveHandGrade($url,$symb,$uname,$udom,$score,@parts);
+ $ctr++;
+ }
+ }
+ my $firststu = $ENV{'form.unamedom0'};
+ my $laststu = $ENV{'form.unamedom'.($ngrade-1)};
+
+ #get classlist
+ my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'});
+ my (%classlist) = &getclasslist($cdom,$cnum,'0');
+
+ my (@nextlist,@prevlist);
+ my ($nextflg,$prevflg,$ctr) = (0,0,0);
+ foreach my $student ( sort(@{ $classlist{'allids'} }) ) {
+ my ($uname,$udom) = split(/:/,$student);
+ if ($nextflg == 1 && $button =~ /Next$/) {
+ push @nextlist,$uname if ($ctr < $ENV{'form.NTSTU'});
+ $ctr++;
+ }
+ $nextflg = 1 if ($student eq $laststu);
+ $prevflg = 1 if ($student eq $firststu);
+ }
+ foreach my $student (@nextlist) {
+ $ENV{'form.student'} = $student;
+ $request->print(&submission($request));
+ }
+ $request->print ("<h2><font color=\"#339933\">Grading</font></h2>");
+
+ #get info for each student
+ foreach my $student ( sort(@{ $classlist{'allids'} }) ) {
+ my $display=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},$student,@parts);
+ print "ID=$ENV{'request.course.id'}:STU=$student:DIS=$display:<br>\n";
+# $result.=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},$student,@parts);
+ }
+
+ return 'The End';
+# return $result;
+}
+
+sub saveHandGrade {
+ my ($url,$symb,$stuname,$domain,$newscore,@parts) = @_;
+
+# my ($stuname,$domain) = split(/:/,$student);
+ my %record=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},$domain,$stuname);
my %newrecord;
foreach my $part (@parts) {
my ($temp,$part,$type)=split(/_/,$part);
my $oldscore=$record{"resource.$part.$type"};
- my $newscore=($ENV{'form.GRADE_BOX'} ne '' ? $ENV{"form.GRADE_BOX"} : $ENV{'form.radval'});
if ($type eq 'solved') {
my $update=0;
if ($newscore eq 'nothing' ) {
@@ -463,23 +573,24 @@
if ($newscore eq 'incorrect') { $newscore = 'incorrect_by_override'; }
if ($newscore eq 'excused') { $newscore = 'excused'; }
if ($newscore eq 'ungraded') { $newscore = 'ungraded_attempted'; }
- if ($newscore eq 'handgraded') { $newscore = 'handgraded_by_grader'; }
+ if ($newscore eq 'partial') { $newscore = 'partial_correct'; }
}
if ($update) { $newrecord{"resource.$part.$type"}=$newscore; }
} else {
if ($oldscore ne $newscore) {
$newrecord{"resource.$part.$type"}=$newscore;
+ }
}
- }
- if ( scalar(keys(%newrecord)) > 0 ) {
- $newrecord{'resource.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
- print "grader=$newrecord{'resource.regrader'}:<br>records<br>";
- while (my ($k,$v) = each %newrecord) {
- print "k=$k:v=$v:<br>\n";
+ if ( scalar(keys(%newrecord)) > 0 ) {
+ $newrecord{'resource.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
+# print "grader=$newrecord{'resource.regrader'}:<br>records<br>";
+# while (my ($k,$v) = each %newrecord) {
+# print "k=$k:v=$v:<br>\n";
+# }
+# &Apache::lonnet::cstore(\%newrecord,$symb,$courseid,$domain,$stuname);
}
- &Apache::lonnet::cstore(\%newrecord,$symb,$courseid,$domain,$stuname);
+ return '';
}
- return '';
}
sub get_symb_and_url {
@@ -949,6 +1060,8 @@
$request->print(&gradingmenu($request));
} elsif ($command eq 'viewgrades') {
$request->print(&viewgrades($request));
+ } elsif ($command eq 'handgrade') {
+ $request->print(&processHandGrade($request));
} elsif ($command eq 'editgrades') {
$request->print(&editgrades($request));
} elsif ($command eq 'verify') {
--ng1025213658--