Diff for /loncom/interface/lonquickgrades.pm between versions 1.56 and 1.67

version 1.56, 2010/12/03 22:00:28 version 1.67, 2011/02/20 20:57:46
Line 121  sub startGradeScreen { Line 121  sub startGradeScreen {
     my $allowed_to_edit =  &Apache::lonnet::allowed('mgr',$env{'request.course.id'});      my $allowed_to_edit =  &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
   
     if ($allowed_to_view) {      if ($allowed_to_view) {
        $r->print('<div id="LC_head_subbox">');         my @notes;
        if ($notshowTotals)  { $r->print ('&nbsp;'.&mt('Students do not see total points.').'&nbsp;'); }         push(@notes,&mt('Students do not see total points.')) if ($notshowTotals);
        if ($notshowSPRSlink){ $r->print ('&nbsp;'.&mt('Students do not see link to spreadsheet.').'&nbsp;'); }         push(@notes,&mt('Students do not see link to spreadsheet.')) if ($notshowSPRSlink);
        if ($showPoints)     { $r->print ('&nbsp;'.&mt('Students will see points based on problem weights.').'&nbsp;'); }         push(@notes,&mt('Students will see points based on problem weights.')) if ($showPoints);
        if ($showCategories) { $r->print ('&nbsp;'.&mt('Students will see points based on categories.').'&nbsp;'); }         push(@notes,&mt('Students will see points based on categories.')) if ($showCategories);
        $r->print('&nbsp;'.&Apache::lonhtmlcommon::coursepreflink(&mt('Grade display settings'),'grading').'</div>');         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".'<ul class="LC_TabContentBigger" id="main">');
     $r->print("\n".'<li'.($mode eq 'quick'?' class="active"':'').'><a href="/adm/quickgrades"><b>'.      $r->print("\n".'<li'.($mode eq 'quick'?' class="active"':'').'><a href="/adm/quickgrades"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.
                                           ($showPoints?&mt('Points'):($showCategories?&mt('Grades'):&mt('Completion'))).'</b></a></li>');                                            ($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)) {      if (!($showPoints || $notshowSPRSlink) || ($allowed_to_view)) {
        $r->print("\n".'<li'.($mode eq 'spreadsheet'?' class="active"':'').'><a href="/adm/'.($allowed_to_view?'classcalc':'studentcalc').'"><b>'.         $r->print("\n".'<li'.($mode eq 'spreadsheet'?' class="active"':'').'><a href="/adm/'.($allowed_to_view?'classcalc':'studentcalc').'"><b>'.
                                                                  &mt('Spreadsheet').'</b></a></li>');                                                                   &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("\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;">');      $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;">');
Line 152  sub getData { Line 173  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 385  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);
       } 
   #
   # Business logic 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('Weight').'</th>'.
                 '<th>'.&mt('Percent Overall').'</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(&Apache::loncommon::end_data_table_row()."\n");
       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);
       }
       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 ($canedit,$id,$name,%categories)=@_;
       unless ($canedit) { return %categories; }
       $categories{$id.'_name'}=$name;
       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.56  
changed lines
  Added in v.1.67


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