--- loncom/interface/spreadsheet/classcalc.pm 2003/10/14 18:36:54 1.14 +++ loncom/interface/spreadsheet/classcalc.pm 2006/04/06 20:24:13 1.26 @@ -1,5 +1,5 @@ # -# $Id: classcalc.pm,v 1.14 2003/10/14 18:36:54 www Exp $ +# $Id: classcalc.pm,v 1.26 2006/04/06 20:24:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -85,15 +85,21 @@ sub html_header { &Apache::lonstatistics::clear_classlist_variables(); foreach (['Sections',&Apache::lonstatistics::SectionSelect('Section','multpile',3)], ['Enrollment Status',&Apache::lonhtmlcommon::StatusOptions(undef,undef,3)], - ['Output Format',&Apache::Spreadsheet::output_selector()]) { + ['Output Format',$self->output_selector()]) { my ($name,$selector) = @{$_}; $toprow .= '<th align="center"><b>'.&mt($name).'</b></th>'; $bottomrow .= '<td>'.$selector.'</td>'; } + my $status .= '<nobr>'.&mt('Status: [_1]', + '<input type="text" '. + 'name="spreadsheet_status" size="60" value="" />' + ).'</nobr>'; + return "<p>\n<table>\n". "<tr>".$toprow."</tr>\n". "<tr>".$bottomrow."</tr>\n". - "</table>\n</p>"; + "</table>\n".$status."\n". + "</p>"; } sub get_title { @@ -117,6 +123,10 @@ sub parent_link { sub outsheet_html { my $self = shift; my ($r) = @_; + #################################### + # Report any calculation errors # + #################################### + $r->print($self->html_report_error()); ################################### # Determine table structure ################################### @@ -124,25 +134,27 @@ sub outsheet_html { my $exportcolor = '#BBBBFF'; my $num_uneditable = 26; my $num_left = 52-$num_uneditable; - my %lt=&Apache::lonlocal::texthash( - 'co' => 'Course', - 'im' => 'Import', - 'ca' => 'Calculations', - 'stu' => 'Student', - 'sta' => 'Status', - 'usr' => 'Username', - 'dom' => 'Domain', - 'sec' => 'Section', - ); + # + my %header=&Apache::lonlocal::texthash( + 'course' => 'Course', + 'import' => 'Import', + 'calculations' => 'Calculations', + 'student' => 'Student', + 'status' => 'Status', + 'username' => 'Username', + 'domain' => 'Domain', + 'section' => 'Section', + 'row' => 'Row', + ); my $tableheader =<<"END"; <p> <table border="2"> <tr> - <th colspan="2" rowspan="2"><font size="+2">$lt{'co'}</font></th> + <th colspan="2" rowspan="2"><font size="+2">$header{'course'}</font></th> <td bgcolor="$importcolor" colspan="$num_uneditable"> - <b><font size="+1">$lt{'im'}</font></b></td> + <b><font size="+1">$header{'import'}</font></b></td> <td colspan="$num_left"> - <b><font size="+1">$lt{'ca'}</font></b></td> + <b><font size="+1">$header{'calculations'}</font></b></td> </tr><tr> END my $label_num = 0; @@ -172,9 +184,12 @@ END $tableheader =<<"END"; </p><p> <table border="2"> -<tr><th>$lt{'ro'}</th> - <th>$lt{'stu'}</th><th>$lt{'usr'}</th><th>$lt{'dom'}</th> - <th>$lt{'sec'}</th><th>$lt{'sta'}</th> +<tr><th>$header{'row'}</th> + <th>$header{'student'}</th> + <th>$header{'username'}</th> + <th>$header{'domain'}</th> + <th>$header{'section'}</th> + <th>$header{'status'}</th> END foreach (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')){ if ($label_num<$num_uneditable) { @@ -213,12 +228,12 @@ sub excel_rows { # writes the meat of the spreadsheet to an excel worksheet. Called # by Spreadsheet::outsheet_excel; my $self = shift; - my ($connection,$worksheet,$cols_output,$rows_output) = @_; + my ($connection,$worksheet,$cols_output,$rows_output,$format) = @_; # # Write a header row $cols_output = 0; foreach my $value ('Fullname','Username','Domain','Section','Status','ID') { - $worksheet->write($rows_output,$cols_output++,&mt($value)); + $worksheet->write($rows_output,$cols_output++,&mt($value),$format->{'h4'}); } $rows_output++; # @@ -247,7 +262,6 @@ sub csv_rows { my ($connection,$filehandle) = @_; # # Write a header row - $self->csv_output_row($filehandle,undef, (&mt('Fullname'),&mt('Username'),&mt('Domain'),&mt('Section'),&mt('Status'),&mt('ID'))); # @@ -267,10 +281,110 @@ sub csv_rows { return; } +sub output_options { + my $self = shift(); + return ({value => 'htmlclasslist', + description => 'Student Sheet Links'}, + {value => 'source', + description => 'Show Source'}, + {value => 'html', + description => 'HTML'}, + {value => 'excel', + description => 'Excel'}, + {value => 'csv', + description => 'Comma Separated Values'}, +# {value => 'xml', +# description => 'XML'}, + ); +} + sub outsheet_recursive_excel { my $self = shift; my ($r) = @_; -} +} + +sub outsheet_htmlclasslist { + my $self = shift; + my ($r) = @_; + # + # Determine if we should output expire caches links... + my $show_expire_link = 0; + if (exists($env{'user.role.dc./'.$env{'request.role.domain'}.'/'})){ + $show_expire_link = 1; + } + # + if ($show_expire_link) { + $r->print('<a href="/adm/classcalc?output_format=htmlclasslist&'. + 'recalc=ilovewastingtime¬_first_run=1">'. + &mt('Expire all student spreadsheets').'</a>'.$/); + } + # + $r->print('<h3>'. + &mt('Click on a student to be taken to their spreadsheet'). + '</h3>'); + # + my %header=&Apache::lonlocal::texthash( + 'student' => 'Student', + 'status' => 'Status', + 'username' => 'Username', + 'domain' => 'Domain', + 'section' => 'Section', + ); + # + # Prepare to output rows + my $tableheader =<<"END"; +</p><p> +<table border="2"> +<tr> + <th></th> + <th>$header{'student'}</th> + <th>$header{'username'}</th> + <th>$header{'domain'}</th> + <th>$header{'section'}</th> + <th>$header{'status'}</th> +END + if ($show_expire_link) { + $tableheader.= '<th> </th>'; + } + $tableheader.= "</tr>\n"; + # + my $num_output = 0; + foreach my $student (@Students) { + if ($num_output++ % 50 == 0) { + $r->print("</table>\n".$tableheader); + } + my $link = '<a href="/adm/studentcalc?sname='.$student->{'username'}. + '&sdomain='.$student->{'domain'}.'">'; + $student->{'section'} = 'none' if ($student->{'section'} eq '-1'); + $r->print('<tr>'. + '<td>'.$num_output.'</td>'. + '<td>'.$link.$student->{'fullname'}.'</a></td>'. + '<td>'.$link.$student->{'username'}.'</a></td>'. + '<td>'.$student->{'domain'} .'</td>'. + '<td>'.$student->{'section'} .'</td>'. + '<td>'.$student->{'status'} .'</td>'); + if ($show_expire_link) { + $r->print('<td>'. + '<a href="/adm/classcalc?recalc=student:'. + $student->{'username'}.':'.$student->{'domain'}.'&'. + 'output_format=htmlclasslist&'. + 'not_first_run=1'.'">Expire Record</a>'.$/); + } + $r->print("</tr>\n"); + } + $r->print("</table></p>\n"); + return; +} + +sub update_status { + my ($r,$message) = @_; + $r->print('<script>'. + 'window.document.sheet.spreadsheet_status.value="'. + $message. + '";</script>'); + $r->rflush(); + return; +} sub compute { my $self = shift; @@ -280,21 +394,26 @@ sub compute { $self->initialize_safe_space(); my %c = $self->constants(); my %f = $self->formulas(); + &update_status($r,'Initializing Course Structure'); + &Apache::studentcalc::initialize_package(); my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin ($r,&mt('Spreadsheet Computation Status'), - &mt('Spreadsheet Computation'), scalar(@Students)); - &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, - &mt('Processing course structure')); - &Apache::studentcalc::initialize_package(); + &mt('Spreadsheet Computation'), scalar(@Students),'inline',undef, + 'sheet','spreadsheet_status'); &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, &mt('Processing first student')); foreach my $student (@Students) { if ($connection->aborted()) { $self->cleanup(); return; } my $sname = $student->{'username'}.':'.$student->{'domain'}; my $studentsheet = Apache::studentcalc->new - ($student->{'username'},$student->{'domain'},undef); + ($student->{'username'},$student->{'domain'},undef,undef, + $student->{'section'},$student->{'group'} ); if ($connection->aborted()) { $self->cleanup(); return; } my @exportdata = $studentsheet->export_data($r); + if ($studentsheet->badcalc()) { + $self->set_calcerror($sname.' : '. + $studentsheet->calcerror()); + } if ($connection->aborted()) { $self->cleanup(); return; } my $rownum = $self->get_row_number_from_key($sname); $f{'A'.$rownum} = $sname; @@ -312,11 +431,13 @@ sub compute { 'last student'); } &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + &update_status($r,'Done computing student sheets'); $r->rflush(); $self->constants(\%c); $self->formulas(\%f); $self->calcsheet(); $self->save() if ($self->need_to_save()); + &update_status($r,'Done!'); } 1;