--- loncom/interface/Attic/lonspreadsheet.pm 2001/07/20 02:05:33 1.55 +++ loncom/interface/Attic/lonspreadsheet.pm 2001/10/17 21:11:22 1.70 @@ -6,7 +6,8 @@ # 01/01/01,02/01,03/01,19/01,20/01,22/01, # 03/05,03/08,03/10,03/12,03/13,03/15,03/17, # 03/19,03/20,03/21,03/27,04/05,04/09, -# 07/09,07/14 Gerd Kortemeyer +# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17, +# 10/16,10/17 Gerd Kortemeyer package Apache::lonspreadsheet; @@ -87,9 +88,6 @@ undef %c; undef %rl; undef @os; - undef $nfield; - undef $nsheet; - $maxrow=0; $sheettype=''; @@ -311,6 +309,42 @@ sub SUMMIN { return $sum; } +sub expandnamed { + my $expression=shift; + if ($expression=~/^\&/) { + my ($func,$var,$formula)=($expression=~/^\&(\w+)\(([^\;]+)\;(.*)\)/); + my @vars=split(/\W+/,$formula); + my %values=(); + undef %values; + map { + my $varname=$_; + if ($varname=~/\D/) { + $formula=~s/$varname/'$c{\''.$varname.'\'}'/ge; + $varname=~s/$var/\(\\w\+\)/g; + map { + if ($_=~/$varname/) { + $values{$1}=1; + } + } keys %c; + } + } @vars; + if ($func eq 'EXPANDSUM') { + my $result=''; + map { + my $thissum=$formula; + $thissum=~s/$var/$_/g; + $result.=$thissum.'+'; + } keys %values; + $result=~s/\+$//; + return $result; + } else { + return 0; + } + } else { + return '$c{\''.$expression.'\'}'; + } +} + sub sett { %t=(); my $pattern=''; @@ -332,7 +366,7 @@ sub sett { $t{$lb}=~s/\#/$trow/g; $t{$lb}=~s/\.\.+/\,/g; $t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; - $t{$lb}=~s/(^|[^\"\'])\[(\w+)\]/$1\$c\{\'$2\'\}/g; + $t{$lb}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } } } keys %f; @@ -350,14 +384,14 @@ sub sett { $t{$_}=$f{$_}; $t{$_}=~s/\.\.+/\,/g; $t{$_}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; - $t{$_}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g; + $t{$_}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } } } keys %f; $t{'A0'}=$f{'A0'}; $t{'A0'}=~s/\.\.+/\,/g; $t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; - $t{'A0'}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g; + $t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } sub calc { @@ -404,7 +438,7 @@ sub outrowassess { my @cols=(); if ($n) { my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n}); - $cols[0]=$rl{$f{'A'.$n}}.''. + $cols[0]=$rl{$usy}.''. 'Default'; map { @@ -532,12 +566,6 @@ sub getmaxrow { my $safeeval=shift; return $safeeval->reval('$maxrow'); } -# -------------------------------------------- Store which sheet needs changing - -sub changesheet { - my ($safeeval,$nfield,$nsheet)=@_; - $safeeval->reval('$nfield='.$nfield.'; $nsheet='.$nsheet.';'); -} # ---------------------------------------------------------------- Set filename @@ -643,47 +671,34 @@ sub rown { my ($safeeval,$n)=@_; my $defaultbg; my $rowdata=''; + my $dataflag=0; 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.="\n". - ' '.$what.''; - 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$n"; my $showf=0; my $proc; my $maxred; - if (&gettype($safeeval) eq 'studentcalc') { + my $sheettype=&gettype($safeeval); + if ($sheettype eq 'studentcalc') { $proc='&outrowassess'; $maxred=26; } else { $proc='&outrow'; } - if (&gettype($safeeval) eq 'assesscalc') { + if ($sheettype eq 'assesscalc') { $maxred=1; } else { $maxred=26; } - if ($n eq '-') { $proc='&templaterow'; $n=-1; } + if ($n eq '-') { $proc='&templaterow'; $n=-1; $dataflag=1; } map { my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); + if ((($vl ne '') || ($vl eq '0')) && + (($showf==1) || ($sheettype ne 'studentcalc'))) { $dataflag=1; } if ($showf==0) { $vl=$_; } if ($showf<=$maxred) { $bgcolor='#FFDDDD'; } if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } @@ -699,7 +714,11 @@ sub rown { } $showf++; } $safeeval->reval($proc.'('.$n.')'); - return $rowdata.''; + if ($ENV{'form.showall'} || ($dataflag)) { + return $rowdata.''; + } else { + return ''; + } } # ------------------------------------------------------------- Print out sheet @@ -742,10 +761,43 @@ sub outsheet { $tabledata.=''; my $row; my $maxrow=&getmaxrow($safeeval); - $tabledata.=&rown($safeeval,'-'); + $tabledata.=&rown($safeeval,'-').&rown($safeeval,0); $r->print($tabledata); - for ($row=0;$row<=$maxrow;$row++) { - $r->print(&rown($safeeval,$row)); + + my @sortby=(); + my @sortidx=(); + for ($row=1;$row<=$maxrow;$row++) { + $sortby[$row-1]=$safeeval->reval('$f{"A'.$row.'"}'); + $sortidx[$row-1]=$row-1; + } + @sortidx=sort { $sortby[$a] cmp $sortby[$b]; } @sortidx; + + my $what='Student'; + if (&gettype($safeeval) eq 'assesscalc') { + $what='Item'; + } elsif (&gettype($safeeval) eq 'studentcalc') { + $what='Assessment'; + } + + my $n=0; + for ($row=0;$row<$maxrow;$row++) { + my $thisrow=&rown($safeeval,$sortidx[$row]+1); + if ($thisrow) { + if ($n/25==int($n/25)) { + $r->print("\n\n"); + $r->rflush(); + $r->print(' '.$what.''); + map { + $r->print(''.$_.''); + } ('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'); + $r->print(''); + } + $n++; + $r->print($thisrow); + } } $r->print(''); } @@ -893,8 +945,10 @@ sub writesheet { # ----------------------------------------------------------------- Write sheet my $sheetdata=''; map { + unless ($f{$_} eq 'import') { $sheetdata.=&Apache::lonnet::escape($_).'='. &Apache::lonnet::escape($f{$_}).'&'; + } } keys %f; $sheetdata=~s/\&$//; my $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.$fn.':'. @@ -962,8 +1016,9 @@ sub tmpread { } } if ($nform eq 'changesheet') { + $fo{'A'.$nfield}=(split(/\_\_\&\&\&\_\_/,$fo{'A'.$nfield}))[0]; unless ($ENV{'form.sel_'.$nfield} eq 'Default') { - &changesheet($safeeval,$nfield,$ENV{'form.sel_'.$nfield}); + $fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield}; } } else { if ($nfield) { $fo{$nfield}=$nform; } @@ -995,7 +1050,7 @@ sub parmval { # ----------------------------------------------------- Cascading lookup scheme my $rwhat=$what; $what=~s/^parameter\_//; - $what=~s/\_/\./; + $what=~s/\_([^\_]+)$/\.$1/; my $symbparm=$symb.'.'.$what; my $mapparm=$mapname.'___(all).'.$what; @@ -1235,10 +1290,14 @@ sub updatestudentassesssheet { map { if ($_=~/^A(\d+)/) { $maxrow=($1>$maxrow)?$1:$maxrow; - $existing{$f{$_}}=1; - unless ((defined($current{$f{$_}})) || (!$1)) { + my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_}); + $existing{$usy}=1; + unless ((defined($current{$usy})) || (!$1)) { $f{$_}='!!! Obsolete'; $changed=1; + } elsif ($ufn) { + $current{$usy} + =~s/assesscalc\?usymb\=/assesscalc\?ufn\=$ufn\&usymb\=/; } } } keys %f; @@ -1479,6 +1538,18 @@ sub loadassessment { # ----------------- now courseopt, useropt initialized for this user and course # (used by parmval) +# +# Load keys for this assessment only +# + my %thisassess=(); + my ($symap,$syid,$srcf)=split(/\_\_\_/,$symb); + + map { + $thisassess{$_}=1; + } split(/\,/,&Apache::lonnet::metadata($srcf,'keys')); +# +# Load parameters +# my %c=(); if (tie(%parmhash,'GDBM_File', @@ -1488,14 +1559,16 @@ sub loadassessment { if ($_=~/^A/) { unless ($f{$_}=~/^\!/) { if ($f{$_}=~/^parameter/) { + if ($thisassess{$f{$_}}) { my $val=&parmval($f{$_},$safeeval); $c{$_}=$val; $c{$f{$_}}=$val; + } } else { my $key=$f{$_}; my $ckey=$key; $key=~s/^stores\_/resource\./; - $key=~s/\_/\./; + $key=~s/\_/\./g; $c{$_}=$returnhash{$key}; $c{$ckey}=$returnhash{$key}; } @@ -1939,7 +2012,8 @@ ENDSCRIPT # ---------------------------------------------------------------- Course title $r->print(''. - $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.''); + $ENV{'course.'.$ENV{'request.course.id'}.'.description'}. + ''.localtime().''); # ---------------------------------------------------- See if user can see this @@ -1953,27 +2027,6 @@ ENDSCRIPT } } -# ---------------------------------------------------- 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($asheet); - &setfilename($asheet,$fname); - $ENV{'form.ufn'}=$fname; - $r->print('Saving spreadsheet: '. - &writesheet($asheet,$ENV{'form.makedefufn'}).''); - } - } - -# ------------------------------------------------ Write the modified worksheet - - $r->print('Current sheet: '.&getfilename($asheet).''); - - &tmpwrite($asheet); - # ---------------------------------------------------------- Additional options $r->print( @@ -2062,6 +2115,43 @@ ENDSCRIPT my $calcoutput=&calcsheet($asheet); $r->print(''.$calcoutput.''); +# ---------------------------------------------------- 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($asheet); + &setfilename($asheet,$fname); + $ENV{'form.ufn'}=$fname; + $r->print('Saving spreadsheet: '. + &writesheet($asheet,$ENV{'form.makedefufn'}).''); + } + } + +# ------------------------------------------------ Write the modified worksheet + + $r->print('Current sheet: '.&getfilename($asheet).''); + + &tmpwrite($asheet); + + if (&gettype($asheet) eq 'studentcalc') { + $r->print('Show rows with empty A column: '); + } else { + $r->print('Show empty rows: '); + } + $r->print('print(' checked'); } + $r->print('>'); + if (&gettype($asheet) eq 'classcalc') { + $r->print( + ' Output CSV format: print(' checked'); } + $r->print('>'); + } +# ------------------------------------------------------------- Print out sheet + &outsheet($r,$asheet); $r->print('
Saving spreadsheet: '. - &writesheet($asheet,$ENV{'form.makedefufn'}).'
'); - } - } - -# ------------------------------------------------ Write the modified worksheet - - $r->print('Current sheet: '.&getfilename($asheet).'
'); - - &tmpwrite($asheet); - # ---------------------------------------------------------- Additional options $r->print( @@ -2062,6 +2115,43 @@ ENDSCRIPT my $calcoutput=&calcsheet($asheet); $r->print('
Saving spreadsheet: '. + &writesheet($asheet,$ENV{'form.makedefufn'}).'
'); + } + } + +# ------------------------------------------------ Write the modified worksheet + + $r->print('Current sheet: '.&getfilename($asheet).'
'); + + &tmpwrite($asheet); + + if (&gettype($asheet) eq 'studentcalc') { + $r->print('Show rows with empty A column: '); + } else { + $r->print('Show empty rows: '); + } + $r->print('print(' checked'); } + $r->print('>'); + if (&gettype($asheet) eq 'classcalc') { + $r->print( + ' Output CSV format: print(' checked'); } + $r->print('>'); + } +# ------------------------------------------------------------- Print out sheet + &outsheet($r,$asheet); $r->print('