--- loncom/interface/lonprintout.pm 2005/08/15 22:39:43 1.383
+++ loncom/interface/lonprintout.pm 2005/10/30 02:24:34 1.395
@@ -1,7 +1,7 @@
-# The LearningOnline Network
+# The LearningOnline Network
# Printout
#
-# $Id: lonprintout.pm,v 1.383 2005/08/15 22:39:43 foxr Exp $
+# $Id: lonprintout.pm,v 1.395 2005/10/30 02:24:34 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -42,45 +42,72 @@ use Apache::lonratedt;
use POSIX qw(strftime);
use Apache::lonlocal;
-my $resources_printed = '';
+#
+# Convert a numeric code to letters
+#
+sub num_to_letters {
+ my ($num) = @_;
+ my @nums= split('',$num);
+ my @num_to_let=('A'..'Z');
+ my $word;
+ foreach my $digit (@nums) { $word.=$num_to_let[$digit]; }
+ return $word;
+}
+# Convert a letter code to numeric.
+#
+sub letters_to_num {
+ my ($letters) = @_;
+ my @letters = split('', uc($letters));
+ my %substitution;
+ my $digit = 0;
+ foreach my $letter ('A'..'J') {
+ $substitution{$letter} = $digit;
+ $digit++;
+ }
+ # The substitution is done as below to preserve leading
+ # zeroes which are needed to keep the code size exact
+ #
+ my $result ="";
+ foreach my $letter (@letters) {
+ $result.=$substitution{$letter};
+ }
+ return $result;
+}
# Determine if a code is a valid numeric code. Valid
# numeric codes must be comprised entirely of digits and
-# have a maximum number of allowable digits.
+# have a correct number of digits.
#
# Parameters:
# value - proposed code value.
-# max_digits - Maximum digits allowed.
+# num_digits - Number of digits required.
#
sub is_valid_numeric_code {
- my ($value, $max_digits) = @_;
+ my ($value, $num_digits) = @_;
# Remove leading/trailing whitespace;
- $value =~ s/^\s*//;
- $value =~ s/\s*$//;
+ $value =~ s/^\s*//g;
+ $value =~ s/\s*$//g;
# All digits?
-
- if ($value =~ /^[0-9]+$/) {
- if (length($value) <= $max_digits) {
- return undef;
- } else {
- return "Numeric code $value has too many digits (max = $max_digits)";
- }
- } else {
+ if ($value !~ /^[0-9]+$/) {
return "Numeric code $value has invalid characters - must only be digits";
}
+ if (length($value) != $num_digits) {
+ return "Numeric code $value incorrect number of digits (correct = $num_digits)";
+ }
+ return undef;
}
# Determines if a code is a valid alhpa code. Alpha codes
# are ciphers that map [A-J,a-j] -> 0..9 0..9.
-# They also have a maximum digit count.
+# They also have a correct digit count.
# Parameters:
# value - Proposed code value.
-# max_letters - Maximum number of letters.
+# num_letters - correct number of letters.
# Note:
# leading and trailing whitespace are ignored.
#
sub is_valid_alpha_code {
- my ($value, $max_letters) = @_;
+ my ($value, $num_letters) = @_;
# strip leading and trailing spaces.
@@ -88,16 +115,13 @@ sub is_valid_alpha_code {
$value =~ s/\s*$//g;
# All alphas in the right range?
-
- if ($value =~ /^[A-J,a-j]+$/) {
- if (length($value) <= $max_letters) {
- return undef;
- } else {
- return "Letter code $value has too many letters (max = $max_letters)";
- }
- } else {
+ if ($value !~ /^[A-J,a-j]+$/) {
return "Invalid letter code $value must only contain A-J";
}
+ if (length($value) != $num_letters) {
+ return "Letter code $value has incorrect number of letters (correct = $num_letters)";
+ }
+ return undef;
}
# Determine if a code entered by the user in a helper is valid.
@@ -129,13 +153,11 @@ sub is_code_valid {
}
my $valid;
if ($code_type eq 'number') {
- $valid = &is_valid_numeric_code($code_value, $code_length);
+ return &is_valid_numeric_code($code_value, $code_length);
} else {
- $valid = &is_valid_alpha_code($code_value, $code_length);
+ return &is_valid_alpha_code($code_value, $code_length);
}
-
- return "Entering a single code is not supported (yet): $code_type $code_length $valid";
}
# Compare two students by name. The students are in the form
@@ -484,6 +506,7 @@ sub character_chart {
$result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g;
$result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g;
$result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g;
+ $result =~ s/–/\\ensuremath\{-\}/g;
$result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g;
$result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g;
$result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g;
@@ -798,6 +821,7 @@ sub print_latex_header {
$output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".
'\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".
'\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".
+ '\usepackage{wrapfig}'.
'\usepackage{picins}\usepackage{calc}'."\n".
'\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".
'\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".
@@ -879,6 +903,29 @@ sub unsupported {
#
+# List of recently generated print files
+#
+
+sub recently_generated {
+ my $r=shift;
+ my $prtspool=$r->dir_config('lonPrtDir');
+ $r->print('
'.&mt('Recently generated printouts').'
');
+ opendir(DIR,$prtspool);
+ while (my $filename=readdir(DIR)) {
+ if ($filename=~/^$env{'user.name'}\_$env{'user.domain'}\_printout\_(\d+)\_.*.pdf$/) {
+ my ($cdev,$cino,$cmode,$cnlink,
+ $cuid,$cgid,$crdev,$csize,
+ $catime,$cmtime,$cctime,
+ $cblksize,$cblocks)=stat($prtspool.'/'.$filename);
+ $r->print ("".
+ &mt('Generated').' '.&Apache::lonlocal::locallocaltime($cctime).
+ ' ('.$csize.' bytes) ');
+ }
+ }
+ closedir(DIR);
+}
+
+#
# Retrieve the hash of page breaks.
#
# Inputs:
@@ -902,6 +949,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(<{'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);
@@ -1360,6 +1410,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);
@@ -1585,21 +1648,13 @@ $r->print(<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'};
+ }
+ }
+
}
@@ -1944,7 +2005,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...
@@ -2062,6 +2123,27 @@ CHOOSE_STUDENTS
if ($name =~ /^type\0/) { next; }
$namechoice.=''.$name.'';
}
+
+
+ my %all_codes = &Apache::lonnet::get('CODEs',
+ \@names, $cdom,$cnum);
+ my %code_values;
+ my @all_code_array;
+ foreach my $key (keys %all_codes) {
+ %code_values = &Apache::grades::get_codes($key, $cdom, $cnum);
+ foreach my $key (keys %code_values) {
+ push (@all_code_array, "$key");
+ }
+ }
+
+ my $code_selection = "\n";
+ foreach my $code (sort {uc($a) cmp uc($b)} @all_code_array) {
+ 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 () {
@@ -2084,7 +2166,8 @@ CHOOSE_STUDENTS
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;
@@ -2094,10 +2177,9 @@ CHOOSE_STUDENTS
Value of CODE to print?