--- loncom/interface/lonprintout.pm 2019/02/06 01:10:09 1.627.2.26 +++ loncom/interface/lonprintout.pm 2023/04/16 01:33:04 1.691 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.627.2.26 2019/02/06 01:10:09 raeburn Exp $ +# $Id: lonprintout.pm,v 1.691 2023/04/16 01:33:04 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -143,12 +143,13 @@ sub printable_sequence { # Parameters: # helper - the helper which already contains info about the current folder we can # purloin. -# url - Top url of the sequence +# map - the map for which incomplete problems are to be printed +# nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps # Return: # XML that can be parsed by the helper to drive the state machine. # sub create_incomplete_folder_selstud_helper { - my ($helper, $map) = @_; + my ($helper, $map, $nocurrloc) = @_; my $symbFilter = '$res->shown_symb()'; @@ -157,7 +158,7 @@ sub create_incomplete_folder_selstud_hel my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ', 'Select problem(s) to print', - 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"', + 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', 'RESOURCES', 'CHOOSE_STUDENTS_INCOMPLETE', $map, @@ -235,6 +236,7 @@ sub create_incomplete_course_helper { # Parameters: # $helper - helper we are generating states for. # $map - The map for which the student wants incomplete problems. +# $nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps # Returns: # XML that defines the helper states being created. # @@ -242,7 +244,7 @@ sub create_incomplete_course_helper { # CHOOSE_INCOMPLETE_SEQ - Resource selector. # sub create_incomplete_folder_helper { - my ($helper, $map) = @_; + my ($helper, $map, $nocurrloc) = @_; my $filter = '$res->is_problem()'; $filter .= ' && $res->resprintable() '; @@ -252,7 +254,7 @@ sub create_incomplete_folder_helper { my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ', 'Select problem(s) to print', - 'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1"', + 'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', 'RESOURCES', 'PAGESIZE', $map, @@ -307,7 +309,7 @@ CHOOSE_STUDENTS # prompt_text - Text to use to prompt user. # resource_options - Resource tag options e.g. # "multichoice='1', toponly='1', addstatus='1', -# modallink='1'" +# modallink='1'" # that control the selection and appearance of the # resource selector. # variable - Name of the variable to hold the choice @@ -444,6 +446,134 @@ CHOOSE_ANON1 return $result; } +sub generate_common_choosers { + my ($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option) = @_; + + my $randomly_ordered_warning = + &get_randomly_ordered_warning($helper, $map); + + # code for a few states used for printout launched from both + # /adm/navmaps and from a resource by a privileged user: + # - To allow resources to be selected for printing. + # - To determine pagination between assignments. + # - To determine how many assignments should be bundled into a single PDF. + + my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', + 'Select resources to print', + 'multichoice="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', + 'RESOURCES', + 'PRINT_FORMATTING', + $map, + $isProblem, '', $symbFilter, + $start_new_option); + $resource_selector .= &generate_format_selector($helper, + 'How should results be printed?', + 'PRINT_FORMATTING'). + &generate_resource_chooser('CHOOSE_STUDENTS_PAGE', + 'Select Problem(s) to print', + "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", + 'RESOURCES', + 'PRINT_FORMATTING', + $url, + $isProblem, '', $symbFilter, + $start_new_option); + +# Generate student choosers. + + &Apache::lonxml::xmlparse($r, 'helper', + &generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE', + 'student_sort', + 'STUDENTS', + 'CHOOSE_STUDENTS_PAGE')); + &Apache::lonxml::xmlparse($r, 'helper', + &generate_student_chooser('CHOOSE_STUDENTS', + 'student_sort', + 'STUDENTS', + 'SELECT_PROBLEMS')); + &Apache::lonxml::xmlparse($r, 'helper', $resource_selector); + + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum); + my $namechoice=''; + foreach my $name (sort {uc($a) cmp uc($b)} @names) { + if ($name =~ /^error: 2 /) { next; } + 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; + 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); + } + push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]); + } + if (%codes_to_print) { + $code_selection .=' + Choose single CODE from list: + + + + + push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); + + + + '.$/; + } + + my @lines = &Apache::lonnet::get_scantronformat_file(); + my $codechoice=''; + foreach my $line (@lines) { + next if (($line =~ /^\#/) || ($line eq '')); + my ($name,$description,$code_type,$code_length)= + (split(/:/,$line))[0,1,2,4]; + if ($code_length > 0 && + $code_type =~/^(letter|number|-1)/) { + $codechoice.=''.$description.''; + } + } + if ($codechoice eq '') { + $codechoice='Default'; + } + my $anon1 = &generate_code_selector($helper, + 'CHOOSE_ANON1', + 'SELECT_PROBLEMS', + $codechoice, + $code_selection, + $namechoice) . $resource_selector; + + &Apache::lonxml::xmlparse($r, 'helper',$anon1); + + my $anon_page = &generate_code_selector($helper, + 'CHOOSE_ANON1_PAGE', + 'SELECT_PROBLEMS_PAGE', + $codechoice, + $code_selection, + $namechoice) . + &generate_resource_chooser('SELECT_PROBLEMS_PAGE', + 'Select Problem(s) to print', + "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", + 'RESOURCES', + 'PRINT_FORMATTING', + $url, + $isProblem, '', $symbFilter, + $start_new_option); + &Apache::lonxml::xmlparse($r, 'helper', $anon_page); + return ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice); +} + # 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) @@ -458,7 +588,9 @@ sub generate_format_selector { my $secpdfoption; 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') ) { + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_problems_for_anon') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_resources_for_anon')) { $secpdfoption = 'Each PDF contains exactly one section'; } return <parts(); @@ -624,7 +755,7 @@ sub get_print_dates { # get_print_dates but namvaps::course_print_dates are gotten...and not converted # to times either. # -# @param $res - Reference to a resource has from lonnvampas::resource. +# @param $res - Reference to a resource hash from lonnavmaps::resource. # # @return (opendate, closedate) # @@ -638,7 +769,7 @@ sub course_print_dates { my @close_dates; my $navmap = $res->{NAV_MAP}; # Slightly OO dirty. - # Don't bother looping over undefined or empty parts arraY; + # Don't bother looping over undefined or empty parts array; if (@parts) { foreach my $part (@parts) { @@ -664,7 +795,7 @@ sub map_print_dates { my $navmap = $res->{NAV_MAP}; # slightly OO dirty. - # Don't bother looping over undefined or empty parts arraY; + # Don't bother looping over undefined or empty parts array; if (@parts) { foreach my $part (@parts) { @@ -747,7 +878,7 @@ sub master_seq_to_person_seq { } my $navmap = Apache::lonnavmaps::navmap->new($username, $userdomain, - $code,$unhidden); + $code, $unhidden); my ($start,$finish); if ($map) { @@ -765,15 +896,15 @@ sub master_seq_to_person_seq { my $iterator = $navmap->getIterator($start,$finish,{},1); # Iterate on the resource..select the items that are randomly selected - # and that are in the seq_has. Presumably the iterator will take care - # of the random ordering part of the deal. + # and that are in the seq_hash. Presumably the iterator will take care + # of the random ordering part of the deal. + # my $curres; while ($curres = $iterator->next()) { # # Only process resources..that are not removed by randomout... # and are selected for printint as well. # - if (ref($curres) && ! $curres->randomout()) { my $currsymb = $curres->symb(); if (exists($seq_hash{$currsymb})) { @@ -842,14 +973,15 @@ sub set_font_size { my ($text) = @_; # There appear to be cases where the font directive is empty.. in which - # case the first substituion would insert a spurious \ oh happy day. + # case the first substitution would insert a spurious \ oh happy day. # as this has been the cause of much mystery and hair pulling _sigh_ if ($font_size ne '') { $text =~ s/\\begin\{document}/\\begin{document}{\\$font_size/; + $text =~ s/\\end\{document}/}\\end{document}/; + } - $text =~ s/\\end\{document}/}\\end{document}/; return $text; @@ -860,7 +992,7 @@ sub set_font_size { # - The PDF, if necessary, is replicated. # - The PDF is added to the list of files to convert to postscript (along with the images). # - The LaTeX is added to include the final converted postscript in the file as an included -# job. The assumption is that the includedpsheader.ps header will be included. +# job. The assumption is that the includepsheader.ps header will be included. # # Parameters: # pdf_uri - URI of the PDF file to include. @@ -884,9 +1016,9 @@ sub include_pdf { $file = &Apache::lonnet::filelocation('',$pdf_uri); } - # The file isn ow replicated locally.. or it did not exist in the first place + # The file is now replicated locally ... or it did not exist in the first place # (unlikely). If it did exist, add the pdf to the set of files/images that - # need tob e converted for this print job: + # need to be converted for this print job: my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; $file =~ s{(.*)/res/}{$londocroot/res/}; @@ -1023,8 +1155,8 @@ sub printf_style_subst { if ($size ne "") { $subst = substr($subst, 0, $size); - # Here's a nice edge case.. supose the end of the - # substring is a \. In that case may have just + # Here's a nice edge case ... suppose the end of the + # substring is a \. In that case may have just # chopped off a TeX escape... in that case, we append # " " for the trailing character, and let the field # spill over a bit (sigh). @@ -1060,12 +1192,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? @@ -1081,38 +1213,34 @@ 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'; + } - return $format; + $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 @@ -1238,7 +1366,7 @@ sub is_valid_alpha_code { sub is_code_valid { my ($code_value, $code_option) = @_; my ($code_type, $code_length) = ('letter', 6); # defaults. - my @lines = &Apache::grades::get_scantronformat_file(); + my @lines = &Apache::lonnet::get_scantronformat_file(); foreach my $line (@lines) { next if (($line =~ /^\#/) || ($line eq '')); my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; @@ -1312,7 +1440,7 @@ sub compare_names { } # Break the tie on the first name, but there are leading (possibly trailing - # whitespaces to get rid of first + # whitespaces to get rid of first) # $f1 =~ s/^\s+//; # Remove leading... $f1 =~ s/\s+$//; # Trailing spaces from first 1... @@ -1344,8 +1472,8 @@ sub latex_header_footer_remove { # necessity is determined by the problem_split param. # sub encapsulate_minipage { - my ($text) = @_; - if (!($env{'form.problem.split'} =~ /yes/i)) { + my ($text,$problem_split) = @_; + if (!($problem_split =~ /yes/i)) { $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}'; } return $text; @@ -1849,6 +1977,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; } @@ -1871,7 +2001,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); @@ -2076,16 +2205,28 @@ sub get_textwidth { sub unsupported { my ($currentURL,$mode,$symb)=@_; + my $cleanURL=&Apache::lonenc::check_decrypt($currentURL); + my $shown = $currentURL; + if (($cleanURL ne $currentURL) || ($symb =~ m{/^enc/})) { + $shown = &mt('URL not shown (encrypted)'); + } if ($mode ne '') {$mode='\\'.$mode} - 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.' '; + my $result = &print_latex_header($mode); + if ($cleanURL=~m|^(/adm/wrapper)?/ext/|) { + $cleanURL=~s|^(/adm/wrapper)?/ext/|http://|; + $cleanURL=~s|^http://https://|https://|; + if ($shown eq $currentURL) { + $shown = &Apache::lonxml::latex_special_symbols($cleanURL); + } + my $title=&Apache::lonnet::gettitle($symb); + $title = &Apache::lonxml::latex_special_symbols($title); + $result.=' \strut \\\\ \textit{'.$title.'} \strut \\\\ '.$shown.' '; } else { - $result.=$currentURL; + if ($shown eq $currentURL) { + $result.=&Apache::lonxml::latex_special_symbols($currentURL); + } else { + $result.=$shown; + } } $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}'; return $result; @@ -2123,19 +2264,12 @@ sub print_page_in_course { $numberofcolumns); my $LaTeXwidth=&recalcto_mm($textwidth); - if ($mode ne '') {$mode='\\'.$mode} my $result = &print_latex_header($mode); - 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); - } else { - my $esc_currentURL= $currentURL; - $esc_currentURL =~ s/_/\\_/g; - $result.=$esc_currentURL; - } - $result .= '\\\\'; + + my $title=&Apache::lonnet::gettitle($currentURL); + $title = &Apache::lonxml::latex_special_symbols($title); + $result .= '\noindent\textit{'.$title.'}\\\\'; if ($helper->{'VARS'}->{'style_file'}=~/\w/) { &Apache::lonnet::appenv({'construct.style' => @@ -2151,7 +2285,7 @@ sub print_page_in_course { foreach my $resource (@page_resources) { my $resource_src = $resource->src(); # Essentially the URL of the resource. - $result .= $resource->title() . '\\\\'; + my $current_url = $resource->link(); # Recurse if a .page: @@ -2161,11 +2295,10 @@ sub print_page_in_course { $result .= &print_page_in_course($helper, $rparmhash, $resource_src, \@page_resources); } elsif ($resource->ext()) { - $result .= &unsupported($currentURL,$mode,$symb); - } - # these resources go through the XML transformer: - - elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { + $result.=&latex_header_footer_remove(&unsupported($current_url,$mode,$resource->symb)); + } elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { + # these resources go through the XML transformer: + $result .= &Apache::lonxml::latex_special_symbols($resource->title()) . '\\\\'; my $urlp = &Apache::lonnet::clutter($resource_src); @@ -2178,7 +2311,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'}; @@ -2399,7 +2532,7 @@ sub load_skips { my ($helper) = @_; - # If this is the first time, unrap the resources and extra spaces: + # If this is the first time, unwrap the resources and extra spaces: if (!$skips_loaded) { @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'})); @@ -2549,7 +2682,7 @@ sub print_construction_sequence { my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; $body.=&path_to_problem($urlp,$LaTeXwidth); $body.='\vskip 1 mm '.$answer.'\end{document}'; - $body = &encapsulate_minipage($body); + $body = &encapsulate_minipage($body,$answerform{'problem_split'}); $texversion.=$body; } } @@ -2706,15 +2839,15 @@ ENDPART my @student_names=(); - # Common settings for the %form has: - # In some cases these settings get overriddent by specific cases, but the + # Common settings for the %form hash: + # In some cases these settings get overridden by specific cases, but the # settings are common enough to make it worthwhile factoring them out # here. # 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 @@ -2853,9 +2986,10 @@ ENDPART $result = &print_latex_header() . $result; } # End construction space sequence. - } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { + } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} + if ($currentURL=~/\/ext\.tool$/) {$currentURL=~s/^\/adm\/wrapper//;} $resources_printed .= $currentURL.':'; my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %form); if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { @@ -2941,7 +3075,6 @@ ENDPART &Apache::lonenc::reset_enc(); - # Note due to document structure, not allowed to put \newpage # prior to the first resource @@ -3014,7 +3147,7 @@ ENDPART my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; $body .= &path_to_problem ($urlp,$LaTeXwidth); $body .='\vskip 1 mm '.$answer; - $body = &encapsulate_minipage($body); + $body = &encapsulate_minipage($body,$answerform{'problem_split'}); $texversion .= $body; } else { $texversion=''; @@ -3038,7 +3171,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, @@ -3053,9 +3185,10 @@ ENDPART } $result .= $texversion; $flag_latex_header_remove = 'YES'; - } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { + } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} + if ($urlp=~/\/ext\.tool$/) {$urlp=~s/^\/adm\/wrapper//;} $resources_printed .= $urlp.':'; my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { @@ -3116,7 +3249,9 @@ ENDPART ($print_type eq 'all_problems_students') || ($print_type eq 'resources_for_students') || ($print_type eq 'incomplete_problems_selpeople_course') || - ($print_type eq 'map_incomplete_problems_people_seq')){ + ($print_type eq 'map_incomplete_problems_people_seq') || + ($print_type eq 'select_sequences_problems_for_students') || + ($print_type eq 'select_sequences_resources_for_students')) { #-- prints assignments for whole class or for selected students @@ -3125,10 +3260,12 @@ ENDPART ($print_type eq 'problems_for_students_from_page') || ($print_type eq 'all_problems_students') || ($print_type eq 'incomplete_problems_selpeople_course') || - ($print_type eq 'map_incomplete_problems_people_seq')) { + ($print_type eq 'map_incomplete_problems_people_seq') || + ($print_type eq 'select_sequences_problems_for_students')) { $selectionmade=5; $type='problems'; - } elsif ($print_type eq 'resources_for_students') { + } elsif (($print_type eq 'resources_for_students') || + ($print_type eq 'select_sequences_resources_for_students')) { $selectionmade=8; $type='resources'; } @@ -3167,8 +3304,12 @@ ENDPART my $map; if ($helper->{VARS}->{'symb'}) { - ($map, my $id, my $resource) = - &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'}); + unless ((($print_type eq 'all_problems_students') || + ($print_type eq 'incomplete_problems_selpeople_course')) && + $perm{'pfo'}) { + ($map, my $id, my $resource) = + &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'}); + } } #loop over students @@ -3228,7 +3369,9 @@ ENDPART $result .= $print_array[0].' \end{document}'; } elsif (($print_type eq 'problems_for_anon') || ($print_type eq 'problems_for_anon_page') || - ($print_type eq 'resources_for_anon') ) { + ($print_type eq 'resources_for_anon') || + ($print_type eq 'select_sequences_problems_for_anon') || + ($print_type eq 'select_sequences_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'}; @@ -3237,10 +3380,10 @@ ENDPART my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'}; my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'}; my $code_option=$helper->{'VARS'}->{'CODE_OPTION'}; - my @lines = &Apache::grades::get_scantronformat_file(); + my @lines = &Apache::lonnet::get_scantronformat_file(); my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10); foreach my $line (@lines) { - chomp($line); + next if (($line =~ /^\#/) || ($line eq '')); my ($name,$type,$length,$bubbles_per_item) = (split(/:/,$line))[0,2,4,17]; if ($name eq $code_option) { @@ -3252,18 +3395,10 @@ ENDPART } } } - my ($randomorder,$randompick,$map); + my $map; if ($helper->{VARS}{'symb'}) { ($map, my $id, my $resource) = &Apache::lonnet::decode_symb($helper->{VARS}{'symb'}); - my $navmap = Apache::lonnavmaps::navmap->new(); - if (defined($navmap)) { - if ($map) { - my $mapres = $navmap->getResourceByUrl($map); - $randomorder = $mapres->randomorder(); - $randompick = $mapres->randompick(); - } - } } my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth)); $moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; @@ -3323,7 +3458,7 @@ ENDPART my $count=0; my $nohidemap; if ($perm{'pav'} && $perm{'vgr'}) { - $nohidemap = 1; + $nohidemap = 1; } foreach my $code (sort(@allcodes)) { my $file_num=int($count/$number_per_page); @@ -3332,14 +3467,11 @@ ENDPART } else { $moreenv{'CODE'}=&num_to_letters($code); } - my $actual_seq = \@master_seq; - if ($randomorder || $randompick) { - $env{'form.CODE'} = $moreenv{'CODE'}; - $actual_seq = master_seq_to_person_seq($map, \@master_seq, - undef, - $moreenv{'CODE'}, $nohidemap); - delete($env{'form.CODE'}); - } + $env{'form.CODE'} = $moreenv{'CODE'}; + my $actual_seq = master_seq_to_person_seq($map, \@master_seq, + undef, + $moreenv{'CODE'}, $nohidemap); + delete($env{'form.CODE'}); my ($output,$fullname, $printed)= &print_resources($r,$helper,'anonymous',$type,\%moreenv, $actual_seq,$flag_latex_header_remove, @@ -3455,13 +3587,42 @@ ENDPART $URLback=$helper->{'VARS'}->{'filename'}; } elsif ($helper->{VARS}{'symb'}) { my ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}{'symb'}); + my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'}; + my ($anchor,$usehttp,$plainurl); $url = &Apache::lonnet::clutter($url); + $plainurl = $url; + if (($ENV{'SERVER_PORT'} == 443) && ($env{'request.course.id'}) && + (($url =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) || + ($url =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}))) { + unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl())) { + $usehttp = 1; + } + } if ($env{'request.enc'}) { - $url = &Apache::lonenc::encrypted($url); + $url = &Apache::lonenc::encrypted($url); } if ($url ne '') { - $URLback = $url.(($url =~ /\?/) ? '&':'?').'symb='.$helper->{VARS}{'symb'}; + my $symb = $helper->{VARS}{'symb'}; + if ($url =~ m{^\Q/adm/wrapper/ext/\E}) { + my $link = $url; + ($link,$anchor) = ($url =~ /^([^\#]+)(?:|(\#[^\#]+))$/); + if ($anchor) { + ($symb) = ($helper->{VARS}{'symb'} =~ /^([^\#]+)/); + } + $url = $link; + } + $URLback = $url; + if ($usehttp) { + $URLback .= (($URLback =~ /\?/) ? '&':'?').'usehttp=1'; + } + unless ($plainurl =~ /\.page$/) { + $URLback .= (($URLback =~ /\?/) ? '&':'?').'symb='.&escape($symb.$anchor); + } } + } elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') && + ($env{'request.course.id'})) { + $URLback=$helper->{VARS}->{'postdata'}; } # # Final adjustment of the font size: @@ -3636,7 +3797,7 @@ sub print_resources { # nice to put the special in as a postscript comment # e.g. \special{ps:\ENDOFSTUDENTSTAMP} unfortunately, # The special gets passed the \ and dvips puts it in the output file - # so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the + # so we will just rely on printout.pl to strip ENDOFSTUDENTSTAMP from the # postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. # @@ -3645,8 +3806,6 @@ sub print_resources { my $assignment; my $courseidinfo = &get_course(); my $possprint = scalar(@{$master_seq}); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } - if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} foreach my $curresline (@{$master_seq}) { if (defined $page_breaks{$curresline}) { @@ -3714,7 +3873,7 @@ sub print_resources { my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; $body .=&path_to_problem($res_url,$LaTeXwidth); $body .='\vskip 1 mm '.$ansrendered; - $body = &encapsulate_minipage($body); + $body = &encapsulate_minipage($body,$answerenv{'problem_split'}); $rendered = $header.$body; } } @@ -3730,7 +3889,7 @@ sub print_resources { $rendered =~ s/\\end\{document}//; } $current_output .= $rendered; - } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { + } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { if ($i == 1) { $syllabus_first = 1; } @@ -3747,7 +3906,7 @@ sub print_resources { $rendered =~ s/\\end\{document}//; } $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; - } elsif($res_url = ~/\.pdf$/) { + } elsif($res_url =~ /\.pdf$/) { my $url = &Apache::lonnet::clutter($res_url); my $rendered = &include_pdf($url); if ($remove_latex_header ne 'NO') { @@ -3771,7 +3930,7 @@ sub print_resources { if (($assignment ne $current_assignment) && ($assignment ne "")) { my $header_line = &format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, $assignment, $courseidinfo, - $fullname); + $fullname, $usersection); my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; $header_line = $header_start.'{'.$header_line.'}'; @@ -3803,8 +3962,8 @@ sub print_resources { } elsif ($print_incomplete) { $message = &mt('No incomplete resources'); } - if ($message) { - $current_output = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n"); + if ($message) { + $current_output = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n",$moreenv->{'problem_split'}); } if ($remove_latex_header eq "NO") { $current_output = &print_latex_header() . $current_output; @@ -3818,13 +3977,13 @@ sub print_resources { } 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); + &format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, + $currentassignment, $courseidinfo, $fullname, $usersection); my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; my $newheader = $header_start.'{'.$header_line.'}'; - if ($current_output=~/\\documentclass/) { $current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /; + } else { my $blankpages = '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'}; @@ -3833,6 +3992,7 @@ sub print_resources { ©right_line().' \newpage '.$blankpages.$end_of_student. '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'. $newheader.$namepostfix. '} \vskip 5 mm '.$current_output; + } # # Close the student bracketing. @@ -3865,8 +4025,9 @@ sub handler { if ($env{'request.course.id'}) { my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $clientip = &Apache::lonnet::get_requestor_ip($r); my ($blocked,$blocktext) = - &Apache::loncommon::blocking_status('printout',$cnum,$cdom); + &Apache::loncommon::blocking_status('printout',$clientip,$cnum,$cdom); if ($blocked) { my $checkrole = "cm./$cdom/$cnum"; if ($env{'request.course.sec'} ne '') { @@ -4044,7 +4205,9 @@ sub printHelper { $helper->{VARS}->{'construction'} = 1; } else { if ($env{'form.postdata'}) { - $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'}); + unless ($env{'form.postdata'} eq '/adm/navmaps') { + $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'}); + } if ( $helper->{VARS}->{'symb'} eq '') { $helper->{VARS}->{'postdata'} = $env{'form.postdata'}; } @@ -4053,23 +4216,42 @@ sub printHelper { $helper->{VARS}->{'symb'} = $env{'form.symb'}; } if ($env{'form.url'}) { - $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); + unless ($env{'form.url'} eq '/adm/navmaps') { + $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); + } } - } - if ($env{'form.symb'}) { - $helper->{VARS}->{'symb'} = $env{'form.symb'}; - } - if ($env{'form.url'}) { - $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); - - } if ($helper->{VARS}->{'symb'} ne '') { $helper->{VARS}->{'symb'}= &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'}); } - my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper); + my ($resourceTitle,$sequenceTitle,$mapTitle,$cdom,$cnum); + if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($env{'course.'.$env{'request.course.id'}.'.url'} eq + "uploaded/$cdom/$cnum/default.sequence") { + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + my @toplevelres = $navmap->retrieveResources('',sub { !(($_[0]->is_map()) || ($_[0]->src =~ /^\/adm\/navmaps/)) },0,0); + if (@toplevelres) { + my @printable; + if ($perm{'pav'} || $perm{'pfo'}) { + @printable = @toplevelres; + } else { + @printable = $navmap->retrieveResources(undef,sub { $_[0]->resprintable() },0,1); + } + if (@printable) { + $sequenceTitle = 'Main Content'; + $mapTitle = $sequenceTitle; + } + } + } + } + } else { + ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper); + } if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;} @@ -4101,17 +4283,31 @@ sub printHelper { ($map, $id, $url) = &Apache::lonnet::decode_symb($symb); $helper->{VARS}->{'postdata'} = &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url)); + } elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') && + ($env{'request.course.id'} ne '')) { + if ($env{'course.'.$env{'request.course.id'}.'.url'} eq + "uploaded/$cdom/$cnum/default.sequence") { + $map = $env{'course.'.$env{'request.course.id'}.'.url'}; + $url = $helper->{VARS}->{'postdata'}; + } + } + if (($symb ne '') || ($map ne '')) { if (!$userCanPrint) { my $navmap = Apache::lonnavmaps::navmap->new(); if (ref($navmap)) { - my $res = $navmap->getBySymb($symb); + my $res; + if ($symb ne '') { + $res = $navmap->getBySymb($symb); + } elsif ($map ne '') { + $res = $navmap->getResourceByUrl($map); + } if (ref($res)) { $res_printable = $res->resprintable(); #printability in course context ($res_printstartdate, $res_printenddate) = &get_print_dates($res); ($course_open, $course_close) = &course_print_dates($res); ($map_open, $map_close) = &map_print_dates($res); } else { - $res_error = 1; + $res_error = 1; } } else { $res_error = 1; @@ -4128,7 +4324,11 @@ sub printHelper { my $postdata = $helper->{VARS}->{'postdata'}; $resourceTitle = substr($postdata, rindex($postdata, '/') + 1); } - $subdir = &Apache::lonnet::filelocation("", $url); + if (($url eq '/adm/navmaps') && ($map eq $env{'course.'.$env{'request.course.id'}.'.url'})) { + $res_printable=0; + } else { + $subdir = &Apache::lonnet::filelocation("", $url); + } } @@ -4242,14 +4442,14 @@ sub printHelper { $helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE', 'Select Resource(s) to print', - 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"', + 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', 'RESOURCES', 'PAGESIZE', $url, $isNotMap, '', $symbFilter, $start_new_option); - + @@ -4267,20 +4467,25 @@ sub printHelper { # the exact form of this depends on whether or not we are privileged or a mere # plebe of s student: + my $optionText = ''; my $printSelector = 'map_incomplete_problems_seq'; my $nextState = 'CHOOSE_INCOMPLETE_SEQ'; my $textSuffix = ''; + my $nocurrloc = ''; + if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { + $nocurrloc = 1; + } 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); + &create_incomplete_folder_selstud_helper($helper, $map, $nocurrloc); &Apache::lonxml::xmlparse($r, 'helper', $helperStates); } else { if (&printable($map_open, $map_close)) { - my $helperStates = &create_incomplete_folder_helper($helper, $map); # Create needed states for student. + my $helperStates = &create_incomplete_folder_helper($helper, $map, $nocurrloc); # Create needed states for student. &Apache::lonxml::xmlparse($r, 'helper', $helperStates); } else { # TODO: Figure out how to break the news...this folder is not printable. @@ -4288,26 +4493,41 @@ sub printHelper { } if ($userCanPrint || &printable($map_open, $map_close)) { + if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { + $optionText = &mt('Selected [_1]Incomplete Problems[_2] [_3]not in a folder[_4]' . $textSuffix, + '','','',''); + } else { + $optionText = &mt('Selected [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix, + '','',''.$sequenceTitle.''); + } push(@{$printChoices}, - [&mt('Selected [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix, - '', '', - ''. $sequenceTitle . ''), + [$optionText, $printSelector, $nextState]); } # Allow problems from sequence if ($userCanPrint || &printable($map_open, $map_close)) { + if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { + $optionText = &mt('Selected [_1]Problems[_2] [_3]not in a folder[_4]','','','',''); + } else { + $optionText = &mt('Selected [_1]Problems[_2] from folder [_3]','','',''.$sequenceTitle.''); + } push @{$printChoices}, - [&mt('Selected [_1]Problems[_2] from folder [_3]','','',''.$sequenceTitle.''), + [$optionText, 'map_problems', 'CHOOSE_PROBLEMS']; # Allow all resources from sequence - push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','','',''.$sequenceTitle.''), + if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { + $optionText = &mt('Selected [_1]Resources[_2] [_3]not in a folder[_4]','','','',''); + } else { + $optionText = &mt('Selected [_1]Resources[_2] from folder [_3]','','',''.$sequenceTitle.''); + } + push @{$printChoices}, [$optionText, 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML']; my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS', 'Select Problem(s) to print', - 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"', + 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', 'RESOURCES', 'PAGESIZE', $map, @@ -4316,7 +4536,7 @@ sub printHelper { $start_new_option); $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML', 'Select Resource(s) to print', - 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"', + 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'" suppressNavmap="1"', 'RESOURCES', 'PAGESIZE', $map, @@ -4334,12 +4554,13 @@ sub printHelper { my $post_data = $helper->{VARS}->{'postdata'}; if ($perm{'pfo'} && !$is_published && - ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { + ($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'), + [&mt('Selected [_1]Incomplete Problems[_2] from [_3]entire course[_4] for [_5]selected people[_6]', + '','','','','',''), 'incomplete_problems_selpeople_course', 'INCOMPLETE_PROBLEMS_COURSE_RESOURCES']); my $helperFragment = &create_incomplete_course_helper($helper); # Create needed states. @@ -4347,9 +4568,9 @@ sub printHelper { # 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']; + push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from [_3]entire course[_4]','','','',''), 'all_problems', 'ALL_PROBLEMS']; + push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from [_3]entire course[_4]','','','',''), 'all_resources', 'ALL_RESOURCES']; + push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from [_3]entire course[_4] for [_5]selected people[_6]','','','','','',''), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS']; my $suffixXml = < Select sorting order of printout @@ -4373,7 +4594,7 @@ ALL_PROBLEMS $start_new_option) . &generate_resource_chooser('ALL_RESOURCES', 'Select Resource(s) to print', - " toponly='0' multichoice='1' suppressEmptySequences='0' addstatus='1' closeallpages='1' modallink='1'", + 'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', 'RESOURCES', 'PAGESIZE', '', @@ -4411,137 +4632,8 @@ ALL_PROBLEMS 'problems_for_anon', 'CHOOSE_ANON1']; } - my $randomly_ordered_warning = - &get_randomly_ordered_warning($helper, $map); - - # resource_selector will hold a few states that: - # - Allow resources to be selected for printing. - # - Determine pagination between assignments. - # - Determine how many assignments should be bundled into a single PDF. - # TODO: - # Probably good to do things like separate this up into several vars, each - # with one state, and use REGEXPs at inclusion time to set state names - # and next states for better mix and match capability - # - my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', - 'Select resources to print', - 'multichoice="1" addstatus="1" closeallpages="1" modallink="1"', - 'RESOURCES', - 'PRINT_FORMATTING', - $map, - $isProblem, '', $symbFilter, - $start_new_option); - $resource_selector .= &generate_format_selector($helper, - 'How should results be printed?', - 'PRINT_FORMATTING'). - &generate_resource_chooser('CHOOSE_STUDENTS_PAGE', - 'Select Problem(s) to print', - "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", - 'RESOURCES', - 'PRINT_FORMATTING', - $url, - $isProblem, '', $symbFilter, - $start_new_option); - - -# Generate student choosers. - - - - &Apache::lonxml::xmlparse($r, 'helper', - &generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE', - 'student_sort', - 'STUDENTS', - 'CHOOSE_STUDENTS_PAGE')); - &Apache::lonxml::xmlparse($r, 'helper', - &generate_student_chooser('CHOOSE_STUDENTS', - 'student_sort', - 'STUDENTS', - 'SELECT_PROBLEMS')); - &Apache::lonxml::xmlparse($r, 'helper', $resource_selector); - - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum); - my $namechoice=''; - foreach my $name (sort {uc($a) cmp uc($b)} @names) { - if ($name =~ /^error: 2 /) { next; } - 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; - 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); - } - push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]); - } - if (%codes_to_print) { - $code_selection .=' - Choose single CODE from list: - - - - - push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); - - - - '.$/; - - } - - my @lines = &Apache::grades::get_scantronformat_file(); - my $codechoice=''; - foreach my $line (@lines) { - my ($name,$description,$code_type,$code_length)= - (split(/:/,$line))[0,1,2,4]; - if ($code_length > 0 && - $code_type =~/^(letter|number|-1)/) { - $codechoice.=''.$description.''; - } - } - if ($codechoice eq '') { - $codechoice='Default'; - } - my $anon1 = &generate_code_selector($helper, - 'CHOOSE_ANON1', - 'SELECT_PROBLEMS', - $codechoice, - $code_selection, - $namechoice) . $resource_selector; - - - &Apache::lonxml::xmlparse($r, 'helper',$anon1); - - my $anon_page = &generate_code_selector($helper, - 'CHOOSE_ANON1_PAGE', - 'SELECT_PROBLEMS_PAGE', - $codechoice, - $code_selection, - $namechoice) . - &generate_resource_chooser('SELECT_PROBLEMS_PAGE', - 'Select Problem(s) to print', - "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", - 'RESOURCES', - 'PRINT_FORMATTING', - $url, - $isProblem, '', $symbFilter, - $start_new_option); - &Apache::lonxml::xmlparse($r, 'helper', $anon_page); - + my ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice) = + &generate_common_choosers($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option); if ($helper->{VARS}->{'assignment'}) { @@ -4550,9 +4642,18 @@ ALL_PROBLEMS 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']; } - - $resource_selector=< $randomly_ordered_warning PRINT_FORMATTING @@ -4649,6 +4750,7 @@ CHOOSE_ANON2 # FIXME: That RE should come from a library somewhere. if (($perm{'pav'} + && ($subdir ne '') && $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/' && (defined($helper->{'VARS'}->{'construction'}) || @@ -4682,14 +4784,148 @@ CHOOSE_FROM_SUBDIR # Allow the user to select any sequence in the course, feed it to # another resource selector for that sequence - if (!$helper->{VARS}->{'construction'} && !$is_published) { - push @$printChoices, [&mtn("Selected Resources from selected folder in course"), - 'select_sequences', 'CHOOSE_SEQUENCE']; - my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; - #Escape apostrophes and backslashes for Perl - $escapedSequenceName =~ s/\\/\\\\/g; - $escapedSequenceName =~ s/'/\\'/g; - &Apache::lonxml::xmlparse($r, 'helper', <{VARS}->{'construction'}) && + (!$is_published || (($subdir eq '') && ($url eq '/adm/navmaps')))) { + push(@$printChoices,[&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course', + '','','',''), + 'select_sequences','CHOOSE_SEQUENCE']); + my $escapedSequenceName; + if ($helper->{VARS}->{'SEQUENCE'} ne '') { + $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; + } elsif (($subdir eq '') && ($url eq '/adm/navmaps')) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($env{'course.'.$env{'request.course.id'}.'.url'} eq + "uploaded/$cdom/$cnum/default.sequence") { + $escapedSequenceName = $env{'course.'.$env{'request.course.id'}.'.url'}; + } + } + #Escape apostrophes and backslashes for Perl + $escapedSequenceName =~ s/\\/\\\\/g; + $escapedSequenceName =~ s/'/\\'/g; + my $nocurrloc; + if (($subdir eq '') && ($url eq '/adm/navmaps')) { + $nocurrloc = 'nocurrloc="1"'; + if ($perm{'pfo'}) { + push(@{$printChoices}, + [&mt('Selected [_1]Problems[_2] from [_3]selected folder[_4] in course for [_5]selected people[_6]', + '','','','','',''), + 'select_sequences_problems_for_students','CHOOSE_SEQUENCE_STUDENTS'], + [&mt('Selected [_1]Problems[_2] from [_3]selected folder[_4] in course for [_5]CODEd assignments[_6]', + '','','','','',''), + 'select_sequences_problems_for_anon','CHOOSE_SEQUENCE_ANON1'], + [&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course for [_5]selected people[_6]', + '','','','','',''), + 'select_sequences_resources_for_students','CHOOSE_SEQUENCE_STUDENTS1'], + [&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course for [_5]CODEd assignments[_6]', + '','','','','',''), + 'select_sequences_resources_for_anon','CHOOSE_SEQUENCE_ANON2']); + if ($escapedSequenceName) { + my ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice) = + &generate_common_choosers($r,$helper,$escapedSequenceName,$escapedSequenceName, + $isProblem,$symbFilter,$start_new_option); + + my $resource_selector .= < + + Sort by section then student + Sort by students across sections. + +


+ + + + + $randomly_ordered_warning + PRINT_FORMATTING + (mark desired resources then click "next" button)
+ + return $isNotMap; + $map + return $symbFilter; + $start_new_option + +
+RESOURCE_SELECTOR + + my $anon3 = &generate_code_selector($helper, + 'CHOOSE_ANON3', + 'SELECT_RESOURCES', + $codechoice, + $code_selection, + $namechoice) . $resource_selector; + + &Apache::lonxml::xmlparse($r, 'helper',$anon3); + } + } + } + if (($subdir eq '') && ($url eq '/adm/navmaps') && ($perm{'pfo'})) { + &Apache::lonxml::xmlparse($r, 'helper', < + Select the sequence to print resources from: + + CHOOSE_FROM_ANY_SEQUENCE + return &Apache::lonprintout::printable_sequence(\$res); + return $urlValue; + return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); + + + + + Select the sequence to print resources from: + + CHOOSE_STUDENTS + return &Apache::lonprintout::printable_sequence(\$res); + return $urlValue; + return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); + + + + + Select the sequence to print resources from: + + CHOOSE_ANON1 + return &Apache::lonprintout::printable_sequence(\$res); + return $urlValue; + return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); + + + + + Select the sequence to print resources from: + + CHOOSE_STUDENTS2 + return &Apache::lonprintout::printable_sequence(\$res); + return $urlValue; + return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); + + + + + Select the sequence to print resources from: + + CHOOSE_ANON3 + return &Apache::lonprintout::printable_sequence(\$res); + return $urlValue; + return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); + + + + + (mark desired resources then click "next" button)
+ + PAGESIZE + return $isNotMap + return '$escapedSequenceName'; + return $symbFilter; + $start_new_option + +
+CHOOSE_FROM_ANY_SEQUENCE + } else { + &Apache::lonxml::xmlparse($r, 'helper', < Select the sequence to print resources from: @@ -4703,7 +4939,7 @@ CHOOSE_FROM_SUBDIR (mark desired resources then click "next" button)
+ closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc> PAGESIZE return $isNotMap return '$escapedSequenceName'; @@ -4712,8 +4948,8 @@ CHOOSE_FROM_SUBDIR
CHOOSE_FROM_ANY_SEQUENCE -} - + } + } my $numchoices = 0; if (ref($printChoices) eq 'ARRAY') { $numchoices = @{$printChoices}; @@ -4759,9 +4995,9 @@ CHOOSE_FROM_ANY_SEQUENCE if ($noprintmsg) { $paramHash = Apache::lonhelper::getParamHash(); - $paramHash->{MESSAGE_TEXT} = + $paramHash->{MESSAGE_TEXT} = '

'.$noprintmsg.'

'; - Apache::lonhelper::message->new(); + Apache::lonhelper::message->new(); } } $paramHash = Apache::lonhelper::getParamHash(); @@ -4808,7 +5044,7 @@ CHOOSE_FROM_ANY_SEQUENCE my $xmlfrag = << "FONT_SELECTION"; - + return 'normalsize'; @@ -4986,7 +5222,7 @@ FONT_SELECTION return "$helper->{VARS}->{'probstatus'}"; Homework Problem - Exam Problem + Bubblesheet Exam Problem Survey question ,choice computer="anonsurvey"Anonymous survey question @@ -5104,6 +5340,9 @@ sub render { my $PaperType=&mt('Paper type'); my $landscape=&mt('Landscape'); my $portrait=&mt('Portrait'); + my $pdfFormLabel=&mt('PDF Form Fields'); + my $with=&mt('with Form Fields'); + my $without=&mt('without Form Fields'); $result.='

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

' @@ -5112,6 +5351,7 @@ sub render { .''.$PageLayout.'' .''.$NumberOfColumns.'' .''.$PaperType.'' + .''.$pdfFormLabel.'' .&Apache::loncommon::end_data_table_header_row() .&Apache::loncommon::start_data_table_row() .'' @@ -5152,6 +5392,12 @@ sub render { $result .= < + + + HTML $result.=&Apache::loncommon::end_data_table_row() .&Apache::loncommon::end_data_table(); 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.