--- loncom/homework/grades.pm 2002/05/21 02:29:22 1.26 +++ loncom/homework/grades.pm 2002/06/24 21:05:12 1.30 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.26 2002/05/21 02:29:22 albertel Exp $ +# $Id: grades.pm,v 1.30 2002/06/24 21:05:12 ng Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,6 +29,9 @@ # 6/8 Gerd Kortemeyer # 7/26 H.K. Ng # 8/20 Gerd Kortemeyer +# Year 2002 +# June 2002 H.K. Ng +# package Apache::grades; use strict; @@ -83,18 +86,18 @@ sub verifyreceipt { $matches++; } } - $request->print('

'.$matches.' match(es)

'); + $request->printf('

'.$matches." match%s

",$matches <= 1 ? '' : 'es'); } return ''; } -sub listStudents { +sub receiptInput { my ($request) = shift; 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'}); $request->print(<Verify a Submission Receipt Issued by this Server +

Verify a Submission Receipt Issued by this Server

$hostver- @@ -108,11 +111,24 @@ ENDHEADER $request->print( ''); } +# $request->print(<print(''); + return ''; +} + +sub listStudents { + my ($request) = shift; + my $cdom=$ENV{"course.$ENV{'request.course.id'}.domain"}; + my $cnum=$ENV{"course.$ENV{'request.course.id'}.num"}; + $request->print(< -

Show Student Submissions on Assessment

- - +

Show Student Submissions on Assessment

+ +
UsernameDomainName 
+ + + + ENDTABLEST my (%classlist) = &getclasslist($cdom,$cnum,'0'); foreach my $student ( sort(@{ $classlist{'allids'} }) ) { @@ -125,32 +141,41 @@ ENDTABLEST my ($tmp) = keys(%name); if ($tmp !~ /^(con_lost|error|no_such_host)/i) { $fullname=$name{'lastname'}.$name{'generation'}; - if ($fullname =~ /[^\s]+/) { $fullname.=','; } + if ($fullname =~ /[^\s]+/) { $fullname.=', '; } $fullname.=$name{'firstname'}.' '.$name{'middlename'}; } if ( $Apache::grades::viewgrades eq 'F' ) { - $request->print("\n".''."'."". ''); if ($ENV{'form.url'}) { $request->print( - ''); + ''); } if ($ENV{'form.symb'}) { $request->print( - ''); + ''); } $request->print( - ''); + ''); + $request->print( + ''); $request->print( - ''); + ''); $request->print( - ''); + ''); + $request->print(''); + $request->print(''); $request->print( - ''); - $request->print(''); + ''); +# $request->print(''); } } - $request->print('
Resource: $ENV{'form.url'}
UsernameNameDomainView ProblemSubmissionsAction
$sname$sdom$fullname". + $request->print("\n".'
$sname$fullname$sdom
'. + ' no '. + ' yes '. + ' last '. + ' all
'); + $request->print('
'); + $request->print('
'); } @@ -196,7 +221,7 @@ sub getpartlist { my @parts =(); my (@metakeys) = split(/,/,&Apache::lonnet::metadata($url,'keys')); foreach my $key (@metakeys) { - if ( $key =~ m/stores_([0-9]+)_.*/ ) { + if ( $key =~ m/stores_([0-9]+)_.*/) { push(@parts,$key); } } @@ -207,23 +232,28 @@ sub viewstudentgrade { my ($url,$symb,$courseid,$student,@parts) = @_; my $result =''; my $cellclr = '"#ffffdd"'; - my ($stuname,$domain) = split(/:/,$student); + my ($username,$domain) = split(/:/,$student); - my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$stuname); + my (@requests) = ('lastname','firstname','middlename','generation'); + my (%name) = &Apache::lonnet::get('environment',\@requests,$domain,$username); + my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$username); + my $fullname=$name{'lastname'}.$name{'generation'}; + if ($fullname =~ /[^\s]+/) { $fullname.=', '; } + $fullname.=$name{'firstname'}.' '.$name{'middlename'}; - $result.="$stuname$domain\n"; + $result.="$username$fullname$domain\n"; foreach my $part (@parts) { my ($temp,$part,$type)=split(/_/,$part); #print "resource.$part.$type = ".$record{"resource.$part.$type"}."
\n"; if ($type eq 'awarded') { my $score=$record{"resource.$part.$type"}; - $result.="\n"; + $result.="\n"; } elsif ($type eq 'tries') { my $score=$record{"resource.$part.$type"}; - $result.="\n" + $result.="\n" } elsif ($type eq 'solved') { my $score=$record{"resource.$part.$type"}; - $result.="\n"; if ($score =~ /^correct/) { $result.="\n\n\n\n\n"; } elsif ($score =~ /^incorrect/) { @@ -238,7 +268,7 @@ sub viewstudentgrade { $result.="\n"; } } - $result.=''; + $result.=''; return $result; } #FIXME need to look at the meatdata spec on what type of data to accept and provide an @@ -309,16 +339,44 @@ sub submission { $symb=&Apache::lonnet::symbread($url); } if ($symb eq '') { $request->print("Unable to handle ambiguous references:$url:."); return ''; } - my $answer=&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, - $ENV{'request.course.id'}); - my $result="

Submission Record

$uname:$udom for $url
".$answer; - my $rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom, + + my $result='

Submission Record

'; + $result.=''; + $result.='
Username: '.$uname.'Fullname: '.$ENV{'form.fullname'}.'Domain: '.$udom.'
Resource: '.$url.'
'; + if ($ENV{'form.vProb'} eq 'yes') { + my $rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom, $ENV{'request.course.id'}); - $result.="Student's view of the problem:
$rendered
Correct answer:
"; + my $companswer=&Apache::loncommon::get_student_answers($symb,$uname,$udom, + $ENV{'request.course.id'}); + $result.='
'; + $result.='
'; + $result.='Student\'s view of the problem:
'.$rendered.'
'; + $result.='Correct answer:
'.$companswer; + $result.='
'; + $result.='

'; + } + my $last = ''; + $last = 'last' if ($ENV{'form.submission'} eq 'last'); + my $answer=&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, + $ENV{'request.course.id'},$last); + $result.=$answer.'
Needs an interface for inputting scores'; + + my (@parts) = sort(&getpartlist($url)); - $answer=&Apache::loncommon::get_student_answers($symb,$uname,$udom, - $ENV{'request.course.id'}); - $result.=$answer; + #start the form + $result.= '
'."\n". + ''."\n". + ''."\n". + ''."\n". + '
'."\n". + ''."\n". + ''; + #get info for each student + $result.=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},$uname,@parts); + + $result.='
'."\n"; + + $result.='
'; return $result; } @@ -332,29 +390,59 @@ sub get_symb_and_url { return ($symb,$url); } +sub view_edit_entire_class_form { + my ($symb,$url)=@_; + my $result.='
'."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + '
'."\n"; + return $result; +} + +sub show_grading_menu_form { + my ($symb,$url)=@_; + my $result.='
'."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\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.='
'."\n". - ''."\n". - ''."\n". - ''."\n". - ''."\n". - '
'; + + my $result='

 Select a Grading Method


'; + $result.='
'."\n"; + $result.=''."\n"; + $result.='
'."\n"; + $result.=' Resource : '.$url.'
'."\n"; + $result.=&view_edit_entire_class_form($symb,$url); $result.='
'."\n". ''."\n". ''."\n". ''."\n". ''."\n". - '
'; + ''."\n"; $result.='
'."\n". ''."\n". ''."\n". ''."\n". - ''."\n". - '
'; + ''."\n". + ''."\n"; + $result.='
'."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + '
'."\n"; + $result.='
'."\n"; + $result.='
'."\n"; return $result; } @@ -373,9 +461,9 @@ sub viewgrades { my $cellclr = '"#ffffcc"'; #get list of parts for this problem - my (@parts) = &getpartlist($url); + my (@parts) = sort(&getpartlist($url)); - $request->print ("

Manual Grading

"); + $request->print ("

Manual Grading

"); #start the form $result = '
'."\n". @@ -383,21 +471,21 @@ sub viewgrades { ''."\n". ''."\n". ''."\n". - '
'."\n". + '
'."\n". ''."\n". - ''."\n"; + ''."\n"; foreach my $part (@parts) { my $display=&Apache::lonnet::metadata($url,$part.'.display'); if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); } - $result.=''."\n"; - } - $result.=""; + $result.=''."\n"; + } + $result.=''; #get info for each student foreach my $student ( sort(@{ $classlist{'allids'} }) ) { $result.=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},$student,@parts); } $result.='
UserIdDomain
UsernameNameDomain'.$display.'
'.$display.'
'; - + $result.=&show_grading_menu_form($symb,$url); return $result; } @@ -449,16 +537,88 @@ ENDUPFORM return $result; } +sub csvupload_javascript_reverse_associate { + return(<2) { foundsomething=1; } + } + if (founduname==0 || founddomain==0) { + alert('You need to specify at both the username and domain'); + return; + } + if (foundsomething==0) { + alert('You need to specify at least one grading field'); + return; + } + vf.submit(); + } + function flip(vf,tf) { + var nw=eval('vf.f'+tf+'.selectedIndex'); + var i; + //can not pick the same destination field twice + for (i=0;i<=vf.nfields.value;i++) { + if ((i!=tf) && (eval('vf.f'+i+'.selectedIndex')==nw)) { + eval('vf.f'+i+'.selectedIndex=0;') + } + } + } +ENDPICK +} + sub csvuploadmap_header { my ($request,$symb,$url,$datatoken,$distotal)= @_; my $result; my $javascript; if ($ENV{'form.upfile_associate'} eq 'reverse') { -# $javascript=&csv_upload_javascript_reverse_associate(); + $javascript=&csvupload_javascript_reverse_associate(); } else { -# $javascript=&csv_upload_javascript_forward_associate(); + $javascript=&csvupload_javascript_forward_associate(); } - my $javascript_validations;#=&javascript_validations($krbdefdom); $request->print(<

Uploading Class Grades for resource $url

@@ -481,7 +641,6 @@ to this page if the data selected is ins
ENDPICK return ''; @@ -491,11 +650,11 @@ ENDPICK sub csvupload_fields { my ($url) = @_; my (@parts) = &getpartlist($url); - my @fields; - foreach my $part (@parts) { + my @fields=(['username','Student Username'],['domain','Student Domain']); + foreach my $part (sort(@parts)) { my @datum; my $display=&Apache::lonnet::metadata($url,$part.'.display'); - my $name=&Apache::lonnet::metadata($url,$part.'.name'); + my $name=$part; if (!$display) { $display = $name; } @datum=($name,$display); push(@fields,\@datum); @@ -549,6 +708,66 @@ sub csvuploadmap { return ''; } +sub csvuploadassign { + my ($request)= @_; + my ($symb,$url)=&get_symb_and_url($request); + if (!$symb) {return '';} + &Apache::loncommon::load_tmp_file($request); + my @gradedata=&Apache::loncommon::upfile_record_sep(); + my @keyfields = split(/\,/,$ENV{'form.keyfields'}); + my %fields=(); + for (my $i=0; $i<=$ENV{'form.nfields'}; $i++) { + if ($ENV{'form.upfile_associate'} eq 'reverse') { + if ($ENV{'form.f'.$i} ne 'none') { + $fields{$keyfields[$i]}=$ENV{'form.f'.$i}; + } + } else { + if ($ENV{'form.f'.$i} ne 'none') { + $fields{$ENV{'form.f'.$i}}=$keyfields[$i]; + } + } + } + $request->print('

Assigning Grades

'); + my $courseid=$ENV{'request.course.id'}; + my $cdom=$ENV{"course.$courseid.domain"}; + my $cnum=$ENV{"course.$courseid.num"}; + my (%classlist) = &getclasslist($cdom,$cnum,'1'); + my @skipped; + my $countdone=0; + foreach my $grade (@gradedata) { + my %entries=&Apache::loncommon::record_sep($grade); + my $username=$entries{$fields{'username'}}; + my $domain=$entries{$fields{'domain'}}; + if (!exists($classlist{"$username:$domain"})) { + push(@skipped,"$username:$domain"); + next; + } + my %grades; + foreach my $dest (keys(%fields)) { + if ($dest eq 'username' || $dest eq 'domain') { next; } + if ($entries{$fields{$dest}} eq '') { next; } + my $store_key=$dest; + $store_key=~s/^stores/resource/; + $store_key=~s/_/\./g; + $grades{$store_key}=$entries{$fields{$dest}}; + } + $grades{"resource.regrader"}="$ENV{'user.name'}:$ENV{'user.domain'}"; + &Apache::lonnet::cstore(\%grades,$symb,$ENV{'request.course.id'}, + $domain,$username); + $request->print('.'); + $request->rflush(); + $countdone++; + } + $request->print("
Stored $countdone students\n"); + if (@skipped) { + $request->print('
Skipped Students
'); + foreach my $student (@skipped) { $request->print("
$student"); } + } + $request->print(&view_edit_entire_class_form($symb,$url)); + $request->print(&show_grading_menu_form($symb,$url)); + return ''; +} + sub send_header { my ($request)= @_; $request->print(&Apache::lontexconvert::header()); @@ -569,8 +788,6 @@ sub send_footer { sub handler { my $request=$_[0]; - if ( $ENV{'user.name'} eq 'albertel' ) {$Apache::lonxml::debug=1;} else {$Apache::lonxml::debug=0;} - if ($ENV{'browser.mathml'}) { $request->content_type('text/xml'); } else { @@ -616,7 +833,7 @@ sub handler { } } } else { - &Apache::lonhomework::showhashsubset(\%ENV,'^form'); + #&Apache::lonhomework::showhashsubset(\%ENV,'^form'); $Apache::grades::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}); if ($command eq 'submission') { &listStudents($request) if ($ENV{'form.student'} eq ''); @@ -633,6 +850,8 @@ sub handler { $request->print(&csvupload($request)); } elsif ($command eq 'csvuploadmap') { $request->print(&csvuploadmap($request)); + } elsif ($command eq 'receiptInput') { + &receiptInput($request); } elsif ($command eq 'csvuploadassign') { if ($ENV{'form.associate'} ne 'Reverse Association') { $request->print(&csvuploadassign($request));