version 1.590, 2011/06/06 10:53:09
|
version 1.642, 2014/04/24 15:31:39
|
Line 1
|
Line 1
|
|
|
# The LearningOnline Network |
# The LearningOnline Network |
# Printout |
# Printout |
# |
# |
Line 41 use Apache::admannotations;
|
Line 40 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 Apache::lonlocal; |
use Apache::lonlocal; |
use Carp; |
use Carp; |
use LONCAPA; |
use LONCAPA; |
Line 76 my $font_size = 'normalsize'; # Default
|
Line 75 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 147 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 123 sub create_incomplete_folder_selstud_hel
|
Line 173 sub create_incomplete_folder_selstud_hel
|
|
|
my $format_chooser = &generate_format_selector($helper, |
my $format_chooser = &generate_format_selector($helper, |
'Format of the print job', |
'Format of the print job', |
'','CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state. |
'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state. |
|
|
return $resource_chooser . $student_chooser . $format_chooser; |
return $resource_chooser . $student_chooser . $format_chooser; |
} |
} |
Line 172 sub create_incomplete_course_helper {
|
Line 222 sub create_incomplete_course_helper {
|
|
|
my $format = &generate_format_selector($helper, |
my $format = &generate_format_selector($helper, |
'Format of the print job', |
'Format of the print job', |
'', |
|
'INCOMPLETE_PROBLEMS_COURSE_FORMAT'); # end state. |
'INCOMPLETE_PROBLEMS_COURSE_FORMAT'); # end state. |
|
|
return $resource_chooser . $people_chooser . $format; |
return $resource_chooser . $people_chooser . $format; |
Line 303 CHOOSE_RESOURCES
|
Line 352 CHOOSE_RESOURCES
|
</resource> |
</resource> |
</state> |
</state> |
CHOOSE_RESOURCES |
CHOOSE_RESOURCES |
|
|
return $result; |
return $result; |
} |
} |
# |
# |
Line 356 sub generate_code_selector {
|
Line 404 sub generate_code_selector {
|
<message></td><td></message> |
<message></td><td></message> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<message></td></tr><tr><td></message> |
<message></td></tr><tr><td></message> |
<message><b>Bubble sheet type:</b></message> |
<message><b>Bubblesheet type:</b></message> |
<message></td><td></message> |
<message></td><td></message> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
$bubble_types |
$bubble_types |
Line 395 CHOOSE_ANON1
|
Line 443 CHOOSE_ANON1
|
return $result; |
return $result; |
} |
} |
|
|
|
# Returns the XML for choosing how assignments are to be formatted |
|
# that text must still be parsed by the helper xml parser. |
|
# Parameters: 3 (required) |
|
|
|
# helper - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used |
|
# to check if splitting PDFs by section can be offered. |
|
# title - Title for the current state. |
|
# this_state - State name of the chooser. |
|
|
sub generate_format_selector { |
sub generate_format_selector { |
my ($helper,$title,$nextstate, $thisstate) = @_; |
my ($helper,$title,$this_state) = @_; |
my $secpdfoption; |
my $secpdfoption; |
my $state = 'PRINT_FORMATTING'; |
|
if ($thisstate) { |
|
$state = $thisstate; |
|
} |
|
unless (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || |
unless (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || |
($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') ) { |
$secpdfoption = '<choice computer="sections">Each PDF contains exactly one section</choice>'; |
$secpdfoption = '<choice computer="sections">Each PDF contains exactly one section</choice>'; |
} |
} |
return <<RESOURCE_SELECTOR; |
return <<RESOURCE_SELECTOR; |
<state name="$state" title="$title"> |
<state name="$this_state" title="$title"> |
$nextstate |
|
<message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message> |
<message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message> |
<choices variable="EMPTY_PAGES"> |
<choices variable="EMPTY_PAGES"> |
<choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice> |
<choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice> |
Line 432 RESOURCE_SELECTOR
|
Line 484 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 returned 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 (($earliest_close ne '') && ($latest_open ne '') |
|
&& ($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 returned 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. |
|
# For consistency with &printable() in lonnavmaps.pm determination of start |
|
# date for printing checks printstartdate param first, then, if not set, |
|
# opendate param, then, if not set, contentopen param. |
|
|
|
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); |
|
if (!$partopen) { |
|
$partopen = $res->parmval('opendate',$part); |
|
} |
|
if (!$partopen) { |
|
$partopen = $res->parmval('contentopen',$part); |
|
} |
|
if ($partopen) { |
|
push(@open_dates, $partopen); |
|
} |
|
if ($partclose) { |
|
push(@close_dates, $partclose); |
|
} |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
} |
|
|
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
|
|
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: |
|
# Parameters: |
|
# $username - Name of user for whom we are checking. |
|
# $domain - Domain of user we are checking. |
|
# $map - map name. |
|
# Returns: |
|
# 0 - map is not incomplete. |
|
# 1 - map is incomplete. |
|
# |
|
sub incomplete { |
|
my ($username, $domain, $map) = @_; |
|
|
|
|
|
my $navmap = Apache::lonnavmaps::navmap->new($username, $domain); |
|
|
|
|
|
if (defined($navmap)) { |
|
my $res = $navmap->getResourceByUrl($map); |
|
my $result = $res->is_incomplete(); |
|
return $result; |
|
} else { |
|
return 1; |
|
} |
|
} |
|
# |
|
# When printing for students, the resoures and order of the |
|
# resources may need to be altered if there are folders with |
|
# random selectiopn or random ordering (or both) enabled. |
|
# This sub computes the set of resources to print for a student |
|
# modified both by random ordering and selection and filtered |
|
# to only those that are in the original set selcted to be printed. |
|
# |
|
# Parameters: |
|
# $map - The URL of the folder being printed. |
|
# Used to determine which startResource and finishResource |
|
# 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). |
|
# $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: |
|
# $ |
|
# Returns: |
|
# reference to an array of resources that can be passed to |
|
# print_resources. |
|
# |
|
sub master_seq_to_person_seq { |
|
my ($map, $seq, $who, $code, $nohidemap) = @_; |
|
|
|
|
|
my ($username, $userdomain, $usersection) = split(/:/, $who); |
|
|
|
# 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. |
|
# |
|
|
|
my %seq_hash = map {$_ => 1} @$seq; |
|
my @output_seq; |
|
|
|
my $unhidden; |
|
if ($perm{'pav'} && $perm{'vgr'} && $nohidemap) { |
|
$unhidden = &Apache::lonnet::clutter($map); |
|
} |
|
|
|
my $navmap = Apache::lonnavmaps::navmap->new($username, $userdomain, |
|
$code, $unhidden); |
|
my ($start,$finish); |
|
|
|
if ($map) { |
|
my $mapres = $navmap->getResourceByUrl($map); |
|
if ($mapres->is_map()) { |
|
$start = $mapres->map_start(); |
|
$finish = $mapres->map_finish(); |
|
} |
|
} |
|
unless ($start && $finish) { |
|
$start = $navmap->firstResource(); |
|
$finish = $navmap->finishResource(); |
|
} |
|
|
|
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. |
|
# |
|
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})) { |
|
push(@output_seq, $currsymb); |
|
} |
|
} |
|
} |
|
|
|
return \@output_seq; # for now. |
|
|
|
} |
|
|
|
|
# Fetch the contents of a resource, uninterpreted. |
# Fetch the contents of a resource, uninterpreted. |
# This is used here to fetch a latex file to be included |
# This is used here to fetch a latex file to be included |
Line 534 sub include_pdf {
|
Line 883 sub include_pdf {
|
# (unlikely). If it did exist, add the pdf to the set of files/images that |
# (unlikely). If it did exist, add the pdf to the set of files/images that |
# need tob e converted for this print job: |
# need tob e converted for this print job: |
|
|
$file =~ s|(.*)/res/|/home/httpd/html/res/|; |
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
$file =~ s{(.*)/res/}{$londocroot/res/}; |
|
|
open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat"); |
open(FILE,">>$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat"); |
print FILE ("$file\n"); |
print FILE ("$file\n"); |
close (FILE); |
close (FILE); |
|
|
Line 559 sub include_pdf {
|
Line 909 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 606 sub ssi_with_retries {
|
Line 978 sub ssi_with_retries {
|
$ssi_last_error_resource = $resource; |
$ssi_last_error_resource = $resource; |
$ssi_last_error = $response->code . " " . $response->message; |
$ssi_last_error = $response->code . " " . $response->message; |
$content='\section*{!!! An error occurred !!!}'; |
$content='\section*{!!! An error occurred !!!}'; |
&Apache::lonnet::logthis("Error in SSI resource: $resource Error: $ssi_last_error"); |
|
} |
} |
|
|
return $content; |
return $content; |
Line 622 sub get_student_view_with_retries {
|
Line 993 sub get_student_view_with_retries {
|
$ssi_last_error_resource = $curresline.' for user '.$username.':'.$userdomain; |
$ssi_last_error_resource = $curresline.' for user '.$username.':'.$userdomain; |
$ssi_last_error = $response->code . " " . $response->message; |
$ssi_last_error = $response->code . " " . $response->message; |
$content='\section*{!!! An error occurred !!!}'; |
$content='\section*{!!! An error occurred !!!}'; |
&Apache::lonnet::logthis("Error in SSI (student view) resource: $curresline Error: $ssi_last_error User: $username:$userdomain"); |
|
} |
} |
return $content; |
return $content; |
|
|
Line 739 sub format_page_header {
|
Line 1109 sub format_page_header {
|
# 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 877 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 1685 sub unsupported {
|
Line 2071 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 1710 sub map_laystyle {
|
Line 2097 sub map_laystyle {
|
|
|
sub print_page_in_course { |
sub print_page_in_course { |
my ($helper, $rparmhash, $currentURL, $resources) = @_; |
my ($helper, $rparmhash, $currentURL, $resources) = @_; |
|
|
my %parmhash = %$rparmhash; |
my %parmhash = %$rparmhash; |
my @page_resources = @$resources; |
my @page_resources = @$resources; |
my $mode = $helper->{'VARS'}->{'LATEX_TYPE'}; |
my $mode = $helper->{'VARS'}->{'LATEX_TYPE'}; |
Line 1763 sub print_page_in_course {
|
Line 2151 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: |
|
|
elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
|
|
my $urlp = &Apache::lonnet::clutter($resource_src); |
my $urlp = &Apache::lonnet::clutter($resource_src); |
|
|
my %form; |
my %form; |
my %moreenv; |
my %moreenv; |
|
|
Line 1829 sub print_page_in_course {
|
Line 2221 sub print_page_in_course {
|
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$urlp; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem($URLpath,$LaTeXwidth); |
|
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
Line 2100 sub set_form_extraspace {
|
Line 2491 sub set_form_extraspace {
|
sub print_construction_sequence { |
sub print_construction_sequence { |
my ($currentURL, $helper, %form, $LaTeXwidth) = @_; |
my ($currentURL, $helper, %form, $LaTeXwidth) = @_; |
|
|
|
|
my $result; |
my $result; |
my $rndseed=time; |
my $rndseed=time; |
if ($helper->{'VARS'}->{'curseed'}) { |
if ($helper->{'VARS'}->{'curseed'}) { |
$rndseed=$helper->{'VARS'}->{'curseed'}; |
$rndseed=$helper->{'VARS'}->{'curseed'}; |
} |
} |
my $errtext=&LONCAPA::map::mapread($currentURL); |
my $errtext=&LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$currentURL)); |
|
|
# |
# |
# These make this all support recursing for subsequences. |
# These make this all support recursing for subsequences. |
# |
# |
my @order = @LONCAPA::map::order; |
my @order = @LONCAPA::map::order; |
my @resources = @LONCAPA::map::resources; |
my @resources = @LONCAPA::map::resources; |
|
|
for (my $member=0;$member<=$#order;$member++) { |
for (my $member=0;$member<=$#order;$member++) { |
$resources[$order[$member]]=~/^([^:]*):([^:]*):/; |
$resources[$order[$member]]=~/^([^:]*):([^:]*):/; |
my $urlp=$2; |
my $urlp=$2; |
Line 2127 sub print_construction_sequence {
|
Line 2519 sub print_construction_sequence {
|
} |
} |
if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && |
($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) { |
($urlp=~/$LONCAPA::assess_page_re/)) { |
# Don't permanently modify %$form... |
# Don't permanently modify %$form... |
my %answerform = %form; |
my %answerform = %form; |
$answerform{'grade_target'}='answer'; |
$answerform{'grade_target'}='answer'; |
Line 2171 sub print_construction_sequence {
|
Line 2563 sub print_construction_sequence {
|
# IF sequence, recurse: |
# IF sequence, recurse: |
|
|
if ($urlp =~ /\.sequence$/) { |
if ($urlp =~ /\.sequence$/) { |
my $sequence_url = $urlp; |
$result .= &print_construction_sequence($urlp, |
my $domain = $env{'user.domain'}; # Constr. space only on local |
|
my $user = $env{'user.name'}; |
|
|
|
$sequence_url =~ s/^\/res\/$domain/\/home/; |
|
$sequence_url =~ s/^(\/home\/$user)/$1\/public_html/; |
|
# $sequence_url =~ s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
|
$result .= &print_construction_sequence($sequence_url, |
|
$helper, %form, |
$helper, %form, |
$LaTeXwidth); |
$LaTeXwidth); |
} |
} |
Line 2222 sub print_construction_sequence {
|
Line 2607 sub print_construction_sequence {
|
#BZ 5209 |
#BZ 5209 |
# 2 map_incomplete_problems_seq Print incomplete problems from the current |
# 2 map_incomplete_problems_seq Print incomplete problems from the current |
# folder in student context. |
# folder in student context. |
# 101 map_incomplete_problems_people_seq Print incomplete problems from the |
# 5 map_incomplete_problems_people_seq Print incomplete problems from the |
# current folder in privileged context. |
# current folder in privileged context. |
# 102 incomplete_problems_selpeople_course Print incomplete problems for |
# 5 incomplete_problems_selpeople_course Print incomplete problems for |
# selected people from the entire course. |
# selected people from the entire course. |
# |
# |
# Item 101 has much the same processing as 8, |
# Item 101 has much the same processing as 8, |
# Item 102 has much the same processing as 8. |
|
# |
# |
# Differences: Item 101, 102 require per-student filtering of the resource |
# Differences: Item 101, 102 require per-student filtering of the resource |
# set so that only the incomplete resources are printed. |
# set so that only the incomplete resources are printed. |
# 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 2351 ENDPART
|
Line 2736 ENDPART
|
} else { |
} else { |
|
|
#prints resource from the construction space |
#prints resource from the construction space |
$currentURL='/'.$helper->{'VARS'}->{'filename'}; |
$currentURL=$helper->{'VARS'}->{'filename'}; |
if ($currentURL=~/([^?]+)/) {$currentURL=$1;} |
|
$cleanURL=$currentURL; |
$cleanURL=$currentURL; |
} |
} |
$selectionmade = 1; |
$selectionmade = 1; |
|
|
if ($cleanURL!~m|^/adm/| |
if ($cleanURL!~m|^/adm/| |
&& $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
&& $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
my $rndseed=time; |
my $rndseed=time; |
Line 2395 ENDPART
|
Line 2780 ENDPART
|
|
|
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { |
|
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'grade_target'}='answer'; |
$form{'grade_target'}='answer'; |
$form{'answer_output_mode'}='tex'; |
$form{'answer_output_mode'}='tex'; |
Line 2416 ENDPART
|
Line 2802 ENDPART
|
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$cleanURL; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
|
$texversion.=&path_to_problem($URLpath,$LaTeXwidth); |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
Line 2451 ENDPART
|
Line 2837 ENDPART
|
} |
} |
} elsif ($cleanURL!~m|^/adm/| |
} elsif ($cleanURL!~m|^/adm/| |
&& $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') { |
&& $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') { |
#printing content of sequence from the construction space |
|
|
|
|
|
$currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
|
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$LaTeXwidth); |
$LaTeXwidth); |
$result .= '\end{document}'; |
$result .= '\end{document}'; |
Line 2511 ENDPART
|
Line 2893 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 2616 ENDPART
|
Line 2997 ENDPART
|
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
} |
} |
} else { |
} else { |
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/) { |
if ($urlp=~/$LONCAPA::assess_page_re/) { |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
# $texversion =~ s/\\begin{document}//; # FIXME |
# $texversion =~ s/\\begin{document}//; # FIXME |
my $title = &Apache::lonnet::gettitle($master_seq[$i]); |
my $title = &Apache::lonnet::gettitle($master_seq[$i]); |
Line 2654 ENDPART
|
Line 3035 ENDPART
|
$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 2724 ENDPART
|
Line 3104 ENDPART
|
} elsif (($print_type eq 'problems_for_students') || |
} elsif (($print_type eq 'problems_for_students') || |
($print_type eq 'problems_for_students_from_page') || |
($print_type eq 'problems_for_students_from_page') || |
($print_type eq 'all_problems_students') || |
($print_type eq 'all_problems_students') || |
($print_type eq 'resources_for_students')){ |
($print_type eq 'resources_for_students') || |
|
($print_type eq 'incomplete_problems_selpeople_course') || |
|
($print_type eq 'map_incomplete_problems_people_seq')){ |
|
|
|
|
#-- prints assignments for whole class or for selected students |
#-- prints assignments for whole class or for selected students |
my $type; |
my $type; |
if (($print_type eq 'problems_for_students') || |
if (($print_type eq 'problems_for_students') || |
($print_type eq 'problems_for_students_from_page') || |
($print_type eq 'problems_for_students_from_page') || |
($print_type eq 'all_problems_students') ) { |
($print_type eq 'all_problems_students') || |
|
($print_type eq 'incomplete_problems_selpeople_course') || |
|
($print_type eq 'map_incomplete_problems_people_seq')) { |
$selectionmade=5; |
$selectionmade=5; |
$type='problems'; |
$type='problems'; |
} elsif ($print_type eq 'resources_for_students') { |
} elsif ($print_type eq 'resources_for_students') { |
Line 2751 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 2769 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 2783 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]; |
foreach my $person (@students) { |
foreach my $person (@students) { |
|
|
my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; |
my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; |
if (-e $duefile) { |
if (-e $duefile) { |
my $temp_file = Apache::File->new('>>'.$duefile); |
my $temp_file = Apache::File->new('>>'.$duefile); |
Line 2804 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($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,\@master_seq, |
\%moreenv, $actual_seq, |
$flag_latex_header_remove, |
$flag_latex_header_remove, |
$LaTeXwidth); |
$LaTeXwidth); |
$resources_printed .= ":"; |
$resources_printed .= ":"; |
Line 2829 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)=('letter',6); |
my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10); |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
my ($name,$type,$length) = (split(/:/,$line))[0,2,4]; |
chomp($line); |
|
my ($name,$type,$length,$bubbles_per_item) = |
|
(split(/:/,$line))[0,2,4,17]; |
if ($name eq $code_option) { |
if ($name eq $code_option) { |
$code_length=$length; |
$code_length=$length; |
if ($type eq 'number') { $code_type = 'number'; } |
if ($type eq 'number') { $code_type = 'number'; } |
|
chomp($bubbles_per_item); |
|
if (($bubbles_per_item ne '') && ($bubbles_per_item > 0)) { |
|
$bubbles_per_row = $bubbles_per_item; |
|
} |
} |
} |
} |
} |
|
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'; |
|
$moreenv{'bubbles_per_row'} = $bubbles_per_row; |
my $seed=time+($$<<16)+($$); |
my $seed=time+($$<<16)+($$); |
my @allcodes; |
my @allcodes; |
if ($old_name) { |
if ($old_name) { |
Line 2891 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 2900 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 || $randompick) { |
|
$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 2933 ENDPART
|
Line 3353 ENDPART
|
if ($urlp=~/\//) { |
if ($urlp=~/\//) { |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'rndseed'}=$rndseed; |
$form{'rndseed'}=$rndseed; |
if ($urlp =~ m|/home/([^/]+)/public_html|) { |
$urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||; |
$urlp =~ s|/home/([^/]*)/public_html|/~$1|; |
|
} else { |
|
$urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||; |
|
} |
|
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
my $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
Line 2958 ENDPART
|
Line 3374 ENDPART
|
$texversion.='\vskip 0 mm \noindent '; |
$texversion.='\vskip 0 mm \noindent '; |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$urlp; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem ($URLpath,$LaTeXwidth); |
|
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
} |
} |
#this chunk is responsible for printing the path to problem |
#this chunk is responsible for printing the path to problem |
|
|
my $newurlp=$urlp; |
my $newurlp=&path_to_problem($urlp,$LaTeXwidth); |
if ($newurlp=~/~/) {$newurlp=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;} |
|
$newurlp=&path_to_problem($newurlp,$LaTeXwidth); |
|
$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/; |
$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/; |
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
Line 3019 ENDPART
|
Line 3432 ENDPART
|
|
|
my $URLback=''; #link to original document |
my $URLback=''; #link to original document |
if ($helper->{'VARS'}->{'construction'} eq '1') { |
if ($helper->{'VARS'}->{'construction'} eq '1') { |
#prints resource from the construction space |
$URLback=$helper->{'VARS'}->{'filename'}; |
$URLback='/'.$helper->{'VARS'}->{'filename'}; |
|
if ($URLback=~/([^?]+)/) { |
|
$URLback=$1; |
|
$URLback=~s|^/~|/priv/|; |
|
} |
|
} |
} |
# |
# |
# Final adjustment of the font size: |
# Final adjustment of the font size: |
Line 3032 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 3159 sub print_resources {
|
Line 3572 sub print_resources {
|
my ($username,$userdomain,$usersection) = split /:/,$person; |
my ($username,$userdomain,$usersection) = split /:/,$person; |
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. |
if ($person =~ 'anon') { |
|
$namepostfix .="Name: "; |
|
|
# |
|
# Figure out if we need to filter the output by |
|
# the incomplete problems for that person |
|
# |
|
my $print_type = $helper->{'VARS'}->{'PRINT_TYPE'}; |
|
my $print_incomplete = 0; |
|
if (($print_type eq 'map_incomplete_problems_people_seq') || |
|
($print_type eq 'incomplete_problems_selpeople_course')) { |
|
$print_incomplete = 1; |
|
} |
|
if ($person eq 'anonymous') { |
|
$namepostfix .=&mt('Name:')." "; |
$fullname = "CODE - ".$moreenv->{'CODE'}; |
$fullname = "CODE - ".$moreenv->{'CODE'}; |
} |
} |
|
|
Line 3168 sub print_resources {
|
Line 3593 sub print_resources {
|
# |
# |
|
|
my $i = 0; |
my $i = 0; |
|
my $actually_printed = 0; # Count of resources printed. |
#goes through all resources, checks if they are available for |
#goes through all resources, checks if they are available for |
#current student, and produces output |
#current student, and produces output |
|
|
Line 3184 sub print_resources {
|
Line 3610 sub print_resources {
|
# so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the |
# so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the |
# postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. |
# postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. |
# |
# |
|
|
my $syllabus_first = 0; |
my $syllabus_first = 0; |
|
my $current_assignment = ""; |
|
my $assignment; |
|
my $courseidinfo = &get_course(); |
|
|
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 3193 sub print_resources {
|
Line 3624 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/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) ) { |
($curresline!~ m/$LONCAPA::assess_page_re/)) ) { |
my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); |
if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) { |
|
next; |
|
} |
|
$actually_printed++; # we're going to print one. |
|
|
if (&Apache::lonnet::allowed('bre',$res_url)) { |
if (&Apache::lonnet::allowed('bre',$res_url)) { |
if ($res_url!~m|^ext/| |
if ($res_url!~m|^ext/| |
&& $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
&& $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
Line 3209 sub print_resources {
|
Line 3648 sub print_resources {
|
$rendered = &print_latex_header().$rendered; |
$rendered = &print_latex_header().$rendered; |
} |
} |
} |
} |
|
; |
if ($remove_latex_header eq 'YES') { |
if ($remove_latex_header eq 'YES') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
Line 3220 sub print_resources {
|
Line 3660 sub print_resources {
|
# Use a copy of the hash so we don't pervert it on future loop passes. |
# Use a copy of the hash so we don't pervert it on future loop passes. |
my %answerenv = %{$moreenv}; |
my %answerenv = %{$moreenv}; |
$answerenv{'answer_output_mode'}='tex'; |
$answerenv{'answer_output_mode'}='tex'; |
|
|
|
|
$answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
|
|
&Apache::lonxml::restore_problem_counter(); |
&Apache::lonxml::restore_problem_counter(); |
Line 3292 sub print_resources {
|
Line 3734 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, $usersection); |
|
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 |
|
# anything to print. The print subsystem is not so good at handling |
|
# that so we're going to generate a stub that says there are no |
|
# incomplete resources for the person. |
|
# |
|
|
|
if ($actually_printed == 0) { |
|
$current_output = &encapsulate_minipage("\\vskip -10mm \nNo incomplete resources\n \\vskip 100 mm { }\n"); |
|
if ($remove_latex_header eq "NO") { |
|
$current_output = &print_latex_header() . $current_output; |
|
} else { |
|
$current_output = &latex_header_footer_remove($current_output); |
|
} |
|
} |
|
|
if ($syllabus_first) { |
if ($syllabus_first) { |
$current_output =~ s/\\\\ Last updated:/Last updated:/ |
$current_output =~ s/\\\\ Last updated:/Last updated:/ |
} |
} |
my $courseidinfo = &get_course(); |
|
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, $usersection); |
my $header_start = ($columns_in_format == 1) ? '\lhead' |
my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; |
: '\fancyhead[LO]'; |
my $newheader = $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$newheader$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'. |
$current_output = '\strut\vspace*{-6 mm}\\newline'. |
©right_line().' \newpage '.$blankpages.$end_of_student. |
©right_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; |
$newheader.$namepostfix. '} \vskip 5 mm '.$current_output; |
|
|
} |
} |
# |
# |
# Close the student bracketing. |
# Close the student bracketing. |
Line 3324 sub print_resources {
|
Line 3793 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 3355 sub handler {
|
Line 3856 sub handler {
|
|
|
&output_data($r,$helper,\%parmhash); |
&output_data($r,$helper,\%parmhash); |
return OK; |
return OK; |
} |
} |
|
|
use Apache::lonhelper; |
use Apache::lonhelper; |
|
|
Line 3400 sub get_randomly_ordered_warning {
|
Line 3901 sub get_randomly_ordered_warning {
|
my $func = |
my $func = |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
if (@matches) { |
|
$message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order."; |
|
} |
|
} |
|
if ($message) { |
|
return '<message type="warning">'.$message.'</message>'; |
|
} |
} |
} else { |
} else { |
$message = "Retrieval of information about ordering of resources failed."; |
$message = "Retrieval of information about ordering of resources failed."; |
Line 3495 sub printHelper {
|
Line 3991 sub printHelper {
|
} |
} |
|
|
# Detect whether we're coming from construction space |
# Detect whether we're coming from construction space |
if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) { |
if ($env{'form.postdata'}=~m{^/priv}) { |
$helper->{VARS}->{'filename'} = "~$1/$2"; |
$helper->{VARS}->{'filename'} = $env{'form.postdata'}; |
$helper->{VARS}->{'construction'} = 1; |
$helper->{VARS}->{'construction'} = 1; |
} else { |
} else { |
if ($env{'form.postdata'}) { |
if ($env{'form.postdata'}) { |
Line 3534 sub printHelper {
|
Line 4030 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 3551 sub printHelper {
|
Line 4053 sub printHelper {
|
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 3569 sub printHelper {
|
Line 4075 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 3599 sub printHelper {
|
Line 4106 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 3626 sub printHelper {
|
Line 4132 sub printHelper {
|
my $start_new_option; |
my $start_new_option; |
if ($perm{'pav'}) { |
if ($perm{'pav'}) { |
$start_new_option = |
$start_new_option = |
"<option text='".&mt('Start new page<br />before selected'). |
"<option text='".&mt('Start new page[_1]before selected','<br />'). |
"' variable='FINISHPAGE' />". |
"' variable='FINISHPAGE' />". |
"<option text='".&mt('Extra space<br />before selected'). |
"<option text='".&mt('Extra space[_1]before selected','<br />'). |
"' variable='EXTRASPACE' type='text' />" . |
"' variable='EXTRASPACE' type='text' />" . |
"<option " . |
"<option " . |
"' variable='POSSIBLE_RESOURCES' type='hidden' />". |
"' variable='POSSIBLE_RESOURCES' type='hidden' />". |
"<option text='".&mt('Space units<br />check for mm'). |
"<option text='".&mt('Space units[_1]check for mm','<br />'). |
"' variable='EXTRASPACE_UNITS' type='checkbox' />" |
"' variable='EXTRASPACE_UNITS' type='checkbox' />" |
; |
; |
|
|
Line 3705 sub printHelper {
|
Line 4211 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 3713 sub printHelper {
|
Line 4219 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 Incomplete [_1]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 3765 sub printHelper {
|
Line 4279 sub printHelper {
|
# BZ 5209 - incomplete problems from entire course: |
# BZ 5209 - incomplete problems from entire course: |
|
|
push(@{$printChoices}, |
push(@{$printChoices}, |
[&mtn('Selected incomplete <b>Problems</b> from <b>entire course</b> for selected people'), |
[&mtn('Selected <b>Incomplete Problems</b> from <b>entire course</b> for selected people'), |
'incomplete_problems_selpeople_course', 'INCOMPLETE_PROBLEMS_COURSE_RESOURCES']); |
'incomplete_problems_selpeople_course', 'INCOMPLETE_PROBLEMS_COURSE_RESOURCES']); |
my $helperFragment = &create_incomplete_course_helper($helper); # Create needed states. |
my $helperFragment = &create_incomplete_course_helper($helper); # Create needed states. |
|
|
Line 3789 my $suffixXml = <<ALL_PROBLEMS;
|
Line 4303 my $suffixXml = <<ALL_PROBLEMS;
|
ALL_PROBLEMS |
ALL_PROBLEMS |
&Apache::lonxml::xmlparse($r, 'helper', |
&Apache::lonxml::xmlparse($r, 'helper', |
&generate_resource_chooser('ALL_PROBLEMS', |
&generate_resource_chooser('ALL_PROBLEMS', |
'SelectProblem(s) to print', |
'Select Problem(s) to print', |
'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"', |
'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
Line 3838 ALL_PROBLEMS
|
Line 4352 ALL_PROBLEMS
|
} |
} |
|
|
my $randomly_ordered_warning = |
my $randomly_ordered_warning = |
&get_randomly_ordered_warning($helper,$map); |
&get_randomly_ordered_warning($helper, $map); |
|
|
# resource_selector will hold a few states that: |
# resource_selector will hold a few states that: |
# - Allow resources to be selected for printing. |
# - Allow resources to be selected for printing. |
Line 3857 ALL_PROBLEMS
|
Line 4371 ALL_PROBLEMS
|
$map, |
$map, |
$isProblem, '', $symbFilter, |
$isProblem, '', $symbFilter, |
$start_new_option); |
$start_new_option); |
my $secpdfoption; |
|
unless (($helper->{'VARS'} eq 'problems_for_anon') || |
|
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || |
|
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { |
|
$secpdfoption = '<choice computer="sections">Each PDF contains exactly one section</choice>'; |
|
} |
|
$resource_selector .= &generate_format_selector($helper, |
$resource_selector .= &generate_format_selector($helper, |
'How should results be printed?'). |
'How should results be printed?', |
|
'PRINT_FORMATTING'). |
&generate_resource_chooser('CHOOSE_STUDENTS_PAGE', |
&generate_resource_chooser('CHOOSE_STUDENTS_PAGE', |
'Select Problem(s) to print', |
'Select Problem(s) to print', |
"multichoice='1' addstatus='1' closeallpages ='1'", |
"multichoice='1' addstatus='1' closeallpages ='1'", |
Line 3937 ALL_PROBLEMS
|
Line 4446 ALL_PROBLEMS
|
my @lines = &Apache::grades::get_scantronformat_file(); |
my @lines = &Apache::grades::get_scantronformat_file(); |
my $codechoice=''; |
my $codechoice=''; |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
|
next if (($line =~ /^\#/) || ($line eq '')); |
my ($name,$description,$code_type,$code_length)= |
my ($name,$description,$code_type,$code_length)= |
(split(/:/,$line))[0,1,2,4]; |
(split(/:/,$line))[0,1,2,4]; |
if ($code_length > 0 && |
if ($code_length > 0 && |
Line 3998 ALL_PROBLEMS
|
Line 4508 ALL_PROBLEMS
|
</state> |
</state> |
RESOURCE_SELECTOR |
RESOURCE_SELECTOR |
|
|
my $nextstate = '<nextstate>NUMBER_PER_PDF</nextstate>'; |
|
$resource_selector .= &generate_format_selector($helper, |
$resource_selector .= &generate_format_selector($helper, |
'Format of the print job', |
'Format of the print job', |
$nextstate); |
'PRINT_FORMATTING'); |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1); |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1); |
<state name="CHOOSE_STUDENTS1" title="Select Students and Resources"> |
<state name="CHOOSE_STUDENTS1" title="Select Students and Resources"> |
<choices variable='student_sort'> |
<choices variable='student_sort'> |
Line 4042 CHOOSE_STUDENTS1
|
Line 4551 CHOOSE_STUDENTS1
|
<message></td><td></message> |
<message></td><td></message> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<message></td></tr><tr><td></message> |
<message></td></tr><tr><td></message> |
<message><b>Bubble sheet type:</b></message> |
<message><b>Bubblesheet type:</b></message> |
<message></td><td></message> |
<message></td><td></message> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
$codechoice |
$codechoice |
Line 4126 CHOOSE_FROM_SUBDIR
|
Line 4635 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 4148 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4657 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) { |
|
my $now = time; |
|
my $shownprintstart = &Apache::lonlocal::locallocaltime($res_printstartdate); |
|
my $shownprintend = &Apache::lonlocal::locallocaltime($res_printenddate); |
|
my $noprintmsg; |
|
if (($res_printenddate) && ($res_printenddate < $now)) { |
|
$noprintmsg = &mt('Printing for current resource no longer available (ended: [_1])', |
|
$shownprintend); |
|
} else { |
|
if (($res_printstartdate) && ($res_printstartdate > $now)) { |
|
if (($res_printenddate) && ($res_printenddate > $now) && ($res_printenddate > $res_printstartdate)) { |
|
$noprintmsg = &mt('Printing for current resource is only possible between [_1] and [_2]', |
|
$shownprintstart,$shownprintend); |
|
} elsif (!$res_printenddate) { |
|
$noprintmsg = &mt('Printing for current resource will only be possible starting [_1]', |
|
$shownprintstart); |
|
} else { |
|
$noprintmsg = &mt('Printing for current resource is unavailable'); |
|
} |
|
} |
|
} |
|
|
|
if ($noprintmsg) { |
|
$paramHash = Apache::lonhelper::getParamHash(); |
|
$paramHash->{MESSAGE_TEXT} = |
|
'<p class="LC_info">'.$noprintmsg.'</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 4369 FONT_SELECTION
|
Line 4908 FONT_SELECTION
|
return "$helper->{VARS}->{'probstatus'}"; |
return "$helper->{VARS}->{'probstatus'}"; |
</defaultvalue> |
</defaultvalue> |
<choice computer="problem">Homework Problem</choice> |
<choice computer="problem">Homework Problem</choice> |
<choice computer="exam">Exam Problem</choice> |
<choice computer="exam">Bubblesheet Exam Problem</choice> |
<choice computer="survey">Survey question</choice> |
<choice computer="survey">Survey question</choice> |
,choice computer="anonsurvey"Anonymous survey question</choice> |
,choice computer="anonsurvey"Anonymous survey question</choice> |
</dropdown> |
</dropdown> |
Line 4487 sub render {
|
Line 5026 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 $pdfFormLabel=&mt('PDF Form Fields'); |
my $with=&mt('with Formfields'); |
my $with=&mt('with Form Fields'); |
my $without=&mt('without Formfields'); |
my $without=&mt('without Form Fields'); |
|
|
|
|
$result.='<h3>'.&mt('Layout Options').'</h3>' |
$result.='<h3>'.&mt('Layout Options').'</h3>' |
Line 4790 sub postprocess {
|
Line 5329 sub postprocess {
|
} |
} |
} |
} |
|
|
|
|
|
|
__END__ |
__END__ |
|
|