[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