--- loncom/interface/Attic/lonspreadsheet.pm 2002/11/08 15:28:03 1.136 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/11/15 18:19:10 1.140 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.136 2002/11/08 15:28:03 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.140 2002/11/15 18:19:10 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -53,16 +53,16 @@ built-in functions. package Apache::lonspreadsheet; use strict; +use Apache::Constants qw(:common :http); +use Apache::lonnet; +use Apache::lonhtmlcommon; +use Apache::loncoursedata; +use Apache::File(); use Safe; use Safe::Hole; use Opcode; -use Apache::lonnet; -use Apache::Constants qw(:common :http); use GDBM_File; use HTML::TokeParser; -use Apache::lonhtmlcommon; -use Apache::loncoursedata; -use Apache::File(); use Spreadsheet::WriteExcel; # @@ -1086,6 +1086,44 @@ sub geterrorlog { return ${$sheet->{'safe'}->varglob('errorlog')}; } +sub gettitle { + my $sheet = shift; + if ($sheet->{'sheettype'} eq 'classcalc') { + return $sheet->{'coursedesc'}; + } elsif ($sheet->{'sheettype'} eq 'studentcalc') { + return 'Grades for '.$sheet->{'uname'}.'@'.$sheet->{'udom'}; + } elsif ($sheet->{'sheettype'} eq 'assesscalc') { + if (($sheet->{'usymb'} eq '_feedback') || + ($sheet->{'usymb'} eq '_evaluation') || + ($sheet->{'usymb'} eq '_discussion') || + ($sheet->{'usymb'} eq '_tutoring')) { + my $title = $sheet->{'usymb'}; + $title =~ s/^_//; + $title = ucfirst($title); + return $title; + } + return if (! defined($sheet->{'mapid'}) || + $sheet->{'mapid'} !~ /^\d+$/); + my $mapid = $sheet->{'mapid'}; + return if (! defined($sheet->{'resid'}) || + $sheet->{'resid'} !~ /^\d+$/); + my $resid = $sheet->{'resid'}; + my %course_db; + tie(%course_db,'GDBM_File',$sheet->{'coursefilename'}.'.db', + &GDBM_READER(),0640); + return if (! tied(%course_db)); + my $key = 'title_'.$mapid.'.'.$resid; + my $title = ''; + if (exists($course_db{$key})) { + $title = $course_db{$key}; + } else { + $title = $sheet->{'usymb'}; + } + untie (%course_db); + return $title; + } +} + # ----------------------------------------------------- Get value of $f{'A'.$n} sub getfa { my $sheet = shift; @@ -1111,7 +1149,7 @@ sub exportdata { sub update_student_sheet{ - my $sheet = shift; + my ($sheet,$c) = @_; # Load in the studentcalc sheet &readsheet($sheet,'default_studentcalc'); # Determine the structure (contained assessments, etc) of the sheet @@ -1119,7 +1157,7 @@ sub update_student_sheet{ # Load in the cached sheets for this student &cachedssheets($sheet); # Load in the (possibly cached) data from the assessment sheets - &loadstudent($sheet); + &loadstudent($sheet,$c); # Compute the sheet &calcsheet($sheet); } @@ -1153,6 +1191,7 @@ sub sort_indicies { # my @sortby=(); my @sortidx=(); + # Skip row 0 for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { push (@sortby, $sheet->{'safe'}->reval('$f{"A'.$row.'"}')); push (@sortidx, $row); @@ -1190,6 +1229,7 @@ sub html_editable_cell { if ($value =~ /^\s*$/ ) { $value = '#'; } + $formula =~ s/\n/\\n/gs; $result .= ''.$value.''; return $result; @@ -1267,7 +1307,6 @@ END # Print out summary/export row #################################### my ($rowlabel,@rowdata) = &get_row($sheet,'0'); - my $rowcount = 0; $row_html = ''.&format_html_rowlabel($rowlabel).''; $num_cols_output = 0; foreach my $cell (@rowdata) { @@ -1457,7 +1496,7 @@ END # Create a new spreadsheet my $studentsheet = &makenewsheet($sname,$sdom,'studentcalc',undef); # Read in the spreadsheet definition - &update_student_sheet($studentsheet); + &update_student_sheet($studentsheet,$c); # Stuff the sheet into excel &export_sheet_as_excel($studentsheet,$student_excel_worksheet); my $totaltime = int((time - $starttime) / $count * $sheet->{'maxrow'}); @@ -1520,7 +1559,6 @@ sub create_excel_spreadsheet { my $filename = '/prtspool/'. $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'. time.'_'.rand(1000000000).'.xls'; - #&Apache::lonnet::logthis("spreadsheet:filename = ".$filename); my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename); if (! defined($workbook)) { $r->log_error("Error creating excel spreadsheet $filename: $!"); @@ -1543,25 +1581,46 @@ sub create_excel_spreadsheet { sub export_sheet_as_excel { my $sheet = shift; my $worksheet = shift; + # + my $rows_output = 0; + my $cols_output = 0; + #################################### + # Write an identifying row # + #################################### + my @Headerinfo = ($sheet->{'coursedesc'}); + my $title = &gettitle($sheet); + $cols_output = 0; + if (defined($title)) { + $worksheet->write($rows_output++,$cols_output++,$title); + } + #################################### + # Write the summary/export row # + #################################### + my ($rowlabel,@rowdata) = &get_row($sheet,'0'); + my $label = &format_excel_rowlabel($rowlabel); + $cols_output = 0; + $worksheet->write($rows_output,$cols_output++,$label); + foreach my $cell (@rowdata) { + $worksheet->write($rows_output,$cols_output++,$cell->{'value'}); + } + $rows_output+= 2; # Skip a row, just for fun #################################### # Prepare to output rows #################################### my @Rows = &sort_indicies($sheet); # # Loop through the rows and output them one at a time - my $rows_output=0; foreach my $rownum (@Rows) { my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); next if ($rowlabel =~ /^\s*$/); - my $cols_output = 0; + $cols_output = 0; my $label = &format_excel_rowlabel($rowlabel); $worksheet->write($rows_output,$cols_output++,$label); if (ref($label)) { $cols_output = (scalar(@$label)); } foreach my $cell (@rowdata) { - $worksheet->write($rows_output,$cols_output++, - $cell->{'value'}); + $worksheet->write($rows_output,$cols_output++,$cell->{'value'}); } $rows_output++; } @@ -1730,6 +1789,8 @@ sub makenewsheet { $sheet->{'udom'} = $udom; $sheet->{'sheettype'} = $stype; $sheet->{'usymb'} = $usymb; + $sheet->{'mapid'} = $ENV{'form.mapid'}; + $sheet->{'resid'} = $ENV{'form.resid'}; $sheet->{'cid'} = $ENV{'request.course.id'}; $sheet->{'csec'} = $Section{$uname.':'.$udom}; $sheet->{'coursefilename'} = $ENV{'request.course.fn'}; @@ -1737,7 +1798,7 @@ sub makenewsheet { $sheet->{'cdom'} = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; $sheet->{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'}; $sheet->{'coursedesc'} = $ENV{'course.'.$ENV{'request.course.id'}. - 'description'}; + '.description'}; $sheet->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom); # # @@ -1943,10 +2004,11 @@ sub format_html_rowlabel { my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$title) = split(':',$labeldata); + my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); $symb = &Apache::lonnet::unescape($symb); $result = ''.$title.''; + '&uname='.$uname.'&udom='.$udom. + '&mapid='.$mapid.'&resid='.$resid.'">'.$title.''; } elsif ($type eq 'student') { my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); $result ='{'f'} = \%f; + $sheet->{'f'} = \%formulas; &setformulas($sheet); - &setconstants($sheet,\%c); + &setconstants($sheet,\%constants); } # --------------------------------------------------- Load data for one student # sub loadcourse { - my ($sheet,$r)=@_; + my ($sheet,$r,$c)=@_; # - my %c=(); - my %f=&getformulas($sheet); + my %constants=(); + my %formulas=&getformulas($sheet); # my $total=0; - foreach (keys(%f)) { + foreach (keys(%formulas)) { if ($_=~/^A(\d+)/) { - unless ($f{$_}=~/^[\!\~\-]/) { $total++; } + unless ($formulas{$_}=~/^[\!\~\-]/) { $total++; } } } my $now=0; @@ -2307,12 +2374,16 @@ sub loadcourse { ENDPOP $r->rflush(); - foreach (keys(%f)) { + foreach (keys(%formulas)) { + if(defined($c) && ($c->aborted())) { + last; + } next if ($_!~/^A(\d+)/); my $row=$1; - next if (($f{$_}=~/^[\!\~\-]/) || ($row==0)); - my ($sname,$sdom) = split(':',$f{$_}); - my @studentdata=&exportsheet($sheet,$sname,$sdom,'studentcalc'); + next if (($formulas{$_}=~/^[\!\~\-]/) || ($row==0)); + my ($sname,$sdom) = split(':',$formulas{$_}); + my @studentdata=&exportsheet($sheet,$sname,$sdom,'studentcalc', + undef,undef,$r); undef %userrdatas; $now++; $r->print(''); $r->rflush(); } @@ -2347,7 +2418,7 @@ ENDPOP # ------------------------------------------------ Load data for one assessment # sub loadassessment { - my ($sheet)=@_; + my ($sheet,$r,$c)=@_; my $uhome = $sheet->{'uhome'}; my $uname = $sheet->{'uname'}; @@ -2511,13 +2582,14 @@ sub updatesheet { sub loadrows { my ($sheet,$r)=@_; + my $c = $r->connection; my $stype=$sheet->{'sheettype'}; if ($stype eq 'classcalc') { - &loadcourse($sheet,$r); + &loadcourse($sheet,$r,$c); } elsif ($stype eq 'studentcalc') { - &loadstudent($sheet); + &loadstudent($sheet,$r,$c); } else { - &loadassessment($sheet); + &loadassessment($sheet,$r,$c); } } @@ -2558,7 +2630,7 @@ sub forcedrecalc { # returns the export row for a spreadsheet. # sub exportsheet { - my ($sheet,$uname,$udom,$stype,$usymb,$fn)=@_; + my ($sheet,$uname,$udom,$stype,$usymb,$fn,$r)=@_; $uname = $uname || $sheet->{'uname'}; $udom = $udom || $sheet->{'udom'}; $stype = $stype || $sheet->{'sheettype'}; @@ -2573,7 +2645,6 @@ sub exportsheet { my $key=$uname.':'.$udom.':'.$stype.':'.$usymb; my $found=''; if ($oldsheets{$key}) { - &Apache::lonnet::logthis("got cached $stype for $uname"); foreach (split(/___&\___/,$oldsheets{$key})) { my ($name,$value)=split(/___=___/,$_); if ($name eq $fn) { @@ -2584,7 +2655,6 @@ sub exportsheet { unless ($found) { &cachedssheets($sheet,$uname,$udom); if ($oldsheets{$key}) { - &Apache::lonnet::logthis("got cached $stype for $uname"); foreach (split(/___&\___/,$oldsheets{$key})) { my ($name,$value)=split(/___=___/,$_); if ($name eq $fn) { @@ -2614,7 +2684,7 @@ sub exportsheet { my ($newsheet)=&makenewsheet($uname,$udom,$stype,$usymb); &readsheet($newsheet,$fn); &updatesheet($newsheet); - &loadrows($newsheet); + &loadrows($newsheet,$r); &calcsheet($newsheet); @exportarr=&exportdata($newsheet); ## @@ -2680,7 +2750,7 @@ sub load_spreadsheet_expirationdates { my @tmp = &Apache::lonnet::dump('nohist_expirationdates', $ENV{'course.'.$cid.'.domain'}, $ENV{'course.'.$cid.'.num'}); - if (lc($tmp[0])!~/^error/){ + if (lc($tmp[0]) !~ /^error/){ %expiredates = @tmp; } } @@ -2723,7 +2793,6 @@ sub cachedssheets { $oldsheets{$key} = $value; $count++; } - &Apache::lonnet::logthis('saved '.$count.' cached sheets for '.$uname); $loadedcaches{$sheet->{'uname'}.'_'.$sheet->{'udom'}}=1; } } @@ -2789,8 +2858,8 @@ sub handler { # # Get query string for limited number of parameters # - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['uname','udom','usymb','ufn']); + &Apache::loncommon::get_unprocessed_cgi + ($ENV{'QUERY_STRING'},['uname','udom','usymb','ufn','mapid','resid']); # # Deal with restricted student permissions # @@ -2832,17 +2901,45 @@ sub handler { # Header.... # $r->print('LON-CAPA Spreadsheet'); + my $nothing = "''"; + if ($ENV{'browser.type'} eq 'explorer') { + $nothing = "'javascript:void(0);'"; + } + if ($ENV{'request.role'} !~ /^st\./) { $r->print(< - function celledit(cn,cf) { - var cnf=prompt(cn,cf); - if (cnf!=null) { - document.sheet.unewfield.value=cn; - document.sheet.unewformula.value=cnf; - document.sheet.submit(); + var editwin; + + function celledit(cellname,cellformula) { + var edit_text = ''; + edit_text +='Cell Edit Window'; + edit_text += '
'; + edit_text += '

Cell '+cellname+'

'; + edit_text += '