--- loncom/interface/Attic/lonspreadsheet.pm 2000/12/30 21:33:11 1.22 +++ loncom/interface/Attic/lonspreadsheet.pm 2001/01/02 16:03:14 1.28 @@ -2,7 +2,8 @@ # Spreadsheet/Grades Display Handler # # 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,12/19,12/30 Gerd Kortemeyer +# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30, +# 01/01/01,02/01 Gerd Kortemeyer package Apache::lonspreadsheet; @@ -17,9 +18,10 @@ use HTML::TokeParser; # # These cache hashes need to be independent of user, resource and course -# (user and course are in the keys) +# (user and course can/should be in the keys) # -use vars qw(%spreadsheets %courserdatas %userrdatas); +use vars qw(%spreadsheets %courserdatas %userrdatas %defaultsheets); + # # These global hashes are dependent on user, course and resource, # and need to be initialized every time when a sheet is calculated @@ -27,9 +29,11 @@ use vars qw(%spreadsheets %courserdatas my %courseopt; my %useropt; my %parmhash; -my $csec; -my $uname; -my $udom; + +# Stuff that only the screen handler can know + +my $includedir; +my $tmpdir; # ============================================================================= # ===================================== Implements an instance of a spreadsheet @@ -60,8 +64,28 @@ sub initsheet { $maxrow=0; $sheettype=''; + +# filename/reference of the sheet + $filename=''; +# user data +$uname=''; +$uhome=''; +$udom=''; + +# course data + +$csec=''; +$chome=''; +$cnum=''; +$cdom=''; +$cid=''; + +# symb + +$usymb=''; + sub mask { my ($lower,$upper)=@_; @@ -381,13 +405,12 @@ sub outrow { } sub exportrowa { - my $rowa=''; + my @exportarray=(); map { - $rowa.=$v{$_.'0'}."___;___"; + $exportarray[$#exportarray+1]=$v{$_.'0'}; } ('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'); - $rowa=~s/\_\_\_\;\_\_\_$//; - return $rowa; + return @exportarray; } # ------------------------------------------- End of "Inside of the safe space" @@ -438,19 +461,13 @@ sub getformulas { return $safeeval->reval('%f'); } -# -------------------------------------------------------------------- Set type - -sub settype { - my ($safeeval,$type)=@_; - $safeeval->reval('$sheettype="'.$type.'";'); -} - # -------------------------------------------------------------------- Get type sub gettype { my $safeeval=shift; return $safeeval->reval('$sheettype'); } + # ------------------------------------------------------------------ Set maxrow sub setmaxrow { @@ -478,10 +495,72 @@ sub getfilename { my $safeeval=shift; return $safeeval->reval('$filename'); } +# --------------------------------------------------------------- Get course ID + +sub getcid { + my $safeeval=shift; + return $safeeval->reval('$cid'); +} + +# ----------------------------------------------------------- Get course number + +sub getcnum { + my $safeeval=shift; + return $safeeval->reval('$cnum'); +} + +# ------------------------------------------------------------- Get course home + +sub getchome { + my $safeeval=shift; + return $safeeval->reval('$chome'); +} + +# ----------------------------------------------------------- Get course domain + +sub getcdom { + my $safeeval=shift; + return $safeeval->reval('$cdom'); +} + +# ---------------------------------------------------------- Get course section + +sub getcsec { + my $safeeval=shift; + return $safeeval->reval('$csec'); +} + +# --------------------------------------------------------------- Get user name + +sub getuname { + my $safeeval=shift; + return $safeeval->reval('$uname'); +} + +# ------------------------------------------------------------- Get user domain + +sub getudom { + my $safeeval=shift; + return $safeeval->reval('$udom'); +} + +# --------------------------------------------------------------- Get user home + +sub getuhome { + my $safeeval=shift; + return $safeeval->reval('$uhome'); +} + +# -------------------------------------------------------------------- Get symb + +sub getusymb { + my $safeeval=shift; + return $safeeval->reval('$usymb'); +} # ------------------------------------------------------------- Export of A-row -sub exportrow { +sub exportdata { my $safeeval=shift; return $safeeval->reval('&exportrowa()'); } @@ -489,18 +568,38 @@ sub exportrow { # ========================================================== End of Spreadsheet # ============================================================================= - +# +# Procedures for screen output +# # --------------------------------------------- Produce output row n from sheet sub rown { my ($safeeval,$n)=@_; my $defaultbg; + my $rowdata=''; unless ($n eq '-') { $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; } else { $defaultbg='#E0FF'; } - my $rowdata="\n$n"; + 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.="\n
". + ''; + map { + $rowdata.=''; + } ('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.=''; + } + $rowdata.="\n"; my $showf=0; my $proc; my $maxred; @@ -536,7 +635,7 @@ sub rown { # ------------------------------------------------------------- Print out sheet sub outsheet { - my $safeeval=shift; + my ($r,$safeeval)=@_; my $maxred; my $realm; if (&gettype($safeeval) eq 'assesscalc') { @@ -550,7 +649,8 @@ sub outsheet { $realm='Course'; } my $maxyellow=52-$maxred; - my $tabledata='
 '.$what.''.$_.'
$n
'. + my $tabledata= + ''. ''. @@ -573,31 +673,64 @@ sub outsheet { my $row; my $maxrow=&getmaxrow($safeeval); $tabledata.=&rown($safeeval,'-'); + $r->print($tabledata); for ($row=0;$row<=$maxrow;$row++) { - $tabledata.=&rown($safeeval,$row); + $r->print(&rown($safeeval,$row)); } - $tabledata.='
'. $realm.'Import
'; + $r->print('
'); } +# +# -------------------------------------- Read spreadsheet formulas for a course +# +sub readsheet { + my ($safeeval,$fn)=@_; + my $stype=&gettype($safeeval); + my $cnum=&getcnum($safeeval); + my $cdom=&getcdom($safeeval); + my $chome=&getchome($safeeval); + +# --------- There is no filename. Look for defaults in course and global, cache + + unless($fn) { + unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) { + $fn=&Apache::lonnet::reply('get:'.$cdom.':'.$cnum. + ':environment:spreadsheet_default_'.$stype, + $chome); + unless (($fn) && ($fn!~/^error\:/)) { + $fn='default_'.$stype; + } + $defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn; + } + } -# ------------------------------------- Read spreadsheet formulas from a course +# ---------------------------------------------------------- fn now has a value -sub readsheet { - my ($safeeval,$fn,$r)=@_; - my %f=(); - if (($fn eq '') || ($fn=~/^default\_/)) { + &setfilename($safeeval,$fn); + +# ------------------------------------------------------ see if sheet is cached + my $fstring=''; + if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) { + &setformulas($safeeval,split(/\_\_\_\;\_\_\_/,$fstring)); + } else { + +# ---------------------------------------------------- Not cached, need to read + + my %f=(); + + if ($fn=~/^default\_/) { my $sheetxml=''; { my $fh; - if ($fh=Apache::File->new($r->dir_config('lonIncludes'). + if ($fh=Apache::File->new($includedir. '/default.'.&gettype($safeeval))) { $sheetxml=join('',<$fh>); } } - my $parser=HTML::TokeParser->new(\$sheetxml); - my $token; - while ($token=$parser->get_token) { + 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'}}= @@ -608,56 +741,84 @@ sub readsheet { $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'}); + } + } else { + my $sheet=''; + my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.':'.$fn, + $chome); unless ($reply=~/^error\:/) { - $spreadsheets{$fn}=$reply; - } + $sheet=$reply; + } + map { + my ($name,$value)=split(/\=/,$_); + $f{&Apache::lonnet::unescape($name)}= + &Apache::lonnet::unescape($value); + } split(/\&/,$sheet); } - map { - my ($name,$value)=split(/\=/,$_); - $f{&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); - } split(/\&/,$spreadsheets{$fn}); +# --------------------------------------------------------------- Cache and set + $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); + &setformulas($safeeval,%f); } +} - &setformulas($safeeval,%f); +# -------------------------------------------------------- Make new spreadsheet + +sub makenewsheet { + my ($uname,$udom,$stype,$usymb)=@_; + my $safeeval=initsheet(); + $safeeval->reval( + '$uname='.$uname. + ';$udom='.$udom. + ';$sheettype='.$stype. + ';$usymb='.$usymb. + ';$cid='.$ENV{'request.course.id'}. + ';$cnum='.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. + ';$cdom='.$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}. + ';$chome='.$ENV{'course.'.$ENV{'request.course.id'}.'.home'}.';'); + return $safeeval; } # ------------------------------------------------------------ Save spreadsheet sub writesheet { - my $safeeval=shift; - if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + my ($safeeval,$makedef)=@_; + my $cid=&getcid($safeeval); + if (&Apache::lonnet::allowed('opa',$cid)) { my %f=&getformulas($safeeval); + my $stype=&gettype($safeeval); + my $cnum=&getcnum($safeeval); + my $cdom=&getcdom($safeeval); + my $chome=&getchome($safeeval); + my $fn=&getfilename($safeeval); + +# ------------------------------------------------------------- Cache new sheet + $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); +# ----------------------------------------------------------------- Write sheet 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'}); + my $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.$fn.':'. + $sheetdata,$chome); 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'}); + $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'. + &stype.'_spreadsheets:'. + &Apache::lonnet::escape($fn).'='.$ENV{'user.name'}, + $chome); + if ($reply eq 'ok') { + if ($makedef) { + return &Apache::lonnet::reply('put:'.$cdom.':'.$cnum. + ':environment:spreadsheet_default_'.$stype.'='. + &Apache::lonnet::escape($fn), + $chome); + } else { + return $reply; + } + } else { + return $reply; + } } else { return $reply; } @@ -666,10 +827,14 @@ sub writesheet { } # ----------------------------------------------- Make a temp copy of the sheet +# "Modified workcopy" - interactive only +# sub tmpwrite { - my ($safeeval,$tmpdir,$symb)=@_; - my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval); + my $safeeval=shift; + my $fn=$ENV{'user.name'}.'_'. + $ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'. + &getfilename($safeeval); $fn=~s/\W/\_/g; $fn=$tmpdir.$fn.'.tmp'; my $fh; @@ -681,8 +846,10 @@ sub tmpwrite { # ---------------------------------------------------------- Read the temp copy sub tmpread { - my ($safeeval,$tmpdir,$symb,$nfield,$nform)=@_; - my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval); + my ($safeeval,$nfield,$nform)=@_; + my $fn=$ENV{'user.name'}.'_'. + $ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'. + &getfilename($safeeval); $fn=~s/\W/\_/g; $fn=$tmpdir.$fn.'.tmp'; my $fh; @@ -700,38 +867,17 @@ sub tmpread { &setformulas($safeeval,%fo); } -# --------------------------------------------------------------- Read metadata - -sub readmeta { - my $fn=shift; - unless ($fn=~/\.meta$/) { $fn.='meta'; } - my $content; - my %returnhash=(); - { - my $fh=Apache::File->new($fn); - $content=join('',<$fh>); - } - my $parser=HTML::TokeParser->new(\$content); - my $token; - while ($token=$parser->get_token) { - if ($token->[0] eq 'S') { - my $entry=$token->[1]; - if (($entry eq 'stores') || ($entry eq 'parameter')) { - my $unikey=$entry; - $unikey.='_'.$token->[2]->{'part'}; - $unikey.='_'.$token->[2]->{'name'}; - $returnhash{$unikey}=$token->[2]->{'display'}; - } - } - } - return %returnhash; -} - # ================================================================== Parameters # -------------------------------------------- Figure out a cascading parameter +# sub parmval { - my ($what,$symb)=@_; + my ($what,$safeeval)=@_; + my $cid=&getcid($safeeval); + my $csec=&getcsec($safeeval); + my $uname=&getuname($safeeval); + my $udom=&getudom($safeeval); + my $symb=&getusymb($safeeval); unless ($symb) { return ''; } my $result=''; @@ -744,23 +890,24 @@ sub parmval { my $symbparm=$symb.'.'.$what; my $mapparm=$mapname.'___(all).'.$what; + my $usercourseprefix=$cid.'_'.$uname.'_'.$udom; my $seclevel= - $ENV{'request.course.id'}.'.['. + $usercourseprefix.'.['. $csec.'].'.$what; my $seclevelr= - $ENV{'request.course.id'}.'.['. + $usercourseprefix.'.['. $csec.'].'.$symbparm; my $seclevelm= - $ENV{'request.course.id'}.'.['. + $usercourseprefix.'.['. $csec.'].'.$mapparm; my $courselevel= - $ENV{'request.course.id'}.'.'.$what; + $usercourseprefix.'.'.$what; my $courselevelr= - $ENV{'request.course.id'}.'.'.$symbparm; + $usercourseprefix.'.'.$symbparm; my $courselevelm= - $ENV{'request.course.id'}.'.'.$mapparm; + $usercourseprefix.'.'.$mapparm; # ---------------------------------------------------------- fourth, check user @@ -803,10 +950,92 @@ sub parmval { } +# ---------------------------------------------- Update rows for course listing + +sub updateclasssheet { + my $safeeval=shift; + my $cnum=&getcnum($safeeval); + my $cdom=&getcdom($safeeval); + my $cid=&getcid($safeeval); + my $chome=&getchome($safeeval); + +# ---------------------------------------------- Read class list and row labels + + my $classlst=&Apache::lonnet::reply + ('dump:'.$cdom.':'.$cnum.':classlist',$chome); + 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 ($sname,$sdom)=split(/\:/,$name); + my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid); + if ($ssec==-1) { + $rowlabel='Data not available: '.$name. + ''; + } else { + my %reply=&Apache::lonnet::idrget($sdom,$sname); + my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname. + ':environment:firstname&middlename&lastname&generation', + &Apache::lonnet::homeserver($sname,$sdom)); + $rowlabel=$ssec.' '.$reply{$sname}.'
'; + 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); } -# ----------------------------------------------------------------- Update rows + &setmaxrow($safeeval,$maxrow); + &setrowlabels($safeeval,%currentlist); -sub updaterows { + } else { + return 'Could not access course data'; + } +} + +# ----------------------------------- Update rows for student and assess sheets + +sub updatestudentassesssheet { my $safeeval=shift; my %bighash; # -------------------------------------------------------------------- Tie hash @@ -902,7 +1131,7 @@ sub updaterows { } } -# --------------------------------------------------- Load data for one student +# ------------------------------------------------ Load data for one assessment sub rowazstudent { my $safeeval=shift; @@ -914,7 +1143,7 @@ sub rowazstudent { unless ($f{$_}=~/^\!/) { my @assessdata=split(/\_\_\_\;\_\_\_/, &Apache::lonnet::ssi( - '/res/msu/korte/junk.assesscalc',('utarget' => 'export', + '/adm/assesscalc',('utarget' => 'export', 'uname' => $uname, 'udom' => $udom, 'usymb' => $f{$_}))); @@ -936,6 +1165,40 @@ sub rowazstudent { &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 sub rowaassess { @@ -1009,7 +1272,7 @@ sub rowaassess { if ($_=~/^A/) { unless ($f{$_}=~/^\!/) { if ($f{$_}=~/^parameter/) { - $c{$_}=&parmval($f{$_},$symb); + $c{$_}=&parmval($f{$_},$safeeval); } else { my $key=$f{$_}; $key=~s/^stores\_/resource\./; @@ -1047,20 +1310,73 @@ sub selectbox { return $selout.''; } +# =============================================== Update information in a sheet +# +# Add new users or assessments, etc. +# + +sub updatesheet { + my $safeeval=shift; + my $stype=&gettype($safeeval); + if ($stype eq 'classcalc') { + return &updateclasssheet($safeeval); + } else { + return &updatestudentassesssheet($safeeval); + } +} + +# =================================================== Load the rows for a sheet +# +# Import the data for rows +# + +sub loadrows() { + my $safeeval=shift; + my $stype=&gettype($safeeval); + if ($stype eq 'classcalc') { + &loadcourse($thissheet); + } elsif ($stype eq 'studentcalc') { + &loadstudent($thissheet); + } else { + &loadassessment($thissheet); + } +} + +# ============================================================== Export handler +# +# Non-interactive call from with program +# + +sub exportsheet { + my ($uname,$udom,$stype,$usymb,$fn)=@_; + my $thissheet=($uname,$udom,$stype,$usymb); + &readsheet($thissheet,$fn); + &updatesheet($thissheet); + &loadrows($thissheet); + &calcsheet($thissheet); + return &exportdata($thissheet); +} + # ================================================================ Main handler +# +# Interactive call to screen +# +# + sub handler { my $r=shift; - $uname=''; - $udom=''; - $csec=''; - - if ($r->header_only) { + if ($r->header_only) { $r->content_type('text/html'); $r->send_http_header; return OK; - } + } + +# ---------------------------------------------------- Global directory configs + +$includedir=r->dir_config('lonIncludes'); +$tmpdir=$r->dir_config('lonDaemons').'/tmp/'; # ----------------------------------------------------- Needs to be in a course @@ -1128,7 +1444,7 @@ ENDSCRIPT &hiddenfield('unewfield',''). &hiddenfield('unewformula','')); } - + $r->rflush(); # ---------------------------------------- Read new sheet or modified worksheet my $sheetone=initsheet(); @@ -1145,14 +1461,17 @@ ENDSCRIPT $ENV{'form.unewfield'},$ENV{'form.unewformula'}); } elsif ($ENV{'form.saveas'}) { &setfilename($sheetone,$ENV{'form.ufn'}); - &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/', + &tmpread($sheetone,, $ENV{'form.usymb'}); } else { - &readsheet($sheetone,$ENV{'form.ufn'},$r); - $ENV{'form.ufn'}=&getfilename($sheetone); + unless ($ENV{'form.ufn'}) { } -# --------------------------------------------- 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', $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640)) { @@ -1167,6 +1486,7 @@ ENDSCRIPT $r->print('

'. 'Could not initialize import fields (not in a course)

'); } + } # ---------------------------------------------------- See if something to save if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { my $fname=''; @@ -1180,6 +1500,18 @@ ENDSCRIPT unless ($reroute) { $r->print('

Saving spreadsheet: '.$reply.'

'); } + 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('

Making default spreadsheet: '.$reply.'

'); + } + } } } # ------------------------------------------------ Write the modified worksheet @@ -1194,15 +1526,18 @@ ENDSCRIPT $fname=~s/\_[^\_]+$//; if ($fname eq 'default') { $fname='course_default'; } $r->print(''. - '

'); + ' (make default: )

'); } - $r->print(&hiddenfield('ufn',$ENV{'form.ufn'}). - "User '$uname' at domain '$udom' for '". - $ENV{'course.'.$ENV{'request.course.id'}.'.description'}."'"); + $r->print(&hiddenfield('ufn',$ENV{'form.ufn'})); + unless (&gettype($sheetone) eq 'classcalc') { + $r->print('
User: '.$uname.'
Domain: '.$udom); + } + $r->print('

'. + $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'

'); if ($csec) { - $r->print(", group/section '$csec'"); + $r->print('

Group/Section: '.$csec.'

'); } - $r->print("
\n"); } # -------------------------------------------------------- Import and calculate @@ -1210,6 +1545,8 @@ ENDSCRIPT &rowaassess($sheetone,$ENV{'form.usymb'}); } elsif (&gettype($sheetone) eq 'studentcalc') { &rowazstudent($sheetone); + } else { + &rowazclass($sheetone); } my $calcoutput=&calcsheet($sheetone); unless ($reroute) { @@ -1218,7 +1555,7 @@ ENDSCRIPT # ------------------------------------------------------- Print or export sheet unless ($reroute) { - $r->print(&outsheet($sheetone)); + &outsheet($r,$sheetone); $r->print(''); } else { @@ -1232,6 +1569,8 @@ ENDSCRIPT return HTTP_NOT_ACCEPTABLE; } return OK; + + $bombnomatterwhat='yes'; } 1;