--- loncom/interface/lonprintout.pm 2011/09/15 16:33:57 1.583.2.5
+++ 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.5 2011/09/15 16:33:57 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);
@@ -1621,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'};
@@ -1943,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'}) {
@@ -2044,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 = <
@@ -2099,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',
@@ -2129,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
@@ -2149,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);
@@ -2311,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'};
@@ -2386,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';
}
}
@@ -2454,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,
@@ -2528,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';
}
@@ -2626,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'};
@@ -2690,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');
@@ -2721,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'};
@@ -2803,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) {
@@ -2964,6 +3163,7 @@ sub print_resources {
$namepostfix .="Name: ";
$fullname = "CODE - ".$moreenv->{'CODE'};
}
+
# Fullname may have special latex characters that need \ prefixing:
#
@@ -2993,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);
@@ -3092,7 +3291,7 @@ sub print_resources {
}
}
$remove_latex_header = 'YES';
- }
+ }
if (&Apache::loncommon::connection_aborted($r)) { last; }
}
@@ -3100,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.'}';
@@ -3335,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'}) {
@@ -3349,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.
}
@@ -3359,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'};
@@ -3388,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');
@@ -3479,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.''),
@@ -3513,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'];
@@ -3600,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'",
@@ -3713,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'];
}
@@ -3733,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', <
@@ -4142,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();
@@ -4221,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.='