--- loncom/homework/grades.pm 2002/04/09 03:56:29 1.20 +++ loncom/homework/grades.pm 2002/05/16 00:01:09 1.25 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.20 2002/04/09 03:56:29 albertel Exp $ +# $Id: grades.pm,v 1.25 2002/05/16 00:01:09 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -59,29 +59,78 @@ sub moreinfo { return ''; } +sub verifyreceipt { + my $request=shift; + my $courseid=$ENV{'request.course.id'}; + my $cdom=$ENV{"course.$courseid.domain"}; + my $cnum=$ENV{"course.$courseid.num"}; + my $receipt=unpack("%32C*",$Apache::lonnet::perlvar{'lonHostID'}).'-'. + $ENV{'form.receipt'}; + $receipt=~s/[^\-\d]//g; + my $symb=$ENV{'form.symb'}; + unless ($symb) { + $symb=&Apache::lonnet::symbread($ENV{'form.url'}); + } + if ((&Apache::lonnet::allowed('mgr',$courseid)) && ($symb)) { + $request->print('<h1>Verifying Submission Receipt '.$receipt.'</h1>'); + my $matches=0; + my (%classlist) = &getclasslist($cdom,$cnum,'0'); + foreach my $student ( sort(@{ $classlist{'allids'} }) ) { + my ($uname,$udom)=split(/\:/,$student); + if ($receipt eq + &Apache::lonnet::ireceipt($uname,$udom,$courseid,$symb)) { + $request->print('Matching '.$student.'<br>'); + $matches++; + } + } + $request->print('<p>'.$matches.' match(es)</p>'); + } + return ''; +} sub listStudents { my ($request) = shift; - my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'}); - my $chome=$ENV{"course.$ENV{'request.course.id'}.home"}; - $request->print ('<h1>Show Student Submissions on Assessment</h1>'. - '<table border="1"><tr><th>Username</th><th>Domain</th><th>Name</th><th> </th></tr>' - ); - my (%classlist) = &getclasslist($cdom,$cnum,$chome,'0'); + 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(<<ENDHEADER); +<h1>Verify a Submission Receipt Issued by this Server</h1> +<form action="/adm/grades" method="post"> +<tt>$hostver-<input type="text" name="receipt" size="4"></tt> +<input type="submit" name="submit" value="Verify"> +<input type="hidden" name="command" value="verify"> +ENDHEADER + if ($ENV{'form.url'}) { + $request->print( + '<input type="hidden" name="url" value="'.$ENV{'form.url'}.'" />'); + } + if ($ENV{'form.symb'}) { + $request->print( + '<input type="hidden" name="symb" value="'.$ENV{'form.symb'}.'" />'); + } + $request->print(<<ENDTABLEST); +</form> +<h1>Show Student Submissions on Assessment</h1> +<table border="1"> +<tr><th>Username</th><th>Domain</th><th>Name</th><th> </th></tr> +ENDTABLEST + my (%classlist) = &getclasslist($cdom,$cnum,'0'); foreach my $student ( sort(@{ $classlist{'allids'} }) ) { my ($sname,$sdom) = split(/:/,$student); - my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname. - ':environment:lastname&generation&firstname&middlename', - &Apache::lonnet::homeserver($sname,$sdom)); - #print "reply=$reply<br>"; - my (@nameparts) = split /&/,$reply; -# my $sfullname = $Apache::lonnet::unescape($nameparts[0]); - + my %name=&Apache::lonnet::get('environment', ['lastname','generation', + 'firstname','middlename'], + $sdom,$sname); + my $fullname; + my ($tmp) = keys(%name); + if ($tmp !~ /^(con_lost|error|no_such_host)/i) { + $fullname=$name{'lastname'}.$name{'generation'}; + if ($fullname =~ /[^\s]+/) { $fullname.=','; } + $fullname.=$name{'firstname'}.' '.$name{'middlename'}; + } if ( $Apache::grades::viewgrades eq 'F' ) { - $request->print( - "\n".'<tr><form action="/adm/grades" method="post">'. - "<td>$sname</td><td>$sdom</td><td>@nameparts</td><td>"); + $request->print("\n".'<tr>'."<td>$sname</td><td>$sdom</td><td>$fullname</td><td>". + '<form action="/adm/grades" method="post">'); if ($ENV{'form.url'}) { $request->print( '<input type="hidden" name="url" value="'.$ENV{'form.url'}.'" />'); @@ -98,7 +147,7 @@ sub listStudents { '<input type="hidden" name="domain" value="'.$sdom.'" />'); $request->print( '<input type="submit" name="submit" value="View" />'); - $request->print('</td></form></tr>'); + $request->print('</form></td></tr>'); } } $request->print('</table>'); @@ -113,9 +162,8 @@ sub finduser { if ( $Apache::grades::viewgrades eq 'F' ) { #get classlist my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'}); - my $chome=$ENV{"course.$ENV{'request.course.id'}.home"}; - #print "Found $cdom:$cnum:$chome<br />"; - my (%classlist) = &getclasslist($cdom,$cnum,$chome,'0'); + #print "Found $cdom:$cnum<br />"; + my (%classlist) = &getclasslist($cdom,$cnum,'0'); foreach my $student ( sort(@{ $classlist{'allids'} }) ) { my ($posname,$posdomain) = split(/:/,$student); if ($posname =~ $name) { $name=$posname; $domain=$posdomain; last; } @@ -127,20 +175,18 @@ sub finduser { } sub getclasslist { - my ($coursedomain,$coursenum,$coursehome,$hideexpired) = @_; - my $classlist=&Apache::lonnet::reply("dump:$coursedomain:$coursenum:classlist",$coursehome); - my %classlist=(); + my ($coursedomain,$coursenum,$hideexpired) = @_; + my %classlist=&Apache::lonnet::dump('classlist',$coursedomain,$coursenum); my $now = time; - foreach my $record (split /&/, $classlist) { - my ($name,$value)=split(/=/,&Apache::lonnet::unescape($record)); - my ($end,$start)=split(/:/,$value); + foreach my $student (keys(%classlist)) { + my ($end,$start)=split(/:/,$classlist{$student}); # still a student? if (($hideexpired) && ($end) && ($end < $now)) { #print "Skipping:$name:$end:$now<br />\n"; next; } #print "record=$record<br>"; - push( @{ $classlist{'allids'} }, $name); + push( @{ $classlist{'allids'} }, $student); } return (%classlist); } @@ -268,9 +314,9 @@ sub submission { my $result="<h2> Submission Record </h2> $uname:$udom for $url <br />".$answer; my $rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom, $ENV{'request.course.id'}); - $result.="Student's view of the problem:<br /> $rendered <br /> Correct answer:"; + $result.="Student's view of the problem:<br /> $rendered <br /> Correct answer:<br />"; - my $answer=&Apache::loncommon::get_student_answers($symb,$uname,$udom, + $answer=&Apache::loncommon::get_student_answers($symb,$uname,$udom, $ENV{'request.course.id'}); $result.=$answer; return $result; @@ -289,9 +335,8 @@ sub viewgrades { #get classlist my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'}); - my $chome=$ENV{"course.$ENV{'request.course.id'}.home"}; - #print "Found $cdom:$cnum:$chome<br />"; - my (%classlist) = &getclasslist($cdom,$cnum,$chome,'0'); + #print "Found $cdom:$cnum<br />"; + my (%classlist) = &getclasslist($cdom,$cnum,'0'); my $headerclr = '"#ccffff"'; my $cellclr = '"#ffffcc"'; @@ -333,9 +378,8 @@ sub editgrades { my $url=$ENV{'form.url'}; #get classlist my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'}); - my $chome=$ENV{"course.$ENV{'request.course.id'}.home"}; - #print "Found $cdom:$cnum:$chome<br />"; - my (%classlist) = &getclasslist($cdom,$cnum,$chome,'0'); + #print "Found $cdom:$cnum<br />"; + my (%classlist) = &getclasslist($cdom,$cnum,'0'); #get list of parts for this problem my (@parts) = &getpartlist($url); @@ -429,8 +473,10 @@ sub handler { $request->print(&viewgrades($request)); } elsif ($command eq 'editgrades') { $request->print(&editgrades($request)); + } elsif ($command eq 'verify') { + $request->print(&verifyreceipt($request)); } else { - $request->print("Unknown action:$command:"); + $request->print("Unknown action: $command:"); } } &send_footer($request);