--- loncom/interface/lonprintout.pm 2005/08/16 10:11:24 1.385 +++ loncom/interface/lonprintout.pm 2006/01/26 23:15:54 1.416 @@ -1,7 +1,7 @@ -# The LearningOnline Network +# The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.385 2005/08/16 10:11:24 foxr Exp $ +# $Id: lonprintout.pm,v 1.416 2006/01/26 23:15:54 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,7 +42,7 @@ use Apache::lonratedt; use POSIX qw(strftime); use Apache::lonlocal; -my $resources_printed = ''; +my %perm; # # Convert a numeric code to letters @@ -87,11 +87,11 @@ sub letters_to_num { sub is_valid_numeric_code { my ($value, $num_digits) = @_; # Remove leading/trailing whitespace; - $value =~ s/^\s*//; - $value =~ s/\s*$//; + $value =~ s/^\s*//g; + $value =~ s/\s*$//g; # All digits? - if ($value =~ /^[0-9]+$/) { + if ($value !~ /^[0-9]+$/) { return "Numeric code $value has invalid characters - must only be digits"; } if (length($value) != $num_digits) { @@ -433,6 +433,7 @@ sub character_chart { $result =~ s/&(\#252|uuml);/\\\"{u}/g; $result =~ s/&(\#253|yacute);/\\\'{y}/g; $result =~ s/&(\#255|yuml);/\\\"{y}/g; + $result =~ s/&\#295;/\\ensuremath\{\\hbar\}/g; $result =~ s/&\#952;/\\ensuremath\{\\theta\}/g; #Greek Alphabet $result =~ s/&(alpha|\#945);/\\ensuremath\{\\alpha\}/g; @@ -508,6 +509,7 @@ sub character_chart { $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g; $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g; $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g; + $result =~ s/–/\\ensuremath\{-\}/g; $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g; $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g; $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g; @@ -685,6 +687,7 @@ sub page_format_transformation { my $topmargintoinsert = ''; if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';} my $fancypagestatement=''; +# &Apache::lonnet::logthis("1: columns = $numberofcolumns"); if ($numberofcolumns eq '2') { $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}"; } else { @@ -748,15 +751,14 @@ sub details_for_menu { sub latex_corrections { - - my ($number_of_columns,$result,$selectionmade) = @_; + my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_; # $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g; $result =~ s/\$number_of_columns/$number_of_columns/g; - if ($selectionmade ne '1') { - $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License $1/; + if ($selectionmade eq '1' || $answer_mode eq 'only') { + $result =~ s/(\\end{document})/\\strut\\vskip 0 mm\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License $1/; } else { - $result =~ s/(\\end{document})/\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License $1/; + $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License $1/; } $result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g; $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g; @@ -815,13 +817,15 @@ sub IndexCreation { sub print_latex_header { my $mode=shift; - my $output='\documentclass[letterpaper]{article}'; - if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) { + my $output='\documentclass[letterpaper,twoside]{article}'; + if (($mode eq 'batchmode') || (!$perm{'pav'})) { $output.='\batchmode'; } $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n". + '\usepackage{multirow}'."\n". '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n". '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". + '\usepackage{wrapfig}'. '\usepackage{picins}\usepackage{calc}'."\n". '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n". '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n". @@ -841,16 +845,19 @@ sub print_latex_header { sub path_to_problem { my ($urlp,$colwidth)=@_; + $urlp=&Apache::lonnet::clutter($urlp); + my $newurlp = ''; $colwidth=~s/\s*mm\s*$//; #characters average about 2 mm in width if (length($urlp)*2 > $colwidth) { - my @elements = split '/',$urlp; + my @elements = split('/',$urlp); my $curlength=0; foreach my $element (@elements) { + if ($element eq '') { next; } if ($curlength+(length($element)*2) > $colwidth) { - $newurlp .= '|\vskip -1 mm \noindent \verb|'; - $curlength=0; + $newurlp .= '|\vskip -1 mm \verb|'; + $curlength=length($element)*2; } else { $curlength+=length($element)*2; } @@ -889,11 +896,14 @@ sub get_textwidth { sub unsupported { - my ($currentURL,$mode)=@_; + my ($currentURL,$mode,$symb)=@_; if ($mode ne '') {$mode='\\'.$mode} my $result.= &print_latex_header($mode); - if ($currentURL=~/\/ext\//) { - $result.=' \strut \\\\ THIS IS EXTERNAL RESOURCE WITH URL \strut \\\\ '.$currentURL.' '; + if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { + $currentURL=~s|^(/adm/wrapper/)?ext/|http://|; + my $title=&Apache::lonnet::gettitle($symb); + $title = &Apache::lonxml::latex_special_symbols($title); + $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' '; } else { $result.=$currentURL; } @@ -903,6 +913,49 @@ sub unsupported { # +# List of recently generated print files +# +sub recently_generated { + my $r=shift; + my $prtspool=$r->dir_config('lonPrtDir'); + my $zip_result; + my $pdf_result; + opendir(DIR,$prtspool); + + my @files = + grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR)); + closedir(DIR); + + @files = sort { + my ($actime) = (stat($prtspool.'/'.$a))[10]; + my ($bctime) = (stat($prtspool.'/'.$b))[10]; + return $bctime <=> $actime; + } (@files); + + foreach my $filename (@files) { + my ($ext) = ($filename =~ m/(pdf|zip)$/); + my ($cdev,$cino,$cmode,$cnlink, + $cuid,$cgid,$crdev,$csize, + $catime,$cmtime,$cctime, + $cblksize,$cblocks)=stat($prtspool.'/'.$filename); + my $result="". + &mt('Generated [_1] ([_2] bytes)', + &Apache::lonlocal::locallocaltime($cctime),$csize). + '
'; + if ($ext eq 'pdf') { $pdf_result .= $result; } + if ($ext eq 'zip') { $zip_result .= $result; } + } + if ($zip_result) { + $r->print('

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

\n" + .$zip_result); + } + if ($pdf_result) { + $r->print('

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

\n" + .$pdf_result); + } +} + +# # Retrieve the hash of page breaks. # # Inputs: @@ -911,21 +964,27 @@ sub unsupported { # A reference to a page break hash. # # +#use Data::Dumper; +#sub dump_helper_vars { +# my ($helper) = @_; +# my $helpervars = Dumper($helper->{'VARS'}); +# &Apache::lonnet::logthis("Dump of helper vars:\n $helpervars"); +#} sub get_page_breaks { my ($helper) = @_; my %page_breaks; - + foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) { $page_breaks{$break} = 1; } - return %page_breaks; } sub output_data { my ($r,$helper,$rparmhash) = @_; my %parmhash = %$rparmhash; + my $resources_printed = ''; my $html=&Apache::lonxml::xmlbegin(); my $bodytag=&Apache::loncommon::bodytag('Preparing Printout'); $r->print(<LON-CAPA output for printing $bodytag +

Please stand by while processing your print request, this may take some time ... +

ENDPART @@ -1026,7 +1087,8 @@ ENDPART $cleanURL=$currentURL; } $selectionmade = 1; - if ($cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + if ($cleanURL!~m|^/adm/| + && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { my $rndseed=time; my $texversion=''; if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { @@ -1051,6 +1113,7 @@ ENDPART &Apache::lonnet::appenv(%moreenv); &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); + &Apache::lonxml::store_counter(); $resources_printed .= $currentURL.':'; $texversion.=&Apache::lonnet::ssi($currentURL,%form); &Apache::lonnet::delenv('form.counter'); @@ -1062,6 +1125,9 @@ ENDPART $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'rndseed'}=$rndseed; + if ($helper->{'VARS'}->{'probstatus'} eq 'exam') { + $form{'problemtype'}='exam'; + } $resources_printed .= $currentURL.':'; my $answer=&Apache::lonnet::ssi($currentURL,%form); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { @@ -1091,7 +1157,8 @@ ENDPART if ($currentURL=~m/\.page\s*$/) { ($result,$number_of_columns) = &page_cleanup($result); } - } elsif ($currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') { + } elsif ($cleanURL!~m|^/adm/| + && $currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') { #printing content of sequence from the construction space my $flag_latex_header_remove = 'NO'; my $rndseed=time; @@ -1130,7 +1197,7 @@ ENDPART } else { $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm '; - $texversion.=&path_to_problem ($currentURL,$LaTeXwidth); + $texversion.=&path_to_problem($urlp,$LaTeXwidth); $texversion.='\vskip 1 mm '.$answer.'\end{document}'; } } @@ -1160,7 +1227,8 @@ ENDPART my $texversion=&Apache::lonnet::ssi($currentURL,%form); $result .= $texversion; } else { - $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}); + $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}, + $helper->{'VARS'}->{'symb'}); } } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or @@ -1190,6 +1258,8 @@ ENDPART my $prevassignment=''; &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); + &Apache::lonxml::store_counter(); + my $pbreakresources = keys %page_breaks; for (my $i=0;$i<=$#master_seq;$i++) { # Note due to document structure, not allowed to put \newpage @@ -1200,16 +1270,18 @@ ENDPART $result.="\\newpage\n"; } } - my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); + my ($sequence,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); $urlp=&Apache::lonnet::clutter($urlp); $form{'symb'}=$master_seq[$i]; - my ($sequence)=&Apache::lonnet::decode_symb($master_seq[$i]); - my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #tittle of the assignment which contains this problem + + 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;} if ($i==0) {$prevassignment=$assignment;} my $texversion=''; - if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + if ($urlp!~m|^/adm/| + && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { $resources_printed .= $urlp.':'; + my $pre_counter=$env{'form.counter'}; $texversion.=&Apache::lonnet::ssi($urlp,%form); if ($urlp=~/\.page$/) { ($texversion,my $number_of_columns_page) = &page_cleanup($texversion); @@ -1217,11 +1289,9 @@ ENDPART $texversion =~ s/\\end{document}\d*/\\end{document}/; $flag_page_in_sequence = 'YES'; } - my $lonidsdir=$r->dir_config('lonIDsDir'); - my $envfile=$env{'user.environment'}; - $envfile=~/\/([^\/]+)\.id$/; - $envfile=$1; - &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile); + my ($envfile) = ($env{'user.environment'} =~m|/([^/]+)\.id$| ); + &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'), + $envfile); my $current_counter=$env{'form.counter'}; if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { @@ -1230,6 +1300,7 @@ ENDPART $answerform{'grade_target'}='answer'; $answerform{'answer_output_mode'}='tex'; $resources_printed .= $urlp.':'; + &Apache::lonnet::appenv(('form.counter' => $pre_counter)); my $answer=&Apache::lonnet::ssi($urlp,%answerform); &Apache::lonnet::appenv(('form.counter' => $current_counter)); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { @@ -1237,7 +1308,7 @@ ENDPART } else { if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); - $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($urlp).'}\vskip 0 mm '; + $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($master_seq[$i]).'}\vskip 0 mm '; $texversion.=&path_to_problem ($urlp,$LaTeXwidth); $texversion.='\vskip 1 mm '.$answer; } else { @@ -1258,7 +1329,12 @@ ENDPART my $courseidinfo = &get_course(); if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } $prevassignment=$assignment; - $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm '; +# &Apache::lonnet::logthis("2: Number of columns: $number_of_columns"); + if ($number_of_columns eq '1') { + $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm '; + } else { + $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\fancyhead[LO]{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm '; + } } $result .= $texversion; $flag_latex_header_remove = 'YES'; @@ -1275,7 +1351,8 @@ ENDPART $result .= $texversion; $flag_latex_header_remove = 'YES'; } else { - $texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'}); + $texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'}, + $master_seq[$i]); if ($flag_latex_header_remove ne 'NO') { $texversion = &latex_header_footer_remove($texversion); } else { @@ -1345,7 +1422,8 @@ ENDPART $person,$type, \%moreenv,\@master_seq, $flag_latex_header_remove, - $LaTeXwidth); + $LaTeXwidth, + $number_of_columns); $resources_printed .= ":"; $print_array[$i].=$output; $student_names[$i].=$person.':'.$fullname.'_END_'; @@ -1363,6 +1441,8 @@ ENDPART my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'}; my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'}; my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'}; + 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 ($code_type,$code_length)=('letter',6); @@ -1384,14 +1464,17 @@ ENDPART $code_type=$result{"type\0$old_name"}; @allcodes=split(',',$result{$old_name}); $num_todo=scalar(@allcodes); + } elsif ($selected_code) { # Selection value is always numeric. + $num_todo = 1; + @allcodes = ($selected_code); } elsif ($single_code) { + $num_todo = 1; # Unconditionally one code to do. # If an alpha code have to convert to numbers so it can be # converted back to letters again :-) # if ($code_type ne 'number') { $single_code = &letters_to_num($single_code); - $num_todo = 1; } @allcodes = ($single_code); } else { @@ -1516,8 +1599,14 @@ ENDPART } #-------------------------------------------------------- corrections for the different page formats $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade); - $result = &latex_corrections($number_of_columns,$result,$selectionmade); - for (my $i=1;$i<=$#print_array;$i++) {$print_array[$i] = &latex_corrections($number_of_columns,$print_array[$i],$selectionmade);} + $result = &latex_corrections($number_of_columns,$result,$selectionmade, + $helper->{'VARS'}->{'ANSWER_TYPE'}); + for (my $i=1;$i<=$#print_array;$i++) { + $print_array[$i] = + &latex_corrections($number_of_columns,$print_array[$i], + $selectionmade, + $helper->{'VARS'}->{'ANSWER_TYPE'}); + } #changes page's parameters for the one column output if ($numberofcolumns == 1) { $result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /; @@ -1600,7 +1689,7 @@ ENDPART 'cgi.'.$identifier.'.selection' => $selectionmade, 'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'}, 'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'}, - 'cgi.'.$identifier.'.role' => $env{'request.role.adv'}, + 'cgi.'.$identifier.'.role' => $perm{'pav'}, 'cgi.'.$identifier.'.numberoffiles' => $#print_array, 'cgi.'.$identifier.'.studentnames' => $student_names, 'cgi.'.$identifier.'.backref' => $URLback,); @@ -1625,7 +1714,7 @@ sub get_CODE { my $max='1'.'0'x$size; my $newcode; while(1) { - $newcode=sprintf("%06d",int(rand($max))); + $newcode=sprintf("%0".$size."d",int(rand($max))); if (!exists($$all_codes{$newcode})) { $$all_codes{$newcode}=1; if ($type eq 'number' ) { @@ -1639,7 +1728,7 @@ sub get_CODE { sub print_resources { my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header, - $LaTeXwidth)=@_; + $LaTeXwidth,$number_of_columns)=@_; my $current_output = ''; my $printed = ''; my ($username,$userdomain,$usersection) = split /:/,$person; @@ -1654,7 +1743,7 @@ sub print_resources { #current student, and produces output &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); - + &Apache::lonxml::store_counter(); my %page_breaks = &get_page_breaks($helper); foreach my $curresline (@{$master_seq}) { @@ -1668,14 +1757,15 @@ sub print_resources { ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) { my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); if (&Apache::lonnet::allowed('bre',$res_url)) { - if ($res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + if ($res_url!~m|^ext/| + && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { $printed .= $curresline.':'; + my $pre_counter=$env{'form.counter'}; my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); - my $lonidsdir=$r->dir_config('lonIDsDir'); - my $envfile=$env{'user.environment'}; - $envfile=~/\/([^\/]+)\.id$/; - $envfile=$1; - &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile); + my ($envfile) = + ( $env{'user.environment'} =~ m|/([^/]+)\.id$| ); + &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'), + $envfile); my $current_counter=$env{'form.counter'}; if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { @@ -1683,6 +1773,7 @@ sub print_resources { my %answerenv = %{$moreenv}; $answerenv{'answer_output_mode'}='tex'; $answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; + &Apache::lonnet::appenv(('form.counter' => $pre_counter)); my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv); &Apache::lonnet::appenv(('form.counter' => $current_counter)); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { @@ -1690,7 +1781,7 @@ sub print_resources { } else { $rendered=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); $rendered.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm '; - $rendered.=&path_to_problem ($curresline,$LaTeXwidth); + $rendered.=&path_to_problem($res_url,$LaTeXwidth); $rendered.='\vskip 1 mm '.$ansrendered; } } @@ -1703,20 +1794,19 @@ sub print_resources { } 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 $lonidsdir=$r->dir_config('lonIDsDir'); - my $envfile=$env{'user.environment'}; - $envfile=~/\/([^\/]+)\.id$/; - $envfile=$1; - &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile); + my ($envfile) = + ( $env{'user.environment'} =~ m|/([^/]+)\.id$| ); + &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'), + $envfile); my $current_counter=$env{'form.counter'}; if ($remove_latex_header eq 'YES') { $rendered = &latex_header_footer_remove($rendered); } else { $rendered =~ s/\\end{document}//; } - $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; + $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/'.$number_of_columns.'][b]{\hrulefill}\strut \vskip 0 mm \strut '; } else { - my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'}); + my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'},$curresline); if ($remove_latex_header ne 'NO') { $rendered = &latex_header_footer_remove($rendered); } else { @@ -1734,11 +1824,22 @@ sub print_resources { if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); if ($current_output=~/\\documentclass/) { - $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /; +# &Apache::lonnet::logthis("3: Number of columns = $number_of_columns"); + if ($number_of_columns == 1) { + $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /; + } else { + $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\fancyhead[LO]{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /; + + } } else { my $blankpages = ''; for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';} - $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output; +# &Apache::lonnet::logthis("4: Number of columns = $number_of_columns"); + if ($number_of_columns == 1) { + $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output; + } else { + $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\fancyhead[LO]{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output; + } } return ($current_output,$fullname, $printed); @@ -1747,37 +1848,20 @@ sub print_resources { sub handler { my $r = shift; - my $helper; + + &init_perm(); -# my $loaderror=&Apache::lonnet::overloaderror($r); -# if ($loaderror) { return $loaderror; } -# $loaderror= -# &Apache::lonnet::overloaderror($r, -# $env{'course.'.$env{'request.course.id'}.'.home'}); -# if ($loaderror) { return $loaderror; } - - my $result = printHelper($r); - if (!ref($result)) { - return $result; + + + my $helper = printHelper($r); + if (!ref($helper)) { + return $helper; } - $helper = $result; -# my $key; -# foreach $key (keys %{$helper->{'VARS'}}) { -# $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-
'); -# } -# foreach $key (keys %env) { -# $r->print(' '.$key.'->'.$env{$key}.'<-
'); -# } -# return OK; my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'}); -# my $key; -# foreach $key (keys %parmhash) { -# $r->print(' '.$key.'->'.$parmhash{$key}.'<-
'); -# } -# + # If a figure conversion queue file exists for this user.domain @@ -1801,7 +1885,21 @@ sub addMessage { Apache::lonhelper::message->new(); } -use Data::Dumper; + + +sub init_perm { + undef(%perm); + $perm{'pav'}=&Apache::lonnet::allowed('pav',$env{'request.course.id'}); + if (!$perm{'pav'}) { + $perm{'pav'}=&Apache::lonnet::allowed('pav', + $env{'request.course.id'}.'/'.$env{'request.course.sec'}); + } + $perm{'pfo'}=&Apache::lonnet::allowed('pav',$env{'request.course.id'}); + if (!$perm{'pfo'}) { + $perm{'pfo'}=&Apache::lonnet::allowed('pfo', + $env{'request.course.id'}.'/'.$env{'request.course.sec'}); + } +} sub printHelper { my $r = shift; @@ -1846,23 +1944,29 @@ sub printHelper { $helper->declareVar("showallfoils"); # The page breaks can get loaded initially from the course environment: + # But we only do this in the initial state so that they are allowed to change. + # - if((!defined($env{"form.CURRENT_STATE"})) || - ($env{'form.CURRENT_STATE'} == "START")) { - $helper->{VARS}->{FINISHPAGE} = ""; # In case they did a back e.g. - } - - + # $helper->{VARS}->{FINISHPAGE} = ''; &Apache::loncommon::restore_course_settings('print', {'pagebreaks' => 'scalar', 'lastprinttype' => 'scalar'}); - - if("$helper->{VARS}->{PRINT_TYPE}" eq "$env{'form.lastprinttype'}") { - $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; - } + if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) { + if (!defined ($env{"form.CURRENT_STATE"})) { + + $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; + } else { + my $state = $env{"form.CURRENT_STATE"}; + if ($state eq "START") { + $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; + } + } + + } + # This will persistently load in the data we want from the # very first screen. @@ -1880,6 +1984,7 @@ sub printHelper { if ($env{'form.url'}) { $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); } + } if ($env{'form.symb'}) { @@ -1925,9 +2030,6 @@ sub printHelper { } my $userCanSeeHidden = Apache::lonnavmaps::advancedUser(); - my $userPriviledged = ($env{'request.role'}=~m/^cc\./ or - $env{'request.role'}=~m/^in\./ or - $env{'request.role'}=~m/^ta\./); Apache::lonhelper::registerHelperTags(); @@ -1969,9 +2071,7 @@ sub printHelper { $helper->declareVar('SEQUENCE'); - # Useful for debugging: Dump the help vars -# $r->print(Dumper($helper->{VARS})); -# $r->print($map); + # If we're in a sequence... if (($helper->{'VARS'}->{'construction'} ne '1') && @@ -2012,9 +2112,9 @@ HELPERFRAGMENT &Apache::lonxml::xmlparse($r, 'helper', $helperFragment); } - # If the user is privileged, allow them to print all + # If the user has pfo (print for otheres) allow them to print all # problems and resources in the entier course, optionally for selected students - if ($userPriviledged && + if ($perm{'pfo'} && ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { push @{$printChoices}, ['Problems from entire course', 'all_problems', 'ALL_PROBLEMS']; @@ -2088,6 +2188,25 @@ CHOOSE_STUDENTS if ($name =~ /^type\0/) { next; } $namechoice.=''.$name.''; } + + + my %code_values; + my %codes_to_print; + foreach my $key (@names) { + %code_values = &Apache::grades::get_codes($key, $cdom, $cnum); + foreach my $key (keys(%code_values)) { + $codes_to_print{$key} = 1; + } + } + + my $code_selection = "\n"; + foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) { + my $choice = $code; + if ($code =~ /^[A-Z]+$/) { # Alpha code + $choice = &letters_to_num($code); + } + $code_selection .= ' '.$code."\n"; + } open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); my $codechoice=''; foreach my $line () { @@ -2104,32 +2223,19 @@ CHOOSE_STUDENTS &Apache::lonxml::xmlparse($r, 'helper', < PAGESIZE -
-
Number of anonymous assignments to print? +
Number of anonymous assignments to print: if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && !\$helper->{'VARS'}{'REUSE_OLD_CODES'} && - !\$helper->{'VARS'}{'SINGLE_CODE'}) { + !\$helper->{'VARS'}{'SINGLE_CODE'} && + !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { return "You need to specify the number of assignments to print"; } return undef;
- Value of CODE to print? - - - if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && - !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) { - return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, - \$helper->{'VARS'}{'CODE_OPTION'}); - } else { - return undef; # Other forces control us. - } - - -
Names to store the CODEs under for later: @@ -2139,12 +2245,28 @@ CHOOSE_STUDENTS $codechoice -
-
+

+
+ Enter a CODE to print: + + + if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && + !\$helper->{'VARS'}{'REUSE_OLD_CODES'} && + !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { + return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, + \$helper->{'VARS'}{'CODE_OPTION'}); + } else { + return undef; # Other forces control us. + } + + +

Reprint a set of saved CODEs: + $namechoice +

$resource_selector @@ -2192,11 +2314,13 @@ CHOOSE_STUDENTS1 &Apache::lonxml::xmlparse($r, 'helper', < PAGESIZE -
Number of anonymous assignments to print? +
Number of anonymous assignments to print: if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && - !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) { + !\$helper->{'VARS'}{'REUSE_OLD_CODES'} && + !\$helper->{'VARS'}{'SINGLE_CODE'} && + !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { return "You need to specify the number of assignments to print"; } return undef; @@ -2212,12 +2336,28 @@ CHOOSE_STUDENTS1 $codechoice -
-
+

+
+ Enter a CODE to print: + + + if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && + !\$helper->{'VARS'}{'REUSE_OLD_CODES'} && + !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { + return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, + \$helper->{'VARS'}{'CODE_OPTION'}); + } else { + return undef; # Other forces control us. + } + + +

Reprint a set of saved CODEs: + $namechoice +

$resource_selector @@ -2225,7 +2365,7 @@ CHOOSE_ANON2 } # FIXME: That RE should come from a library somewhere. - if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $env{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') { + if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $perm{'pav'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') { push @{$printChoices}, ["".&mt('Problems')." ".&mt('from current subdirectory')." $subdir", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']; my $f = '$filename'; @@ -2265,7 +2405,8 @@ CHOOSE_FROM_SUBDIR CHOOSE_FROM_ANY_SEQUENCE return \$res->is_sequence; return $urlValue; -