Diff for /loncom/homework/grades.pm between versions 1.45 and 1.55

version 1.45, 2002/08/05 20:49:54 version 1.55, 2002/10/16 19:13:57
Line 40  use Apache::lonxml; Line 40  use Apache::lonxml;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonhomework;  use Apache::lonhomework;
   use Apache::loncoursedata;
 use Apache::lonmsg qw(:user_normal_msg);  use Apache::lonmsg qw(:user_normal_msg);
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
   
 # ----- These first few routines are general use routines.-----  # ----- These first few routines are general use routines.-----
 #  #
   
 sub print_hash {  
     my ($request, $hash) = @_;  
     $request->print('<table border=1><tr><td>Key</td><td>Value</td></tr>');  
     for (sort keys (%$hash)) {  
  $request->print('<tr><td>'.$_.'</td><td>'.$$hash{$_}.'&nbsp;</td></tr>');  
     }  
     $request->print('</table>');  
     return '';  
 }  
   
 # --- Retrieve the parts that matches stores_\d+ from the metadata file.---  # --- Retrieve the parts that matches stores_\d+ from the metadata file.---
 sub getpartlist {  sub getpartlist {
     my ($url) = @_;      my ($url) = @_;
     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_(\w+)_.*/) {
     push(@parts,$key);      push(@parts,$key);
  }   }
     }      }
Line 83  sub get_symb_and_url { Line 73  sub get_symb_and_url {
 sub get_fullname {  sub get_fullname {
     my ($uname,$udom) = @_;      my ($uname,$udom) = @_;
     my %name=&Apache::lonnet::get('environment', ['lastname','generation',      my %name=&Apache::lonnet::get('environment', ['lastname','generation',
   'firstname','middlename'],$udom,$uname);    'firstname','middlename'],
                                     $udom,$uname);
     my $fullname;      my $fullname;
     my ($tmp) = keys(%name);      my ($tmp) = keys(%name);
     if ($tmp !~ /^(con_lost|error|no_such_host)/i) {      if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
  $fullname=$name{'lastname'}.$name{'generation'};          $fullname = &Apache::loncoursedata::ProcessFullName
  if ($fullname =~ /[^\s]+/) { $fullname.=', '; }              (@name{qw/lastname generation firstname middlename/});
  $fullname.=$name{'firstname'}.' '.$name{'middlename'};      } else {
           &Apache::lonnet::logthis('grades.pm: no name data for '.$uname.
                                    '@'.$udom.':'.$tmp);
     }      }
     return $fullname;      return $fullname;
 }  }
Line 102  sub response_type { Line 95  sub response_type {
     my %seen = ();      my %seen = ();
     my (@partlist,%handgrade);      my (@partlist,%handgrade);
     foreach (split(/,/,&Apache::lonnet::metadata($url,'packages'))) {      foreach (split(/,/,&Apache::lonnet::metadata($url,'packages'))) {
  if (/^\w+response_\d+.*/) {   if (/^\w+response_\w+.*/) {
     my ($responsetype,$part) = split(/_/,$_,2);      my ($responsetype,$part) = split(/_/,$_,2);
     my ($partid,$respid) = split(/_/,$part);      my ($partid,$respid) = split(/_/,$part);
     $handgrade{$part} = $responsetype.':'.($allkeys =~ /parameter_$part\_handgrade/ ? 'yes' : 'no');      $handgrade{$part} = $responsetype.':'.($allkeys =~ /parameter_$part\_handgrade/ ? 'yes' : 'no');
Line 114  sub response_type { Line 107  sub response_type {
     return \@partlist,\%handgrade;      return \@partlist,\%handgrade;
 }  }
   
 #--- Prints a message on screen if a user did something wrong  
 #--- Operator error ---  
 sub userError {  
     my ($request, $reason, $step) = @_;  
     $request->print('<h3><font color="red">LON-CAPA User Error</font></h3><br />'."\n");  
     $request->print('<b>Reason: </b>'.$reason.'<br /><br />'."\n");  
     $request->print('<b>Step: </b>'.($step ne '' ? $step : 'Use your browser back button to correct')  
     .'<br /><br />'."\n");  
     return '';  
 }  
   
 #--- Dumps the class list with usernames,list of sections,  #--- Dumps the class list with usernames,list of sections,
 #--- section, ids and fullnames for each user.  #--- section, ids and fullnames for each user.
 sub getclasslist {  sub getclasslist {
Line 133  sub getclasslist { Line 115  sub getclasslist {
     my %classlist=&Apache::lonnet::dump('classlist',      my %classlist=&Apache::lonnet::dump('classlist',
  $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},   $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
  $ENV{'course.'.$ENV{'request.course.id'}.'.num'});   $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
       my ($tmp) = keys(%classlist);
       # Bail out if we were unable to get the classlist
       return if ($tmp =~ /^(con_lost|error|no_such_host)/i);
   
     # codes to check for fields in the classlist      # codes to check for fields in the classlist
     # should contain end:start:id:section:fullname      # should contain end:start:id:section:fullname
     for (keys %classlist) {      for (keys %classlist) {
Line 283  sub verifyreceipt { Line 269  sub verifyreceipt {
     my ($string,$contents,$matches) = ('','',0);      my ($string,$contents,$matches) = ('','',0);
     my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist('all','0');      my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist('all','0');
           
     foreach (sort {$$fullname{$a} cmp $$fullname{$b} } keys %$fullname) {      foreach (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) {
  my ($uname,$udom)=split(/\:/);   my ($uname,$udom)=split(/\:/);
  if ($receipt eq    if ($receipt eq 
     &Apache::lonnet::ireceipt($uname,$udom,$courseid,$symb)) {      &Apache::lonnet::ireceipt($uname,$udom,$courseid,$symb)) {
Line 310  sub verifyreceipt { Line 296  sub verifyreceipt {
     $contents.      $contents.
     '</table></td></tr></table>'."\n";      '</table></td></tr></table>'."\n";
     }      }
     return $string.&show_grading_menu_form ($symb,$url);      return $string.&show_grading_menu_form($symb,$url);
 }  }
   
 #--- This is called by a number of programs.  #--- This is called by a number of programs.
Line 319  sub verifyreceipt { Line 305  sub verifyreceipt {
 #    on the problem page.  #    on the problem page.
 sub listStudents {  sub listStudents {
     my ($request) = shift;      my ($request) = shift;
   
       my ($symb,$url) = &get_symb_and_url();
       my $cdom      = $ENV{"course.$ENV{'request.course.id'}.domain"};
       my $cnum      = $ENV{"course.$ENV{'request.course.id'}.num"};
       my $getsec    = $ENV{'form.section'} eq '' ? 'all' : $ENV{'form.section'};
       my $submitonly= $ENV{'form.submitonly'} eq '' ? 'all' : $ENV{'form.submitonly'};
   
       my $result;
       my ($partlist,$handgrade) = &response_type($url);
       for (sort keys(%$handgrade)) {
    my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});
    $ENV{'form.handgrade'} = 'yes' if ($handgrade eq 'yes');
    $result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'.
       '<td><b>Type: </b>'.$responsetype.'</td>'.
       '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>';
       }
       $result.='</table>';
   
       my $viewgrade;
       if ($ENV{'form.handgrade'} eq 'yes') {
    $viewgrade = 'View/Grade';
       } else {
    $viewgrade = 'View';
       }
   
       $result='<h3><font color="#339933">&nbsp;'.
    $viewgrade.
       ' Submissions for a Student or a Group of Students</font></h3>'.
    '<table border="0"><tr><td colspan=3><font size=+1>'.
       '<b>Resource: </b>'.$url.'</font></td></tr>'.$result;
   
     $request->print(<<LISTJAVASCRIPT);      $request->print(<<LISTJAVASCRIPT);
 <script type="text/javascript" language="javascript">  <script type="text/javascript" language="javascript">
   function checkSelect(checkBox) {    function checkSelect(checkBox) {
     var ctr=0;      var ctr=0;
       var sense="";
     if (checkBox.length > 1) {      if (checkBox.length > 1) {
        for (var i=0; i<checkBox.length; i++) {         for (var i=0; i<checkBox.length; i++) {
   if (checkBox[i].checked) {    if (checkBox[i].checked) {
      ctr++;       ctr++;
   }    }
        }         }
          sense = "a student or group of students";
     } else {      } else {
        if (checkBox.checked) {         if (checkBox.checked) {
    ctr = 1;     ctr = 1;
        }         }
          sense = "the student";
     }      }
     if (ctr == 0) {      if (ctr == 0) {
        alert("You did not select any student.");         alert("Please select "+sense+" before clicking on the $viewgrade button.");
        return false;         return false;
     }      }
     document.gradesub.submit();      document.gradesub.submit();
Line 343  sub listStudents { Line 363  sub listStudents {
 </script>  </script>
 LISTJAVASCRIPT  LISTJAVASCRIPT
   
     my $cdom      = $ENV{"course.$ENV{'request.course.id'}.domain"};  
     my $cnum      = $ENV{"course.$ENV{'request.course.id'}.num"};  
     my $getsec    = $ENV{'form.section'} eq '' ? 'all' : $ENV{'form.section'};  
     my $submitonly= $ENV{'form.submitonly'} eq '' ? 'all' : $ENV{'form.submitonly'};  
   
     my $result='<h3><font color="#339933">&nbsp;'.  
  'View/Grade Submissions for a Student or a Group of Students</font></h3>';  
     $result.='<table border="0">';  
     $result.='<tr><td colspan=3><font size=+1>'.  
  '<b>Resource: </b>'.$ENV{'form.url'}.'</font></td></tr>';  
     my ($partlist,$handgrade) = &response_type($ENV{'form.url'});  
     for (sort keys(%$handgrade)) {  
  my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});  
  $ENV{'form.handgrade'} = 'yes' if ($handgrade eq 'yes');  
  $result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'.  
     '<td><b>Type: </b>'.$responsetype.'</td>'.  
     '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>';  
     }  
     $result.='</table>';  
     $request->print($result);      $request->print($result);
   
     my $checkhdgrade = $ENV{'form.handgrade'} eq 'yes' ? 'checked' : '';      my $checkhdgrade = $ENV{'form.handgrade'} eq 'yes' ? 'checked' : '';
Line 370  LISTJAVASCRIPT Line 371  LISTJAVASCRIPT
     my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'."\n".      my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'."\n".
  '&nbsp;<b>View Problem: </b><input type="radio" name="vProb" value="no" checked> no '."\n".   '&nbsp;<b>View Problem: </b><input type="radio" name="vProb" value="no" checked> no '."\n".
  '<input type="radio" name="vProb" value="yes"> yes <br />'."\n".   '<input type="radio" name="vProb" value="yes"> yes <br />'."\n".
  '&nbsp;<b>Submissions: </b>'."\n".   '&nbsp;<b>Submissions: </b>'."\n";
  '<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> handgrade only'."\n".      if ($ENV{'form.handgrade'} eq 'yes') {
  '<input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last sub only'."\n".   $gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> handgrade only'."\n";
       }
       $gradeTable.='<input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last sub only'."\n".
  '<input type="radio" name="lastSub" value="last" /> last sub & parts info'."\n".   '<input type="radio" name="lastSub" value="last" /> last sub & parts info'."\n".
  '<input type="radio" name="lastSub" value="all" /> all details'."\n".   '<input type="radio" name="lastSub" value="all" /> all details'."\n".
  '<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".   '<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".
Line 380  LISTJAVASCRIPT Line 383  LISTJAVASCRIPT
  '<input type="hidden" name="response"    value="'.$ENV{'form.response'}.'" />'."\n".   '<input type="hidden" name="response"    value="'.$ENV{'form.response'}.'" />'."\n".
  '<input type="hidden" name="handgrade"   value="'.$ENV{'form.handgrade'}.'" /><br />'."\n".   '<input type="hidden" name="handgrade"   value="'.$ENV{'form.handgrade'}.'" /><br />'."\n".
  '<input type="hidden" name="showgrading" value="'.$ENV{'form.showgrading'}.'" /><br />'."\n".   '<input type="hidden" name="showgrading" value="'.$ENV{'form.showgrading'}.'" /><br />'."\n".
  '<input type="hidden" name="url"  value="'.$ENV{'form.url'}.'" />'."\n".   '<input type="hidden" name="url"  value="'.$url.'" />'."\n".
  '<input type="hidden" name="symb" value="'.$ENV{'form.symb'}.'" />'."\n".   '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".
  'To view/grade a submission, click on the check box next to the student\'s name. Then '."\n".   'To '.lc($viewgrade).' a submission, click on the check box next to the student\'s name. Then '."\n".
  'click on the View/Grade button. To view the submissions for a group of students, click'."\n".   'click on the '.$viewgrade.' button. To view the submissions for a group of students, click'."\n".
  ' on the check boxes for the group of students.<br />'."\n".   ' on the check boxes for the group of students.<br />'."\n".
  '<input type="hidden" name="command" value="processGroup" />'."\n".   '<input type="hidden" name="command" value="processGroup" />'."\n".
  '<input type="button" '."\n".   '<input type="button" '."\n".
  'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n".   'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n".
  'value="View/Grade" />'."\n";   'value="'.$viewgrade.'" />'."\n";
     
     my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist($getsec,'0');      my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist($getsec,'0');
           
Line 402  LISTJAVASCRIPT Line 405  LISTJAVASCRIPT
     $gradeTable.='</tr>'."\n";      $gradeTable.='</tr>'."\n";
   
     my $ctr = 0;      my $ctr = 0;
     foreach my $student (sort {$$fullname{$a} cmp $$fullname{$b} } keys %$fullname) {      foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) {
  my ($uname,$udom) = split(/:/,$student);   my ($uname,$udom) = split(/:/,$student);
  my (%status) = &student_gradeStatus($ENV{'form.url'},   my (%status) =&student_gradeStatus($url,$symb,$udom,$uname,$partlist);
     $ENV{'form.symb'},$udom,$uname,$partlist);  
  my $statusflg = '';   my $statusflg = '';
  foreach (keys(%status)) {   foreach (keys(%status)) {
     $statusflg = 1 if ($status{$_} ne 'nothing');      $statusflg = 1 if ($status{$_} ne 'nothing');
Line 438  LISTJAVASCRIPT Line 440  LISTJAVASCRIPT
     $gradeTable.='</table></td></tr></table>'.      $gradeTable.='</table></td></tr></table>'.
  '<input type="button" '.   '<input type="button" '.
  'onClick="javascript:checkSelect(this.form.stuinfo);" '.   'onClick="javascript:checkSelect(this.form.stuinfo);" '.
  'value="View/Grade" /><form />'."\n";   'value="'.$viewgrade.'" /></form>'."\n";
     if ($ctr == 0) {      if ($ctr == 0) {
  $gradeTable='<br />&nbsp;<font color="red">'.   $gradeTable='<br />&nbsp;<font color="red">'.
     'No submission found for this resource.</font><br />';      'No submission found for this resource.</font><br />';
  $gradeTable.=&show_grading_menu_form ($ENV{'form.symb'},$ENV{'form.url'});      } elsif ($ctr == 1) {
    $gradeTable =~ s/type=checkbox/type=checkbox checked/;
     }      }
       $gradeTable.=&show_grading_menu_form($symb,$url);
     $request->print($gradeTable);      $request->print($gradeTable);
     return '';      return '';
 }  }
Line 552  sub sub_page_js { Line 556  sub sub_page_js {
  var points = eval("document.SCORE.GD_BOX"+i+"_"+partid+".value");   var points = eval("document.SCORE.GD_BOX"+i+"_"+partid+".value");
  if (points == "") {   if (points == "") {
      var name = eval("document.SCORE.name"+i+".value");       var name = eval("document.SCORE.name"+i+".value");
      alert("You did not assign any point for "+name+", part "+partid+".");       alert("Please assign a score for "+name+", part "+partid+".");
      return false;       return false;
  }   }
       }        }
Line 594  sub sub_page_js { Line 598  sub sub_page_js {
     else return;      else return;
     var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," ");      var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," ");
     if (cleantxt=="") {      if (cleantxt=="") {
  alert("Select a word or group of words from document and then click this link.");   alert("Please select a word or group of words from document and then click this link.");
  return;   return;
     }      }
     var nret = prompt("Add selection to keyword list? Edit if desired.",cleantxt);      var nret = prompt("Add selection to keyword list? Edit if desired.",cleantxt);
Line 929  KEYWORDS Line 933  KEYWORDS
     my $result='<table border="0" width=100%><tr><td bgcolor="#777777">'."\n".      my $result='<table border="0" width=100%><tr><td bgcolor="#777777">'."\n".
  '<table border="0" width=100%><tr bgcolor="#edffff"><td>'."\n";   '<table border="0" width=100%><tr bgcolor="#edffff"><td>'."\n";
   
 #    $result.='<table border="0"><tr bgcolor="#ffffff"><td><b>Fullname: </b>'.$ENV{'form.fullname'}.  
     $result.='<b>Fullname: </b>'.$ENV{'form.fullname'}.      $result.='<b>Fullname: </b>'.$ENV{'form.fullname'}.
  '<font color="#999999">&nbsp; &nbsp;Username: '.$uname.'</font>'.   '<font color="#999999">&nbsp; &nbsp;Username: '.$uname.'</font>'.
  '<font color="#999999">&nbsp; &nbsp;Domain: '.$udom.'</font><br />'."\n";   '<font color="#999999">&nbsp; &nbsp;Domain: '.$udom.'</font><br />'."\n";
Line 1002  KEYWORDS Line 1005  KEYWORDS
     $request->print($submitby);      $request->print($submitby);
  } else {   } else {
     my ($string,$timestamp)=      my ($string,$timestamp)=
  &get_last_submission ($symb,$uname,$udom,$ENV{'request.course.id'});   &get_last_submission (%record);
     my $lastsubonly.=''.      my $lastsubonly.=''.
  ($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '.   ($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '.
  $$timestamp).'';   $$timestamp).'';
Line 1146  KEYWORDS Line 1149  KEYWORDS
  $endform.='(Next and Previous do not save the scores.)'."\n"    $endform.='(Next and Previous do not save the scores.)'."\n" 
     if ($ENV{'form.handgrade'} eq 'yes');      if ($ENV{'form.handgrade'} eq 'yes');
  $endform.='</td><tr></table></form>';   $endform.='</td><tr></table></form>';
    $endform.=&show_grading_menu_form($symb,$url);
  $request->print($endform);   $request->print($endform);
     }      }
     return '';      return '';
Line 1153  KEYWORDS Line 1157  KEYWORDS
   
 #--- Retrieve the last submission for all the parts  #--- Retrieve the last submission for all the parts
 sub get_last_submission {  sub get_last_submission {
     my ($symb,$username,$domain,$course)=@_;      my (%returnhash)=@_;
     if ($symb) {      my (@string,$timestamp);
  my (@string,$timestamp);      if ($returnhash{'version'}) {
  my (%returnhash)=&Apache::lonnet::restore($symb,$course,$domain,$username);   my %lasthash=();
  if ($returnhash{'version'}) {   my ($version);
     my %lasthash=();   for ($version=1;$version<=$returnhash{'version'};$version++) {
     my ($version);      foreach (sort(split(/\:/,$returnhash{$version.':keys'}))) {
     for ($version=1;$version<=$returnhash{'version'};$version++) {   $lasthash{$_}=$returnhash{$version.':'.$_};
  foreach (sort(split(/\:/,$returnhash{$version.':keys'}))) {   if ($returnhash{$version.':'.$_} =~ /(SUBMITTED|DRAFT)$/) {
     $lasthash{$_}=$returnhash{$version.':'.$_};     $timestamp = scalar(localtime($returnhash{$version.':timestamp'}));
  }         } 
     }      }
     foreach ((keys %lasthash)) {   }
  if ($_ =~ /\.submission$/) {   foreach ((keys %lasthash)) {
     my ($partid,$foo) = split(/submission$/,$_);      if ($_ =~ /\.submission$/) {
     my $draft  = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ?   my ($partid,$foo) = split(/submission$/,$_);
  '<font color="red">Draft Copy</font> ' : '';   my $draft  = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ?
     push @string, (join(':',$_,$draft.$lasthash{$_}));      '<font color="red">Draft Copy</font> ' : '';
  }   push @string, (join(':',$_,$draft.$lasthash{$_}));
  if ($_ =~ /timestamp/) {$timestamp = scalar(localtime($lasthash{$_}))};  
     }      }
  }   }
  @string = $string[0] eq '' ? 'Nothing submitted - no attempts.' : @string;  
  return \@string,\$timestamp;  
     }      }
       @string = $string[0] eq '' ? 'Nothing submitted - no attempts.' : @string;
       return \@string,\$timestamp;
 }  }
   
 #--- High light keywords, with style choosen by user.  #--- High light keywords, with style choosen by user.
Line 1301  sub processHandGrade { Line 1304  sub processHandGrade {
     my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist($ENV{'form.section'},'0');      my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist($ENV{'form.section'},'0');
     my (@parsedlist,@nextlist);      my (@parsedlist,@nextlist);
     my ($nextflg) = 0;      my ($nextflg) = 0;
     foreach (sort {$$fullname{$a} cmp $$fullname{$b} } keys %$fullname) {      foreach (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) {
  if ($nextflg == 1 && $button =~ /Next$/) {   if ($nextflg == 1 && $button =~ /Next$/) {
     push @parsedlist,$_;      push @parsedlist,$_;
  }   }
Line 1442  sub viewgrades_js { Line 1445  sub viewgrades_js {
  for (i=0;i<document.classgrade.total.value;i++) {   for (i=0;i<document.classgrade.total.value;i++) {
     var user = eval("document.classgrade.ctr"+i+".value");      var user = eval("document.classgrade.ctr"+i+".value");
     var scorename = eval("document.classgrade.GD_"+user+      var scorename = eval("document.classgrade.GD_"+user+
  "_"+partid+"_aw");   "_"+partid+"_awarded");
     var saveval   = eval("document.classgrade.GD_"+user+      var saveval   = eval("document.classgrade.GD_"+user+
  "_"+partid+"_sv_s.value");   "_"+partid+"_solved_s.value");
     var selname   = eval("document.classgrade.GD_"+user+"_"+partid+"_sv");      var selname   = eval("document.classgrade.GD_"+user+"_"+partid+"_solved");
     if (saveval != "correct") {      if (saveval != "correct") {
  scorename.value = point;   scorename.value = point;
  if (selname[0].selected != true) {   if (selname[0].selected != true) {
Line 1471  sub viewgrades_js { Line 1474  sub viewgrades_js {
     for (i=0;i<document.classgrade.total.value;i++) {      for (i=0;i<document.classgrade.total.value;i++) {
  var user = eval("document.classgrade.ctr"+i+".value");   var user = eval("document.classgrade.ctr"+i+".value");
  var scorename = eval("document.classgrade.GD_"+user+   var scorename = eval("document.classgrade.GD_"+user+
      "_"+partid+"_aw");       "_"+partid+"_awarded");
  var saveval   = eval("document.classgrade.GD_"+user+   var saveval   = eval("document.classgrade.GD_"+user+
      "_"+partid+"_sv_s.value");       "_"+partid+"_solved_s.value");
  var selname   = eval("document.classgrade.GD_"+user+   var selname   = eval("document.classgrade.GD_"+user+
      "_"+partid+"_sv");       "_"+partid+"_solved");
  if (saveval != "correct") {   if (saveval != "correct") {
     scorename.value = "";      scorename.value = "";
     selname[1].selected = true;      selname[1].selected = true;
Line 1485  sub viewgrades_js { Line 1488  sub viewgrades_js {
     for (i=0;i<document.classgrade.total.value;i++) {      for (i=0;i<document.classgrade.total.value;i++) {
  var user = eval("document.classgrade.ctr"+i+".value");   var user = eval("document.classgrade.ctr"+i+".value");
  var scorename = eval("document.classgrade.GD_"+user+   var scorename = eval("document.classgrade.GD_"+user+
      "_"+partid+"_aw");       "_"+partid+"_awarded");
  var saveval   = eval("document.classgrade.GD_"+user+   var saveval   = eval("document.classgrade.GD_"+user+
      "_"+partid+"_sv_s.value");       "_"+partid+"_solved_s.value");
  var selname   = eval("document.classgrade.GD_"+user+   var selname   = eval("document.classgrade.GD_"+user+
      "_"+partid+"_sv");       "_"+partid+"_solved");
  if (saveval != "correct") {   if (saveval != "correct") {
     scorename.value = eval("document.classgrade.GD_"+user+      scorename.value = eval("document.classgrade.GD_"+user+
      "_"+partid+"_aw_s.value");;       "_"+partid+"_awarded_s.value");;
     selname[0].selected = true;      selname[0].selected = true;
  }   }
     }      }
Line 1500  sub viewgrades_js { Line 1503  sub viewgrades_js {
     }      }
   
     function changeSelect(partid,user) {      function changeSelect(partid,user) {
  var selval = eval("document.classgrade.GD_"+user+'_'+partid+"_sv");   var selval = eval("document.classgrade.GD_"+user+'_'+partid+"_solved");
  var textbox = eval("document.classgrade.GD_"+user+'_'+partid+"_aw");   var textbox = eval("document.classgrade.GD_"+user+'_'+partid+"_awarded");
  var point  = textbox.value;   var point  = textbox.value;
  var weight = eval("document.classgrade.weight_"+partid+".value");   var weight = eval("document.classgrade.weight_"+partid+".value");
   
Line 1522  sub viewgrades_js { Line 1525  sub viewgrades_js {
     }      }
   
     function changeOneScore(partid,user) {      function changeOneScore(partid,user) {
  var selval = eval("document.classgrade.GD_"+user+'_'+partid+"_sv");   var selval = eval("document.classgrade.GD_"+user+'_'+partid+"_solved");
  if (selval[1].selected) {   if (selval[1].selected) {
     var boxval = eval("document.classgrade.GD_"+user+'_'+partid+"_aw");      var boxval = eval("document.classgrade.GD_"+user+'_'+partid+"_awarded");
     boxval.value = "";      boxval.value = "";
  }   }
     }      }
Line 1545  sub viewgrades_js { Line 1548  sub viewgrades_js {
     for (i=0;i<document.classgrade.total.value;i++) {      for (i=0;i<document.classgrade.total.value;i++) {
  var user = eval("document.classgrade.ctr"+i+".value");   var user = eval("document.classgrade.ctr"+i+".value");
  var resetscore = eval("document.classgrade.GD_"+user+   var resetscore = eval("document.classgrade.GD_"+user+
       "_"+partid+"_aw");        "_"+partid+"_awarded");
  resetscore.value = eval("document.classgrade.GD_"+user+   resetscore.value = eval("document.classgrade.GD_"+user+
  "_"+partid+"_aw_s.value");   "_"+partid+"_awarded_s.value");
   
  var saveselval   = eval("document.classgrade.GD_"+user+   var saveselval   = eval("document.classgrade.GD_"+user+
      "_"+partid+"_sv_s.value");       "_"+partid+"_solved_s.value");
   
  var selname   = eval("document.classgrade.GD_"+user+"_"+partid+"_sv");   var selname   = eval("document.classgrade.GD_"+user+"_"+partid+"_solved");
  if (saveselval == "excused") {   if (saveselval == "excused") {
     if (selname[1].selected == false) { selname[1].selected = true;}      if (selname[1].selected == false) { selname[1].selected = true;}
  } else {   } else {
Line 1585  sub viewgrades { Line 1588  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="hidden" name="section" value="'.$ENV{'form.section'}.'" />'."\n";   '<input type="hidden" name="section" value="'.$ENV{'form.section'}.'" />'."\n";
     $result.='To assign the same score for all the students use the radio buttons or '.      $result.='<h3>Assign Common Grade To ';
  'text box below. To assign scores individually fill in the score boxes for '.      if ($ENV{'form.section'} eq 'all') {
  'each student in the table below. <font color="red">A part that has already '.   $result.='Class </h3>';
  'been graded does not get changed using the radio buttons or text box. '.      } elsif ($ENV{'form.section'} eq 'no') {
  'If needed, it has to be changed individually.</font>';   $result.='Students in no Section </h3>';
       } else {
    $result.='Students in Section '.$ENV{'form.section'}.'</h3>';
       }
       $result.= '<table border=0><tr><td bgcolor="#777777">'."\n".
    '<table border=0><tr bgcolor="#ffffdd"><td>';
   #    $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. <font color="red">A part that has already '.
   # 'been graded does not get changed using the radio buttons or text box. '.
   # 'If needed, it has to be changed individually.</font>';
   #    $result.='</td></tr><tr><td>';
     #radio buttons/text box for assigning points for a section or class.      #radio buttons/text box for assigning points for a section or class.
     #handles different parts of a problem      #handles different parts of a problem
     my ($partlist,$handgrade) = &response_type($ENV{'form.url'});      my ($partlist,$handgrade) = &response_type($ENV{'form.url'});
Line 1599  sub viewgrades { Line 1612  sub viewgrades {
     $result.='<table border="0">';      $result.='<table border="0">';
     my %seen = ();      my %seen = ();
     for (sort keys(%$handgrade)) {      for (sort keys(%$handgrade)) {
  my ($partid,$respid) = split (/_/);   my ($partid,$respid) = split (/_/,$_,2);
  next if $seen{$partid};   next if $seen{$partid};
  $seen{$partid}++;   $seen{$partid}++;
  my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});   my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});
Line 1615  sub viewgrades { Line 1628  sub viewgrades {
  my $ctr = 0;   my $ctr = 0;
  while ($ctr<=$weight{$partid}) { # display radio buttons in a nice table 10 across   while ($ctr<=$weight{$partid}) { # display radio buttons in a nice table 10 across
     $result.= '<td><input type="radio" name="RADVAL_'.$partid.'" '.      $result.= '<td><input type="radio" name="RADVAL_'.$partid.'" '.
  'onclick="javascript:writePoint('.$partid.','.$weight{$partid}.   'onclick="javascript:writePoint(\''.$partid.'\','.$weight{$partid}.
  ','.$ctr.')" />'.$ctr."</td>\n";   ','.$ctr.')" />'.$ctr."</td>\n";
     $result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : '');      $result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : '');
     $ctr++;      $ctr++;
  }   }
  $result.='</tr></table>';   $result.='</tr></table>';
  $result.= '</td><td><b> or </b><input type="text" name="TEXTVAL_'.   $result.= '</td><td><b> or </b><input type="text" name="TEXTVAL_'.
     $partid.'" size="4" '.      $partid.'" size="4" '.'onChange="javascript:writePoint(\''.
     'onChange="javascript:writePoint('.$partid.','.$weight{$partid}.   $partid.'\','.$weight{$partid}.',\'textval\')" /> /'.
     ',\'textval\')" /> /'.  
     $weight{$partid}.' (problem weight)</td>'."\n";      $weight{$partid}.' (problem weight)</td>'."\n";
  $result.= '</td><td><select name="SELVAL_'.$partid.'"'.   $result.= '</td><td><select name="SELVAL_'.$partid.'"'.
     'onChange="javascript:writeRadText('.$partid.','.$weight{$partid}.')" /> '.      'onChange="javascript:writeRadText(\''.$partid.'\','.
    $weight{$partid}.')" /> '.
     '<option selected="on"> </option>'.      '<option selected="on"> </option>'.
     '<option>excused</option></select></td></tr>'."\n";      '<option>excused</option></select></td></tr>'."\n";
  $ctsparts++;   $ctsparts++;
     }      }
     $result.='</table><input type="hidden" name="totalparts" value="'.$ctsparts.'" />';      $result.='</table>'.'</td></tr></table>'.'</td></tr></table>'."\n".
    '<input type="hidden" name="totalparts" value="'.$ctsparts.'" />';
     $result.='<input type="button" value="Reset" '.      $result.='<input type="button" value="Reset" '.
  'onClick="javascript:resetEntry('.$ctsparts.');" TARGET=_self> &nbsp; &nbsp;';   'onClick="javascript:resetEntry('.$ctsparts.');" TARGET=_self> &nbsp; &nbsp;';
     $result.='<input type="button" value="Submit Changes" '.      $result.='<input type="button" value="Submit Changes" '.
Line 1640  sub viewgrades { Line 1654  sub viewgrades {
   
     #table listing all the students in a section/class      #table listing all the students in a section/class
     #header of table      #header of table
       $result.= '<h3>Assign Grade to Specific Students in ';
       if ($ENV{'form.section'} eq 'all') {
    $result.='the Class </h3>';
       } elsif ($ENV{'form.section'} eq 'no') {
    $result.='no Section </h3>';
       } else {
    $result.='Section '.$ENV{'form.section'}.'</h3>';
       }
     $result.= '<table border=0><tr><td bgcolor="#777777">'."\n".      $result.= '<table border=0><tr><td bgcolor="#777777">'."\n".
  '<table border=0><tr bgcolor="#deffff">'.   '<table border=0><tr bgcolor="#deffff">'.
  '<td><b>Fullname</b></td><td><b>Username</b></td><td><b>Domain</b></td>'."\n";   '<td><b>Fullname</b></td><td><b>Username</b></td><td><b>Domain</b></td>'."\n";
     my (@parts) = sort(&getpartlist($url));      my (@parts) = sort(&getpartlist($url));
     foreach my $part (@parts) {      foreach my $part (@parts) {
  my $display=&Apache::lonnet::metadata($url,$part.'.display');   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) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }
  if ($display =~ /^Partial Credit Factor/) {   if ($display =~ /^Partial Credit Factor/) {
     $_ = $display;      my ($partid) = &split_part_type($part);
     my ($partid) = /.*?(\d+).*/;      $result.='<td><b>Score Part '.$partid.'<br />(weight = '.
     $result.='<td><b>Score Part '.$partid.'<br>(weight = '.  
  $weight{$partid}.')</b></td>'."\n";   $weight{$partid}.')</b></td>'."\n";
     next;      next;
  }   }
  $display =~ s/Problem Status/Grade Status<br>/;   $display =~ s|Problem Status|Grade Status<br />|;
  $result.='<td><b>'.$display.'</b></td>'."\n";   $result.='<td><b>'.$display.'</b></td>'."\n";
     }      }
     $result.='</tr>';      $result.='</tr>';
Line 1664  sub viewgrades { Line 1684  sub viewgrades {
     #list all the students - with points and grade status      #list all the students - with points and grade status
     my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist($ENV{'form.section'},'0');      my ($classlist,$seclist,$ids,$stusec,$fullname) = &getclasslist($ENV{'form.section'},'0');
     my $ctr = 0;      my $ctr = 0;
     foreach (sort {$$fullname{$a} cmp $$fullname{$b} } keys %$fullname) {      foreach (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) {
  my ($uname,$udom) = split(/:/);   my ($uname,$udom) = split(/:/);
  $result.='<input type="hidden" name="ctr'.$ctr.'" value="'.$uname.'" />'."\n";   $result.='<input type="hidden" name="ctr'.$ctr.'" value="'.$uname.'" />'."\n";
  $result.=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},   $result.=&viewstudentgrade($url,$symb,$ENV{'request.course.id'},
Line 1689  sub viewstudentgrade { Line 1709  sub viewstudentgrade {
  '\')"; TARGET=_self>'.$fullname.'</a>'.   '\')"; TARGET=_self>'.$fullname.'</a>'.
  '</td><td>'.$uname.'</td><td align="middle">'.$udom.'</td>'."\n";   '</td><td>'.$uname.'</td><td align="middle">'.$udom.'</td>'."\n";
     foreach my $part (@$parts) {      foreach my $part (@$parts) {
  my ($temp,$part,$type)=split(/_/,$part);   my ($part,$type) = &split_part_type($part);
  my $score=$record{"resource.$part.$type"};   my $score=$record{"resource.$part.$type"};
  next if $type eq 'tries';  
  if ($type eq 'awarded') {   if ($type eq 'awarded') {
     my $pts = $score eq '' ? '' : $score*$$weight{$part};      my $pts = $score eq '' ? '' : $score*$$weight{$part};
     $result.='<input type="hidden" name="'.      $result.='<input type="hidden" name="'.
  'GD_'.$uname.'_'.$part.'_aw_s" value="'.$pts.'" />'."\n";   'GD_'.$uname.'_'.$part.'_awarded_s" value="'.$pts.'" />'."\n";
     $result.='<td align="middle"><input type="text" name="'.      $result.='<td align="middle"><input type="text" name="'.
  'GD_'.$uname.'_'.$part.'_aw" '.   'GD_'.$uname.'_'.$part.'_awarded" '.
  'onChange="javascript:changeSelect('.$part.',\''.$uname.   'onChange="javascript:changeSelect(\''.$part.'\',\''.$uname.
  '\')" value="'.$pts.'" size="4" /></td>'."\n";   '\')" value="'.$pts.'" size="4" /></td>'."\n";
  } elsif ($type eq 'solved') {   } elsif ($type eq 'solved') {
     my ($status,$foo)=split(/_/,$score,2);      my ($status,$foo)=split(/_/,$score,2);
     $status = 'nothing' if ($status eq '');      $status = 'nothing' if ($status eq '');
     $result.='<input type="hidden" name="'.      $result.='<input type="hidden" name="'.'GD_'.$uname.'_'.
  'GD_'.$uname.'_'.$part.'_sv_s" value="'.$status.'" />'."\n";   $part.'_solved_s" value="'.$status.'" />'."\n";
     $result.='<td align="middle"><select name="'.      $result.='<td align="middle"><select name="'.
  'GD_'.$uname.'_'.$part.'_sv" '.   'GD_'.$uname.'_'.$part.'_solved" '.
  'onChange="javascript:changeOneScore('.$part.',\''.$uname.'\')" >'."\n";   'onChange="javascript:changeOneScore(\''.$part.'\',\''.$uname.'\')" >'."\n";
     my $optsel = '<option selected="on"> </option><option>excused</option>'."\n";      my $optsel = '<option selected="on"> </option><option>excused</option>'."\n";
     $optsel = '<option> </option><option selected="on">excused</option>'."\n"      $optsel = '<option> </option><option selected="on">excused</option>'."\n"
  if ($status eq 'excused');   if ($status eq 'excused');
     $result.=$optsel;      $result.=$optsel;
     $result.="</select></td>\n";      $result.="</select></td>\n";
    } else {
       $result.='<input type="hidden" name="'.
    'GD_'.$uname.'_'.$part.'_'.$type.'_s" value="'.$score.'" />'.
       "\n";
       $result.='<td align="middle"><input type="text" name="'.
    'GD_'.$uname.'_'.$part.'_'.$type.'" '.
    'value="'.$score.'" size="4" /></td>'."\n";
  }   }
     }      }
     $result.='</tr>';      $result.='</tr>';
Line 1745  sub editgrades { Line 1771  sub editgrades {
   
     my (@partid);      my (@partid);
     my %weight = ();      my %weight = ();
       my %columns = ();
     my ($i,$ctr,$count,$rec_update) = (0,0,0,0);      my ($i,$ctr,$count,$rec_update) = (0,0,0,0);
   
       my (@parts) = sort(&getpartlist($url));
       my $header;
     while ($ctr < $ENV{'form.totalparts'}) {      while ($ctr < $ENV{'form.totalparts'}) {
  my $partid = $ENV{'form.partid_'.$ctr};   my $partid = $ENV{'form.partid_'.$ctr};
  push @partid,$partid;   push @partid,$partid;
  $weight{$partid} = $ENV{'form.weight_'.$partid};   $weight{$partid} = $ENV{'form.weight_'.$partid};
  $ctr++;   $ctr++;
  $result .= '<td colspan = 2 align="center"><b>Part '.$partid.  
     '</b> (Weight = '.$weight{$partid}.')</td>';  
     }      }
     $result .= '</tr><tr bgcolor="#deffff">';      foreach my $partid (@partid) {
     foreach (@partid) {   $header .= '<td align="center">&nbsp;<b>Old Score</b>&nbsp;</td>'.
  $result .= '<td align="center">&nbsp;<b>Old Score</b>&nbsp;</td>'.  
     '<td align="center">&nbsp;<b>New Score</b>&nbsp;</td>';      '<td align="center">&nbsp;<b>New Score</b>&nbsp;</td>';
    $columns{$partid}=2;
    foreach my $stores (@parts) {
       my ($part,$type) = &split_part_type($stores);
       if ($part !~ m/^\Q$partid\E/) { next;}
       if ($type eq 'awarded' || $type eq 'solved') { next; }
       my $display=&Apache::lonnet::metadata($url,$stores.'.display');
       $display =~ s/\[Part: (\w)+\]//;
       $header .= '<td align="center">&nbsp;<b>Old</b> '.$display.'&nbsp;</td>'.
    '<td align="center">&nbsp;<b>New</b> '.$display.'&nbsp;</td>';
       $columns{$partid}+=2;
    }
     }      }
       foreach my $partid (@partid) {
    $result .= '<td colspan="'.$columns{$partid}.
       '" align="center"><b>Part '.$partid.
       '</b> (Weight = '.$weight{$partid}.')</td>';
   
       }
       $result .= '</tr><tr bgcolor="#deffff">';
       $result .= $header;
     $result .= '</tr>'."\n";      $result .= '</tr>'."\n";
   
     for ($i=0; $i<$ENV{'form.total'}; $i++) {      for ($i=0; $i<$ENV{'form.total'}; $i++) {
Line 1766  sub editgrades { Line 1812  sub editgrades {
  my %newrecord;   my %newrecord;
  my $updateflag = 0;   my $updateflag = 0;
  my @userdom = grep /^$user:/,keys %$classlist;   my @userdom = grep /^$user:/,keys %$classlist;
  my ($foo,$udom) = split(/:/,$userdom[0]);   my (undef,$udom) = split(/:/,$userdom[0]);
   
  $result .= '<tr bgcolor="#ffffde"><td>'.$user.'&nbsp;</td><td>'.   $result .= '<tr bgcolor="#ffffde"><td>'.$user.'&nbsp;</td><td>'.
     $$fullname{$userdom[0]}.'&nbsp;</td>';      $$fullname{$userdom[0]}.'&nbsp;</td>';
   
  foreach (@partid) {   foreach (@partid) {
     my $old_aw    = $ENV{'form.GD_'.$user.'_'.$_.'_aw_s'};      my $old_aw    = $ENV{'form.GD_'.$user.'_'.$_.'_awarded_s'};
     my $old_part  = $old_aw eq '' ? '' : $old_aw/$weight{$_};      my $old_part_pcr = $old_aw/($weight{$_} ne '0' ? $weight{$_}:1);
     my $old_score = $scoreptr{$ENV{'form.GD_'.$user.'_'.$_.'_sv_s'}};      my $old_part  = $old_aw eq '' ? '' : $old_part_pcr;
       my $old_score = $scoreptr{$ENV{'form.GD_'.$user.'_'.$_.'_solved_s'}};
     my $awarded   = $ENV{'form.GD_'.$user.'_'.$_.'_aw'};  
     my $partial   = $awarded eq '' ? '' : $awarded/$weight{$_};      my $awarded   = $ENV{'form.GD_'.$user.'_'.$_.'_awarded'};
       my $pcr       = $awarded/($weight{$_} ne '0' ? $weight{$_} : 1);
       my $partial   = $awarded eq '' ? '' : $pcr;
     my $score;      my $score;
     if ($partial eq '') {      if ($partial eq '') {
  $score = $scoreptr{$ENV{'form.GD_'.$user.'_'.$_.'_sv_s'}};   $score = $scoreptr{$ENV{'form.GD_'.$user.'_'.$_.'_solved_s'}};
     } elsif ($partial > 0) {      } elsif ($partial > 0) {
  $score = 'correct_by_override';   $score = 'correct_by_override';
     } elsif ($partial == 0) {      } elsif ($partial == 0) {
  $score = 'incorrect_by_override';   $score = 'incorrect_by_override';
     }      }
     $score = 'excused' if (($ENV{'form.GD_'.$user.'_'.$_.'_sv'} eq 'excused') &&      $score = 'excused' if (($ENV{'form.GD_'.$user.'_'.$_.'_solved'} eq 'excused') &&
    ($score ne 'excused'));     ($score ne 'excused'));
     $result .= '<td align="center">'.$old_aw.'&nbsp;</td>'.      $result .= '<td align="center">'.$old_aw.'&nbsp;</td>'.
  '<td align="center">'.$awarded.   '<td align="center">'.$awarded.
  ($score eq 'excused' ? $score : '').'&nbsp;</td>';   ($score eq 'excused' ? $score : '').'&nbsp;</td>';
   
     next if ($old_part eq $partial && $old_score eq $score);      if (!($old_part eq $partial && $old_score eq $score)) {
    $updateflag = 1;
     $updateflag = 1;   $newrecord{'resource.'.$_.'.awarded'}  = $partial if $partial ne '';
     $newrecord{'resource.'.$_.'.awarded'}  = $partial if $partial ne '';   $newrecord{'resource.'.$_.'.solved'}   = $score;
     $newrecord{'resource.'.$_.'.solved'}   = $score;   $rec_update++;
     $rec_update++;      }
   
       my $partid=$_;
       foreach my $stores (@parts) {
    my ($part,$type) = &split_part_type($stores);
    if ($part !~ m/^\Q$partid\E/) { next;}
    if ($type eq 'awarded' || $type eq 'solved') { next; }
    my $old_aw    = $ENV{'form.GD_'.$user.'_'.$part.'_'.$type.'_s'};
    my $awarded   = $ENV{'form.GD_'.$user.'_'.$part.'_'.$type};
    if ($awarded ne '' && $awarded ne $old_aw) {
       $newrecord{'resource.'.$part.'.'.$type}= $awarded;
       $updateflag=1;
    }
    $result .= '<td align="center">'.$old_aw.'&nbsp;</td>'.
       '<td align="center">'.$awarded.'&nbsp;</td>';
       }
  }   }
  $result .= '</tr>'."\n";   $result .= '</tr>'."\n";
  if ($updateflag) {   if ($updateflag) {
Line 1813  sub editgrades { Line 1875  sub editgrades {
  '<b>Total number of students = '.$ENV{'form.total'}.'</b><br />';   '<b>Total number of students = '.$ENV{'form.total'}.'</b><br />';
     return $title.$msg.$result;      return $title.$msg.$result;
 }  }
   
   sub split_part_type {
       my ($partstr) = @_;
       my ($temp,@allparts)=split(/_/,$partstr);
       my $type=pop(@allparts);
       my $part=join('.',@allparts);
       return ($part,$type);
   }
   
 #------------- end of section for handling grading by section/class ---------  #------------- end of section for handling grading by section/class ---------
 #  #
 #----------------------------------------------------------------------------  #----------------------------------------------------------------------------
Line 2029  sub csvuploadassign { Line 2100  sub csvuploadassign {
     }      }
     $request->print('<h3>Assigning Grades</h3>');      $request->print('<h3>Assigning Grades</h3>');
     my $courseid=$ENV{'request.course.id'};      my $courseid=$ENV{'request.course.id'};
 #  my $cdom=$ENV{"course.$courseid.domain"};  
 #  my $cnum=$ENV{"course.$courseid.num"};  
     my ($classlist) = &getclasslist('all','1');      my ($classlist) = &getclasslist('all','1');
     my @skipped;      my @skipped;
     my $countdone=0;      my $countdone=0;
Line 2119  sub view_edit_entire_class_form { Line 2188  sub view_edit_entire_class_form {
     my ($classlist,$sections) = &getclasslist('all','0');      my ($classlist,$sections) = &getclasslist('all','0');
     my $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n";      my $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n";
     $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";      $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";
     $result.='&nbsp;<b>View/Grade Entire Section/Class</b></td></tr>'."\n";      $result.='&nbsp;<b>Grade Entire Section or Class</b></td></tr>'."\n";
     $result.='<tr bgcolor=#ffffe6><td>'."\n";      $result.='<tr bgcolor=#ffffe6><td>'."\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="viewgrades" />'."\n";   '<input type="hidden" name="command" value="viewgrades" />'."\n";
     $result.='&nbsp;<b>Select section:</b> <select name="section">'."\n";      $result.='&nbsp;<b>Select section:</b> <select name="section">'."\n";
     foreach (sort (@$sections)) {      if (ref($sections)) {
  $result.= '<option>'.$_.'</option>'."\n";   foreach (sort (@$sections)) {
       $result.= '<option>'.$_.'</option>'."\n";
    }
     }      }
     $result.='<option selected="on">all</select>'."<br />\n";      $result.='<option selected="on">all</select>'."<br />\n";
     $result.='&nbsp;<input type="submit" name="submit" value="View/Grade" /></form>'."\n";      $result.='&nbsp;<input type="button" onClick="submit();" value="Grade" /></form>'."\n";
     $result.='</td></tr></table>'."\n";      $result.='</td></tr></table>'."\n";
     $result.='</td></tr></table>'."\n";      $result.='</td></tr></table>'."\n";
     return $result;      return $result;
Line 2140  sub view_edit_entire_class_form { Line 2211  sub view_edit_entire_class_form {
 sub upcsvScores_form {  sub upcsvScores_form {
     my ($symb,$url) = @_;      my ($symb,$url) = @_;
     if (!$symb) {return '';}      if (!$symb) {return '';}
     my $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n";      my $result = '<script type="text/javascript" language="javascript">'."\n".
    '  function checkUpload(formname) {'."\n".
    '    if (formname.upfile.value == "") {'."\n".
    '       alert("Please use the browse button to select a file from your local directory.");'."\n".
    '       return false;'."\n".
    '    }'."\n".
    '    formname.submit();'."\n".
    '  }'."\n".
    '</script>'."\n";
   
       $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n";
     $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";      $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";
     $result.='&nbsp;<b>Specify a file containing the class scores for above resource</b></td></tr>'."\n";      $result.='&nbsp;<b>Specify a file containing the class scores for above resource</b></td></tr>'."\n";
     $result.='<tr bgcolor=#ffffe6><td>'."\n";      $result.='<tr bgcolor=#ffffe6><td>'."\n";
Line 2151  sub upcsvScores_form { Line 2232  sub upcsvScores_form {
 <input type="hidden" name="url" value="$url" />  <input type="hidden" name="url" value="$url" />
 <input type="hidden" name="command" value="csvuploadmap" />  <input type="hidden" name="command" value="csvuploadmap" />
 $upfile_select  $upfile_select
 <br />&nbsp;<input type="submit" name="submit" value="Upload Grades" />  <br />&nbsp;<input type="button" onClick="javascript:checkUpload(this.form);" value="Upload Grades" />
 </form>  </form>
 ENDUPFORM  ENDUPFORM
     $result.='</td></tr></table>'."\n";      $result.='</td></tr></table>'."\n";
Line 2165  sub viewGradeaStu_form { Line 2246  sub viewGradeaStu_form {
     my ($classlist,$sections) = &getclasslist('all','0');      my ($classlist,$sections) = &getclasslist('all','0');
     my $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n";      my $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n";
     $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";      $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";
     $result.='&nbsp;<b>View/Grade an Individual Student\'s Submission</b></td></tr>'."\n";      $result.='&nbsp;<b>';
       if ($handgrade eq 'yes') {
    $result.="View/Grade ";
       } else {
    $result.="View ";
       }
       $result.='an Individual Student\'s Submission</b></td></tr>'."\n";
     $result.='<tr bgcolor=#ffffe6><td>'."\n";      $result.='<tr bgcolor=#ffffe6><td>'."\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".
Line 2176  sub viewGradeaStu_form { Line 2263  sub viewGradeaStu_form {
  '<input type="hidden" name="command" value="submission" />'."\n";   '<input type="hidden" name="command" value="submission" />'."\n";
   
     $result.='&nbsp;<b>Select section:</b> <select name="section">'."\n";      $result.='&nbsp;<b>Select section:</b> <select name="section">'."\n";
     foreach (sort (@$sections)) {      if (ref($sections)) {
  $result.= '<option>'.$_.'</option>'."\n";   foreach (sort (@$sections)) {$result.='<option>'.$_.'</option>'."\n";}
     }      }
     $result.= '<option selected="on">all</select>'."\n";      $result.= '<option selected="on">all</select>'."\n";
     $result.='&nbsp;&nbsp;<b>Display students who has: </b>'.      $result.='&nbsp;&nbsp;<b>Display students who has: </b>'.
  '<input type="radio" name="submitonly" value="yes" checked> submitted'.   '<input type="radio" name="submitonly" value="yes" checked> submitted'.
  '<input type="radio" name="submitonly" value="all"> everybody <br />';   '<input type="radio" name="submitonly" value="all"> everybody <br />';
     $result.='&nbsp;(Section "no" implies the students were not assigned a section.)<br />'       if (ref($sections)) {
  if (grep /no/,@$sections);   $result.='&nbsp;(Section "no" implies the students were not assigned a section.)<br />' 
           if (grep /no/,@$sections);
     $result.='<br />&nbsp;<input type="submit" name="submit" value="View/Grade" />'."\n".      }
  '</form>'."\n";  
   
       $result.='<br />&nbsp;<input type="button" onClick="submit();" value="';
       if ($handgrade eq 'yes') {
    $result.="View/Grade";
       } else {
    $result.="View";
       }
       $result.='" />'."\n".'</form>'."\n";
     $result.='</td></tr></table>'."\n";      $result.='</td></tr></table>'."\n";
     $result.='</td></tr></table>'."\n";      $result.='</td></tr></table>'."\n";
     return $result;      return $result;
Line 2196  sub viewGradeaStu_form { Line 2291  sub viewGradeaStu_form {
 #--- Form to input a receipt number ---  #--- Form to input a receipt number ---
 sub verifyReceipt_form {  sub verifyReceipt_form {
     my ($symb,$url) = @_;      my ($symb,$url) = @_;
     my $cdom=$ENV{"course.$ENV{'request.course.id'}.domain"};      my $result = '<script type="text/javascript" language="javascript">'."\n".
     my $cnum=$ENV{"course.$ENV{'request.course.id'}.num"};   '  function checkEntry(formname) {'."\n".
    '    var receipt = formname.receipt.value;'."\n".
    '    if (isNaN(receipt) || receipt == "") {'."\n".
    '       alert("Please enter a receipt number given by a student in the box.");'."\n".
    '       return false;'."\n".
    '    }'."\n".
    '    formname.submit();'."\n".
    '  }'."\n".
    '</script>'."\n";
   
     my $hostver=unpack("%32C*",$Apache::lonnet::perlvar{'lonHostID'});      my $hostver=unpack("%32C*",$Apache::lonnet::perlvar{'lonHostID'});
   
     my $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n";      $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\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>Verify a Submission Receipt Issued by this Server</td></tr>'."\n";      $result.='&nbsp;<b>Verify a Submission Receipt Issued by this Server</td></tr>'."\n";
     $result.='<tr bgcolor=#ffffe6><td>'."\n";      $result.='<tr bgcolor=#ffffe6><td>'."\n";
     $result.='<form action="/adm/grades" method="post">'."\n";      $result.='<form action="/adm/grades" method="post" name="verifyform">'."\n";
     $result.='&nbsp;<tt>'.$hostver.'-<input type="text" name="receipt" size="4"></tt><br />'."\n";      $result.='&nbsp;<tt>'.$hostver.'-<input type="text" name="receipt" size="4"></tt><br />'."\n";
     $result.='&nbsp;<input type="submit" name="submit" value="Verify Receipt">'."\n";      $result.='&nbsp;<input type="button" onClick="javascript:checkEntry(this.form);"'.
    ' value="Verify Receipt">'."\n";
     $result.='<input type="hidden" name="command" value="verify">'."\n";      $result.='<input type="hidden" name="command" value="verify">'."\n";
     if ($ENV{'form.url'}) {      if ($ENV{'form.url'}) {
  $result.='<input type="hidden" name="url" value="'.$ENV{'form.url'}.'" />';   $result.='<input type="hidden" name="url" value="'.$ENV{'form.url'}.'" />';
Line 2268  sub handler { Line 2373  sub handler {
     }      }
  }   }
     } else {      } else {
  #&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 2318  sub send_header { Line 2422  sub send_header {
 #remotewindow=open('','homeworkremote');  #remotewindow=open('','homeworkremote');
 #remotewindow.close();  #remotewindow.close();
 #</script>");   #</script>"); 
     $request->print('<body bgcolor="#FFFFFF">');      $request->print(&Apache::loncommon::bodytag('Grading'));
 }  }
   
 sub send_footer {  sub send_footer {

Removed from v.1.45  
changed lines
  Added in v.1.55


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