--- loncom/interface/domainprefs.pm 2007/04/12 20:33:31 1.11
+++ loncom/interface/domainprefs.pm 2007/09/12 12:01:04 1.27
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set domain-wide configuration settings
#
-# $Id: domainprefs.pm,v 1.11 2007/04/12 20:33:31 albertel Exp $
+# $Id: domainprefs.pm,v 1.27 2007/09/12 12:01:04 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -67,7 +67,8 @@ sub handler {
}
my %domconfig =
&Apache::lonnet::get_dom('configuration',['login','rolecolors',
- 'quotas','autoenroll','autoupdate'],$dom);
+ 'quotas','autoenroll','autoupdate','directorysrch',
+ 'usercreation'],$dom);
my @prefs = (
{ text => 'Default color schemes',
help => 'Default_Color_Schemes',
@@ -106,7 +107,19 @@ 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',}],
+ },
+ { text => 'User creation',
+ help => 'Domain_User_Creation',
+ action => 'usercreation',
+ header => [{col1 => 'Setting',
+ col2 => 'Value',}],
+ },
);
my @roles = ('student','coordinator','author','admin');
&Apache::lonhtmlcommon::add_breadcrumb
@@ -133,6 +146,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 +183,7 @@ sub handler {
');
- &print_footer($r,$phase,'process','Store changes');
+ &print_footer($r,$phase,'process','Save changes');
}
return OK;
}
@@ -164,6 +202,10 @@ 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);
+ } elsif ($action eq 'usercreation') {
+ $output = &modify_user_creation($dom,%domconfig);
}
return $output;
}
@@ -173,9 +215,12 @@ sub print_config_box {
$r->print('
- '.&mt($item->{text}).' '.
- &Apache::loncommon::help_open_topic($item->{'help'}).'
- ');
+ '.&mt($item->{text}).' ');
+#
+# FIXME - put the help link back in when the help files exist
+# '.&mt($item->{text}).' '.
+# &Apache::loncommon::help_open_topic($item->{'help'}).'
+# ');
if (($action eq 'autoupdate') || ($action eq 'rolecolors')) {
my $colspan = ($action eq 'rolecolors')?' colspan="2"':'';
$r->print('
@@ -235,7 +280,7 @@ sub print_config_box {
');
- if ($action eq 'login') {
+ if (($action eq 'login') || ($action eq 'directorysrch')) {
$r->print('
'.$item->{'header'}->[0]->{'col1'}.' ');
} else {
@@ -251,7 +296,11 @@ 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));
+ } elsif ($action eq 'usercreation') {
+ $r->print(&print_usercreation($dom,$settings));
+ }
}
$r->print('
@@ -522,13 +571,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 .= ''.
''.$choices->{$img}.' ';
- my $imgfile;
+ my ($imgfile, $img_import);
if ($designs->{$img} ne '') {
$imgfile = $designs->{$img};
+ $img_import = ($imgfile =~ m{^/adm/});
} else {
$imgfile = $defaults->{$img};
}
@@ -550,6 +600,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 +610,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 +628,9 @@ sub display_color_options {
if (!$is_custom->{$img}) {
$datatable .= &mt('Default in use:').' ';
}
+ if ($img_import) {
+ $datatable.= ' ';
+ }
$datatable.= ' ';
@@ -694,21 +753,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 (ref($types) eq 'ARRAY') {
+ foreach my $type (@{$types}) {
if (defined($usertypes->{$type})) {
$typecount ++;
$css_class = $typecount%2?' class="LC_odd_row"':'';
@@ -720,7 +769,6 @@ sub print_quotas {
'" size="5" /> Mb ';
}
}
- $othertitle = "Other users";
}
my $defaultquota = '20';
if (ref($settings) eq 'HASH') {
@@ -731,18 +779,17 @@ sub print_quotas {
$typecount ++;
$css_class = $typecount%2?' class="LC_odd_row"':'';
$datatable .= ''.
- ''.&mt($othertitle).' '.
+ ''.$othertitle.' '.
''.
- ' Mb ';
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 +811,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 +827,7 @@ sub print_autoenroll {
' '.&mt('Yes').' '.
' '.&mt('No').' '.
+ $runoff.' value="0" />'.&mt('No').''.
' '.
''.&mt('Notification messages - sender').
' '.
@@ -822,34 +877,24 @@ sub print_autoupdate {
$classlistsoff.'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) {
- $datatable =
- &usertype_update_row($settings,$usertypes,\%fieldtitles,
- \@fields,\@types,\$numrows);
+ if (ref($types) eq 'ARRAY') {
+ if (@{$types} > 0) {
+ $datatable =
+ &usertype_update_row($settings,$usertypes,\%fieldtitles,
+ \@fields,$types,\$numrows);
+ }
}
$datatable .=
&usertype_update_row($settings,{'default' => $othertitle},
@@ -859,6 +904,280 @@ sub print_autoupdate {
return $datatable;
}
+sub print_directorysrch {
+ my ($dom,$settings) = @_;
+ my $srchon = ' ';
+ my $srchoff = ' checked="checked" ';
+ my ($exacton,$containson,$beginson);
+ 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 (ref($settings->{'searchtypes'}) eq 'ARRAY') {
+ foreach my $type (@{$settings->{'searchtypes'}}) {
+ if ($type eq 'exact') {
+ $exacton = ' checked="checked" ';
+ } elsif ($type eq 'contains') {
+ $containson = ' checked="checked" ';
+ } elsif ($type eq 'begins') {
+ $beginson = ' checked="checked" ';
+ }
+ }
+ } else {
+ if ($settings->{'searchtypes'} eq 'exact') {
+ $exacton = ' checked="checked" ';
+ } elsif ($settings->{'searchtypes'} eq 'contains') {
+ $containson = ' checked="checked" ';
+ } elsif ($settings->{'searchtypes'} eq 'specify') {
+ $exacton = ' checked="checked" ';
+ $containson = ' checked="checked" ';
+ }
+ }
+ }
+ my ($searchtitles,$titleorder) = &sorted_searchtitles();
+ my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
+
+ my $numinrow = 4;
+ my $cansrchrow = 0;
+ my $datatable=''.
+ ''.&mt('Directory search available?').' '.
+ ''.
+ ' '.&mt('Yes').' '.
+ ' '.&mt('No').' '.
+ ' '.
+ ''.&mt('Other domains can search?').' '.
+ ''.
+ ' '.&mt('Yes').' '.
+ ' '.&mt('No').' '.
+ ' ';
+ if (ref($usertypes) eq 'HASH') {
+ if (keys(%{$usertypes}) > 0) {
+ $datatable .= &users_cansearch_row($settings,$types,$usertypes,$dom,
+ $numinrow,$othertitle);
+ $cansrchrow = 1;
+ }
+ }
+ if ($cansrchrow) {
+ $datatable .= '';
+ } else {
+ $datatable .= ' ';
+ }
+ $datatable .= ''.&mt('Supported search methods').
+ ' ';
+ if ($cansrchrow) {
+ $datatable .= '';
+ } else {
+ $datatable .= ' ';
+ }
+ $datatable .= ''.&mt('Search latitude').' '.
+ ''.
+ ''.
+ ' '.&mt('Exact match').
+ ' '.
+ ' '.&mt('Begins with').
+ ' '.
+ ' '.&mt('Contains').
+ ' ';
+ return $datatable;
+}
+
+sub print_usercreation {
+ my ($dom,$settings) = @_;
+ my $numinrow = 4;
+ my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom);
+ my %checked;
+ if (ref($settings) eq 'HASH') {
+ if (ref($settings->{'cancreate'}) eq 'ARRAY') {
+ foreach my $item (@{$settings->{'cancreate'}}) {
+ $checked{$item} = ' checked="checked" ';
+ }
+ }
+ }
+ my $datatable = ''.&mt('User creation other than by DC: ').' '.
+ ' ';
+ if (ref($rules) eq 'HASH') {
+ if (keys(%{$rules}) > 0) {
+ $datatable .= &username_formats_row($settings,$rules,$ruleorder,
+ $numinrow);
+ }
+ }
+ return $datatable;
+}
+
+sub username_formats_row {
+ my ($settings,$rules,$ruleorder,$numinrow) = @_;
+ my $output = ''.
+ ''.&mt('Format rules to check for new usernames').
+ ' ';
+ return $output;
+}
+
+sub users_cansearch_row {
+ my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle) = @_;
+ my $output = ''.
+ ''.&mt('Users allowed to search').' ('.$dom.')'.
+ ' ';
+ return $output;
+}
+
+sub sorted_inst_types {
+ my ($dom) = @_;
+ my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
+ my $othertitle = &mt('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 sorted_searchtypes {
+ my %srchtypes_desc = (
+ exact => 'is exact match',
+ contains => 'contains ..',
+ begins => 'begins with ..',
+ );
+ my @srchtypeorder = ('exact','begins','contains');
+ return (\%srchtypes_desc,\@srchtypeorder);
+}
+
sub usertype_update_row {
my ($settings,$usertypes,$fieldtitles,$fields,$types,$rownums) = @_;
my $datatable;
@@ -1006,7 +1325,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;
@@ -1014,6 +1333,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');
@@ -1034,11 +1358,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) =
@@ -1046,16 +1379,16 @@ 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 publishing 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);
@@ -1073,6 +1406,7 @@ sub modify_colors {
$dom,$confname,$img,$width,$height);
if ($result eq 'ok') {
$confhash->{$role}{$img} = $logourl;
+ $changes{$role}{'images'}{$img} = 1;
}
}
}
@@ -1086,7 +1420,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};
@@ -1095,7 +1429,7 @@ sub modify_colors {
} else {
if ($env{'form.'.$role.'_del_'.$img}) {
$confhash->{$role}{$img} = '';
- $changes{$role}{$img} = 1;
+ $changes{$role}{'images'}{$img} = 1;
}
}
}
@@ -1157,7 +1491,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'}) {
@@ -1194,7 +1528,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 = ' ';
+ }
+ $resulttext .= ''.&mt("$choices{$item} set to [_1]",$newitem).' ';
}
}
if ($role ne 'login') {
@@ -1220,6 +1558,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);
@@ -1352,17 +1710,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";
+ }
+ }
}
}
}
@@ -1466,14 +1830,14 @@ sub check_switchserver {
sub modify_quotas {
my ($dom,%domconfig) = @_;
my ($resulttext,%changes);
- my ($usertypes,$order) =
- &Apache::lonnet::retrieve_inst_usertypes($dom);
+ my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
my %formhash;
foreach my $key (keys(%env)) {
if ($key =~ /^form\.quota_(.+)$/) {
$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})) {
@@ -1500,8 +1864,14 @@ sub modify_quotas {
if ($putresult eq 'ok') {
if (keys(%changes) > 0) {
$resulttext = &mt('Changes made:').'';
- foreach my $item (sort(keys(%changes))) {
- $resulttext .= ''.&mt('[_1] set to [_2] Mb',$usertypes->{$item},$formhash{$item}).' ';
+ foreach my $type (@{$types},'default') {
+ if (defined($changes{$type})) {
+ my $typetitle = $usertypes->{$type};
+ if ($type eq 'default') {
+ $typetitle = $othertitle;
+ }
+ $resulttext .= ''.&mt('[_1] set to [_2] Mb',$typetitle,$formhash{$type}).' ';
+ }
}
$resulttext .= ' ';
} else {
@@ -1527,10 +1897,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,
}
);
@@ -1543,21 +1920,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) {
@@ -1566,7 +1935,11 @@ 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 {
@@ -1592,10 +1965,10 @@ sub modify_autoupdate {
run => 'Auto-update:',
classlists => 'Updates to user information in classlists?'
);
- my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
+ my ($othertitle,$usertypes,$types) = &sorted_inst_types($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',
@@ -1603,7 +1976,7 @@ sub modify_autoupdate {
);
my $othertitle = &mt('All users');
if (keys(%{$usertypes}) > 0) {
- $othertitle = "Other users";
+ $othertitle = &mt('Other users');
}
foreach my $key (keys(%env)) {
if ($key =~ /^form\.updateable_(.+)_([^_]+)$/) {
@@ -1625,14 +1998,14 @@ sub modify_autoupdate {
}
} elsif ($key eq 'fields') {
if (ref($currautoupdate{$key}) eq 'HASH') {
- foreach my $item (keys(%{$currautoupdate{$key}})) {
+ foreach my $item (@{$types},'default') {
if (ref($currautoupdate{$key}{$item}) eq 'ARRAY') {
my $change = 0;
foreach my $type (@{$currautoupdate{$key}{$item}}) {
if (!exists($fields{$item})) {
$change = 1;
} elsif (ref($fields{$item}) eq 'ARRAY') {
- if (!grep/^\Q$type\E$/,@{$fields{$item}}) {
+ if (!grep(/^\Q$type\E$/,@{$fields{$item}})) {
$change = 1;
}
}
@@ -1640,18 +2013,20 @@ sub modify_autoupdate {
if ($change) {
push(@{$changes{$key}},$item);
}
- }
+ }
}
}
}
}
- foreach my $key (keys(%fields)) {
- if (ref($currautoupdate{'fields'}) eq 'HASH') {
- if (!exists($currautoupdate{'fields'}{$key})) {
- push(@{$changes{'fields'}},$key);
+ foreach my $item (@{$types},'default') {
+ if (defined($fields{$item})) {
+ if (ref($currautoupdate{'fields'}) eq 'HASH') {
+ if (!exists($currautoupdate{'fields'}{$item})) {
+ push(@{$changes{'fields'}},$item);
+ }
+ } else {
+ push(@{$changes{'fields'}},$item);
}
- } else {
- push(@{$changes{'fields'}},$key);
}
}
my $putresult = &Apache::lonnet::put_dom('configuration',\%updatehash,
@@ -1673,9 +2048,9 @@ sub modify_autoupdate {
$newvaluestr = &mt('none');
}
if ($item eq 'default') {
- $resulttext .= ''.&mt("Updates for $othertitle set to: [_1]",$newvaluestr).' ';
+ $resulttext .= ''.&mt("Updates for '[_1]' set to: '[_2]'",$othertitle,$newvaluestr).' ';
} else {
- $resulttext .= ''.&mt("Updates for [_1] set to: [_2]",$usertypes->{$item},$newvaluestr).' ';
+ $resulttext .= ''.&mt("Updates for '[_1]' set to: '[_2]'",$usertypes->{$item},$newvaluestr).' ';
}
}
} else {
@@ -1699,5 +2074,272 @@ sub modify_autoupdate {
return $resulttext;
}
-1;
+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',
+ localonly => 'Other domains can search',
+ searchby => 'Search types',
+ searchtypes => 'Search latitude');
+ my @offon = ('off','on');
+ my @otherdoms = ('Yes','No');
+
+ my @searchtypes = &Apache::loncommon::get_env_multiple('form.searchtypes');
+ my @cansearch = &Apache::loncommon::get_env_multiple('form.cansearch');
+ my @searchby = &Apache::loncommon::get_env_multiple('form.searchby');
+
+ my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
+ if (keys(%{$usertypes}) == 0) {
+ @cansearch = ('default');
+ } else {
+ 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);
+ }
+
+ if (ref($currdirsrch{'searchtypes'}) eq 'ARRAY') {
+ foreach my $type (@{$currdirsrch{'searchtypes'}}) {
+ if (!grep(/^\Q$type\E$/,@searchtypes)) {
+ push(@{$changes{'searchtypes'}},$type);
+ }
+ }
+ foreach my $type (@searchtypes) {
+ if (!grep(/^\Q$type\E$/,@{$currdirsrch{'searchtypes'}})) {
+ push(@{$changes{'searchtypes'}},$type);
+ }
+ }
+ } else {
+ if (exists($currdirsrch{'searchtypes'})) {
+ foreach my $type (@searchtypes) {
+ if ($type ne $currdirsrch{'searchtypes'}) {
+ push(@{$changes{'searchtypes'}},$type);
+ }
+ }
+ if (!grep(/^\Q$currdirsrch{'searchtypes'}\E/,@searchtypes)) {
+ push(@{$changes{'searchtypes'}},$currdirsrch{'searchtypes'});
+ }
+ } else {
+ push(@{$changes{'searchtypes'}},@searchtypes);
+ }
+ }
+
+ my %dirsrch_hash = (
+ directorysrch => { available => $env{'form.dirsrch_available'},
+ cansearch => \@cansearch,
+ localonly => $env{'form.dirsrch_localonly'},
+ searchby => \@searchby,
+ searchtypes => \@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 (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 $chgtext;
+ if (ref($usertypes) eq 'HASH') {
+ if (keys(%{$usertypes}) > 0) {
+ foreach my $type (@{$types}) {
+ if (grep(/^\Q$type\E$/,@cansearch)) {
+ $chgtext .= $usertypes->{$type}.'; ';
+ }
+ }
+ if (grep(/^default$/,@cansearch)) {
+ $chgtext .= $othertitle;
+ } else {
+ $chgtext =~ s/\; $//;
+ }
+ $resulttext .= ''.&mt("Users from domain '[_1] ' permitted to search the institutional directory 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 (ref($changes{'searchtypes'}) eq 'ARRAY') {
+ my ($srchtypes_desc,$srchtypeorder) = &sorted_searchtypes();
+ my $chgtext;
+ foreach my $type (@{$srchtypeorder}) {
+ if (grep(/^\Q$type\E$/,@searchtypes)) {
+ if (defined($srchtypes_desc->{$type})) {
+ $chgtext .= $srchtypes_desc->{$type}.'; ';
+ }
+ }
+ }
+ $chgtext =~ s/\; $//;
+ $resulttext .= ''.&mt("$title{'searchtypes'} set to: \"[_1]\"",$chgtext).' ';
+ }
+ $resulttext .= ' ';
+ } else {
+ $resulttext = &mt('No changes made to institution directory search settings');
+ }
+ } else {
+ $resulttext = ''.
+ &mt('An error occurred: [_1]',$putresult).' ';
+ }
+ return $resulttext;
+}
+
+sub modify_user_creation {
+ my ($dom,%domconfig) = @_;
+ my ($resulttext,%curr_usercreation,%changes);
+ if (ref($domconfig{'usercreation'}) eq 'HASH') {
+ foreach my $key (keys(%{$domconfig{'usercreation'}})) {
+ $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};
+ }
+ }
+ my %title = &Apache::lonlocal::texthash (
+ author => 'adding co-authors/assistant authors',
+ course => 'adding users to a course',
+ );
+ my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');
+ my @cancreate = &Apache::loncommon::get_env_multiple('form.can_createuser');
+ if (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {
+ foreach my $type (@{$curr_usercreation{'cancreate'}}) {
+ if (!grep(/^\Q$type\E$/,@cancreate)) {
+ push(@{$changes{'cancreate'}},$type);
+ }
+ }
+ foreach my $type (@cancreate) {
+ if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$type);
+ }
+ }
+ } else {
+ push(@{$changes{'cancreate'}},@cancreate);
+ }
+ if (ref($curr_usercreation{'username_rule'}) eq 'ARRAY') {
+ foreach my $type (@{$curr_usercreation{'username_rule'}}) {
+ if (!grep(/^\Q$type\E$/,@username_rule)) {
+ push(@{$changes{'username_rule'}},$type);
+ }
+ }
+ foreach my $type (@username_rule) {
+ if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'username_rule'}})) {
+ push(@{$changes{'username_rule'}},$type);
+ }
+ }
+ } else {
+ push(@{$changes{'username_rule'}},@username_rule);
+ }
+
+ my %usercreation_hash = (
+ usercreation => {
+ cancreate => \@cancreate,
+ username_rule => \@username_rule,
+ }
+ );
+
+ my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,
+ $dom);
+ if ($putresult eq 'ok') {
+ if (keys(%changes) > 0) {
+ $resulttext = &mt('Changes made:').'';
+ my $chgtext;
+ if (ref($changes{'cancreate'}) eq 'ARRAY') {
+ my $chgtext = '';
+ foreach my $type (@cancreate) {
+ $chgtext .= ''.$title{$type}.' ';
+ }
+ $chgtext .= ' ';
+ if (@cancreate > 0) {
+ $resulttext .= ''.&mt('Creation of new users is permitted by a Domain Coordinator, and also by other users when: ').$chgtext.' ';
+ } else {
+ $resulttext .= ''.&mt("Creation of new users is now only allowed when the user's role is Domain Coordinator.").' ';
+ }
+ }
+ if (ref($changes{'username_rule'}) eq 'ARRAY') {
+ my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom);
+ my $chgtext = '';
+ foreach my $type (@username_rule) {
+ if (ref($rules->{$type}) eq 'HASH') {
+ $chgtext .= ''.$rules->{$type}{'name'}.' ';
+ }
+ }
+ $chgtext .= ' ';
+ if (@username_rule > 0) {
+ $resulttext .= ''.&mt('Usernames with the following formats are restricted to verified users in the institutional directory: ').$chgtext.' ';
+ } else {
+ $resulttext .= ''.&mt('There are now no username formats currenty restricted to verified users in the institutional directory.').' ';
+ }
+ }
+ $resulttext .= ' ';
+ } else {
+ $resulttext = &mt('No changes made to log-in page settings');
+ }
+ } else {
+ $resulttext = ''.
+ &mt('An error occurred: [_1]',$putresult).' ';
+ }
+ return $resulttext;
+}
+
+1;