[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /interface domainprefs.pm

raeburn raeburn at source.lon-capa.org
Sat Aug 17 15:24:31 EDT 2019


raeburn		Sat Aug 17 19:24:31 2019 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/interface	domainprefs.pm 
  Log:
  - For 2.11
    Backport 1.346, 1.347, 1.348
  
  
-------------- next part --------------
Index: loncom/interface/domainprefs.pm
diff -u loncom/interface/domainprefs.pm:1.160.6.96 loncom/interface/domainprefs.pm:1.160.6.97
--- loncom/interface/domainprefs.pm:1.160.6.96	Sat Aug  3 16:17:39 2019
+++ loncom/interface/domainprefs.pm	Sat Aug 17 19:24:29 2019
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: domainprefs.pm,v 1.160.6.96 2019/08/03 16:17:39 raeburn Exp $
+# $Id: domainprefs.pm,v 1.160.6.97 2019/08/17 19:24:29 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -363,11 +363,12 @@
                     modify => \&modify_usermodification,
                   },
         'scantron' =>
-                  { text => 'Bubblesheet format file',
+                  { text => 'Bubblesheet format',
                     help => 'Domain_Configuration_Scantron_Format',
-                    header => [ {col1 => 'Item',
-                                 col2 => '',
-                              }],
+                    header => [ {col1 => 'Bubblesheet format file',
+                                 col2 => ''},
+                                {col1 => 'Bubblesheet data upload formats',
+                                 col2 => 'Settings'}],
                     print => \&print_scantron,
                     modify => \&modify_scantron,
                   },
@@ -534,6 +535,9 @@
         if (grep(/^contacts$/, at actions)) {
             $js .= &contacts_javascript();
         }
+        if (grep(/^scantron$/, at actions)) {
+            $js .= &scantron_javascript();
+        }
         &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);
     } else {
 # check if domconfig user exists for the domain.
@@ -722,6 +726,8 @@
             $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'coursecategories') {
             $output .= $item->{'print'}->('top',$dom,$item,$settings,\$rowtotal);
+        } elsif ($action eq 'scantron') {
+            $output .= $item->{'print'}->($r,'top',$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'login') {
             if ($numheaders == 4) {
                 $colspan = ' colspan="2"';
@@ -777,6 +783,8 @@
                  ($action eq 'defaults') || ($action eq 'directorysrch') ||
                  ($action eq 'helpsettings')) {
             $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);
+        } elsif ($action eq 'scantron') {
+            $output .= $item->{'print'}->($r,'bottom',$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'login') {
             if ($numheaders == 4) {
                 $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).'
@@ -935,8 +943,6 @@
         } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || 
                  ($action eq 'serverstatuses') || ($action eq 'loadbalancing')) {
             $output .= $item->{'print'}->($dom,$settings,\$rowtotal);
-        } elsif ($action eq 'scantron') {
-            $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
         }
     }
     $output .= '
@@ -6020,6 +6026,58 @@
     return (\%titles);
 }
 
+sub print_scantron {
+    my ($r,$position,$dom,$confname,$settings,$rowtotal) = @_;
+    if ($position eq 'top') {
+        return &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
+    } else {
+        return &print_scantronconfig($dom,$settings,\$rowtotal);
+    }
+}
+
+sub scantron_javascript {
+    return <<"ENDSCRIPT";
+
+<script type="text/javascript">
+// <![CDATA[
+
+function toggleScantron(form) {
+    var csvfieldset = new Array();
+    if (document.getElementById('scantroncsv_cols')) {
+        csvfieldset.push(document.getElementById('scantroncsv_cols'));
+    }
+    if (document.getElementById('scantroncsv_options')) {
+        csvfieldset.push(document.getElementById('scantroncsv_options'));
+    }
+    if (csvfieldset.length) {
+        if (document.getElementById('scantronconfcsv')) {
+            var scantroncsv = document.getElementById('scantronconfcsv');
+            if (scantroncsv.checked) {
+                for (var i=0; i<csvfieldset.length; i++) {
+                    csvfieldset[i].style.display = 'block';
+                }
+            } else {
+                for (var i=0; i<csvfieldset.length; i++) {
+                    csvfieldset[i].style.display = 'none';
+                }
+                var csvselects = document.getElementsByClassName('scantronconfig_csv');
+                if (csvselects.length) {
+                    for (var j=0; j<csvselects.length; j++) {
+                        csvselects[j].selectedIndex = 0;
+                    }
+                }
+            }
+        }
+    }
+    return;
+}
+// ]]>
+</script>
+
+ENDSCRIPT
+
+}
+
 sub print_scantronformat {
     my ($r,$dom,$confname,$settings,$rowtotal) = @_;
     my $itemcount = 1;
@@ -6046,8 +6104,8 @@
             if ($configuserok eq 'ok') {
                 if ($author_ok eq 'ok') {
                     my %legacyfile = (
- default => $Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab', 
- custom  => $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab', 
+ default => $Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab',
+ custom  => $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab',
                     );
                     my %md5chk;
                     foreach my $type (keys(%legacyfile)) {
@@ -6056,7 +6114,7 @@
                     }
                     if ($md5chk{'default'} ne $md5chk{'custom'}) {
                         foreach my $type (keys(%legacyfile)) {
-                            ($scantronurls{$type},my $error) = 
+                            ($scantronurls{$type},my $error) =
                                 &legacy_scantronformat($r,$dom,$confname,
                                                  $type,$legacyfile{$type},
                                                  $scantronurls{$type},
@@ -6067,13 +6125,13 @@
                         }
                         if (keys(%error) == 0) {
                             $is_custom = 1;
-                            $confhash{'scantron'}{'scantronformat'} = 
+                            $confhash{'scantron'}{'scantronformat'} =
                                 $scantronurls{'custom'};
-                            my $putresult = 
+                            my $putresult =
                                 &Apache::lonnet::put_dom('configuration',
                                                          \%confhash,$dom);
                             if ($putresult ne 'ok') {
-                                $error{'custom'} = 
+                                $error{'custom'} =
                                     '<span class="LC_error">'.
                                     &mt('An error occurred updating the domain configuration: [_1]',$putresult).'</span>';
                             }
@@ -6193,6 +6251,129 @@
     return ($url,$error);
 }
 
+sub print_scantronconfig {
+    my ($dom,$settings,$rowtotal) = @_;
+    my $itemcount = 2;
+    my $is_checked = ' checked="checked"';
+    my %optionson = (
+                     hdr => ' checked="checked"',
+                     pad => ' checked="checked"',
+                     rem => ' checked="checked"',
+                    );
+    my %optionsoff = (
+                      hdr => '',
+                      pad => '',
+                      rem => '',
+                     );
+    my $currcsvsty = 'none';
+    my ($datatable,%csvfields,%checked,%onclick,%csvoptions);
+    my @fields = &scantroncsv_fields();
+    my %titles = &scantronconfig_titles();
+    if (ref($settings) eq 'HASH') {
+        if (ref($settings->{config}) eq 'HASH') {
+            if ($settings->{config}->{dat}) {
+                $checked{'dat'} = $is_checked;
+            }
+            if (ref($settings->{config}->{csv}) eq 'HASH') {
+                if (ref($settings->{config}->{csv}->{fields}) eq 'HASH') {
+                    %csvfields = %{$settings->{config}->{csv}->{fields}};
+                    if (keys(%csvfields) > 0) {
+                        $checked{'csv'} = $is_checked;
+                        $currcsvsty = 'block';
+                    }
+                }
+                if (ref($settings->{config}->{csv}->{options}) eq 'HASH') {
+                    %csvoptions = %{$settings->{config}->{csv}->{options}};
+                    foreach my $option (keys(%optionson)) {
+                        unless ($csvoptions{$option}) {
+                            $optionsoff{$option} = $optionson{$option};
+                            $optionson{$option} = '';
+                        }
+                    }
+                }
+            }
+        } else {
+            $checked{'dat'} = $is_checked;
+        }
+    } else {
+        $checked{'dat'} = $is_checked;
+    }
+    $onclick{'csv'} = ' onclick="toggleScantron(this.form);"';
+    my $css_class = $itemcount%2? ' class="LC_odd_row"':'';
+    $datatable = '<tr '.$css_class.'><td>'.&mt('Supported formats').'</td>'.
+                 '<td class="LC_left_item" valign="top"><span class="LC_nobreak">';
+    foreach my $item ('dat','csv') {
+        my $id;
+        if ($item eq 'csv') {
+            $id = 'id="scantronconfcsv" ';
+        }
+        $datatable .= '<label><input type="checkbox" name="scantronconfig" '.$id.'value="'.$item.'"'.$checked{$item}.$onclick{$item}.' />'.
+                      $titles{$item}.'</label>'.(' 'x3);
+        if ($item eq 'csv') {
+            $datatable .= '<fieldset style="display:'.$currcsvsty.'" id="scantroncsv_cols">'.
+                          '<legend>'.&mt('CSV Column Mapping').'</legend>'.
+                          '<table><tr><th>'.&mt('Field').'</th><th>'.&mt('Location').'</th></tr>'."\n";
+            foreach my $col (@fields) {
+                my $selnone;
+                if ($csvfields{$col} eq '') {
+                    $selnone = ' selected="selected"';
+                }
+                $datatable .= '<tr><td>'.$titles{$col}.'</td>'.
+                              '<td><select name="scantronconfig_csv_'.$col.'" class="scantronconfig_csv">'.
+                              '<option value=""'.$selnone.'></option>';
+                for (my $i=0; $i<20; $i++) {
+                    my $shown = $i+1;
+                    my $sel;
+                    unless ($selnone) {
+                        if (exists($csvfields{$col})) {
+                            if ($csvfields{$col} == $i) {
+                                $sel = ' selected="selected"';
+                            }
+                        }
+                    }
+                    $datatable .= '<option value="'.$i.'"'.$sel.'>'.$shown.'</option>';
+                }
+                $datatable .= '</select></td></tr>';
+           }
+           $datatable .= '</table></fieldset>'.
+                         '<fieldset style="display:'.$currcsvsty.'" id="scantroncsv_options">'.
+                         '<legend>'.&mt('CSV Options').'</legend>';
+           foreach my $option ('hdr','pad','rem') {
+               $datatable .= '<span class="LC_nobreak">'.$titles{$option}.':'.
+                         '<label><input type="radio" name="scantroncsv_'.$option.'" value="1"'.$optionson{$option}.' />'.
+                         &mt('Yes').'</label>'.(' 'x2)."\n".
+                         '<label><input type="radio" name="scantroncsv_'.$option.'" value="0"'.$optionsoff{$option}.' />'.&mt('No').'</label></span><br />';
+           }
+           $datatable .= '</fieldset>';
+           $itemcount ++;
+        }
+    }
+    $datatable .= '</td></tr>';
+    $$rowtotal ++;
+    return $datatable;
+}
+
+sub scantronconfig_titles {
+    return &Apache::lonlocal::texthash(
+                                          dat => 'Standard format (.dat)',
+                                          csv => 'Comma separated values (.csv)',
+                                          hdr => 'Remove first line in file (contains column titles)',
+                                          pad => 'Prepend 0s to PaperID',
+                                          rem => 'Remove leading spaces (except Question Response columns)',
+                                          CODE => 'CODE',
+                                          ID   => 'Student ID',
+                                          PaperID => 'Paper ID',
+                                          FirstName => 'First Name',
+                                          LastName => 'Last Name',
+                                          FirstQuestion => 'First Question Response',
+                                          Section => 'Section',
+    );
+}
+
+sub scantroncsv_fields {
+    return ('PaperID','LastName','FirstName','ID','Section','CODE','FirstQuestion');
+}
+
 sub print_coursecategories {
     my ($position,$dom,$hdritem,$settings,$rowtotal) = @_;
     my $datatable;
@@ -11492,7 +11673,7 @@
     my $custom = 'custom.tab';
     my $default = 'default.tab';
     my $servadm = $r->dir_config('lonAdmEMail');
-    my ($configuserok,$author_ok,$switchserver) = 
+    my ($configuserok,$author_ok,$switchserver) =
         &config_check($dom,$confname,$servadm);
     if ($env{'form.scantronformat.filename'} ne '') {
         my $error;
@@ -11527,6 +11708,67 @@
             if ($env{'form.scantronformat_del'}) {
                 $confhash{'scantron'}{'scantronformat'} = '';
                 $changes{'scantronformat'} = 1;
+            } else {
+                $confhash{'scantron'}{'scantronformat'} = $domconfig{'scantron'}{'scantronformat'};
+            }
+        }
+    }
+    my @options = ('hdr','pad','rem');
+    my @fields = &scantroncsv_fields();
+    my %titles = &scantronconfig_titles();
+    my @formats = &Apache::loncommon::get_env_multiple('form.scantronconfig');
+    my ($newdat,$currdat,%newcol,%currcol);
+    if (grep(/^dat$/, at formats)) {
+        $confhash{'scantron'}{config}{dat} = 1;
+        $newdat = 1;
+    } else {
+        $newdat = 0;
+    }
+    if (grep(/^csv$/, at formats)) {
+        my %bynum;
+        foreach my $field (@fields) {
+            if ($env{'form.scantronconfig_csv_'.$field} =~ /^(\d+)$/) {
+                my $posscol = $1;
+                if (($posscol < 20) && (!$bynum{$posscol})) {
+                    $confhash{'scantron'}{config}{csv}{fields}{$field} = $posscol;
+                    $bynum{$posscol} = $field;
+                    $newcol{$field} = $posscol;
+                }
+            }
+        }
+        if (keys(%newcol)) {
+            foreach my $option (@options) {
+                if ($env{'form.scantroncsv_'.$option}) {
+                    $confhash{'scantron'}{config}{csv}{options}{$option} = 1;
+                }
+            }
+        }
+    }
+    $currdat = 1;
+    if (ref($domconfig{'scantron'}) eq 'HASH') {
+        if (ref($domconfig{'scantron'}{'config'}) eq 'HASH') {
+            unless (exists($domconfig{'scantron'}{'config'}{'dat'})) {
+                $currdat = 0;
+            }
+            if (ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH') {
+                if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
+                    %currcol = %{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}};
+                }
+            }
+        }
+    }
+    if ($currdat != $newdat) {
+        $changes{'config'} = 1;
+    } else {
+        foreach my $field (@fields) {
+            if ($currcol{$field} ne '') {
+                if ($currcol{$field} ne $newcol{$field}) {
+                    $changes{'config'} = 1;
+                    last;
+                }
+            } elsif ($newcol{$field} ne '') {
+                $changes{'config'} = 1;
+                last;
             }
         }
     }
@@ -11537,29 +11779,64 @@
             if (keys(%changes) > 0) {
                 if (ref($confhash{'scantron'}) eq 'HASH') {
                     $resulttext = &mt('Changes made:').'<ul>';
-                    if ($confhash{'scantron'}{'scantronformat'} eq '') {
-                        $resulttext .= '<li>'.&mt('[_1] bubblesheet format file removed; [_2] file will be used for courses in this domain.',$custom,$default).'</li>';
-                    } else {
-                        $resulttext .= '<li>'.&mt('Custom bubblesheet format file ([_1]) uploaded for use with courses in this domain.',$custom).'</li>';
+                    if ($changes{'scantronformat'}) {
+                        if ($confhash{'scantron'}{'scantronformat'} eq '') {
+                            $resulttext .= '<li>'.&mt('[_1] bubblesheet format file removed; [_2] file will be used for courses in this domain.',$custom,$default).'</li>';
+                        } else {
+                            $resulttext .= '<li>'.&mt('Custom bubblesheet format file ([_1]) uploaded for use with courses in this domain.',$custom).'</li>';
+                        }
+                    }
+                    if ($changes{'config'}) {
+                        if (ref($confhash{'scantron'}{'config'}) eq 'HASH') {
+                            if ($confhash{'scantron'}{'config'}{'dat'}) {
+                                $resulttext .= '<li>'.&mt('Bubblesheet data upload formats includes .dat format').'</li>';
+                            }
+                            if (ref($confhash{'scantron'}{'config'}{'csv'}) eq 'HASH') {
+                                if (ref($confhash{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
+                                    if (keys(%{$confhash{'scantron'}{'config'}{'csv'}{'fields'}})) {
+                                        $resulttext .= '<li>'.&mt('Bubblesheet data upload formats includes .csv format, with following fields/column numbers supported:').'<ul>';
+                                        foreach my $field (@fields) {
+                                            if ($confhash{'scantron'}{'config'}{'csv'}{'fields'}{$field} ne '') {
+                                                my $showcol = $confhash{'scantron'}{'config'}{'csv'}{'fields'}{$field} + 1;
+                                                $resulttext .= '<li>'.$titles{$field}.': '.$showcol.'</li>';
+                                            }
+                                        }
+                                        $resulttext .= '</ul></li>';
+                                        if (ref($confhash{'scantron'}{'config'}{'csv'}{'options'}) eq 'HASH') {
+                                            if (keys(%{$confhash{'scantron'}{'config'}{'csv'}{'options'}})) {
+                                                $resulttext .= '<li>'.&mt('Bubblesheet data upload formats includes .csv format, with following options:').'<ul>';
+                                                foreach my $option (@options) {
+                                                    if ($confhash{'scantron'}{'config'}{'csv'}{'options'}{$option} ne '') {
+                                                        $resulttext .= '<li>'.$titles{$option}.'</li>';
+                                                    }
+                                                }
+                                                $resulttext .= '</ul></li>';
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        } else {
+                            $resulttext .= '<li>'.&mt('No bubblesheet data upload formats set -- will default to assuming .dat format').'</li>';
+                        }
                     }
                     $resulttext .= '</ul>';
                 } else {
                     $resulttext = &mt('Changes made to bubblesheet format file.');
                 }
-                $resulttext .= '</ul>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);
                 if (ref($lastactref) eq 'HASH') {
                     $lastactref->{'domainconfig'} = 1;
                 }
             } else {
-                $resulttext = &mt('No changes made to bubblesheet format file');
+                $resulttext = &mt('No changes made to bubblesheet format settings');
             }
         } else {
             $resulttext = '<span class="LC_error">'.
                 &mt('An error occurred: [_1]',$putresult).'</span>';
         }
     } else {
-        $resulttext = &mt('No changes made to bubblesheet format file'); 
+        $resulttext = &mt('No changes made to bubblesheet format settings');
     }
     if ($errors) {
         $resulttext .= &mt('The following errors occurred: ').'<ul>'.


More information about the LON-CAPA-cvs mailing list