[LON-CAPA-cvs] cvs: loncom /interface lonspreadsheet.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Tue, 22 Oct 2002 13:09:49 -0000
This is a MIME encoded message
--matthew1035292189
Content-Type: text/plain
matthew Tue Oct 22 09:09:49 2002 EDT
Modified files:
/loncom/interface lonspreadsheet.pm
Log:
Now do csv output of student level spreadsheet.
This output is not complete yet since the sheet will sometimes end up
with links inside the csv output. Doing a recalculation sets it properly
since the labels for each row are determined on loading/calculation and
not on display.
--matthew1035292189
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20021022090949.txt"
Index: loncom/interface/lonspreadsheet.pm
diff -u loncom/interface/lonspreadsheet.pm:1.119 loncom/interface/lonspreadsheet.pm:1.120
--- loncom/interface/lonspreadsheet.pm:1.119 Mon Oct 21 13:59:36 2002
+++ loncom/interface/lonspreadsheet.pm Tue Oct 22 09:09:49 2002
@@ -1,5 +1,5 @@
#
-# $Id: lonspreadsheet.pm,v 1.119 2002/10/21 17:59:36 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.120 2002/10/22 13:09:49 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -951,25 +951,31 @@
#
sub outrowassess {
# $n is the current row number
- my $n=shift;
+ my $n=shift;
+ my $csv = shift;
my @cols=();
if ($n) {
my ($usy,$ufn)=split(/__&&&\__/,$f{'A'.$n});
if ($rowlabel{$usy}) {
- $cols[0]=$rowlabel{$usy}.'<br>'.
+ $cols[0]=$rowlabel{$usy};
+ if (! $csv) {
+ $cols[0].='<br>'.
'<select name="sel_'.$n.'" onChange="changesheet('.$n.')">'.
'<option name="default">Default</option>';
+ }
} else {
$cols[0]='';
}
- foreach (@os) {
- $cols[0].='<option name="'.$_.'"';
- if ($ufn eq $_) {
- $cols[0].=' selected';
+ if (! $csv) {
+ foreach (@os) {
+ $cols[0].='<option name="'.$_.'"';
+ if ($ufn eq $_) {
+ $cols[0].=' selected';
+ }
+ $cols[0].='>'.$_.'</option>';
}
- $cols[0].='>'.$_.'</option>';
+ $cols[0].='</select>';
}
- $cols[0].='</select>';
} else {
$cols[0]='<b><font size=+1>Export</font></b>';
}
@@ -1064,7 +1070,9 @@
# ------------------------------------------------------- Calculate spreadsheet
sub calcsheet {
my $sheet=shift;
- return $sheet->{'safe'}->reval('&calc();');
+ my $result = $sheet->{'safe'}->reval('&calc();');
+ %{$sheet->{'values'}} = %{$sheet->{'safe'}->varglob('sheet_values')};
+ return $result;
}
# ---------------------------------------------------------------- Get formulas
@@ -1131,7 +1139,7 @@
$n=-1;
$dataflag=1;
}
- foreach ($sheet->{'safe'}->reval($proc.'('.$n.')')) {
+ foreach ($sheet->{'safe'}->reval($proc.'('.$n.','.$ENV{'form.showcsv'}.')')) {
my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');
my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);
if ((($vl ne '') || ($vl eq '0')) &&
@@ -1653,7 +1661,7 @@
}
$existing{$f{$_}}=1;
unless ((defined($currentlist{$f{$_}})) || (!$1) ||
- ($f{$_}=~/^(\~\~\~|\-\-\-)/)) {
+ ($f{$_}=~/^(~~~|---)/)) {
$f{$_}='!!! Obsolete';
$changed=1;
}
@@ -1710,16 +1718,26 @@
if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})){
$adduserstr='&uname='.$uname.'&udom='.$udom;
}
- my %allassess =
- ('_feedback' =>'<a href="/adm/assesscalc?usymb=_feedback'.
- $adduserstr.'">Feedback</a>',
- '_evaluation' =>'<a href="/adm/assesscalc?usymb=_evaluation'.
- $adduserstr.'">Evaluation</a>',
- '_tutoring' =>'<a href="/adm/assesscalc?usymb=_tutoring'.
- $adduserstr.'">Tutoring</a>',
- '_discussion' =>'<a href="/adm/assesscalc?usymb=_discussion'.
- $adduserstr.'">Discussion</a>'
- );
+ my %allassess;
+ if (! $ENV{'form.showcsv'}) {
+ %allassess =
+ ('_feedback' =>'<a href="/adm/assesscalc?usymb=_feedback'.
+ $adduserstr.'">Feedback</a>',
+ '_evaluation' =>'<a href="/adm/assesscalc?usymb=_evaluation'.
+ $adduserstr.'">Evaluation</a>',
+ '_tutoring' =>'<a href="/adm/assesscalc?usymb=_tutoring'.
+ $adduserstr.'">Tutoring</a>',
+ '_discussion' =>'<a href="/adm/assesscalc?usymb=_discussion'.
+ $adduserstr.'">Discussion</a>'
+ );
+ } else {
+ %allassess =
+ ('_feedback' => "Feedback",
+ '_evaluation' => "Evaluation",
+ '_tutoring' => "Tutoring",
+ '_discussion' => "Discussion",
+ );
+ }
while (($_,undef) = each(%bighash)) {
next if ($_!~/^src\_(\d+)\.(\d+)$/);
my $mapid=$1;
@@ -1730,9 +1748,13 @@
my $symb=
&Apache::lonnet::declutter($bighash{'map_id_'.$mapid}).
'___'.$resid.'___'.&Apache::lonnet::declutter($srcf);
- $allassess{$symb}=
- '<a href="/adm/assesscalc?usymb='.$symb.$adduserstr.'">'.
- $bighash{'title_'.$id}.'</a>';
+ if (! $ENV{'form.showcsv'}) {
+ $allassess{$symb}=
+ '<a href="/adm/assesscalc?usymb='.$symb.$adduserstr.'">'.
+ $bighash{'title_'.$id}.'</a>';
+ } else {
+ $allassess{$symb}=$bighash{'title_'.$id};
+ }
next if ($stype ne 'assesscalc');
foreach my $key (split(/\,/,
&Apache::lonnet::metadata($srcf,'keys')
@@ -1780,7 +1802,7 @@
$existing{$usy}=1;
unless ((exists($sheet->{'rowlabel'}->{$usy}) &&
(defined($sheet->{'rowlabel'}->{$usy})) || (!$1) ||
- ($f{$_}=~/^(\~\~\~|\-\-\-)/))){
+ ($f{$_}=~/^(~~~|---)/))){
$f{$_}='!!! Obsolete';
$changed=1;
} elsif ($ufn) {
@@ -2113,7 +2135,7 @@
if ($ENV{'form.forcerecalc'}) { return 1; }
unless ($time) { return 1; }
if ($stype eq 'assesscalc') {
- my $map=(split(/\_\_\_/,$usymb))[0];
+ my $map=(split(/___/,$usymb))[0];
if (&checkthis('::assesscalc:',$time) ||
&checkthis('::assesscalc:'.$map,$time) ||
&checkthis('::assesscalc:'.$usymb,$time) ||
@@ -2132,14 +2154,10 @@
}
# ============================================================== Export handler
-#
-# Non-interactive call from with program
-#
-
sub exportsheet {
my ($uname,$udom,$stype,$usymb,$fn)=@_;
my @exportarr=();
- if (($usymb=~/^\_(\w+)/) && (!$fn)) {
+ if (defined($usymb) && ($usymb=~/^\_(\w+)/) && (!$fn)) {
$fn='default_'.$1;
}
#
@@ -2148,8 +2166,8 @@
my $key=$uname.':'.$udom.':'.$stype.':'.$usymb;
my $found='';
if ($oldsheets{$key}) {
- foreach (split(/\_\_\_\&\_\_\_/,$oldsheets{$key})) {
- my ($name,$value)=split(/\_\_\_\=\_\_\_/,$_);
+ foreach (split(/___&\___/,$oldsheets{$key})) {
+ my ($name,$value)=split(/___=___/,$_);
if ($name eq $fn) {
$found=$value;
}
@@ -2158,8 +2176,8 @@
unless ($found) {
&cachedssheets($uname,$udom,&Apache::lonnet::homeserver($uname,$udom));
if ($oldsheets{$key}) {
- foreach (split(/\_\_\_\&\_\_\_/,$oldsheets{$key})) {
- my ($name,$value)=split(/\_\_\_\=\_\_\_/,$_);
+ foreach (split(/___&\___/,$oldsheets{$key})) {
+ my ($name,$value)=split(/___=___/,$_);
if ($name eq $fn) {
$found=$value;
}
@@ -2178,72 +2196,65 @@
#
# Return what was cached
#
- @exportarr=split(/\_\_\_\;\_\_\_/,$found);
- } else {
- #
- # Not cached
- #
- my ($sheet)=&makenewsheet($uname,$udom,$stype,$usymb);
- &readsheet($sheet,$fn);
- &updatesheet($sheet);
- &loadrows($sheet);
- &calcsheet($sheet);
- @exportarr=&exportdata($sheet);
- #
- # Store now
- #
- my $cid=$ENV{'request.course.id'};
- my $current='';
- if ($stype eq 'studentcalc') {
- $current=&Apache::lonnet::reply('get:'.
- $ENV{'course.'.$cid.'.domain'}.':'.
- $ENV{'course.'.$cid.'.num'}.
- ':nohist_calculatedsheets:'.
- &Apache::lonnet::escape($key),
- $ENV{'course.'.$cid.'.home'});
- } else {
- $current=&Apache::lonnet::reply('get:'.$sheet->{'udom'}.':'.
- $sheet->{'uname'}.
- ':nohist_calculatedsheets_'.
- $ENV{'request.course.id'}.':'.
- &Apache::lonnet::escape($key),
- $sheet->{'uhome'});
- }
- my %currentlystored=();
- unless ($current=~/^error\:/) {
- foreach (split(/___&\___/,&Apache::lonnet::unescape($current))) {
- my ($name,$value)=split(/___=___/,$_);
- $currentlystored{$name}=$value;
- }
- }
- $currentlystored{$fn}=join('___;___',@exportarr);
- #
- my $newstore='';
- foreach (keys(%currentlystored)) {
- if ($newstore) { $newstore.='___&___'; }
- $newstore.=$_.'___=___'.$currentlystored{$_};
- }
- my $now=time;
- if ($stype eq 'studentcalc') {
- &Apache::lonnet::reply('put:'.
- $ENV{'course.'.$cid.'.domain'}.':'.
- $ENV{'course.'.$cid.'.num'}.
- ':nohist_calculatedsheets:'.
- &Apache::lonnet::escape($key).'='.
- &Apache::lonnet::escape($newstore).'&'.
- &Apache::lonnet::escape($key).'.time='.$now,
- $ENV{'course.'.$cid.'.home'});
- } else {
- &Apache::lonnet::reply('put:'.
- $sheet->{'udom'}.':'.
- $sheet->{'uname'}.
- ':nohist_calculatedsheets_'.
- $ENV{'request.course.id'}.':'.
- &Apache::lonnet::escape($key).'='.
- &Apache::lonnet::escape($newstore).'&'.
- &Apache::lonnet::escape($key).'.time='.$now,
- $sheet->{'uhome'});
- }
+ @exportarr=split(/___;___/,$found);
+ return @exportarr;
+ }
+ #
+ # Not cached
+ #
+ my ($sheet)=&makenewsheet($uname,$udom,$stype,$usymb);
+ &readsheet($sheet,$fn);
+ &updatesheet($sheet);
+ &loadrows($sheet);
+ &calcsheet($sheet);
+ @exportarr=&exportdata($sheet);
+ #
+ # Store now
+ #
+ my $cid=$ENV{'request.course.id'};
+ my $current='';
+ if ($stype eq 'studentcalc') {
+ $current=&Apache::lonnet::reply('get:'.
+ $ENV{'course.'.$cid.'.domain'}.':'.
+ $ENV{'course.'.$cid.'.num'}.
+ ':nohist_calculatedsheets:'.
+ &Apache::lonnet::escape($key),
+ $ENV{'course.'.$cid.'.home'});
+ } else {
+ $current=&Apache::lonnet::reply('get:'.$sheet->{'udom'}.':'.
+ $sheet->{'uname'}.
+ ':nohist_calculatedsheets_'.
+ $ENV{'request.course.id'}.':'.
+ &Apache::lonnet::escape($key),
+ $sheet->{'uhome'});
+ }
+ my %currentlystored=();
+ unless ($current=~/^error\:/) {
+ foreach (split(/___&\___/,&Apache::lonnet::unescape($current))) {
+ my ($name,$value)=split(/___=___/,$_);
+ $currentlystored{$name}=$value;
+ }
+ }
+ $currentlystored{$fn}=join('___;___',@exportarr);
+ #
+ my $newstore='';
+ foreach (keys(%currentlystored)) {
+ if ($newstore) { $newstore.='___&___'; }
+ $newstore.=$_.'___=___'.$currentlystored{$_};
+ }
+ my $now=time;
+ if ($stype eq 'studentcalc') {
+ &Apache::lonnet::put('nohist_calculatedsheets',
+ { $key => $newstore,
+ $key.time => $now },
+ $ENV{'course.'.$cid.'.domain'},
+ $ENV{'course.'.$cid.'.num'})
+ } else {
+ &Apache::lonnet::put('nohist_calculatedsheets_'.$sheet->{'cid'},
+ { $key => $newstore,
+ $key.time => $now },
+ $sheet->{'udom'},
+ $sheet->{'uname'})
}
return @exportarr;
}
@@ -2451,7 +2462,7 @@
&readsheet($sheet,$ENV{'form.ufn'});
}
# Print out user information
- unless ($sheet->{'sheettype'} eq 'classcalc') {
+ if ($sheet->{'sheettype'} ne 'classcalc') {
$r->print('<p><b>User:</b> '.$sheet->{'uname'}.
'<br><b>Domain:</b> '.$sheet->{'udom'});
$r->print('<br><b>Section/Group:</b> '.$sheet->{'csec'});
@@ -2564,7 +2575,7 @@
$r->print('<br>Show rows with empty A column: ');
} else {
$r->print('<br>Show empty rows: ');
- }
+ }
#
$r->print(&hiddenfield('userselhidden','true').
'<input type="checkbox" name="showall" onClick="submit()"');
@@ -2581,19 +2592,19 @@
}
}
$r->print('>');
+ #
+ # CSV format checkbox (classcalc sheets only)
+ $r->print(' Output CSV format: <input type="checkbox" '.
+ 'name="showcsv" onClick="submit()"');
+ $r->print(' checked') if ($ENV{'form.showcsv'});
+ $r->print('>');
if ($sheet->{'sheettype'} eq 'classcalc') {
- #
- # CSV format checkbox (classcalc sheets only)
- $r->print(' Output CSV format: <input type="checkbox" '.
- 'name="showcsv" onClick="submit()"');
- if ($ENV{'form.showcsv'}) { $r->print(' checked'); }
- $r->print('>');
- #
- # Buttons to insert rows
$r->print(' Student Status: '.
&Apache::lonhtmlcommon::StatusOptions
($ENV{'form.Status'},'sheet'));
}
+ #
+ # Buttons to insert rows
$r->print(<<ENDINSERTBUTTONS);
<br>
<input type='button' onClick='insertrow("top");'
--matthew1035292189--