[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /homework grades.pm

raeburn raeburn at source.lon-capa.org
Sat Aug 17 13:43:44 EDT 2019


raeburn		Sat Aug 17 17:43:44 2019 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/homework	grades.pm 
  Log:
  - For 2.11
    Backport 1.754, 1.755, 1.756, 1.757
  
  
-------------- next part --------------
Index: loncom/homework/grades.pm
diff -u loncom/homework/grades.pm:1.596.2.12.2.48 loncom/homework/grades.pm:1.596.2.12.2.49
--- loncom/homework/grades.pm:1.596.2.12.2.48	Sun Jul  7 15:31:52 2019
+++ loncom/homework/grades.pm	Sat Aug 17 17:43:43 2019
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.596.2.12.2.48 2019/07/07 15:31:52 raeburn Exp $
+# $Id: grades.pm,v 1.596.2.12.2.49 2019/08/17 17:43:43 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -5760,7 +5760,7 @@
 sub scantron_scantab {
     my $result='<select name="scantron_format">'."\n";
     $result.='<option></option>'."\n";
-    my @lines = &get_scantronformat_file();
+    my @lines = &Apache::lonnet::get_scantronformat_file();
     if (@lines > 0) {
         foreach my $line (@lines) {
             next if (($line =~ /^\#/) || ($line eq ''));
@@ -5772,62 +5772,6 @@
     return $result;
 }
 
-=pod
-
-=item get_scantronformat_file
-
-  Returns an array containing lines from the scantron format file for
-  the domain of the course.
-
-  If a url for a custom.tab file is listed in domain's configuration.db, 
-  lines are from this file.
-
-  Otherwise, if a default.tab has been published in RES space by the 
-  domainconfig user, lines are from this file.
-
-  Otherwise, fall back to getting lines from the legacy file on the
-  local server:  /home/httpd/lonTabs/default_scantronformat.tab    
-
-=cut
-
-sub get_scantronformat_file {
-    my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'};
-    my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$cdom);
-    my $gottab = 0;
-    my @lines;
-    if (ref($domconfig{'scantron'}) eq 'HASH') {
-        if ($domconfig{'scantron'}{'scantronformat'} ne '') {
-            my $formatfile = &Apache::lonnet::getfile($Apache::lonnet::perlvar{'lonDocRoot'}.$domconfig{'scantron'}{'scantronformat'});
-            if ($formatfile ne '-1') {
-                @lines = split("\n",$formatfile,-1);
-                $gottab = 1;
-            }
-        }
-    }
-    if (!$gottab) {
-        my $confname = $cdom.'-domainconfig';
-        my $default = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$cdom.'/'.$confname.'/default.tab';
-        my $formatfile =  &Apache::lonnet::getfile($default);
-        if ($formatfile ne '-1') {
-            @lines = split("\n",$formatfile,-1);
-            $gottab = 1;
-        }
-    }
-    if (!$gottab) {
-        my @domains = &Apache::lonnet::current_machine_domains();
-        if (grep(/^\Q$cdom\E$/, at domains)) {
-            my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
-            @lines = <$fh>;
-            close($fh);
-        } else {
-            my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab');
-            @lines = <$fh>;
-            close($fh);
-        }
-    }
-    return @lines;
-}
-
 =pod 
 
 =item scantron_CODElist
@@ -5914,48 +5858,55 @@
         # Chunk of form to prompt for a scantron file upload.
 
         $r->print('
-    <br />
-    '.&Apache::loncommon::start_data_table('LC_scantron_action').'
-       '.&Apache::loncommon::start_data_table_header_row().'
-            <th>
-               '.&mt('Specify a bubblesheet data file to upload.').'
-            </th>
-       '.&Apache::loncommon::end_data_table_header_row().'
-       '.&Apache::loncommon::start_data_table_row().'
-            <td>
-');
-    my $default_form_data=&defaultFormData(&get_symb($r,1));
-    my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'};
-    my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'};
-    my $alertmsg = &mt('Please use the browse button to select a file from your local directory.');
-    &js_escape(\$alertmsg);
-    $r->print('
-              <script type="text/javascript" language="javascript">
+    <br />');
+        my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'};
+        my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'};
+        my $alertmsg = &mt('Please use the browse button to select a file from your local directory.');
+        &js_escape(\$alertmsg);
+        my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($cdom);
+        $r->print(&Apache::lonhtmlcommon::scripttag('
     function checkUpload(formname) {
         if (formname.upfile.value == "") {
             alert("'.$alertmsg.'");
             return false;
         }
         formname.submit();
-    }
-              </script>
-
+    }'."\n".$formatjs));
+        $r->print('
               <form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post">
                 '.$default_form_data.'
                 <input name="courseid" type="hidden" value="'.$cnum.'" />
                 <input name="domainid" type="hidden" value="'.$cdom.'" />
                 <input name="command" value="scantronupload_save" type="hidden" />
-                '.&mt('File to upload: [_1]','<input type="file" name="upfile" size="50" />').'
-                <br />
-                <input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" />
-              </form>
-');
+              '.&Apache::loncommon::start_data_table('LC_scantron_action').'
+              '.&Apache::loncommon::start_data_table_header_row().'
+                <th>
+                 '.&mt('Specify a bubblesheet data file to upload.').'
+                </th>
+              '.&Apache::loncommon::end_data_table_header_row().'
+              '.&Apache::loncommon::start_data_table_row().'
+            <td>
+                '.&mt('File to upload: [_1]','<input type="file" name="upfile" size="50" />').'<br />'."\n");
+        if ($formatoptions) {
+            $r->print('</td>
+                 '.&Apache::loncommon::end_data_table_row().'
+                 '.&Apache::loncommon::start_data_table_row().'
+                 <td>'.$formattitle.(' 'x2).$formatoptions.'
+                 </td>
+                 '.&Apache::loncommon::end_data_table_row().'
+                 '.&Apache::loncommon::start_data_table_row().'
+                 <td>'
+            );
+        } else {
+            $r->print(' <br />');
+        }
+        $r->print('<input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" />
+              </td>
+             '.&Apache::loncommon::end_data_table_row().'
+             '.&Apache::loncommon::end_data_table().'
+             </form>'
+        );
 
-        $r->print('
-            </td>
-       '.&Apache::loncommon::end_data_table_row().'
-       '.&Apache::loncommon::end_data_table().'
-');
     }
 
     # Chunk of form to prompt for a file to grade and how:
@@ -6067,98 +6018,6 @@
     return;
 }
 
-=pod
-
-=item get_scantron_config
-
-   Parse and return the scantron configuration line selected as a
-   hash of configuration file fields.
-
- Arguments:
-    which - the name of the configuration to parse from the file.
-
-
- Returns:
-            If the named configuration is not in the file, an empty
-            hash is returned.
-    a hash with the fields
-      name         - internal name for the this configuration setup
-      description  - text to display to operator that describes this config
-      CODElocation - if 0 or the string 'none'
-                          - no CODE exists for this config
-                     if -1 || the string 'letter'
-                          - a CODE exists for this config and is
-                            a string of letters
-                     Unsupported value (but planned for future support)
-                          if a positive integer
-                               - The CODE exists as the first n items from
-                                 the question section of the form
-                          if the string 'number'
-                               - The CODE exists for this config and is
-                                 a string of numbers
-      CODEstart   - (only matter if a CODE exists) column in the line where
-                     the CODE starts
-      CODElength  - length of the CODE
-      IDstart     - column where the student/employee ID starts
-      IDlength    - length of the student/employee ID info
-      Qstart      - column where the information from the bubbled
-                    'questions' start
-      Qlength     - number of columns comprising a single bubble line from
-                    the sheet. (usually either 1 or 10)
-      Qon         - either a single character representing the character used
-                    to signal a bubble was chosen in the positional setup, or
-                    the string 'letter' if the letter of the chosen bubble is
-                    in the final, or 'number' if a number representing the
-                    chosen bubble is in the file (1->A 0->J)
-      Qoff        - the character used to represent that a bubble was
-                    left blank
-      PaperID     - if the scanning process generates a unique number for each
-                    sheet scanned the column that this ID number starts in
-      PaperIDlength - number of columns that comprise the unique ID number
-                      for the sheet of paper
-      FirstName   - column that the first name starts in
-      FirstNameLength - number of columns that the first name spans
- 
-      LastName    - column that the last name starts in
-      LastNameLength - number of columns that the last name spans
-      BubblesPerRow - number of bubbles available in each row used to
-                      bubble an answer. (If not specified, 10 assumed).
-
-=cut
-
-sub get_scantron_config {
-    my ($which) = @_;
-    my @lines = &get_scantronformat_file();
-    my %config;
-    #FIXME probably should move to XML it has already gotten a bit much now
-    foreach my $line (@lines) {
-	my ($name,$descrip)=split(/:/,$line);
-	if ($name ne $which ) { next; }
-	chomp($line);
-	my @config=split(/:/,$line);
-	$config{'name'}=$config[0];
-	$config{'description'}=$config[1];
-	$config{'CODElocation'}=$config[2];
-	$config{'CODEstart'}=$config[3];
-	$config{'CODElength'}=$config[4];
-	$config{'IDstart'}=$config[5];
-	$config{'IDlength'}=$config[6];
-	$config{'Qstart'}=$config[7];
- 	$config{'Qlength'}=$config[8];
-	$config{'Qoff'}=$config[9];
-	$config{'Qon'}=$config[10];
-	$config{'PaperID'}=$config[11];
-	$config{'PaperIDlength'}=$config[12];
-	$config{'FirstName'}=$config[13];
-	$config{'FirstNamelength'}=$config[14];
-	$config{'LastName'}=$config[15];
-	$config{'LastNamelength'}=$config[16];
-        $config{'BubblesPerRow'}=$config[17];
-	last;
-    }
-    return %config;
-}
-
 =pod 
 
 =item username_to_idmap
@@ -6204,7 +6063,7 @@
    Process a requested correction to a scanline.
 
   Arguments:
-    $scantron_config   - hash from &get_scantron_config()
+    $scantron_config   - hash from &Apache::lonnet::get_scantron_config()
     $scan_data         - hash of correction information 
                           (see &scantron_getfile())
     $line              - existing scanline
@@ -6887,7 +6746,7 @@
 
 sub scantron_process_corrections {
     my ($r) = @_;
-    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
     my $classlist=&Apache::loncoursedata::get_classlist();
     my $which=$env{'form.scantron_line'};
@@ -7056,7 +6915,7 @@
 sub scantron_warning_screen {
     my ($button_text)=@_;
     my $title=&Apache::lonnet::gettitle($env{'form.selectpage'});
-    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
     my $CODElist;
     if ($scantron_config{'CODElocation'} &&
 	$scantron_config{'CODEstart'} &&
@@ -7215,7 +7074,7 @@
     #get the student pick code ready
     $r->print(&Apache::loncommon::studentbrowser_javascript());
     my $nav_error;
-    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
     my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config);
     if ($nav_error) {
         $r->print(&navmap_errormsg());
@@ -7674,7 +7533,7 @@
     my %idmap=&username_to_idmap($classlist);
 
     #get scantron line setup
-    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
 
     my $nav_error;
@@ -8138,7 +7997,7 @@
 
  Arguments:
     $r           - Apache request object
-    $scan_config - hash from &get_scantron_config()
+    $scan_config - hash from &Apache::lonnet::get_scantron_config()
     $line        - Number of the line being displayed.
     $questionnum - Question number (may include subquestion)
     $error       - Type of error.
@@ -8302,7 +8161,7 @@
 
 sub scantron_validate_CODE {
     my ($r,$currentphase) = @_;
-    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
     if ($scantron_config{'CODElocation'} &&
 	$scantron_config{'CODEstart'} &&
 	$scantron_config{'CODElength'}) {
@@ -8376,7 +8235,7 @@
         &Apache::lonnet::decode_symb($env{'form.selectpage'});
 
     #get scantron line setup
-    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
 
     my $navmap = Apache::lonnavmaps::navmap->new();
@@ -8558,7 +8417,7 @@
         &Apache::lonnet::decode_symb($env{'form.selectpage'});
 
     #get scantron line setup
-    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
 
     my $navmap = Apache::lonnavmaps::navmap->new();
@@ -8687,7 +8546,7 @@
         }
     }
     if ($needs_hand_bubbles) {
-        my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+        my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
         my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
         return &mt('The sequence to be graded contains response types which are handgraded.').'<p>'.
                &mt('If you have already graded these by bubbling sheets to indicate points awarded, [_1]what point value is assigned to a filled last bubble in each row?','<br />').
@@ -8707,7 +8566,7 @@
     }
     my $default_form_data=&defaultFormData($symb);
 
-    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
     my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
     my ($scanlines,$scan_data)=&scantron_getfile();
     my $classlist=&Apache::loncoursedata::get_classlist();
@@ -8777,7 +8636,7 @@
 	return '';		# Dunno why the other returns return '' rather than just returning.
     }
 
-    my %lettdig = &letter_to_digits();
+    my %lettdig = &Apache::lonnet::letter_to_digits();
     my $numletts = scalar(keys(%lettdig));
     my %orderedforcode;
 
@@ -9108,6 +8967,7 @@
 sub scantron_upload_scantron_data {
     my ($r)=@_;
     my $dom = $env{'request.role.domain'};
+    my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($dom);
     my $domdesc = &Apache::lonnet::domain($dom,'description');
     $r->print(&Apache::loncommon::coursebrowser_javascript($dom));
     my $select_link=&Apache::loncommon::selectcourse_link('rules','courseid',
@@ -9121,8 +8981,7 @@
     &js_escape(\$nofile_alert);
     my $nocourseid_alert = &mt("Please use the 'Select Course' link to open a separate window where you can search for a course to which a file can be uploaded.");
     &js_escape(\$nocourseid_alert);
-    $r->print('
-<script type="text/javascript" language="javascript">
+    $r->print(&Apache::lonhtmlcommon::scripttag('
     function checkUpload(formname) {
 	if (formname.upfile.value == "") {
 	    alert("'.$nofile_alert.'");
@@ -9149,8 +9008,9 @@
         return;
     }
 
-</script>
-
+    '.$formatjs.'
+'));
+    $r->print('
 <h3>'.&mt('Send bubblesheet data to a course').'</h3>
 
 <form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post">
@@ -9164,7 +9024,12 @@
   &Apache::lonhtmlcommon::row_closure().
   &Apache::lonhtmlcommon::row_title(&mt('Domain')).
   '<input name="domainid" type="hidden" />'.$domdesc.
-  &Apache::lonhtmlcommon::row_closure().
+  &Apache::lonhtmlcommon::row_closure());
+    if ($formatoptions) {
+        $r->print(&Apache::lonhtmlcommon::row_title($formattitle).$formatoptions.
+                  &Apache::lonhtmlcommon::row_closure());
+    }
+    $r->print(
   &Apache::lonhtmlcommon::row_title(&mt('File to upload')).
   '<input type="file" name="upfile" size="50" />'.
   &Apache::lonhtmlcommon::row_closure(1).
@@ -9177,6 +9042,84 @@
     return '';
 }
 
+sub scantron_upload_dataformat {
+    my ($dom) = @_;
+    my ($formatoptions,$formattitle,$formatjs);
+    $formatjs = <<'END';
+function toggleScantab(form) {
+   return;
+}
+END
+    my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$dom);
+    if (ref($domconfig{'scantron'}) eq 'HASH') {
+        if (ref($domconfig{'scantron'}{'config'}) eq 'HASH') {
+            if (keys(%{$domconfig{'scantron'}{'config'}}) > 1) {
+                if (($domconfig{'scantron'}{'config'}{'dat'}) &&
+                    (ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH')) {
+                    if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
+                        if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}})) {
+                            my ($onclick,$formatextra,$singleline);
+                            my @lines = &Apache::lonnet::get_scantronformat_file();
+                            my $count = 0;
+                            foreach my $line (@lines) {
+                                next if ($line =~ /^#/);
+                                $singleline = $line;
+                                $count ++;
+                            }
+                            if ($count > 1) {
+                                $formatextra = '<div style="display:none" id="bubbletype">'.
+                                               '<span class="LC_nobreak">'.
+                                               &mt('Bubblesheet type:').' '.
+                                               &scantron_scantab().'</span></div>';
+                                $onclick = ' onclick="toggleScantab(this.form);"';
+                                $formatjs = <<"END";
+function toggleScantab(form) {
+    var divid = 'bubbletype';
+    if (document.getElementById(divid)) {
+        var radioname = 'fileformat';
+        var num = form.elements[radioname].length;
+        if (num) {
+            for (var i=0; i<num; i++) {
+                if (form.elements[radioname][i].checked) {
+                    var chosen = form.elements[radioname][i].value;
+                    if (chosen == 'dat') {
+                        document.getElementById(divid).style.display = 'none';
+                    } else if (chosen == 'csv') {
+                        document.getElementById(divid).style.display = 'block';
+                    }
+                }
+            }
+        }
+    }
+    return;
+}
+
+END
+                            } elsif ($count == 1) {
+                                my $formatname = (split(/:/,$singleline,2))[0];
+                                $formatextra = '<input type="hidden" name="scantron_format" value="'.$formatname.'" />';
+                            }
+                            $formattitle = &mt('File format');
+                            $formatoptions = '<label><input name="fileformat" type="radio" value="dat" checked="checked"'.$onclick.' />'.
+                                             &mt('Plain Text (no delimiters)').
+                                             '</label>'.(' 'x2).
+                                             '<label><input name="fileformat" type="radio" value="csv"'.$onclick.' />'.
+                                             &mt('Comma separated values').'</label>'.$formatextra;
+                        }
+                    }
+                }
+            } elsif (keys(%{$domconfig{'scantron'}{'config'}}) == 1) {
+                if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
+                    if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}})) {
+                        $formattitle = &mt('Bubblesheet type');
+                        $formatoptions = &scantron_scantab();
+                    }
+                }
+            }
+        }
+    }
+    return ($formatoptions,$formattitle,$formatjs);
+}
 
 sub scantron_upload_scantron_data_save {
     my($r)=@_;
@@ -9206,8 +9149,38 @@
                 &mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.',
                         '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1));
     } else {
-        my $result = 
-            &Apache::lonnet::userfileupload('upfile','','scantron','','','',
+        my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$env{'form.domainid'});
+        my $parser;
+        if (ref($domconfig{'scantron'}) eq 'HASH') {
+            if (ref($domconfig{'scantron'}{'config'}) eq 'HASH') {
+                my $is_csv;
+                my @possibles = keys(%{$domconfig{'scantron'}{'config'}});
+                if (@possibles > 1) {
+                    if ($env{'form.fileformat'} eq 'csv') {
+                        if (ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH') {
+                            if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
+                                if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}}) > 1) {
+                                    $is_csv = 1;
+                                }
+                            }
+                        }
+                    }
+                } elsif (@possibles == 1) {
+                    if (ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH') {
+                        if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
+                            if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}}) > 1) {
+                                $is_csv = 1;
+                            }
+                        }
+                    }
+                }
+                if ($is_csv) {
+                   $parser = $domconfig{'scantron'}{'config'}{'csv'};
+                }
+            }
+        }
+        my $result =
+            &Apache::lonnet::userfileupload('upfile','scantron','scantron',$parser,'','',
                                             $env{'form.courseid'},$env{'form.domainid'});
 	if ($result =~ m{^/uploaded/}) {
             $r->print(
@@ -9252,7 +9225,7 @@
             $idmap{$lckey} = $idmap{$key};
         }
         my %unique_formats;
-        my @formatlines = &get_scantronformat_file();
+        my @formatlines = &Apache::lonnet::get_scantronformat_file();
         foreach my $line (@formatlines) {
             chomp($line);
             my @config = split(/:/,$line);
@@ -9398,14 +9371,14 @@
     if (!$symb) {return '';}
     my $grading_menu_button=&show_grading_menu_form($symb);
     my $cid = $env{'request.course.id'};
-    my %lettdig = &letter_to_digits();
+    my %lettdig = &Apache::lonnet::letter_to_digits();
     my $numletts = scalar(keys(%lettdig));
     my $cnum = $env{'course.'.$cid.'.num'};
     my $cdom = $env{'course.'.$cid.'.domain'};
     my (undef, undef, $sequence) = &Apache::lonnet::decode_symb($env{'form.selectpage'});
     my %record;
     my %scantron_config =
-        &Apache::grades::get_scantron_config($env{'form.scantron_format'});
+        &Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
     my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
     my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile();
     my $classlist=&Apache::loncoursedata::get_classlist();
@@ -9729,23 +9702,6 @@
     return ($counter,$record);
 }
 
-sub letter_to_digits {
-    my %lettdig = (
-                    A => 1,
-                    B => 2,
-                    C => 3,
-                    D => 4,
-                    E => 5,
-                    F => 6,
-                    G => 7,
-                    H => 8,
-                    I => 9,
-                    J => 0,
-                  );
-    return %lettdig;
-}
-
-
 #-------- end of section for handling grading scantron forms -------
 #
 #-------------------------------------------------------------------
@@ -10754,12 +10710,20 @@
 }
 
 sub startpage {
-    my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$js) = @_;
+    my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$js,$onload) = @_;
+    my %args;
+    if ($onload) {
+         my %loaditems = (
+                        'onload' => $onload,
+                      );
+         $args{'add_entries'} = \%loaditems;
+    }
     if ($nomenu) {
-        $r->print(&Apache::loncommon::start_page("Student's Version",$js,{'only_body' => '1'}));
+        $args{'only_body'} = 1;
+        $r->print(&Apache::loncommon::start_page("Student's Version",$js,\%args));
     } else {
-        $r->print(&Apache::loncommon::start_page('Grading',$js,
-                                                 {'bread_crumbs' => $crumbs}));
+        $args{'bread_crumbs'} = $crumbs;
+        $r->print(&Apache::loncommon::start_page('Grading',$js,\%args));
     }
     unless ($nodisplayflag) {
        $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp));
@@ -10841,8 +10805,16 @@
         }
         &Apache::loncommon::content_type($request,'text/html');
         $request->send_http_header;
-        unless ((($command eq 'submission' || $command eq 'versionsub')) && ($perm{'vgr'})) {
-            $request->print($start_page); 
+        if (($command eq 'scantron_selectphase' && $perm{'mgr'}) ||
+            (($command eq 'scantronupload') &&
+             (&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) ||
+              &Apache::lonnet::allowed('usc',$env{'request.course.id'})))) {
+            &startpage($request,$symb,[{href=>'/adm/grades', text=>"Grading"}],1,1,
+                       undef,undef,undef,undef,'toggleScantab(document.rules);');
+        } else {
+            unless ((($command eq 'submission' || $command eq 'versionsub')) && ($perm{'vgr'})) {
+                $request->print($start_page);
+            }
         }
 	if ($command eq 'submission' && $perm{'vgr'}) {
             my ($stuvcurrent,$stuvdisp,$versionform,$js);
@@ -11021,7 +10993,7 @@
     $r           - Apache request object
     $i           - number of the current scanline
     $scan_record - hash ref as returned from &scantron_parse_scanline()
-    $scan_config - hash ref as returned from &get_scantron_config()
+    $scan_config - hash ref as returned from &Apache::lonnet::get_scantron_config()
     $line        - full contents of the current scanline
     $error       - error condition, valid values are
                    'incorrectCODE', 'duplicateCODE',


More information about the LON-CAPA-cvs mailing list