Diff for /loncom/interface/lonquickgrades.pm between versions 1.53 and 1.71

version 1.53, 2010/12/03 15:19:09 version 1.71, 2011/02/20 23:57:35
Line 61  sub real_handler { Line 61  sub real_handler {
     &Apache::loncommon::no_cache($r);      &Apache::loncommon::no_cache($r);
     $r->send_http_header;      $r->send_http_header;
   
     my $showPoints =       my $showPoints =
         $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard';          $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard';
     my $notshowSPRSlink =       my $notshowSPRSlink =
         (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external')          (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external')
       || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals'));        || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals'));
     my $notshowTotals=      my $notshowTotals=
Line 72  sub real_handler { Line 72  sub real_handler {
         $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';          $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';
   
   
     # Header  
     my $title = "Grading and Statistics";#$showPoints ? "Points Display" : "Completed Problems Display";      my $title = "Grading and Statistics";#$showPoints ? "Points Display" : "Completed Problems Display";
     my $brcrum = [{href=>"/adm/quickgrades",text => "Points Display"}];      my $brcrum = [{href=>"/adm/quickgrades",text => "Points Display"}];
     $r->print(&Apache::loncommon::start_page($title,undef,      $r->print(&Apache::loncommon::start_page($title,undef,
                                             {'bread_crumbs' => $brcrum})                                              {'bread_crumbs' => $brcrum})
              );               );
   
     $r->print(&Apache::lonhtmlcommon::coursepreflink(&mt('Grade display settings'),'grading'));      &startGradeScreen($r,'quick');
   
     if (!$showPoints && !$notshowSPRSlink ) {  
         $r->print('<p>'  
                  .&mt('This screen shows how many problems (or problem parts) you have completed'  
                      .', and how many you have not yet done.'  
                      .' You can also look at [_1]a detailed score sheet[_2].'  
                      ,'<a href="/adm/studentcalc">','</a>')  
                  .'</p>');  
     }  
   
     $r->print('<p class="LC_info">'.&mt('This may take a few moments to display.').'</p>');  
   
     $r->rflush();      $r->rflush();
   
     my $uname='korte';  #    my $uname='korte';
     my $udom='gerd';  #    my $udom='gerd';
   
       my $uname;
       my $udom;
   
     my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=      my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=
        &getData($showPoints,$uname,$udom);         &getData($showPoints,$uname,$udom);
Line 107  sub real_handler { Line 98  sub real_handler {
        &outputTable($r,$showPoints,$notshowTotals,         &outputTable($r,$showPoints,$notshowTotals,
                  $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);                   $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
     }      }
       &endGradeScreen($r);
     return OK;      return OK;
   
 }  }
   
   sub startGradeScreen {
       my ($r,$mode)=@_;
   
       my $showPoints =
           $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard';
       my $notshowSPRSlink =
           (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external')
         || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals')
         || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories'));
       my $notshowTotals=
           $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals';
       my $showCategories=
           $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';
   
       my $allowed_to_view =  &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
       my $allowed_to_edit =  &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
   
       if ($allowed_to_view) {
          my @notes;
          push(@notes,&mt('Students do not see total points.')) if ($notshowTotals);
          push(@notes,&mt('Students do not see link to spreadsheet.')) if ($notshowSPRSlink);
          push(@notes,&mt('Students will see points based on problem weights.')) if ($showPoints);
          push(@notes,&mt('Students will see points based on categories.')) if ($showCategories);
          push(@notes, &Apache::lonhtmlcommon::coursepreflink(&mt('Grade display settings'),'grading'));
          $r->print(&Apache::loncommon::head_subbox(join('&nbsp;&nbsp;',@notes)));
       }
   
   
       $r->print("\n".'<ul class="LC_TabContentBigger" id="main">');
       $r->print("\n".'<li'.($mode eq 'quick'?' class="active"':'').'><a href="/adm/quickgrades"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.
                                             ($showPoints?&mt('Individual Points Overview'):($showCategories?&mt('Grades Overview'):&mt('Completion Overview'))).
                                             '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
   
       if (!($showPoints || $notshowSPRSlink) || ($allowed_to_view)) {
          $r->print("\n".'<li'.($mode eq 'spreadsheet'?' class="active"':'').'><a href="/adm/'.($allowed_to_view?'classcalc':'studentcalc').'"><b>'.
                                                                    &mt('Spreadsheet (Detailed)').'</b></a></li>');
       }
       if ($allowed_to_view) {
          $r->print("\n".'<li'.($mode eq 'statistics'?' class="active"':'').'><a href="/adm/statistics"><b>'.
                                                                    &mt('Statistics and Reports').'</b></a></li>');
   
          $r->print("\n".'<li'.($mode eq 'chart'?' class="active"':'').'><a href="/adm/statistics?reportSelected=student_assessment"><b>'.
                                                                    &mt('Assessment Overview Chart').'</b></a></li>');
   
       }
       if ($allowed_to_edit) {
          $r->print("\n".'<li'.($mode eq 'grading'?' class="active"':'').'><a href="/adm/grades"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.
                                                                    &mt('Content Grading').'&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
          if ($env{'form.symb'}) {
             $r->print("\n".'<li'.($mode eq 'probgrading'?' class="active"':'').'><a href="/adm/grades?symb='.
                                                 &Apache::lonhtmlcommon::entity_encode($env{'form.symb'}).
                                                 '&command=gradingmenu"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.
                                                 &mt('Problem Grading').'&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
   
          }
       }
       $r->print("\n".'</ul>'."\n");
       $r->print('<div class="LC_Box" style="clear:both;margin:0;"><div id="maincoursedoc" style="margin:0 0;padding:0 0;"><div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">');
   }
   
   sub endGradeScreen {
      my ($r)=@_;
      $r->print('</div></div></div>');
   }
   
   
 sub getData {  sub getData {
   
     my ($showPoints,$uname,$udom)=@_;      my ($showPoints,$uname,$udom)=@_;
   
     &Apache::lonnet::logthis("About to call with $uname $udom");  
   
     # Create the nav map      # Create the nav map
     my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom);      my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom);
   
Line 318  sub outputTable { Line 374  sub outputTable {
     # If there were any problems at the top level, print an extra "catchall"      # If there were any problems at the top level, print an extra "catchall"
     if ($topLevelParts > 0) {      if ($topLevelParts > 0) {
         my $ratio = $topLevelRight / $topLevelParts;          my $ratio = $topLevelRight / $topLevelParts;
         my $color = mixColors(\@start, \@end, $ratio);          my $color = &mixColors(\@start, \@end, $ratio);
         $r->print(&Apache::loncommon::start_data_table_row()          $r->print(&Apache::loncommon::start_data_table_row()
                  .'<td style="background-color:'.$color.';">');                   .'<td style="background-color:'.$color.';">');
         $r->print(&mt("Problems Not Contained In A Folder")."</td><td>");          $r->print(&mt("Problems Not Contained In A Folder")."</td><td>");
Line 330  sub outputTable { Line 386  sub outputTable {
 # show totals (if applicable), close table  # show totals (if applicable), close table
 #  #
     if ($showPoints) {      if ($showPoints) {
         my $maxHelpLink = Apache::loncommon::help_open_topic("Quick_Grades_Possibly_Correct");          my $maxHelpLink = &Apache::loncommon::help_open_topic("Quick_Grades_Possibly_Correct");
   
         $title = $showPoints ? "Points" : "Parts Done";          $title = $showPoints ? "Points" : "Parts Done";
         my $totaltitle = $showPoints ? &mt("Awarded Total Points") : &mt("Total Parts Done");          my $totaltitle = $showPoints ? &mt("Awarded Total Points") : &mt("Total Parts Done");
Line 348  sub outputTable { Line 404  sub outputTable {
 }  }
   
 #  #
 # Outputting category-based grades.  # === Outputting category-based grades.
   #
   # $category{'order'}: output order of categories by id
   # $category{'all'}: complete list of all categories 
   # $category{$id.'_name'}: display-name of category
 #  #
   
 sub outputCategories {  sub outputCategories {
   
     my ($r,$showPoints,$notshowTotals,      my ($r,$showPoints,$notshowTotals,
            $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=@_;             $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=@_;
   # Take care of storing and retrieving categories
   
       my $cangrade=&Apache::lonnet::allowed('mgr');
   
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my %categories=();
   # Loading old categories
       %categories=&Apache::lonnet::dump('grading_categories',$cdom,$cnum);
   # Storing
       if (($cangrade) && (($env{'form.storechanges'}) || ($env{'form.storemove'} ne ''))) {
   # Process the changes
           %categories=&process_category_edits($r,$cangrade,%categories);
   # Actually store
           &Apache::lonnet::logthis("Storing ".$categories{'order'});
           &Apache::lonnet::put('grading_categories',\%categories,$cdom,$cnum);
       }
   # new categories loaded now
   # Form only generated if user can change the grading categories
       if ($cangrade) {
           $r->print('<form method="post">');
       }
   #
       &output_category_table($r,$cangrade,$navmap,%categories);
   #
       if ($cangrade) {
           $r->print('<input type="hidden" name="storemove" value="" />'.
                     '<input type="submit" name="storechanges" value="'.&mt("Save changes to grading categories").'" /></form>');
       }
   }
   
   #
   # Process editing commands, update category hash
   #
   
   sub process_category_edits {
       my ($r,$cangrade,%categories)=@_;
       unless ($cangrade) { return %categories; }
       my $cmd=$env{'form.cmd'};
       if ($cmd eq 'createnewcat') {
           %categories=&make_new_category($r,$cangrade,undef,%categories);
       } elsif ($cmd=~/^delcat\_(.+)$/) {
           %categories=&del_category($1,$cangrade,%categories);
       } else {
   # Simply store the rest of the stuff
           foreach my $id (split(/\,/,$categories{'order'})) {
               %categories=&set_category_name($cangrade,$id,$env{'form.name_'.$id},%categories);
               %categories=&set_category_total($cangrade,$id,$env{'form.totaltype_'.$id},$env{'form.total_'.$id},%categories);
               %categories=&set_category_weight($cangrade,$id,$env{'form.weight_'.$id},%categories);
   # More changes here
           }
       }
       return %categories;
   }
   
   #
   # Output the table
   #
   
   sub output_category_table {
       my ($r,$cangrade,$navmaps,%categories)=@_;
       my $sum=0;
       my $total=0;
       $r->print(&Apache::loncommon::start_data_table());
   #
       &output_category_table_header($r,$cangrade);
   #
       my @order=split(/\,/,$categories{'order'});
   #
       my $maxpos=$#order;
       for (my $i=0;$i<=$maxpos;$i++) {
           my ($value,$weight)=&output_and_calc_category($r,$cangrade,$navmaps,$order[$i],$i,$maxpos,%categories);
           $sum+=$value*$weight;
           $total+=$weight;
       }
   #
       &bottom_line_category($r,$cangrade,$sum,$total);
   #
       $r->print(&Apache::loncommon::end_data_table());
       return $sum;
   }
   
   sub output_category_table_header {
       my ($r,$cangrade)=@_;
       $r->print(&Apache::loncommon::start_data_table_header_row());
       if ($cangrade) {
           $r->print('<th colspan="2">'.&mt("Move").'</th><th>'.&mt('Action').'</th>');
       }
       $r->print('<th>'.&mt('Category').'</th>'.
                 '<th>'.&mt('Contents').'</th>'.
                 '<th>'.&mt('Calculation').'</th>'.
                 '<th>'.&mt('Total Points').'</th>'.
                 '<th>'.&mt('Relative Weight').'</th>');
       $r->print(&Apache::loncommon::end_data_table_header_row());
   }
   
   
   #
   # Output one category to table
   #
   
   sub output_and_calc_category {
       my ($r,$cangrade,$navmaps,$id,$currentpos,$maxpos,%categories)=@_;
       my $value=0;
       my $weight=0;
       my $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
       my %lt=&Apache::lonlocal::texthash(
              'up' => 'Move Up',
              'dw' => 'Move Down');
       $r->print("\n".&Apache::loncommon::start_data_table_row());
   
       if ($cangrade) {
           $r->print(<<ENDMOVE);
   <td>
   <div class="LC_docs_entry_move">
     <a href='/adm/quickgrades?cmd=up_$id&storechanges=1'>
       <img src="${iconpath}move_up.gif" alt='$lt{'up'}' class="LC_icon" />
     </a>
   </div>
   <div class="LC_docs_entry_move">
     <a href='/adm/quickgrades?cmd=down_$id&storechanges=1'>
       <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' class="LC_icon" />
     </a>
   </div>
   </td>
   ENDMOVE
           $r->print("\n<td>\n<select name='newpos_$id' onchange='this.form.storemove.value=\"$id\";this.form.submit()'>");
           for (my $i=0;$i<=$maxpos;$i++) {
               if ($i==$currentpos) {
                   $r->print('<option value="" selected="selected">('.$i.')</option>');
               } else {
                   $r->print('<option value="'.$i.'">'.$i.'</option>');
               }
           }
           $r->print("\n</select>\n</td>\n");
           $r->print('<td><a href="/adm/quickgrades?cmd=delcat_'.$id.'&storechanges=1">'.&mt('Delete').'</a></td>');
           $r->print('<td><input type="text" name="name_'.$id.
                     '" value="'.&Apache::lonhtmlcommon::entity_encode($categories{$id.'_name'}).'" /></td>');
       } else {
           $r->print('<td>'.$categories{$id.'_name'}.'</td>');
       }
   # Content
   # FIXME: just placeholders
       if ($cangrade) {
          $r->print("<td>Content Edit</td>");
       } else {
          $r->print("<td>Content</td>");
       }
   # Calculation
   # FIXME: just placeholders
       if ($cangrade) {
          $r->print("<td>Calculation Edit</td>");
       } else {
          $r->print("<td>Calculation</td>");
       }
   # Total
       if ($cangrade) {
          $r->print('<td>'.
                     '<select name="totaltype_'.$id.'">'.
                     '<option value="default"'.($categories{$id.'_totaltype'} eq 'default'?' selected="selected"':'').'>'.&mt('default').'</option>'.
                     '<option value="typein"'.($categories{$id.'_totaltype'} eq 'typein'?' selected="selected"':'').'>'.&mt('Type-in value').'</option>'.
                     '</select>'.
                     '<input type="text" size="4" name="total_'.$id.
                     '" value="'.&Apache::lonhtmlcommon::entity_encode($categories{$id.'_total'}).'" /></td>');
       } else {
           $r->print('<td>'.($categories{$id.'_totaltype'} eq 'default'?&mt('default'):$categories{$id.'_total'}).'</td>');
       }
   # Weight
       if ($cangrade) {
          $r->print('<td>'.
                     '<input type="text" size="4" name="weight_'.$id.
                     '" value="'.&Apache::lonhtmlcommon::entity_encode($categories{$id.'_weight'}).'" /></td>');
       } else {
           $r->print('<td>'.$categories{$id.'_weight'}.'</td>');
       }
   
       return ($value,$weight);
   }
   
   #
   # Bottom line with grades
   #
   
   sub bottom_line_category {
       my ($r,$cangrade,$sum,$total)=@_;
       $r->print(&Apache::loncommon::start_data_table_row());
       if ($cangrade) {
           $r->print('<td colspan="3"><a href="/adm/quickgrades?cmd=createnewcat&storechanges=1">'.&mt('Create New Category').'</a></td>');
       }
       $r->print('<td colspan="5">'.&mt('Current:').$sum.'<br />'.&mt('Total:').$total.'<br /></td>');
   }
   
   #
   # Make one new category
   #
   
   sub make_new_category {
       my ($r,$cangrade,$ordernum,%categories)=@_;
       unless ($cangrade) { return %categories; }
   # Generate new ID
       my $id=time.'_'.$$.'_'.rand(10000);
   # Add new ID to list of all IDs ever created in this course
       $categories{'all'}.=','.$id;
       $categories{'all'}=~s/^\,//;
   # Add new ID to ordered list of displayed and evaluated categories
       $categories{'order'}.=','.$id;
       $categories{'order'}=~s/^\,//;
   # Move it into desired space
       if (defined($ordernum)) {
           %categories=&move_category($id,$cangrade,$ordernum,%categories);
       }
       $categories{$id.'_weight'}=0;
       $categories{$id.'_totaltype'}='default';
       return %categories;
   }
   
   #
   # Delete category
   #
   
   sub del_category {
      my ($id,$cangrade,%categories)=@_; 
      my @neworder=();
      foreach my $currentid (split(/\,/,$categories{'order'})) {
         unless ($currentid eq $id) {
            push(@neworder,$currentid);
         }
      }
      $categories{'order'}=join(',',@neworder);
      return %categories;
 }  }
   
   #
   # Move a category to a desired position n the display order
   #
   
   sub move_category {
       my ($id,$cangrade,$ordernum,%categories)=@_;
       unless ($cangrade) { return %categories; }
       my @order=split(/\,/,$categories{'order'});
   # Where is the index currently?
       my $currentpos=&current_pos_category($id,%categories);
       if (defined($currentpos)) {
           if ($currentpos<$ordernum) {
   # This is moving to a higher index
   # ....X1234....
   # ....1234X....
               for (my $i=$currentpos;$i<$ordernum;$i++) {
                   $order[$i]=$order[$i+1];
               }
               $order[$ordernum]=$id;
           }
           if ($currentpos>$ordernum) {
   # This is moving to a lower index
   # ....1234X....
   # ....X1234....
               for (my $i=$currentpos;$i>$ordernum;$i--) {
                   $order[$i]=$order[$i-1];
               }
               $order[$ordernum]=$id;
           }
       }
       $categories{'order'}=join(',',@order);
       return %categories;
   }
   
   #
   #  Find current postion of a category in the order
   #
   
   sub current_pos_category {
       my ($id,%categories)=@_;
       my @order=split(/\,/,$categories{'order'});
       for (my $i=0;$i<=$#order;$i++) {
           if ($order[$i] eq $id) { return $i; }
       }
   # not found
       return undef;
   }
   
   #
   # Set name of a category
   #
   sub set_category_name {
       my ($cangrade,$id,$name,%categories)=@_;
       unless ($cangrade) { return %categories; }
       $categories{$id.'_name'}=$name;
       return %categories;
   }
   
   #
   # Set total of a category
   #
   sub set_category_total {
       my ($cangrade,$id,$totaltype,$total,%categories)=@_;
       unless ($cangrade) { return %categories; }
       if (($categories{$id.'_total'} eq '') && ($total=~/\d/)) {
           $totaltype='typein';
       }
       $categories{$id.'_totaltype'}=$totaltype;
       if ($totaltype eq 'default') {
           $categories{$id.'_total'}='';
       } else {
           $total=~s/\D//gs;
           unless ($total) { $total=0; }
           $categories{$id.'_total'}=$total;
       }
       return %categories;
   }
   
   sub set_category_weight {
       my ($cangrade,$id,$weight,%categories)=@_;
       unless ($cangrade) { return %categories; }
       $weight=~s/\D//gs;
       unless ($weight) { $weight=0; }
       $categories{$id.'_weight'}=$weight;
       return %categories;
   }
   
   #
   # === end category-related
   #
   #
 # Pass this two refs to arrays for the start and end color, and a number  # Pass this two refs to arrays for the start and end color, and a number
 # from 0 to 1 for how much of the latter you want to mix in. It will  # from 0 to 1 for how much of the latter you want to mix in. It will
 # return a string ready to show ("#FFC309");  # return a string ready to show ("#FFC309");

Removed from v.1.53  
changed lines
  Added in v.1.71


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