Diff for /loncom/homework/grades.pm between versions 1.404 and 1.412

version 1.404, 2007/06/14 21:36:12 version 1.412, 2007/06/16 14:09:52
Line 41  use Apache::Constants qw(:common); Line 41  use Apache::Constants qw(:common);
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonenc;  use Apache::lonenc;
 use String::Similarity;  use String::Similarity;
 use lib '/home/httpd/lib/perl';  
 use LONCAPA;  use LONCAPA;
   
 use POSIX qw(floor);  use POSIX qw(floor);
Line 6130  sub init_perm { Line 6129  sub init_perm {
 }  }
   
 sub gather_clicker_ids {  sub gather_clicker_ids {
     my %clickerids=();      my %clicker_ids;
   
     my $classlist = &Apache::loncoursedata::get_classlist();      my $classlist = &Apache::loncoursedata::get_classlist();
   
     # Set up a couple variables.      # Set up a couple variables.
     my $usernameidx = &Apache::loncoursedata::CL_SNAME();      my $username_idx = &Apache::loncoursedata::CL_SNAME();
     my $domainidx   = &Apache::loncoursedata::CL_SDOM();      my $domain_idx   = &Apache::loncoursedata::CL_SDOM();
   
     foreach my $student (keys %$classlist) {      foreach my $student (keys(%$classlist)) {
   
         my $username = $classlist->{$student}->[$usernameidx];          my $username = $classlist->{$student}->[$username_idx];
         my $domain   = $classlist->{$student}->[$domainidx];          my $domain   = $classlist->{$student}->[$domain_idx];
         my $clickers =          my $clickers =
    (&Apache::lonnet::userenvironment($domain,$username,'clickers'))[1];      (&Apache::lonnet::userenvironment($domain,$username,'clickers'))[1];
         foreach my $id (split(/\,/,$clickers)) {          foreach my $id (split(/\,/,$clickers)) {
             if (exists($clickerids{$id})) {              $id=~s/^0+//;
                $clickerids{$id}.=','.$username.':'.$domain;              if (exists($clicker_ids{$id})) {
    $clicker_ids{$id}.=','.$username.':'.$domain;
             } else {              } else {
                $clickerids{$id}=$username.':'.$domain;   $clicker_ids{$id}=$username.':'.$domain;
             }              }
         }          }
     }      }
     return %clickerids;      return %clicker_ids;
 }  }
   
 sub gather_adv_clicker_ids {  sub gather_adv_clicker_ids {
     my %clickerids=();      my %clicker_ids;
     my $cnum=$env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
     my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum);      my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum);
     foreach my $element (sort keys %coursepersonnel) {      foreach my $element (sort(keys(%coursepersonnel))) {
         foreach my $person (split(/\,/,$coursepersonnel{$element})) {          foreach my $person (split(/\,/,$coursepersonnel{$element})) {
             my ($puname,$pudom)=split(/\:/,$person);              my ($puname,$pudom)=split(/\:/,$person);
             my $clickers =              my $clickers =
                (&Apache::lonnet::userenvironment($pudom,$puname,'clickers'))[1];   (&Apache::lonnet::userenvironment($pudom,$puname,'clickers'))[1];
                foreach my $id (split(/\,/,$clickers)) {              foreach my $id (split(/\,/,$clickers)) {
                if (exists($clickerids{$id})) {   $id=~s/^0+//;
                   $clickerids{$id}.=','.$puname.':'.$pudom;   if (exists($clicker_ids{$id})) {
                } else {      $clicker_ids{$id}.=','.$puname.':'.$pudom;
                   $clickerids{$id}=$puname.':'.$pudom;   } else {
                }      $clicker_ids{$id}=$puname.':'.$pudom;
            }   }
               }
         }          }
     }      }
     return %clickerids;      return %clicker_ids;
 }  }
   
 sub process_clicker {  sub process_clicker {
Line 6198  sub process_clicker { Line 6199  sub process_clicker {
     my $pcorrect=&mt("Percentage points for correct solution");      my $pcorrect=&mt("Percentage points for correct solution");
     my $pincorrect=&mt("Percentage points for incorrect solution");      my $pincorrect=&mt("Percentage points for incorrect solution");
     my $selectform=&Apache::loncommon::select_form('iclicker','upfiletype',      my $selectform=&Apache::loncommon::select_form('iclicker','upfiletype',
                                   ('iclicker' => 'iClicker'));     ('iclicker' => 'i>clicker'));
   
     $result.=<<ENDUPFORM;      $result.=<<ENDUPFORM;
 <script type="text/javascript">  <script type="text/javascript">
Line 6269  sub process_clicker_file { Line 6270  sub process_clicker_file {
     if (!$symb) {return '';}      if (!$symb) {return '';}
     my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});      my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
     if (($env{'form.gradingmechanism'} eq 'specific') && ($env{'form.specificid'}!~/\w/)) {      if (($env{'form.gradingmechanism'} eq 'specific') && ($env{'form.specificid'}!~/\w/)) {
        $result.='<span class="LC_error">'.&mt('You need to specify a clicker ID for the correct answer').'</span>';   $result.='<span class="LC_error">'.&mt('You need to specify a clicker ID for the correct answer').'</span>';
        return $result.&show_grading_menu_form($symb);   return $result.&show_grading_menu_form($symb);
     }      }
     my %clickerids=&gather_clicker_ids();      my %clicker_ids=&gather_clicker_ids();
     my %correctids=();      my %correct_ids;
     if ($env{'form.gradingmechanism'} eq 'personnel') {      if ($env{'form.gradingmechanism'} eq 'personnel') {
        %correctids=&gather_adv_clicker_ids();   %correct_ids=&gather_adv_clicker_ids();
     }      }
     if ($env{'form.gradingmechanism'} eq 'specific') {      if ($env{'form.gradingmechanism'} eq 'specific') {
        my $correctid=$env{'form.specificid'};   my $correct_id=$env{'form.specificid'};
        $correctid=~tr/a-z/A-Z/;   $correct_id=~tr/a-z/A-Z/;
        $correctid=~s/\s//gs;   $correct_id=~s/\s//gs;
        $correctids{$correctid}='specified';   $correct_id=~s/^0+//;
    $correct_ids{$correct_id}='specified';
     }      }
     if ($env{'form.gradingmechanism'} eq 'attendance') {      if ($env{'form.gradingmechanism'} eq 'attendance') {
        $result.=&mt('Score based on attendance only');   $result.=&mt('Score based on attendance only');
     } else {      } else {
        my $number=0;   my $number=0;
        $result.='<h3>'.&mt('Correctness determined by the following IDs').'</h3>';   $result.='<p><b>'.&mt('Correctness determined by the following IDs').'</b>';
        foreach my $id (sort(keys(%correctids))) {   foreach my $id (sort(keys(%correct_ids))) {
           $result.='<tt>'.$id.'</tt> - ';      $result.='<br /><tt>'.$id.'</tt> - ';
           if ($correctids{$id} eq 'specified') {      if ($correct_ids{$id} eq 'specified') {
              $result.=&mt('specified');   $result.=&mt('specified');
           } else {      } else {
              my ($uname,$udom)=split(/\:/,$correctids{$id});   my ($uname,$udom)=split(/\:/,$correct_ids{$id});
              $result.=&Apache::loncommon::plainname($uname,$udom);   $result.=&Apache::loncommon::plainname($uname,$udom);
           }      }
           $result.='<br />';      $number++;
           $number++;   }
           $result.="</p>\n";
    if ($number==0) {
       $result.='<span class="LC_error">'.&mt('No IDs found to determine correct answer').'</span>';
       return $result.&show_grading_menu_form($symb);
    }
       }
       if (length($env{'form.upfile'}) < 2) {
           $result.=&mt('[_1] Error: [_2] The file you attempted to upload, [_3] contained no information. Please check that you entered the correct filename.',
        '<span class="LC_error">',
        '</span>',
        '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>');
           return $result.&show_grading_menu_form($symb);
       }
   
   # Were able to get all the info needed, now analyze the file
   
       $result.=&Apache::loncommon::studentbrowser_javascript();
       my $heading=&mt('Scanning clicker file');
       $result.=(<<ENDHEADER);
   <br /><table width="100%" border="0"><tr><td bgcolor="#777777">
   <table width="100%" border="0"><tr bgcolor="#e6ffff"><td>
   <b>$heading</b></td></tr><tr bgcolor=#ffffe6><td>
   <form method="post" action="/adm/grades" name="clickeranalysis">
   <input type="hidden" name="symb" value="$symb" />
   <input type="hidden" name="command" value="assignclickergrades" />
   <input type="hidden" name="probTitle" value="$env{'form.probTitle'}" />
   <input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
   <input type="hidden" name="gradingmechanism" value="$env{'form.gradingmechanism'}" />
   <input type="hidden" name="pcorrect" value="$env{'form.pcorrect'}" />
   <input type="hidden" name="pincorrect" value="$env{'form.pincorrect'}" />
   ENDHEADER
       my %responses;
       my @questiontitles;
       my $errormsg='';
       my $number=0;
       if ($env{'form.upfiletype'} eq 'iclicker') {
    ($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses);
       }
       $result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'.
                '<input type="hidden" name="number" value="'.$number.'" />'.
                &mt('Awarding [_1] percent for correct and [_2] percent for incorrect responses',
                    $env{'form.pcorrect'},$env{'form.pincorrect'}).
                '<br />';
       my $correct_count=0;
       my $student_count=0;
       my $unknown_count=0;
       foreach my $id (keys(%responses)) {
          if ($correct_ids{$id}) {
             $result.="\n".'<input type="hidden" name="correct:'.$correct_ids{$id}.'" value="'.$responses{$id}.'" />';
             $correct_count++;
          } elsif ($clicker_ids{$id}) {
             $result.="\n".'<input type="hidden" name="student:'.$clicker_ids{$id}.'" value="'.$responses{$id}.'" />';
             $student_count++;
          } else {
             $result.="\n<hr />".&mt('Unregistered Clicker')." <tt>".$id."</tt><br />";
             $result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'.
                      "\n".&mt("Username").": <input type='text' name='uname".$id."' />&nbsp;".
                      "\n".&mt("Domain").": ".
                      &Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).'&nbsp;'.
                      &Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id);
             $unknown_count++;
        }         }
        if ($number==0) {      }
           $result.='<span class="LC_error">'.&mt('No IDs found to determine correct answer').'</span>';      $result.='<hr />'.
           return $result.&show_grading_menu_form($symb);               &mt('Found [_1] registered and [_2] unregistered clickers.',$student_count,$unknown_count);
       if ($env{'form.gradingmechanism'} ne 'attendance') {
          if ($correct_count==0) {
             $errormsg.="Found no correct answers answers for grading!";
          } elsif ($correct_count>1) {
             $result.='<br /><span class="LC_warning">'.&mt("Found [_1] entries for grading!").'</span>';
        }         }
     }      }
       if ($errormsg) {
          $result.='<br /><span class="LC_error">'.&mt($errormsg).'</span>';
       } else {
          $result.='<br /><input type="submit" name="finalize" value="'.&mt('Finalize Grading').'" />';
       }
       $result.='</form></td></tr></table>'."\n".
                '</td></tr></table><br /><br />'."\n";
     return $result.&show_grading_menu_form($symb);      return $result.&show_grading_menu_form($symb);
 }  }
   
   sub iclicker_eval {
       my ($questiontitles,$responses)=@_;
       my $number=0;
       my $errormsg='';
       foreach my $line (split(/[\n\r]/,$env{'form.upfile'})) {
           my %components=&Apache::loncommon::record_sep($line);
           my @entries=map {$components{$_}} (sort(keys(%components)));
    if ($entries[0] eq 'Question') {
       for (my $i=3;$i<$#entries;$i+=6) {
    $$questiontitles[$number]=$entries[$i];
    $number++;
       }
    }
    if ($entries[0]=~/^\#/) {
       my $id=$entries[0];
       my @idresponses;
       $id=~s/^[\#0]+//;
       for (my $i=0;$i<$number;$i++) {
    my $idx=3+$i*6;
    push(@idresponses,$entries[$idx]);
       }
       $$responses{$id}=join(',',@idresponses);
    }
       }
       return ($errormsg,$number);
   }
   
 sub handler {  sub handler {
     my $request=$_[0];      my $request=$_[0];
   

Removed from v.1.404  
changed lines
  Added in v.1.412


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