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

raeburn lon-capa-cvs-allow@mail.lon-capa.org
Wed, 25 Jul 2007 20:12:28 -0000


This is a MIME encoded message

--raeburn1185394348
Content-Type: text/plain

raeburn		Wed Jul 25 16:12:28 2007 EDT

  Modified files:              
    /loncom/interface	domainprefs.pm 
  Log:
  Domain settings to configure access to institutional directory search (used in loncreateuser).
  
  Institutional user type ordering icode moved to subroutine.
  
  
--raeburn1185394348
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20070725161228.txt"

Index: loncom/interface/domainprefs.pm
diff -u loncom/interface/domainprefs.pm:1.22 loncom/interface/domainprefs.pm:1.23
--- loncom/interface/domainprefs.pm:1.22	Thu Jun  7 19:36:32 2007
+++ loncom/interface/domainprefs.pm	Wed Jul 25 16:12:26 2007
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: domainprefs.pm,v 1.22 2007/06/07 23:36:32 raeburn Exp $
+# $Id: domainprefs.pm,v 1.23 2007/07/25 20:12:26 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -67,7 +67,7 @@
     }
     my %domconfig =
       &Apache::lonnet::get_dom('configuration',['login','rolecolors',
-                               'quotas','autoenroll','autoupdate'],$dom);
+                'quotas','autoenroll','autoupdate','directorysrch'],$dom);
     my @prefs = (
       { text => 'Default color schemes',
         help => 'Default_Color_Schemes',
@@ -106,7 +106,13 @@
                     col2 => 'Value',},
                    {col1 => 'User Population',
                     col2 => 'Updataeable user data'}],
-      },
+        },
+      { text => 'Institutional directory searches',
+        help => 'Domain_Directory_Search',
+        action => 'directorysrch',
+        header => [{col1 => 'Setting',
+                    col2 => 'Value',}],
+        },
     );
     my @roles = ('student','coordinator','author','admin');
     &Apache::lonhtmlcommon::add_breadcrumb
@@ -189,6 +195,8 @@
         $output = &modify_autoenroll($dom,%domconfig);
     } elsif ($action eq 'autoupdate') {
         $output = &modify_autoupdate($dom,%domconfig);
+    } elsif ($action eq 'directorysrch') {
+        $output = &modify_directorysrch($dom,%domconfig);
     }
     return $output;
 }
@@ -279,6 +287,8 @@
            $r->print(&print_quotas($dom,$settings));
         } elsif ($action eq 'autoenroll') {
            $r->print(&print_autoenroll($dom,$settings));
+        } elsif ($action eq 'directorysrch') {
+           $r->print(&print_directorysrch($dom,$settings));
         }  
     }
     $r->print('
@@ -732,21 +742,11 @@
 sub print_quotas {
     my ($dom,$settings) = @_;
     my $datatable;
-    my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
-    my $othertitle = "All users";
-    my @types;
-    if (ref($order) eq 'ARRAY') {
-        @types = @{$order};
-    }
-    if (@types == 0) {
-        if (ref($usertypes) eq 'HASH') {
-            @types = sort(keys(%{$usertypes}));
-        }
-    }
+    my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
     my $typecount = 0;
     my $css_class;
-    if (@types > 0) {
-        foreach my $type (@types) {
+    if (@{$types} > 0) {
+        foreach my $type (@{$types}) {
             if (defined($usertypes->{$type})) {
                 $typecount ++;
                 $css_class = $typecount%2?' class="LC_odd_row"':'';
@@ -758,7 +758,6 @@
                               '" size="5" /> Mb</span></td></tr>';
             }
         }
-        $othertitle = "Other users";
     }
     my $defaultquota = '20';
     if (ref($settings) eq 'HASH') {
@@ -867,20 +866,7 @@
                   $classlistsoff.'value="0" />'.&mt('No').'</label></span></td>'.
                   '</tr>';
     } else {
-        my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
-        my @types;
-        if (ref($order) eq 'ARRAY') {
-            @types = @{$order};
-        }
-        if (@types == 0) {
-            if (ref($usertypes) eq 'HASH') {
-                @types = sort(keys(%{$usertypes}));
-            }
-        }
-        my $othertitle = &mt('All users');
-        if (keys(%{$usertypes}) > 0) {
-            $othertitle = &mt('Other users');
-        }
+        my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
         my @fields = ('lastname','firstname','middlename','gen',
                       'permanentemail','id');
         my %fieldtitles = &Apache::lonlocal::texthash (
@@ -892,10 +878,10 @@
                             gen => 'Generation',
                       );
         my $numrows = 0;
-        if (@types > 0) {
+        if (@{$types} > 0) {
             $datatable = 
                 &usertype_update_row($settings,$usertypes,\%fieldtitles,
-                                     \@fields,\@types,\$numrows);
+                                     \@fields,$types,\$numrows);
         }
         $datatable .= 
             &usertype_update_row($settings,{'default' => $othertitle},
@@ -905,6 +891,144 @@
     return $datatable;
 }
 
+sub print_directorysrch {
+    my ($dom,$settings) = @_;
+    my $srchon = ' ';
+    my $srchoff = ' checked="checked" ';
+    my $exacton = '';
+    my $containson = ' checked="checked" ';
+    my $specifyon = '';
+    if (ref($settings) eq 'HASH') {
+        if ($settings->{'available'} eq '1') {
+            $srchon = $srchoff;
+            $srchoff = ' ';
+        }
+        if ($settings->{'searchtypes'} eq 'exact') {
+            $exacton = $containson;
+            $containson = ' ';
+        }
+        if ($settings->{'searchtypes'} eq 'specify') {
+            $specifyon = $containson;
+            $containson = ' ';
+        }
+    }
+    my ($searchtitles,$titleorder) = &sorted_searchtitles();
+    my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
+
+    my $numinrow = 4;
+    my $datatable='<tr class="LC_odd_row">'.
+                  '<td>'.&mt('Directory search available?').'</td>'.
+                  '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
+                  '<input type="radio" name="dirsrch_available"'.
+                  $srchon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.
+                  '<label><input type="radio" name="dirsrch_available"'.
+                  $srchoff.' value="0" />'.&mt('No').'</label></span></td>'.
+                  '</tr><tr>'.
+                  '<td>'.&mt('Search latitude').'</td>'.
+                  '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
+                  '<input type="radio" name="searchtypes"'.
+                  $exacton.' value="exact" />'.&mt('Exact match only').'</label>&nbsp;'.
+                  '<label><input type="radio" name="searchtypes"'.
+                  $containson.' value="contains" />'.&mt('Contains is a match').'</label>'.
+                  '&nbsp;<label><input type="radio" name="searchtypes"'.
+                  $specifyon.' value="specify" />'.&mt('Specifiable type').
+                  '</label></span></td></tr>'.
+                  '<tr class="LC_odd_row">'.
+                  '<td>'.&mt('Users permitted to search').
+                  '</td><td class="LC_left_item"><table>';
+    for (my $i=0; $i<@{$types}; $i++) {
+        if (defined($usertypes->{$types->[$i]})) {
+            my $rem = $i%($numinrow);
+            if ($rem == 0) {
+                if ($i > 0) {
+                    $datatable .= '</tr>';
+                }
+                $datatable .= '<tr>';
+            }
+            my $check = ' ';
+            if (ref($settings->{'cansearch'}) eq 'ARRAY') {
+                if (grep(/^\Q$types->[$i]\E$/,@{$settings->{'cansearch'}})) {
+                    $check = ' checked="checked" ';
+                }
+            }
+            $datatable .= '<td class="LC_left_item">'.
+                          '<span class="LC_nobreak"><label>'.
+                          '<input type="checkbox" name="cansearch" '.
+                          'value="'.$types->[$i].'"'.$check.'/>'.
+                          $usertypes->{$types->[$i]}.'</label></span></td>';
+        }
+    }
+
+    my $rem = @{$types}%($numinrow);
+    my $colsleft = $numinrow - $rem;
+    if ($colsleft > 1) {
+        $datatable .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
+    } else {
+        $datatable .= '<td class="LC_left_item">';
+    }
+    my $defcheck = ' ';
+    if (ref($settings->{'cansearch'}) eq 'ARRAY') {
+         if (grep(/^default$/,@{$settings->{'cansearch'}})) {
+              $defcheck = ' checked="checked" ';
+         }
+    }
+    $datatable .= '<span class="LC_nobreak"><label>'.
+                  '<input type="checkbox" name="cansearch" '.
+                  'value="default"'.$defcheck.'/>'.
+                  $othertitle.'</label></span></td>'.
+                  '</tr></table></td></tr>';
+
+    $datatable .= '<tr>'.
+                  '<td>'.&mt('Supported search methods').
+                  '</td><td class="LC_left_item"><table><tr>';
+    foreach my $title (@{$titleorder}) {
+        if (defined($searchtitles->{$title})) {
+            my $check = ' ';
+            if (ref($settings->{'searchby'}) eq 'ARRAY') {
+                if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {
+                    $check = ' checked="checked" ';
+                }
+            }
+            $datatable .= '<td class="LC_left_item">'.
+                          '<span class="LC_nobreak"><label>'.
+                          '<input type="checkbox" name="searchby" '.
+                          'value="'.$title.'"'.$check.'/>'.
+                          $searchtitles->{$title}.'</label></span></td>';
+        }
+    }
+    $datatable .= '</tr></table></td></tr>';
+    return $datatable;
+}
+
+sub sorted_inst_types {
+    my ($dom) = @_;
+    my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
+    my $othertitle = "All users";
+    my @types;
+    if (ref($order) eq 'ARRAY') {
+        @types = @{$order};
+    }
+    if (@types == 0) {
+        if (ref($usertypes) eq 'HASH') {
+            @types = sort(keys(%{$usertypes}));
+        }
+    }
+    if (keys(%{$usertypes}) > 0) {
+        $othertitle = &mt('Other users');
+    }
+    return ($othertitle,$usertypes,\@types);
+}
+
+sub sorted_searchtitles {
+    my %searchtitles = &Apache::lonlocal::texthash(
+                         'uname' => 'username',
+                         'lastname' => 'last name',
+                         'lastfirst' => 'last name, first name',
+                     );
+    my @titleorder = ('uname','lastname','lastfirst');
+    return (\%searchtitles,\@titleorder);
+}
+
 sub usertype_update_row {
     my ($settings,$usertypes,$fieldtitles,$fields,$types,$rownums) = @_;
     my $datatable;
@@ -1642,7 +1766,7 @@
              }
         } elsif ($autorun) {
             if ($env{'form.autoenroll_run'} ne '1') {
-                $changes{'run'} = 1;
+                 $changes{'run'} = 1;
             }
         }
         if ($currautoenroll{'sender_uname'} ne $sender_uname) {
@@ -1794,5 +1918,134 @@
     return $resulttext;
 }
 
+sub modify_directorysrch {
+    my ($dom,%domconfig) = @_;
+    my ($resulttext,%changes);
+    my %currdirsrch;
+    if (ref($domconfig{'directorysrch'}) eq 'HASH') {
+        foreach my $key (keys(%{$domconfig{'directorysrch'}})) {
+            $currdirsrch{$key} = $domconfig{'directorysrch'}{$key};
+        }
+    }
+    my %title = ( available => 'Directory search available',
+                  cansearch => 'Users permitted to search',
+                  searchby => 'Search types',
+                  searchtypes => 'Search latitude');
+
+    my @offon = ('off','on');
+
+    my @cansearch = &Apache::loncommon::get_env_multiple('form.cansearch');
+    my @searchby = &Apache::loncommon::get_env_multiple('form.searchby');
+
+    if (ref($currdirsrch{'cansearch'}) eq 'ARRAY') {
+        foreach my $type (@{$currdirsrch{'cansearch'}}) {
+            if (!grep(/^\Q$type\E$/,@cansearch)) {
+                push(@{$changes{'cansearch'}},$type);
+            }
+        }
+        foreach my $type (@cansearch) {
+            if (!grep(/^\Q$type\E$/,@{$currdirsrch{'cansearch'}})) {
+                push(@{$changes{'cansearch'}},$type);
+            }
+        }
+    } else {
+        push(@{$changes{'cansearch'}},@cansearch);
+    }
+
+    if (ref($currdirsrch{'searchby'}) eq 'ARRAY') {
+        foreach my $by (@{$currdirsrch{'searchby'}}) {
+            if (!grep(/^\Q$by\E$/,@searchby)) {
+                push(@{$changes{'searchby'}},$by);
+            }
+        }
+        foreach my $by (@searchby) {
+            if (!grep(/^\Q$by\E$/,@{$currdirsrch{'searchby'}})) {
+                push(@{$changes{'searchby'}},$by);
+            }
+        }
+    } else {
+        push(@{$changes{'searchby'}},@searchby);
+    }
+    
+    my %dirsrch_hash =  (
+            directorysrch => { available => $env{'form.dirsrch_available'},
+                               cansearch => \@cansearch,
+                               searchby => \@searchby,
+                               searchtypes => $env{'form.searchtypes'},
+                             }
+            );
+    my $putresult = &Apache::lonnet::put_dom('configuration',\%dirsrch_hash,
+                                             $dom);
+    if ($putresult eq 'ok') {
+        if (exists($currdirsrch{'available'})) {
+             if ($currdirsrch{'available'} ne $env{'form.dirsrch_available'}) {
+                 $changes{'available'} = 1;
+             }
+        } else {
+            if ($env{'form.dirsrch_available'} eq '1') {
+                $changes{'available'} = 1;
+            }
+        }
+        if (exists($currdirsrch{'searchtypes'})) {
+             if ($currdirsrch{'searchtypes'} ne $env{'form.searchtypes'}) {
+                 $changes{'searchtypes'} = 1;
+             }
+        } else {
+            if ($env{'form.searchtypes'}) {
+                $changes{'searchtypes'} = 1;
+            }
+        }
+        if (keys(%changes) > 0) {
+            $resulttext = &mt('Changes made:').'<ul>';
+            if ($changes{'available'}) {
+                $resulttext .= '<li>'.&mt("$title{'available'} set to: $offon[$env{'form.dirsrch_available'}]").'</li>';
+            }
+            if (ref($changes{'cansearch'}) eq 'ARRAY') {
+                my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
+                my $chgtext;
+                foreach my $type (@cansearch) {
+                    if (defined($usertypes->{$type})) {
+                        $chgtext .= $usertypes->{$type}.'; ';
+                    }
+                }
+                if (grep(/^default$/,@cansearch)) {
+                    $chgtext .= $othertitle;
+                } else {
+                    $chgtext =~ s/\; $//;
+                }
+                $resulttext .= '<li>'.&mt("$title{'cansearch'} set to: [_1]",$chgtext).'</li>';
+            }
+            if (ref($changes{'searchby'}) eq 'ARRAY') {
+                my ($searchtitles,$titleorder) = &sorted_searchtitles();
+                my $chgtext;
+                foreach my $type (@{$titleorder}) {
+                    if (grep(/^\Q$type\E$/,@searchby)) {
+                        if (defined($searchtitles->{$type})) {
+                            $chgtext .= $searchtitles->{$type}.'; ';
+                        }
+                    }
+                }
+                $chgtext =~ s/\; $//;
+                $resulttext .= '<li>'.&mt("$title{'searchby'} set to: [_1]",$chgtext).'</li>';
+            }
+            if ($changes{'searchtypes'}) {
+                my %srchtypes_desc = ( 
+                                       exact => 'Exact match only',
+                                       contains => 'Contains is a match',
+                                       specify => 'Match type specifiable',
+                                     );
+                $resulttext .= '<li>'.&mt("$title{'searchtypes'} set to: \"$srchtypes_desc{$env{'form.searchtypes'}}\"").'</li>';
+            }
+            $resulttext .= '</ul>';
+        } else {
+            $resulttext = &mt('No changes made to institution directory search settings');
+        }
+    } else {
+        $resulttext = '<span class="LC_error">'.
+            &mt('An error occurred: [_1]',$putresult).'</span>';
+    }
+    return $resulttext;
+}
+
 1;
 

--raeburn1185394348--