version 1.18, 2000/12/18 17:14:49
|
version 1.26, 2001/01/01 20:52:10
|
Line 2
|
Line 2
|
# Spreadsheet/Grades Display Handler |
# Spreadsheet/Grades Display Handler |
# |
# |
# 11/11,11/15,11/27,12/04,12/05,12/06,12/07, |
# 11/11,11/15,11/27,12/04,12/05,12/06,12/07, |
# 12/08,12/09,12/11,12/12,12/15,12/16,12/18 Gerd Kortemeyer |
# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30, |
|
# 01/01/01 Gerd Kortemeyer |
|
|
package Apache::lonspreadsheet; |
package Apache::lonspreadsheet; |
|
|
Line 12 use Safe::Hole;
|
Line 13 use Safe::Hole;
|
use Opcode; |
use Opcode; |
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use HTML::TokeParser; |
|
use GDBM_File; |
use GDBM_File; |
|
use HTML::TokeParser; |
|
|
# |
# |
# These cache hashes need to be independent of user, resource and course |
# These cache hashes need to be independent of user, resource and course |
Line 267 sub sett {
|
Line 268 sub sett {
|
$pattern='[A-Z]'; |
$pattern='[A-Z]'; |
} |
} |
map { |
map { |
if ($f{$_}) { |
if ($_=~/template\_(\w)/) { |
|
my $col=$1; |
|
unless ($col=~/^$pattern/) { |
|
map { |
|
if ($_=~/A(\d+)/) { |
|
my $trow=$1; |
|
if ($trow) { |
|
my $lb=$col.$trow; |
|
$t{$lb}=$f{'template_'.$col}; |
|
$t{$lb}=~s/\#/$trow/g; |
|
$t{$lb}=~s/\.\.+/\,/g; |
|
$t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; |
|
} |
|
} |
|
} keys %f; |
|
} |
|
} |
|
} keys %f; |
|
map { |
|
if (($f{$_}) && ($_!~/template\_/)) { |
if ($_=~/^$pattern/) { |
if ($_=~/^$pattern/) { |
unless ($f{$_}=~/^\!/) { |
unless ($f{$_}=~/^\!/) { |
$t{$_}=$c{$_}; |
$t{$_}=$c{$_}; |
Line 309 sub calc {
|
Line 329 sub calc {
|
return ''; |
return ''; |
} |
} |
|
|
|
sub templaterow { |
|
my @cols=(); |
|
$cols[0]='<b><font size=+1>Template</font></b>'; |
|
map { |
|
my $fm=$f{'template_'.$_}; |
|
$fm=~s/[\'\"]/\&\#34;/g; |
|
$cols[$#cols+1]="'template_$_','$fm'".'___eq___'.$fm; |
|
} ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
|
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
|
'a','b','c','d','e','f','g','h','i','j','k','l','m', |
|
'n','o','p','q','r','s','t','u','v','w','x','y','z'); |
|
return @cols; |
|
} |
|
|
sub outrowassess { |
sub outrowassess { |
my $n=shift; |
my $n=shift; |
my @cols=(); |
my @cols=(); |
Line 332 sub outrow {
|
Line 366 sub outrow {
|
my $n=shift; |
my $n=shift; |
my @cols=(); |
my @cols=(); |
if ($n) { |
if ($n) { |
$cols[0]=$rl{$f{'A'.$n}}.' stuff'; |
$cols[0]=$rl{$f{'A'.$n}}; |
} else { |
} else { |
$cols[0]='<b><font size=+1>Export</font></b>'; |
$cols[0]='<b><font size=+1>Export</font></b>'; |
} |
} |
Line 461 sub exportrow {
|
Line 495 sub exportrow {
|
|
|
sub rown { |
sub rown { |
my ($safeeval,$n)=@_; |
my ($safeeval,$n)=@_; |
my $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; |
my $defaultbg; |
my $rowdata="\n<tr><td><b><font size=+1>$n</font></b></td>"; |
my $rowdata=''; |
|
unless ($n eq '-') { |
|
$defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; |
|
} else { |
|
$defaultbg='#E0FF'; |
|
} |
|
if ((($n-1)/25)==int(($n-1)/25)) { |
|
my $what='Student'; |
|
if (&gettype($safeeval) eq 'assesscalc') { |
|
$what='Item'; |
|
} elsif (&gettype($safeeval) eq 'studentcalc') { |
|
$what='Assessment'; |
|
} |
|
$rowdata.="</table>\n<br><table border=2>". |
|
'<tr><td> <td>'.$what.'</td>'; |
|
map { |
|
$rowdata.='<td>'.$_.'</td>'; |
|
} ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
|
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
|
'a','b','c','d','e','f','g','h','i','j','k','l','m', |
|
'n','o','p','q','r','s','t','u','v','w','x','y','z'); |
|
$rowdata.='</tr>'; |
|
} |
|
$rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>"; |
my $showf=0; |
my $showf=0; |
my $proc; |
my $proc; |
my $maxred; |
my $maxred; |
Line 473 sub rown {
|
Line 530 sub rown {
|
$proc='&outrow'; |
$proc='&outrow'; |
$maxred=26; |
$maxred=26; |
} |
} |
|
if ($n eq '-') { $proc='&templaterow'; $n=-1; } |
map { |
map { |
my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); |
my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); |
my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); |
my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); |
Line 497 sub rown {
|
Line 555 sub rown {
|
# ------------------------------------------------------------- Print out sheet |
# ------------------------------------------------------------- Print out sheet |
|
|
sub outsheet { |
sub outsheet { |
my $safeeval=shift; |
my ($r,$safeeval)=@_; |
my $maxred; |
my $maxred; |
my $realm; |
my $realm; |
if (&gettype($safeeval) eq 'assesscalc') { |
if (&gettype($safeeval) eq 'assesscalc') { |
Line 511 sub outsheet {
|
Line 569 sub outsheet {
|
$realm='Course'; |
$realm='Course'; |
} |
} |
my $maxyellow=52-$maxred; |
my $maxyellow=52-$maxred; |
my $tabledata='<table border=2><tr><th colspan=2 rowspan=2><font size=+2>'. |
my $tabledata= |
|
'<table border=2><tr><th colspan=2 rowspan=2><font size=+2>'. |
$realm.'</font></th>'. |
$realm.'</font></th>'. |
'<td bgcolor=#FFDDDD colspan='.$maxred. |
'<td bgcolor=#FFDDDD colspan='.$maxred. |
'><b><font size=+1>Import</font></b></td>'. |
'><b><font size=+1>Import</font></b></td>'. |
Line 533 sub outsheet {
|
Line 592 sub outsheet {
|
$tabledata.='</tr>'; |
$tabledata.='</tr>'; |
my $row; |
my $row; |
my $maxrow=&getmaxrow($safeeval); |
my $maxrow=&getmaxrow($safeeval); |
|
$tabledata.=&rown($safeeval,'-'); |
|
$r->print($tabledata); |
for ($row=0;$row<=$maxrow;$row++) { |
for ($row=0;$row<=$maxrow;$row++) { |
$tabledata.=&rown($safeeval,$row); |
$r->print(&rown($safeeval,$row)); |
} |
} |
$tabledata.='</table>'; |
$r->print('</table>'); |
} |
} |
|
|
|
|
|
|
# --------------------------------------- Read spreadsheet formulas from a file |
# ------------------------------------- Read spreadsheet formulas from a course |
|
|
sub readsheet { |
sub readsheet { |
my ($safeeval,$fn)=@_; |
my ($safeeval,$fn,$r)=@_; |
&setfilename($safeeval,$fn); |
|
$fn=~/\.(\w+)/; |
|
&settype($safeeval,$1); |
|
my %f=(); |
my %f=(); |
unless ($spreadsheets{$fn}) { |
if (($fn eq '') || ($fn=~/^default\_/)) { |
$spreadsheets{$fn}=''; |
my $sheetxml=''; |
{ |
{ |
my $fh; |
my $fh; |
if ($fh=Apache::File->new($fn)) { |
if ($fh=Apache::File->new($r->dir_config('lonIncludes'). |
$spreadsheets{$fn}=join('',<$fh>); |
'/default.'.&gettype($safeeval))) { |
} |
$sheetxml=join('',<$fh>); |
|
} |
} |
} |
|
my $parser=HTML::TokeParser->new(\$sheetxml); |
|
my $token; |
|
while ($token=$parser->get_token) { |
|
if ($token->[0] eq 'S') { |
|
if ($token->[1] eq 'field') { |
|
$f{$token->[2]->{'col'}.$token->[2]->{'row'}}= |
|
$parser->get_text('/field'); |
|
} |
|
if ($token->[1] eq 'template') { |
|
$f{'template_'.$token->[2]->{'col'}}= |
|
$parser->get_text('/template'); |
|
} |
|
} |
|
} |
|
&setfilename($safeeval,'default_'.&gettype($safeeval)); |
|
} else { |
|
&setfilename($safeeval,$fn); |
|
unless ($spreadsheets{$fn}) { |
|
$spreadsheets{$fn}=''; |
|
my $reply=&Apache::lonnet::reply('dump:'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn, |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
unless ($reply=~/^error\:/) { |
|
$spreadsheets{$fn}=$reply; |
|
} |
|
} |
|
map { |
|
my ($name,$value)=split(/\=/,$_); |
|
$f{&Apache::lonnet::unescape($name)}= |
|
&Apache::lonnet::unescape($value); |
|
} split(/\&/,$spreadsheets{$fn}); |
} |
} |
{ |
|
my $parser=HTML::TokeParser->new(\$spreadsheets{$fn}); |
|
my $token; |
|
while ($token=$parser->get_token) { |
|
if ($token->[0] eq 'S') { |
|
if ($token->[1] eq 'field') { |
|
$f{$token->[2]->{'col'}.$token->[2]->{'row'}}= |
|
$parser->get_text('/field'); |
|
} |
|
} |
|
} |
|
} |
|
&setformulas($safeeval,%f); |
&setformulas($safeeval,%f); |
} |
} |
|
|
|
# ------------------------------------------------------------ Save spreadsheet |
|
|
|
sub writesheet { |
|
my $safeeval=shift; |
|
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
|
my %f=&getformulas($safeeval); |
|
my $sheetdata=''; |
|
map { |
|
$sheetdata.=&Apache::lonnet::escape($_).'='. |
|
&Apache::lonnet::escape($f{$_}).'&'; |
|
} keys %f; |
|
$sheetdata=~s/\&$//; |
|
my $reply=&Apache::lonnet::reply('put:'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'. |
|
&getfilename($safeeval).':'. |
|
$sheetdata, |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
if ($reply eq 'ok') { |
|
return &Apache::lonnet::reply('put:'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'. |
|
&gettype($safeeval).'_spreadsheets:'. |
|
&Apache::lonnet::escape(&getfilename($safeeval)).'='. |
|
$ENV{'user.name'}, |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
} else { |
|
return $reply; |
|
} |
|
} |
|
return 'unauthorized'; |
|
} |
|
|
# ----------------------------------------------- Make a temp copy of the sheet |
# ----------------------------------------------- Make a temp copy of the sheet |
|
|
sub tmpwrite { |
sub tmpwrite { |
my ($safeeval,$tmpdir,$symb)=@_; |
my ($safeeval,$tmpdir,$symb)=@_; |
my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval); |
my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval); |
$fn=~s/\W/\_/g; |
$fn=~s/\W/\_/g; |
$fn=$tmpdir.$fn.'.tmp'; |
$fn=$tmpdir.$fn.'.tmp'; |
my $fh; |
my $fh; |
Line 590 sub tmpwrite {
|
Line 703 sub tmpwrite {
|
|
|
sub tmpread { |
sub tmpread { |
my ($safeeval,$tmpdir,$symb,$nfield,$nform)=@_; |
my ($safeeval,$tmpdir,$symb,$nfield,$nform)=@_; |
my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval); |
my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval); |
$fn=~s/\W/\_/g; |
$fn=~s/\W/\_/g; |
$fn=$tmpdir.$fn.'.tmp'; |
$fn=$tmpdir.$fn.'.tmp'; |
my $fh; |
my $fh; |
Line 604 sub tmpread {
|
Line 717 sub tmpread {
|
$fo{$name}=$value; |
$fo{$name}=$value; |
} |
} |
} |
} |
$fo{$nfield}=$nform; |
if ($nfield) { $fo{$nfield}=$nform; } |
&setformulas($safeeval,%fo); |
&setformulas($safeeval,%fo); |
} |
} |
|
|
Line 711 sub parmval {
|
Line 824 sub parmval {
|
|
|
} |
} |
|
|
|
# ---------------------------------------------- Update rows for course listing |
|
|
|
sub updatestudentrows { |
|
my $safeeval=shift; |
|
my $cid=$ENV{'request.course.id'}; |
|
my $classlst=&Apache::lonnet::reply |
|
('dump:'.$ENV{'course.'.$cid.'.domain'}.':'. |
|
$ENV{'course.'.$cid.'.num'}.':classlist', |
|
$ENV{'course.'.$cid.'.home'}); |
|
my %currentlist=(); |
|
my $now=time; |
|
unless ($classlst=~/^error\:/) { |
|
map { |
|
my ($name,$value)=split(/\=/,$_); |
|
my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value)); |
|
my $active=1; |
|
if (($end) && ($now>$end)) { $active=0; } |
|
if ($active) { |
|
my $rowlabel=''; |
|
$name=&Apache::lonnet::unescape($name); |
|
my ($cname,$cdom)=split(/\:/,$name); |
|
my $csec= |
|
&Apache::lonnet::usection($cdom,$cname,$ENV{'request.course.id'}); |
|
if ($csec==-1) { |
|
$rowlabel='<font color=red>Data not available: '.$name. |
|
'</font>'; |
|
} else { |
|
my %reply=&Apache::lonnet::idrget($cdom,$cname); |
|
my $reply=&Apache::lonnet::reply('get:'.$cdom.':'.$cname. |
|
':environment:firstname&middlename&lastname&generation', |
|
&Apache::lonnet::homeserver($cname,$cdom)); |
|
$rowlabel=$csec.' '.$reply{$cname}.'<br>'; |
|
map { |
|
$rowlabel.=&Apache::lonnet::unescape($_).' '; |
|
} split(/\&/,$reply); |
|
} |
|
|
|
$currentlist{&Apache::lonnet::unescape($name)}=$rowlabel; |
|
} |
|
} split(/\&/,$classlst); |
|
# |
|
# -------------------- Find discrepancies between the course row table and this |
|
# |
|
my %f=&getformulas($safeeval); |
|
my $changed=0; |
|
|
|
my $maxrow=0; |
|
my %existing=(); |
|
|
|
# ----------------------------------------------------------- Now obsolete rows |
|
map { |
|
if ($_=~/^A(\d+)/) { |
|
$maxrow=($1>$maxrow)?$1:$maxrow; |
|
$existing{$f{$_}}=1; |
|
unless ((defined($currentlist{$f{$_}})) || (!$1)) { |
|
$f{$_}='!!! Obsolete'; |
|
$changed=1; |
|
} |
|
} |
|
} keys %f; |
|
|
|
# -------------------------------------------------------- New and unknown keys |
|
|
|
map { |
|
unless ($existing{$_}) { |
|
$changed=1; |
|
$maxrow++; |
|
$f{'A'.$maxrow}=$_; |
|
} |
|
} sort keys %currentlist; |
|
|
|
if ($changed) { &setformulas($safeeval,%f); } |
|
|
|
&setmaxrow($safeeval,$maxrow); |
|
&setrowlabels($safeeval,%currentlist); |
|
|
|
} else { |
|
return 'Could not access course data'; |
|
} |
|
} |
# ----------------------------------------------------------------- Update rows |
# ----------------------------------------------------------------- Update rows |
|
|
sub updaterows { |
sub updaterows { |
Line 810 sub updaterows {
|
Line 1002 sub updaterows {
|
} |
} |
} |
} |
|
|
# --------------------------------------------------- Load data for one student |
# ------------------------------------------------ Load data for one assessment |
|
|
sub rowazstudent { |
sub rowazstudent { |
my $safeeval=shift; |
my $safeeval=shift; |
Line 822 sub rowazstudent {
|
Line 1014 sub rowazstudent {
|
unless ($f{$_}=~/^\!/) { |
unless ($f{$_}=~/^\!/) { |
my @assessdata=split(/\_\_\_\;\_\_\_/, |
my @assessdata=split(/\_\_\_\;\_\_\_/, |
&Apache::lonnet::ssi( |
&Apache::lonnet::ssi( |
'/res/msu/korte/junk.assesscalc',('utarget' => 'export', |
'/adm/assesscalc',('utarget' => 'export', |
'uname' => $uname, |
'uname' => $uname, |
'udom' => $udom, |
'udom' => $udom, |
'usymb' => $f{$_}))); |
'usymb' => $f{$_}))); |
Line 844 sub rowazstudent {
|
Line 1036 sub rowazstudent {
|
&setconstants($safeeval,%c); |
&setconstants($safeeval,%c); |
} |
} |
|
|
|
# --------------------------------------------------- Load data for one student |
|
|
|
sub rowazclass { |
|
my $safeeval=shift; |
|
my %c=(); |
|
my %f=&getformulas($safeeval); |
|
map { |
|
if ($_=~/^A(\d+)/) { |
|
my $row=$1; |
|
unless ($f{$_}=~/^\!/) { |
|
my ($tname,$tdom)=split(/\:/,$_); |
|
my @assessdata=split(/\_\_\_\;\_\_\_/, |
|
&Apache::lonnet::ssi( |
|
'/adm/studentcalc',('utarget' => 'export', |
|
'uname' => $tname, |
|
'udom' => $tdom))); |
|
my $index=0; |
|
map { |
|
if ($assessdata[$index]) { |
|
$c{$_.$row}=$assessdata[$index]; |
|
unless ($_ eq 'A') { |
|
$f{$_.$row}='import'; |
|
} |
|
} |
|
$index++; |
|
} ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
|
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); |
|
} |
|
} |
|
} keys %f; |
|
&setformulas($safeeval,%f); |
|
&setconstants($safeeval,%c); |
|
} |
|
|
# ------------------------------------------------ Load data for one assessment |
# ------------------------------------------------ Load data for one assessment |
|
|
sub rowaassess { |
sub rowaassess { |
Line 981 sub handler {
|
Line 1207 sub handler {
|
my ($name, $value) = split(/=/,$_); |
my ($name, $value) = split(/=/,$_); |
$value =~ tr/+/ /; |
$value =~ tr/+/ /; |
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; |
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; |
if (($name eq 'uname') || ($name eq 'udom') || ($name eq 'usymb')) { |
if (($name eq 'uname') || ($name eq 'udom') || |
|
($name eq 'usymb') || ($name eq 'ufn')) { |
unless ($ENV{'form.'.$name}) { |
unless ($ENV{'form.'.$name}) { |
$ENV{'form.'.$name}=$value; |
$ENV{'form.'.$name}=$value; |
} |
} |
Line 989 sub handler {
|
Line 1216 sub handler {
|
} (split(/&/,$ENV{'QUERY_STRING'})); |
} (split(/&/,$ENV{'QUERY_STRING'})); |
|
|
# ------------------------------------------- Nothing there? Must be login user |
# ------------------------------------------- Nothing there? Must be login user |
|
|
unless ($ENV{'form.uname'}) { |
unless ($ENV{'form.uname'}) { |
$uname=$ENV{'user.name'}; |
$uname=$ENV{'user.name'}; |
$udom=$ENV{'user.domain'}; |
$udom=$ENV{'user.domain'}; |
Line 1027 sub handler {
|
Line 1253 sub handler {
|
</script> |
</script> |
ENDSCRIPT |
ENDSCRIPT |
$r->print('</head><body bgcolor="#FFFFFF">'. |
$r->print('</head><body bgcolor="#FFFFFF">'. |
|
'<img align=right src=/adm/lonIcons/lonlogos.gif>'. |
|
'<h1>LON-CAPA Spreadsheet</h1>'. |
'<form action="'.$r->uri.'" name=sheet method=post>'. |
'<form action="'.$r->uri.'" name=sheet method=post>'. |
&hiddenfield('uname',$ENV{'form.uname'}). |
&hiddenfield('uname',$ENV{'form.uname'}). |
&hiddenfield('udom',$ENV{'form.udom'}). |
&hiddenfield('udom',$ENV{'form.udom'}). |
Line 1034 ENDSCRIPT
|
Line 1262 ENDSCRIPT
|
&hiddenfield('unewfield',''). |
&hiddenfield('unewfield',''). |
&hiddenfield('unewformula','')); |
&hiddenfield('unewformula','')); |
} |
} |
|
$r->rflush(); |
# ---------------------------------------- Read new sheet or modified worksheet |
# ---------------------------------------- Read new sheet or modified worksheet |
|
|
my $sheetone=initsheet(); |
my $sheetone=initsheet(); |
|
$r->uri=~/\/(\w+)$/; |
|
&settype($sheetone,$1); |
if ($ENV{'form.unewfield'}) { |
if ($ENV{'form.unewfield'}) { |
$r->print('<h2>Modified Workcopy</h2>'); |
$r->print('<h2>Modified Workcopy</h2>'); |
$ENV{'form.unewformula'}=~s/\'/\"/g; |
$ENV{'form.unewformula'}=~s/\'/\"/g; |
$r->print('New formula: '.$ENV{'form.unewfield'}.'='. |
$r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='. |
$ENV{'form.unewformula'}.'<br>'); |
$ENV{'form.unewformula'}.'<p>'); |
&setfilename($sheetone,$r->filename); |
&setfilename($sheetone,$ENV{'form.ufn'}); |
$r->filename=~/\.(\w+)/; |
|
&settype($sheetone,$1); |
|
&tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/', |
&tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/', |
$ENV{'form.usymb'}, |
$ENV{'form.usymb'}, |
$ENV{'form.unewfield'},$ENV{'form.unewformula'}); |
$ENV{'form.unewfield'},$ENV{'form.unewformula'}); |
|
} elsif ($ENV{'form.saveas'}) { |
|
&setfilename($sheetone,$ENV{'form.ufn'}); |
|
&tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/', |
|
$ENV{'form.usymb'}); |
} else { |
} else { |
&readsheet($sheetone,$r->filename); |
unless ($ENV{'form.ufn'}) { |
|
my $reply=&Apache::lonnet::reply('get:'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. |
|
':environment:spreadsheet_default_'. |
|
&gettype($sheetone), |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
unless (($reply=~/^error\:/) || ($reply eq '')) { |
|
$ENV{'form.ufn'}=$reply; |
|
unless ($reroute) { |
|
$r->print('<p>Using customized default spreadsheet<p>'); |
|
} |
|
} |
|
} |
|
&readsheet($sheetone,$ENV{'form.ufn'},$r); |
|
$ENV{'form.ufn'}=&getfilename($sheetone); |
} |
} |
|
|
# --------------------------------------------- See if all import rows uptodate |
if (&gettype($sheetone) eq 'classcalc') { |
|
# ---------------------------------- For course view: get courselist and update |
|
&updatestudentrows($sheetone); |
|
} else { |
|
# ----------------- For assessment and student: See if all import rows uptodate |
|
|
if (tie(%parmhash,'GDBM_File', |
if (tie(%parmhash,'GDBM_File', |
$ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640)) { |
$ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640)) { |
Line 1068 ENDSCRIPT
|
Line 1319 ENDSCRIPT
|
$r->print('<h3><font color=red>'. |
$r->print('<h3><font color=red>'. |
'Could not initialize import fields (not in a course)</font></h3>'); |
'Could not initialize import fields (not in a course)</font></h3>'); |
} |
} |
|
} |
|
# ---------------------------------------------------- See if something to save |
|
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
|
my $fname=''; |
|
if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { |
|
$fname=~s/\W/\_/g; |
|
if ($fname eq 'default') { $fname='course_default'; } |
|
$fname.='_'.&gettype($sheetone); |
|
&setfilename($sheetone,$fname); |
|
$ENV{'form.ufn'}=$fname; |
|
my $reply=&writesheet($sheetone); |
|
unless ($reroute) { |
|
$r->print('<p>Saving spreadsheet: '.$reply.'<p>'); |
|
} |
|
if ($ENV{'form.makedefufn'}) { |
|
my $reply=&Apache::lonnet::reply('put:'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. |
|
':environment:spreadsheet_default_'. |
|
&gettype($sheetone).'='. |
|
&Apache::lonnet::escape($fname), |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
unless ($reroute) { |
|
$r->print('<p>Making default spreadsheet: '.$reply.'<p>'); |
|
} |
|
} |
|
} |
|
} |
# ------------------------------------------------ Write the modified worksheet |
# ------------------------------------------------ Write the modified worksheet |
|
|
&tmpwrite($sheetone,$r->dir_config('lonDaemons').'/tmp/', |
&tmpwrite($sheetone,$r->dir_config('lonDaemons').'/tmp/', |
Line 1076 ENDSCRIPT
|
Line 1354 ENDSCRIPT
|
|
|
# ----------------------------------------------------- Print user, course, etc |
# ----------------------------------------------------- Print user, course, etc |
unless ($reroute) { |
unless ($reroute) { |
$r->print("<b>User '$uname' at domain '$udom' for '". |
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
$ENV{'course.'.$ENV{'request.course.id'}.'.description'}."'"); |
my $fname=$ENV{'form.ufn'}; |
|
$fname=~s/\_[^\_]+$//; |
|
if ($fname eq 'default') { $fname='course_default'; } |
|
$r->print('<input type=submit name=saveas value="Save as ...">'. |
|
'<input type=text size=20 name=newfn value="'.$fname. |
|
'"> (make default: <input type=checkbox name="makedefufn">)<p>'); |
|
} |
|
$r->print(&hiddenfield('ufn',$ENV{'form.ufn'})); |
|
unless (&gettype($sheetone) eq 'classcalc') { |
|
$r->print('<br><b>User:</b> '.$uname.'<br><b>Domain:</b> '.$udom); |
|
} |
|
$r->print('<h1>'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1>'); |
if ($csec) { |
if ($csec) { |
$r->print(", group/section '$csec'"); |
$r->print('<h3>Group/Section: '.$csec.'</h3>'); |
} |
} |
$r->print("</b>\n"); |
|
} |
} |
# -------------------------------------------------------- Import and calculate |
# -------------------------------------------------------- Import and calculate |
|
|
Line 1089 ENDSCRIPT
|
Line 1378 ENDSCRIPT
|
&rowaassess($sheetone,$ENV{'form.usymb'}); |
&rowaassess($sheetone,$ENV{'form.usymb'}); |
} elsif (&gettype($sheetone) eq 'studentcalc') { |
} elsif (&gettype($sheetone) eq 'studentcalc') { |
&rowazstudent($sheetone); |
&rowazstudent($sheetone); |
|
} else { |
|
&rowazclass($sheetone); |
} |
} |
my $calcoutput=&calcsheet($sheetone); |
my $calcoutput=&calcsheet($sheetone); |
unless ($reroute) { |
unless ($reroute) { |
Line 1097 ENDSCRIPT
|
Line 1388 ENDSCRIPT
|
|
|
# ------------------------------------------------------- Print or export sheet |
# ------------------------------------------------------- Print or export sheet |
unless ($reroute) { |
unless ($reroute) { |
$r->print(&outsheet($sheetone)); |
&outsheet($r,$sheetone); |
|
|
$r->print('</form></body></html>'); |
$r->print('</form></body></html>'); |
} else { |
} else { |