\n"
+ .$pdf_result);
+ }
+}
+
+#
# Retrieve the hash of page breaks.
#
# Inputs:
@@ -893,6 +975,7 @@ sub get_page_breaks {
sub output_data {
my ($r,$helper,$rparmhash) = @_;
my %parmhash = %$rparmhash;
+ my $resources_printed = '';
my $html=&Apache::lonxml::xmlbegin();
my $bodytag=&Apache::loncommon::bodytag('Preparing Printout');
$r->print(<LON-CAPA output for printing
$bodytag
+
Please stand by while processing your print request, this may take some time ...
+
ENDPART
@@ -1018,6 +1103,7 @@ ENDPART
&Apache::lonnet::appenv(%moreenv);
&Apache::lonnet::delenv('form.counter');
&Apache::lonxml::init_counter();
+ &Apache::lonxml::store_counter();
$resources_printed .= $currentURL.':';
$texversion.=&Apache::lonnet::ssi($currentURL,%form);
&Apache::lonnet::delenv('form.counter');
@@ -1029,6 +1115,9 @@ ENDPART
$form{'grade_target'}='answer';
$form{'answer_output_mode'}='tex';
$form{'rndseed'}=$rndseed;
+ if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {
+ $form{'problemtype'}='exam';
+ }
$resources_printed .= $currentURL.':';
my $answer=&Apache::lonnet::ssi($currentURL,%form);
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
@@ -1097,7 +1186,7 @@ ENDPART
} else {
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
$texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
- $texversion.=&path_to_problem ($currentURL,$LaTeXwidth);
+ $texversion.=&path_to_problem($urlp,$LaTeXwidth);
$texversion.='\vskip 1 mm '.$answer.'\end{document}';
}
}
@@ -1157,6 +1246,7 @@ ENDPART
my $prevassignment='';
&Apache::lonnet::delenv('form.counter');
&Apache::lonxml::init_counter();
+ &Apache::lonxml::store_counter();
for (my $i=0;$i<=$#master_seq;$i++) {
# Note due to document structure, not allowed to put \newpage
@@ -1167,16 +1257,17 @@ ENDPART
$result.="\\newpage\n";
}
}
- my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
+ my ($sequence,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
$urlp=&Apache::lonnet::clutter($urlp);
$form{'symb'}=$master_seq[$i];
- my ($sequence)=&Apache::lonnet::decode_symb($master_seq[$i]);
- my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #tittle of the assignment which contains this problem
+
+ my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem
if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}
if ($i==0) {$prevassignment=$assignment;}
my $texversion='';
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
$resources_printed .= $urlp.':';
+ my $pre_counter=$env{'form.counter'};
$texversion.=&Apache::lonnet::ssi($urlp,%form);
if ($urlp=~/\.page$/) {
($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
@@ -1184,11 +1275,9 @@ ENDPART
$texversion =~ s/\\end{document}\d*/\\end{document}/;
$flag_page_in_sequence = 'YES';
}
- my $lonidsdir=$r->dir_config('lonIDsDir');
- my $envfile=$env{'user.environment'};
- $envfile=~/\/([^\/]+)\.id$/;
- $envfile=$1;
- &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
+ my ($envfile) = ($env{'user.environment'} =~m|/([^/]+)\.id$| );
+ &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'),
+ $envfile);
my $current_counter=$env{'form.counter'};
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
@@ -1197,6 +1286,7 @@ ENDPART
$answerform{'grade_target'}='answer';
$answerform{'answer_output_mode'}='tex';
$resources_printed .= $urlp.':';
+ &Apache::lonnet::appenv(('form.counter' => $pre_counter));
my $answer=&Apache::lonnet::ssi($urlp,%answerform);
&Apache::lonnet::appenv(('form.counter' => $current_counter));
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
@@ -1204,7 +1294,7 @@ ENDPART
} else {
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
- $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($urlp).'}\vskip 0 mm ';
+ $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($master_seq[$i]).'}\vskip 0 mm ';
$texversion.=&path_to_problem ($urlp,$LaTeXwidth);
$texversion.='\vskip 1 mm '.$answer;
} else {
@@ -1312,7 +1402,8 @@ ENDPART
$person,$type,
\%moreenv,\@master_seq,
$flag_latex_header_remove,
- $LaTeXwidth);
+ $LaTeXwidth,
+ $number_of_columns);
$resources_printed .= ":";
$print_array[$i].=$output;
$student_names[$i].=$person.':'.$fullname.'_END_';
@@ -1329,7 +1420,9 @@ ENDPART
my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};
my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};
-
+ my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};
+ my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};
+
my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};
open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
my ($code_type,$code_length)=('letter',6);
@@ -1351,6 +1444,19 @@ ENDPART
$code_type=$result{"type\0$old_name"};
@allcodes=split(',',$result{$old_name});
$num_todo=scalar(@allcodes);
+ } elsif ($selected_code) { # Selection value is always numeric.
+ $num_todo = 1;
+ @allcodes = ($selected_code);
+ } elsif ($single_code) {
+
+ $num_todo = 1; # Unconditionally one code to do.
+ # If an alpha code have to convert to numbers so it can be
+ # converted back to letters again :-)
+ #
+ if ($code_type ne 'number') {
+ $single_code = &letters_to_num($single_code);
+ }
+ @allcodes = ($single_code);
} else {
my %allcodes;
srand($seed);
@@ -1473,8 +1579,14 @@ ENDPART
}
#-------------------------------------------------------- corrections for the different page formats
$result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade);
- $result = &latex_corrections($number_of_columns,$result,$selectionmade);
- for (my $i=1;$i<=$#print_array;$i++) {$print_array[$i] = &latex_corrections($number_of_columns,$print_array[$i],$selectionmade);}
+ $result = &latex_corrections($number_of_columns,$result,$selectionmade,
+ $helper->{'VARS'}->{'ANSWER_TYPE'});
+ for (my $i=1;$i<=$#print_array;$i++) {
+ $print_array[$i] =
+ &latex_corrections($number_of_columns,$print_array[$i],
+ $selectionmade,
+ $helper->{'VARS'}->{'ANSWER_TYPE'});
+ }
#changes page's parameters for the one column output
if ($numberofcolumns == 1) {
$result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /;
@@ -1557,7 +1669,7 @@ ENDPART
'cgi.'.$identifier.'.selection' => $selectionmade,
'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},
'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},
- 'cgi.'.$identifier.'.role' => $env{'request.role.adv'},
+ 'cgi.'.$identifier.'.role' => $perm{'pav'},
'cgi.'.$identifier.'.numberoffiles' => $#print_array,
'cgi.'.$identifier.'.studentnames' => $student_names,
'cgi.'.$identifier.'.backref' => $URLback,);
@@ -1576,21 +1688,13 @@ $r->print(<dir_config('lonIDsDir');
- my $envfile=$env{'user.environment'};
- $envfile=~/\/([^\/]+)\.id$/;
- $envfile=$1;
- &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
+ my ($envfile) =
+ ( $env{'user.environment'} =~ m|/([^/]+)\.id$| );
+ &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'),
+ $envfile);
my $current_counter=$env{'form.counter'};
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
@@ -1648,6 +1752,7 @@ sub print_resources {
my %answerenv = %{$moreenv};
$answerenv{'answer_output_mode'}='tex';
$answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
+ &Apache::lonnet::appenv(('form.counter' => $pre_counter));
my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv);
&Apache::lonnet::appenv(('form.counter' => $current_counter));
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
@@ -1655,7 +1760,7 @@ sub print_resources {
} else {
$rendered=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
$rendered.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm ';
- $rendered.=&path_to_problem ($curresline,$LaTeXwidth);
+ $rendered.=&path_to_problem($res_url,$LaTeXwidth);
$rendered.='\vskip 1 mm '.$ansrendered;
}
}
@@ -1668,18 +1773,17 @@ sub print_resources {
} elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
$printed .= $curresline.':';
my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
- my $lonidsdir=$r->dir_config('lonIDsDir');
- my $envfile=$env{'user.environment'};
- $envfile=~/\/([^\/]+)\.id$/;
- $envfile=$1;
- &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
+ my ($envfile) =
+ ( $env{'user.environment'} =~ m|/([^/]+)\.id$| );
+ &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'),
+ $envfile);
my $current_counter=$env{'form.counter'};
if ($remove_latex_header eq 'YES') {
$rendered = &latex_header_footer_remove($rendered);
} else {
$rendered =~ s/\\end{document}//;
}
- $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';
+ $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/'.$number_of_columns.'][b]{\hrulefill}\strut \vskip 0 mm \strut ';
} else {
my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'});
if ($remove_latex_header ne 'NO') {
@@ -1712,7 +1816,8 @@ sub print_resources {
sub handler {
my $r = shift;
- my $helper;
+
+ &init_perm();
# my $loaderror=&Apache::lonnet::overloaderror($r);
# if ($loaderror) { return $loaderror; }
@@ -1721,11 +1826,10 @@ sub handler {
# $env{'course.'.$env{'request.course.id'}.'.home'});
# if ($loaderror) { return $loaderror; }
- my $result = printHelper($r);
- if (!ref($result)) {
- return $result;
+ my $helper = printHelper($r);
+ if (!ref($helper)) {
+ return $helper;
}
- $helper = $result;
# my $key;
# foreach $key (keys %{$helper->{'VARS'}}) {
@@ -1768,6 +1872,20 @@ sub addMessage {
use Data::Dumper;
+sub init_perm {
+ undef(%perm);
+ $perm{'pav'}=&Apache::lonnet::allowed('pav',$env{'request.course.id'});
+ if (!$perm{'pav'}) {
+ $perm{'pav'}=&Apache::lonnet::allowed('pav',
+ $env{'request.course.id'}.'/'.$env{'request.course.sec'});
+ }
+ $perm{'pfo'}=&Apache::lonnet::allowed('pav',$env{'request.course.id'});
+ if (!$perm{'pfo'}) {
+ $perm{'pfo'}=&Apache::lonnet::allowed('pfo',
+ $env{'request.course.id'}.'/'.$env{'request.course.sec'});
+ }
+}
+
sub printHelper {
my $r = shift;
@@ -1811,21 +1929,27 @@ sub printHelper {
$helper->declareVar("showallfoils");
# The page breaks can get loaded initially from the course environment:
+ # But we only do this in the initial state so that they are allowed to change.
+ #
- if((!defined($env{"form.CURRENT_STATE"})) ||
- ($env{'form.CURRENT_STATE'} == "START")) {
- $helper->{VARS}->{FINISHPAGE} = ""; # In case they did a back e.g.
- }
-
-
+ $helper->{VARS}->{FINISHPAGE} = '';
&Apache::loncommon::restore_course_settings('print',
{'pagebreaks' => 'scalar',
'lastprinttype' => 'scalar'});
-
- if("$helper->{VARS}->{PRINT_TYPE}" eq "$env{'form.lastprinttype'}") {
- $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
+
+ if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {
+ if (!defined ($env{"form.CURRENT_STATE"})) {
+
+ $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
+ } else {
+ my $state = $env{"form.CURRENT_STATE"};
+ if ($state eq "START") {
+ $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
+ }
+ }
+
}
@@ -1890,9 +2014,6 @@ sub printHelper {
}
my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();
- my $userPriviledged = ($env{'request.role'}=~m/^cc\./ or
- $env{'request.role'}=~m/^in\./ or
- $env{'request.role'}=~m/^ta\./);
Apache::lonhelper::registerHelperTags();
@@ -1935,7 +2056,7 @@ sub printHelper {
$helper->declareVar('SEQUENCE');
# Useful for debugging: Dump the help vars
-# $r->print(Dumper($helper->{VARS}));
+# $r->print(Dumper($helper->{VARS}));
# $r->print($map);
# If we're in a sequence...
@@ -1977,9 +2098,9 @@ HELPERFRAGMENT
&Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
}
- # If the user is privileged, allow them to print all
+ # If the user has pfo (print for otheres) allow them to print all
# problems and resources in the entier course, optionally for selected students
- if ($userPriviledged &&
+ if ($perm{'pfo'} &&
($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {
push @{$printChoices}, ['Problems from entire course', 'all_problems', 'ALL_PROBLEMS'];
@@ -2053,6 +2174,25 @@ CHOOSE_STUDENTS
if ($name =~ /^type\0/) { next; }
$namechoice.=''.$name.'';
}
+
+
+ my %code_values;
+ my %codes_to_print;
+ foreach my $key (@names) {
+ %code_values = &Apache::grades::get_codes($key, $cdom, $cnum);
+ foreach my $key (keys(%code_values)) {
+ $codes_to_print{$key} = 1;
+ }
+ }
+
+ my $code_selection = "\n";
+ foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) {
+ my $choice = $code;
+ if ($code =~ /^[A-Z]+$/) { # Alpha code
+ $choice = &letters_to_num($code);
+ }
+ $code_selection .= ' '.$code."\n";
+ }
open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
my $codechoice='';
foreach my $line () {
@@ -2069,32 +2209,19 @@ CHOOSE_STUDENTS
&Apache::lonxml::xmlparse($r, 'helper', <PAGESIZE
-
-
Number of anonymous assignments to print?
+
Number of anonymous assignments to print:
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} &&
- !\$helper->{'VARS'}{'SINGLE_CODE'}) {
+ !\$helper->{'VARS'}{'SINGLE_CODE'} &&
+ !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
return "You need to specify the number of assignments to print";
}
return undef;
$resource_selector
@@ -2190,7 +2351,7 @@ CHOOSE_ANON2
}
# FIXME: That RE should come from a library somewhere.
- if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $env{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {
+ if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $perm{'pav'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {
push @{$printChoices}, ["".&mt('Problems')." ".&mt('from current subdirectory')." $subdir", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
my $f = '$filename';
@@ -2230,7 +2391,8 @@ CHOOSE_FROM_SUBDIR
CHOOSE_FROM_ANY_SEQUENCEreturn \$res->is_sequence;return $urlValue;
-
+ return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);
+
@@ -2260,7 +2422,7 @@ CHOOSE_FROM_ANY_SEQUENCE
my $startedTable = 0; # have we started an HTML table yet? (need
# to close it later)
- if (($env{'request.role.adv'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or
+ if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or
($helper->{VARS}->{'construction'} eq '1')) {
addMessage("
Print:
");
$paramHash = Apache::lonhelper::getParamHash();
@@ -2276,7 +2438,7 @@ CHOOSE_FROM_ANY_SEQUENCE
$startedTable = 1;
}
- if ($env{'request.role.adv'}) {
+ if ($perm{'pav'}) {
if (!$startedTable) {
addMessage("