--- loncom/interface/lonprintout.pm 2005/08/16 03:34:34 1.384
+++ loncom/interface/lonprintout.pm 2005/10/31 21:06:35 1.396
@@ -1,7 +1,7 @@
-# The LearningOnline Network
+# The LearningOnline Network
# Printout
#
-# $Id: lonprintout.pm,v 1.384 2005/08/16 03:34:34 albertel Exp $
+# $Id: lonprintout.pm,v 1.396 2005/10/31 21:06:35 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -42,7 +42,37 @@ 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
@@ -55,16 +85,17 @@ my $resources_printed = '';
sub is_valid_numeric_code {
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 ($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.
@@ -90,6 +121,7 @@ sub is_valid_alpha_code {
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.
@@ -121,12 +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
@@ -475,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;
@@ -789,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".
@@ -870,6 +903,34 @@ sub unsupported {
#
+# List of recently generated print files
+#
+
+sub recently_generated {
+ my $r=shift;
+ my $prtspool=$r->dir_config('lonPrtDir');
+ my $result;
+ 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);
+ $result.="".
+ &mt('Generated [_1] ([_2] bytes)',
+ &Apache::lonlocal::locallocaltime($cctime),$csize).
+ '
';
+ }
+ }
+ closedir(DIR);
+ if ($result) {
+ $r->print('
'.&mt('Recently generated printouts').'
'."\n".
+ $result);
+ }
+}
+
+#
# Retrieve the hash of page breaks.
#
# Inputs:
@@ -893,6 +954,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);
@@ -1351,6 +1415,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);
@@ -1576,21 +1653,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'};
+ }
+ }
+
}
@@ -1935,7 +2010,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...
@@ -2053,6 +2128,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 () {
@@ -2075,7 +2171,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;
@@ -2086,7 +2183,8 @@ CHOOSE_STUDENTS
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} &&
- !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) {
+ !\$helper->{'VARS'}{'REUSE_OLD_CODES'} &&
+ !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
\$helper->{'VARS'}{'CODE_OPTION'});
} else {
@@ -2095,6 +2193,12 @@ CHOOSE_STUDENTS
+ Choose single code from list
+ |
+
+ $code_selection
+
+ |
Names to store the CODEs under for later:
|
@@ -2161,13 +2265,35 @@ CHOOSE_STUDENTS1
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
- !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) {
+ !\$helper->{'VARS'}{'REUSE_OLD_CODES'} &&
+ !\$helper->{'VARS'}{'SINGLE_CODE'} &&
+ !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
return "You need to specify the number of assignments to print";
}
return undef;
|
+ Value of CODE to print? |
+
+
+ if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} &&
+ !\$helper->{'VARS'}{'REUSE_OLD_CODES'} &&
+ !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
+ return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
+ \$helper->{'VARS'}{'CODE_OPTION'});
+ } else {
+ return undef; # Other forces control us.
+ }
+
+
+ |
+ Choose single code from list
+ |
+
+ $code_selection
+
+ |
Names to store the CODEs under for later:
|
@@ -2230,6 +2356,8 @@ CHOOSE_FROM_SUBDIR
CHOOSE_FROM_ANY_SEQUENCE
return \$res->is_sequence;
return $urlValue;
+ return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);
+
@@ -2362,7 +2490,6 @@ RNDSEED
$helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'};
}
-
}
@@ -2389,7 +2516,9 @@ RNDSEED
}
$r->print($helper->display());
-
+ if ($helper->{STATE} eq 'START') {
+ &recently_generated($r);
+ }
&Apache::lonhelper::unregisterHelperTags();
return OK;
|