--- loncom/interface/spreadsheet/classcalc.pm 2003/05/16 20:55:11 1.1 +++ loncom/interface/spreadsheet/classcalc.pm 2003/06/23 16:06:11 1.9 @@ -1,5 +1,5 @@ # -# $Id: classcalc.pm,v 1.1 2003/05/16 20:55:11 matthew Exp $ +# $Id: classcalc.pm,v 1.9 2003/06/23 16:06:11 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -51,6 +51,7 @@ use Apache::loncoursedata(); use Apache::lonhtmlcommon(); use Apache::Spreadsheet; use Apache::studentcalc; +use Apache::lonstatistics(); use HTML::Entities(); use Spreadsheet::WriteExcel; use Apache::lonnet; @@ -58,30 +59,46 @@ use Time::HiRes; @Apache::classcalc::ISA = ('Apache::Spreadsheet'); -sub get_classlist { +## +## Package variable +## + +my @Students; + +sub initialize { + &Apache::lonstatistics::clear_classlist_variables(); + @Students = &Apache::lonstatistics::get_students(); + return; +} + +sub html_header { my $self = shift; - # Retrieve the classlist - my @Students = (); - my ($classlist,$field_names) = &Apache::loncoursedata::get_classlist - ($self->{'cid'},$self->{'cdom'},$self->{'cnum'}); - while (my ($student,$student_data) = each (%$classlist)) { - my $studenthash = (); - for (my $i=0; $i< scalar(@$field_names);$i++) { - my $field = $field_names->[$i]; - $studenthash->{$field}=$student_data->[$i]; - } - # This is where we can skip students because they are in - # the wrong section, have expired or pending roles, whatever... - push (@Students,$studenthash); + my ($toprow,$bottomrow); + &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()]) { + my ($name,$selector) = @{$_}; + $toprow .= ''.$name.''; + $bottomrow .= ''.$selector.''; } - my @SortedStudents = sort { $a->{'fullname'} cmp $b->{'fullname'} } @Students; - return @SortedStudents; + return "

\n\n". + "".$toprow."\n". + "".$bottomrow."\n". + "
\n

"; } sub get_title { my $self = shift; - my $title = '

'.$self->{'coursedesc'}."

\n"; # Section info should be included + my @title = ($self->{'coursedesc'}, scalar(localtime(time)) ); + return @title; +} + +sub get_html_title { + my $self = shift; + my ($classcalc_title,$time) = $self->get_title(); + my $title = '

'.$classcalc_title."

\n".'

'.$time."

\n"; return $title; } @@ -98,6 +115,7 @@ sub outsheet_html { my $num_uneditable = 26; my $num_left = 52-$num_uneditable; my $tableheader =<<"END"; +

@@ -131,6 +149,7 @@ END # # Prepare to output rows $tableheader =<<"END"; +

Course
@@ -146,7 +165,7 @@ END } # my $num_output = 0; - foreach my $student ($self->get_classlist()) { + foreach my $student (@Students) { if ($num_output++ % 50 == 0) { $r->print("
Row studentusernamedomain
\n".$tableheader); } @@ -156,25 +175,71 @@ END '&sdomain='.$student->{'domain'}.'">'; $student->{'section'} = 'none' if ($student->{'section'} eq '-1'); $r->print(''.''.$rownum.''. - ''.$link.$student->{'fullname'}.''. - ''.$student->{'username'}.''. + ''.$student->{'fullname'}.''. + ''.$link.$student->{'username'}.''. ''.$student->{'domain'} .''. ''.$student->{'section'} .''. ''.$student->{'status'} .''. $self->html_row($num_uneditable,$rownum)."\n"); } - $r->print("\n"); + $r->print("

\n"); return; } -sub outsheet_csv { +sub excel_rows { + # writes the meat of the spreadsheet to an excel worksheet. Called + # by Spreadsheet::outsheet_excel; my $self = shift; - my ($r) = @_; + my ($worksheet,$cols_output,$rows_output) = @_; + # + # Write a header row + $cols_output = 0; + foreach my $value ('fullname','username','domain','section','status') { + $worksheet->write($rows_output,$cols_output++,$value); + } + $rows_output++; + # + # Write each students row + foreach my $student (@Students) { + $cols_output = 0; + my $rownum = $self->get_row_number_from_key + ($student->{'username'}.':'.$student->{'domain'}); + $student->{'section'} = 'none' if ($student->{'section'} eq '-1'); + my @studentdata = ($student->{'fullname'}, + $student->{'username'}, + $student->{'domain'}, + $student->{'section'}, + $student->{'status'}); + $self->excel_output_row($worksheet,$rownum,$rows_output++, + @studentdata); + } + return; } -sub outsheet_excel { +sub csv_rows { + # writes the meat of the spreadsheet to an excel worksheet. Called + # by Spreadsheet::outsheet_excel; my $self = shift; - my ($r) = @_; + my ($filehandle) = @_; + # + # Write a header row + + $self->csv_output_row($filehandle,undef, + ('fullname','username','domain','section','status')); + # + # Write each students row + foreach my $student (@Students) { + my $rownum = $self->get_row_number_from_key + ($student->{'username'}.':'.$student->{'domain'}); + $student->{'section'} = 'none' if ($student->{'section'} eq '-1'); + my @studentdata = ($student->{'fullname'}, + $student->{'username'}, + $student->{'domain'}, + $student->{'section'}, + $student->{'status'}); + $self->csv_output_row($filehandle,$rownum,@studentdata); + } + return; } sub outsheet_recursive_excel { @@ -182,27 +247,21 @@ sub outsheet_recursive_excel { my ($r) = @_; } -sub display { - my $self = shift; - my ($r) = @_; - $self->compute($r); - # display as html/csv/excel/etc.... - $self->outsheet_html($r); - return; -} - sub compute { my $self = shift; my ($r) = @_; $self->initialize_safe_space(); my %c = $self->constants(); my %f = $self->formulas(); - my @Students = $self->get_classlist(); my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin ($r,'Spreadsheet Computation Status', 'Spreadsheet Computation', scalar(@Students)); + &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, + 'Processing course structure'); &Apache::studentcalc::initialize_package(); - foreach my $student ($self->get_classlist()) { + &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, + 'Processing first student'); + foreach my $student (@Students) { my $sname = $student->{'username'}.':'.$student->{'domain'}; my $studentsheet = Apache::studentcalc->new ($student->{'username'},$student->{'domain'},undef); @@ -227,6 +286,7 @@ sub compute { $self->constants(\%c); $self->formulas(\%f); $self->calcsheet(); + $self->save() if ($self->need_to_save()); } 1;