--- loncom/interface/lonprintout.pm 2008/03/24 00:03:05 1.519.2.2 +++ loncom/interface/lonprintout.pm 2009/03/21 04:44:39 1.545.2.4 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.519.2.2 2008/03/24 00:03:05 raeburn Exp $ +# $Id: lonprintout.pm,v 1.545.2.4 2009/03/21 04:44:39 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,6 +39,8 @@ use Apache::File(); use Apache::lonnavmaps; use Apache::admannotations; use Apache::lonenc; +use Apache::entities; + use HTTP::Response; use LONCAPA::map(); @@ -116,7 +118,7 @@ sub annotate { # the number of times requested by the caller. # If we still have a proble, no text is appended to the # output and we set some global variables. -# to indicate to the caller an SSI error occured. +# to indicate to the caller an SSI error occurred. # All of this is supposed to deal with the issues described # in LonCAPA BZ 5631 see: # http://bugs.lon-capa.org/show_bug.cgi?id=5631 @@ -132,10 +134,10 @@ sub annotate { # On success, returns the rendered resource identified by the resource parameter. # Side Effects: # The following global variables can be set: -# ssi_error - If an unrecoverable error occured this becomes true. +# ssi_error - If an unrecoverable error occurred this becomes true. # It is up to the caller to initialize this to false # if desired. -# ssi_last_error_resource - If an unrecoverable error occured, this is the value +# ssi_last_error_resource - If an unrecoverable error occurred, this is the value # of the resource that could not be rendered by the ssi # call. # ssi_last_error - The error string fetched from the ssi response @@ -150,7 +152,7 @@ sub ssi_with_retries { $ssi_error = 1; $ssi_last_error_resource = $resource; $ssi_last_error = $response->code . " " . $response->message; - + $content='\section*{!!! An error occurred !!!}'; &Apache::lonnet::logthis("Error in SSI resource: $resource Error: $ssi_last_error"); } @@ -158,6 +160,21 @@ sub ssi_with_retries { } +sub get_student_view_with_retries { + my ($curresline,$retries,$username,$userdomain,$courseid,$target,$moreenv)=@_; + + my ($content, $response) = &Apache::loncommon::get_student_view_with_retries($curresline,$retries,$username,$userdomain,$courseid,$target,$moreenv); + if (!$response->is_success) { + $ssi_error = 1; + $ssi_last_error_resource = $curresline.' for user '.$username.':'.$userdomain; + $ssi_last_error = $response->code . " " . $response->message; + $content='\section*{!!! An error occurred !!!}'; + &Apache::lonnet::logthis("Error in SSI (student view) resource: $curresline Error: $ssi_last_error User: $username:$userdomain"); + } + return $content; + +} + # # printf_style_subst item format_string repl # @@ -231,37 +248,42 @@ sub format_page_header { # - Allow the assignment to be 2 lines (wrapped). # my $chars_per_line = $width/2; # Character/textline. - - - my $firstline = "$student $course"; - if (length($firstline) > $chars_per_line) { - my $lastchar = $chars_per_line - length($student) - 1; - if ($lastchar > 0) { - $course = substr($course, 0, $lastchar); - } else { # Nothing left of course: - $course = ''; - } - } - if (length($assignment) > $chars_per_line) { - $assignment = substr($assignment, 0, $chars_per_line); - } - - $format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; - } else { - # An open question is how to handle long user formatted page headers... - # A possible future is to support e.g. %na so that the user can control - # the truncation of the elements that can appear in the header. - # - $format = &printf_style_subst("a", $format, $assignment); - $format = &printf_style_subst("c", $format, $course); - $format = &printf_style_subst("n", $format, $student); - - # If the user put %'s in the format string, they must be escaped - # to \% else LaTeX will think they are comments and terminate - # the line.. which is bad!!! + my $firstline = "$student $course"; + if (length($firstline) > $chars_per_line) { + my $lastchar = $chars_per_line - length($student) - 1; + if ($lastchar > 0) { + $course = substr($course, 0, $lastchar); + } else { # Nothing left of course: + $course = ''; + } + } + if (length($assignment) > $chars_per_line) { + $assignment = substr($assignment, 0, $chars_per_line); + } + $format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; + } else { + # An open question is how to handle long user formatted page headers... + # A possible future is to support e.g. %na so that the user can control + # the truncation of the elements that can appear in the header. + # + $format = &printf_style_subst("a", $format, $assignment); + $format = &printf_style_subst("c", $format, $course); + $format = &printf_style_subst("n", $format, $student); + + # If the user put %'s in the format string, they must be escaped + # to \% else LaTeX will think they are comments and terminate + # the line.. which is bad!!! + } + + # If the user has role author, $course and $assignment are empty so + # there is '\\ \\ ' in the page header. That's cause a error in LaTeX + if($format =~ /\\\\\s\\\\\s/) { + #TODO find sensible caption for page header + my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout '); + $format =~ s/\\\\\s\\\\\s/$testPrintout/; } @@ -368,8 +390,8 @@ sub is_valid_alpha_code { sub is_code_valid { my ($code_value, $code_option) = @_; my ($code_type, $code_length) = ('letter', 6); # defaults. - open(FG, $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); - foreach my $line () { + my @lines = &Apache::grades::get_scantronformat_file(); + foreach my $line (@lines) { my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; if($name eq $code_option) { $code_length = $length; @@ -487,12 +509,19 @@ sub adjust_number_to_print { # Unmodified. } else { # Error!!!! - + croak "bad SPLIT_PDFS: $split_pdf in lonprintout::adjust_number_to_print"; + } } + sub character_chart { + my $result = shift; + return &Apache::entities::replace_entities($result); +} + +sub old_character_chart { my $result = shift; $result =~ s/&\#0?0?(7|9);//g; $result =~ s/&\#0?(10|13);//g; @@ -614,7 +643,7 @@ sub character_chart { $result =~ s/&(\#165|yen);/\\textyen /g; $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g; $result =~ s/&(\#167|sect);/\\textsection /g; - $result =~ s/&(\#168|uml);/\\texthighdieresis /g; + $result =~ s/&(\#168|uml);/\\"\{\} /g; $result =~ s/&(\#169|copy);/\\copyright /g; $result =~ s/&(\#170|ordf);/\\textordfeminine /g; $result =~ s/&(\#172|not);/\\ensuremath\{\\neg\}/g; @@ -625,7 +654,7 @@ sub character_chart { $result =~ s/&(\#177|plusmn);/\\ensuremath\{\\pm\}/g; $result =~ s/&(\#178|sup2);/\\ensuremath\{^2\}/g; $result =~ s/&(\#179|sup3);/\\ensuremath\{^3\}/g; - $result =~ s/&(\#180|acute);/\\textacute /g; + $result =~ s/&(\#180|acute);/\\'\{\} /g; $result =~ s/&(\#181|micro);/\\ensuremath\{\\mu\}/g; $result =~ s/&(\#182|para);/\\P/g; $result =~ s/&(\#183|middot);/\\ensuremath\{\\cdot\}/g; @@ -1127,7 +1156,17 @@ sub print_latex_header { '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". '\usepackage{wrapfig}'. '\usepackage{picins}\usepackage{calc}'."\n". - '\usepackage[utf8]{inputenc}'."\n". + '\usepackage[T1]{fontenc}'."\n". + '\usepackage{lmodern}'."\n". + '\usepackage[postscript]{ucs}'."\n". + '\usepackage[utf8x]{inputenc}'."\n". + '\usepackage{pifont}' . "\n". + '\usepackage{latexsym}'."\n". + '\usepackage{amsmath}'. + '\usepackage{amssymb}'. + '\usepackage{amsfonts}'. + '\usepackage{amsthm}'. + '\usepackage{amscd}'. '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n". '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n". '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n". @@ -1239,20 +1278,43 @@ sub recently_generated { $cuid,$cgid,$crdev,$csize, $catime,$cmtime,$cctime, $cblksize,$cblocks)=stat($prtspool.'/'.$filename); - my $result="". - &mt('Generated [_1] ([_2] bytes)', - &Apache::lonlocal::locallocaltime($cctime),$csize). - '
'; + my $ext_text = 'pdf' ? &mt('PDF File'):&mt('Zip File'); + my $result=&Apache::loncommon::start_data_table_row() + .'' + .''.$ext_text.'' + .'' + .''.&Apache::lonlocal::locallocaltime($cctime).'' + .''.$csize.'' + .&Apache::loncommon::end_data_table_row(); if ($ext eq 'pdf') { $pdf_result .= $result; } if ($ext eq 'zip') { $zip_result .= $result; } } + if ($zip_result || $pdf_result) { + $r->print('
'); + } if ($zip_result) { - $r->print('

'.&mt('Recently generated printout zip files')."

\n" - .$zip_result); + $r->print('

'.&mt('Recently generated printout zip files')."

\n" + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.&mt('Download').'' + .''.&mt('Creation Date').'' + .''.&mt('File Size (Bytes)').'' + .&Apache::loncommon::end_data_table_header_row() + .$zip_result + .&Apache::loncommon::end_data_table() + ); } if ($pdf_result) { - $r->print('

'.&mt('Recently generated printouts')."

\n" - .$pdf_result); + $r->print('

'.&mt('Recently generated printouts')."

\n" + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.&mt('Download').'' + .''.&mt('Creation Date').'' + .''.&mt('File Size (Bytes)').'' + .&Apache::loncommon::end_data_table_header_row() + .$pdf_result + .&Apache::loncommon::end_data_table() + ); } } @@ -1474,10 +1536,10 @@ ENDPART } if ($helper->{'VARS'}->{'style_file'}=~/\w/) { - &Apache::lonnet::appenv('construct.style' => - $helper->{'VARS'}->{'style_file'}); + &Apache::lonnet::appenv({'construct.style' => + $helper->{'VARS'}->{'style_file'}}); } elsif ($env{'construct.style'}) { - &Apache::lonnet::delenv('construct\\.style'); + &Apache::lonnet::delenv('construct.style'); } @@ -1518,7 +1580,7 @@ ENDPART $rndseed=$helper->{'VARS'}->{'curseed'}; } $form{'rndseed'}=$rndseed; - &Apache::lonnet::appenv(%moreenv); + &Apache::lonnet::appenv(\%moreenv); &Apache::lonxml::clear_problem_counter(); @@ -1632,7 +1694,8 @@ ENDPART ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') or # BUGBUG - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) { + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') + ) { #-- produce an output string @@ -1640,7 +1703,8 @@ ENDPART $selectionmade = 2; } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') { $selectionmade = 3; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') { + } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') + ) { $selectionmade = 4; } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') { #BUGBUG $selectionmade = 4; @@ -1666,7 +1730,8 @@ ENDPART my $pbreakresources = keys %page_breaks; for (my $i=0;$i<=$#master_seq;$i++) { - &Apache::lonenc::reset_enc(); + &Apache::lonenc::reset_enc(); + # Note due to document structure, not allowed to put \newpage # prior to the first resource @@ -1676,10 +1741,11 @@ ENDPART $result.="\\newpage\n"; } } - my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); + my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); $urlp=&Apache::lonnet::clutter($urlp); $form{'symb'}=$master_seq[$i]; + my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;} @@ -1793,12 +1859,14 @@ ENDPART } $result .= '\end{document}'; } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){ #-- prints assignments for whole class or for selected students my $type; - if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') { + if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) { $selectionmade=5; $type='problems'; } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') { @@ -1895,9 +1963,9 @@ ENDPART my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'}; my $code_option=$helper->{'VARS'}->{'CODE_OPTION'}; - open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); + my @lines = &Apache::grades::get_scantronformat_file(); my ($code_type,$code_length)=('letter',6); - foreach my $line () { + foreach my $line (@lines) { my ($name,$type,$length) = (split(/:/,$line))[0,2,4]; if ($name eq $code_option) { $code_length=$length; @@ -1989,7 +2057,7 @@ ENDPART } for (my $i=0;$i<=$#list_of_files;$i++) { - &Apache::lonenc::reset_enc(); + &Apache::lonenc::reset_enc(); my $urlp = $list_of_files[$i]; $urlp=~s|//|/|; @@ -2084,96 +2152,68 @@ ENDPART } } - - # If there's been an unrecoverable SSI error, report it to the user - # otherwise, we can write the tex file. - # - - if ($ssi_error) { - - my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk'); - my $end_page = &Apache::loncommon::end_page(); - $r->print(' -
-

'.&mt('An unrecoverable error occured:').'

-

- '.&mt('One of the resources ([_1]) you chose to print could not be rendered due to an unrecoverable error when communicating with a server:',$ssi_last_error_resource).' -
-'.$ssi_last_error.' -

-

'. -&mt('It is recommended that you try printing again later, as this error may mean the server was just temporarily unavailable, or is down for maintenance.').'
'. -&mt('If the error persists, please contact the [_1] for assistance.',$helpurl). -'

'. -&mt('We apologize for the inconvenience.'). -'

'. -$end_page); - - } else { - #-- writing .tex file in prtspool - my $temp_file; - my $identifier = &Apache::loncommon::get_cgi_id(); - my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex"; - if (!($#print_array>0)) { - unless ($temp_file = Apache::File->new('>'.$filename)) { - $r->log_error("Couldn't open $filename for output $!"); - return SERVER_ERROR; - } - print $temp_file $result; - my $begin=index($result,'\begin{document}',0); - my $inc=substr($result,0,$begin+16); - } else { - my $begin=index($result,'\begin{document}',0); - my $inc=substr($result,0,$begin+16); - for (my $i=0;$i<=$#print_array;$i++) { - if ($i==0) { - $print_array[$i]=$result; - } else { - $print_array[$i].='\end{document}'; - $print_array[$i] = - &latex_corrections($number_of_columns,$print_array[$i], - $selectionmade, - $helper->{'VARS'}->{'ANSWER_TYPE'}); - - my $anobegin=index($print_array[$i],'\setcounter{page}',0); - substr($print_array[$i],0,$anobegin)=''; - $print_array[$i]=$inc.$print_array[$i]; - } - my $temp_file; - my $newfilename=$filename; - my $num=$i+1; - $newfilename =~s/\.tex$//; - $newfilename=sprintf("%s_%03d.tex",$newfilename, $num); - unless ($temp_file = Apache::File->new('>'.$newfilename)) { - $r->log_error("Couldn't open $newfilename for output $!"); - return SERVER_ERROR; - } - print $temp_file $print_array[$i]; - } + my $temp_file; + my $identifier = &Apache::loncommon::get_cgi_id(); + my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex"; + if (!($#print_array>0)) { + unless ($temp_file = Apache::File->new('>'.$filename)) { + $r->log_error("Couldn't open $filename for output $!"); + return SERVER_ERROR; + } + print $temp_file $result; + my $begin=index($result,'\begin{document}',0); + my $inc=substr($result,0,$begin+16); + } else { + my $begin=index($result,'\begin{document}',0); + my $inc=substr($result,0,$begin+16); + for (my $i=0;$i<=$#print_array;$i++) { + if ($i==0) { + $print_array[$i]=$result; + } else { + $print_array[$i].='\end{document}'; + $print_array[$i] = + &latex_corrections($number_of_columns,$print_array[$i], + $selectionmade, + $helper->{'VARS'}->{'ANSWER_TYPE'}); + my $anobegin=index($print_array[$i],'\setcounter{page}',0); + substr($print_array[$i],0,$anobegin)=''; + $print_array[$i]=$inc.$print_array[$i]; + } + my $temp_file; + my $newfilename=$filename; + my $num=$i+1; + $newfilename =~s/\.tex$//; + $newfilename=sprintf("%s_%03d.tex",$newfilename, $num); + unless ($temp_file = Apache::File->new('>'.$newfilename)) { + $r->log_error("Couldn't open $newfilename for output $!"); + return SERVER_ERROR; + } + print $temp_file $print_array[$i]; + } + } + my $student_names=''; + if ($#print_array>0) { + for (my $i=0;$i<=$#print_array;$i++) { + $student_names.=$student_names[$i].'_ENDPERSON_'; } - my $student_names=''; - if ($#print_array>0) { - for (my $i=0;$i<=$#print_array;$i++) { - $student_names.=$student_names[$i].'_ENDPERSON_'; - } + } else { + if ($#student_names>-1) { + $student_names=$student_names[0].'_ENDPERSON_'; } else { - if ($#student_names>-1) { - $student_names=$student_names[0].'_ENDPERSON_'; - } else { - my $fullname = &get_name($env{'user.name'},$env{'user.domain'}); - $student_names=join(':',$env{'user.name'},$env{'user.domain'}, + my $fullname = &get_name($env{'user.name'},$env{'user.domain'}); + $student_names=join(':',$env{'user.name'},$env{'user.domain'}, $env{'request.course.sec'},$fullname). '_ENDPERSON_'.'_END_'; - } } + } - # logic for now is too complex to trace if this has been defined - # yet. - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - &Apache::lonnet::appenv('cgi.'.$identifier.'.file' => $filename, + # logic for now is too complex to trace if this has been defined + # yet. + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + &Apache::lonnet::appenv({'cgi.'.$identifier.'.file' => $filename, 'cgi.'.$identifier.'.layout' => $laystyle, 'cgi.'.$identifier.'.numcol' => $numberofcolumns, 'cgi.'.$identifier.'.paper' => $papersize, @@ -2183,21 +2223,34 @@ $end_page); 'cgi.'.$identifier.'.role' => $perm{'pav'}, 'cgi.'.$identifier.'.numberoffiles' => $#print_array, 'cgi.'.$identifier.'.studentnames' => $student_names, - 'cgi.'.$identifier.'.backref' => $URLback,); - &Apache::lonnet::appenv("cgi.$identifier.user" => $env{'user.name'}, + 'cgi.'.$identifier.'.backref' => $URLback,}); + &Apache::lonnet::appenv({"cgi.$identifier.user" => $env{'user.name'}, "cgi.$identifier.domain" => $env{'user.domain'}, "cgi.$identifier.courseid" => $cnum, "cgi.$identifier.coursedom" => $cdom, - "cgi.$identifier.resources" => $resources_printed); + "cgi.$identifier.resources" => $resources_printed}); - my $end_page = &Apache::loncommon::end_page(); + my $end_page = &Apache::loncommon::end_page(); + my $continue_text = &mt('Continue'); + # If there's been an unrecoverable SSI error, report it to the user + if ($ssi_error) { + my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk'); + $r->print('

'.&mt('An unrecoverable network error occurred:').'

'. + &mt('At least one of the resources you chose to print could not be rendered due to an unrecoverable error when communicating with a server:'). + '
'.$ssi_last_error_resource.'
'.$ssi_last_error. + '

'.&mt('You can continue using the link provided below, but make sure to carefully inspect your output file! The errors will be marked in the file.').'
'. + &mt('You may be able to reprint the individual resources for which this error occurred, as the issue may be temporary.'). + '
'.&mt('If the error persists, please contact the [_1] for assistance.',$helpurl).'

'. + &mt('We apologize for the inconvenience.').'

'. + ''.$continue_text.''.$end_page); + } else { $r->print(< -Continue +$continue_text $end_page FINALEND - } # endif ssi errors. + } # endif ssi errors. } @@ -2270,7 +2323,7 @@ sub print_resources { &Apache::lonxml::remember_problem_counter(); - my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); + my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { @@ -2312,7 +2365,7 @@ sub print_resources { $current_output .= $rendered; } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { $printed .= $curresline.':'; - my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); + my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { my $url = &Apache::lonnet::clutter($res_url); my $annotation = &annotate($url); @@ -2433,17 +2486,23 @@ sub get_randomly_ordered_warning { my $postdata = $env{'form.postdata'} || $helper->{VARS}{'postdata'}; my $navmap = Apache::lonnavmaps::navmap->new(); - my $res = $navmap->getResourceByUrl($map); - if ($res) { - my $func = - sub { return ($_[0]->is_map() && $_[0]->randomorder); }; - my @matches = $navmap->retrieveResources($res, $func,1,1,1); - if (@matches) { - $message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order."; - } - } - if ($message) { - return ''.$message.''; + if (defined($navmap)) { + my $res = $navmap->getResourceByUrl($map); + if ($res) { + my $func = + sub { return ($_[0]->is_map() && $_[0]->randomorder); }; + my @matches = $navmap->retrieveResources($res, $func,1,1,1); + if (@matches) { + $message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order."; + } + } + if ($message) { + return ''.$message.''; + } + } else { + &Apache::lonnet::logthis('Retrieval of resources to check for folders set to be randomly ordered failed - could not create navmap object'); + $message = "Retrieval of information about ordering of resources failed."; + return ''.$message.''; } return; } @@ -2617,9 +2676,9 @@ sub printHelper { } # Useful filter strings - my $isProblem = '($res->is_problem()||$res->contains_problem) '; + my $isProblem = '($res->is_problem()||$res->contains_problem||$res->is_practice()) '; $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden; - my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence()'; + my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice()'; my $isNotMap = '!$res->is_sequence()'; $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden; my $isMap = '$res->is_map()'; @@ -2680,6 +2739,7 @@ HELPERFRAGMENT push @{$printChoices}, [&mtn('Selected Problems from entire course'), 'all_problems', 'ALL_PROBLEMS']; push @{$printChoices}, [&mtn('Selected Resources from entire course'), 'all_resources', 'ALL_RESOURCES']; + push @{$printChoices}, [&mtn('Selected Problems from entire course for selected people'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS']; &Apache::lonxml::xmlparse($r, 'helper', < + + + STUDENTS1 + return $isProblemOrMap; + return $isNotMap; + return $symbFilter; + $start_new_option + + + + Select sorting order of printout + + Sort by section then student + Sort by students across sections. + +


+ +
+ ALL_PROBLEMS if ($helper->{VARS}->{'assignment'}) { @@ -2809,10 +2889,9 @@ CHOOSE_STUDENTS } - - open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); + my @lines = &Apache::grades::get_scantronformat_file(); my $codechoice=''; - foreach my $line () { + foreach my $line (@lines) { my ($name,$description,$code_type,$code_length)= (split(/:/,$line))[0,1,2,4]; if ($code_length > 0 && @@ -3077,10 +3156,18 @@ CHOOSE_FROM_ANY_SEQUENCE if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or ($helper->{VARS}->{'construction'} eq '1')) { - addMessage("
"); + &addMessage(&Apache::lonhtmlcommon::row_closure()); $startedTable = 1; } @@ -3102,10 +3189,12 @@ CHOOSE_FROM_ANY_SEQUENCE ": "); + &addMessage(&Apache::lonhtmlcommon::row_closure()); if (not $helper->{VARS}->{'construction'}) { - addMessage(""); - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure()); # Prompt for printing annotations too. - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure()); - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure(1)); } if ($helper->{'VARS'}->{'construction'}) { @@ -3191,32 +3289,44 @@ CHOOSE_FROM_ANY_SEQUENCE my $stylefiletext=&mt("Use style file"); my $selectfiletext=&mt("Select style file"); - my $xmlfrag .= <<"RNDSEED"; - -RNDSEED +   + ' + .'' + .&Apache::lonhtmlcommon::row_closure() + .''; &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure(1)); - } + } } if ($startedTable) { - addMessage("
". - ': "); + &addMessage('
' + .'

'.&mt('Print Options').'

' + .&Apache::lonhtmlcommon::start_pick_box() +# .&Apache::lonhtmlcommon::row_headline() +# .'

'.&mt('Print Options').'

' +# .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'ANSWER_TYPE'; $helper->declareVar('ANSWER_TYPE'); @@ -3090,7 +3177,7 @@ CHOOSE_FROM_ANY_SEQUENCE ['Only Answers', 'only'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
"); $startedTable = 1; } else { - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); } $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'LATEX_TYPE'; @@ -3121,10 +3210,13 @@ CHOOSE_FROM_ANY_SEQUENCE } Apache::lonhelper::dropdown->new(); - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'TABLE_CONTENTS'; $helper->declareVar('TABLE_CONTENTS'); @@ -3132,13 +3224,15 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'TABLE_INDEX'; $helper->declareVar('TABLE_INDEX'); @@ -3146,11 +3240,13 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_closure()); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'PRINT_DISCUSSIONS'; $helper->declareVar('PRINT_DISCUSSIONS'); @@ -3158,14 +3254,16 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
". - ':"); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = "PRINT_ANNOTATIONS"; $helper->declareVar("PRINT_ANNOTATIONS"); @@ -3173,16 +3271,16 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes']]; Apache::lonhelper::dropdown->new(); - addMessage("
"); + &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Foils'))); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'multichoice'} = "true"; $paramHash->{'allowempty'} = "true"; $paramHash->{'variable'} = "showallfoils"; $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ]; Apache::lonhelper::choices->new(); - addMessage("
- : - - - - return $helper->{VARS}->{'curseed'}; - - -
- : - + my $xmlfrag .= '' + .&Apache::lonhtmlcommon::row_title('' + ) + .' + + + return '.$helper->{VARS}->{'curseed'}.'; + ' + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title('' + ) + .' - - return $stylevalue; - -   $selectfiletext
+ + return '.$stylevalue.'; + +  ' +.qq|| +.$selectfiletext.'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title(&mt('Show all foils')) + .' - Show all foils - -
Problem Type:"); + &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Problem Type'))); # # Initial value from construction space: # @@ -3235,16 +3345,16 @@ RNDSEED PROBTYPE &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); - addMessage("
"); + &addMessage(&Apache::lonhtmlcommon::end_pick_box()); } Apache::lonprintout::page_format_state->new("FORMAT"); @@ -3343,23 +3453,21 @@ sub render { my $PaperType=&mt('Paper type'); my $landscape=&mt('Landscape'); my $portrait=&mt('Portrait'); - $result .= <' + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.$PageLayout.'' + .''.$NumberOfColumns.'' + .''.$PaperType.'' + .&Apache::loncommon::end_data_table_header_row() + .&Apache::loncommon::start_data_table_row() + .'' + .'
' + .'' + .''; -
- - - - - - - - -
$PageLayout$NumberOfColumns$PaperType
-
- -
- ' + .'
"; + $result .= < + +HTML + $result.=&Apache::loncommon::end_data_table_row() + .&Apache::loncommon::end_data_table(); + return $result; }