[LON-CAPA-cvs] cvs: loncom /interface lonprintout.pm
foxr
lon-capa-cvs@mail.lon-capa.org
Mon, 15 Aug 2005 22:39:45 -0000
foxr Mon Aug 15 18:39:45 2005 EDT
Modified files:
/loncom/interface lonprintout.pm
Log:
Add validation for user typed codes (support is still latent).
Index: loncom/interface/lonprintout.pm
diff -u loncom/interface/lonprintout.pm:1.382 loncom/interface/lonprintout.pm:1.383
--- loncom/interface/lonprintout.pm:1.382 Mon Aug 15 17:51:49 2005
+++ loncom/interface/lonprintout.pm Mon Aug 15 18:39:43 2005
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Printout
#
-# $Id: lonprintout.pm,v 1.382 2005/08/15 21:51:49 foxr Exp $
+# $Id: lonprintout.pm,v 1.383 2005/08/15 22:39:43 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -44,6 +44,62 @@
my $resources_printed = '';
+# 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.
+#
+# Parameters:
+# value - proposed code value.
+# max_digits - Maximum digits allowed.
+#
+sub is_valid_numeric_code {
+ my ($value, $max_digits) = @_;
+ # Remove leading/trailing whitespace;
+ $value =~ s/^\s*//;
+ $value =~ s/\s*$//;
+
+ # 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 {
+ return "Numeric code $value has invalid characters - must only be digits";
+ }
+}
+# 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.
+# Parameters:
+# value - Proposed code value.
+# max_letters - Maximum number of letters.
+# Note:
+# leading and trailing whitespace are ignored.
+#
+sub is_valid_alpha_code {
+ my ($value, $max_letters) = @_;
+
+ # strip leading and trailing spaces.
+
+ $value =~ s/^\s*//g;
+ $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 {
+ return "Invalid letter code $value must only contain A-J";
+ }
+}
+
# Determine if a code entered by the user in a helper is valid.
# valid depends on the code type and the type of code selected.
# The type of code selected can either be numeric or
@@ -60,8 +116,26 @@
#
sub is_code_valid {
my ($code_value, $code_option) = @_;
+ my ($code_type, $code_length) = ('letter', 6); # defaults.
+ open(FG, $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
+ foreach my $line (<FG>) {
+ my ($name, $type, $length) = (split(/:/, $line))[0,2,4];
+ if($name eq $code_option) {
+ $code_length = $length;
+ if($type eq 'number') {
+ $code_type = 'number';
+ }
+ }
+ }
+ my $valid;
+ if ($code_type eq 'number') {
+ $valid = &is_valid_numeric_code($code_value, $code_length);
+ } else {
+ $valid = &is_valid_alpha_code($code_value, $code_length);
+ }
+
- return "Entering a single code is not supported (yet)";
+ 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