Diff for /loncom/homework/grades.pm between versions 1.336 and 1.348

version 1.336, 2006/03/19 21:38:55 version 1.348, 2006/04/09 20:53:27
Line 722  LISTJAVASCRIPT Line 722  LISTJAVASCRIPT
     $gradeTable.='<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last submission only </label>'."\n".      $gradeTable.='<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last submission only </label>'."\n".
  '<label><input type="radio" name="lastSub" value="last" /> last submission & parts info </label>'."\n".   '<label><input type="radio" name="lastSub" value="last" /> last submission & parts info </label>'."\n".
  '<label><input type="radio" name="lastSub" value="datesub" /> by dates and submissions </label>'."\n".   '<label><input type="radio" name="lastSub" value="datesub" /> by dates and submissions </label>'."\n".
  '<label><input type="radio" name="lastSub" value="all" /> all details</label>'."\n".   '<label><input type="radio" name="lastSub" value="all" /> all details</label><br />'."\n".
           '&nbsp;<b>Grading Increments:</b> <select name="increment">'.
           '<option value="1">Whole Points</option>'.
           '<option value=".5">Half Points</option>'.
           '<option value=".25">Quarter Points</options>'.
           '<option values=".1">Tenths of a Point</option>'.
           '</select>'.
   
  '<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".   '<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".
  '<input type="hidden" name="submitonly"  value="'.$submitonly.'" />'."\n".   '<input type="hidden" name="submitonly"  value="'.$submitonly.'" />'."\n".
  '<input type="hidden" name="handgrade"   value="'.$env{'form.handgrade'}.'" /><br />'."\n".   '<input type="hidden" name="handgrade"   value="'.$env{'form.handgrade'}.'" /><br />'."\n".
Line 1436  sub sub_page_kw_js { Line 1443  sub sub_page_kw_js {
 SUBJAVASCRIPT  SUBJAVASCRIPT
 }  }
   
   sub getIncrement
   {
       my $increment = $env{'form.increment'};
       if ($increment != 1 && $increment != .5 && $increment != .25 &&
           $increment != .1) {
           $increment = 1;
       }
       return $increment;
   }
   
 #--- displays the grading box, used in essay type problem and grading by page/sequence  #--- displays the grading box, used in essay type problem and grading by page/sequence
 sub gradeBox {  sub gradeBox {
     my ($request,$symb,$uname,$udom,$counter,$partid,$record) = @_;      my ($request,$symb,$uname,$udom,$counter,$partid,$record) = @_;
Line 1458  sub gradeBox { Line 1475  sub gradeBox {
     $result.='<table border="0"><tr><td>'.      $result.='<table border="0"><tr><td>'.
  '<b>Part: </b>'.$display_part.' <b>Points: </b></td><td>'."\n";   '<b>Part: </b>'.$display_part.' <b>Points: </b></td><td>'."\n";
     my $ctr = 0;      my $ctr = 0;
       my $thisweight = 0;
       my $increment = getIncrement();
     $result.='<table border="0"><tr>'."\n";  # display radio buttons in a nice table 10 across      $result.='<table border="0"><tr>'."\n";  # display radio buttons in a nice table 10 across
     while ($ctr<=$wgt) {      while ($thisweight<=$wgt) {
  $result.= '<td><nobr><label><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '.   $result.= '<td><nobr><label><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '.
     'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','.      'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','.
     $ctr.')" value="'.$ctr.'" '.      $thisweight.')" value="'.$thisweight.'" '.
     ($score eq $ctr ? 'checked':'').' /> '.$ctr."</label></nobr></td>\n";      ($score eq $thisweight ? 'checked':'').' /> '.$thisweight."</label></nobr></td>\n";
  $result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : '');   $result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : '');
           $thisweight += $increment;
  $ctr++;   $ctr++;
     }      }
     $result.='</tr></table>';      $result.='</tr></table>';
Line 1517  sub handback_box { Line 1537  sub handback_box {
  next if (!@$files);   next if (!@$files);
  my $file_counter = 1;   my $file_counter = 1;
  foreach my $file (@$files) {   foreach my $file (@$files) {
     my ($file_disp) = ($file =~ m|.+/(.+)$|);      my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|);
       my ($name,$version,$ext) = &file_name_version_ext($file_disp);
       $file_disp = "$name.$ext";
       $file = $file_path.$file_disp;
     $result.=&mt('Return commented version of [_1] to student.',      $result.=&mt('Return commented version of [_1] to student.',
  '<span class="filename">'.$file_disp.'</span>');   '<span class="filename">'.$file_disp.'</span>');
     $result.='<input type="file"   name="'.$prefix.'returndoc'.$file_counter.'" />'."\n";      $result.='<input type="file"   name="'.$prefix.'returndoc'.$file_counter.'" />'."\n";
Line 1992  KEYWORDS Line 2015  KEYWORDS
     '<input type="button" value="Next" '.      '<input type="button" value="Next" '.
     'onClick="javascript:checksubmit(this.form,\'Next\');" TARGET=_self> &nbsp;';      'onClick="javascript:checksubmit(this.form,\'Next\');" TARGET=_self> &nbsp;';
  $endform.='(Next and Previous (student) do not save the scores.)'."\n" ;   $endform.='(Next and Previous (student) do not save the scores.)'."\n" ;
           $endform.="<input type='hidden' value='" . getIncrement() .
               "' name='increment' />";
  $endform.='</td><tr></table></form>';   $endform.='</td><tr></table></form>';
  $endform.=&show_grading_menu_form($symb);   $endform.=&show_grading_menu_form($symb);
  $request->print($endform);   $request->print($endform);
Line 2269  sub processHandGrade { Line 2294  sub processHandGrade {
 #---- Save the score and award for each student, if changed  #---- Save the score and award for each student, if changed
 sub saveHandGrade {  sub saveHandGrade {
     my ($request,$symb,$stuname,$domain,$newflg,$submitter,$part) = @_;      my ($request,$symb,$stuname,$domain,$newflg,$submitter,$part) = @_;
     my @v_flag;      my @version_parts;
     my $usec = &Apache::lonnet::getsection($domain,$stuname,      my $usec = &Apache::lonnet::getsection($domain,$stuname,
    $env{'request.course.id'});     $env{'request.course.id'});
     if (!&canmodify($usec)) { return('not_allowed'); }      if (!&canmodify($usec)) { return('not_allowed'); }
     my %record     = &Apache::lonnet::restore($symb,$env{'request.course.id'},$domain,$stuname);      my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$domain,$stuname);
     my @parts_graded;      my @parts_graded;
     my %newrecord  = ();      my %newrecord  = ();
     my ($pts,$wgt) = ('','');      my ($pts,$wgt) = ('','');
     my %aggregate = ();      my %aggregate = ();
     my $aggregateflag = 0;      my $aggregateflag = 0;
   
     my @parts = split(/:/,$env{'form.partlist'.$newflg});      my @parts = split(/:/,$env{'form.partlist'.$newflg});
     foreach my $new_part (@parts) {      foreach my $new_part (@parts) {
  #collaborator may vary for different parts   #collaborator ($submi may vary for different parts
  if ($submitter && $new_part ne $part) { next; }   if ($submitter && $new_part ne $part) { next; }
  my $dropMenu = $env{'form.GD_SEL'.$newflg.'_'.$new_part};   my $dropMenu = $env{'form.GD_SEL'.$newflg.'_'.$new_part};
  if ($dropMenu eq 'excused') {   if ($dropMenu eq 'excused') {
Line 2327  sub saveHandGrade { Line 2351  sub saveHandGrade {
     my $partial= $pts/$wgt;      my $partial= $pts/$wgt;
     if ($partial eq $record{'resource.'.$new_part.'.awarded'}) {      if ($partial eq $record{'resource.'.$new_part.'.awarded'}) {
  #do not update score for part if not changed.   #do not update score for part if not changed.
                   &handback_files($request,$symb,$stuname,$domain,$newflg,$new_part,\%newrecord);
  next;   next;
     } else {      } else {
         push @parts_graded, $new_part;          push @parts_graded, $new_part;
Line 2350  sub saveHandGrade { Line 2375  sub saveHandGrade {
     }      }
     $newrecord{'resource.'.$new_part.'.regrader'}=      $newrecord{'resource.'.$new_part.'.regrader'}=
  "$env{'user.name'}:$env{'user.domain'}";   "$env{'user.name'}:$env{'user.domain'}";
               &handback_files($request,$symb,$stuname,$domain,$newflg,$new_part,\%newrecord);
  }   }
  my ($partlist,$handgrade,$responseType) = &response_type($symb);  
  foreach my $part_resp (sort(keys(%$handgrade))) {  
     my ($part_id, $resp_id) = split(/_/,$part_resp);  
             if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part == $part_id)) {  
                 # if multiple files are uploaded names will be 'returndoc2','returndoc3'  
                 my $file_counter = 1;  
                 while ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter}) {  
                     my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'.filename'};  
                     $newrecord{"resource.$new_part.$resp_id.handback"} = $env{'form.returndocorig'.$file_counter};  
                     # set the filename to match the submitted file name  
                     $env{'form.'.$newflg.'_'.$part_resp.'_returndoc1.filename'} = $env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter};  
                     my $result=&Apache::lonnet::userfileupload($newflg.'_'.$part_resp.'_returndoc'.$file_counter,'',  
          'portfolio',undef,undef,undef,$stuname,$domain);  
                    if ($result !~ m|^/uploaded/|) {  
                         $request->print('<font color="red"> An errror occured ('.$result.  
                     ') while trying to upload '.&display_file().'</font><br />');  
                 # $request->print(&done('Back'));  
             }  
                     $request->print("<br />".$fname." will be the uploaded file name");  
                     $request->print("<font color=\"red\">Will upload document</font>".$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter});  
                     $file_counter++;  
                 }  
             }  
         }  
   
  # unless problem has been graded, set flag to version the submitted files   # unless problem has been graded, set flag to version the submitted files
  unless ($record{'resource.'.$new_part.'.solved'} =~ /^correct_/  ||    unless ($record{'resource.'.$new_part.'.solved'} =~ /^correct_/  || 
         $record{'resource.'.$new_part.'.solved'} eq 'incorrect_by_override' ||          $record{'resource.'.$new_part.'.solved'} eq 'incorrect_by_override' ||
         $dropMenu eq 'reset status')          $dropMenu eq 'reset status')
    {     {
     push (@v_flag,$new_part);      push (@version_parts,$new_part);
  }   }
     }      }
     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'};
   
     if (scalar(keys(%newrecord)) > 0) {      if (%newrecord) {
         if (scalar(@v_flag)) {          if (@version_parts) {
             &version_portfiles(\%record, \@parts_graded, $env{'request.course.id'}, $symb, $domain, $stuname, \@v_flag);              my @changed_keys = &version_portfiles(\%record, \@parts_graded, $env{'request.course.id'}, $symb, $domain, $stuname, \@version_parts);
       @newrecord{@changed_keys} = @record{@changed_keys};
         }          }
  &Apache::lonnet::cstore(\%newrecord,$symb,   &Apache::lonnet::cstore(\%newrecord,$symb,
  $env{'request.course.id'},$domain,$stuname);   $env{'request.course.id'},$domain,$stuname);
   
  my @ungraded_parts;   my @ungraded_parts;
  foreach my $part (@parts) {   foreach my $part (@parts) {
     if ( !defined($record{'resource.'.$part.'.awarded'})      if ( !defined($record{'resource.'.$part.'.awarded'})
Line 2413  sub saveHandGrade { Line 2414  sub saveHandGrade {
     return ('',$pts,$wgt);      return ('',$pts,$wgt);
 }  }
   
   sub handback_files {
       my ($request,$symb,$stuname,$domain,$newflg,$new_part,$newrecord) = @_;
       my $portfolio_root = &Apache::loncommon::propath($domain,
    $stuname).
    '/userfiles/portfolio';
    my ($partlist,$handgrade,$responseType) = &response_type($symb);
           foreach my $part_resp (sort(keys(%$handgrade))) {
               my ($part_id, $resp_id) = split(/_/,$part_resp);
               if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part == $part_id)) {
                   # if multiple files are uploaded names will be 'returndoc2','returndoc3'
                   my $file_counter = 1;
                   while ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter}) {
                       my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'.filename'};
                       my ($directory,$answer_file) = 
                           ($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter} =~ /^(.*?)([^\/]*)$/);
                       my ($answer_name,$answer_ver,$answer_ext) =
           &file_name_version_ext($answer_file);
       $directory =~ /^.+$stuname\/portfolio(.*)/;
       my $portfolio_path = $1;
       my @dir_list = &Apache::lonnet::dirlist($portfolio_path,$domain,$stuname,$portfolio_root);
       my $version = &get_next_version($answer_name, $answer_ext, \@dir_list);
       my $new_answer = &version_selected_portfile($domain, $stuname, $portfolio_path, $answer_file, $version);
                       $$newrecord{"resource.$new_part.$resp_id.handback"} = $new_answer;
                       # set the filename to match the submitted file name
                       $env{'form.'.$newflg.'_'.$part_resp.'_returndoc1.filename'} = $env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter};
                       my $result=&Apache::lonnet::userfileupload($newflg.'_'.$part_resp.'_returndoc'.$file_counter,'',
                  'portfolio',undef,undef,undef,$stuname,$domain);
                       if ($result !~ m|^/uploaded/|) {
                           $request->print('<font color="red"> An errror occured ('.$result.
                           ') while trying to upload '.&display_file().'</font><br />');
                       # $request->print(&done('Back'));
                       }
                       $request->print("<br />".$fname." will be the uploaded file name");
                       $request->print("<font color=\"red\">Will upload document </font>".$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter});
                       $file_counter++;
                   }
               }
           }
       return;
   }
   
 sub get_submitted_files {  sub get_submitted_files {
     my ($udom,$uname,$partid,$respid,$record) = @_;      my ($udom,$uname,$partid,$respid,$record) = @_;
     my @files;      my @files;
Line 2491  sub get_last_resets { Line 2533  sub get_last_resets {
 sub version_portfiles {  sub version_portfiles {
     my ($record, $parts_graded, $courseid, $symb, $domain, $stu_name, $v_flag) = @_;      my ($record, $parts_graded, $courseid, $symb, $domain, $stu_name, $v_flag) = @_;
     my $version_parts = join('|',@$v_flag);      my $version_parts = join('|',@$v_flag);
       my @returned_keys;
     my $parts = join('|', @$parts_graded);      my $parts = join('|', @$parts_graded);
     my $portfolio_root = &Apache::loncommon::propath($domain,      my $portfolio_root = &Apache::loncommon::propath($domain,
  $stu_name).   $stu_name).
Line 2498  sub version_portfiles { Line 2541  sub version_portfiles {
     foreach my $key (keys(%$record)) {      foreach my $key (keys(%$record)) {
         my $new_portfiles;          my $new_portfiles;
         if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) {          if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) {
             my @v_portfiles;              my @versioned_portfiles;
             my @portfiles = split(/,/,$$record{$key});              my @portfiles = split(/,/,$$record{$key});
             foreach my $file (@portfiles) {              foreach my $file (@portfiles) {
                 &Apache::lonnet::unmark_as_readonly($domain,$stu_name,[$symb,$env{'request.course.id'}],$file);                  &Apache::lonnet::unmark_as_readonly($domain,$stu_name,[$symb,$env{'request.course.id'}],$file);
                 my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/);                  my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/);
                 my $version = 0;  
  my ($answer_name,$answer_ver,$answer_ext) =   my ($answer_name,$answer_ver,$answer_ext) =
     &file_name_version_ext($answer_file);      &file_name_version_ext($answer_file);
                 my @dir_list = &Apache::lonnet::dirlist($directory,$domain,$stu_name,$portfolio_root);                  my @dir_list = &Apache::lonnet::dirlist($directory,$domain,$stu_name,$portfolio_root);
                 $version = &get_next_version($answer_name, $answer_ext, \@dir_list);                  my $version = &get_next_version($answer_name, $answer_ext, \@dir_list);
                 my $new_answer = &version_selected_portfile($domain, $stu_name, $directory, $answer_file, $version);                  my $new_answer = &version_selected_portfile($domain, $stu_name, $directory, $answer_file, $version);
                 if ($new_answer ne 'problem getting file') {                  if ($new_answer ne 'problem getting file') {
                     push(@v_portfiles, $directory.$new_answer);                      push(@versioned_portfiles, $directory.$new_answer);
                     &Apache::lonnet::mark_as_readonly($domain,$stu_name,                      &Apache::lonnet::mark_as_readonly($domain,$stu_name,
                         ['/portfolio'.$directory.$new_answer],                          ['/portfolio'.$directory.$new_answer],
                         [$symb,$env{'request.course.id'},'graded']);                          [$symb,$env{'request.course.id'},'graded']);
                 }                  }
                   
             }              }
             $$record{$key} = join(',',@v_portfiles);              $$record{$key} = join(',',@versioned_portfiles);
               push(@returned_keys,$key);
         }          }
     }       } 
     return 'ok';         return (@returned_keys);   
 }  }
   
 sub get_next_version {  sub get_next_version {
     my ($answer_name, $answer_ext, $dir_list);      my ($answer_name, $answer_ext, $dir_list) = @_;
     my $version;      my $version;
     foreach my $row (@$dir_list) {      foreach my $row (@$dir_list) {
         my ($file) = split(/\&/,$row,2);          my ($file) = split(/\&/,$row,2);
Line 3494  sub csvuploadassign { Line 3536  sub csvuploadassign {
     my ($request)= @_;      my ($request)= @_;
     my ($symb)=&get_symb($request);      my ($symb)=&get_symb($request);
     if (!$symb) {return '';}      if (!$symb) {return '';}
       my $error_msg = '';
     &Apache::loncommon::load_tmp_file($request);      &Apache::loncommon::load_tmp_file($request);
     my @gradedata = &Apache::loncommon::upfile_record_sep();      my @gradedata = &Apache::loncommon::upfile_record_sep();
     if ($env{'form.noFirstLine'}) { shift(@gradedata); }      if ($env{'form.noFirstLine'}) { shift(@gradedata); }
Line 3546  sub csvuploadassign { Line 3589  sub csvuploadassign {
  my $part=$1;   my $part=$1;
  my $wgt =&Apache::lonnet::EXT('resource.'.$part.'.weight',   my $wgt =&Apache::lonnet::EXT('resource.'.$part.'.weight',
       $symb,$domain,$username);        $symb,$domain,$username);
  $entries{$fields{$dest}}=~s/\s//g;                  if ($wgt) {
  my $pcr=$entries{$fields{$dest}} / $wgt;                      $entries{$fields{$dest}}=~s/\s//g;
  my $award='correct_by_override';                      my $pcr=$entries{$fields{$dest}} / $wgt;
  $grades{"resource.$part.awarded"}=$pcr;                      my $award='correct_by_override';
  $grades{"resource.$part.solved"}=$award;                      $grades{"resource.$part.awarded"}=$pcr;
  $points{$part}=1;                      $grades{"resource.$part.solved"}=$award;
                       $points{$part}=1;
                   } else {
                       $error_msg = "<br />" .
                           &mt("Some point values were assigned"
                               ." for problems with a weight "
                               ."of zero. These values were "
                               ."ignored.");
                   }
     } else {      } else {
  if ($dest=~/stores_(.*)_awarded/) { if ($points{$1}) {next;} }   if ($dest=~/stores_(.*)_awarded/) { if ($points{$1}) {next;} }
  if ($dest=~/stores_(.*)_solved/)  { if ($points{$1}) {next;} }   if ($dest=~/stores_(.*)_solved/)  { if ($points{$1}) {next;} }
Line 3591  sub csvuploadassign { Line 3642  sub csvuploadassign {
     }      }
     $request->print("<br />\n");      $request->print("<br />\n");
     $request->print(&show_grading_menu_form($symb));      $request->print(&show_grading_menu_form($symb));
     return '';      return $error_msg;
 }  }
 #------------- end of section for handling csv file upload ---------  #------------- end of section for handling csv file upload ---------
 #  #
Line 5971  sub handler { Line 6022  sub handler {
   
 sub send_header {  sub send_header {
     my ($request)= @_;      my ($request)= @_;
     $request->print(&Apache::lontexconvert::header());      &Apache::lontexconvert::init_tth();
 #  $request->print("      $request->print(&Apache::loncommon::start_page('Grading'));
 #<script>  
 #remotewindow=open('','homeworkremote');  
 #remotewindow.close();  
 #</script>");   
     $request->print(&Apache::loncommon::bodytag('Grading'));  
     $request->rflush();      $request->rflush();
 }  }
   
 sub send_footer {  sub send_footer {
     my ($request)= @_;      my ($request)= @_;
     $request->print('</body></html>');      $request->print(&Apache::loncommon::end_page());
 }  }
   
 1;  1;

Removed from v.1.336  
changed lines
  Added in v.1.348


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