--- loncom/interface/lonprintout.pm 2013/08/27 02:39:24 1.583.2.6 +++ loncom/interface/lonprintout.pm 2011/06/06 10:53:09 1.590 @@ -1,8 +1,8 @@ -# + # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.583.2.6 2013/08/27 02:39:24 raeburn Exp $ +# $Id: lonprintout.pm,v 1.590 2011/06/06 10:53:09 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -45,13 +45,13 @@ use Apache::londefdef; use File::Basename; use HTTP::Response; - use LONCAPA::map(); use POSIX qw(strftime); use Apache::lonlocal; use Carp; use LONCAPA; + my %perm; my %parmhash; my $resources_printed; @@ -76,7 +76,146 @@ my $font_size = 'normalsize'; # Default #---------------------------- Helper helpers. ------------------------- -# Returns the text needd for a student chooser. +# BZ5209: +# Create the states needed to run the helper for incomplete problems from +# the current folder for selected students. +# This includes: +# - A resource selector limited to problems (incompleteness must be +# calculated on a student per student basis. +# - A student selector. +# - Tie in to the FORMAT of the print job. +# +# States: +# CHOOSE_INCOMPLETE_PEOPLE_SEQ - Resource selection. +# CHOOSE_STUDENTS_INCOMPLETE - Student selection. +# CHOOSE_STUDENTS_INCOMPLETE_FORMAT - Format selection +# Parameters: +# helper - the helper which already contains info about the current folder we can +# purloin. +# url - Top url of the sequence +# Return: +# XML that can be parsed by the helper to drive the state machine. +# +sub create_incomplete_folder_selstud_helper($helper) +{ + my ($helper, $map) = @_; + + + my $symbFilter = '$res->shown_symb()'; + my $selFilter = '$res->is_problem()'; + + + my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ', + 'Select problem(s) to print', + 'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', + 'RESOURCES', + 'CHOOSE_STUDENTS_INCOMPLETE', + $map, + $selFilter, + '', + $symbFilter, + ''); + + my $student_chooser = &generate_student_chooser('CHOOSE_STUDENTS_INCOMPLETE', + 'student_sort', + 'STUDENTS', + 'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); + + my $format_chooser = &generate_format_selector($helper, + 'Format of the print job', + '','CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state. + + return $resource_chooser . $student_chooser . $format_chooser; +} + + +# BZ 5209 +# Create the states needed to run the helper for incomplete problems from +# the current folder for selected students. +# This includes: +# - A resource selector limited to problems. (incompleteness must be calculated +# on a student per student basis. +# - A student selector. +# - Tie in to format for the print job. +# States: +# INCOMPLETE_PROBLEMS_COURSE_RESOURCES - Resource selector. +# INCOMPLETE_PROBLEMS_COURSE_STUDENTS - Student selector. +# INCOMPLETE_PROBLEMS_COURSE_FORMAT - Format selection. +# +# Parameters: +# helper - Helper we are creating states for. +# Returns: +# Text that can be parsed by the helper. +# + +sub create_incomplete_course_helper { + my $helper = shift; + + my $filter = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())'; + my $symbfilter = '$res->shown_symb()'; + + my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES', + 'Select problem(s) to print', + 'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1"', + 'RESOURCES', + 'INCOMPLETE_PROBLEMS_COURSE_STUDENTS', + '', + $filter, + '', + $symbfilter, + ''); + + my $people_chooser = &generate_student_chooser('INCOMPLETE_PROBLEMS_COURSE_STUDENTS', + 'student_sort', + 'STUDENTS', + 'INCOMPLETE_PROBLEMS_COURSE_FORMAT'); + + my $format = &generate_format_selector($helper, + 'Format of the print job', + '', + 'INCOMPLETE_PROBLEMS_COURSE_FORMAT'); # end state. + + return $resource_chooser . $people_chooser . $format; + + +} + +# BZ5209 +# Creates the states needed to run the print helper for a student +# that wants to print his incomplete problems from the current folder. +# Parameters: +# $helper - helper we are generating states for. +# $map - The map for which the student wants incomplete problems. +# Returns: +# XML that defines the helper states being created. +# +# States: +# CHOOSE_INCOMPLETE_SEQ - Resource selector. +# +sub create_incomplete_folder_helper { + my ($helper, $map) = @_; + + my $filter = '$res->is_problem()'; + $filter .= ' && $res->resprintable() '; + $filter .= ' && $res->is_incomplete() '; + + my $symfilter = '$res->shown_symb()'; + + my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ', + 'Select problem(s) to print', + 'multichoice="1", toponly ="1", addstatus="1", closeallpages="1"', + 'RESOURCES', + 'PAGESIZE', + $map, + $filter, '', + $symfilter, + ''); + + return $resource_chooser; +} + + +# Returns the text neded for a student chooser. # that text must still be parsed by the helper xml parser. # Parameters: # this_state - State name of the chooser. @@ -256,25 +395,21 @@ CHOOSE_ANON1 return $result; } -# Returns the XML for choosing how assignments are to be formatted -# that text must still be parsed by the helper xml parser. -# Parameters: 3 (required) - -# helper - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used -# to check if splitting PDFs by section can be offered. -# title - Title for the current state. -# this_state - State name of the chooser. - sub generate_format_selector { - my ($helper,$title,$this_state) = @_; + my ($helper,$title,$nextstate, $thisstate) = @_; my $secpdfoption; + my $state = 'PRINT_FORMATTING'; + if ($thisstate) { + $state = $thisstate; + } unless (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { $secpdfoption = 'Each PDF contains exactly one section'; } return < + + $nextstate
How should the results be printed?
Start each student\'s assignment on a new page/column (add a pagefeed after each assignment) @@ -295,7 +430,6 @@ sub generate_format_selector { RESOURCE_SELECTOR } - #----------------------------------------------------------------------- @@ -551,12 +685,12 @@ sub printf_style_subst { # %s - The section if it is supplied. # sub format_page_header { - my ($width, $format, $assignment, $course, $student) = @_; + my ($width, $format, $assignment, $course, $student, $section) = @_; $width = &recalcto_mm($width); # Get width in mm. - my $chars_per_line = int($width/2); # Character/textline. + my $chars_per_line = int($width/1.6); # Character/textline. # Default format? @@ -572,37 +706,58 @@ sub format_page_header { # - Allow the assignment to be 2 lines (wrapped). # - 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}"; + my $name_length = int($chars_per_line *3 /4); + my $sec_length = int($chars_per_line / 5); - } 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!!! + $format = "%$name_length".'n'; + + if ($section) { + $format .= ' - Sec: '."%$sec_length".'s'; + } + + $format .= '\\\\%c \\\\ %a'; + } + # 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); + $format = &printf_style_subst("s", $format, $section); + + # 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/; + } + # + # We're going to trust LaTeX to break lines appropriately, but + # we'll truncate anything that's more than 3 lines worth of + # text. This is also assuming (which will probably end badly) + # nobody's going to embed LaTeX control sequences in the title + # header or rather that those control sequences won't get broken + # by the stuff below. + # + my $total_length = 3*$chars_per_line; + if (length($format) > $total_length) { + $format = substr($format, 0, $total_length); + } + + return $format; + } # @@ -1298,6 +1453,8 @@ sub get_course { my $courseidinfo; if (defined($env{'request.course.id'})) { $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); + my $sec = $env{'request.course.sec'}; + } return $courseidinfo; } @@ -1320,7 +1477,6 @@ sub page_format_transformation { my $name = &get_name(); my $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } my $header_text = $parmhash{'print_header_format'}; $header_text = &format_page_header($textwidth, $header_text, $assignment, $courseidinfo, $name); @@ -1529,7 +1685,6 @@ sub unsupported { my $result.= &print_latex_header($mode); if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { $currentURL=~s|^(/adm/wrapper/)?ext/|http://|; - $currentURL=~s|http://https://|https://|; my $title=&Apache::lonnet::gettitle($symb); $title = &Apache::lonxml::latex_special_symbols($title); $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' '; @@ -1622,7 +1777,7 @@ sub print_page_in_course { $form{'grade_target'} = 'tex'; $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); - $form{'pdfFormFields'} = 'no'; + $form{'pdfFormFields'} = $pdfFormFields; # $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; $form{'problem_split'}=$parmhash{'problem_stream_switch'}; @@ -1944,6 +2099,8 @@ sub set_form_extraspace { # sub print_construction_sequence { my ($currentURL, $helper, %form, $LaTeXwidth) = @_; + + my $result; my $rndseed=time; if ($helper->{'VARS'}->{'curseed'}) { @@ -2045,12 +2202,45 @@ sub print_construction_sequence { return $result; } +# +# Top level for generating print output. +# +# May call print_resources if multiple resources will be printed. +# +# The main driver is $selectionmade which reflects the type of print out +# requested: +# Value Print type: +# 1 Print resource that's being looked at. +# 2 Print problems in a map or in a page. +# 3 Print pages in a map or resources in a page. +# 4 Print all problems or all resources. +# 5 Print problems for seleted students. +# 6 Print selected problems from a folder. +# 7 Print print selected resources from some scope. +# 8 Print resources for selected students. +# +#BZ 5209 +# 2 map_incomplete_problems_seq Print incomplete problems from the current +# folder in student context. +# 101 map_incomplete_problems_people_seq Print incomplete problems from the +# current folder in privileged context. +# 102 incomplete_problems_selpeople_course Print incomplete problems for +# selected people from the entire course. +# +# Item 101 has much the same processing as 8, +# Item 102 has much the same processing as 8. +# +# Differences: Item 101, 102 require per-student filtering of the resource +# set so that only the incomplete resources are printed. +# For item 100, filtering was done at the helper level. + sub output_data { my ($r,$helper,$rparmhash) = @_; my %parmhash = %$rparmhash; $ssi_error = 0; # This will be set nonzero by failing ssi's. $resources_printed = ''; $font_size = $helper->{'VARS'}->{'fontsize'}; + my $print_type = $helper->{'VARS'}->{'PRINT_TYPE'}; # Allows textual simplification. my $do_postprocessing = 1; my $js = < @@ -2100,7 +2290,7 @@ ENDPART $env{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'}; &set_form_extraspace($helper); - $env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'}; + $env{'form.lastprinttype'} = $print_type; &Apache::loncommon::store_course_settings('print', {'pagebreaks' => 'scalar', 'extraspace' => 'scalar', @@ -2130,7 +2320,7 @@ ENDPART my %form; $form{'grade_target'} = 'tex'; $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); - $form{'pdfFormFields'} = 'no'; + $form{'pdfFormFields'} = $pdfFormFields; # If form.showallfoils is set, then request all foils be shown: # privilege will be enforced both by not allowing the @@ -2150,7 +2340,7 @@ ENDPART &Apache::lonnet::delenv('construct.style'); } - if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { + if ($print_type eq 'current_document') { #-- single document - problem, page, html, xml, ... my ($currentURL,$cleanURL); @@ -2312,32 +2502,35 @@ ENDPART $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_in_page') or - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page') or - ($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') + } elsif (($print_type eq 'map_problems') or + ($print_type eq 'map_problems_in_page') or + ($print_type eq 'map_resources_in_page') or + ($print_type eq 'map_problems_pages') or + ($print_type eq 'all_problems') or + ($print_type eq 'all_resources') or # BUGBUG + ($print_type eq 'select_sequences') or + ($print_type eq 'map_incomplete_problems_seq') ) { #-- produce an output string - if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') ) { + if (($print_type eq 'map_problems') or + ($print_type eq 'map_incomplete_problems_seq') or + ($print_type eq 'map_problems_in_page') ) { $selectionmade = 2; - } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')) + } elsif (($print_type eq 'map_problems_pages') or + ($print_type eq 'map_resources_in_page')) { $selectionmade = 3; - } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') + } elsif (($print_type eq 'all_problems') ) { $selectionmade = 4; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') { #BUGBUG + } elsif ($print_type eq 'all_resources') { #BUGBUG $selectionmade = 4; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') { + } elsif ($print_type eq 'select_sequences') { $selectionmade = 7; } + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; @@ -2387,8 +2580,8 @@ ENDPART unless (($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') || (($i==0) && (($urlp=~/\.page$/) || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')))) { + ($print_type eq 'map_problems_in_page') || + ($print_type eq 'map_resources_in_page')))) { $flag_latex_header_remove = 'YES'; } } @@ -2455,7 +2648,6 @@ ENDPART if (($selectionmade == 4) and ($assignment ne $prevassignment)) { my $name = &get_name(); my $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } $prevassignment=$assignment; my $header_text = $parmhash{'print_header_format'}; $header_text = &format_page_header($textwidth, $header_text, @@ -2529,20 +2721,20 @@ ENDPART $result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/; } $result .= '\end{document}'; - } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){ + } elsif (($print_type eq 'problems_for_students') || + ($print_type eq 'problems_for_students_from_page') || + ($print_type eq 'all_problems_students') || + ($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') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) { + if (($print_type eq 'problems_for_students') || + ($print_type eq 'problems_for_students_from_page') || + ($print_type eq 'all_problems_students') ) { $selectionmade=5; $type='problems'; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') { + } elsif ($print_type eq 'resources_for_students') { $selectionmade=8; $type='resources'; } @@ -2627,9 +2819,9 @@ ENDPART } &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); $result .= $print_array[0].' \end{document}'; - } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { + } elsif (($print_type eq 'problems_for_anon') || + ($print_type eq 'problems_for_anon_page') || + ($print_type eq 'resources_for_anon') ) { my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'}; my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'}; @@ -2691,12 +2883,12 @@ ENDPART @allcodes=keys(%allcodes); } my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; - my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'}); + my ($type) = split(/_/,$print_type); &adjust_number_to_print($helper); my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'}; if ($number_per_page eq '0' || $number_per_page eq 'all' - || $number_per_page eq 'section') { - $number_per_page=$num_todo; + || $number_per_page eq 'section') { + $number_per_page=$num_todo > 0 ? $num_todo : 1; } my $flag_latex_header_remove = 'NO'; my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline','75'); @@ -2722,7 +2914,7 @@ ENDPART } &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); $result .= $print_array[0].' \end{document}'; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') { + } elsif ($print_type eq 'problems_from_directory') { #prints selected problems from the subdirectory $selectionmade = 6; my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'}; @@ -2804,7 +2996,13 @@ ENDPART # Only post process if that has not been turned off e.g. by a raw latex resource. if ($do_postprocessing) { - $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 = &page_format_transformation($papersize, + $laystyle,$numberofcolumns, + $print_type,$result, + $helper->{VARS}->{'assignment'}, + $helper->{'VARS'}->{'TABLE_CONTENTS'}, + $helper->{'VARS'}->{'TABLE_INDEX'}, + $selectionmade); $result = &latex_corrections($number_of_columns,$result,$selectionmade, $helper->{'VARS'}->{'ANSWER_TYPE'}); #if ($numberofcolumns == 1) { @@ -2965,6 +3163,7 @@ sub print_resources { $namepostfix .="Name: "; $fullname = "CODE - ".$moreenv->{'CODE'}; } + # Fullname may have special latex characters that need \ prefixing: # @@ -2994,7 +3193,6 @@ sub print_resources { } $current_output .= &get_extra_vspaces($helper, $curresline); $i++; - if ( !($type eq 'problems' && ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) ) { my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); @@ -3093,7 +3291,7 @@ sub print_resources { } } $remove_latex_header = 'YES'; - } + } if (&Apache::loncommon::connection_aborted($r)) { last; } } @@ -3101,12 +3299,10 @@ sub print_resources { $current_output =~ s/\\\\ Last updated:/Last updated:/ } my $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } - if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); my $header_line = &format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, - $currentassignment, $courseidinfo, $fullname); + $currentassignment, $courseidinfo, $fullname, $usersection); my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; $header_line = $header_start.'{'.$header_line.'}'; @@ -3336,6 +3532,8 @@ sub printHelper { my ($map, $id, $url); my $subdir; my $is_published=0; # True when printing from resource space. + my $res_printable = 1; # By default the current resource is printable. + my $userCanPrint = ($perm{'pav'} || $perm{'pfo'}); # Get the resource name from construction space if ($helper->{VARS}->{'construction'}) { @@ -3350,7 +3548,12 @@ sub printHelper { ($map, $id, $url) = &Apache::lonnet::decode_symb($symb); $helper->{VARS}->{'postdata'} = &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url)); + my $navmap = Apache::lonnavmaps::navmap->new(); + my $res = $navmap->getBySymb($symb); + $res_printable = $res->resprintable() || $userCanPrint; #printability in course context } else { + # Resource space. + $url = $helper->{VARS}->{'postdata'}; $is_published=1; # From resource space. } @@ -3360,6 +3563,8 @@ sub printHelper { $resourceTitle = substr($postdata, rindex($postdata, '/') + 1); } $subdir = &Apache::lonnet::filelocation("", $url); + + } if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) { $helper->{VARS}->{'curseed'}=$env{'form.curseed'}; @@ -3389,18 +3594,29 @@ sub printHelper { my $printChoices = []; my $paramHash; - if ($resourceTitle) { + # If there is a current resource and it is printable + # Give that as a choice. + + if ($resourceTitle && $res_printable) { push @{$printChoices}, ["$resourceTitle (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE']; } + # Useful filter strings - my $isProblem = '($res->is_problem()||$res->contains_problem||$res->is_practice()) '; + + my $isPrintable = ' && $res->resprintable()'; + + my $isProblem = '(($res->is_problem()||$res->contains_problem() ||$res->is_practice()))'; + $isProblem .= $isPrintable unless $userCanPrint; $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden; - my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice()'; - my $isNotMap = '!$res->is_sequence()'; + my $isProblemOrMap = '($res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())'; + $isProblemOrMap .= $isPrintable unless $userCanPrint; + my $isNotMap = '(!$res->is_sequence())'; + $isNotMap .= $isPrintable unless $userCanPrint; $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden; my $isMap = '$res->is_map()'; - my $symbFilter = '$res->shown_symb()'; + $isMap .= $isPrintable unless $userCanPrint; + my $symbFilter = '$res->shown_symb() '; my $urlValue = '$res->link()'; $helper->declareVar('SEQUENCE'); @@ -3480,6 +3696,34 @@ sub printHelper { if (($helper->{'VAR'}->{'construction'} ne '1' ) && $helper->{VARS}->{'postdata'} && $helper->{VARS}->{'assignment'}) { + + # BZ 5209 - Print incomplete problems from sequence: + # the exact form of this depends on whether or not we are privileged or a mere + # plebe of s student: + + my $printSelector = 'map_incomplete_problems_seq'; + my $nextState = 'CHOOSE_INCOMPLETE_SEQ'; + my $textSuffix = ''; + + if ($userCanPrint) { + $printSelector = 'map_incomplete_problems_people_seq'; + $nextState = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ'; + $textSuffix = ' for selected students'; + my $helperStates = + &create_incomplete_folder_selstud_helper($helper, $map); + &Apache::lonxml::xmlparse($r, 'helper', $helperStates); + } else { + my $helperStates = &create_incomplete_folder_helper($helper, $map); # Create needed states for student. + &Apache::lonxml::xmlparse($r, 'helper', $helperStates); + } + + push(@{$printChoices}, + [&mt('Selected Incomplete [_1]Problems[_2] from folder [_3]' . $textSuffix, + '', '', + ''. $sequenceTitle . ''), + $printSelector, + $nextState]); + # Allow problems from sequence push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3]','','',''.$sequenceTitle.''), @@ -3514,9 +3758,21 @@ sub printHelper { # If the user has pfo (print for others) allow them to print all # problems and resources in the entire course, optionally for selected students my $post_data = $helper->{VARS}->{'postdata'}; + if ($perm{'pfo'} && !$is_published && ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { + # BZ 5209 - incomplete problems from entire course: + + push(@{$printChoices}, + [&mtn('Selected incomplete Problems from entire course for selected people'), + 'incomplete_problems_selpeople_course', 'INCOMPLETE_PROBLEMS_COURSE_RESOURCES']); + my $helperFragment = &create_incomplete_course_helper($helper); # Create needed states. + + &Apache::lonxml::xmlparse($r, 'helper', $helperFragment); + + # Selected problems/resources from entire course: + 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']; @@ -3601,9 +3857,14 @@ ALL_PROBLEMS $map, $isProblem, '', $symbFilter, $start_new_option); - $resource_selector .= &generate_format_selector($helper, - 'How should results be printed?', - 'PRINT_FORMATTING'). + my $secpdfoption; + unless (($helper->{'VARS'} eq 'problems_for_anon') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { + $secpdfoption = 'Each PDF contains exactly one section'; + } + $resource_selector .= &generate_format_selector($helper, + 'How should results be printed?'). &generate_resource_chooser('CHOOSE_STUDENTS_PAGE', 'Select Problem(s) to print', "multichoice='1' addstatus='1' closeallpages ='1'", @@ -3714,6 +3975,9 @@ ALL_PROBLEMS if ($helper->{VARS}->{'assignment'}) { + + # Assignment printing: + push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]selected people[_5]','','',''.$sequenceTitle.'','',''), 'resources_for_students', 'CHOOSE_STUDENTS1']; push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','','',''.$sequenceTitle.'','',''), 'resources_for_anon', 'CHOOSE_ANON2']; } @@ -3734,9 +3998,10 @@ ALL_PROBLEMS
RESOURCE_SELECTOR + my $nextstate = 'NUMBER_PER_PDF'; $resource_selector .= &generate_format_selector($helper, 'Format of the print job', - 'PRINT_FORMATTING'); + $nextstate); &Apache::lonxml::xmlparse($r, 'helper', < @@ -4143,8 +4408,8 @@ PROBTYPE my $footer; if ($helper->{STATE} eq 'START') { - my $prtspool=$r->dir_config('lonPrtDir'); - $footer = &recently_generated($prtspool); + my $prtspool=$r->dir_config('lonPrtDir'); + $footer = &recently_generated($prtspool); } $r->print($helper->display($footer)); &Apache::lonhelper::unregisterHelperTags(); @@ -4222,6 +4487,9 @@ sub render { my $PaperType=&mt('Paper type'); my $landscape=&mt('Landscape'); my $portrait=&mt('Portrait'); + my $pdfFormLabel=&mt('PDF-Formfields'); + my $with=&mt('with Formfields'); + my $without=&mt('without Formfields'); $result.='

'.&mt('Layout Options').'

' @@ -4230,6 +4498,7 @@ sub render { .''.$PageLayout.'' .''.$NumberOfColumns.'' .''.$PaperType.'' + .''.$pdfFormLabel.'' .&Apache::loncommon::end_data_table_header_row() .&Apache::loncommon::start_data_table_row() .'' @@ -4270,6 +4539,12 @@ sub render { $result .= < + + + HTML $result.=&Apache::loncommon::end_data_table_row() .&Apache::loncommon::end_data_table();