Diff for /loncom/homework/grades.pm between versions 1.28 and 1.30

version 1.28, 2002/06/20 21:21:16 version 1.30, 2002/06/24 21:05:12
Line 29 Line 29
 # 6/8 Gerd Kortemeyer  # 6/8 Gerd Kortemeyer
 # 7/26 H.K. Ng  # 7/26 H.K. Ng
 # 8/20 Gerd Kortemeyer  # 8/20 Gerd Kortemeyer
   # Year 2002
   # June 2002 H.K. Ng
   #
   
 package Apache::grades;  package Apache::grades;
 use strict;  use strict;
Line 83  sub verifyreceipt { Line 86  sub verifyreceipt {
                $matches++;                 $matches++;
    }     }
         }          }
         $request->print('<p>'.$matches.' match(es)</p>');          $request->printf('<p>'.$matches." match%s</p>",$matches <= 1 ? '' : 'es');
     }      }
     return '';      return '';
 }  }
   
 sub listStudents {  sub receiptInput {
   my ($request) = shift;    my ($request) = shift;
   my $cdom=$ENV{"course.$ENV{'request.course.id'}.domain"};    my $cdom=$ENV{"course.$ENV{'request.course.id'}.domain"};
   my $cnum=$ENV{"course.$ENV{'request.course.id'}.num"};    my $cnum=$ENV{"course.$ENV{'request.course.id'}.num"};
Line 108  ENDHEADER Line 111  ENDHEADER
     $request->print(      $request->print(
     '<input type="hidden" name="symb" value="'.$ENV{'form.symb'}.'" />');      '<input type="hidden" name="symb" value="'.$ENV{'form.symb'}.'" />');
   }    }
   #  $request->print(<<ENDTABLEST);
     $request->print('</form>');
       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(<<ENDTABLEST);    $request->print(<<ENDTABLEST);
 </form>  
 <h2><font color="#339933">Show Student Submissions on Assessment</font></h2>  <h2><font color="#339933">Show Student Submissions on Assessment</font></h2>
   
 <table border=0><tr><td bgcolor=#990404>  <table border="0"><tr><td bgcolor="#000000">
 <table border=0>  <table border="0">
 <tr bgcolor=#e6ffff><td><b>Username</b></td><td><b>Name</b></td><td><b>Domain</b></td><td>&nbsp;</td></tr>  <tr bgcolor="#e6ffff"><td colspan="6"><b>Resource: </b> $ENV{'form.url'}</td></tr>
   <tr bgcolor="#e6ffff"><td><b>Username</b></td><td><b>Name</b></td><td><b>Domain</b></td>
   <td><b>View Problem</b></td><td><b>Submissions</b></td><td><b>Action</b></td></tr>
 ENDTABLEST  ENDTABLEST
   my (%classlist) = &getclasslist($cdom,$cnum,'0');    my (%classlist) = &getclasslist($cdom,$cnum,'0');
   foreach my $student ( sort(@{ $classlist{'allids'} }) ) {    foreach my $student ( sort(@{ $classlist{'allids'} }) ) {
Line 131  ENDTABLEST Line 145  ENDTABLEST
  $fullname.=$name{'firstname'}.' '.$name{'middlename'};   $fullname.=$name{'firstname'}.' '.$name{'middlename'};
       }        }
       if ( $Apache::grades::viewgrades eq 'F' ) {        if ( $Apache::grades::viewgrades eq 'F' ) {
   $request->print("\n".'<tr bgcolor=#ffffe6>'."<td>$sname</td><td>$fullname</td><td>$sdom</td><td>".    $request->print("\n".'<tr bgcolor=#ffffe6>'."<td>$sname</td><td>$fullname</td><td>$sdom</td>".
   '<form action="/adm/grades" method="post">');    '<form action="/adm/grades" method="post">');
   if ($ENV{'form.url'}) {    if ($ENV{'form.url'}) {
     $request->print(      $request->print(
     '<input type="hidden" name="url" value="'.$ENV{'form.url'}.'" />');      '<input type="hidden" name="url" value="'.$ENV{'form.url'}.'" />');
   }    }
   if ($ENV{'form.symb'}) {    if ($ENV{'form.symb'}) {
     $request->print(      $request->print(
     '<input type="hidden" name="symb" value="'.$ENV{'form.symb'}.'" />');      '<input type="hidden" name="symb" value="'.$ENV{'form.symb'}.'" />');
   }    }
   $request->print(    $request->print(
     '<input type="hidden" name="command" value="'.$ENV{'form.command'}.'" />');    '<input type="hidden" name="command" value="'.$ENV{'form.command'}.'" />');
   $request->print(    $request->print(
              '<input type="hidden" name="student" value="'.$sname.'" />');    '<input type="hidden" name="student" value="'.$sname.'" />');
   $request->print(    $request->print(
              '<input type="hidden" name="fullname" value="'.$fullname.'" />');    '<input type="hidden" name="fullname" value="'.$fullname.'" />');
   $request->print(    $request->print(
              '<input type="hidden" name="domain" value="'.$sdom.'" />');    '<input type="hidden" name="domain" value="'.$sdom.'" />');
     $request->print('<td>'.
     '<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>');
   $request->print(    $request->print(
                          '<input type="submit" name="submit" value="View" />');                           '<td><input type="submit" name="submit" value="View/Grade" />');
   $request->print('</td></tr></form>');    $request->print('</td></tr></form>');
 #  $request->print('</form></td></tr>');  #  $request->print('</form></td></tr>');
       }        }
Line 201  sub getpartlist { Line 221  sub getpartlist {
   my @parts =();    my @parts =();
   my (@metakeys) = split(/,/,&Apache::lonnet::metadata($url,'keys'));    my (@metakeys) = split(/,/,&Apache::lonnet::metadata($url,'keys'));
   foreach my $key (@metakeys) {    foreach my $key (@metakeys) {
     if ( $key =~ m/stores_([0-9]+)_.*/ ) {      if ( $key =~ m/stores_([0-9]+)_.*/) {
       push(@parts,$key);        push(@parts,$key);
     }      }
   }    }
Line 248  sub viewstudentgrade { Line 268  sub viewstudentgrade {
       $result.="</select></td>\n";        $result.="</select></td>\n";
     }      }
   }    }
   $result.='</tr>';    $result.='<td></td></tr>';
   return $result;    return $result;
 }  }
 #FIXME need to look at the meatdata <stores> spec on what type of data to accept and provide an  #FIXME need to look at the meatdata <stores> spec on what type of data to accept and provide an
Line 319  sub submission { Line 339  sub submission {
     $symb=&Apache::lonnet::symbread($url);      $symb=&Apache::lonnet::symbread($url);
   }    }
   if ($symb eq '') { $request->print("Unable to handle ambiguous references:$url:."); return ''; }    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='<h2><font color="#339933">Submission Record</font></h2>';    my $result='<h2><font color="#339933">Submission Record</font></h2>';
   $result.='<b>Username : </b>'.$uname.'<br><b>Fullname : </b>'.$ENV{'form.fullname'}.'<br><b>Domain : </b>'.$udom.'<br><b>Resource : </b>'.$url.' <br />'.$answer;    $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>';
   my $rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom,    $result.='<tr><td colspan=3><b>Resource: </b>'.$url.'</td></tr></table>';
     if ($ENV{'form.vProb'} eq 'yes') {
         my $rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom,
    $ENV{'request.course.id'});     $ENV{'request.course.id'});
   $result.="Student's view of the problem:<br /> $rendered <br /> Correct answer:<br />";        my $companswer=&Apache::loncommon::get_student_answers($symb,$uname,$udom,
    $ENV{'request.course.id'});
         $result.='<table border="0"><tr><td bgcolor="#000000">';
         $result.='<table border="0"><tr><td bgcolor="#e6ffff">';
         $result.='<b>Student\'s view of the problem:</b></td></tr><tr><td bgcolor="#ffffe6">'.$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 $answer=&Apache::loncommon::get_previous_attempt($symb,$uname,$udom,
         $ENV{'request.course.id'},$last);
     $result.=$answer.'<br />Needs an interface for inputting scores';
   
     my (@parts) = sort(&getpartlist($url));
   
     #start the form
     $result.= '<form action="/adm/grades" method="post">'."\n".
       '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".
         '<input type="hidden" name="url" value="'.$url.'" />'."\n".
    '<input type="hidden" name="command" value="editgrades" />'."\n".
       '<table border=0><tr><td bgcolor="#000000">'."\n".
        '<table border=0>'."\n".
         '<tr bgcolor="#e6ffff"><td>'."\n";
   
   $answer=&Apache::loncommon::get_student_answers($symb,$uname,$udom,    $result.='</tr>';
   $ENV{'request.course.id'});    #get info for each student
   $result.=$answer;      $result.=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},$uname,@parts);
   
     $result.='</table></td></tr></table><input type="submit" name="submit" value="Submit Changes" /></form>';
   return $result;    return $result;
 }  }
   
Line 343  sub get_symb_and_url { Line 390  sub get_symb_and_url {
  return ($symb,$url);   return ($symb,$url);
 }  }
   
   sub view_edit_entire_class_form {
     my ($symb,$url)=@_;
     my $result.='<form action="/adm/grades" method="post">'."\n".
       '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".
         '<input type="hidden" name="url" value="'.$url.'" />'."\n".
    '<input type="hidden" name="command" value="viewgrades" />'."\n".
     '<input type="submit" name="submit" value="View/Grade Entire Class" />'."\n".
       '</form>'."\n";
     return $result;
   }
   
   sub show_grading_menu_form {
     my ($symb,$url)=@_;
     my $result.='<form action="/adm/grades" method="post">'."\n".
       '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".
         '<input type="hidden" name="url" value="'.$url.'" />'."\n".
    '<input type="hidden" name="command" value="gradingmenu" />'."\n".
     '<input type="submit" name="submit" value="Grading Menu" />'."\n".
       '</form>'."\n";
     return $result;
   }
   
 sub gradingmenu {  sub gradingmenu {
   my ($request) = @_;    my ($request) = @_;
   my ($symb,$url)=&get_symb_and_url($request);    my ($symb,$url)=&get_symb_and_url($request);
   if (!$symb) {return '';}    if (!$symb) {return '';}
   
   my $result='<h2>&nbsp;<font color="#339933">Select a Grading Method</font></h2><br />';    my $result='<h2>&nbsp;<font color="#339933">Select a Grading Method</font></h2><br />';
   $result.='<table width=100% border=0><tr><td bgcolor=#990404>'."\n";    $result.='<table width=100% border=0><tr><td bgcolor=#000000>'."\n";
   $result.='<table width=100% border=0><tr><td bgcolor=#e6ffff>'."\n";    $result.='<table width=100% border=0><tr><td bgcolor=#e6ffff>'."\n";
   $result.='&nbsp;<b>Resource :</b> '.$url.'</td></tr>'."\n";    $result.='&nbsp;<b>Resource :</b> '.$url.'</td></tr>'."\n";
   $result.='<tr bgcolor=#ffffe6><td>'."\n";    $result.='<tr bgcolor=#ffffe6><td>'."\n";
     $result.=&view_edit_entire_class_form($symb,$url);
   $result.='<form action="/adm/grades" method="post">'."\n".    $result.='<form action="/adm/grades" method="post">'."\n".
      '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".       '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".
       '<input type="hidden" name="url" value="'.$url.'" />'."\n".        '<input type="hidden" name="url" value="'.$url.'" />'."\n".
  '<input type="hidden" name="command" value="viewgrades" />'."\n".   '<input type="hidden" name="command" value="csvupload" />'."\n".
   '<input type="submit" name="submit" value="View/Edit Entire Class" />'."\n".    '<input type="submit" name="submit" value="Upload Scores" />'."\n".
     '</form>'."\n";      '</form>'."\n";
   $result.='<form action="/adm/grades" method="post">'."\n".    $result.='<form action="/adm/grades" method="post">'."\n".
      '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".       '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".
       '<input type="hidden" name="url" value="'.$url.'" />'."\n".        '<input type="hidden" name="url" value="'.$url.'" />'."\n".
  '<input type="hidden" name="command" value="csvupload" />'."\n".   '<input type="hidden" name="command" value="submission" />'."\n".
   '<input type="submit" name="submit" value="Upload Scores" />'."\n".    '<input type="submit" name="submit" value="View/Grade A Student" />'."\n".
     '</form>'."\n";      '</form>'."\n";
   $result.='<form action="/adm/grades" method="post">'."\n".    $result.='<form action="/adm/grades" method="post">'."\n".
      '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".       '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".
       '<input type="hidden" name="url" value="'.$url.'" />'."\n".        '<input type="hidden" name="url" value="'.$url.'" />'."\n".
  '<input type="hidden" name="command" value="submission" />'."\n".   '<input type="hidden" name="command" value="receiptInput" />'."\n".
   '<input type="submit" name="submit" value="View/Edit Student" />'."\n".    '<input type="submit" name="submit" value="Verify Receipt" />'."\n".
     '</form>'."\n";      '</form>'."\n";
   $result.='</td></tr></table>'."\n";    $result.='</td></tr></table>'."\n";
   $result.='</td></tr></table>'."\n";    $result.='</td></tr></table>'."\n";
Line 391  sub viewgrades { Line 461  sub viewgrades {
   my $cellclr = '"#ffffcc"';    my $cellclr = '"#ffffcc"';
   
   #get list of parts for this problem    #get list of parts for this problem
   my (@parts) = &getpartlist($url);    my (@parts) = sort(&getpartlist($url));
   
   $request->print ("<h2><font color=\"#339933\">Manual Grading</font></h2>");    $request->print ("<h2><font color=\"#339933\">Manual Grading</font></h2>");
   
Line 401  sub viewgrades { Line 471  sub viewgrades {
       '<input type="hidden" name="url" value="'.$url.'" />'."\n".        '<input type="hidden" name="url" value="'.$url.'" />'."\n".
  '<input type="hidden" name="command" value="editgrades" />'."\n".   '<input type="hidden" name="command" value="editgrades" />'."\n".
   '<input type="submit" name="submit" value="Submit Changes" />'."\n".    '<input type="submit" name="submit" value="Submit Changes" />'."\n".
     '<table border=0><tr><td bgcolor="#990404">'."\n".      '<table border=0><tr><td bgcolor="#000000">'."\n".
      '<table border=0>'."\n".       '<table border=0>'."\n".
       '<tr bgcolor='.$headerclr.'><td><b>Username</b></td><td><b>Name</b></td><td><b>Domain</b></td>'."\n";        '<tr bgcolor='.$headerclr.'><td><b>Username</b></td><td><b>Name</b></td><td><b>Domain</b></td>'."\n";
   foreach my $part (sort(@parts)) {    foreach my $part (@parts) {
      my $display=&Apache::lonnet::metadata($url,$part.'.display');       my $display=&Apache::lonnet::metadata($url,$part.'.display');
      if  (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }       if  (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }
      $result.='<td><b>'.$display.'</b></td>'."\n";       $result.='<td><b>'.$display.'</b></td>'."\n";
    }    }
   $result.='</tr>';    $result.='</tr>';
   #get info for each student    #get info for each student
   foreach my $student ( sort(@{ $classlist{'allids'} }) ) {    foreach my $student ( sort(@{ $classlist{'allids'} }) ) {
     $result.=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},$student,@parts);      $result.=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},$student,@parts);
   }    }
   $result.='</table></td></tr></table><input type="submit" name="submit" value="Submit Changes" /></form>';    $result.='</table></td></tr></table><input type="submit" name="submit" value="Submit Changes" /></form>';
     $result.=&show_grading_menu_form($symb,$url);
   return $result;    return $result;
 }  }
   
Line 658  sub csvuploadassign { Line 728  sub csvuploadassign {
     }      }
   }    }
   $request->print('<h3>Assigning Grades</h3>');    $request->print('<h3>Assigning Grades</h3>');
   &Apache::lonhomework::showhash(('1'=>\@keyfields));  
   &Apache::lonhomework::showhash(%fields);  
   my $courseid=$ENV{'request.course.id'};    my $courseid=$ENV{'request.course.id'};
   my $cdom=$ENV{"course.$courseid.domain"};    my $cdom=$ENV{"course.$courseid.domain"};
   my $cnum=$ENV{"course.$courseid.num"};    my $cnum=$ENV{"course.$courseid.num"};
   my (%classlist) = &getclasslist($cdom,$cnum,'1');    my (%classlist) = &getclasslist($cdom,$cnum,'1');
   foreach my $student ( sort(@{ $classlist{'allids'} }) ) {    my @skipped;
     my %newhash;    my $countdone=0;
     foreach my $grade (@gradedata) {    foreach my $grade (@gradedata) {
       my %entries=&Apache::loncommon::record_sep($grade);      my %entries=&Apache::loncommon::record_sep($grade);
       foreach my $dest (keys(%fields)) {      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("<br />Stored $countdone students\n");
     if (@skipped) {
       $request->print('<br /><font size="+1"><b>Skipped Students</b></font><br />');
       foreach my $student (@skipped) { $request->print("<br />$student"); }
   }    }
     $request->print(&view_edit_entire_class_form($symb,$url));
     $request->print(&show_grading_menu_form($symb,$url));
     return '';
 }  }
   
 sub send_header {  sub send_header {
Line 695  sub send_footer { Line 788  sub send_footer {
 sub handler {  sub handler {
   my $request=$_[0];    my $request=$_[0];
   
   if ( $ENV{'user.name'} eq 'albertel' ) {$Apache::lonxml::debug=1;} else {$Apache::lonxml::debug=0;}  
     
   if ($ENV{'browser.mathml'}) {    if ($ENV{'browser.mathml'}) {
     $request->content_type('text/xml');      $request->content_type('text/xml');
   } else {    } else {
Line 742  sub handler { Line 833  sub handler {
          }           }
      }       }
   } else {    } else {
     &Apache::lonhomework::showhashsubset(\%ENV,'^form');      #&Apache::lonhomework::showhashsubset(\%ENV,'^form');
     $Apache::grades::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});      $Apache::grades::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});
     if ($command eq 'submission') {      if ($command eq 'submission') {
       &listStudents($request) if ($ENV{'form.student'} eq '');        &listStudents($request) if ($ENV{'form.student'} eq '');
Line 759  sub handler { Line 850  sub handler {
       $request->print(&csvupload($request));        $request->print(&csvupload($request));
     } elsif ($command eq 'csvuploadmap') {      } elsif ($command eq 'csvuploadmap') {
       $request->print(&csvuploadmap($request));        $request->print(&csvuploadmap($request));
       } elsif ($command eq 'receiptInput') {
         &receiptInput($request);
     } elsif ($command eq 'csvuploadassign') {      } elsif ($command eq 'csvuploadassign') {
       if ($ENV{'form.associate'} ne 'Reverse Association') {        if ($ENV{'form.associate'} ne 'Reverse Association') {
  $request->print(&csvuploadassign($request));   $request->print(&csvuploadassign($request));

Removed from v.1.28  
changed lines
  Added in v.1.30


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>