version 1.79, 2002/01/22 10:05:24
|
version 1.80, 2002/02/04 10:30:58
|
Line 34
|
Line 34
|
# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17, |
# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17, |
# 10/16,10/17,10/20,11/05,11/28,12/27 Gerd Kortemeyer |
# 10/16,10/17,10/20,11/05,11/28,12/27 Gerd Kortemeyer |
# 01/14/02 Matthew |
# 01/14/02 Matthew |
|
# 02/04/02 Matthew |
|
|
|
# POD required stuff: |
|
|
|
=head1 NAME |
|
|
|
lonspreadsheet |
|
|
|
=head1 SYNOPSIS |
|
|
|
Spreadsheet interface to internal LON-CAPA data |
|
|
|
=head1 DESCRIPTION |
|
|
|
Lonspreadsheet provides course coordinators the ability to manage their |
|
students grades online. The students are able to view their own grades, but |
|
not the grades of their peers. The spreadsheet is highly customizable, |
|
offering the ability to use Perl code to manipulate data, as well as many |
|
built-in functions. |
|
|
|
|
|
=head2 Functions available to user of lonspreadsheet |
|
|
|
=over 4 |
|
|
|
=cut |
|
|
package Apache::lonspreadsheet; |
package Apache::lonspreadsheet; |
|
|
Line 215 sub mask {
|
Line 241 sub mask {
|
return '^'.$alpha.$num."\$"; |
return '^'.$alpha.$num."\$"; |
} |
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item UWCALC(hashname,modules,units,date) |
|
|
|
returns the proportion of the module |
|
weights not previously completed by the student. |
|
|
|
=over 4 |
|
|
|
=item hashname |
|
|
|
name of the hash the module dates have been inserted into |
|
|
|
=item modules |
|
|
|
reference to a cell which contains a comma deliminated list of modules |
|
covered by the assignment. |
|
|
|
=item units |
|
|
|
reference to a cell which contains a comma deliminated list of module |
|
weights with respect to the assignment |
|
|
|
=item date |
|
|
|
reference to a cell which contains the date the assignment was completed. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
|
sub UWCALC { |
|
my ($hashname,$modules,$units,$date) = @_; |
|
my @Modules = split(/,/,$modules); |
|
my @Units = split(/,/,$units); |
|
my $total_weight; |
|
foreach (@Units) { |
|
$total_weight += $_; |
|
} |
|
my $usum=0; |
|
for (my $i=0; $i<=$#Modules; $i++) { |
|
if (&HASH($hashname,$Modules[$i]) eq $date) { |
|
$usum += $Units[$i]; |
|
} |
|
} |
|
return $usum/$total_weight; |
|
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item CDLSUM(list) |
|
|
|
returns the sum of the elements in a cell which contains |
|
a Comma Deliminate List of numerical values. |
|
'list' is a reference to a cell which contains a comma deliminated list. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
|
sub CDLSUM { |
|
my ($list)=@_; |
|
my $sum; |
|
foreach (split/,/,$list) { |
|
$sum += $_; |
|
} |
|
return $sum; |
|
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item CDLITEM(list,index) |
|
|
|
returns the item at 'index' in a Comma Deliminated List. |
|
|
|
=over 4 |
|
|
|
=item list |
|
|
|
reference to a cell which contains a comma deliminated list. |
|
|
|
=item index |
|
|
|
the Perl index of the item requested (first element in list has |
|
an index of 0) |
|
|
|
=back |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
|
sub CDLITEM { |
|
my ($list,$index)=@_; |
|
my @Temp = split/,/,$list; |
|
return $Temp[$index]; |
|
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item CDLHASH(name,key,value) |
|
|
|
loads a comma deliminated list of keys into |
|
the hash 'name', all with a value of 'value'. |
|
|
|
=over 4 |
|
|
|
=item name |
|
|
|
name of the hash. |
|
|
|
=item key |
|
|
|
(a pointer to) a comma deliminated list of keys. |
|
|
|
=item value |
|
|
|
a single value to be entered for each key. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
|
sub CDLHASH { |
|
my ($name,$key,$value)=@_; |
|
my @Keys; |
|
my @Values; |
|
# Check to see if we have multiple $key values |
|
if ($key =~ /[A-z](\-[A-z])?\d+(\-\d+)?/) { |
|
my $keymask = &mask($key); |
|
# Assume the keys are addresses |
|
my @Temp = grep /$keymask/,keys(%v); |
|
@Keys = $v{@Temp}; |
|
} else { |
|
$Keys[0]= $key; |
|
} |
|
my @Temp; |
|
foreach $key (@Keys) { |
|
@Temp = (@Temp, split/,/,$key); |
|
} |
|
@Keys = @Temp; |
|
if ($value =~ /[A-z](\-[A-z])?\d+(\-\d+)?/) { |
|
my $valmask = &mask($value); |
|
my @Temp = grep /$valmask/,keys(%v); |
|
@Values =$v{@Temp}; |
|
} else { |
|
$Values[0]= $value; |
|
} |
|
$value = $Values[0]; |
|
# Add values to hash |
|
for (my $i = 0; $i<=$#Keys; $i++) { |
|
my $key = $Keys[$i]; |
|
if (! exists ($hashes{$name}->{$key})) { |
|
$hashes{$name}->{$key}->[0]=$value; |
|
} else { |
|
my @Temp = sort(@{$hashes{$name}->{$key}},$value); |
|
$hashes{$name}->{$key} = \@Temp; |
|
} |
|
} |
|
return "hash '$name' updated"; |
|
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item GETHASH(name,key,index) |
|
|
|
returns the element in hash 'name' |
|
reference by the key 'key', at index 'index' in the values list. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
|
sub GETHASH { |
|
my ($name,$key,$index)=@_; |
|
if (! defined($index)) { |
|
$index = 0; |
|
} |
|
if ($key =~ /^[A-z]\d+$/) { |
|
$key = $v{$key}; |
|
} |
|
return $hashes{$name}->{$key}->[$index]; |
|
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item CLEARHASH(name) |
|
|
|
clears all the values from the hash 'name' |
|
|
|
=item CLEARHASH(name,key) |
|
|
|
clears all the values from the hash 'name' associated with the given key. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
|
sub CLEARHASH { |
|
my ($name,$key)=@_; |
|
if (defined($key)) { |
|
if (exists($hashes{$name}->{$key})) { |
|
$hashes{$name}->{$key}=undef; |
|
return "hash '$name' key '$key' cleared"; |
|
} |
|
} else { |
|
if (exists($hashes{$name})) { |
|
$hashes{$name}=undef; |
|
return "hash '$name' cleared"; |
|
} |
|
} |
|
return "Error in clearing hash"; |
|
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item HASH(name,key,value) |
|
|
|
loads values into an internal hash. If a key |
|
already has a value associated with it, the values are sorted numerically. |
|
|
|
=item HASH(name,key) |
|
|
|
returns the 0th value in the hash 'name' associated with 'key'. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
|
sub HASH { |
|
my ($name,$key,$value)=@_; |
|
my @Keys; |
|
undef @Keys; |
|
my @Values; |
|
# Check to see if we have multiple $key values |
|
if ($key =~ /[A-z](\-[A-z])?\d+(\-\d+)?/) { |
|
my $keymask = &mask($key); |
|
# Assume the keys are addresses |
|
my @Temp = grep /$keymask/,keys(%v); |
|
@Keys = $v{@Temp}; |
|
} else { |
|
$Keys[0]= $key; |
|
} |
|
# If $value is empty, return the first value associated |
|
# with the first key. |
|
if (! $value) { |
|
return $hashes{$name}->{$Keys[0]}->[0]; |
|
} |
|
# Check to see if we have multiple $value(s) |
|
if ($value =~ /[A-z](\-[A-z])?\d+(\-\d+)?/) { |
|
my $valmask = &mask($value); |
|
my @Temp = grep /$valmask/,keys(%v); |
|
@Values =$v{@Temp}; |
|
} else { |
|
$Values[0]= $value; |
|
} |
|
# Add values to hash |
|
for (my $i = 0; $i<=$#Keys; $i++) { |
|
my $key = $Keys[$i]; |
|
my $value = ($i<=$#Values ? $Values[$i] : $Values[0]); |
|
if (! exists ($hashes{$name}->{$key})) { |
|
$hashes{$name}->{$key}->[0]=$value; |
|
} else { |
|
my @Temp = sort(@{$hashes{$name}->{$key}},$value); |
|
$hashes{$name}->{$key} = \@Temp; |
|
} |
|
} |
|
return $Values[-1]; |
|
} |
|
|
sub NUM { |
sub NUM { |
my $mask=mask(@_); |
my $mask=mask(@_); |
my $num= $#{@{grep(/$mask/,keys(%v))}}+1; |
my $num= $#{@{grep(/$mask/,keys(%v))}}+1; |