Diff for /loncom/interface/lonprintout.pm between versions 1.610 and 1.627.2.6

version 1.610, 2011/11/29 11:57:33 version 1.627.2.6, 2013/06/05 14:16:18
Line 1 Line 1
   
 # The LearningOnline Network  # The LearningOnline Network
 # Printout  # Printout
 #  #
Line 28 Line 27
 #  #
 package Apache::lonprintout;  package Apache::lonprintout;
 use strict;  use strict;
   use POSIX;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lonnet;  use Apache::lonnet;
Line 41  use Apache::admannotations; Line 41  use Apache::admannotations;
 use Apache::lonenc;  use Apache::lonenc;
 use Apache::entities;  use Apache::entities;
 use Apache::londefdef;  use Apache::londefdef;
   # use Apache::structurelags; # for language management.
   
 use File::Basename;  use File::Basename;
   
 use HTTP::Response;  use HTTP::Response;
 use LONCAPA::map();  use LONCAPA::map();
 use POSIX qw(strftime);  use POSIX qw(ctime);
 use Apache::lonlocal;  use Apache::lonlocal;
 use Carp;  use Carp;
 use LONCAPA;  use LONCAPA;
Line 76  my $font_size = 'normalsize'; # Default Line 77  my $font_size = 'normalsize'; # Default
   
 #----------------------------  Helper helpers. -------------------------  #----------------------------  Helper helpers. -------------------------
   
   ## 
   # Filter function to determine if a resource is a printable sequence.
   #
   # @param $res -Resource to check.
   #
   # @return 1 - printable and a resource
   #         0 - either notm a sequence or not printable.
   #
   sub printable_sequence {
       my $res = shift;
   
       # Non-sequences are not listed:
   
       if (!$res->is_sequence()) {
    return 0;
       }
   
       # Person with pav or pfo can always print:
   
       if ($perm{'pav'} || $perm{'pfo'}) {
    return 1;
       }
   
       if ($res->is_sequence()) {
    my $symb = $res->symb();
    my $navmap   = $res->{NAV_MAP};
   
    # Find the first resource in the map:
   
    my $iterator = $navmap->getIterator($res, undef, undef, 1, 1);
    my $first    = $iterator->next();
   
    while (1) {
       if ($first == $iterator->END_ITERATOR) { last; }
       if (ref($first) && ! $first->is_sequence()) {last; }
       $first = $iterator->next();
    }
   
   
    # Might be an empty map:
   
    if (!ref($first)) {
       return 0;
    }
    my $partsref = $first->parts();
    my @parts    = @$partsref;
    my ($open, $close) = $navmap->map_printdates($first, $parts[0]);
    return &printable($open, $close);
       }
       return 0;
   }
   
 # BZ5209:  # BZ5209:
 #    Create the states needed to run the helper for incomplete problems from  #    Create the states needed to run the helper for incomplete problems from
 #    the current folder for selected students.  #    the current folder for selected students.
Line 96  my $font_size = 'normalsize'; # Default Line 149  my $font_size = 'normalsize'; # Default
 # Return:  # Return:
 #     XML that can be parsed by the helper to drive the state machine.  #     XML that can be parsed by the helper to drive the state machine.
 #  #
 sub create_incomplete_folder_selstud_helper($helper)  sub create_incomplete_folder_selstud_helper {
 {  
     my ($helper, $map)  = @_;      my ($helper, $map)  = @_;
   
   
Line 434  RESOURCE_SELECTOR Line 486  RESOURCE_SELECTOR
   
 #-----------------------------------------------------------------------  #-----------------------------------------------------------------------
   
   # Computes an open and close date from a list of open/close dates for a resource's
   # parts.
   #
   # @param \@opens - reference to an array of open dates.
   # @param \@closes - reference to an array of close dates.
   #
   # @return ($open, $close) 
   #
   # @note If open/close dates are not defined they will be retunred as undef
   # @note It is possible for there to be no overlap in which case -1,-1 
   #       will be returned.
   # @note The algorithm used is to take the latest open date and the earliest end date.
   #
   sub compute_open_window {
       my ($opensref, $closesref) = @_;
   
       my @opens   = @$opensref;
       my @closes  = @$closesref;
   
       # latest open date:
       my $latest_open;
   
       foreach my $open (@opens) {
    if (!defined($latest_open) || ($open > $latest_open)) {
       $latest_open = $open;
    }
       }
       # Earliest close:
   
       my $earliest_close;
       foreach my $close (@closes) {
    if (!defined($earliest_close) || ($close < $earliest_close)) {
       $earliest_close = $close;
    }
       }
   
       # If no overlap...both are -1 as promised.
   
       if (defined($earliest_close) && defined($latest_open)
    && ($earliest_close < $latest_open)) {
    $latest_open  = -1;
    $earliest_close = -1;
       }
       
       return ($latest_open, $earliest_close);
     
   }
   
   ##
   #  Determines if 'now' is within the set of printable dates.
   #
   #  @param $open_date - Starting date/timestamp.
   #  @param $close_date - Ending date/timestamp.
   #
   #  @return 0 - Not open.
   #  @return 1 - open.
   #
   sub printable {
       my ($open_date, $close_date) = @_;
   
   
       my $now = time();
   
       # Have to do a bit of fancy footwork around undefined open/close dates:
   
       if ($open_date && ($open_date > $now)) {
    return 0;
       }
   
       if ($close_date && ($close_date < $now)) {
    return 0;
       }
       
       return 1;
   
   }
   
   ##
   # Returns the innermost print start/print end dates for a resource.
   # This is done by looking at the start/end dates for its parts and choosing
   # the intersection of those dates.
   # 
   # @param res - lonnvamaps::resource object that represents the resource.
   #
   # @return (opendate, closedate)
   #
   # @note If open/close dates are not defined they will be retunred as undef
   # @note It is possible for there to be no overlap in which case -1,-1 
   #       will be returned.
   # @note The algorithm used is to take the latest open date and the earliest end date.
   #
   
   sub get_print_dates {
       my $res = shift;
       my $partsref = $res->parts();
       my @parts;
       if (ref($partsref) eq 'ARRAY') {
           @parts   = @{$partsref};
       }
       my $open_date;
       my $close_date;
       my @open_dates;
       my @close_dates;
   
   
       if (@parts) {
    foreach my $part (@parts) {
       my $partopen  = $res->parmval('printstartdate', $part);
       my $partclose = $res->parmval('printenddate',  $part);
   
       push(@open_dates, $partopen);
       push(@close_dates, $partclose);
    }
       }
   
       ($open_date, $close_date)  = &compute_open_window(\@open_dates, \@close_dates);
   
       if ($open_date) {
    $open_date  = POSIX::strftime('%D', localtime($open_date));
       }
       if ($close_date) {
    $close_date = POSIX::strftime('%D', localtime($close_date));
       }
   
       return ($open_date, $close_date);
   }
   
   ##
   # Get the dates for which a course says a resource can be printed.  This is like
   # 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.
   #
   # @return (opendate, closedate)
   #
   sub course_print_dates {
       my $res = shift;
       my $partsref = $res->parts();
       my @parts    = @$partsref;
       my $open_date;
       my $close_date;
       my @open_dates;
       my @close_dates;
       my $navmap = $res->{NAV_MAP}; # Slightly OO dirty.
   
       # Don't bother looping over undefined or empty parts arraY;
   
       if (@parts) {
    foreach my $part (@parts) {
       my ($partopen, $partclose) = $navmap->course_printdates($res, $part);
       push(@open_dates, $partopen);
       push(@close_dates, $partclose);
    }
    ($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates);
       }
       return ($open_date, $close_date);
   }
   ##
   # Same as above but for the enclosing map:
   #
   sub map_print_dates {
       my $res = shift;
       my $partsref = $res->parts();
       my @parts    = @$partsref;
       my $open_date;
       my $close_date;
       my @open_dates;
       my @close_dates;
       my $navmap = $res->{NAV_MAP}; # slightly OO dirty.
   
   
       # Don't bother looping over undefined or empty parts arraY;
   
       if (@parts) {
    foreach my $part (@parts) {
       my ($partopen, $partclose) = $navmap->map_printdates($res, $part);
       push(@open_dates, $partopen);
       push(@close_dates, $partclose);
    }
    ($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates);
       }
       return ($open_date, $close_date);
   }
   
 # Determine if a resource is incomplete given the map:  # Determine if a resource is incomplete given the map:
 # Parameters:  # Parameters:
 #   $username - Name of user for whom we are checking.  #   $username - Name of user for whom we are checking.
Line 467  sub incomplete { Line 704  sub incomplete {
 #  to only those that are in the original set selcted to be printed.  #  to only those that are in the original set selcted to be printed.
 #  #
 # Parameters:  # Parameters:
 #   $helper - The helper we need $helper->{'VARS'}->{'symb'}  #   $map - The URL of the folder being printed.
 #            to construct the navmap and the iteration.  #          Used to determine which startResource and finishResource
 #   $seq   - The original set of resources to print   #          to use when using the navmap's getIterator method.
   #   $seq   - The original set of resources to print.
 #            (really an array of resource names (array of symb's).  #            (really an array of resource names (array of symb's).
 #   $who   - Student/domain for whome the sequence will be generated.  #   $who   - Student/domain for whome the sequence will be generated.
   #   $code  - CODE being printed when printing Problems/Resources
   #            from folder for CODEd assignments
 #  #
 # Implicit inputs:  # Implicit inputs:
 #   $  #   $
Line 480  sub incomplete { Line 720  sub incomplete {
 #   print_resources.  #   print_resources.
 #   # 
 sub master_seq_to_person_seq {  sub master_seq_to_person_seq {
     my ($helper, $seq, $who) = @_;      my ($map, $seq, $who, $code, $nohidemap) = @_;
   
   
     my ($username, $userdomain, $usersection) = split(/:/, $who);      my ($username, $userdomain, $usersection) = split(/:/, $who);
   
   
     # Toss the sequence up into a hash so that we have O(1) lookup time.      # Toss the sequence up into a hash so that we have O(1) lookup time.
     # on the items that come out of the user's list of resources.      # on the items that come out of the user's list of resources.
     #      #
       
     my %seq_hash = map {$_  => 1} @$seq;      my %seq_hash = map {$_  => 1} @$seq;
     my @output_seq;      my @output_seq;
   
       my $unhidden;
       if ($perm{'pav'} && $perm{'vgr'} && $nohidemap) {
           $unhidden = &Apache::lonnet::clutter($map);
       }
           
     my ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'});      my $navmap           = Apache::lonnavmaps::navmap->new($username, $userdomain,
     my $navmap           = Apache::lonnavmaps::navmap->new($username, $userdomain);                                                             $code,$unhidden);
     my $iterator         = $navmap->getIterator($navmap->firstResource(),      my ($start,$finish);
  $navmap->finishResource(),  
  {}, 1);      if ($map) {
     my %nonResourceItems = (          my $mapres = $navmap->getResourceByUrl($map);
  $iterator->BEGIN_MAP    => 1,          if ($mapres->is_map()) {
  $iterator->BEGIN_BRANCH => 1,              $start = $mapres->map_start();
  $iterator->END_BRANCH   => 1,              $finish = $mapres->map_finish();
  $iterator->END_MAP      => 1,          }
  $iterator->FORWARD      => 1,      }
  $iterator->BACKWARD     => 1      unless ($start && $finish) {
           $start = $navmap->firstResource();
           $finish = $navmap->finishResource();
       }
   
     ); # These items are not resources but appear in the midst of iteration.      my $iterator         = $navmap->getIterator($start,$finish,{},1);
   
     #  Iterate on the resource..select the items that are randomly selected      #  Iterate on the resource..select the items that are randomly selected
     #  and that are in the seq_has.  Presumably the iterator will take care      #  and that are in the seq_has.  Presumably the iterator will take care
     # of the random ordering part of the deal.      # of the random ordering part of the deal.
     #  
     my $curres;      my $curres;
     while ($curres = $iterator->next()) {      while ($curres = $iterator->next()) {
  #   #
  #  Only process resources..that are not removed by randomout...   #  Only process resources..that are not removed by randomout...
  #  and are selected for printint as well.   #  and are selected for printint as well.
  #   #
        
  if (! exists $nonResourceItems{$curres} && ! $curres->randomout()) {          if (ref($curres) && ! $curres->randomout()) {
     my $symb = $curres->symb();              my $currsymb = $curres->symb();
     if (exists $seq_hash{$symb}) {              if (exists($seq_hash{$currsymb})) {
  push(@output_seq, $symb);                  push(@output_seq, $currsymb);
     }      }
  }   }
     }      }
      
   
     return \@output_seq; # for now.      return \@output_seq; # for now.
           
Line 660  sub include_pdf { Line 905  sub include_pdf {
   
   
 }  }
   ##
   #  Collect the various \select_language{language_name}
   #  latex tags to build a \usepackage[lang-list]{babel} which will
   #  appear just prior to the \begin{document} at the front of the concatenated
   #  set of resources:
   # @param doc - The string of latex to search/replace.
   # @return string
   # @retval - the modified document stringt.
   #
   sub collect_languages {
       my $doc = shift;
       my %languages;
       while ($doc =~ /\\selectlanguage{(\w+)}/mg) {
    $languages{$1} = 1; # allows us to request each language exactly once.
       }
       my @lang_list = (keys(%languages)); # List of unique languages
       if (scalar @lang_list) {
    my $babel_header = '\usepackage[' . join(',', @lang_list) .']{babel}'. "\n";
    $doc =~ s/\\begin{document}/$babel_header\\begin{document}/;
       }
       return $doc;
   }
   #-------------------------------------------------------------------
   
 #  #
 #   ssi_with_retries- Does the server side include of a resource.  #   ssi_with_retries- Does the server side include of a resource.
Line 784  sub printf_style_subst { Line 1051  sub printf_style_subst {
 #     %s    - The section if it is supplied.  #     %s    - The section if it is supplied.
 #  #
 sub format_page_header {  sub format_page_header {
     my ($width, $format, $assignment, $course, $student, $section) = @_;      my ($width, $format, $assignment, $course, $student) = @_;
   
   
   
     $width = &recalcto_mm($width); # Get width in mm.      $width = &recalcto_mm($width); # Get width in mm.
     my $chars_per_line = int($width/1.6);   # Character/textline.      my $chars_per_line = int($width/2);   # Character/textline.
   
     #  Default format?      #  Default format?
   
Line 805  sub format_page_header { Line 1072  sub format_page_header {
  # - Allow the assignment to be 2 lines (wrapped).   # - 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);
           }
   
  my $name_length    = int($chars_per_line *3 /4);          $format =  "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}";
  my $sec_length     = int($chars_per_line / 5);  
   
  $format  = "%$name_length".'n';      } 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!!!
   
  if ($section) {      }
     $format .=  ' - Sec: '."%$sec_length".'s';  
  }  
   
  $format .= '\\\\%c \\\\ %a';      return $format;
           
   
     }  
     # 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      # 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      # there is '\\ \\ ' in the page header. That's cause a error in LaTeX
     if($format =~ /\\\\\s\\\\\s/) {      if($format =~ /\\\\\s\\\\\s/) {
         #TODO find sensible caption for page header          #TODO find sensible caption for page header
         my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout ');          my $testPrintout = '\\\\'.&mt('Authoring Space').' \\\\'.&mt('Test-Printout ');
         $format =~ s/\\\\\s\\\\\s/$testPrintout/;          $format =~ s/\\\\\s\\\\\s/$testPrintout/;
     }      }
     #      #
Line 976  sub is_code_valid { Line 1247  sub is_code_valid {
     }      }
   
 }  }
   #
   # Compare two students by section (Used to sort by section).
   #
   #  Implicit inputs, 
   #    $a - The first one
   #    $b - The second one.
   #
   #  Returns:
   #     a-section cmp b-section
   #
   sub compare_sections {
       my ($u1, $d1, $s1, $n1, $stat1) = split(/:/, $a);
       my ($u2, $d2, $s2, $n2, $stat2) = split(/:/, $b);
   
       return $s1 cmp $s2;
   }
   
 #   Compare two students by name.  The students are in the form  #   Compare two students by name.  The students are in the form
 #   returned by the helper:  #   returned by the helper:
Line 1552  sub get_course { Line 1839  sub get_course {
     my $courseidinfo;      my $courseidinfo;
     if (defined($env{'request.course.id'})) {      if (defined($env{'request.course.id'})) {
  $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');   $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
  my $sec = $env{'request.course.sec'};  
       
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
Line 1576  sub page_format_transformation { Line 1861  sub page_format_transformation {
   
     my $name = &get_name();      my $name = &get_name();
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     my $header_text  = $parmhash{'print_header_format'};      my $header_text  = $parmhash{'print_header_format'};
     $header_text     = &format_page_header($textwidth, $header_text, $assignment,      $header_text     = &format_page_header($textwidth, $header_text, $assignment,
    $courseidinfo, $name);     $courseidinfo, $name);
Line 1784  sub unsupported { Line 2070  sub unsupported {
     my $result.= &print_latex_header($mode);      my $result.= &print_latex_header($mode);
     if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {      if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {
  $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;   $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;
           $currentURL=~s|^http://https://|https://|;
  my $title=&Apache::lonnet::gettitle($symb);   my $title=&Apache::lonnet::gettitle($symb);
  $title = &Apache::lonxml::latex_special_symbols($title);   $title = &Apache::lonxml::latex_special_symbols($title);
  $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' ';   $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' ';
Line 1863  sub print_page_in_course { Line 2150  sub print_page_in_course {
     my @page_resources = $navmap->retrieveResources($resource_src);      my @page_resources = $navmap->retrieveResources($resource_src);
     $result           .= &print_page_in_course($helper, $rparmhash,       $result           .= &print_page_in_course($helper, $rparmhash, 
        $resource_src, \@page_resources);         $resource_src, \@page_resources);
           } elsif ($resource->ext()) {
               $result .= &unsupported($currentURL,$mode,$symb);
  }   }
  # these resources go through the XML transformer:   # these resources go through the XML transformer:
   
Line 1879  sub print_page_in_course { Line 2168  sub print_page_in_course {
   
     $form{'grade_target'}  = 'tex';      $form{'grade_target'}  = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFields'} = $pdfFormFields; #       $form{'pdfFormFields'} = 'no'; # 
     $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};          $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};    
           
     $form{'problem_split'}=$parmhash{'problem_stream_switch'};      $form{'problem_split'}=$parmhash{'problem_stream_switch'};
Line 1932  sub print_page_in_course { Line 2221  sub print_page_in_course {
  $texversion.=&path_to_problem($urlp,$LaTeXwidth);   $texversion.=&path_to_problem($urlp,$LaTeXwidth);
     } else {      } else {
  $texversion.='\vskip 0 mm \noindent\textbf{'.   $texversion.='\vskip 0 mm \noindent\textbf{'.
                         &mt("Printing from Construction Space: No Title").'}\vskip 0 mm ';                          &mt("Printing from Authoring Space: No Title").'}\vskip 0 mm ';
  $texversion.=&path_to_problem($urlp,$LaTeXwidth);   $texversion.=&path_to_problem($urlp,$LaTeXwidth);
     }      }
     $texversion.='\vskip 1 mm '.$answer.'\end{document}';      $texversion.='\vskip 1 mm '.$answer.'\end{document}';
Line 2329  sub print_construction_sequence { Line 2618  sub print_construction_sequence {
 #  For item 100, filtering was done at the helper level.  #  For item 100, filtering was done at the helper level.
   
 sub output_data {  sub output_data {
   
     my ($r,$helper,$rparmhash) = @_;      my ($r,$helper,$rparmhash) = @_;
     my %parmhash = %$rparmhash;      my %parmhash = %$rparmhash;
     $ssi_error = 0; # This will be set nonzero by failing ssi's.      $ssi_error = 0; # This will be set nonzero by failing ssi's.
Line 2414  ENDPART Line 2704  ENDPART
     my %form;      my %form;
     $form{'grade_target'} = 'tex';      $form{'grade_target'} = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFields'} = $pdfFormFields;      $form{'pdfFormFields'} = 'no';
   
     # If form.showallfoils is set, then request all foils be shown:      # If form.showallfoils is set, then request all foils be shown:
     # privilege will be enforced both by not allowing the       # privilege will be enforced both by not allowing the 
Line 2512  ENDPART Line 2802  ENDPART
  $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);   $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);
     } else {      } else {
  $texversion.='\vskip 0 mm \noindent\textbf{'.   $texversion.='\vskip 0 mm \noindent\textbf{'.
                         &mt("Printing from Construction Space: No Title").'}\vskip 0 mm ';                          &mt("Printing from Authoring Space: No Title").'}\vskip 0 mm ';
   
  $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);   $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);
     }      }
Line 2602  ENDPART Line 2892  ENDPART
      ($print_type eq 'select_sequences')      or       ($print_type eq 'select_sequences')      or
      ($print_type eq 'map_incomplete_problems_seq')       ($print_type eq 'map_incomplete_problems_seq')
      ) {       ) {
   
     
         #-- produce an output string          #-- produce an output string
  if (($print_type eq 'map_problems')                or   if (($print_type eq 'map_problems')                or
Line 2739  ENDPART Line 3028  ENDPART
  if (($selectionmade == 4) and ($assignment ne $prevassignment)) {   if (($selectionmade == 4) and ($assignment ne $prevassignment)) {
     my $name = &get_name();      my $name = &get_name();
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
                       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     $prevassignment=$assignment;      $prevassignment=$assignment;
     my $header_text = $parmhash{'print_header_format'};      my $header_text = $parmhash{'print_header_format'};
     $header_text    = &format_page_header($textwidth, $header_text,      $header_text    = &format_page_header($textwidth, $header_text,
   $assignment,     $assignment, 
   $courseidinfo,     $courseidinfo, 
   $name);    $name);
   
     if ($numberofcolumns eq '1') {      if ($numberofcolumns eq '1') {
  $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm ';   $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm ';
     } else {      } else {
Line 2846  ENDPART Line 3135  ENDPART
  if (($helper->{'VARS'}->{'student_sort'}    eq 1)  &&    if (($helper->{'VARS'}->{'student_sort'}    eq 1)  && 
      ($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) {       ($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) {
      @students = sort compare_names  @students;       @students = sort compare_names  @students;
    } else {
        @students = sort compare_sections @students; 
  }   }
  &adjust_number_to_print($helper);   &adjust_number_to_print($helper);
   
Line 2864  ENDPART Line 3155  ENDPART
  }   }
  my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};   my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
   
            my $map;
            if ($helper->{VARS}->{'symb'}) {
                ($map, my $id, my $resource) =
                    &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'});
            }
   
  #loop over students   #loop over students
   
   my $flag_latex_header_remove = 'NO';    my $flag_latex_header_remove = 'NO';
Line 2878  ENDPART Line 3175  ENDPART
      ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) {       ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) {
      $moreenv{'problem_split'}='yes';       $moreenv{'problem_split'}='yes';
  }   }
  my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75');   my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$#students+1);
  my $student_counter=-1;   my $student_counter=-1;
  my $i = 0;   my $i = 0;
  my $last_section = (split(/:/,$students[0]))[2];   my $last_section = (split(/:/,$students[0]))[2];
Line 2898  ENDPART Line 3195  ENDPART
      } else {       } else {
  $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});   $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
      }       }
      my $actual_seq = master_seq_to_person_seq($helper, \@master_seq, $person);       my $actual_seq = master_seq_to_person_seq($map, \@master_seq,
                                                          $person, undef, 1);
      my ($output,$fullname, $printed)=&print_resources($r,$helper,       my ($output,$fullname, $printed)=&print_resources($r,$helper,
      $person,$type,       $person,$type,
      \%moreenv,  $actual_seq,       \%moreenv,  $actual_seq,
Line 2924  ENDPART Line 3222  ENDPART
  my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};   my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};
  my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};   my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};
  my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};   my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};
   
  my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};   my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};
          my @lines = &Apache::grades::get_scantronformat_file();           my @lines = &Apache::grades::get_scantronformat_file();
  my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10);   my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10);
Line 2941  ENDPART Line 3238  ENDPART
                  }                   }
      }       }
  }   }
            my ($randomorder,$randompick,$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));   my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
  $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};   $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
          $moreenv{'instructor_comments'}='hide';           $moreenv{'instructor_comments'}='hide';
Line 2993  ENDPART Line 3303  ENDPART
      $number_per_page=$num_todo > 0 ? $num_todo : 1;       $number_per_page=$num_todo > 0 ? $num_todo : 1;
  }   }
  my $flag_latex_header_remove = 'NO';    my $flag_latex_header_remove = 'NO'; 
  my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline','75');   my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$num_todo);
  my $count=0;   my $count=0;
  foreach my $code (sort(@allcodes)) {   foreach my $code (sort(@allcodes)) {
      my $file_num=int($count/$number_per_page);       my $file_num=int($count/$number_per_page);
Line 3002  ENDPART Line 3312  ENDPART
      } else {       } else {
  $moreenv{'CODE'}=&num_to_letters($code);   $moreenv{'CODE'}=&num_to_letters($code);
      }       }
                my $actual_seq = \@master_seq;
                if ($randomorder) {
                    $env{'form.CODE'} = $moreenv{'CODE'};
                    $actual_seq = master_seq_to_person_seq($map, \@master_seq,
                                                           undef,
                                                           $moreenv{'CODE'}, 1);
                    delete($env{'form.CODE'});
                }
      my ($output,$fullname, $printed)=       my ($output,$fullname, $printed)=
  &print_resources($r,$helper,'anonymous',$type,\%moreenv,   &print_resources($r,$helper,'anonymous',$type,\%moreenv,
   \@master_seq,$flag_latex_header_remove,    $actual_seq,$flag_latex_header_remove,
   $LaTeXwidth);    $LaTeXwidth);
      $resources_printed .= ":";       $resources_printed .= ":";
      $print_array[$file_num].=$output;       $print_array[$file_num].=$output;
Line 3057  ENDPART Line 3375  ENDPART
     $texversion.=&path_to_problem ($urlp,$LaTeXwidth);      $texversion.=&path_to_problem ($urlp,$LaTeXwidth);
  } else {   } else {
     $texversion.='\vskip 0 mm \noindent\textbf{'.      $texversion.='\vskip 0 mm \noindent\textbf{'.
                                          &mt("Printing from Construction Space: No Title").'}\vskip 0 mm ';                                           &mt("Printing from Authoring Space: No Title").'}\vskip 0 mm ';
     $texversion.=&path_to_problem ($urlp,$LaTeXwidth);      $texversion.=&path_to_problem ($urlp,$LaTeXwidth);
  }   }
  $texversion.='\vskip 1 mm '.$answer.'\end{document}';   $texversion.='\vskip 1 mm '.$answer.'\end{document}';
Line 3122  ENDPART Line 3440  ENDPART
   
     $result = set_font_size($result);      $result = set_font_size($result);
   
       # Insert any babel headers required.
   
       $result       = &collect_languages($result);
   
   
 #-- writing .tex file in prtspool   #-- writing .tex file in prtspool 
     my $temp_file;      my $temp_file;
     my $identifier = &Apache::loncommon::get_cgi_id();      my $identifier = &Apache::loncommon::get_cgi_id();
Line 3250  sub print_resources { Line 3573  sub print_resources {
     my $fullname = &get_name($username,$userdomain);      my $fullname = &get_name($username,$userdomain);
     my $namepostfix = "\\\\"; # Both anon and not anon should get the same vspace.      my $namepostfix = "\\\\"; # Both anon and not anon should get the same vspace.
   
   
     #      #
     # Figure out if we need to filter the output by      # Figure out if we need to filter the output by
     # the incomplete problems for that person      # the incomplete problems for that person
Line 3261  sub print_resources { Line 3585  sub print_resources {
  $print_incomplete = 1;   $print_incomplete = 1;
     }      }
     if ($person eq 'anonymous') {      if ($person eq 'anonymous') {
  $namepostfix .="Name: ";   $namepostfix .=&mt('Name:')." ";
  $fullname = "CODE - ".$moreenv->{'CODE'};   $fullname = "CODE - ".$moreenv->{'CODE'};
     }      }
   
Line 3288  sub print_resources { Line 3612  sub print_resources {
     #      #
   
     my $syllabus_first = 0;      my $syllabus_first = 0;
       my $current_assignment = "";
       my $assignment;
       my $courseidinfo = &get_course();
       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
       if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection}
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
  if (defined $page_breaks{$curresline}) {   if (defined $page_breaks{$curresline}) {
     if($i != 0) {      if($i != 0) {
Line 3296  sub print_resources { Line 3626  sub print_resources {
  }   }
  $current_output .= &get_extra_vspaces($helper, $curresline);   $current_output .= &get_extra_vspaces($helper, $curresline);
  $i++;   $i++;
    my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);
   
    # See if we need to emit a new header:
   
  if ( !($type eq 'problems' &&    if ( !($type eq 'problems' && 
        ($curresline!~ m/$LONCAPA::assess_page_re/)) ) {         ($curresline!~ m/$LONCAPA::assess_page_re/)) ) {
     my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);  
     if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) {      if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) {
  next;   next;
     }      }
Line 3402  sub print_resources { Line 3735  sub print_resources {
     }      }
     $remove_latex_header = 'YES';      $remove_latex_header = 'YES';
  }   }
    $assignment = &Apache::lonxml::latex_special_symbols(
       &Apache::lonnet::gettitle($map), 'header');
    if (($assignment ne $current_assignment) && ($assignment ne "")) {
       my $header_line = &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
     $assignment, $courseidinfo, 
     $fullname);
       my $header_start = ($columns_in_format == 1) ? '\lhead'
    : '\fancyhead[LO]';
       $header_line = $header_start.'{'.$header_line.'}';
       $current_output = $current_output . $header_line;
       $current_assignment = $assignment;
    }
   
  if (&Apache::loncommon::connection_aborted($r)) { last; }   if (&Apache::loncommon::connection_aborted($r)) { last; }
     }      }
     # If we are printing incomplete it's possible we don't have      # If we are printing incomplete it's possible we don't have
Line 3422  sub print_resources { Line 3768  sub print_resources {
     if ($syllabus_first) {      if ($syllabus_first) {
         $current_output =~ s/\\\\ Last updated:/Last updated:/          $current_output =~ s/\\\\ Last updated:/Last updated:/
     }      }
     my $courseidinfo = &get_course();      if (0) {
     my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');   my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
     my $header_line =   my $header_line =
  &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},      &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
     $currentassignment, $courseidinfo, $fullname, $usersection);   $currentassignment, $courseidinfo, $fullname);
     my $header_start = ($columns_in_format == 1) ? '\lhead'   my $header_start = ($columns_in_format == 1) ? '\lhead'
                                          : '\fancyhead[LO]';      : '\fancyhead[LO]';
     $header_line = $header_start.'{'.$header_line.'}';   $header_line = $header_start.'{'.$header_line.'}';
       }
     if ($current_output=~/\\documentclass/) {      if ($current_output=~/\\documentclass/) {
  $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /;  # $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /;
    $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$namepostfix}\\vskip 5 mm /;
   
     } else {      } else {
  my $blankpages =    my $blankpages = 
     '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};      '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};
       
   # $current_output = '\strut\vspace*{-6 mm}\\newline'.
   #    &copyright_line().' \newpage '.$blankpages.$end_of_student.
   #    '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.
   #    $header_line.$namepostfix. '} \vskip 5 mm '.$current_output;
  $current_output = '\strut\vspace*{-6 mm}\\newline'.   $current_output = '\strut\vspace*{-6 mm}\\newline'.
     &copyright_line().' \newpage '.$blankpages.$end_of_student.      &copyright_line().' \newpage '.$blankpages.$end_of_student.
     '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.      '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'
     $header_line.$namepostfix.'} \vskip 5 mm '.$current_output;      .$namepostfix. '} \vskip 5 mm '.$current_output;
   
     }      }
     #      #
     #  Close the student bracketing.      #  Close the student bracketing.
Line 3448  sub print_resources { Line 3802  sub print_resources {
   
 }  }
   
   sub printing_blocked {
       my ($r,$blocktext) = @_;
       my $title = &mt('Preparing Printout');
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/printout',
                                               text=> $title});
       my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs($title);
       &Apache::loncommon::content_type($r,'text/html');
       &Apache::loncommon::no_cache($r);
       $r->send_http_header;
       $r->print(&Apache::loncommon::start_page('Preparing Printout').
                 $breadcrumbs.
                 $blocktext.
                 &Apache::loncommon::end_page());
       return;
   }
   
 sub handler {  sub handler {
   
     my $r = shift;      my $r = shift;
   
       if ($env{'request.course.id'}) {
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my ($blocked,$blocktext) = 
               &Apache::loncommon::blocking_status('printout',$cnum,$cdom);
           if ($blocked) {
               my $checkrole = "cm./$cdom/$cnum";
               if ($env{'request.course.sec'} ne '') {
                   $checkrole .= "/$env{'request.course.sec'}";
               }
               unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) && 
                       ($env{'request.role'} !~ m{^st\./$cdom/$cnum})) {
                   &printing_blocked($r,$blocktext);
                   return OK;
               }
           }
       }
           
     &init_perm();      &init_perm();
   
     my $helper = printHelper($r);      my $helper = printHelper($r);
     if (!ref($helper)) {      if (!ref($helper)) {
  return $helper;   return $helper;
Line 3477  sub handler { Line 3865  sub handler {
   
     &output_data($r,$helper,\%parmhash);      &output_data($r,$helper,\%parmhash);
     return OK;      return OK;
 }   }
   
 use Apache::lonhelper;  use Apache::lonhelper;
   
Line 3651  sub printHelper { Line 4039  sub printHelper {
     my $is_published=0; # True when printing from resource space.      my $is_published=0; # True when printing from resource space.
     my $res_printable = 1; # By default the current resource is printable.          my $res_printable = 1; # By default the current resource is printable.    
     my $userCanPrint = ($perm{'pav'} || $perm{'pfo'});      my $userCanPrint = ($perm{'pav'} || $perm{'pfo'});
       my $res_printstartdate;
       my $res_printenddate;
       my $map_open = 0;
       my $map_close = 0xffffffff;
       my $course_open = 0;
       my $course_close = 0xffffffff;
   
     # Get the resource name from construction space      # Get the resource name from construction space
     if ($helper->{VARS}->{'construction'}) {      if ($helper->{VARS}->{'construction'}) {
Line 3667  sub printHelper { Line 4061  sub printHelper {
  &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));   &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     my $res   = $navmap->getBySymb($symb);      my $res   = $navmap->getBySymb($symb);
     $res_printable  = $res->resprintable() || $userCanPrint; #printability in course context      $res_printable  = $res->resprintable() | $userCanPrint; #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 {   } else {
     # Resource space.      # Resource space.
   
Line 3686  sub printHelper { Line 4084  sub printHelper {
     if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) {      if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) {
  $helper->{VARS}->{'curseed'}=$env{'form.curseed'};   $helper->{VARS}->{'curseed'}=$env{'form.curseed'};
     }      }
   
     if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {      if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {
  $helper->{VARS}->{'probstatus'}=$env{'form.problemstatus'};   $helper->{VARS}->{'probstatus'}=$env{'form.problemstatus'};
     }      }
Line 3716  sub printHelper { Line 4115  sub printHelper {
   
     if ($resourceTitle && $res_printable) {      if ($resourceTitle && $res_printable) {
         push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE'];          push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE'];
     }      } 
       
   
     # Useful filter strings      # Useful filter strings
   
Line 3822  sub printHelper { Line 4220  sub printHelper {
  my $nextState     = 'CHOOSE_INCOMPLETE_SEQ';   my $nextState     = 'CHOOSE_INCOMPLETE_SEQ';
  my $textSuffix    = '';   my $textSuffix    = '';
   
  if ($userCanPrint) {   if ($userCanPrint)  {
     $printSelector = 'map_incomplete_problems_people_seq';      $printSelector = 'map_incomplete_problems_people_seq';
     $nextState     = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ';      $nextState     = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ';
     $textSuffix    = ' for selected students';      $textSuffix    = ' for selected students';
Line 3830  sub printHelper { Line 4228  sub printHelper {
  &create_incomplete_folder_selstud_helper($helper, $map);    &create_incomplete_folder_selstud_helper($helper, $map); 
     &Apache::lonxml::xmlparse($r, 'helper', $helperStates);      &Apache::lonxml::xmlparse($r, 'helper', $helperStates);
  } else {   } else {
     my $helperStates = &create_incomplete_folder_helper($helper, $map); # Create needed states for student.      if (&printable($map_open, $map_close)) {
     &Apache::lonxml::xmlparse($r, 'helper', $helperStates);   my $helperStates = &create_incomplete_folder_helper($helper, $map); # 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.
       }
  }   }
   
  push(@{$printChoices},   if ($userCanPrint || &printable($map_open, $map_close)) {
      [&mt('Selected  [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix,      push(@{$printChoices},
   '<b>', '</b>',   [&mt('Selected  [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix,
   '<b><i>'. $sequenceTitle . '</b></i>'),        '<b>', '</b>',
       $printSelector,        '<b><i>'. $sequenceTitle . '</b></i>'),
       $nextState]);    $printSelector,
     $nextState]);
    }
         # Allow problems from sequence          # Allow problems from sequence
         push @{$printChoices},    if ($userCanPrint || &printable($map_open, $map_close)) {
       push @{$printChoices}, 
     [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),       [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
      'map_problems',        'map_problems', 
      'CHOOSE_PROBLEMS'];       'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence      # Allow all resources from sequence
         push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),       push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
  'map_problems_pages',       'map_problems_pages', 
  'CHOOSE_PROBLEMS_HTML'];      'CHOOSE_PROBLEMS_HTML'];
         my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',      my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',
  'Select Problem(s) to print',      'Select Problem(s) to print',
  'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',      'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',
  'RESOURCES',      'RESOURCES',
  'PAGESIZE',      'PAGESIZE',
  $map,      $map,
  $isProblem, '',      $isProblem, '',
  $symbFilter,      $symbFilter,
  $start_new_option);      $start_new_option);
  $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',      $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',
       'Select Resource(s) to print',    'Select Resource(s) to print',
        'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',    'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',
       'RESOURCES',    'RESOURCES',
       'PAGESIZE',    'PAGESIZE',
       $map,    $map,
       $isNotMap, '',    $isNotMap, '',
       $symbFilter,    $symbFilter,
       $start_new_option);    $start_new_option);
       
  &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);      &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
    } else {
       # TODO: Figure out how to tell them the folder is not printable.
    }
     }      }
    # If the user has pfo (print for others) allow them to print all 
     # If the user has pfo (print for others) allow them to print all    # problems and resources  in the entire course, optionally for selected students
     # problems and resources  in the entire course, optionally for selected students   my $post_data = $helper->{VARS}->{'postdata'};
     my $post_data = $helper->{VARS}->{'postdata'};  
           
     if ($perm{'pfo'} &&  !$is_published  &&      if ($perm{'pfo'} &&  !$is_published  &&
         ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {           ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
Line 4237  CHOOSE_FROM_SUBDIR Line 4643  CHOOSE_FROM_SUBDIR
     <message>Select the sequence to print resources from:</message>      <message>Select the sequence to print resources from:</message>
     <resource variable="SEQUENCE">      <resource variable="SEQUENCE">
       <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>        <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>
       <filterfunc>return \$res->is_sequence;</filterfunc>        <filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc>
       <valuefunc>return $urlValue;</valuefunc>        <valuefunc>return $urlValue;</valuefunc>
       <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);        <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);
  </choicefunc>   </choicefunc>
Line 4259  CHOOSE_FROM_ANY_SEQUENCE Line 4665  CHOOSE_FROM_ANY_SEQUENCE
   
     # Generate the first state, to select which resources get printed.      # Generate the first state, to select which resources get printed.
     Apache::lonhelper::state->new("START", "Select Printing Options:");      Apache::lonhelper::state->new("START", "Select Printing Options:");
       if (!$res_printable) {
    $paramHash = Apache::lonhelper::getParamHash();
    $paramHash->{MESSAGE_TEXT} =
               '<p class="LC_info">'
              .&mt('Printing for current resource is only possible between [_1] and [_2]',
                   $res_printstartdate, $res_printenddate).'</p>';
    Apache::lonhelper::message->new();
       }
       $paramHash = Apache::lonhelper::getParamHash();
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{MESSAGE_TEXT} = "";      $paramHash->{MESSAGE_TEXT} = "";
     Apache::lonhelper::message->new();      Apache::lonhelper::message->new();
Line 4598  sub render { Line 5013  sub render {
     my $PaperType=&mt('Paper type');      my $PaperType=&mt('Paper type');
     my $landscape=&mt('Landscape');      my $landscape=&mt('Landscape');
     my $portrait=&mt('Portrait');      my $portrait=&mt('Portrait');
     my $pdfFormLabel=&mt('PDF-Formfields');  
     my $with=&mt('with Formfields');  
     my $without=&mt('without Formfields');  
           
   
     $result.='<h3>'.&mt('Layout Options').'</h3>'      $result.='<h3>'.&mt('Layout Options').'</h3>'
Line 4609  sub render { Line 5021  sub render {
             .'<th>'.$PageLayout.'</th>'              .'<th>'.$PageLayout.'</th>'
             .'<th>'.$NumberOfColumns.'</th>'              .'<th>'.$NumberOfColumns.'</th>'
             .'<th>'.$PaperType.'</th>'              .'<th>'.$PaperType.'</th>'
             .'<th>'.$pdfFormLabel.'</th>'  
             .&Apache::loncommon::end_data_table_header_row()              .&Apache::loncommon::end_data_table_header_row()
             .&Apache::loncommon::start_data_table_row()              .&Apache::loncommon::start_data_table_row()
     .'<td>'      .'<td>'
Line 4650  sub render { Line 5061  sub render {
     $result .= <<HTML;      $result .= <<HTML;
         </select>          </select>
     </td>      </td>
     <td align='center'>  
         <select name='${var}.pdfFormFields'>  
             <option selected="selected" value="no">$without</option>  
             <option value="yes">$with</option>  
         </select>  
     </td>  
 HTML  HTML
     $result.=&Apache::loncommon::end_data_table_row()      $result.=&Apache::loncommon::end_data_table_row()
             .&Apache::loncommon::end_data_table();              .&Apache::loncommon::end_data_table();
Line 4901  sub postprocess { Line 5306  sub postprocess {
     }      }
 }  }
   
   
   
 __END__  __END__
   

Removed from v.1.610  
changed lines
  Added in v.1.627.2.6


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>