.*?(.*?) (.*?)<\/td>/;
- print "Submitted=$1: $2;";
-#
- my $wgt = &Apache::lonnet::EXT('resource.partid.weight',$symb,$udom,$uname);
- my $wgtmsg = ($wgt > 0 ? '(problem weight)' : 'problem weight assigned by computer ');
- $wgt = ($wgt > 0 ? $wgt : '1');
- my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname);
- my $score = ($record{'resource.0.awarded'} eq '' ? '' : $record{'resource.0.awarded'}*$wgt);
-#
-# display grading options
- $result=' '.
- ' '."\n";
- $result.='Points ';
- my $ctr = 0;
-
- $result.='';
+sub get_last_submission {
+ my ($symb,$username,$domain,$course)=@_;
+ if ($symb) {
+ my (@string,$timestamp);
+ my (%returnhash)=&Apache::lonnet::restore($symb,$course,$domain,$username);
+ if ($returnhash{'version'}) {
+ my %lasthash=();
+ my ($version);
+ for ($version=1;$version<=$returnhash{'version'};$version++) {
+ foreach (sort(split(/\:/,$returnhash{$version.':keys'}))) {
+ $lasthash{$_}=$returnhash{$version.':'.$_};
+ }
+ }
+ foreach ((keys %lasthash)) {
+ if ($_ =~ /\.submission$/) {push @string, (join(':',$_,$lasthash{$_}))}
+ if ($_ =~ /timestamp/) {$timestamp = scalar(localtime($lasthash{$_}))};
+ }
+ }
+ @string = $string[0] eq '' ? 'Nothing submitted - no attempts.' : @string;
+ return \@string,\$timestamp;
+ }
+}
- $result.=' or ';
- $result.=' '."\n";
- $result.='/'.$wgt.' '.$wgtmsg.' ';
-
- foreach my $part (&getpartlist($url)) {
- my ($temp,$part,$type)=split(/_/,$part);
- if ($type eq 'solved') {
- my ($status,$foo)=split(/_/,$record{"resource.$part.$type"},2);
- $status = 'partial' if ($foo =~ /partially/);
- $status = 'nothing' if ($status eq '');
- $result.=''."\n";
- my $optsel = 'correct incorrect '.
- 'excused ungraded '.
- 'partial nothing '."\n";
- $optsel =~ s/$status/ $status/;
- $result.=$optsel;
- $result.=" \n";
+sub keywords_highlight {
+ my $string = shift;
+ my $size = $ENV{'form.kwsize'} eq '0' ? '' : 'size='.$ENV{'form.kwsize'};
+ my $styleon = $ENV{'form.kwstyle'} eq '' ? '' : $ENV{'form.kwstyle'};
+ (my $styleoff = $styleon) =~ s/\\<\//;
+ my @keylist = split(/[,\s+]/,$ENV{'form.keywords'});
+ foreach (@keylist) {
+ $string =~ s/\b$_(\b|\.)/\$styleon$_$styleoff\<\/font\>/gi;
}
- }
- $result.='
';
- $request->print($result);
-#
-# print end of form
- if ($counter == $total) {
- my $endform.='';
- $request->print($endform);
- }
- return '';
+ return $string;
}
sub processHandGrade {
- my ($request) = shift;
- 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,$ctr,@parts);
-# &saveHandGrade($url,$symb,$uname,$udom,$score,@parts);
- $ctr++;
- }
- }
- my $firststu = $ENV{'form.unamedom0'};
- my $laststu = $ENV{'form.unamedom'.($ngrade-1)};
+ my ($request) = shift;
+ 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 $loginuser = $ENV{'user.name'}.':'.$ENV{'user.domain'};
+ my %keyhash = ();
+ $ENV{'form.keywords'} =~ s/,\s{0,}|\s+/ /g;
+ $ENV{'form.keywords'} =~ s/^\s+|\s+$//;
+ $keyhash{$symb.'_keywords'} = $ENV{'form.keywords'};
+ $keyhash{$symb.'_subject'} = $ENV{'form.msgsub'};
+ $keyhash{$loginuser.'_kwclr'} = $ENV{'form.kwclr'};
+ $keyhash{$loginuser.'_kwsize'} = $ENV{'form.kwsize'};
+ $keyhash{$loginuser.'_kwstyle'} = $ENV{'form.kwstyle'};
+
+ my ($ctr,$idx) = (1,1);
+ while ($ctr <= $ENV{'form.savemsgN'}) {
+ if ($ENV{'form.savemsg'.$ctr} ne '') {
+ $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.savemsg'.$ctr};
+ $idx++;
+ }
+ $ctr++;
+ }
+ $ctr = 0;
+ while ($ctr < $ngrade) {
+ if ($ENV{'form.newmsg'.$ctr} ne '') {
+ $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.newmsg'.$ctr};
+ $ENV{'form.savemsg'.$idx} = $ENV{'form.newmsg'.$ctr};
+ $idx++;
+ }
+ $ctr++;
+ }
+ $ENV{'form.savemsgN'} = --$idx;
+ $keyhash{$symb.'_savemsgN'} = $ENV{'form.savemsgN'};
+ my $putresult = &Apache::lonnet::put
+ ('nohist_handgrade',\%keyhash,
+ $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+ $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+
+ if ($ENV{'form.refresh'} eq 'on') {
+ my $ctr = 0;
+ $ENV{'form.NTSTU'}=$ngrade;
+ while ($ctr < $ngrade) {
+ ($ENV{'form.student'},my $udom) = split(/:/,$ENV{'form.unamedom'.$ctr});
+ &submission($request,$ctr,$ngrade-1);
+ $ctr++;
+ }
+ return '';
+ }
- #get classlist
-# my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'});
- my ($classlist) = &getclasslist('all','0');
-
- my (@nextlist,@prevlist);
- my ($nextflg,$prevflg,$ctr,$ctprev) = (0,0,0,0);
- foreach my $student ( sort(@{ $$classlist{'all'} }) ) {
- my ($uname,$udom) = split(/:/,$student);
- if ($nextflg == 1 && $button =~ /Next$/) {
- push @nextlist,$uname if ($ctr < $ntstu);
- $ctr++;
- }
- $nextflg = 1 if ($student eq $laststu);
- $prevflg = 1 if ($student eq $firststu);
- if ($prevflg == 0 && $button eq 'Previous') {
- push @prevlist,$uname;
- $ctprev++;
- }
- }
- if ($button eq 'Previous') {
- if ($ctprev <= $ntstu) {
- @nextlist = @prevlist;
- } else {
- my $idx = 0;
- my $start = $ctprev - $ntstu;
- while ($idx < $ntstu) {
- $nextlist[$idx] = $prevlist[$start+$idx];
- $idx++;
- }
- }
- }
- $ctr = 0;
- my $total = scalar(@nextlist)-1;
- foreach my $student (@nextlist) {
- $ENV{'form.student'} = $student;
- &submission($request,$ctr,$total);
- $ctr++;
- }
+ if ($button eq 'Save & Next') {
+ my $ctr = 0;
+ while ($ctr < $ngrade) {
+ my ($uname,$udom) = split(/:/,$ENV{'form.unamedom'.$ctr});
+ my ($errorflg) = &saveHandGrade($request,$url,$symb,$uname,$udom,$ctr);
+ return '' if ($errorflg eq 'error');
+
+ my $includemsg = $ENV{'form.includemsg'.$ctr};
+ my ($subject,$message,$msgstatus) = ('','','');
+ if ($includemsg =~ /savemsg|new$ctr/) {
+ $subject = $ENV{'form.msgsub'} if ($includemsg =~ /^msgsub/);
+ my (@msgnum) = split(/,/,$includemsg);
+ foreach (@msgnum) {
+ $message.=$ENV{'form.'.$_} if ($_ =~ /savemsg|newmsg/ && $_ ne '');
+ }
+ $message =~ s/\s+/ /g;
+ $msgstatus = &Apache::lonmsg::user_normal_msg ($uname,$udom,
+ $ENV{'form.msgsub'},$message);
+ }
+ if ($ENV{'form.collaborator'.$ctr}) {
+ my (@collaborators) = split(/:/,$ENV{'form.collaborator'.$ctr});
+ foreach (@collaborators) {
+ &saveHandGrade($request,$url,$symb,$_,$udom,$ctr,
+ $ENV{'form.unamedom'.$ctr});
+ if ($message ne '') {
+ $msgstatus = &Apache::lonmsg::user_normal_msg ($_,$udom,
+ $ENV{'form.msgsub'},
+ $message);
+ }
+ }
+ }
+ $ctr++;
+ }
+ }
+ my $firststu = $ENV{'form.unamedom0'};
+ my $laststu = $ENV{'form.unamedom'.($ngrade-1)};
+ $ctr = 2;
+ while ($laststu eq '') {
+ $laststu = $ENV{'form.unamedom'.($ngrade-$ctr)};
+ $ctr++;
+ $laststu = $firststu if ($ctr > $ngrade);
+ }
+ my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist($ENV{'form.section'},'0');
+
+ my (@parsedlist,@nextlist);
+ my ($nextflg) = 0;
+ foreach ( sort(@{ $$classlist{$ENV{'form.section'}} }) ) {
+ if ($nextflg == 1 && $button =~ /Next$/) {
+ push @parsedlist,$_;
+ }
+ $nextflg = 1 if ($_ eq $laststu);
+ if ($button eq 'Previous') {
+ last if ($_ eq $firststu);
+ push @parsedlist,$_;
+ }
+ }
+ $ctr = 0;
+ my ($partlist,$handgrade) = &response_type($ENV{'form.url'});
+ @parsedlist = reverse @parsedlist if ($button eq 'Previous');
+ foreach my $student (@parsedlist) {
+ my ($uname,$udom) = split(/:/,$student);
+ if ($ENV{'form.submitonly'} eq 'yes') {
+ my (%status) = &student_gradeStatus($ENV{'form.url'},$udom,$uname,$partlist) ;
+ my $statusflg = '';
+ foreach (keys(%status)) {
+ $statusflg = 1 if ($status{$_} ne 'nothing');
+ my ($foo,$partid,$foo1) = split(/\./,$_);
+ $statusflg = '' if ($status{'resource.'.$partid.'.submitted_by'} ne '');
+ }
+ next if ($statusflg eq '');
+ }
+ push @nextlist,$student if ($ctr < $ntstu);
+ $ctr++;
+ }
+
+ $ctr = 0;
+ my $total = scalar(@nextlist)-1;
- return 'The End';
+ foreach (sort @nextlist) {
+ my ($uname,$udom,$submitter) = split(/:/);
+ $ENV{'form.student'} = $uname;
+ $ENV{'form.fullname'} = $$fullname{$_};
+# $ENV{'form.'.$_.':submitted_by'} = $submitter;
+# print "submitter=$ENV{'form.'.$_.':submitted_by'}= $submitter: ";
+ &submission($request,$ctr,$total);
+ $ctr++;
+ }
+ if ($total < 0) {
+ my $the_end = 'LON-CAPA User Message '."\n";
+ $the_end.='Message: No more students for this section or class. '."\n";
+ $the_end.='Click on the button below to return to the grading menu. '."\n";
+ $the_end.=&show_grading_menu_form ($symb,$url);
+ $request->print($the_end);
+ }
+ return '';
}
sub saveHandGrade {
- my ($url,$symb,$stuname,$domain,$newflg,@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;
- if ($type eq 'awarded' && $newflg >= 0) {
- my $pts = ($ENV{'form.GRADE_BOX'.$newflg} ne '' ? $ENV{'form.GRADE_BOX'.$newflg} : $ENV{'form.RADVAL'.$newflg});
- my $wgt = $ENV{'form.WGT'.$newflg};
-# my $sel = $ENV{'form.GRADE_SEL'.$newflg};
- $newscore = $pts/$wgt if ($wgt != 0);
- }
- if ($type eq 'solved') {
- $newscore = $ENV{'form.GRADE_SEL'.$newflg} if ($newflg >= 0);
- my $update=0;
- if ($newscore eq 'nothing' ) {
- if ($oldscore ne '') {
- $update=1;
- $newscore = '';
- }
- } elsif ($oldscore !~ m/^$newscore/) {
- $update=1;
- if ($newscore eq 'correct') { $newscore = 'correct_by_override'; }
- if ($newscore eq 'incorrect') { $newscore = 'incorrect_by_override'; }
- if ($newscore eq 'excused') { $newscore = 'excused'; }
- if ($newscore eq 'ungraded') { $newscore = 'ungraded_attempted'; }
- if ($newscore eq 'partial') { $newscore = 'correct_partially_by_override'; }
- }
- if ($update) { $newrecord{"resource.$part.$type"}=$newscore; }
- } else {
- if ($oldscore ne $newscore) {
- $newrecord{"resource.$part.$type"}=$newscore;
- }
+ my ($request,$url,$symb,$stuname,$domain,$newflg,$submitter) = @_;
+# my %record=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},$domain,$stuname);
+ my %newrecord;
+ foreach (split(/:/,$ENV{'form.partlist'.$newflg})) {
+ if ($ENV{'form.GD_SEL'.$newflg.'_'.$_} eq 'excused') {
+ $newrecord{'resource.'.$_.'.solved'} = 'excused';
+ } else {
+ my $pts = ($ENV{'form.GD_BOX'.$newflg.'_'.$_} ne '' ?
+ $ENV{'form.GD_BOX'.$newflg.'_'.$_} : $ENV{'form.RADVAL'.$newflg.'_'.$_});
+ if ($pts eq '') {
+ &userError($request,'No point was assigned for part id '.$_.' and for username '.$stuname.'.');
+ return 'error';
+ }
+ my $wgt = $ENV{'form.WGT'.$newflg.'_'.$_} eq '' ? 1 : $ENV{'form.WGT'.$newflg.'_'.$_};
+ my $partial= $pts/$wgt;
+ $newrecord{'resource.'.$_.'.awarded'} = $partial;
+ if ($partial == 0) {
+ $newrecord{'resource.'.$_.'.solved'} = 'incorrect_by_override';
+ } else {
+ $newrecord{'resource.'.$_.'.solved'} = 'correct_by_override';
+ }
+ $newrecord{'resource.'.$_.'.submitted_by'} = $submitter if ($submitter);
+ }
}
- }
- if ( scalar(keys(%newrecord)) > 0 ) {
- $newrecord{'resource.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
- while (my ($k,$v) = each %newrecord) {
- print "k=$k:v=$v: \n";
- }
- print "symb=$symb,courseid=$ENV{'request.course.id'},dom=$domain,name=$stuname ";
-# &Apache::lonnet::cstore(\%newrecord,$symb,$ENV{'request.course.id'},$domain,$stuname);
- }
- return '';
+
+ if ( scalar(keys(%newrecord)) > 0 ) {
+ $newrecord{'resource.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
+# &print_hash($request,\%newrecord);
+ &Apache::lonnet::cstore(\%newrecord,$symb,$ENV{'request.course.id'},$domain,$stuname);
+ }
+ return '';
}
sub get_symb_and_url {
- my ($request) = @_;
- (my $url=$ENV{'form.url'}) =~ s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
- my $symb=($ENV{'form.symb'} ne '' ? $ENV{'form.symb'} : (&Apache::lonnet::symbread($url)));
- if ($symb eq '') { $request->print("Unable to handle ambiguous references:$url:."); return ''; }
- return ($symb,$url);
+ my ($request) = @_;
+ (my $url=$ENV{'form.url'}) =~ s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
+ my $symb=($ENV{'form.symb'} ne '' ? $ENV{'form.symb'} : (&Apache::lonnet::symbread($url)));
+ if ($symb eq '') { $request->print("Unable to handle ambiguous references:$url:."); return ''; }
+ return ($symb,$url);
}
sub show_grading_menu_form {
- my ($symb,$url)=@_;
- my $result.=''."\n";
- return $result;
+ ' '."\n".
+ ''."\n";
+ return $result;
}
sub gradingmenu {
- my ($request) = @_;
- my ($symb,$url)=&get_symb_and_url($request);
- if (!$symb) {return '';}
-
- my $result=' Select a Grading Method ';
- $result.=' Resource: '.$url.' ';
-
- $result.=&view_edit_entire_class_form($symb,$url).' ';
- $result.=&upcsvScores_form($symb,$url).' ';
- $result.=&viewGradeaStu_form($symb,$url).' ';
- $result.=&verifyReceipt_form($symb,$url);
- return $result;
+ my ($request) = @_;
+ my ($symb,$url)=&get_symb_and_url($request);
+ if (!$symb) {return '';}
+ my $result=' Select a Grading Method ';
+ $result.='';
+ $result.='Resource: '.$url.' ';
+ my ($partlist,$handgrade) = &response_type($url);
+ my ($resptype,$hdgrade)=('','no');
+ for (sort keys(%$handgrade)) {
+ my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});
+ $resptype = $responsetype;
+ $hdgrade = $handgrade if ($handgrade eq 'yes');
+ $result.='Part ID: '.(split(/_/))[0].' '.
+ 'Type: '.$responsetype.' '.
+ 'Handgrade: '.$handgrade.' ';
+ }
+ $result.='
';
+ $result.=&view_edit_entire_class_form($symb,$url).' ';
+ $result.=&upcsvScores_form($symb,$url).' ';
+ $result.=&viewGradeaStu_form($symb,$url,$resptype,$hdgrade).' ';
+ $result.=&verifyReceipt_form($symb,$url).' ';
+ $result.=&view_classlist_form($symb,$url);
+
+ return $result;
+}
+
+sub view_classlist_form {
+ my ($symb,$url)=@_;
+ my $result.=''."\n";
+ $result.=''."\n";
+ $result.=' View Class List '."\n";
+ $result.=''."\n";
+ $result.=''."\n";
+ $result.='
'."\n";
+ $result.='
'."\n";
+ return $result;
+}
+
+sub viewclasslist {
+ my ($request) = shift;
+ my ($coursedomain,$coursenum) = split(/_/,$ENV{'request.course.id'});
+ my %classlist=&Apache::lonnet::dump('classlist',$coursedomain,$coursenum);
+ $request->print('');
+ foreach (sort keys(%classlist)) {
+# my ($unam,$udom) = split(/:/,$_,2);
+# my $section = &Apache::lonnet::usection($udom,$unam,$ENV{'request.course.id'});
+# my $fullname = &get_fullname ($unam,$udom);
+# my @uname;
+# $uname[0]=$unam;
+# my %userid=&Apache::lonnet::idrget($udom,@uname);
+# my $value=$classlist{$_}.':'.$userid{$unam}.':'.$section.':'.$fullname;
+# $classlist{$_}=$value;
+ $request->print(''.$_.' '.$classlist{$_}.' ');
+ }
+ $request->print('
');
+# my $putresult = &Apache::lonnet::put
+# ('classlist',\%classlist,
+# $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+# $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+
+ return '';
}
sub view_edit_entire_class_form {
- my ($symb,$url)=@_;
- my $result.=''."\n";
- $result.=''."\n";
- $result.=' View/Grade Entire Class '."\n";
- $result.=''."\n";
- $result.=''."\n";
- $result.='
'."\n";
- $result.='
'."\n";
- return $result;
+ my ($symb,$url)=@_;
+ my ($classlist,$sections) = &getclasslist('all','0');
+ my $result.=''."\n";
+ $result.=''."\n";
+ $result.=' View/Grade Entire Section/Class '."\n";
+ $result.=''."\n";
+ $result.=''."\n";
+ $result.='
'."\n";
+ $result.='
'."\n";
+ return $result;
}
sub upcsvScores_form {
- my ($symb,$url) = @_;
- if (!$symb) {return '';}
- my $result.=''."\n";
- $result.=''."\n";
- $result.=' Specify a file containing the class scores for above resource '."\n";
- $result.=''."\n";
- my $upfile_select=&Apache::loncommon::upfile_select_html();
+ my ($symb,$url) = @_;
+ if (!$symb) {return '';}
+ my $result.=''."\n";
+ $result.=''."\n";
- $result.='
'."\n";
- return $result;
+ $result.='
'."\n";
+ $result.='
'."\n";
+ return $result;
}
sub viewGradeaStu_form {
- my ($symb,$url) = @_;
- my ($classlist,$sections) = &getclasslist('all','0');
- my $result.=''."\n";
- $result.=''."\n";
- $result.=' View/Grade an Individual Student\'s Submission '."\n";
- $result.=''."\n";
- $result.=''."\n";
- $result.='
'."\n";
- $result.='
'."\n";
- return $result;
+ my ($symb,$url,$response,$handgrade) = @_;
+ my ($classlist,$sections) = &getclasslist('all','0');
+ my $result.=''."\n";
+ $result.=''."\n";
+ $result.=' View/Grade an Individual Student\'s Submission '."\n";
+ $result.=''."\n";
+ $result.=''."\n";
+ $result.='
'."\n";
+ $result.='
'."\n";
+ return $result;
}
sub verifyReceipt_form {
- my ($symb,$url) = @_;
- my $cdom=$ENV{"course.$ENV{'request.course.id'}.domain"};
- my $cnum=$ENV{"course.$ENV{'request.course.id'}.num"};
- my $hostver=unpack("%32C*",$Apache::lonnet::perlvar{'lonHostID'});
-
- my $result.=''."\n";
- $result.=''."\n";
- $result.=' Verify a Submission Receipt Issued by this Server '."\n";
- $result.=''."\n";
- $result.='';
- $result.='
'."\n";
- $result.='
'."\n";
- return $result;
+ my ($symb,$url) = @_;
+ my $cdom=$ENV{"course.$ENV{'request.course.id'}.domain"};
+ my $cnum=$ENV{"course.$ENV{'request.course.id'}.num"};
+ my $hostver=unpack("%32C*",$Apache::lonnet::perlvar{'lonHostID'});
+
+ my $result.=''."\n";
+ $result.=''."\n";
+ $result.=' Verify a Submission Receipt Issued by this Server '."\n";
+ $result.=''."\n";
+ $result.='';
+ $result.='
'."\n";
+ $result.='
'."\n";
+ return $result;
+}
+
+sub viewgrades_js {
+ my ($request) = shift;
+
+ $request->print(<
+ function viewOneStudent(user) {
+ document.onestudent.student.value = user;
+ document.onestudent.submit();
+ }
+
+ function writePoint(partid,weight,point) {
+ var radioButton = eval("document.classgrade.RADVAL_"+partid);
+ var textbox = eval("document.classgrade.TEXTVAL_"+partid);
+ if (point == "textval") {
+ var point = eval("document.classgrade.TEXTVAL_"+partid+".value");
+ if (isNaN(point) || point < 0) {
+ alert("A number equal or greater than 0 is expected. Entered value = "+point);
+ var resetbox = false;
+ for (var i=0; i
+VIEWJAVASCRIPT
}
sub viewgrades {
- my ($request) = @_;
- my $result='';
+ my ($request) = shift;
+ &viewgrades_js($request);
+
+ my ($symb,$url) = ($ENV{'form.symb'},$ENV{'form.url'});
+ my $result='Manual Grading ';
- #get resource reference
- my ($symb,$url)=&get_symb_and_url($request);
- if (!$symb) {return '';}
- #get classlist
- my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'});
- #print "Found $cdom:$cnum ";
- my ($classlist) = &getclasslist('all','0');
- my $headerclr = '"#ccffff"';
- my $cellclr = '"#ffffcc"';
-
- #get list of parts for this problem
- my (@parts) = sort(&getpartlist($url));
-
- $request->print ("Manual Grading ");
-
- #start the form
- $result = ''."\n";
+
+ #start the form
+ $result.= '';
- $result.=&show_grading_menu_form($symb,$url);
- return $result;
+ ' '."\n";
+
+ $result.='To assign the same score for all the students use the radio buttons or '.
+ 'text box below. To assign scores individually fill in the score boxes for '.
+ 'each student in the table below. A score that has already '.
+ 'been graded does not get changed using the radio buttons or text box. '.
+ 'If needed, it has to be changed individually. ';
+
+ my ($partlist,$handgrade) = &response_type($ENV{'form.url'});
+ my %weight = ();
+ my $ctsparts = 0;
+ $result.=' ';
+ $result.=' ';
+# $result.=' '."\n";
+ $result.= ' '."\n";
+
+ $result.= ''."\n".
+ ''.
+ 'Username Fullname Domain '."\n";
+ #get list of parts for this problem
+ my (@parts) = sort(&getpartlist($url));
+ foreach my $part (@parts) {
+ my $display=&Apache::lonnet::metadata($url,$part.'.display');
+ next if ($display =~ /^Number of Attempts/);
+ if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }
+ if ($display =~ /^Partial Credit Factor/) {
+ $_ = $display;
+ my ($partid) = /.*?(\d+).*/;
+ $result.='Score Part '.$partid.' (weight = '.
+ $weight{$partid}.') '."\n";
+ next;
+ }
+ $display =~ s/Problem Status/Grade Status /;
+ $result.=''.$display.' '."\n";
+ }
+ $result.=' ';
+ #get info for each student
+ my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist($ENV{'form.section'},'0');
+ my $ctr = 0;
+ foreach ( sort(@{ $$classlist{$ENV{'form.section'}} }) ) {
+ (my $username = $_) = split(/:/);
+ $result.=' '."\n";
+ $result.=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},
+ $_,$$fullname{$_},\@parts,\%weight);
+ $ctr++;
+ }
+ $result.='
';
+ $result.=' '."\n";
+ $result.=' ';
+ $result.=&show_grading_menu_form($symb,$url);
+ return $result;
+}
+
+sub viewstudentgrade {
+ my ($url,$symb,$courseid,$student,$fullname,$parts,$weight) = @_;
+ my ($username,$domain) = split(/:/,$student);
+ my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$username);
+ my $result=''.
+ ''.$username.' '.
+ ' '.$fullname.' '.$domain.' '."\n";
+ foreach my $part (@$parts) {
+ my ($temp,$part,$type)=split(/_/,$part);
+ my $score=$record{"resource.$part.$type"};
+ next if $type eq 'tries';
+ if ($type eq 'awarded') {
+ my $pts = $score eq '' ? '' : $score*$$weight{$part};
+ $result.=' '."\n";
+ $result.=' '."\n";
+ } elsif ($type eq 'solved') {
+ my ($status,$foo)=split(/_/,$score,2);
+ $status = 'nothing' if ($status eq '');
+ $result.=' '."\n";
+ $result.=''."\n";
+ my $optsel = ' excused '."\n";
+ $optsel = ' excused '."\n"
+ if ($status eq 'excused');
+ $result.=$optsel;
+ $result.=" \n";
+ }
+ }
+ $result.=' ';
+ return $result;
}
+
sub editgrades {
- my ($request) = @_;
- my $result='';
+ my ($request) = @_;
+
+ my $symb=$ENV{'form.symb'};
+ my $url =$ENV{'form.url'};
+ my $result='Current Grade Status ';
+ $result.='Resource: '.$ENV{'form.url'}.' '."\n";
+ $result.='Section: '.$ENV{'form.section'}.' '."\n";
+ $result.= &show_grading_menu_form ($symb,$url);
+ $result.= ''."\n";
+ $result.= ''.
+ 'Username Fullname '."\n";
+
+ my %scoreptr = (
+ 'correct' =>'correct_by_override',
+ 'incorrect'=>'incorrect_by_override',
+ 'excused' =>'excused',
+ 'ungraded' =>'ungraded_attempted',
+ 'nothing' => '',
+ );
+ my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist($ENV{'form.section'},'0');
+
+ my (@partid);
+ my %weight = ();
+ my ($i,$ctr) = (0,0);
+ while ($ctr < $ENV{'form.totalparts'}) {
+ my $partid = $ENV{'form.partid_'.$ctr};
+ push @partid,$partid;
+ my $wgt = &Apache::lonnet::EXT('resource.'.$partid.'.weight',$symb);
+ $weight{$partid} = $wgt eq '' ? '1' : $wgt;
+ $ctr++;
+ $result .= 'Part ID '.$partid.
+ ' (Weight = '.$weight{$partid}.') ';
+ }
+ $result .= ' ';
+ foreach (@partid) {
+ $result .= ' Old Score '.
+ ' New Score ';
+ }
+ $result .= ' '."\n";
+
+ for ($i=0; $i<$ENV{'form.total'}; $i++) {
+ my $user = $ENV{'form.ctr'.$i};
+ my %newrecord;
+ my $updateflag = 0;
+ my @userdom = grep /^$user:/,keys %$classlist;
+ my ($foo,$udom) = split(/:/,$userdom[0]);
+
+ $result .= ''.$user.' '.
+ $$fullname{$userdom[0]}.' ';
+
+ foreach (@partid) {
+ my $old_aw = $ENV{'form.GD_'.$user.'_'.$_.'_aw_s'};
+ my $old_part = $old_aw eq '' ? '' : $old_aw/$weight{$_};
+ my $old_score = $scoreptr{$ENV{'form.GD_'.$user.'_'.$_.'_sv_s'}};
+
+ my $awarded = $ENV{'form.GD_'.$user.'_'.$_.'_aw'};
+ my $partial = $awarded eq '' ? '' : $awarded/$weight{$_};
+ my $score;
+ if ($partial eq '') {
+ $score = $scoreptr{$ENV{'form.GD_'.$user.'_'.$_.'_sv_s'}};
+ } elsif ($partial > 0) {
+ $score = 'correct_by_override';
+ } elsif ($partial == 0) {
+ $score = 'incorrect_by_override';
+ }
+ $score = 'excused' if (($ENV{'form.GD_'.$user.'_'.$_.'_sv'} eq 'excused') &&
+ ($score ne 'excused'));
+ $result .= ''.$old_aw.' '.
+ ''.$awarded.
+ ($score eq 'excused' ? $score : '').' ';
+
+ next if ($old_part eq $partial && $old_score eq $score);
+
+ $updateflag = 1;
+ $newrecord{'resource.'.$_.'.awarded'} = $partial if $partial ne '';
+ $newrecord{'resource.'.$_.'.solved'} = $score;
+
+ }
+ $result .= ' '."\n";
+ if ($updateflag) {
+ $newrecord{'resource.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
+ &Apache::lonnet::cstore(\%newrecord,$symb,$ENV{'request.course.id'},
+ $udom,$user);
+ }
+ }
+ $result .= '
'."\n";
+ return $result;
+}
+
+
+#FIXME need to look at the metadata spec on what type of data to accept and provide an
+#interface based on that, also do that to above function.
+sub setstudentgrade {
+ my ($url,$symb,$courseid,$student,@parts) = @_;
+ my $result ='';
+ my ($stuname,$domain) = split(/:/,$student);
+ my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$stuname);
+ my %newrecord;
+
+ foreach my $part (@parts) {
+ my ($temp,$part,$type)=split(/_/,$part);
+ my $oldscore=$record{"resource.$part.$type"};
+ my $newscore=$ENV{"form.GD.$student.$part.$type"};
+ if ($type eq 'solved') {
+ my $update=0;
+ if ($newscore eq 'nothing' ) {
+ if ($oldscore ne '') {
+ $update=1;
+ $newscore = '';
+ }
+ } elsif ($oldscore !~ m/^$newscore/) {
+ $update=1;
+ $result.="Updating $stuname to $newscore \n";
+ if ($newscore eq 'correct') { $newscore = 'correct_by_override'; }
+ if ($newscore eq 'incorrect') { $newscore = 'incorrect_by_override'; }
+ if ($newscore eq 'excused') { $newscore = 'excused'; }
+ if ($newscore eq 'ungraded') { $newscore = 'ungraded_attempted'; }
+ } else {
+ #$result.="$stuname:$part:$type:unchanged $oldscore to $newscore: \n";
+ }
+ if ($update) { $newrecord{"resource.$part.$type"}=$newscore; }
+ } else {
+ if ($oldscore ne $newscore) {
+ $newrecord{"resource.$part.$type"}=$newscore;
+ $result.="Updating $student"."'s status for $part.$type to $newscore \n";
+ } else {
+ #$result.="$stuname:$part:$type:unchanged $oldscore to $newscore: \n";
+ }
+ }
+ }
+ if ( scalar(keys(%newrecord)) > 0 ) {
+ $newrecord{'resource.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
+# &Apache::lonnet::cstore(\%newrecord,$symb,$courseid,$domain,$stuname);
+
+ $result.="Stored away ".scalar(keys(%newrecord))." elements. \n";
+ }
+ return $result;
+}
+
- my $symb=$ENV{'form.symb'};
- if ($symb eq '') { $request->print("Unable to handle ambiguous references:$symb:$ENV{'form.url'}"); return ''; }
- my $url=$ENV{'form.url'};
- #get classlist
-# my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'});
- #print "Found $cdom:$cnum ";
- my ($classlist) = &getclasslist('all','0');
-
- #get list of parts for this problem
- my (@parts) = &getpartlist($url);
-
- $result.='