--- loncom/interface/lonquickgrades.pm 2011/03/12 02:58:44 1.75 +++ loncom/interface/lonquickgrades.pm 2011/03/26 16:09:33 1.80 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Quick Student Grades Display # -# $Id: lonquickgrades.pm,v 1.75 2011/03/12 02:58:44 www Exp $ +# $Id: lonquickgrades.pm,v 1.80 2011/03/26 16:09:33 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -475,10 +475,12 @@ sub process_category_edits { unless ($cangrade) { return %categories; } # First store everything foreach my $id (split(/\,/,$categories{'order'})) { +# Set names, types, and weight (there is only one of each per category) %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 +# Set values for category rules (before names may change) + %categories=&set_category_rules($cangrade,$id,%categories); } # Now deal with commands @@ -495,6 +497,10 @@ sub process_category_edits { %categories=&add_category_content($1,$cangrade,$env{'form.addcont_'.$1.'_symb'},%categories); } elsif ($cmd=~/^delcont\_(.+)\_\_\_\_\_\_(.+)$/) { %categories=&del_category_content($1,$cangrade,$2,%categories); + } elsif ($cmd=~/^newrule\_(.+)$/) { + %categories=&add_calculation_rule($1,$cangrade,':',%categories); + } elsif ($cmd=~/^delrule\_(.+)\_\_\_\_\_\_(.*)$/) { + %categories=&del_calculation_rule($1,$cangrade,$2,%categories); } # Move to a new position my $moveid=$env{'form.storemove'}; @@ -607,12 +613,23 @@ ENDMOVE } $r->print(''); # Calculation -# FIXME: just placeholders + $r->print(''); if ($cangrade) { - $r->print("Calculation Edit"); - } else { - $r->print("Calculation"); + $r->print('
'.&new_calc_rule_form($id)); } + $r->print(''); + + # Total if ($cangrade) { $r->print(''. @@ -674,6 +691,89 @@ sub make_new_category { return %categories; } + +# === Calculation Rule Editing + +sub category_rule_codes { + return &Apache::lonlocal::texthash( + 'droplow' => 'Drop N lowest grade assignments', + 'drophigh' => 'Drop N highest grade assignments', + 'capabove' => 'Cap percentage above N percent', + 'capbelow' => 'Cap percentage below N percent'); +} + +sub pretty_prt_rule { + my ($cangrade,$id,$code,$value)=@_; + my $cid=$id.'_'.$code; + my %lt=&category_rule_codes(); + my $ret=''; + if ($cangrade) { + $ret.=' N='; + } else { + $ret.=$lt{$code}.'; N='.$value; + } + $ret.=''; + return $ret; +} + +sub new_calc_rule_form { + my ($id)=@_; + return ''.&mt('New Calculation Rule').''; +} + +# +# Add a calculation rule +# + +sub add_calculation_rule { + my ($id,$cangrade,$newcontent,%categories)=@_; + unless ($cangrade) { return %categories; } + my %newcontent=($newcontent => 1); + foreach my $current (split(/\,/,$categories{$id.'_calculations'})) { + $newcontent{$current}=1; + } + $categories{$id.'_calculations'}=join(',',sort(keys(%newcontent))); + return %categories; +} + +# +# Delete a calculation rule +# + +sub del_calculation_rule { + my ($id,$cangrade,$delcontent,%categories)=@_; + unless ($cangrade) { return %categories; } + my @newcontent=(); + foreach my $current (split(/\,/,$categories{$id.'_calculations'})) { + unless ($current=~/^\Q$delcontent\E\:/) { + push(@newcontent,$current); + } + } + $categories{$id.'_calculations'}=join(',',@newcontent); + return %categories; +} + +sub set_category_rules { + my ($cangrade,$id,%categories)=@_; + unless ($cangrade) { return %categories; } + my %lt=&category_rule_codes(); + my @newrules=(); + foreach my $code ('',(keys(%lt))) { + if ($env{'form.sel_'.$id.'_'.$code}) { + push(@newrules,$env{'form.sel_'.$id.'_'.$code}.':'.$env{'form.val_'.$id.'_'.$code}); + } + } + $categories{$id.'_calculations'}=join(',',sort(@newrules)); + return %categories; +} + + +# === Category Editing + # # Add to category content #