version 1.64, 2011/01/21 16:28:32
|
version 1.68, 2011/02/20 21:56:25
|
Line 150 sub startGradeScreen {
|
Line 150 sub startGradeScreen {
|
} |
} |
if ($allowed_to_edit) { |
if ($allowed_to_edit) { |
$r->print("\n".'<li'.($mode eq 'grading'?' class="active"':'').'><a href="/adm/grades"><b> '. |
$r->print("\n".'<li'.($mode eq 'grading'?' class="active"':'').'><a href="/adm/grades"><b> '. |
&mt('Problem Grading').' </b></a></li>'); |
&mt('Content Grading').' </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> '. |
|
&mt('Problem Grading').' </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 166 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 369 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 381 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 399 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 { |
Line 413 sub outputCategories {
|
Line 422 sub outputCategories {
|
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'}; |
my %categories=(); |
my %categories=(); |
|
# Loading old categories |
|
%categories=&Apache::lonnet::dump('grading_categories',$cdom,$cnum); |
# Storing |
# Storing |
if (($cangrade) && ($env{'form.storechanges'})) { |
if (($cangrade) && (($env{'form.storechanges'}) || ($env{'form.storemove'} ne ''))) { |
|
# Process the changes |
|
%categories=&process_category_edits($r,$cangrade,%categories); |
# Actually store |
# Actually store |
|
&Apache::lonnet::logthis("Storing ".$categories{'order'}); |
&Apache::lonnet::put('grading_categories',\%categories,$cdom,$cnum); |
&Apache::lonnet::put('grading_categories',\%categories,$cdom,$cnum); |
} else { |
|
# Loading |
|
%categories=&Apache::lonnet::dump('grading_categories',$cdom,$cnum); |
|
} |
} |
# categories loaded now |
# new categories loaded now |
# Form only generated if user can change the grading categories |
# Form only generated if user can change the grading categories |
if ($cangrade) { |
if ($cangrade) { |
$r->print('<form method="post">'); |
$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); |
|
} |
|
if ($cmd=~/^delcat\_(.+)$/) { |
|
my $id=$1; |
|
%categories=&del_category($id,$cangrade,%categories); |
|
} |
# |
# |
# Business logic here |
# Business logic here |
# |
# |
if ($cangrade) { |
return %categories; |
$r->print('<input type="submit" name="storechanges" value="'.&mt("Save changes to grading categories").'" /></form>'); |
} |
|
|
|
# |
|
# 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('<td><a href="/adm/quickgrades?cmd=delcat_'.$id.'&storechanges=1">'.&mt('Delete').'</a></td>'); |
|
|
|
} |
|
$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; |
|
} |
|
|
|
# |
|
# 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=¤t_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"); |