\n"
+ .$pdf_result);
+ }
+}
+
+#
# Retrieve the hash of page breaks.
#
# Inputs:
@@ -926,6 +974,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
@@ -1051,6 +1102,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');
@@ -1062,6 +1114,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') {
@@ -1130,7 +1185,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}';
}
}
@@ -1190,6 +1245,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
@@ -1200,16 +1256,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);
@@ -1217,11 +1274,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')) {
@@ -1230,6 +1285,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') {
@@ -1237,7 +1293,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 {
@@ -1345,7 +1401,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_';
@@ -1363,6 +1420,8 @@ ENDPART
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);
@@ -1384,14 +1443,17 @@ 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);
- $num_todo = 1;
}
@allcodes = ($single_code);
} else {
@@ -1516,8 +1578,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'} /;
@@ -1600,7 +1668,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,);
@@ -1625,7 +1693,7 @@ sub get_CODE {
my $max='1'.'0'x$size;
my $newcode;
while(1) {
- $newcode=sprintf("%06d",int(rand($max)));
+ $newcode=sprintf("%0".$size."d",int(rand($max)));
if (!exists($$all_codes{$newcode})) {
$$all_codes{$newcode}=1;
if ($type eq 'number' ) {
@@ -1639,7 +1707,7 @@ sub get_CODE {
sub print_resources {
my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,
- $LaTeXwidth)=@_;
+ $LaTeXwidth,$number_of_columns)=@_;
my $current_output = '';
my $printed = '';
my ($username,$userdomain,$usersection) = split /:/,$person;
@@ -1654,7 +1722,7 @@ sub print_resources {
#current student, and produces output
&Apache::lonnet::delenv('form.counter');
&Apache::lonxml::init_counter();
-
+ &Apache::lonxml::store_counter();
my %page_breaks = &get_page_breaks($helper);
foreach my $curresline (@{$master_seq}) {
@@ -1670,12 +1738,12 @@ sub print_resources {
if (&Apache::lonnet::allowed('bre',$res_url)) {
if ($res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
$printed .= $curresline.':';
+ my $pre_counter=$env{'form.counter'};
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(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
@@ -1683,6 +1751,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') {
@@ -1690,7 +1759,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;
}
}
@@ -1703,18 +1772,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') {
@@ -1747,7 +1815,8 @@ sub print_resources {
sub handler {
my $r = shift;
- my $helper;
+
+ &init_perm();
# my $loaderror=&Apache::lonnet::overloaderror($r);
# if ($loaderror) { return $loaderror; }
@@ -1756,11 +1825,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'}}) {
@@ -1803,6 +1871,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;
@@ -1846,21 +1928,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'};
+ }
+ }
+
}
@@ -1925,9 +2013,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();
@@ -1970,7 +2055,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...
@@ -2012,9 +2097,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'];
@@ -2088,6 +2173,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 () {
@@ -2104,32 +2208,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;
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
@@ -2239,7 +2350,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';
@@ -2279,7 +2390,8 @@ CHOOSE_FROM_SUBDIR
CHOOSE_FROM_ANY_SEQUENCEreturn \$res->is_sequence;return $urlValue;
-
+ return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);
+
@@ -2309,7 +2421,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();
@@ -2325,7 +2437,7 @@ CHOOSE_FROM_ANY_SEQUENCE
$startedTable = 1;
}
- if ($env{'request.role.adv'}) {
+ if ($perm{'pav'}) {
if (!$startedTable) {
addMessage("