--- loncom/interface/lonprintout.pm 2005/08/22 22:21:48 1.388 +++ loncom/interface/lonprintout.pm 2005/12/06 16:23:26 1.403 @@ -1,7 +1,7 @@ -# The LearningOnline Network +# The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.388 2005/08/22 22:21:48 foxr Exp $ +# $Id: lonprintout.pm,v 1.403 2005/12/06 16:23:26 albertel 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 @@ -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; @@ -816,12 +818,13 @@ sub IndexCreation { sub print_latex_header { my $mode=shift; my $output='\documentclass[letterpaper]{article}'; - if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) { + if (($mode eq 'batchmode') || (!$perm{'pav'})) { $output.='\batchmode'; } $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\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". @@ -903,6 +906,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: @@ -926,6 +972,7 @@ sub get_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 @@ -1051,6 +1100,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 +1112,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') { @@ -1190,6 +1243,7 @@ ENDPART my $prevassignment=''; &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); + &Apache::lonxml::store_counter(); for (my $i=0;$i<=$#master_seq;$i++) { # Note due to document structure, not allowed to put \newpage @@ -1210,6 +1264,7 @@ ENDPART my $texversion=''; if ($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 +1272,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 +1283,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') { @@ -1386,11 +1440,8 @@ ENDPART $code_type=$result{"type\0$old_name"}; @allcodes=split(',',$result{$old_name}); $num_todo=scalar(@allcodes); - } elsif ($selected_code) { + } elsif ($selected_code) { # Selection value is always numeric. $num_todo = 1; - my ($alpha, $numeric) = split(/:/, $selected_code); - $selected_code = $numeric; # Always use numeric, converted if need be. - $selected_code =~ s/\s+//g; @allcodes = ($selected_code); } elsif ($single_code) { @@ -1608,7 +1659,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,); @@ -1633,7 +1684,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' ) { @@ -1662,7 +1713,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}) { @@ -1678,12 +1729,12 @@ sub print_resources { if (&Apache::lonnet::allowed('bre',$res_url)) { if ($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')) { @@ -1691,6 +1742,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') { @@ -1711,11 +1763,10 @@ 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); @@ -1755,7 +1806,8 @@ sub print_resources { sub handler { my $r = shift; - my $helper; + + &init_perm(); # my $loaderror=&Apache::lonnet::overloaderror($r); # if ($loaderror) { return $loaderror; } @@ -1764,11 +1816,10 @@ sub handler { # $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'}}) { @@ -1811,6 +1862,20 @@ sub addMessage { 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; @@ -1854,21 +1919,27 @@ 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'}; + } + } + } @@ -1933,9 +2004,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(); @@ -1978,7 +2046,7 @@ sub printHelper { $helper->declareVar('SEQUENCE'); # Useful for debugging: Dump the help vars -# $r->print(Dumper($helper->{VARS})); +# $r->print(Dumper($helper->{VARS})); # $r->print($map); # If we're in a sequence... @@ -2020,9 +2088,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']; @@ -2096,20 +2164,26 @@ CHOOSE_STUDENTS if ($name =~ /^type\0/) { next; } $namechoice.=''.$name.''; } + + my %all_codes = &Apache::lonnet::get('CODEs', \@names, $cdom,$cnum); + my %code_values; my @all_code_array; foreach my $key (keys %all_codes) { - my $codes = $all_codes{$key}; - my @numeric_codes = split(/,/,$codes); - foreach my $numeric (sort {uc($a) cmp uc($b)} @numeric_codes) { - my $alpha_code = &num_to_letters($numeric); - push (@all_code_array, "$alpha_code : $numeric"); + %code_values = &Apache::grades::get_codes($key, $cdom, $cnum); + foreach my $key (keys %code_values) { + push (@all_code_array, "$key"); } } + my $code_selection = "\n"; - foreach my $code (@all_code_array) { - $code_selection .= ' '.$code."\n"; + foreach my $code (sort {uc($a) cmp uc($b)} @all_code_array) { + 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=''; @@ -2278,7 +2352,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'; @@ -2318,6 +2392,8 @@ CHOOSE_FROM_SUBDIR CHOOSE_FROM_ANY_SEQUENCE return \$res->is_sequence; return $urlValue; + return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); +