--- loncom/interface/domainprefs.pm 2007/04/10 20:49:07 1.9 +++ loncom/interface/domainprefs.pm 2007/07/28 21:23:53 1.24 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.9 2007/04/10 20:49:07 raeburn Exp $ +# $Id: domainprefs.pm,v 1.24 2007/07/28 21:23:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -67,7 +67,7 @@ sub handler { } 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 @@ sub handler { 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 @@ -133,6 +139,31 @@ sub handler { my %helphash; my $numprefs = @prefs; &print_header($r,$phase); + if (keys(%domconfig) == 0) { + my $primarylibserv = &Apache::lonnet::domain($dom,'primary'); + my $perlvarref = &LONCAPA::Configuration::read_conf('loncapa.conf'); + my $hostid = $perlvarref->{'lonHostID'}; + if ($hostid ne $primarylibserv) { + my %designhash = &Apache::loncommon::get_domainconf($dom); + my @loginimages = ('img','logo','domlogo'); + my $custom_img_count = 0; + foreach my $img (@loginimages) { + if ($designhash{$dom.'.login.'.$img} ne '') { + $custom_img_count ++; + } + } + foreach my $role (@roles) { + if ($designhash{$dom.'.'.$role.'.img'} ne '') { + $custom_img_count ++; + } + } + if ($custom_img_count > 0) { + my $switch_server = &check_switchserver($dom,$confname); + $r->print(&mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'
'.&mt("While this remains so, you must switch to the domain's primary library server in order to update settings.").'

'.&mt("Thereafter, you will be able to update settings from this screen when logged in to any server in the LON-CAPA network (with a DC role selected in the domain), although you will still need to switch to the domain's primary library server to upload new images or logos.").'

'.$switch_server.' '.&mt('to primary library server for domain: [_1]',$dom)); + return OK; + } + } + } $r->print('
'); foreach my $item (@prefs) { if ($item->{'action'} eq 'login') { @@ -145,7 +176,7 @@ sub handler {
'); - &print_footer($r,$phase,'process','Store changes'); + &print_footer($r,$phase,'process','Save changes'); } return OK; } @@ -164,6 +195,8 @@ sub process_changes { $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; } @@ -173,9 +206,12 @@ sub print_config_box { $r->print(' - - '); + '); +# +# FIXME - put the help link back in when the help files exist +# +# '); if (($action eq 'autoupdate') || ($action eq 'rolecolors')) { my $colspan = ($action eq 'rolecolors')?' colspan="2"':''; $r->print(' @@ -235,7 +271,7 @@ sub print_config_box {
'.&mt($item->{text}).' '. - &Apache::loncommon::help_open_topic($item->{'help'}).'
'.&mt($item->{text}).' 
'.&mt($item->{text}).' '. +# &Apache::loncommon::help_open_topic($item->{'help'}).'
'); - if ($action eq 'login') { + if (($action eq 'login') || ($action eq 'directorysrch')) { $r->print(' '); } else { @@ -251,6 +287,8 @@ sub print_config_box { $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(' @@ -522,13 +560,14 @@ sub display_color_options { ''; my $switchserver = &check_switchserver($dom,$confname); foreach my $img (@{$images}) { - $itemcount ++; + $itemcount ++; $css_class = $itemcount%2?' class="LC_odd_row"':''; $datatable .= ''. ''; - my $imgfile; + my ($imgfile, $img_import); if ($designs->{$img} ne '') { $imgfile = $designs->{$img}; + $img_import = ($imgfile =~ m{^/adm/}); } else { $imgfile = $defaults->{$img}; } @@ -550,6 +589,7 @@ sub display_color_options { $showfile = ''; } } elsif ($imgfile =~ m-^/(adm/[^/]+)/([^/]+)$-) { + $showfile = $imgfile; my $imgdir = $1; my $filename = $2; if (-e "/home/httpd/html/$imgdir/tn-".$filename) { @@ -559,12 +599,17 @@ sub display_color_options { my $output = '/home/httpd/html/'.$imgdir.'/tn-'.$filename; if (!-e $output) { my ($width,$height) = &thumb_dimensions(); - my $size = $width.'x'.$height; - system("convert -sample $size $input $output"); + my ($fullwidth,$fullheight) = &check_dimensions($input); + if ($fullwidth ne '' && $fullheight ne '') { + if ($fullwidth > $width && $fullheight > $height) { + my $size = $width.'x'.$height; + system("convert -sample $size $input $output"); + $showfile = '/'.$imgdir.'/tn-'.$filename; + } + } } - $showfile = '/'.$imgdir.'/tn-'.$filename; } - } + } if ($showfile) { $showfile = &Apache::loncommon::lonhttpdurl($showfile); $fullsize = &Apache::loncommon::lonhttpdurl($imgfile); @@ -572,6 +617,9 @@ sub display_color_options { if (!$is_custom->{$img}) { $datatable .= &mt('Default in use:').'
'; } + if ($img_import) { + $datatable.= ''; + } $datatable.= ''.$alt_text->{$img}.
                              ''; @@ -694,21 +742,11 @@ ENDCOL 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"':''; @@ -720,7 +758,6 @@ sub print_quotas { '" size="5" /> Mb'; } } - $othertitle = "Other users"; } my $defaultquota = '20'; if (ref($settings) eq 'HASH') { @@ -733,16 +770,15 @@ sub print_quotas { $datatable .= ''. ''. ''; return $datatable; } sub print_autoenroll { my ($dom,$settings) = @_; - my $defdom = $dom; my $autorun = &Apache::lonnet::auto_run(undef,$dom), - my ($runon,$runoff); + my ($defdom,$runon,$runoff); if (ref($settings) eq 'HASH') { if (exists($settings->{'run'})) { if ($settings->{'run'} eq '0') { @@ -764,6 +800,14 @@ sub print_autoenroll { if (exists($settings->{'sender_domain'})) { $defdom = $settings->{'sender_domain'}; } + } else { + if ($autorun) { + $runon = ' checked="checked" '; + $runoff = ' '; + } else { + $runoff = ' checked="checked" '; + $runon = ' '; + } } my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1); my $datatable=''. @@ -772,7 +816,7 @@ sub print_autoenroll { ''.&mt('Yes').' '. ''. + $runoff.' value="0" />'.&mt('No').''. ''. ''. ''; } 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 @fields = ('lastname','firstname','middlename','gen','email','id'); + my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom); + my @fields = ('lastname','firstname','middlename','gen', + 'permanentemail','id'); my %fieldtitles = &Apache::lonlocal::texthash ( id => 'Student/Employee ID', - email => 'E-mail address', + permanentemail => 'E-mail address', lastname => 'Last Name', firstname => 'First Name', middlename => 'Middle Name', 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}, @@ -859,6 +891,157 @@ sub print_autoupdate { return $datatable; } +sub print_directorysrch { + my ($dom,$settings) = @_; + my $srchon = ' '; + my $srchoff = ' checked="checked" '; + my $exacton = ''; + my $containson = ' checked="checked" '; + my $specifyon = ''; + my $localon = ' '; + my $localoff = ' checked="checked" '; + if (ref($settings) eq 'HASH') { + if ($settings->{'available'} eq '1') { + $srchon = $srchoff; + $srchoff = ' '; + } + if ($settings->{'localonly'} eq '1') { + $localon = $localoff; + $localoff = ' '; + } + 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=''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''; + + $datatable .= ''. + ''; + 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; @@ -951,7 +1134,8 @@ sub modify_login { $resulttext = &mt('No changes made to log-in page settings'); } } else { - $resulttext = &mt('An error occurred: [_1]',$putresult); + $resulttext = ''. + &mt('An error occurred: [_1]',$putresult).''; } if ($errors) { $resulttext .= '
'.&mt('The following errors occurred: ').'
    '. @@ -993,7 +1177,8 @@ sub modify_rolecolors { $resulttext = &mt('No changes made to default color schemes'); } } else { - $resulttext = &mt('An error occurred: [_1]',$putresult); + $resulttext = ''. + &mt('An error occurred: [_1]',$putresult).''; } if ($errors) { $resulttext .= &mt('The following errors occurred: ').'
      '. @@ -1004,7 +1189,7 @@ sub modify_rolecolors { sub modify_colors { my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_; - my %changes; + my (%changes,%choices); my @bgs = ('pgbg','mainbg','sidebg'); my @links = ('link','alink','vlink'); my @images; @@ -1012,6 +1197,11 @@ sub modify_colors { my $errors; foreach my $role (@{$roles}) { if ($role eq 'login') { + %choices = &login_choices(); + } else { + %choices = &color_font_choices(); + } + if ($role eq 'login') { @images = ('img','logo','domlogo'); } else { @images = ('img'); @@ -1032,11 +1222,20 @@ sub modify_colors { } my ($width,$height) = &thumb_dimensions(); foreach my $img (@images) { + if ( ! $env{'form.'.$role.'_'.$img.'.filename'} + && !defined($domconfig->{$role}{$img}) + && !$env{'form.'.$role.'_del_'.$img} + && $env{'form.'.$role.'_import_'.$img}) { + # import the old configured image from the .tab setting + # if they haven't provided a new one + $domconfig->{$role}{$img} = + $env{'form.'.$role.'_import_'.$img}; + } if ($env{'form.'.$role.'_'.$img.'.filename'} ne '') { my $error; if ($configuserok eq 'ok') { if ($switchserver) { - $error = &mt("Upload of image [_1] for $role page(s) is not permitted to this server: [_2]",$img,$switchserver); + $error = &mt("Upload of [_1] image for $role page(s) is not permitted to this server: [_2]",$choices{$img},$switchserver); } else { if ($author_ok eq 'ok') { my ($result,$logourl) = @@ -1044,20 +1243,20 @@ sub modify_colors { $dom,$confname,$img,$width,$height); if ($result eq 'ok') { $confhash->{$role}{$img} = $logourl; - $changes{$role}{$img} = 1; + $changes{$role}{'images'}{$img} = 1; } else { - $error = &mt("Upload of image [_1] for $role page(s) failed because an error occurred publshing the file in RES space. Error was: [_2].",$img,$result); + $error = &mt("Upload of [_1] image for $role page(s) failed because an error occurred publishing the file in RES space. Error was: [_2].",$choices{img},$result); } } else { - $error = &mt("Upload of image [_1] for $role page(s) failed because an author role could not be assigned to a Domain Configuation user ([_2]) in domain: [_3]. Error was: [_4].",$img,$confname,$dom,$author_ok); + $error = &mt("Upload of [_1] image for $role page(s) failed because an author role could not be assigned to a Domain Configuation user ([_2]) in domain: [_3]. Error was: [_4].",$choices{$img},$confname,$dom,$author_ok); } } } else { - $error = &mt("Upload of image [_1] for $role page(s) failed because a Domain Configuation user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$img,$confname,$dom,$configuserok); + $error = &mt("Upload of [_1] image for $role page(s) failed because a Domain Configuation user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$choices{$img},$confname,$dom,$configuserok); } if ($error) { &Apache::lonnet::logthis($error); - $errors .= '
    • '.$error.'
    • '; + $errors .= '
    • '.$error.'
    • '; } } elsif ($domconfig->{$role}{$img} ne '') { if ($domconfig->{$role}{$img} !~ m-^(/res/\Q$dom\E/\Q$confname\E/\Q$img\E)/([^/]+)$-) { @@ -1071,6 +1270,7 @@ sub modify_colors { $dom,$confname,$img,$width,$height); if ($result eq 'ok') { $confhash->{$role}{$img} = $logourl; + $changes{$role}{'images'}{$img} = 1; } } } @@ -1084,7 +1284,7 @@ sub modify_colors { if ($domconfig->{$role}{$img} ne '') { if ($env{'form.'.$role.'_del_'.$img}) { $confhash->{$role}{$img} = ''; - $changes{$role}{$img} = 1; + $changes{$role}{'images'}{$img} = 1; } else { if ($confhash->{$role}{$img} eq '') { $confhash->{$role}{$img} = $domconfig->{$role}{$img}; @@ -1093,7 +1293,7 @@ sub modify_colors { } else { if ($env{'form.'.$role.'_del_'.$img}) { $confhash->{$role}{$img} = ''; - $changes{$role}{$img} = 1; + $changes{$role}{'images'}{$img} = 1; } } } @@ -1155,7 +1355,7 @@ sub default_change_checker { foreach my $img (@{$images}) { if ($env{'form.'.$role.'_del_'.$img}) { $confhash->{$role}{$img} = ''; - $changes->{$role}{$img} = 1; + $changes->{$role}{'images'}{$img} = 1; } } if ($confhash->{$role}{'font'}) { @@ -1192,7 +1392,11 @@ sub display_colorchgs { if ($confhash->{$role}{$item} eq '') { $resulttext .= '
    • '.&mt("$choices{$item} set to default").'
    • '; } else { - $resulttext .= '
    • '.&mt("$choices{$item} set to [_1]",$confhash->{$role}{$item}).'
    • '; + my $newitem = $confhash->{$role}{$item}; + if ($key eq 'images') { + $newitem = ''.$choices{$item}.''; + } + $resulttext .= '
    • '.&mt("$choices{$item} set to [_1]",$newitem).'
    • '; } } if ($role ne 'login') { @@ -1218,6 +1422,26 @@ sub thumb_dimensions { return ('200','50'); } +sub check_dimensions { + my ($inputfile) = @_; + my ($fullwidth,$fullheight); + if ($inputfile =~ m|^[/\w.\-]+$|) { + if (open(PIPE,"identify $inputfile 2>&1 |")) { + my $imageinfo = ; + if (!close(PIPE)) { + &Apache::lonnet::logthis("Failed to close PIPE opened to retrieve image information for $inputfile"); + } + chomp($imageinfo); + my ($fullsize) = + ($imageinfo =~ /^\Q$inputfile\E\s+\w+\s+(\d+x\d+)/); + if ($fullsize) { + ($fullwidth,$fullheight) = split(/x/,$fullsize); + } + } + } + return ($fullwidth,$fullheight); +} + sub check_configuser { my ($uhome,$dom,$confname,$servadm) = @_; my ($configuserok,%currroles); @@ -1350,17 +1574,23 @@ $env{'user.name'}.':'.$env{'user.domain' if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) { my $inputfile = $filepath.'/'.$file; my $outfile = $filepath.'/'.'tn-'.$file; - my $thumbsize = $thumbwidth.'x'.$thumbheight; - system("convert -sample $thumbsize $inputfile $outfile"); - chmod(0660, $filepath.'/tn-'.$file); - if (-e $outfile) { - my $copyfile=$targetdir.'/tn-'.$file; - if (copy($outfile,$copyfile)) { - print $logfile "\nCopied source to ".$copyfile."\n"; - &write_metadata($dom,$confname,$formname,$targetdir, - 'tn-'.$file,$logfile); - } else { - print $logfile "\nUnable to write ".$copyfile.':'.$!."\n"; + my ($fullwidth,$fullheight) = &check_dimensions($inputfile); + if ($fullwidth ne '' && $fullheight ne '') { + if ($fullwidth > $thumbwidth && $fullheight > $thumbheight) { + my $thumbsize = $thumbwidth.'x'.$thumbheight; + system("convert -sample $thumbsize $inputfile $outfile"); + chmod(0660, $filepath.'/tn-'.$file); + if (-e $outfile) { + my $copyfile=$targetdir.'/tn-'.$file; + if (copy($outfile,$copyfile)) { + print $logfile "\nCopied source to ".$copyfile."\n"; + &write_metadata($dom,$confname,$formname, + $targetdir,'tn-'.$file,$logfile); + } else { + print $logfile "\nUnable to write ".$copyfile. + ':'.$!."\n"; + } + } } } } @@ -1454,10 +1684,9 @@ sub check_switchserver { $home = &Apache::lonnet::domain($dom,'primary'); } my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } - if (!$allowed) { - $switchserver=''.&mt('Switch Server').''; - } + foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } + if (!$allowed) { + $switchserver=''.&mt('Switch Server').''; } return $switchserver; } @@ -1473,6 +1702,7 @@ sub modify_quotas { $formhash{$1} = $env{$key}; } } + $formhash{'default'} = $env{'form.defaultquota'}; if (ref($domconfig{'quotas'}) eq 'HASH') { foreach my $key (keys(%{$domconfig{'quotas'}})) { if (exists($formhash{$key})) { @@ -1507,7 +1737,8 @@ sub modify_quotas { $resulttext = &mt('No changes made to default quotas'); } } else { - $resulttext = &mt('An error occurred: [_1]',$putresult); + $resulttext = ''. + &mt('An error occurred: [_1]',$putresult).''; } return $resulttext; } @@ -1525,10 +1756,17 @@ sub modify_autoenroll { my %title = ( run => 'Auto-enrollment active', sender => 'Sender for notification messages'); my @offon = ('off','on'); + my $sender_uname = $env{'form.sender_uname'}; + my $sender_domain = $env{'form.sender_domain'}; + if ($sender_domain eq '') { + $sender_uname = ''; + } elsif ($sender_uname eq '') { + $sender_domain = ''; + } my %autoenrollhash = ( autoenroll => { run => $env{'form.autoenroll_run'}, - sender_uname => $env{'form.sender_uname'}, - sender_domain => $env{'form.sender_domain'}, + sender_uname => $sender_uname, + sender_domain => $sender_domain, } ); @@ -1541,21 +1779,13 @@ sub modify_autoenroll { } } elsif ($autorun) { if ($env{'form.autoenroll_run'} ne '1') { - $changes{'run'} = 1; + $changes{'run'} = 1; } } - if (exists($currautoenroll{sender_uname})) { - if ($currautoenroll{'sender_uname'} ne $env{'form.sender_uname'}) { - $changes{'sender'} = 1; - } - } else { + if ($currautoenroll{'sender_uname'} ne $sender_uname) { $changes{'sender'} = 1; } - if (exists($currautoenroll{sender_domain})) { - if ($currautoenroll{'sender_domain'} ne $env{'form.sender_domain'}) { - $changes{'sender'} = 1; - } - } else { + if ($currautoenroll{'sender_domain'} ne $sender_domain) { $changes{'sender'} = 1; } if (keys(%changes) > 0) { @@ -1564,14 +1794,19 @@ sub modify_autoenroll { $resulttext .= '
    • '.&mt("$title{'run'} set to $offon[$env{'form.autoenroll_run'}]").'
    • '; } if ($changes{'sender'}) { - $resulttext .= '
    • '.&mt("$title{'sender'} set to [_1]",$env{'form.sender_uname'}.':'.$env{'form.sender_domain'}).'
    • '; + if ($sender_uname eq '' || $sender_domain eq '') { + $resulttext .= '
    • '.&mt("$title{'sender'} set to default (course owner).").'
    • '; + } else { + $resulttext .= '
    • '.&mt("$title{'sender'} set to [_1]",$sender_uname.':'.$sender_domain).'
    • '; + } } $resulttext .= '
    '; } else { $resulttext = &mt('No changes made to auto-enrollment settings'); } } else { - $resulttext = &mt('An error occurred: [_1]',$putresult); + $resulttext = ''. + &mt('An error occurred: [_1]',$putresult).''; } return $resulttext; } @@ -1592,7 +1827,7 @@ sub modify_autoupdate { my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom); my %fieldtitles = &Apache::lonlocal::texthash ( id => 'Student/Employee ID', - email => 'E-mail address', + permanentemail => 'E-mail address', lastname => 'Last Name', firstname => 'First Name', middlename => 'Middle Name', @@ -1690,7 +1925,152 @@ sub modify_autoupdate { $resulttext = &mt('No changes made to autoupdates'); } } else { - $resulttext = &mt('An error occurred: [_1]',$putresult); + $resulttext = ''. + &mt('An error occurred: [_1]',$putresult).''; + } + 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', + localonly => 'Other domains can search', + searchby => 'Search types', + searchtypes => 'Search latitude'); + my @offon = ('off','on'); + my @otherdoms = ('Yes','No'); + + 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, + localonly => $env{'form.dirsrch_localonly'}, + 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{'localonly'})) { + if ($currdirsrch{'localonly'} ne $env{'form.dirsrch_localonly'}) { + $changes{'localonly'} = 1; + } + } else { + if ($env{'form.dirsrch_localonly'} eq '1') { + $changes{'localonly'} = 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:').'
      '; + if ($changes{'available'}) { + $resulttext .= '
    • '.&mt("$title{'available'} set to: $offon[$env{'form.dirsrch_available'}]").'
    • '; + } + if ($changes{'localonly'}) { + $resulttext .= '
    • '.&mt("$title{'localonly'} set to: $otherdoms[$env{'form.dirsrch_localonly'}]").'
    • '; + } + + 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 .= '
    • '.&mt("$title{'cansearch'} ([_1]) set to: [_2]",$dom,$chgtext).'
    • '; + } + 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 .= '
    • '.&mt("$title{'searchby'} set to: [_1]",$chgtext).'
    • '; + } + if ($changes{'searchtypes'}) { + my %srchtypes_desc = ( + exact => 'Exact match only', + contains => 'Contains is a match', + specify => 'Match type specifiable', + ); + $resulttext .= '
    • '.&mt("$title{'searchtypes'} set to: \"$srchtypes_desc{$env{'form.searchtypes'}}\"").'
    • '; + } + $resulttext .= '
    '; + } else { + $resulttext = &mt('No changes made to institution directory search settings'); + } + } else { + $resulttext = ''. + &mt('An error occurred: [_1]',$putresult).''; } return $resulttext; }
'.$item->{'header'}->[0]->{'col1'}.'
'.$choices->{$img}.'
'.&mt($othertitle).''. - ' Mb
'.&mt('Notification messages - sender'). ''. @@ -822,34 +866,22 @@ sub print_autoupdate { $classlistsoff.'value="0" />'.&mt('No').'
'.&mt('Directory search available?').' '. + '
'.&mt('Search latitude').' '. + ''. + ' 
'.&mt('Other domains can search').' '. + '
'.&mt('Users allowed to search').' ('.$dom.')'. + ''; + for (my $i=0; $i<@{$types}; $i++) { + if (defined($usertypes->{$types->[$i]})) { + my $rem = $i%($numinrow); + if ($rem == 0) { + if ($i > 0) { + $datatable .= ''; + } + $datatable .= ''; + } + my $check = ' '; + if (ref($settings->{'cansearch'}) eq 'ARRAY') { + if (grep(/^\Q$types->[$i]\E$/,@{$settings->{'cansearch'}})) { + $check = ' checked="checked" '; + } + } + $datatable .= ''; + } + } + + my $rem = @{$types}%($numinrow); + my $colsleft = $numinrow - $rem; + if ($colsleft > 1) { + $datatable .= ''. + '
'. + ''; + } else { + $datatable .= ''; + } + my $defcheck = ' '; + if (ref($settings->{'cansearch'}) eq 'ARRAY') { + if (grep(/^default$/,@{$settings->{'cansearch'}})) { + $defcheck = ' checked="checked" '; + } + } + $datatable .= '
'.&mt('Supported search methods'). + ''; + 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 .= ''; + } + } + $datatable .= '
'. + '