--- loncom/interface/domainprefs.pm 2016/10/25 12:54:25 1.160.6.75
+++ loncom/interface/domainprefs.pm 2017/01/24 00:19:15 1.160.6.78
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set domain-wide configuration settings
#
-# $Id: domainprefs.pm,v 1.160.6.75 2016/10/25 12:54:25 raeburn Exp $
+# $Id: domainprefs.pm,v 1.160.6.78 2017/01/24 00:19:15 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -19,7 +19,8 @@
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA#
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
@@ -314,10 +315,14 @@ sub handler {
modify => \&modify_directorysrch,
},
'contacts' =>
- { text => 'Contact Information',
+ { text => 'E-mail addresses and helpform',
help => 'Domain_Configuration_Contact_Info',
- header => [{col1 => 'Setting',
- col2 => 'Value',}],
+ header => [{col1 => 'Default e-mail addresses',
+ col2 => 'Value',},
+ {col1 => 'Recipient(s) for notifications',
+ col2 => 'Value',},
+ {col1 => 'Ask helpdesk form settings',
+ col2 => 'Value',},],
print => \&print_contacts,
modify => \&modify_contacts,
},
@@ -457,7 +462,7 @@ sub handler {
print => \&print_usersessions,
modify => \&modify_usersessions,
},
- 'loadbalancing' =>
+ 'loadbalancing' =>
{text => 'Dedicated Load Balancer(s)',
help => 'Domain_Configuration_Load_Balancing',
header => [{col1 => 'Balancers',
@@ -521,6 +526,9 @@ $javascript_validations
$coursebrowserjs
END
}
+ if (grep(/^contacts$/,@actions)) {
+ $js .= &contacts_javascript();
+ }
&Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);
} else {
# check if domconfig user exists for the domain.
@@ -632,7 +640,7 @@ sub process_changes {
} elsif ($action eq 'requestauthor') {
$output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);
} elsif ($action eq 'helpsettings') {
- $output = &modify_helpsettings($r,$dom,$confname,%domconfig);
+ $output = &modify_helpsettings($r,$dom,$confname,$lastactref,%domconfig);
} elsif ($action eq 'coursedefaults') {
$output = &modify_coursedefaults($dom,$lastactref,%domconfig);
} elsif ($action eq 'selfenrollment') {
@@ -705,7 +713,7 @@ sub print_config_box {
if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') ||
($action eq 'usermodification') || ($action eq 'defaults') || ($action eq 'coursedefaults') ||
($action eq 'selfenrollment') || ($action eq 'usersessions') || ($action eq 'directorysrch') ||
- ($action eq 'helpsettings')) {
+ ($action eq 'helpsettings') || ($action eq 'contacts')) {
$output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal);
} elsif ($action eq 'coursecategories') {
$output .= $item->{'print'}->('top',$dom,$item,$settings,\$rowtotal);
@@ -735,7 +743,8 @@ sub print_config_box {
$rowtotal ++;
if (($action eq 'autoupdate') || ($action eq 'usercreation') ||
($action eq 'selfcreation') || ($action eq 'selfenrollment') ||
- ($action eq 'usersessions') || ($action eq 'coursecategories')) {
+ ($action eq 'usersessions') || ($action eq 'coursecategories') ||
+ ($action eq 'contacts')) {
if ($action eq 'coursecategories') {
$output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal);
$colspan = ' colspan="2"';
@@ -919,8 +928,7 @@ sub print_config_box {
if ($action eq 'quotas') {
$output .= &print_quotas($dom,$settings,\$rowtotal,$action);
} elsif (($action eq 'autoenroll') || ($action eq 'autocreate') ||
- ($action eq 'contacts') || ($action eq 'serverstatuses') ||
- ($action eq 'loadbalancing')) {
+ ($action eq 'serverstatuses') || ($action eq 'loadbalancing')) {
$output .= $item->{'print'}->($dom,$settings,\$rowtotal);
} elsif ($action eq 'scantron') {
$output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
@@ -2783,107 +2791,259 @@ sub print_directorysrch {
}
sub print_contacts {
- my ($dom,$settings,$rowtotal) = @_;
+ my ($position,$dom,$settings,$rowtotal) = @_;
my $datatable;
my @contacts = ('adminemail','supportemail');
- my (%checked,%to,%otheremails,%bccemails);
- my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail',
- 'requestsmail','updatesmail','idconflictsmail');
- foreach my $type (@mailings) {
- $otheremails{$type} = '';
- }
- $bccemails{'helpdeskmail'} = '';
- if (ref($settings) eq 'HASH') {
- foreach my $item (@contacts) {
- if (exists($settings->{$item})) {
- $to{$item} = $settings->{$item};
+ my (%checked,%to,%otheremails,%bccemails,%includestr,%includeloc,%currfield,
+ $maxsize,$fields,$fieldtitles,$fieldoptions,$possoptions,@mailings);
+ if ($position eq 'top') {
+ if (ref($settings) eq 'HASH') {
+ foreach my $item (@contacts) {
+ if (exists($settings->{$item})) {
+ $to{$item} = $settings->{$item};
+ }
}
}
+ } elsif ($position eq 'middle') {
+ @mailings = ('errormail','packagesmail','lonstatusmail','requestsmail',
+ 'updatesmail','idconflictsmail');
foreach my $type (@mailings) {
- if (exists($settings->{$type})) {
- if (ref($settings->{$type}) eq 'HASH') {
- foreach my $item (@contacts) {
- if ($settings->{$type}{$item}) {
- $checked{$type}{$item} = ' checked="checked" ';
+ $otheremails{$type} = '';
+ }
+ } else {
+ @mailings = ('helpdeskmail','otherdomsmail');
+ foreach my $type (@mailings) {
+ $otheremails{$type} = '';
+ }
+ $bccemails{'helpdeskmail'} = '';
+ $bccemails{'otherdomsmail'} = '';
+ $includestr{'helpdeskmail'} = '';
+ $includestr{'otherdomsmail'} = '';
+ ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields();
+ }
+ if (ref($settings) eq 'HASH') {
+ unless ($position eq 'top') {
+ foreach my $type (@mailings) {
+ if (exists($settings->{$type})) {
+ if (ref($settings->{$type}) eq 'HASH') {
+ foreach my $item (@contacts) {
+ if ($settings->{$type}{$item}) {
+ $checked{$type}{$item} = ' checked="checked" ';
+ }
+ }
+ $otheremails{$type} = $settings->{$type}{'others'};
+ if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
+ $bccemails{$type} = $settings->{$type}{'bcc'};
+ if ($settings->{$type}{'include'} ne '') {
+ ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2);
+ $includestr{$type} = &unescape($includestr{$type});
+ }
}
}
- $otheremails{$type} = $settings->{$type}{'others'};
- if ($type eq 'helpdeskmail') {
- $bccemails{$type} = $settings->{$type}{'bcc'};
+ } elsif ($type eq 'lonstatusmail') {
+ $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';
+ }
+ }
+ }
+ if ($position eq 'bottom') {
+ foreach my $type (@mailings) {
+ $bccemails{$type} = $settings->{$type}{'bcc'};
+ if ($settings->{$type}{'include'} ne '') {
+ ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2);
+ $includestr{$type} = &unescape($includestr{$type});
+ }
+ }
+ if (ref($settings->{'helpform'}) eq 'HASH') {
+ if (ref($fields) eq 'ARRAY') {
+ foreach my $field (@{$fields}) {
+ $currfield{$field} = $settings->{'helpform'}{$field};
}
}
- } elsif ($type eq 'lonstatusmail') {
- $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';
+ if (exists($settings->{'helpform'}{'maxsize'})) {
+ $maxsize = $settings->{'helpform'}{'maxsize'};
+ } else {
+ $maxsize = '1.0';
+ }
+ } else {
+ if (ref($fields) eq 'ARRAY') {
+ foreach my $field (@{$fields}) {
+ $currfield{$field} = 'yes';
+ }
+ }
+ $maxsize = '1.0';
}
}
} else {
- $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'};
- $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'};
- $checked{'errormail'}{'adminemail'} = ' checked="checked" ';
- $checked{'packagesmail'}{'adminemail'} = ' checked="checked" ';
- $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';
- $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';
- $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';
- $checked{'updatesmail'}{'adminemail'} = ' checked="checked" ';
- $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" ';
+ if ($position eq 'top') {
+ $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'};
+ $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'};
+ $checked{'errormail'}{'adminemail'} = ' checked="checked" ';
+ $checked{'packagesmail'}{'adminemail'} = ' checked="checked" ';
+ $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';
+ $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';
+ $checked{'updatesmail'}{'adminemail'} = ' checked="checked" ';
+ $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" ';
+ } elsif ($position eq 'bottom') {
+ $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';
+ $checked{'otherdomsmail'}{'supportemail'} = ' checked="checked" ';
+ if (ref($fields) eq 'ARRAY') {
+ foreach my $field (@{$fields}) {
+ $currfield{$field} = 'yes';
+ }
+ }
+ $maxsize = '1.0';
+ }
}
my ($titles,$short_titles) = &contact_titles();
my $rownum = 0;
my $css_class;
- foreach my $item (@contacts) {
- $css_class = $rownum%2?' class="LC_odd_row"':'';
- $datatable .= '
'.
- ''.$titles->{$item}.
- ' '.
- ' ';
- $rownum ++;
+ if ($position eq 'top') {
+ foreach my $item (@contacts) {
+ $css_class = $rownum%2?' class="LC_odd_row"':'';
+ $datatable .= ''.
+ ''.$titles->{$item}.
+ ' '.
+ ' ';
+ $rownum ++;
+ }
+ } else {
+ foreach my $type (@mailings) {
+ $css_class = $rownum%2?' class="LC_odd_row"':'';
+ $datatable .= ''.
+ ''.
+ $titles->{$type}.': '.
+ '';
+ if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
+ $datatable .= ''.&mt('E-mail recipient(s)').' ';
+ }
+ $datatable .= '';
+ foreach my $item (@contacts) {
+ $datatable .= ''.
+ ' '.$short_titles->{$item}.
+ ' ';
+ }
+ $datatable .= ' '.&mt('Others').': '.
+ ' ';
+ my %locchecked;
+ if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
+ foreach my $loc ('s','b') {
+ if ($includeloc{$type} eq $loc) {
+ $locchecked{$loc} = ' checked="checked"';
+ last;
+ }
+ }
+ $datatable .= ' '.&mt('Bcc:').(' 'x6).
+ ' '.
+ ''.&mt('Optional added text').' '.
+ &mt('Text automatically added to e-mail:').' '.
+ ' '.
+ ''.&mt('Location:').' '.
+ ' '.&mt('in subject').' '.
+ (' 'x2).
+ ' '.&mt('in body').' '.
+ ' ';
+ }
+ $datatable .= ' '."\n";
+ $rownum ++;
+ }
}
- foreach my $type (@mailings) {
+ if ($position eq 'middle') {
+ my %choices;
+ $choices{'reporterrors'} = &mt('E-mail error reports to [_1]',
+ &Apache::loncommon::modal_link('http://loncapa.org/core.html',
+ &mt('LON-CAPA core group - MSU'),600,500));
+ $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]',
+ &Apache::loncommon::modal_link('http://loncapa.org/core.html',
+ &mt('LON-CAPA core group - MSU'),600,500));
+ my @toggles = ('reporterrors','reportupdates');
+ my %defaultchecked = ('reporterrors' => 'on',
+ 'reportupdates' => 'on');
+ (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
+ \%choices,$rownum);
+ $datatable .= $reports;
+ } elsif ($position eq 'bottom') {
$css_class = $rownum%2?' class="LC_odd_row"':'';
$datatable .= ''.
- ''.
- $titles->{$type}.': '.
- ''.
- '';
- foreach my $item (@contacts) {
- $datatable .= ''.
- ' '.$short_titles->{$item}.
- ' ';
- }
- $datatable .= ' '.&mt('Others').': '.
- ' ';
- if ($type eq 'helpdeskmail') {
- $datatable .= ' '.&mt('Bcc:').(' 'x6).
- ' ';
+ ' '.&mt('Extra helpdesk form fields:').' '.
+ &mt('(e-mail, subject, and description always shown)').
+ ' ';
+ if ((ref($fields) eq 'ARRAY') && (ref($fieldtitles) eq 'HASH') &&
+ (ref($fieldoptions) eq 'HASH') && (ref($possoptions) eq 'HASH')) {
+ $datatable .= '';
}
$datatable .= ' '."\n";
$rownum ++;
}
- my %choices;
- $choices{'reporterrors'} = &mt('E-mail error reports to [_1]',
- &Apache::loncommon::modal_link('http://loncapa.org/core.html',
- &mt('LON-CAPA core group - MSU'),600,500));
- $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]',
- &Apache::loncommon::modal_link('http://loncapa.org/core.html',
- &mt('LON-CAPA core group - MSU'),600,500));
- my @toggles = ('reporterrors','reportupdates');
- my %defaultchecked = ('reporterrors' => 'on',
- 'reportupdates' => 'on');
- (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
- \%choices,$rownum);
- $datatable .= $reports;
$$rowtotal += $rownum;
return $datatable;
}
+sub contacts_javascript {
+ return <<"ENDSCRIPT";
+
+
+
+ENDSCRIPT
+}
+
sub print_helpsettings {
my ($position,$dom,$settings,$rowtotal) = @_;
my $confname = $dom.'-domainconfig';
+ my $formname = 'display';
my ($datatable,$itemcount);
if ($position eq 'top') {
$itemcount = 1;
@@ -2899,20 +3059,69 @@ sub print_helpsettings {
} else {
my $css_class;
my %existing=&Apache::lonnet::dump('roles',$dom,$confname,'rolesdef_');
- my %customroles;
- foreach my $key (keys(%existing)) {
+ my (%customroles,%ordered,%current);
+ if (ref($settings->{'adhoc'}) eq 'HASH') {
+ %current = %{$settings->{'adhoc'}};
+ }
+ my $count = 0;
+ foreach my $key (sort(keys(%existing))) {
if ($key=~/^rolesdef\_(\w+)$/) {
my $rolename = $1;
- my %privs;
+ my (%privs,$order);
($privs{'system'},$privs{'domain'},$privs{'course'}) = split(/\_/,$existing{$key});
$customroles{$rolename} = \%privs;
+ if (ref($current{$rolename}) eq 'HASH') {
+ $order = $current{$rolename}{'order'};
+ }
+ if ($order eq '') {
+ $order = $count;
+ }
+ $ordered{$order} = $rolename;
+ $count++;
}
}
- my $count = 0;
+ my $maxnum = scalar(keys(%ordered));
+ my @roles_by_num = ();
+ foreach my $item (sort {$a <=> $b } (keys(%ordered))) {
+ push(@roles_by_num,$item);
+ }
my $context = 'domprefs';
my $crstype = 'Course';
- foreach my $role (sort(keys(%customroles))) {
- my $prefix = 'custhelp'.$count;
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+ my @accesstypes = ('all','none');
+ my ($numstatustypes,@jsarray);
+ if (ref($types) eq 'ARRAY') {
+ if (@{$types} > 0) {
+ $numstatustypes = scalar(@{$types});
+ push(@accesstypes,'status');
+ @jsarray = ('bystatus');
+ }
+ }
+ my %domhelpdesk = &Apache::lonnet::get_active_domroles($dom,['dh']);
+ if (keys(%domhelpdesk)) {
+ push(@accesstypes,('inc','exc'));
+ push(@jsarray,('notinc','notexc'));
+ }
+ my $hiddenstr = join("','",@jsarray);
+ $datatable .= &helpsettings_javascript(\@roles_by_num,$maxnum,$hiddenstr,$formname);
+ my $context = 'domprefs';
+ my $crstype = 'Course';
+ my $prefix = 'helproles_';
+ my $add_class = 'LC_hidden';
+ foreach my $num (@roles_by_num) {
+ my $role = $ordered{$num};
+ my ($desc,$access,@statuses);
+ if (ref($current{$role}) eq 'HASH') {
+ $desc = $current{$role}{'desc'};
+ $access = $current{$role}{'access'};
+ if (ref($current{$role}{'insttypes'}) eq 'ARRAY') {
+ @statuses = @{$current{$role}{'insttypes'}};
+ }
+ }
+ if ($desc eq '') {
+ $desc = $role;
+ }
+ my $identifier = 'custhelp'.$num;
my %full=();
my %levels= (
course => {},
@@ -2927,18 +3136,32 @@ sub print_helpsettings {
&Apache::lonuserutils::custom_role_privs($customroles{$role},\%full,\%levels,\%levelscurrent);
my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype);
$css_class = $itemcount%2?' class="LC_odd_row"':'';
- $datatable .= ''.
- ' '.
- ' '.
- &mt('Modify').' '.
- ''.&mt('Existing helpdesk role:').' '.
- ''.$role.' '.
- &Apache::lonuserutils::custom_role_header($context,$crstype,
- \@templateroles,$prefix).
+ my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$num."_pos'".');"';
+ $datatable .= ' '.$role.' '.
+ '';
+ for (my $k=0; $k<=$maxnum; $k++) {
+ my $vpos = $k+1;
+ my $selstr;
+ if ($k == $num) {
+ $selstr = ' selected="selected" ';
+ }
+ $datatable .= ''.$vpos.' ';
+ }
+ $datatable .= ' '.(' 'x2).
+ ' '.
+ ' '.
+ ''.&mt('Role name').' '.
+ &mt('Name shown to users:').
+ ' '.
+ ' '.
+ &helpdeskroles_access($dom,$prefix,$num,$add_class,$current{$role},\@accesstypes,
+ $othertitle,$usertypes,$types,\%domhelpdesk).
+ ''.
+ ''.&mt('Role privileges').&adhocbutton($prefix,$num,'privs','show').' '.
&Apache::lonuserutils::custom_role_table($crstype,\%full,\%levels,
- \%levelscurrent,$prefix).
- ' ';
- $count ++;
+ \%levelscurrent,$identifier,
+ 'LC_hidden',$prefix.$num.'_privs').
+ '';
$itemcount ++;
}
$css_class = $itemcount%2?' class="LC_odd_row"':'';
@@ -2952,25 +3175,250 @@ sub print_helpsettings {
);
&Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent);
my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype);
- $datatable .= ''.
+ my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$count."_pos'".');"';
+ $datatable .= ''.
+ ' '."\n".
+ '';
+ for (my $k=0; $k<$maxnum+1; $k++) {
+ my $vpos = $k+1;
+ my $selstr;
+ if ($k == $maxnum) {
+ $selstr = ' selected="selected" ';
+ }
+ $datatable .= ''.$vpos.' ';
+ }
+ $datatable .= ' '."\n".
' '. &mt('Add').
' '.
- ''.
- ''.&mt('Name of new helpdesk role:').' '.
- ' '.
- ' '.
+ ''.&mt('Role name').' '.
+ ''.
+ &mt('Internal name:').
+ ' '.
+ ' '.(' 'x4).
+ ''.
+ &mt('Name shown to users:').
+ ' '.
+ ' '.
+ &helpdeskroles_access($dom,$prefix,$count,'',undef,\@accesstypes,$othertitle,
+ $usertypes,$types,\%domhelpdesk).
+ ''.&mt('Role privileges').' '.
&Apache::lonuserutils::custom_role_header($context,$crstype,
\@templateroles,$newcust).
&Apache::lonuserutils::custom_role_table('Course',\%full,\%levels,
\%levelscurrent,$newcust).
- ' '.
- ' ';
+ ' ';
$count ++;
$$rowtotal += $count;
}
return $datatable;
}
+sub adhocbutton {
+ my ($prefix,$num,$field,$visibility) = @_;
+ my %lt = &Apache::lonlocal::texthash(
+ show => 'Show details',
+ hide => 'Hide details',
+ );
+ return ''.(' 'x10).
+ ' '.(' 'x2).' '.(' 'x2);
+}
+
+sub helpsettings_javascript {
+ my ($roles_by_num,$total,$hiddenstr,$formname) = @_;
+ return unless(ref($roles_by_num) eq 'ARRAY');
+ my %html_js_lt = &Apache::lonlocal::texthash(
+ show => 'Show details',
+ hide => 'Hide details',
+ );
+ &html_escape(\%html_js_lt);
+ my $jstext = ' var helproles = Array('."'".join("','",@{$roles_by_num})."'".');'."\n";
+ return <<"ENDSCRIPT";
+
+
+ENDSCRIPT
+}
+
+sub helpdeskroles_access {
+ my ($dom,$prefix,$num,$add_class,$current,$accesstypes,$othertitle,
+ $usertypes,$types,$domhelpdesk) = @_;
+ return unless ((ref($accesstypes) eq 'ARRAY') && (ref($domhelpdesk) eq 'HASH'));
+ my %lt = &Apache::lonlocal::texthash(
+ 'rou' => 'Role usage',
+ 'whi' => 'Which helpdesk personnel may use this role?',
+ 'all' => 'All',
+ 'none' => 'None',
+ 'status' => 'Determined based on institutional status',
+ 'inc' => 'Include all, but exclude specific personnel',
+ 'exc' => 'Exclude all, but include specific personnel',
+ );
+ my %usecheck = (
+ all => ' checked="checked"',
+ );
+ my %displaydiv = (
+ status => 'none',
+ inc => 'none',
+ exc => 'none',
+ priv => 'block',
+ );
+ my $output;
+ if (ref($current) eq 'HASH') {
+ if (($current->{'access'} ne '') && ($current->{'access'} ne 'all')) {
+ if (grep(/^\Q$current->{access}\E$/,@{$accesstypes})) {
+ $usecheck{$current->{access}} = $usecheck{'all'};
+ delete($usecheck{'all'});
+ if ($current->{access} =~ /^(status|inc|exc)$/) {
+ my $access = $1;
+ $displaydiv{$access} = 'inline';
+ } elsif ($current->{access} eq 'none') {
+ $displaydiv{'priv'} = 'none';
+ }
+ }
+ }
+ }
+ $output = ''.$lt{'rou'}.' '.
+ ''.$lt{'whi'}.'
';
+ foreach my $access (@{$accesstypes}) {
+ $output .= ' '.
+ $lt{$access}.' ';
+ if ($access eq 'status') {
+ $output .= '
'.
+ &Apache::lonuserutils::adhoc_status_types($dom,$prefix,$num,$current->{$access},
+ $othertitle,$usertypes,$types).
+ '
';
+ } elsif (($access eq 'inc') && (keys(%{$domhelpdesk}) > 0)) {
+ $output .= ''.
+ &Apache::lonuserutils::adhoc_staff($access,$prefix,$num,$current->{$access},$domhelpdesk).
+ '
';
+ } elsif (($access eq 'exc') && (keys(%{$domhelpdesk}) > 0)) {
+ $output .= ''.
+ &Apache::lonuserutils::adhoc_staff($access,$prefix,$num,$current->{$access},$domhelpdesk).
+ '
';
+ }
+ $output .= '';
+ }
+ $output .= ' ';
+ return $output;
+}
+
sub radiobutton_prefs {
my ($settings,$toggles,$defaultchecked,$choices,$itemcount,$onclick,
$additional,$align) = @_;
@@ -4019,6 +4467,9 @@ sub print_loadbalancing {
my ($numspares,@spares) = &count_servers($lonhost,%servers);
my @sparestypes = ('primary','default');
my %typetitles = &sparestype_titles();
+ my %hostherechecked = (
+ no => ' checked="checked"',
+ );
foreach my $sparetype (@sparestypes) {
my $targettable;
for (my $i=0; $i<$numspares; $i++) {
@@ -4064,6 +4515,23 @@ sub print_loadbalancing {
$datatable .= ''.$typetitles{$sparetype}.' '.
' ';
}
+ $hostherechecked{$sparetype} = '';
+ if (ref($currtargets{$lonhost}) eq 'HASH') {
+ if (ref($currtargets{$lonhost}{$sparetype}) eq 'ARRAY') {
+ if (grep(/^\Q$lonhost\E$/,@{$currtargets{$lonhost}{$sparetype}})) {
+ $hostherechecked{$sparetype} = ' checked="checked"';
+ $hostherechecked{'no'} = '';
+ }
+ }
+ }
+ }
+ $datatable .= &mt('Hosting on balancer itself').' '.
+ ' '.&mt('No').' ';
+ foreach my $sparetype (@sparestypes) {
+ $datatable .= ''.$typetitles{$sparetype}.
+ ' ';
}
$datatable .= ''.
&loadbalancing_rules($dom,$intdom,$currrules{$lonhost},
@@ -4281,14 +4749,15 @@ sub sparestype_titles {
sub contact_titles {
my %titles = &Apache::lonlocal::texthash (
- 'supportemail' => 'Support E-mail address',
- 'adminemail' => 'Default Server Admin E-mail address',
- 'errormail' => 'Error reports to be e-mailed to',
- 'packagesmail' => 'Package update alerts to be e-mailed to',
- 'helpdeskmail' => 'Helpdesk requests to be e-mailed to',
- 'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',
- 'requestsmail' => 'E-mail from course requests requiring approval',
- 'updatesmail' => 'E-mail from nightly check of LON-CAPA module integrity/updates',
+ 'supportemail' => 'Support E-mail address',
+ 'adminemail' => 'Default Server Admin E-mail address',
+ 'errormail' => 'Error reports to be e-mailed to',
+ 'packagesmail' => 'Package update alerts to be e-mailed to',
+ 'helpdeskmail' => "Helpdesk requests for this domain's users",
+ 'otherdomsmail' => 'Helpdesk requests for other (unconfigured) domains',
+ 'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',
+ 'requestsmail' => 'E-mail from course requests requiring approval',
+ 'updatesmail' => 'E-mail from nightly check of LON-CAPA module integrity/updates',
'idconflictsmail' => 'E-mail from bi-nightly check for multiple users sharing same student/employee ID',
);
my %short_titles = &Apache::lonlocal::texthash (
@@ -4298,6 +4767,34 @@ sub contact_titles {
return (\%titles,\%short_titles);
}
+sub helpform_fields {
+ my %titles = &Apache::lonlocal::texthash (
+ 'username' => 'Name',
+ 'user' => 'Username/domain',
+ 'phone' => 'Phone',
+ 'cc' => 'Cc e-mail',
+ 'course' => 'Course Details',
+ 'section' => 'Sections',
+ 'screenshot' => 'File upload',
+ );
+ my @fields = ('username','phone','user','course','section','cc','screenshot');
+ my %possoptions = (
+ username => ['yes','no','req'],
+ phone => ['yes','no','req'],
+ user => ['yes','no'],
+ cc => ['yes','no'],
+ course => ['yes','no'],
+ section => ['yes','no'],
+ screenshot => ['yes','no'],
+ );
+ my %fieldoptions = &Apache::lonlocal::texthash (
+ 'yes' => 'Optional',
+ 'req' => 'Required',
+ 'no' => "Not shown",
+ );
+ return (\@fields,\%titles,\%fieldoptions,\%possoptions);
+}
+
sub tool_titles {
my %titles = &Apache::lonlocal::texthash (
aboutme => 'Personal web page',
@@ -6305,7 +6802,6 @@ sub modify_login {
$errors .= ''.$puberror.' ';
if ((grep(/^\Q$lang\E$/,@currlangs)) &&
(!grep(/^\Q$lang\E$/,@delurls))) {
-
$loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};
}
}
@@ -6399,7 +6895,6 @@ sub modify_login {
$errors .= ''.$error.' ';
}
}
-
&process_captcha('login',\%changes,$loginhash{'login'},$domconfig{'login'});
my $defaulthelpfile = '/adm/loginproblems.html';
@@ -7635,7 +8130,7 @@ sub modify_quotas {
}
if ($env{'form.validationdc'}) {
my $newval = $env{'form.validationdc'};
- my %domcoords = &get_active_dcs($dom);
+ my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']);
if (exists($domcoords{$newval})) {
$confhash{'validation'}{'dc'} = $newval;
}
@@ -8371,7 +8866,7 @@ sub modify_autocreate {
$newvals{$item} = 0 if ($newvals{$item} eq '');
}
$newvals{'xmldc'} = $env{'form.autocreate_xmldc'};
- my %domcoords = &get_active_dcs($dom);
+ my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']);
unless (exists($domcoords{$newvals{'xmldc'}})) {
$newvals{'xmldc'} = '';
}
@@ -8533,9 +9028,9 @@ sub modify_directorysrch {
}
}
if (exists($currdirsrch{'lcavailable'})) {
- if ($currdirsrch{'lcavailable'} ne $env{'form.dirsrch_domavailable'}) {
- $changes{'lcavailable'} = 1;
- }
+ if ($currdirsrch{'lcavailable'} ne $env{'form.dirsrch_domavailable'}) {
+ $changes{'lcavailable'} = 1;
+ }
} else {
if ($env{'form.dirsrch_lcavailable'} eq '1') {
$changes{'lcavailable'} = 1;
@@ -8640,11 +9135,12 @@ sub modify_contacts {
$currsetting{$key} = $domconfig{'contacts'}{$key};
}
}
- my (%others,%to,%bcc);
+ my (%others,%to,%bcc,%includestr,%includeloc);
my @contacts = ('supportemail','adminemail');
- my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',
- 'requestsmail','updatesmail','idconflictsmail');
+ my @mailings = ('errormail','packagesmail','helpdeskmail','otherdomsmail',
+ 'lonstatusmail','requestsmail','updatesmail','idconflictsmail');
my @toggles = ('reporterrors','reportupdates');
+ my ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields();
foreach my $type (@mailings) {
@{$newsetting{$type}} =
&Apache::loncommon::get_env_multiple('form.'.$type);
@@ -8654,12 +9150,17 @@ sub modify_contacts {
} else {
$contacts_hash{contacts}{$type}{$item} = 0;
}
- }
+ }
$others{$type} = $env{'form.'.$type.'_others'};
$contacts_hash{contacts}{$type}{'others'} = $others{$type};
- if ($type eq 'helpdeskmail') {
+ if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
$bcc{$type} = $env{'form.'.$type.'_bcc'};
$contacts_hash{contacts}{$type}{'bcc'} = $bcc{$type};
+ if (($env{'form.'.$type.'_includestr'} ne '') && ($env{'form.'.$type.'_includeloc'} =~ /^s|b$/)) {
+ $includestr{$type} = $env{'form.'.$type.'_includestr'};
+ $includeloc{$type} = $env{'form.'.$type.'_includeloc'};
+ $contacts_hash{contacts}{$type}{'include'} = $includeloc{$type}.':'.&escape($includestr{$type});
+ }
}
}
foreach my $item (@contacts) {
@@ -8671,6 +9172,23 @@ sub modify_contacts {
$contacts_hash{'contacts'}{$item} = $env{'form.'.$item};
}
}
+ if ((ref($fields) eq 'ARRAY') && (ref($possoptions) eq 'HASH')) {
+ foreach my $field (@{$fields}) {
+ if (ref($possoptions->{$field}) eq 'ARRAY') {
+ my $value = $env{'form.helpform_'.$field};
+ $value =~ s/^\s+|\s+$//g;
+ if (grep(/^\Q$value\E$/,@{$possoptions->{$field}})) {
+ $contacts_hash{contacts}{'helpform'}{$field} = $value;
+ if ($field eq 'screenshot') {
+ $env{'form.helpform_maxsize'} =~ s/^\s+|\s+$//g;
+ if ($env{'form.helpform_maxsize'} =~ /^\d+\.?\d*$/) {
+ $contacts_hash{contacts}{'helpform'}{'maxsize'} = $env{'form.helpform_maxsize'};
+ }
+ }
+ }
+ }
+ }
+ }
if (keys(%currsetting) > 0) {
foreach my $item (@contacts) {
if ($to{$item} ne $currsetting{$item}) {
@@ -8690,10 +9208,39 @@ sub modify_contacts {
if ($others{$type} ne $currsetting{$type}{'others'}) {
push(@{$changes{$type}},'others');
}
- if ($type eq 'helpdeskmail') {
+ if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
if ($bcc{$type} ne $currsetting{$type}{'bcc'}) {
push(@{$changes{$type}},'bcc');
}
+ my ($currloc,$currstr) = split(/:/,$currsetting{$type}{'include'},2);
+ if (($includeloc{$type} ne $currloc) || (&escape($includestr{$type}) ne $currstr)) {
+ push(@{$changes{$type}},'include');
+ }
+ }
+ }
+ if (ref($fields) eq 'ARRAY') {
+ if (ref($currsetting{'helpform'}) eq 'HASH') {
+ foreach my $field (@{$fields}) {
+ if ($currsetting{'helpform'}{$field} ne $contacts_hash{'contacts'}{'helpform'}{$field}) {
+ push(@{$changes{'helpform'}},$field);
+ }
+ if (($field eq 'screenshot') && ($contacts_hash{'contacts'}{'helpform'}{'screenshot'} ne 'no')) {
+ if ($currsetting{'helpform'}{'maxsize'} ne $contacts_hash{'contacts'}{'helpform'}{'maxsize'}) {
+ push(@{$changes{'helpform'}},'maxsize');
+ }
+ }
+ }
+ } else {
+ foreach my $field (@{$fields}) {
+ if ($contacts_hash{'contacts'}{'helpform'}{$field} ne 'yes') {
+ push(@{$changes{'helpform'}},$field);
+ }
+ if (($field eq 'screenshot') && ($contacts_hash{'contacts'}{'helpform'}{'screenshot'} ne 'no')) {
+ if ($contacts_hash{'contacts'}{'helpform'}{'maxsize'} != 1) {
+ push(@{$changes{'helpform'}},'maxsize');
+ }
+ }
+ }
}
}
} else {
@@ -8703,26 +9250,41 @@ sub modify_contacts {
$default{'errormail'} = 'adminemail';
$default{'packagesmail'} = 'adminemail';
$default{'helpdeskmail'} = 'supportemail';
+ $default{'otherdomsmail'} = 'supportemail';
$default{'lonstatusmail'} = 'adminemail';
$default{'requestsmail'} = 'adminemail';
$default{'updatesmail'} = 'adminemail';
foreach my $item (@contacts) {
if ($to{$item} ne $default{$item}) {
- $changes{$item} = 1;
+ $changes{$item} = 1;
}
}
foreach my $type (@mailings) {
if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {
-
push(@{$changes{$type}},@{$newsetting{$type}});
}
if ($others{$type} ne '') {
push(@{$changes{$type}},'others');
}
- if ($type eq 'helpdeskmail') {
+ if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
if ($bcc{$type} ne '') {
push(@{$changes{$type}},'bcc');
}
+ if (($includeloc{$type} =~ /^b|s$/) && ($includestr{$type} ne '')) {
+ push(@{$changes{$type}},'include');
+ }
+ }
+ }
+ if (ref($fields) eq 'ARRAY') {
+ foreach my $field (@{$fields}) {
+ if ($contacts_hash{'contacts'}{'helpform'}{$field} ne 'yes') {
+ push(@{$changes{'helpform'}},$field);
+ }
+ if (($field eq 'screenshot') && ($contacts_hash{'contacts'}{'helpform'}{'screenshot'} ne 'no')) {
+ if ($contacts_hash{'contacts'}{'helpform'}{'maxsize'} != 1) {
+ push(@{$changes{'helpform'}},'maxsize');
+ }
+ }
}
}
}
@@ -8754,7 +9316,11 @@ sub modify_contacts {
}
foreach my $type (@mailings) {
if (ref($changes{$type}) eq 'ARRAY') {
- $resulttext .= ''.$titles->{$type}.': ';
+ if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
+ $resulttext .= ' '.$titles->{$type}.' -- '.&mt('sent to').': ';
+ } else {
+ $resulttext .= ' '.$titles->{$type}.': ';
+ }
my @text;
foreach my $item (@{$newsetting{$type}}) {
push(@text,$short_titles->{$item});
@@ -8762,12 +9328,31 @@ sub modify_contacts {
if ($others{$type} ne '') {
push(@text,$others{$type});
}
- $resulttext .= ''.
- join(', ',@text).' ';
- if ($type eq 'helpdeskmail') {
+ if (@text) {
+ $resulttext .= ''.
+ join(', ',@text).' ';
+ }
+ if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
if ($bcc{$type} ne '') {
- $resulttext .= ' '.&mt('with Bcc to').': '.$bcc{$type}.' ';
+ my $bcctext;
+ if (@text) {
+ $bcctext = ' '.&mt('with Bcc to');
+ } else {
+ $bcctext = '(Bcc)';
+ }
+ $resulttext .= $bcctext.': '.$bcc{$type}.' ';
+ } elsif (!@text) {
+ $resulttext .= &mt('No one');
+ }
+ if ($includestr{$type} ne '') {
+ if ($includeloc{$type} eq 'b') {
+ $resulttext .= ' '.&mt('Text automatically added to e-mail body:').' '.$includestr{$type};
+ } elsif ($includeloc{$type} eq 's') {
+ $resulttext .= ' '.&mt('Text automatically added to e-mail subject:').' '.$includestr{$type};
+ }
}
+ } elsif (!@text) {
+ $resulttext .= &mt('No recipients');
}
$resulttext .= ' ';
}
@@ -8789,9 +9374,50 @@ sub modify_contacts {
&mt('LON-CAPA core group - MSU'),600,500)).
'';
}
+ if ((ref($changes{'helpform'}) eq 'ARRAY') && (ref($fields) eq 'ARRAY')) {
+ my (@optional,@required,@unused,$maxsizechg);
+ foreach my $field (@{$changes{'helpform'}}) {
+ if ($field eq 'maxsize') {
+ $maxsizechg = 1;
+ next;
+ }
+ if ($contacts_hash{'contacts'}{'helpform'}{$field} eq 'yes') {
+ push(@optional,$field);
+ } elsif ($contacts_hash{'contacts'}{'helpform'}{$field} eq 'no') {
+ push(@unused,$field);
+ } elsif ($contacts_hash{'contacts'}{'helpform'}{$field} eq 'req') {
+ push(@required,$field);
+ }
+ }
+ if (@optional) {
+ $resulttext .= ''.
+ &mt('Help form fields changed to "Optional": [_1].',
+ ''.join(', ',map { $fieldtitles->{$_}; } @optional)).' '.
+ ' ';
+ }
+ if (@required) {
+ $resulttext .= ''.
+ &mt('Help form fields changed to "Required": [_1].',
+ ''.join(', ',map { $fieldtitles->{$_}; } @required)).' '.
+ ' ';
+ }
+ if (@unused) {
+ $resulttext .= ''.
+ &mt('Help form fields changed to "Not shown": [_1].',
+ ''.join(', ',map { $fieldtitles->{$_}; } @unused)).' '.
+ ' ';
+ }
+ if ($maxsizechg) {
+ $resulttext .= ''.
+ &mt('Max size for file uploaded to help form by logged-in user set to [_1] MB.',
+ $contacts_hash{'contacts'}{'helpform'}{'maxsize'}).
+ ' ';
+
+ }
+ }
$resulttext .= '';
} else {
- $resulttext = &mt('No changes made to contact information');
+ $resulttext = &mt('No changes made to contacts and form settings');
}
} else {
$resulttext = ''.
@@ -10527,15 +11153,18 @@ sub modify_serverstatuses {
}
sub modify_helpsettings {
- my ($r,$dom,$confname,%domconfig) = @_;
+ my ($r,$dom,$confname,$lastactref,%domconfig) = @_;
my ($resulttext,$errors,%changes,%helphash);
my %defaultchecked = ('submitbugs' => 'on');
my @offon = ('off','on');
my @toggles = ('submitbugs');
- my %current = ('submitbugs' => '');
+ my %current = ('submitbugs' => '',
+ 'adhoc' => {},
+ );
if (ref($domconfig{'helpsettings'}) eq 'HASH') {
%current = %{$domconfig{'helpsettings'}};
}
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
foreach my $item (@toggles) {
if ($defaultchecked{$item} eq 'on') {
if ($current{$item} eq '') {
@@ -10558,57 +11187,203 @@ sub modify_helpsettings {
$helphash{'helpsettings'}{$item} = $env{'form.'.$item};
}
}
-
- my @modify = &Apache::loncommon::get_env_multiple('form.modifycusthelp');
+ my $maxnum = $env{'form.helproles_maxnum'};
my $confname = $dom.'-domainconfig';
my %existing=&Apache::lonnet::dump('roles',$dom,$confname,'rolesdef_');
- if (@modify) {
- foreach my $num (@modify) {
- my $rolename = $env{'form.custhelprole'.$num};
- if ($rolename ne '') {
- if (exists($existing{'rolesdef_'.$rolename})) {
- my $prefix = 'custhelp'.$num;
- my %newprivs = &Apache::lonuserutils::custom_role_update($rolename,$prefix);
- my %currprivs;
- ($currprivs{'s'},$currprivs{'d'},$currprivs{'c'}) =
- split(/\_/,$existing{'rolesdef_'.$rolename});
- foreach my $level ('c','d','s') {
- if ($newprivs{$level} ne $currprivs{$level}) {
- $changes{'customrole'}{$rolename} = 1;
- my $result = &Apache::lonnet::definerole($rolename,$newprivs{'s'},$newprivs{'d'},
- $newprivs{'c'},$confname,$dom);
- last;
+ my (@allpos,%newsettings,%changedprivs,$newrole);
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+ my @accesstypes = ('all','none','status','inc','exc');
+ my %domhelpdesk = &Apache::lonnet::get_active_domroles($dom,['dh']);
+ my %lt = &Apache::lonlocal::texthash(
+ s => 'system',
+ d => 'domain',
+ order => 'Display order',
+ access => 'Role usage',
+ all => 'All',
+ none => 'None',
+ status => 'Determined based on institutional status',
+ inc => 'Include all, but exclude specific personnel',
+ exc => 'Exclude all, but include specific personnel',
+ );
+ for (my $num=0; $num<=$maxnum; $num++) {
+ my ($prefix,$identifier,$rolename,%curr);
+ if ($num == $maxnum) {
+ next unless ($env{'form.newcusthelp'} == $maxnum);
+ $identifier = 'custhelp'.$num;
+ $prefix = 'helproles_'.$num;
+ $rolename = $env{'form.custhelpname'.$num};
+ $rolename=~s/[^A-Za-z0-9]//gs;
+ next if ($rolename eq '');
+ next if (exists($existing{'rolesdef_'.$rolename}));
+ my %newprivs = &Apache::lonuserutils::custom_role_update($rolename,$identifier);
+ my $result = &Apache::lonnet::definerole($rolename,$newprivs{'s'},$newprivs{'d'},
+ $newprivs{'c'},$confname,$dom);
+ if ($result ne 'ok') {
+ $errors .= ''.
+ &mt('An error occurred storing the new custom role: [_1]',
+ $result).' ';
+ next;
+ } else {
+ $changedprivs{$rolename} = \%newprivs;
+ $newrole = $rolename;
+ }
+ } else {
+ $prefix = 'helproles_'.$num;
+ $rolename = $env{'form.'.$prefix};
+ next if ($rolename eq '');
+ next unless (exists($existing{'rolesdef_'.$rolename}));
+ $identifier = 'custhelp'.$num;
+ my %newprivs = &Apache::lonuserutils::custom_role_update($rolename,$identifier);
+ my %currprivs;
+ ($currprivs{'s'},$currprivs{'d'},$currprivs{'c'}) =
+ split(/\_/,$existing{'rolesdef_'.$rolename});
+ foreach my $level ('c','d','s') {
+ if ($newprivs{$level} ne $currprivs{$level}) {
+ my $result = &Apache::lonnet::definerole($rolename,$newprivs{'s'},$newprivs{'d'},
+ $newprivs{'c'},$confname,$dom);
+ if ($result ne 'ok') {
+ $errors .= ''.
+ &mt('An error occurred storing privileges for existing role [_1]: [_2]',
+ $rolename,$result).' ';
+ } else {
+ $changedprivs{$rolename} = \%newprivs;
+ }
+ last;
+ }
+ }
+ if (ref($current{'adhoc'}) eq 'HASH') {
+ if (ref($current{'adhoc'}{$rolename}) eq 'HASH') {
+ %curr = %{$current{'adhoc'}{$rolename}};
+ }
+ }
+ }
+ my $newpos = $env{'form.'.$prefix.'_pos'};
+ $newpos =~ s/\D+//g;
+ $allpos[$newpos] = $rolename;
+ my $newdesc = $env{'form.'.$prefix.'_desc'};
+ $helphash{'helpsettings'}{'adhoc'}{$rolename}{'desc'} = $newdesc;
+ if ($curr{'desc'}) {
+ if ($curr{'desc'} ne $newdesc) {
+ $changes{'customrole'}{$rolename}{'desc'} = 1;
+ $newsettings{$rolename}{'desc'} = $newdesc;
+ }
+ } elsif ($newdesc ne '') {
+ $changes{'customrole'}{$rolename}{'desc'} = 1;
+ $newsettings{$rolename}{'desc'} = $newdesc;
+ }
+ my $access = $env{'form.'.$prefix.'_access'};
+ if (grep(/^\Q$access\E$/,@accesstypes)) {
+ $helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'} = $access;
+ if ($access eq 'status') {
+ my @statuses = &Apache::loncommon::get_env_multiple('form.'.$prefix.'_status');
+ if (scalar(@statuses) == 0) {
+ $helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'} = 'none';
+ } else {
+ my (@shownstatus,$numtypes);
+ $helphash{'helpsettings'}{'adhoc'}{$rolename}{$access} = [];
+ if (ref($types) eq 'ARRAY') {
+ $numtypes = scalar(@{$types});
+ foreach my $type (sort(@statuses)) {
+ if ($type eq 'default') {
+ push(@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}},$type);
+ } elsif (grep(/^\Q$type\E$/,@{$types})) {
+ push(@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}},$type);
+ push(@shownstatus,$usertypes->{$type});
+ }
+ }
+ }
+ if (grep(/^default$/,@statuses)) {
+ push(@shownstatus,$othertitle);
+ }
+ if (scalar(@shownstatus) == 1+$numtypes) {
+ $helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'} = 'all';
+ delete($helphash{'helpsettings'}{'adhoc'}{$rolename}{'status'});
+ } else {
+ $newsettings{$rolename}{'status'} = join(' '.&mt('or').' ',@shownstatus);
+ if (ref($curr{'status'}) eq 'ARRAY') {
+ my @diffs = &Apache::loncommon::compare_arrays($helphash{'helpsettings'}{'adhoc'}{$rolename}{$access},$curr{$access});
+ if (@diffs) {
+ $changes{'customrole'}{$rolename}{$access} = 1;
+ }
+ } elsif (@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}}) {
+ $changes{'customrole'}{$rolename}{$access} = 1;
}
}
}
+ } elsif (($access eq 'inc') || ($access eq 'exc')) {
+ my @personnel = &Apache::loncommon::get_env_multiple('form.'.$prefix.'_staff_'.$access);
+ my @newspecstaff;
+ $helphash{'helpsettings'}{'adhoc'}{$rolename}{$access} = [];
+ foreach my $person (sort(@personnel)) {
+ if ($domhelpdesk{$person}) {
+ push(@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}},$person);
+ }
+ }
+ if (ref($curr{$access}) eq 'ARRAY') {
+ my @diffs = &Apache::loncommon::compare_arrays($helphash{'helpsettings'}{'adhoc'}{$rolename}{$access},$curr{$access});
+ if (@diffs) {
+ $changes{'customrole'}{$rolename}{$access} = 1;
+ }
+ } elsif (@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}}) {
+ $changes{'customrole'}{$rolename}{$access} = 1;
+ }
+ foreach my $person (@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}}) {
+ my ($uname,$udom) = split(/:/,$person);
+ push(@newspecstaff,&Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom,'lastname'),$uname,$udom));
+ }
+ $newsettings{$rolename}{$access} = join(', ',sort(@newspecstaff));
}
+ } else {
+ $helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'}= 'all';
+ }
+ unless ($curr{'access'} eq $access) {
+ $changes{'customrole'}{$rolename}{'access'} = 1;
+ $newsettings{$rolename}{'access'} = $lt{$helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'}};
}
}
- if ($env{'form.newcusthelp'} ne '') {
- my $prefix = 'custhelp'.$env{'form.newcusthelp'};
- my $rolename = $env{'form.newcusthelpname'};
- $rolename=~s/[^A-Za-z0-9]//gs;
- if ($rolename ne '') {
- unless(exists($existing{'rolesdef_'.$rolename})) {
- my %newprivs = &Apache::lonuserutils::custom_role_update($rolename,$prefix);
- my $result = &Apache::lonnet::definerole($rolename,$newprivs{'s'},$newprivs{'d'},
- $newprivs{'c'},$confname,$dom);
- if ($result eq 'ok') {
- $changes{'newcustomrole'} = $rolename;
- } else {
- $errors .= ''.
- &mt('An error occurred storing the new custom role: [_1]',
- $result).' ';
+ if (@allpos > 0) {
+ my $idx = 0;
+ foreach my $rolename (@allpos) {
+ if ($rolename ne '') {
+ $helphash{'helpsettings'}{'adhoc'}{$rolename}{'order'} = $idx;
+ if (ref($current{'adhoc'}) eq 'HASH') {
+ if (ref($current{'adhoc'}{$rolename}) eq 'HASH') {
+ if ($current{'adhoc'}{$rolename}{'order'} ne $idx) {
+ $changes{'customrole'}{$rolename}{'order'} = 1;
+ $newsettings{$rolename}{'order'} = $idx+1;
+ }
+ }
}
+ $idx ++;
}
}
}
-
my $putresult;
if (keys(%changes) > 0) {
$putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom);
if ($putresult eq 'ok') {
- $resulttext = &mt('Changes made:').'';
+ if (ref($helphash{'helpsettings'}) eq 'HASH') {
+ $domdefaults{'submitbugs'} = $helphash{'helpsettings'}{'submitbugs'};
+ if (ref($helphash{'helpsettings'}{'adhoc'}) eq 'HASH') {
+ $domdefaults{'adhocroles'} = $helphash{'helpsettings'}{'adhoc'};
+ }
+ }
+ my $cachetime = 24*60*60;
+ &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
+ if (ref($lastactref) eq 'HASH') {
+ $lastactref->{'domdefaults'} = 1;
+ }
+ } else {
+ $errors .= ''.
+ &mt('An error occurred storing the settings: [_1]',
+ $putresult).' ';
+ }
+ }
+ if ((keys(%changes) && ($putresult eq 'ok')) || (keys(%changedprivs))) {
+ $resulttext = &mt('Changes made:').'';
+ my (%shownprivs,@levelorder);
+ @levelorder = ('c','d','s');
+ if ((keys(%changes)) && ($putresult eq 'ok')) {
foreach my $item (sort(keys(%changes))) {
if ($item eq 'submitbugs') {
$resulttext .= ''.&mt('Display link to: [_1] set to "'.$offon[$env{'form.'.$item}].'".',
@@ -10616,27 +11391,86 @@ sub modify_helpsettings {
&mt('LON-CAPA bug tracker'),600,500)).' ';
} elsif ($item eq 'customrole') {
if (ref($changes{'customrole'}) eq 'HASH') {
+ my @keyorder = ('order','desc','access','status','exc','inc');
+ my %keytext = &Apache::lonlocal::texthash(
+ order => 'Order',
+ desc => 'Role description',
+ access => 'Role usage',
+ status => 'Allowed instituional types',
+ exc => 'Allowed personnel',
+ inc => 'Disallowed personnel',
+ );
foreach my $role (sort(keys(%{$changes{'customrole'}}))) {
- $resulttext .= ''.&mt('Existing custom role modified: [_1]',
- $role).' ';
+ if (ref($changes{'customrole'}{$role}) eq 'HASH') {
+ if ($role eq $newrole) {
+ $resulttext .= ''.&mt('New custom role added: [_1]',
+ $role).'';
+ } else {
+ $resulttext .= ''.&mt('Existing custom role modified: [_1]',
+ $role).'';
+ }
+ foreach my $key (@keyorder) {
+ if ($changes{'customrole'}{$role}{$key}) {
+ $resulttext .= ''.&mt("[_1] set to: [_2]",
+ $keytext{$key},$newsettings{$role}{$key}).
+ ' ';
+ }
+ }
+ if (ref($changedprivs{$role}) eq 'HASH') {
+ $shownprivs{$role} = 1;
+ $resulttext .= ''.&mt('Privileges set to :').'';
+ foreach my $level (@levelorder) {
+ foreach my $item (split(/\:/,$changedprivs{$role}{$level})) {
+ next if ($item eq '');
+ my ($priv) = split(/\&/,$item,2);
+ if (&Apache::lonnet::plaintext($priv)) {
+ $resulttext .= ''.&Apache::lonnet::plaintext($priv);
+ unless ($level eq 'c') {
+ $resulttext .= ' ('.$lt{$level}.')';
+ }
+ $resulttext .= ' ';
+ }
+ }
+ }
+ $resulttext .= ' ';
+ }
+ $resulttext .= ' ';
+ }
}
}
- } elsif ($item eq 'newcustomrole') {
- $resulttext .= ''.&mt('New custom role added: [_1]',
- $changes{'newcustomrole'}).' ';
}
}
- $resulttext .= ' ';
- } else {
- $resulttext = &mt('No changes made to help settings');
- $errors .= ' '.
- &mt('An error occurred storing the settings: [_1]',
- $putresult).' ';
}
+ if (keys(%changedprivs)) {
+ foreach my $role (sort(keys(%changedprivs))) {
+ unless ($shownprivs{$role}) {
+ $resulttext .= ''.&mt('Existing custom role modified: [_1]',
+ $role).''.
+ ''.&mt('Privileges set to :').'';
+ foreach my $level (@levelorder) {
+ foreach my $item (split(/\:/,$changedprivs{$role}{$level})) {
+ next if ($item eq '');
+ my ($priv) = split(/\&/,$item,2);
+ if (&Apache::lonnet::plaintext($priv)) {
+ $resulttext .= ''.&Apache::lonnet::plaintext($priv);
+ unless ($level eq 'c') {
+ $resulttext .= ' ('.$lt{$level}.')';
+ }
+ $resulttext .= ' ';
+ }
+ }
+ }
+ $resulttext .= ' ';
+ }
+ }
+ }
+ $resulttext .= ' ';
+ } else {
+ $resulttext = &mt('No changes made to help settings');
}
if ($errors) {
$resulttext .= ' '.&mt('The following errors occurred: ').'';
+ $errors.' ';
}
return $resulttext;
}
@@ -11632,8 +12466,13 @@ sub modify_loadbalancing {
push(@offloadto,$target);
}
}
- $defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype} = \@offloadto;
}
+ if ($env{'form.loadbalancing_target_'.$i.'_hosthere'} eq $sparetype) {
+ unless(grep(/^\Q$balancer\E$/,@offloadto)) {
+ push(@offloadto,$balancer);
+ }
+ }
+ $defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype} = \@offloadto;
}
if (ref($currtargets{$balancer}) eq 'HASH') {
foreach my $sparetype (@sparestypes) {
@@ -11867,24 +12706,9 @@ sub recurse_cat_deletes {
return;
}
-sub get_active_dcs {
- my ($dom) = @_;
- my $now = time;
- my %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc'],$now,$now);
- my %domcoords;
- my $numdcs = 0;
- foreach my $server (keys(%dompersonnel)) {
- foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
- my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);
- $domcoords{$uname.':'.$udom} = $dompersonnel{$server}{$user};
- }
- }
- return %domcoords;
-}
-
sub active_dc_picker {
my ($dom,$numinrow,$inputtype,$name,%currhash) = @_;
- my %domcoords = &get_active_dcs($dom);
+ my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']);
my @domcoord = keys(%domcoords);
if (keys(%currhash)) {
foreach my $dc (keys(%currhash)) {