'.
''.&mt('Mapping of Shibboleth environment variable names to user data fields (SSO auth)').' | '.
''."\n".
- ''."\n";
+ ''."\n";
for (my $i=0; $i<@fields; $i++) {
$rem = $i%($numperrow);
if ($rem == 0) {
@@ -5072,142 +5136,419 @@ sub print_selfcreation {
$$rowtotal ++;
} elsif ($position eq 'middle') {
my %domconf = &Apache::lonnet::get_dom('configuration',['usermodification'],$dom);
- my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
- $usertypes->{'default'} = $othertitle;
+ my @posstypes;
if (ref($types) eq 'ARRAY') {
- push(@{$types},'default');
- $usertypes->{'default'} = $othertitle;
- foreach my $status (@{$types}) {
- $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'},
- $numinrow,$$rowtotal,$usertypes);
- $$rowtotal ++;
- }
+ @posstypes = @{$types};
+ }
+ unless (grep(/^default$/,@posstypes)) {
+ push(@posstypes,'default');
+ }
+ my %usertypeshash;
+ if (ref($usertypes) eq 'HASH') {
+ %usertypeshash = %{$usertypes};
+ }
+ $usertypeshash{'default'} = $othertitle;
+ foreach my $status (@posstypes) {
+ $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'},
+ $numinrow,$$rowtotal,\%usertypeshash);
+ $$rowtotal ++;
}
} else {
my %choices = &Apache::lonlocal::texthash (
- cancreate_email => 'E-mail address as username',
+ 'cancreate_email' => 'Non-institutional username (via e-mail verification)',
);
my @toggles = sort(keys(%choices));
my %defaultchecked = (
'cancreate_email' => 'off',
);
- my $itemcount = 0;
+ my $customclass = 'LC_selfcreate_email';
+ my $classprefix = 'LC_canmodify_emailusername_';
+ my $optionsprefix = 'LC_options_emailusername_';
my $display = 'none';
+ my $rowstyle = 'display:none';
if (grep(/^\Qemail\E$/,@selfcreate)) {
$display = 'block';
+ $rowstyle = 'display:table-row';
}
- my $onclick = "toggleDisplay(this.form,'emailoptions');";
- my $additional = '';
+ my $onclick = "toggleRows(this.form,'cancreate_email','selfassign','$customclass','$classprefix','$optionsprefix');";
+ ($datatable,$$rowtotal) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,
+ \%choices,$$rowtotal,$onclick);
+ $datatable .= &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal,$customclass,
+ $rowstyle);
+ $$rowtotal ++;
+ $datatable .= &captcha_choice('cancreate',$createsettings,$$rowtotal,$customclass,
+ $rowstyle);
+ $$rowtotal ++;
+ my (@ordered,@posstypes,%usertypeshash);
my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
- my $usertypes = {};
- my $order = [];
- if ((ref($domdefaults{'inststatustypes'}) eq 'HASH') && (ref($domdefaults{'inststatusguest'}) eq 'ARRAY')) {
- $usertypes = $domdefaults{'inststatustypes'};
- $order = $domdefaults{'inststatusguest'};
- }
- if (ref($order) eq 'ARRAY') {
- push(@{$order},'default');
- if (@{$order} > 1) {
- $usertypes->{'default'} = &mt('Other users');
- $additional .= ' ';
- foreach my $status (@{$order}) {
- $additional .= ''.$usertypes->{$status}.' | ';
- }
- $additional .= ' ';
- foreach my $status (@{$order}) {
- $additional .= ''.&email_as_username($rowtotal,$processing,$status).' | ';
+ my ($emailrules,$emailruleorder) =
+ &Apache::lonnet::inst_userrules($dom,'email');
+ my $primary_id = &Apache::lonnet::domain($dom,'primary');
+ my $intdom = &Apache::lonnet::internet_dom($primary_id);
+ if (ref($types) eq 'ARRAY') {
+ @posstypes = @{$types};
+ }
+ if (@posstypes) {
+ unless (grep(/^default$/,@posstypes)) {
+ push(@posstypes,'default');
+ }
+ if (ref($usertypes) eq 'HASH') {
+ %usertypeshash = %{$usertypes};
+ }
+ my $currassign;
+ if (ref($domdefaults{'inststatusguest'}) eq 'ARRAY') {
+ $currassign = {
+ selfassign => $domdefaults{'inststatusguest'},
+ };
+ @ordered = @{$domdefaults{'inststatusguest'}};
+ } else {
+ $currassign = { selfassign => [] };
+ }
+ my $onclicktypes = "toggleDataRow(this.form,'selfassign','$customclass','$optionsprefix',);".
+ "toggleDataRow(this.form,'selfassign','$customclass','$classprefix',1);";
+ $datatable .= &insttypes_row($currassign,$types,$usertypes,$dom,
+ $numinrow,$othertitle,'selfassign',
+ $rowtotal,$onclicktypes,$customclass,
+ $rowstyle);
+ $$rowtotal ++;
+ $usertypeshash{'default'} = $othertitle;
+ foreach my $status (@posstypes) {
+ my $css_class;
+ if ($$rowtotal%2) {
+ $css_class = 'LC_odd_row ';
+ }
+ $css_class .= $customclass;
+ my $rowid = $optionsprefix.$status;
+ my $hidden = 1;
+ my $currstyle = 'display:none';
+ if (grep(/^\Q$status\E$/,@ordered)) {
+ $currstyle = $rowstyle;
+ $hidden = 0;
+ }
+ $datatable .= &noninst_users($processing,$emailverified,$emailoptions,$emaildomain,
+ $emailrules,$emailruleorder,$settings,$status,$rowid,
+ $usertypeshash{$status},$css_class,$currstyle,$intdom);
+ unless ($hidden) {
+ $$rowtotal ++;
}
- $additional .= '
';
- } else {
- $usertypes->{'default'} = &mt('All users');
- $additional .= &email_as_username($rowtotal,$processing);
}
+ } else {
+ my $css_class;
+ if ($$rowtotal%2) {
+ $css_class = 'LC_odd_row ';
+ }
+ $css_class .= $customclass;
+ $usertypeshash{'default'} = $othertitle;
+ $datatable .= &noninst_users($processing,$emailverified,$emailoptions,$emaildomain,
+ $emailrules,$emailruleorder,$settings,'default','',
+ $othertitle,$css_class,$rowstyle,$intdom);
+ $$rowtotal ++;
}
- $additional .= ' '."\n";
-
- ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,
- \%choices,$$rowtotal,$onclick,$additional);
- $$rowtotal ++;
- $datatable .= &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal);
- $$rowtotal ++;
my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
$numinrow = 1;
- if (ref($order) eq 'ARRAY') {
- foreach my $status (@{$order}) {
+ if (@posstypes) {
+ foreach my $status (@posstypes) {
+ my $rowid = $classprefix.$status;
+ my $datarowstyle = 'display:none';
+ if (grep(/^\Q$status\E$/,@ordered)) {
+ $datarowstyle = $rowstyle;
+ }
$datatable .= &modifiable_userdata_row('cancreate','emailusername_'.$status,$settings,
- $numinrow,$$rowtotal,$usertypes,$infofields,$infotitles);
- $$rowtotal ++;
+ $numinrow,$$rowtotal,\%usertypeshash,$infofields,
+ $infotitles,$rowid,$customclass,$datarowstyle);
+ unless ($datarowstyle eq 'display:none') {
+ $$rowtotal ++;
+ }
}
+ } else {
+ $datatable .= &modifiable_userdata_row('cancreate','emailusername_default',$settings,
+ $numinrow,$$rowtotal,\%usertypeshash,$infofields,
+ $infotitles,'',$customclass,$rowstyle);
}
- my ($emailrules,$emailruleorder) =
- &Apache::lonnet::inst_userrules($dom,'email');
- if (ref($emailrules) eq 'HASH') {
- if (keys(%{$emailrules}) > 0) {
- $datatable .= &user_formats_row('email',$settings,$emailrules,
- $emailruleorder,$numinrow,$$rowtotal);
- $$rowtotal ++;
+ }
+ return $datatable;
+}
+
+sub selfcreate_javascript {
+ return <<"ENDSCRIPT";
+
+
+
+ENDSCRIPT
+}
+
+sub noninst_users {
+ my ($processing,$emailverified,$emailoptions,$emaildomain,$emailrules,
+ $emailruleorder,$settings,$type,$rowid,$typetitle,$css_class,$rowstyle,$intdom) = @_;
+ my $class = 'LC_left_item';
+ if ($css_class) {
+ $css_class = ' class="'.$css_class.'"';
+ }
+ if ($rowid) {
+ $rowid = ' id="'.$rowid.'"';
+ }
+ if ($rowstyle) {
+ $rowstyle = ' style="'.$rowstyle.'"';
+ }
+ my ($output,$description);
+ if ($type eq 'default') {
+ $description = &mt('Requests for: [_1]',$typetitle);
+ } else {
+ $description = &mt('Requests for: [_1] (status self-reported)',$typetitle);
+ }
+ $output = ''.
+ "$description | \n".
+ ''.
+ '';
+ my %headers = &Apache::lonlocal::texthash(
+ approve => 'Processing',
+ email => 'E-mail',
+ username => 'Username',
+ );
+ foreach my $item ('approve','email','username') {
+ $output .= ''.$headers{$item}.' | ';
+ }
+ $output .= ' ';
+ foreach my $item ('approve','email','username') {
+ $output .= '';
+ my (%choices,@options,$hashref,$defoption,$name,$onclick,$hascustom);
+ if ($item eq 'approve') {
+ %choices = &Apache::lonlocal::texthash (
+ automatic => 'Automatically approved',
+ approval => 'Queued for approval',
+ );
+ @options = ('automatic','approval');
+ $hashref = $processing;
+ $defoption = 'automatic';
+ $name = 'cancreate_emailprocess_'.$type;
+ } elsif ($item eq 'email') {
+ %choices = &Apache::lonlocal::texthash (
+ any => 'Any e-mail',
+ inst => 'Institutional only',
+ noninst => 'Non-institutional only',
+ custom => 'Custom restrictions',
+ );
+ @options = ('any','inst','noninst');
+ my $showcustom;
+ if (ref($emailrules) eq 'HASH') {
+ if (keys(%{$emailrules}) > 0) {
+ push(@options,'custom');
+ $showcustom = 'cancreate_emailrule';
+ if (ref($settings) eq 'HASH') {
+ if (ref($settings->{'email_rule'}) eq 'ARRAY') {
+ foreach my $rule (@{$settings->{'email_rule'}}) {
+ if (exists($emailrules->{$rule})) {
+ $hascustom ++;
+ }
+ }
+ } elsif (ref($settings->{'email_rule'}) eq 'HASH') {
+ if (ref($settings->{'email_rule'}{$type}) eq 'ARRAY') {
+ foreach my $rule (@{$settings->{'email_rule'}{$type}}) {
+ if (exists($emailrules->{$rule})) {
+ $hascustom ++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ $onclick = ' onclick="toggleEmailOptions(this.form,'."'cancreate_emailoptions','$showcustom',".
+ "'cancreate_emaildomain','$type'".');"';
+ $hashref = $emailoptions;
+ $defoption = 'any';
+ $name = 'cancreate_emailoptions_'.$type;
+ } elsif ($item eq 'username') {
+ %choices = &Apache::lonlocal::texthash (
+ all => 'Same as e-mail',
+ first => 'Omit @domain',
+ free => 'Free to choose',
+ );
+ @options = ('all','first','free');
+ $hashref = $emailverified;
+ $defoption = 'all';
+ $name = 'cancreate_usernameoptions_'.$type;
+ }
+ foreach my $option (@options) {
+ my $checked;
+ if (ref($hashref) eq 'HASH') {
+ if ($type eq '') {
+ if (!exists($hashref->{'default'})) {
+ if ($option eq $defoption) {
+ $checked = ' checked="checked"';
+ }
+ } else {
+ if ($hashref->{'default'} eq $option) {
+ $checked = ' checked="checked"';
+ }
}
} else {
- if ($processing->{$type} eq $option) {
- $checked = ' checked="checked"';
+ if (!exists($hashref->{$type})) {
+ if ($option eq $defoption) {
+ $checked = ' checked="checked"';
+ }
+ } else {
+ if ($hashref->{$type} eq $option) {
+ $checked = ' checked="checked"';
+ }
}
}
+ } elsif (($item eq 'email') && ($hascustom)) {
+ if ($option eq 'custom') {
+ $checked = ' checked="checked"';
+ }
+ } elsif ($option eq $defoption) {
+ $checked = ' checked="checked"';
+ }
+ $output .= ' ';
+ if ($item eq 'email') {
+ if ($option eq 'custom') {
+ my $id = 'cancreate_emailrule_'.$type;
+ my $display = 'none';
+ if ($checked) {
+ $display = 'inline';
+ }
+ my $numinrow = 2;
+ $output .= '';
+ } elsif (($option eq 'inst') || ($option eq 'noninst')) {
+ my %text = &Apache::lonlocal::texthash (
+ inst => 'must end:',
+ noninst => 'cannot end:',
+ );
+ my $value;
+ if (ref($emaildomain) eq 'HASH') {
+ if (ref($emaildomain->{$type}) eq 'HASH') {
+ $value = $emaildomain->{$type}->{$option};
+ }
+ }
+ if ($value eq '') {
+ $value = '@'.$intdom;
+ }
+ my $condition = 'cancreate_emaildomain_'.$option.'_'.$type;
+ my $display = 'none';
+ if ($checked) {
+ $display = 'inline';
+ }
+ $output .= ''.
+ ''.$text{$option}.' '.
+ ''.
+ ' ';
+ }
}
- } elsif ($option eq 'automatic') {
- $checked = ' checked="checked"';
- }
- my $name = 'cancreate_emailprocess';
- if (($type ne '') && ($type ne 'default')) {
- $name .= '_'.$type;
- }
- $output .= '';
- if ($type eq '') {
- $output .= ' ';
- } else {
- $output .= ' ';
}
+ $output .= ' | '."\n";
}
- $$rowtotal ++;
+ }
+ $output .= "
| \n";
return $output;
}
sub captcha_choice {
- my ($context,$settings,$itemcount) = @_;
+ my ($context,$settings,$itemcount,$customcss,$rowstyle) = @_;
my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext,
$vertext,$currver);
my %lt = &captcha_phrases();
@@ -5240,7 +5581,20 @@ sub captcha_choice {
} else {
$checked{'original'} = ' checked="checked"';
}
- my $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ my $css_class;
+ if ($itemcount%2) {
+ $css_class = 'LC_odd_row';
+ }
+ if ($customcss) {
+ $css_class .= " $customcss";
+ }
+ $css_class =~ s/^\s+//;
+ if ($css_class) {
+ $css_class = ' class="'.$css_class.'"';
+ }
+ if ($rowstyle) {
+ $css_class .= ' style="'.$rowstyle.'"';
+ }
my $output = ''.
''.$rowname.' | '."\n".
''."\n";
@@ -5259,7 +5613,7 @@ sub captcha_choice {
# specified for use with the key should be broad enough to accommodate all servers in the LON-CAPA domain.
#
$output .= ' | '."\n".
- ''."\n".
+ ' | '."\n".
''.$pubtext.' '."\n".
' '."\n".
@@ -5275,23 +5629,19 @@ sub captcha_choice {
}
sub user_formats_row {
- my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_;
+ my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount,$status) = @_;
my $output;
my %text = (
'username' => 'new usernames',
'id' => 'IDs',
- 'email' => 'self-created accounts (e-mail)',
);
- my $css_class = $rowcount%2?' class="LC_odd_row"':'';
- $output = ' | '.
- '';
- if ($type eq 'email') {
- $output .= &mt("Formats disallowed for $text{$type}: ");
- } else {
- $output .= &mt("Format rules to check for $text{$type}: ");
+ unless ($type eq 'email') {
+ my $css_class = $rowcount%2?' class="LC_odd_row"':'';
+ $output = ''.
+ ''.
+ &mt("Format rules to check for $text{$type}: ").
+ ' | ';
}
- $output .= ''.
- ' | ';
+ $output .= ' ';
+ unless ($type eq 'email') {
+ $output .= ' | ';
+ }
return $output;
}
@@ -5523,7 +5889,7 @@ sub print_defaults {
1 => 'Yes, allow login then update passwd file using default cost (if higher)',
2 => 'Yes, disallow login if stored cost is less than domain default',
);
- $datatable .= '';
+ $datatable .= '';
foreach my $option (@options) {
my $checked = ' ';
my $onclick;
@@ -5549,17 +5915,12 @@ sub print_defaults {
} else {
my %defaults;
if (ref($settings) eq 'HASH') {
- if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH') &&
- (ref($settings->{'inststatusguest'}) eq 'ARRAY')) {
+ if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) {
my $maxnum = @{$settings->{'inststatusorder'}};
for (my $i=0; $i<$maxnum; $i++) {
$css_class = $rownum%2?' class="LC_odd_row"':'';
my $item = $settings->{'inststatusorder'}->[$i];
my $title = $settings->{'inststatustypes'}->{$item};
- my $guestok;
- if (grep(/^\Q$item\E$/,@{$settings->{'inststatusguest'}})) {
- $guestok = 1;
- }
my $chgstr = ' onchange="javascript:reorderTypes(this.form,'."'$item'".');"';
$datatable .= ''.
''.
@@ -5572,23 +5933,12 @@ sub print_defaults {
}
$datatable .= '';
}
- my ($checkedon,$checkedoff);
- $checkedoff = ' checked="checked"';
- if ($guestok) {
- $checkedon = $checkedoff;
- $checkedoff = '';
- }
$datatable .= ' '.&mt('Internal ID:').' '.$item.' '.
''.
&mt('delete').' | '.
''.&mt('Name displayed:').
''.
- ' | '.
- ''.
- ''.(' 'x2).
- ' | ';
+ '';
}
$css_class = $rownum%2?' class="LC_odd_row"':'';
my $chgstr = ' onchange="javascript:reorderTypes(this.form,'."'addinststatus_pos'".');"';
@@ -5608,11 +5958,6 @@ sub print_defaults {
''.
&mt('Name displayed:').
' | '.
- ''.
- ''.(' 'x2).
- ' | ';
''."\n";
$rownum ++;
}
@@ -5874,7 +6219,7 @@ sub print_coursecategories {
''.$lt{$type}.' ';
}
- $datatable .= '';
+ $datatable .= '';
$itemcount ++;
}
$$rowtotal += $itemcount;
@@ -6085,7 +6430,7 @@ sub print_coursecategories {
$datatable .= &initialize_categories($itemcount);
}
} else {
- $datatable .= ''.$hdritem->{'header'}->[1]->{'col2'}.' | '
+ $datatable .= ''.$hdritem->{'header'}->[1]->{'col2'}.' | '
.&initialize_categories($itemcount);
}
$$rowtotal += $itemcount;
@@ -6133,7 +6478,7 @@ sub print_serverstatuses {
''.
''.
- ''."\n";
+ ''."\n";
}
$$rowtotal += $rownum;
return $datatable;
@@ -6358,7 +6703,7 @@ sub initialize_categories {
my $select1 = '';
foreach my $default ('instcode','communities') {
$css_class = $itemcount%2?' class="LC_odd_row"':'';
- $chgstr = ' onchange="javascript:reorderCats(this.form,'."'',$default"."_pos','0'".');"';
+ $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','$default"."_pos','0'".');"';
if ($default eq 'communities') {
$select1 = $select0;
$select0 = '';
@@ -6383,8 +6728,9 @@ sub initialize_categories {
.''
.''
.' '
- .&mt('Add category').''.&mt('Name:')
- .' | ';
+ .&mt('Add category').'>'.&mt('Name:')
+ .' '
+ .'';
return $datatable;
}
@@ -6439,7 +6785,7 @@ sub build_category_rows {
pop(@{$path});
}
} else {
- $text .= &mt('Add subcategory:').' '.&mt('Add subcategory:').'';
+ $text .= ''.&mt('Add subcategory:').' | ';
}
}
}
@@ -6471,13 +6817,14 @@ sub build_category_rows {
}
sub modifiable_userdata_row {
- my ($context,$item,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref) = @_;
+ my ($context,$item,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref,
+ $rowid,$customcss,$rowstyle) = @_;
my ($role,$rolename,$statustype);
$role = $item;
if ($context eq 'cancreate') {
- if ($item =~ /^emailusername_(.+)$/) {
- $statustype = $1;
- $role = 'emailusername';
+ if ($item =~ /^(emailusername)_(.+)$/) {
+ $role = $1;
+ $statustype = $2;
if (ref($usertypes) eq 'HASH') {
if ($usertypes->{$statustype}) {
$rolename = &mt('Data provided by [_1]',$usertypes->{$statustype});
@@ -6512,8 +6859,25 @@ sub modifiable_userdata_row {
%fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
}
my $output;
- my $css_class = $rowcount%2?' class="LC_odd_row"':'';
- $output = ''.
+ my $css_class;
+ if ($rowcount%2) {
+ $css_class = 'LC_odd_row';
+ }
+ if ($customcss) {
+ $css_class .= " $customcss";
+ }
+ $css_class =~ s/^\s+//;
+ if ($css_class) {
+ $css_class = ' class="'.$css_class.'"';
+ }
+ if ($rowstyle) {
+ $css_class .= ' style="'.$rowstyle.'"';
+ }
+ if ($rowid) {
+ $rowid = ' id="'.$rowid.'"';
+ }
+
+ $output = ' '.
''.$rolename.' | '.
'';
my $rem;
@@ -6547,9 +6911,10 @@ sub modifiable_userdata_row {
}
}
}
-
- for (my $i=0; $i<@fields; $i++) {
- my $rem = $i%($numinrow);
+
+ my $total = scalar(@fields);
+ for (my $i=0; $i<$total; $i++) {
+ $rem = $i%($numinrow);
if ($rem == 0) {
if ($i > 0) {
$output .= '';
@@ -6591,10 +6956,13 @@ sub modifiable_userdata_row {
'';
}
$output .= '';
- $rem = @fields%($numinrow);
}
- my $colsleft = $numinrow - $rem;
- if ($colsleft > 1 ) {
+ $rem = $total%$numinrow;
+ my $colsleft;
+ if ($rem) {
+ $colsleft = $numinrow - $rem;
+ }
+ if ($colsleft > 1) {
$output .= ''.
' | ';
} elsif ($colsleft == 1) {
@@ -6605,11 +6973,13 @@ sub modifiable_userdata_row {
}
sub insttypes_row {
- my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context,$rownum) = @_;
+ my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context,$rowtotal,$onclick,
+ $customcss,$rowstyle) = @_;
my %lt = &Apache::lonlocal::texthash (
cansearch => 'Users allowed to search',
statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',
lockablenames => 'User preference to lock name',
+ selfassign => 'Self-reportable affiliations',
);
my $showdom;
if ($context eq 'cansearch') {
@@ -6619,9 +6989,22 @@ sub insttypes_row {
if ($context eq 'statustocreate') {
$class = 'LC_right_item';
}
- my $css_class = ' class="LC_odd_row"';
- if ($rownum ne '') {
- $css_class = ($rownum%2? ' class="LC_odd_row"':'');
+ my $css_class;
+ if ($$rowtotal%2) {
+ $css_class = 'LC_odd_row';
+ }
+ if ($customcss) {
+ $css_class .= ' '.$customcss;
+ }
+ $css_class =~ s/^\s+//;
+ if ($css_class) {
+ $css_class = ' class="'.$css_class.'"';
+ }
+ if ($rowstyle) {
+ $css_class .= ' style="'.$rowstyle.'"';
+ }
+ if ($onclick) {
+ $onclick = 'onclick="'.$onclick.'" ';
}
my $output = ''.
''.$lt{$context}.$showdom.
@@ -6650,14 +7033,14 @@ sub insttypes_row {
$output .= ' | '.
' | ';
}
}
$rem = @{$types}%($numinrow);
}
my $colsleft = $numinrow - $rem;
- if (($rem == 0) && (@{$types} > 0)) {
+ if ($rem == 0) {
$output .= ' ';
}
if ($colsleft > 1) {
@@ -6677,7 +7060,7 @@ sub insttypes_row {
}
$output .= ''.
' | ';
return $output;
@@ -7713,14 +8096,14 @@ sub publishlogo {
} else {
my $source = $filepath.'/'.$file;
my $logfile;
- if (!open($logfile,">>$source".'.log')) {
+ if (!open($logfile,">>",$source.'.log')) {
return (&mt('No write permission to Authoring Space'));
}
print $logfile
"\n================= Publish ".localtime()." ================\n".
$env{'user.name'}.':'.$env{'user.domain'}."\n";
# Save the file
- if (!open(FH,'>'.$source)) {
+ if (!open(FH,">",$source)) {
&Apache::lonnet::logthis('Failed to create '.$source);
return (&mt('Failed to create file'));
}
@@ -7781,7 +8164,8 @@ $env{'user.name'}.':'.$env{'user.domain'
if ($fullwidth ne '' && $fullheight ne '') {
if ($fullwidth > $thumbwidth && $fullheight > $thumbheight) {
my $thumbsize = $thumbwidth.'x'.$thumbheight;
- system("convert -sample $thumbsize $inputfile $outfile");
+ my @args = ('convert','-sample',$thumbsize,$inputfile,$outfile);
+ system({$args[0]} @args);
chmod(0660, $filepath.'/tn-'.$file);
if (-e $outfile) {
my $copyfile=$targetdir.'/tn-'.$file;
@@ -7860,7 +8244,7 @@ sub write_metadata {
{
print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;
my $mfh;
- if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {
+ if (open($mfh,">",$targetdir.'/'.$file.'.meta')) {
foreach (sort(keys(%metadatafields))) {
unless ($_=~/\./) {
my $unikey=$_;
@@ -7894,7 +8278,7 @@ sub notifysubscribed {
next unless (ref($targetsource) eq 'ARRAY');
my ($target,$source)=@{$targetsource};
if ($source ne '') {
- if (open(my $logfh,'>>'.$source.'.log')) {
+ if (open(my $logfh,">>",$source.'.log')) {
print $logfh "\nCleanup phase: Notifications\n";
my @subscribed=&subscribed_hosts($target);
foreach my $subhost (@subscribed) {
@@ -7920,7 +8304,7 @@ sub notifysubscribed {
sub subscribed_hosts {
my ($target) = @_;
my @subscribed;
- if (open(my $fh,"<$target.subscription")) {
+ if (open(my $fh,"<","$target.subscription")) {
while (my $subline=<$fh>) {
if ($subline =~ /^($match_lonid):/) {
my $host = $1;
@@ -8119,16 +8503,20 @@ sub modify_quotas {
#FIXME need to obsolete item in RES space
} elsif ($env{'form.'.$type.'_image_'.$i.'.filename'}) {
my ($cdom,$cnum) = split(/_/,$key);
- my ($imgurl,$error) = &process_textbook_image($r,$dom,$confname,$type.'_image_'.$i,
- $cdom,$cnum,$type,$configuserok,
- $switchserver,$author_ok);
- if ($imgurl) {
- $confhash{$type}{$key}{'image'} = $imgurl;
- $changes{$type}{$key} = 1;
- }
- if ($error) {
- &Apache::lonnet::logthis($error);
- $errors .= ''.$error.'';
+ if (&Apache::lonnet::homeserver($cnum,$cdom) eq 'no_host') {
+ $errors .= ''.&mt('Image not saved: could not find textbook course').'';
+ } else {
+ my ($imgurl,$error) = &process_textbook_image($r,$dom,$confname,$type.'_image_'.$i,
+ $cdom,$cnum,$type,$configuserok,
+ $switchserver,$author_ok);
+ if ($imgurl) {
+ $confhash{$type}{$key}{'image'} = $imgurl;
+ $changes{$type}{$key} = 1;
+ }
+ if ($error) {
+ &Apache::lonnet::logthis($error);
+ $errors .= ''.$error.'';
+ }
}
} elsif ($domconfig{$action}{$type}{$key}{'image'}) {
$confhash{$type}{$key}{'image'} =
@@ -8162,15 +8550,19 @@ sub modify_quotas {
if ($type eq 'textbooks') {
if ($env{'form.'.$type.'_addbook_image.filename'} ne '') {
my ($cdom,$cnum) = split(/_/,$newbook{$type});
- my ($imageurl,$error) =
- &process_textbook_image($r,$dom,$confname,$type.'_addbook_image',$cdom,$cnum,$type,
- $configuserok,$switchserver,$author_ok);
- if ($imageurl) {
- $confhash{$type}{$newbook{$type}}{'image'} = $imageurl;
- }
- if ($error) {
- &Apache::lonnet::logthis($error);
- $errors .= ''.$error.'';
+ if (&Apache::lonnet::homeserver($cnum,$cdom) eq 'no_host') {
+ $errors .= ''.&mt('Image not saved: could not find textbook course').'';
+ } else {
+ my ($imageurl,$error) =
+ &process_textbook_image($r,$dom,$confname,$type.'_addbook_image',$cdom,$cnum,$type,
+ $configuserok,$switchserver,$author_ok);
+ if ($imageurl) {
+ $confhash{$type}{$newbook{$type}}{'image'} = $imageurl;
+ }
+ if ($error) {
+ &Apache::lonnet::logthis($error);
+ $errors .= ''.$error.'';
+ }
}
}
}
@@ -8662,7 +9054,7 @@ sub process_textbook_image {
} elsif ($author_ok eq 'ok') {
my ($result,$imageurl) =
&publishlogo($r,'upload',$caller,$dom,$confname,
- "$type/$dom/$cnum/cover",$width,$height);
+ "$type/$cdom/$cnum/cover",$width,$height);
if ($result eq 'ok') {
$url = $imageurl;
} else {
@@ -8762,9 +9154,9 @@ sub modify_autoenroll {
}
if ($changes{'autofailsafe'}) {
if ($failsafe ne '') {
- $resulttext .= ''.&mt("$title{'failsafe'} set to [_1]",$failsafe).'';
+ $resulttext .= ''.&mt('Failsafe for no drops if institutional data missing for a section set to: [_1]',$failsafe).'';
} else {
- $resulttext .= ''.&mt("$title{'failsafe'} deleted");
+ $resulttext .= ''.&mt('Failsafe for no drops if institutional data missing for a section: deleted');
}
&Apache::lonnet::get_domain_defaults($dom,1);
if (ref($lastactref) eq 'HASH') {
@@ -9043,7 +9435,7 @@ sub modify_autocreate {
}
sub modify_directorysrch {
- my ($dom,%domconfig) = @_;
+ my ($dom,$lastactref,%domconfig) = @_;
my ($resulttext,%changes);
my %currdirsrch;
if (ref($domconfig{'directorysrch'}) eq 'HASH') {
@@ -9237,6 +9629,10 @@ sub modify_directorysrch {
$resulttext .= ''.&mt($title{'searchtypes'}.' set to: "[_1]"',$chgtext).'';
}
$resulttext .= '';
+ &Apache::lonnet::do_cache_new('directorysrch',$dom,$dirsrch_hash{'directorysrch'},3600);
+ if (ref($lastactref) eq 'HASH') {
+ $lastactref->{'directorysrch'} = 1;
+ }
} else {
$resulttext = &mt('No changes made to directory search settings');
}
@@ -9258,7 +9654,7 @@ sub modify_contacts {
my (%others,%to,%bcc,%includestr,%includeloc);
my @contacts = ('supportemail','adminemail');
my @mailings = ('errormail','packagesmail','helpdeskmail','otherdomsmail',
- 'lonstatusmail','requestsmail','updatesmail','idconflictsmail');
+ 'lonstatusmail','requestsmail','updatesmail','idconflictsmail',hostipmail');
my @toggles = ('reporterrors','reportupdates');
my ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields();
foreach my $type (@mailings) {
@@ -9374,6 +9770,7 @@ sub modify_contacts {
$default{'lonstatusmail'} = 'adminemail';
$default{'requestsmail'} = 'adminemail';
$default{'updatesmail'} = 'adminemail';
+ $default{'hostipmail'} = 'adminemail';
foreach my $item (@contacts) {
if ($to{$item} ne $default{$item}) {
$changes{$item} = 1;
@@ -9555,12 +9952,10 @@ sub modify_usercreation {
if ($key eq 'cancreate') {
if (ref($domconfig{'usercreation'}{$key}) eq 'HASH') {
foreach my $item (keys(%{$domconfig{'usercreation'}{$key}})) {
- if (($item eq 'selfcreate') || ($item eq 'statustocreate') ||
- ($item eq 'captcha') || ($item eq 'recaptchakeys') ||
- ($item eq 'recaptchaversion')) {
- $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
- } else {
+ if (($item eq 'requestcrs') || ($item eq 'course') || ($item eq 'author')) {
$curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
+ } else {
+ $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
}
}
}
@@ -9763,14 +10158,18 @@ sub modify_usercreation {
}
sub modify_selfcreation {
- my ($dom,%domconfig) = @_;
- my ($resulttext,$warningmsg,%curr_usercreation,%curr_usermodify,%changes,%cancreate);
- my (%save_usercreate,%save_usermodify);
- my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
- if (ref($types) eq 'ARRAY') {
- $usertypes->{'default'} = $othertitle;
- push(@{$types},'default');
+ my ($dom,$lastactref,%domconfig) = @_;
+ my ($resulttext,$warningmsg,%curr_usercreation,%curr_usermodify,%curr_inststatus,%changes,%cancreate);
+ my (%save_usercreate,%save_usermodify,%save_inststatus,@types,%usertypes);
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
+ my ($othertitle,$usertypesref,$typesref) = &Apache::loncommon::sorted_inst_types($dom);
+ if (ref($typesref) eq 'ARRAY') {
+ @types = @{$typesref};
+ }
+ if (ref($usertypesref) eq 'HASH') {
+ %usertypes = %{$usertypesref};
}
+ $usertypes{'default'} = $othertitle;
#
# Retrieve current domain configuration for self-creation of usernames from $domconfig{'usercreation'}.
#
@@ -9780,10 +10179,11 @@ sub modify_selfcreation {
if (ref($domconfig{'usercreation'}{$key}) eq 'HASH') {
foreach my $item (keys(%{$domconfig{'usercreation'}{$key}})) {
if (($item eq 'selfcreate') || ($item eq 'statustocreate') ||
- ($item eq 'captcha') || ($item eq 'recaptchakeys') ||
- ($item eq 'recaptchaversion') ||
- ($item eq 'emailusername') || ($item eq 'notify') ||
- ($item eq 'selfcreateprocessing') || ($item eq 'shibenv')) {
+ ($item eq 'captcha') || ($item eq 'recaptchakeys') ||
+ ($item eq 'recaptchaversion') || ($item eq 'notify') ||
+ ($item eq 'emailusername') || ($item eq 'shibenv') ||
+ ($item eq 'selfcreateprocessing') || ($item eq 'emailverified') ||
+ ($item eq 'emailoptions') || ($item eq 'emaildomain')) {
$curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
} else {
$save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
@@ -9809,41 +10209,161 @@ sub modify_selfcreation {
}
}
}
+#
+# Retrieve current domain configuration for institutional status types from $domconfig{'inststatus'}.
+#
+ if (ref($domconfig{'inststatus'}) eq 'HASH') {
+ foreach my $key (keys(%{$domconfig{'inststatus'}})) {
+ if ($key eq 'inststatusguest') {
+ $curr_inststatus{$key} = $domconfig{'inststatus'}{$key};
+ } else {
+ $save_inststatus{$key} = $domconfig{'inststatus'}{$key};
+ }
+ }
+ }
my @contexts = ('selfcreate');
@{$cancreate{'selfcreate'}} = ();
%{$cancreate{'emailusername'}} = ();
- @{$cancreate{'statustocreate'}} = ();
+ if (@types) {
+ @{$cancreate{'statustocreate'}} = ();
+ }
%{$cancreate{'selfcreateprocessing'}} = ();
%{$cancreate{'shibenv'}} = ();
+ %{$cancreate{'emailverified'}} = ();
+ %{$cancreate{'emailoptions'}} = ();
+ %{$cancreate{'emaildomain'}} = ();
my %selfcreatetypes = (
sso => 'users authenticated by institutional single sign on',
login => 'users authenticated by institutional log-in',
- email => 'users who provide a valid e-mail address for use as username',
+ email => 'users verified by e-mail',
);
#
# Populate $cancreate{'selfcreate'} array reference with types of user, for which self-creation of user accounts
# is permitted.
#
- my @statuses;
- if (ref($domconfig{'inststatus'}) eq 'HASH') {
- if (ref($domconfig{'inststatus'}{'inststatusguest'}) eq 'ARRAY') {
- @statuses = @{$domconfig{'inststatus'}{'inststatusguest'}};
- }
- }
- push(@statuses,'default');
+ my ($emailrules,$emailruleorder) = &Apache::lonnet::inst_userrules($dom,'email');
+ my (@statuses,%email_rule);
foreach my $item ('login','sso','email') {
if ($item eq 'email') {
if ($env{'form.cancreate_email'}) {
- push(@{$cancreate{'selfcreate'}},'email');
- push(@contexts,'selfcreateprocessing');
- foreach my $type (@statuses) {
- if ($type eq 'default') {
- $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess'};
- } else {
- $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess_'.$type};
+ if (@types) {
+ my @poss_statuses = &Apache::loncommon::get_env_multiple('form.selfassign');
+ foreach my $status (@poss_statuses) {
+ if (grep(/^\Q$status\E$/,(@types,'default'))) {
+ push(@statuses,$status);
+ }
+ }
+ $save_inststatus{'inststatusguest'} = \@statuses;
+ } else {
+ push(@statuses,'default');
+ }
+ if (@statuses) {
+ my %curr_rule;
+ if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') {
+ foreach my $type (@statuses) {
+ $curr_rule{$type} = $curr_usercreation{'email_rule'};
+ }
+ } elsif (ref($curr_usercreation{'email_rule'}) eq 'HASH') {
+ foreach my $type (@statuses) {
+ $curr_rule{$type} = $curr_usercreation{'email_rule'}{$type};
+ }
+ }
+ push(@{$cancreate{'selfcreate'}},'email');
+ push(@contexts,('selfcreateprocessing','emailverified','emailoptions'));
+ my %curremaildom;
+ if (ref($curr_usercreation{'cancreate'}{'emaildomain'}) eq 'HASH') {
+ %curremaildom = %{$curr_usercreation{'cancreate'}{'emaildomain'}};
+ }
+ foreach my $type (@statuses) {
+ if ($env{'form.cancreate_emailprocess_'.$type} =~ /^(?:approval|automatic)$/) {
+ $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess_'.$type};
+ }
+ if ($env{'form.cancreate_usernameoptions_'.$type} =~ /^(?:all|first|free)$/) {
+ $cancreate{'emailverified'}{$type} = $env{'form.cancreate_usernameoptions_'.$type};
+ }
+ if ($env{'form.cancreate_emailoptions_'.$type} =~ /^(any|inst|noninst|custom)$/) {
+#
+# Retrieve rules (if any) governing types of e-mail address which may be used to verify a username.
+#
+ my $chosen = $1;
+ if (($chosen eq 'inst') || ($chosen eq 'noninst')) {
+ my $emaildom;
+ if ($env{'form.cancreate_emaildomain_'.$chosen.'_'.$type} =~ /^\@[^\@]+$/) {
+ $emaildom = $env{'form.cancreate_emaildomain_'.$chosen.'_'.$type};
+ $cancreate{'emaildomain'}{$type}{$chosen} = $emaildom;
+ if (ref($curremaildom{$type}) eq 'HASH') {
+ if (exists($curremaildom{$type}{$chosen})) {
+ if ($curremaildom{$type}{$chosen} ne $emaildom) {
+ push(@{$changes{'cancreate'}},'emaildomain');
+ }
+ } elsif ($emaildom ne '') {
+ push(@{$changes{'cancreate'}},'emaildomain');
+ }
+ } elsif ($emaildom ne '') {
+ push(@{$changes{'cancreate'}},'emaildomain');
+ }
+ }
+ $cancreate{'emailoptions'}{$type} = $env{'form.cancreate_emailoptions_'.$type};
+ } elsif ($chosen eq 'custom') {
+ my @possemail_rules = &Apache::loncommon::get_env_multiple('form.email_rule_'.$type);
+ $email_rule{$type} = [];
+ if (ref($emailrules) eq 'HASH') {
+ foreach my $rule (@possemail_rules) {
+ if (exists($emailrules->{$rule})) {
+ push(@{$email_rule{$type}},$rule);
+ }
+ }
+ }
+ if (@{$email_rule{$type}}) {
+ $cancreate{'emailoptions'}{$type} = 'custom';
+ if (ref($curr_rule{$type}) eq 'ARRAY') {
+ if (@{$curr_rule{$type}} > 0) {
+ foreach my $rule (@{$curr_rule{$type}}) {
+ if (!grep(/^\Q$rule\E$/,@{$email_rule{$type}})) {
+ push(@{$changes{'email_rule'}},$type);
+ }
+ }
+ }
+ foreach my $type (@{$email_rule{$type}}) {
+ if (!grep(/^\Q$type\E$/,@{$curr_rule{$type}})) {
+ push(@{$changes{'email_rule'}},$type);
+ }
+ }
+ } else {
+ push(@{$changes{'email_rule'}},$type);
+ }
+ }
+ } else {
+ $cancreate{'emailoptions'}{$type} = $env{'form.cancreate_emailoptions_'.$type};
+ }
+ }
+ }
+ if (@types) {
+ if (ref($curr_inststatus{'inststatusguest'}) eq 'ARRAY') {
+ my @changed = &Apache::loncommon::compare_arrays(\@statuses,$curr_inststatus{'inststatusguest'});
+ if (@changed) {
+ push(@{$changes{'inststatus'}},'inststatusguest');
+ }
+ } else {
+ push(@{$changes{'inststatus'}},'inststatusguest');
+ }
+ }
+ } else {
+ delete($env{'form.cancreate_email'});
+ if (ref($curr_inststatus{'inststatusguest'}) eq 'ARRAY') {
+ if (@{$curr_inststatus{'inststatusguest'}} > 0) {
+ push(@{$changes{'inststatus'}},'inststatusguest');
+ }
+ }
+ }
+ } else {
+ $save_inststatus{'inststatusguest'} = [];
+ if (ref($curr_inststatus{'inststatusguest'}) eq 'ARRAY') {
+ if (@{$curr_inststatus{'inststatusguest'}} > 0) {
+ push(@{$changes{'inststatus'}},'inststatusguest');
}
}
}
@@ -9853,7 +10373,7 @@ sub modify_selfcreation {
}
}
}
- my (@email_rule,%userinfo,%savecaptcha);
+ my (%userinfo,%savecaptcha);
my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
#
# Populate $cancreate{'emailusername'}{$type} hash ref with information fields (if new user will provide data
@@ -9862,8 +10382,8 @@ sub modify_selfcreation {
if ($env{'form.cancreate_email'}) {
push(@contexts,'emailusername');
- if (ref($types) eq 'ARRAY') {
- foreach my $type (@{$types}) {
+ if (@statuses) {
+ foreach my $type (@statuses) {
if (ref($infofields) eq 'ARRAY') {
foreach my $field (@{$infofields}) {
if ($env{'form.canmodify_emailusername_'.$type.'_'.$field} =~ /^(required|optional)$/) {
@@ -9875,7 +10395,7 @@ sub modify_selfcreation {
}
#
# Populate $cancreate{'notify'} hash ref with names of Domain Coordinators who are to be notified of
-# queued requests for self-creation of account using e-mail address as username
+# queued requests for self-creation of account verified by e-mail.
#
my @approvalnotify = &Apache::loncommon::get_env_multiple('form.selfcreationnotifyapproval');
@@ -9895,36 +10415,13 @@ sub modify_selfcreation {
push(@{$changes{'cancreate'}},'notify');
}
-#
-# Retrieve rules (if any) governing types of e-mail address which may be used as a username
-#
- @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');
&process_captcha('cancreate',\%changes,\%savecaptcha,$curr_usercreation{'cancreate'});
- if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') {
- if (@{$curr_usercreation{'email_rule'}} > 0) {
- foreach my $type (@{$curr_usercreation{'email_rule'}}) {
- if (!grep(/^\Q$type\E$/,@email_rule)) {
- push(@{$changes{'email_rule'}},$type);
- }
- }
- }
- if (@email_rule > 0) {
- foreach my $type (@email_rule) {
- if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'email_rule'}})) {
- push(@{$changes{'email_rule'}},$type);
- }
- }
- }
- } elsif (@email_rule > 0) {
- push(@{$changes{'email_rule'}},@email_rule);
- }
}
#
# Check if domain default is set appropriately, if self-creation of accounts is to be available for
# institutional log-in.
#
if (grep(/^login$/,@{$cancreate{'selfcreate'}})) {
- my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) ||
($domdefaults{'auth_def'} eq 'localauth'))) {
$warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '.
@@ -9943,14 +10440,10 @@ sub modify_selfcreation {
# which the user may supply, if institutional data is unavailable.
#
if (($env{'form.cancreate_login'}) || ($env{'form.cancreate_sso'})) {
- if (ref($types) eq 'ARRAY') {
- if (@{$types} > 1) {
- @{$cancreate{'statustocreate'}} = &Apache::loncommon::get_env_multiple('form.statustocreate');
- push(@contexts,'statustocreate');
- } else {
- undef($cancreate{'statustocreate'});
- }
- foreach my $type (@{$types}) {
+ if (@types) {
+ @{$cancreate{'statustocreate'}} = &Apache::loncommon::get_env_multiple('form.statustocreate');
+ push(@contexts,'statustocreate');
+ foreach my $type (@types) {
my @modifiable = &Apache::loncommon::get_env_multiple('form.canmodify_'.$type);
foreach my $field (@fields) {
if (grep(/^\Q$field\E$/,@modifiable)) {
@@ -9961,7 +10454,7 @@ sub modify_selfcreation {
}
}
if (ref($curr_usermodify{'selfcreate'}) eq 'HASH') {
- foreach my $type (@{$types}) {
+ foreach my $type (@types) {
if (ref($curr_usermodify{'selfcreate'}{$type}) eq 'HASH') {
foreach my $field (@fields) {
if ($save_usermodify{'selfcreate'}{$type}{$field} ne
@@ -9973,7 +10466,7 @@ sub modify_selfcreation {
}
}
} else {
- foreach my $type (@{$types}) {
+ foreach my $type (@types) {
push(@{$changes{'selfcreate'}},$type);
}
}
@@ -10022,34 +10515,28 @@ sub modify_selfcreation {
}
} elsif (ref($curr_usercreation{'cancreate'}{$item}) eq 'HASH') {
if (ref($cancreate{$item}) eq 'HASH') {
- foreach my $curr (keys(%{$curr_usercreation{'cancreate'}{$item}})) {
- if (ref($curr_usercreation{'cancreate'}{$item}{$curr}) eq 'HASH') {
- foreach my $field (keys(%{$curr_usercreation{'cancreate'}{$item}{$curr}})) {
- unless ($curr_usercreation{'cancreate'}{$item}{$curr}{$field} eq $cancreate{$item}{$curr}{$field}) {
+ foreach my $type (keys(%{$curr_usercreation{'cancreate'}{$item}})) {
+ if (ref($curr_usercreation{'cancreate'}{$item}{$type}) eq 'HASH') {
+ foreach my $field (keys(%{$curr_usercreation{'cancreate'}{$item}{$type}})) {
+ unless ($curr_usercreation{'cancreate'}{$item}{$type}{$field} eq $cancreate{$item}{$type}{$field}) {
if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
push(@{$changes{'cancreate'}},$item);
}
}
}
- } elsif ($item eq 'selfcreateprocessing') {
- if ($cancreate{$item}{$curr} ne $curr_usercreation{'cancreate'}{$item}{$curr}) {
- if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
- push(@{$changes{'cancreate'}},$item);
- }
- }
- } else {
- if (!$cancreate{$item}{$curr}) {
+ } elsif (($item eq 'selfcreateprocessing') || ($item eq 'emailverified') || ($item eq 'emailoptions')) {
+ if ($cancreate{$item}{$type} ne $curr_usercreation{'cancreate'}{$item}{$type}) {
if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
push(@{$changes{'cancreate'}},$item);
}
}
}
}
- foreach my $field (keys(%{$cancreate{$item}})) {
- if (ref($cancreate{$item}{$field}) eq 'HASH') {
- foreach my $inner (keys(%{$cancreate{$item}{$field}})) {
- if (ref($curr_usercreation{'cancreate'}{$item}{$field}) eq 'HASH') {
- unless ($curr_usercreation{'cancreate'}{$item}{$field}{$inner} eq $cancreate{$item}{$field}{$inner}) {
+ foreach my $type (keys(%{$cancreate{$item}})) {
+ if (ref($cancreate{$item}{$type}) eq 'HASH') {
+ foreach my $field (keys(%{$cancreate{$item}{$type}})) {
+ if (ref($curr_usercreation{'cancreate'}{$item}{$type}) eq 'HASH') {
+ unless ($curr_usercreation{'cancreate'}{$item}{$type}{$field} eq $cancreate{$item}{$type}{$field}) {
if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
push(@{$changes{'cancreate'}},$item);
}
@@ -10060,14 +10547,8 @@ sub modify_selfcreation {
}
}
}
- } elsif ($item eq 'selfcreateprocessing') {
- if ($cancreate{$item}{$field} ne $curr_usercreation{'cancreate'}{$item}{$field}) {
- if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
- push(@{$changes{'cancreate'}},$item);
- }
- }
- } else {
- if (!$curr_usercreation{'cancreate'}{$item}{$field}) {
+ } elsif (($item eq 'selfcreateprocessing') || ($item eq 'emailverified') || ($item eq 'emailoptions')) {
+ if ($cancreate{$item}{$type} ne $curr_usercreation{'cancreate'}{$item}{$type}) {
if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
push(@{$changes{'cancreate'}},$item);
}
@@ -10082,11 +10563,11 @@ sub modify_selfcreation {
push(@{$changes{'cancreate'}},$item);
}
}
- } elsif (ref($cancreate{$item}) eq 'HASH') {
- if (!$cancreate{$item}{$curr_usercreation{'cancreate'}{$item}}) {
- if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
- push(@{$changes{'cancreate'}},$item);
- }
+ }
+ } elsif (($item eq 'selfcreateprocessing') || ($item eq 'emailverified') || ($item eq 'emailoptions')) {
+ if (ref($cancreate{$item}) eq 'HASH') {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
}
}
} elsif ($item eq 'emailusername') {
@@ -10119,6 +10600,15 @@ sub modify_selfcreation {
if (ref($cancreate{'selfcreateprocessing'}) eq 'HASH') {
$save_usercreate{'cancreate'}{'selfcreateprocessing'} = $cancreate{'selfcreateprocessing'};
}
+ if (ref($cancreate{'emailverified'}) eq 'HASH') {
+ $save_usercreate{'cancreate'}{'emailverified'} = $cancreate{'emailverified'};
+ }
+ if (ref($cancreate{'emailoptions'}) eq 'HASH') {
+ $save_usercreate{'cancreate'}{'emailoptions'} = $cancreate{'emailoptions'};
+ }
+ if (ref($cancreate{'emaildomain'}) eq 'HASH') {
+ $save_usercreate{'cancreate'}{'emaildomain'} = $cancreate{'emaildomain'};
+ }
if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {
$save_usercreate{'cancreate'}{'statustocreate'} = $cancreate{'statustocreate'};
}
@@ -10126,16 +10616,18 @@ sub modify_selfcreation {
$save_usercreate{'cancreate'}{'shibenv'} = $cancreate{'shibenv'};
}
$save_usercreate{'cancreate'}{'emailusername'} = $cancreate{'emailusername'};
- $save_usercreate{'emailrule'} = \@email_rule;
+ $save_usercreate{'email_rule'} = \%email_rule;
my %userconfig_hash = (
usercreation => \%save_usercreate,
usermodification => \%save_usermodify,
+ inststatus => \%save_inststatus,
);
+
my $putresult = &Apache::lonnet::put_dom('configuration',\%userconfig_hash,
$dom);
#
-# Accumulate details of changes to domain cofiguration for self-creation of usernames in $resulttext
+# Accumulate details of changes to domain configuration for self-creation of usernames in $resulttext
#
if ($putresult eq 'ok') {
if (keys(%changes) > 0) {
@@ -10143,7 +10635,7 @@ sub modify_selfcreation {
if (ref($changes{'cancreate'}) eq 'ARRAY') {
my %lt = &selfcreation_types();
foreach my $type (@{$changes{'cancreate'}}) {
- my $chgtext;
+ my $chgtext = '';
if ($type eq 'selfcreate') {
if (@{$cancreate{$type}} == 0) {
$chgtext .= &mt('Self creation of a new user account is not permitted.');
@@ -10158,18 +10650,25 @@ sub modify_selfcreation {
if (grep(/^(login|sso)$/,@{$cancreate{$type}})) {
if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {
if (@{$cancreate{'statustocreate'}} == 0) {
- $chgtext .= ' '.
- ''.
- &mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").
- '';
+ $chgtext .= ''.
+ &mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts via log-in or single sign-on.").
+ ' ';
}
}
}
+ if (grep(/^email$/,@{$cancreate{$type}})) {
+ if (!@statuses) {
+ $chgtext .= ''.
+ &mt("However, e-mail verification is currently set to 'unavailable' for all user types (including 'other'), so self-creation of accounts is not possible for non-institutional log-in.").
+ ' ';
+
+ }
+ }
}
}
} elsif ($type eq 'shibenv') {
if (keys(%{$cancreate{$type}}) == 0) {
- $chgtext .= &mt('Shibboleth-autheticated user does not use environment variables to set user information');
+ $chgtext .= &mt('Shibboleth-autheticated user does not use environment variables to set user information').' ';
} else {
$chgtext .= &mt('Shibboleth-autheticated user information set from environment variables, as follows:').
'';
@@ -10182,7 +10681,7 @@ sub modify_selfcreation {
}
}
$chgtext .= ' ';
- }
+ }
} elsif ($type eq 'statustocreate') {
if ((ref($cancreate{'selfcreate'}) eq 'ARRAY') &&
(ref($cancreate{'statustocreate'}) eq 'ARRAY')) {
@@ -10195,7 +10694,7 @@ sub modify_selfcreation {
&mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").
'';
}
- } elsif (ref($usertypes) eq 'HASH') {
+ } elsif (keys(%usertypes) > 0) {
if (grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {
$chgtext .= &mt('Creation of a new account for an institutional user is restricted to the following institutional affiliation(s):');
} else {
@@ -10206,12 +10705,12 @@ sub modify_selfcreation {
if ($case eq 'default') {
$chgtext .= ''.$othertitle.'';
} else {
- $chgtext .= ''.$usertypes->{$case}.'';
+ $chgtext .= ''.$usertypes{$case}.'';
}
}
$chgtext .= '';
if (!grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {
- $chgtext .= ' '.
+ $chgtext .= ''.
&mt('However, users authenticated by institutional login/single sign on are not currently permitted to create accounts.').
'';
}
@@ -10223,26 +10722,129 @@ sub modify_selfcreation {
$chgtext .= &mt('Although institutional affiliations permitted to create accounts were changed, self creation of accounts is not currently permitted for any authentication types.');
}
}
+ $chgtext .= ' ';
}
} elsif ($type eq 'selfcreateprocessing') {
my %choices = &Apache::lonlocal::texthash (
automatic => 'Automatic approval',
approval => 'Queued for approval',
);
- if (@statuses > 1) {
- $chgtext .= &mt('Processing of requests to create account with e-mail address as username set as follows:').
- '';
- foreach my $type (@statuses) {
- if ($type eq 'default') {
- $chgtext .= '- '.$othertitle.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$type}}.'
';
- } else {
- $chgtext .= '- '.$usertypes->{$type}.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$type}}.'
';
- }
- }
- $chgtext .= ' ';
+ if (@types) {
+ if (@statuses) {
+ $chgtext .= &mt('Processing of requests to create account with e-mail verification set as follows:').
+ '';
+ foreach my $status (@statuses) {
+ if ($status eq 'default') {
+ $chgtext .= '- '.$othertitle.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$status}}.'
';
+ } else {
+ $chgtext .= '- '.$usertypes{$status}.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$status}}.'
';
+ }
+ }
+ $chgtext .= ' ';
+ }
} else {
- $chgtext .= &mt('Processing of requests to create account with e-mail address as username set to: "[_1]"',
- $choices{$cancreate{'selfcreateprocessing'}{'default'}});
+ $chgtext .= &mt('Processing of requests to create account with e-mail verification set to: "[_1]"',
+ $choices{$cancreate{'selfcreateprocessing'}{'default'}});
+ }
+ } elsif ($type eq 'emailverified') {
+ my %options = &Apache::lonlocal::texthash (
+ all => 'Same as e-mail',
+ first => 'Omit @domain',
+ free => 'Free to choose',
+ );
+ if (@types) {
+ if (@statuses) {
+ $chgtext .= &mt('For self-created accounts verified by e-mail address, username is set as follows:').
+ '';
+ foreach my $status (@statuses) {
+ if ($status eq 'default') {
+ $chgtext .= '- '.$othertitle.' -- '.$options{$cancreate{'emailverified'}{$status}}.'
';
+ } else {
+ $chgtext .= '- '.$usertypes{$status}.' -- '.$options{$cancreate{'emailverified'}{$status}}.'
';
+ }
+ }
+ $chgtext .= ' ';
+ }
+ } else {
+ $chgtext .= &mt("For self-created accounts verified by e-mail address, user's username is: '[_1]'",
+ $options{$cancreate{'emailverified'}{'default'}});
+ }
+ } elsif ($type eq 'emailoptions') {
+ my %options = &Apache::lonlocal::texthash (
+ any => 'Any e-mail',
+ inst => 'Institutional only',
+ noninst => 'Non-institutional only',
+ custom => 'Custom restrictions',
+ );
+ if (@types) {
+ if (@statuses) {
+ $chgtext .= &mt('For self-created accounts verified by e-mail address, requirements for e-mail address are as follows:').
+ '';
+ foreach my $status (@statuses) {
+ if ($type eq 'default') {
+ $chgtext .= '- '.$othertitle.' -- '.$options{$cancreate{'emailoptions'}{$status}}.'
';
+ } else {
+ $chgtext .= '- '.$usertypes{$status}.' -- '.$options{$cancreate{'emailoptions'}{$status}}.'
';
+ }
+ }
+ $chgtext .= ' ';
+ }
+ } else {
+ if ($cancreate{'emailoptions'}{'default'} eq 'any') {
+ $chgtext .= &mt('For self-created accounts verified by e-mail address, any e-mail may be used');
+ } else {
+ $chgtext .= &mt('For self-created accounts verified by e-mail address, e-mail restricted to: "[_1]"',
+ $options{$cancreate{'emailoptions'}{'default'}});
+ }
+ }
+ } elsif ($type eq 'emaildomain') {
+ my $output;
+ if (@statuses) {
+ foreach my $type (@statuses) {
+ if (ref($cancreate{'emaildomain'}{$type}) eq 'HASH') {
+ if ($cancreate{'emailoptions'}{$type} eq 'inst') {
+ if ($type eq 'default') {
+ if ((ref($cancreate{'emaildomain'}{$type}) ne 'HASH') ||
+ ($cancreate{'emaildomain'}{$type}{'inst'} eq '')) {
+ $output = ''.$othertitle.' -- '.&mt('No restriction on e-mail domain').'';
+ } else {
+ $output = ''.$othertitle.' -- '.&mt("User's e-mail address needs to end: [_1]",
+ $cancreate{'emaildomain'}{$type}{'inst'}).'';
+ }
+ } else {
+ if ((ref($cancreate{'emaildomain'}{$type}) ne 'HASH') ||
+ ($cancreate{'emaildomain'}{$type}{'inst'} eq '')) {
+ $output = ''.$usertypes{$type}.' -- '.&mt('No restriction on e-mail domain').'';
+ } else {
+ $output = ''.$usertypes{$type}.' -- '.&mt("User's e-mail address needs to end: [_1]",
+ $cancreate{'emaildomain'}{$type}{'inst'}).'';
+ }
+ }
+ } elsif ($cancreate{'emailoptions'}{$type} eq 'noninst') {
+ if ($type eq 'default') {
+ if ((ref($cancreate{'emaildomain'}{$type}) ne 'HASH') ||
+ ($cancreate{'emaildomain'}{$type}{'noninst'} eq '')) {
+ $output = ''.$othertitle.' -- '.&mt('No restriction on e-mail domain').'';
+ } else {
+ $output = ''.$othertitle.' -- '.&mt("User's e-mail address must not end: [_1]",
+ $cancreate{'emaildomain'}{$type}{'noninst'}).'';
+ }
+ } else {
+ if ((ref($cancreate{'emaildomain'}{$type}) ne 'HASH') ||
+ ($cancreate{'emaildomain'}{$type}{'noninst'} eq '')) {
+ $output = ''.$usertypes{$type}.' -- '.&mt('No restriction on e-mail domain').'';
+ } else {
+ $output = ''.$usertypes{$type}.' -- '.&mt("User's e-mail address must not end: [_1]",
+ $cancreate{'emaildomain'}{$type}{'noninst'}).'';
+ }
+ }
+ }
+ }
+ }
+ }
+ if ($output ne '') {
+ $chgtext .= &mt('For self-created accounts verified by e-mail address:').
+ '';
}
} elsif ($type eq 'captcha') {
if ($savecaptcha{$type} eq 'notused') {
@@ -10279,11 +10881,11 @@ sub modify_selfcreation {
}
} elsif ($type eq 'emailusername') {
if (ref($cancreate{'emailusername'}) eq 'HASH') {
- if (ref($types) eq 'ARRAY') {
- foreach my $type (@{$types}) {
+ if (@statuses) {
+ foreach my $type (@statuses) {
if (ref($cancreate{'emailusername'}{$type}) eq 'HASH') {
if (keys(%{$cancreate{'emailusername'}{$type}}) > 0) {
- $chgtext .= &mt('When self-creating account with e-mail as username, the following information will be provided by [_1]:',"'$usertypes->{$type}'").
+ $chgtext .= &mt('When self-creating account with e-mail verification, the following information will be provided by [_1]:',"'$usertypes{$type}'").
'';
foreach my $field (@{$infofields}) {
if ($cancreate{'emailusername'}{$type}{$field}) {
@@ -10292,48 +10894,86 @@ sub modify_selfcreation {
}
$chgtext .= ' ';
} else {
- $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',"'$usertypes->{$type}'").' ';
+ $chgtext .= &mt('When self creating account with e-mail verification, no information besides e-mail address will be provided by [_1].',"'$usertypes{$type}'").' ';
}
} else {
- $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',"'$usertypes->{$type}'").' ';
+ $chgtext .= &mt('When self creating account with e-mail verification, no information besides e-mail address will be provided by [_1].',"'$usertypes{$type}'").' ';
}
}
}
}
} elsif ($type eq 'notify') {
- $chgtext = &mt('No Domain Coordinators will receive notification of username requests requiring approval.');
+ my $numapprove = 0;
if (ref($changes{'cancreate'}) eq 'ARRAY') {
if ((grep(/^notify$/,@{$changes{'cancreate'}})) && (ref($cancreate{'notify'}) eq 'HASH')) {
if ($cancreate{'notify'}{'approval'}) {
- $chgtext = &mt('Notification of username requests requiring approval will be sent to: ').$cancreate{'notify'}{'approval'};
+ $chgtext .= &mt('Notification of username requests requiring approval will be sent to: ').$cancreate{'notify'}{'approval'};
+ $numapprove ++;
}
}
}
+ unless ($numapprove) {
+ $chgtext .= &mt('No Domain Coordinators will receive notification of username requests requiring approval.');
+ }
}
if ($chgtext) {
$resulttext .= ''.$chgtext.'';
}
}
}
- if (ref($changes{'email_rule'}) eq 'ARRAY') {
+ if ((ref($changes{'email_rule'}) eq 'ARRAY') && (@{$changes{'email_rule'}} > 0)) {
my ($emailrules,$emailruleorder) =
&Apache::lonnet::inst_userrules($dom,'email');
- my $chgtext = '';
- foreach my $type (@email_rule) {
- if (ref($emailrules->{$type}) eq 'HASH') {
- $chgtext .= '- '.$emailrules->{$type}{'name'}.'
';
+ foreach my $type (@{$changes{'email_rule'}}) {
+ if (ref($email_rule{$type}) eq 'ARRAY') {
+ my $chgtext = '';
+ foreach my $rule (@{$email_rule{$type}}) {
+ if (ref($emailrules->{$rule}) eq 'HASH') {
+ $chgtext .= '- '.$emailrules->{$rule}{'name'}.'
';
+ }
+ }
+ $chgtext .= ' ';
+ my $typename;
+ if (@types) {
+ if ($type eq 'default') {
+ $typename = $othertitle;
+ } else {
+ $typename = $usertypes{$type};
+ }
+ $chgtext .= &mt('(Affiliation: [_1])',$typename);
+ }
+ if (@{$email_rule{$type}} > 0) {
+ $resulttext .= '- '.
+ &mt('Accounts may not be created by users verified by e-mail, for e-mail addresses of the following types: ',
+ $usertypes{$type}).
+ $chgtext.
+ '
';
+ } else {
+ $resulttext .= '- '.
+ &mt('There are now no restrictions on e-mail addresses which may be used for verification when a user requests an account.').
+ '
'.
+ &mt('(Affiliation: [_1])',$typename);
+ }
}
}
- $chgtext .= ' ';
- if (@email_rule > 0) {
- $resulttext .= ''.
- &mt('Accounts may not be created by users self-enrolling with e-mail addresses of the following types: ').
- $chgtext.
- '';
- } else {
- $resulttext .= ''.
- &mt('There are now no restrictions on e-mail addresses which may be used as a username when self-enrolling.').
- '';
+ }
+ if (ref($changes{'inststatus'}) eq 'ARRAY') {
+ if (ref($save_inststatus{'inststatusguest'}) eq 'ARRAY') {
+ if (@{$save_inststatus{'inststatusguest'}} > 0) {
+ my $chgtext = '';
+ foreach my $type (@{$save_inststatus{'inststatusguest'}}) {
+ $chgtext .= '- '.$usertypes{$type}.'
';
+ }
+ $chgtext .= ' ';
+ $resulttext .= ''.
+ &mt('A user will self-report one of the following affiliations when requesting an account verified by e-mail: ').
+ $chgtext.
+ '';
+ } else {
+ $resulttext .= ''.
+ &mt('No affiliations available for self-reporting when requesting an account verified by e-mail.').
+ '';
+ }
}
}
if (ref($changes{'selfcreate'}) eq 'ARRAY') {
@@ -10341,9 +10981,9 @@ sub modify_selfcreation {
my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
foreach my $type (@{$changes{'selfcreate'}}) {
my $typename = $type;
- if (ref($usertypes) eq 'HASH') {
- if ($usertypes->{$type} ne '') {
- $typename = $usertypes->{$type};
+ if (keys(%usertypes) > 0) {
+ if ($usertypes{$type} ne '') {
+ $typename = $usertypes{$type};
}
}
my @modifiable;
@@ -10366,6 +11006,12 @@ sub modify_selfcreation {
$resulttext .= '';
}
$resulttext .= '';
+ my $cachetime = 24*60*60;
+ $domdefaults{'inststatusguest'} = $save_inststatus{'inststatusguest'};
+ &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
+ if (ref($lastactref) eq 'HASH') {
+ $lastactref->{'domdefaults'} = 1;
+ }
} else {
$resulttext = &mt('No changes made to self-creation settings');
}
@@ -10649,9 +11295,18 @@ sub modify_defaults {
}
my @todelete = &Apache::loncommon::get_env_multiple('form.inststatus_delete');
my @allpos;
- my %guests;
my %alltypes;
- my ($currtitles,$currguests,$currorder);
+ my @inststatusguest;
+ if (ref($currinststatus) eq 'HASH') {
+ if (ref($currinststatus->{'inststatusguest'}) eq 'ARRAY') {
+ foreach my $type (@{$currinststatus->{'inststatusguest'}}) {
+ unless (grep(/^\Q$type\E$/,@todelete)) {
+ push(@inststatusguest,$type);
+ }
+ }
+ }
+ }
+ my ($currtitles,$currorder);
if (ref($currinststatus) eq 'HASH') {
if (ref($currinststatus->{'inststatusorder'}) eq 'ARRAY') {
foreach my $type (@{$currinststatus->{'inststatusorder'}}) {
@@ -10666,14 +11321,8 @@ sub modify_defaults {
$allpos[$position] = $type;
$alltypes{$type} = $env{'form.inststatus_title_'.$type};
$alltypes{$type} =~ s/`//g;
- if ($env{'form.inststatus_guest_'.$type}) {
- $guests{$type} = 1;
- }
}
}
- if (ref($currinststatus->{'inststatusguest'}) eq 'ARRAY') {
- $currguests = join(',',@{$currinststatus->{'inststatusguest'}});
- }
$currorder = join(',',@{$currinststatus->{'inststatusorder'}});
$currtitles =~ s/,$//;
}
@@ -10682,9 +11331,6 @@ sub modify_defaults {
my $newtype = $env{'form.addinststatus'};
$newtype =~ s/\W//g;
unless (exists($alltypes{$newtype})) {
- if ($env{'form.addinststatus_guest'}) {
- $guests{$newtype} = 1;
- }
$alltypes{$newtype} = $env{'form.addinststatus_title'};
$alltypes{$newtype} =~ s/`//g;
my $position = $env{'form.addinststatus_pos'};
@@ -10694,13 +11340,10 @@ sub modify_defaults {
}
}
}
- my (@orderedstatus,@orderedguests);
+ my @orderedstatus;
foreach my $type (@allpos) {
unless (($type eq '') || (grep(/^\Q$type\E$/,@orderedstatus))) {
push(@orderedstatus,$type);
- if ($guests{$type}) {
- push(@orderedguests,$type);
- }
}
}
foreach my $type (keys(%alltypes)) {
@@ -10711,7 +11354,7 @@ sub modify_defaults {
$defaults_hash{'inststatus'} = {
inststatustypes => \%alltypes,
inststatusorder => \@orderedstatus,
- inststatusguest => \@orderedguests,
+ inststatusguest => \@inststatusguest,
};
if (ref($defaults_hash{'inststatus'}) eq 'HASH') {
foreach my $item ('inststatustypes','inststatusorder','inststatusguest') {
@@ -10721,9 +11364,6 @@ sub modify_defaults {
if ($currorder ne join(',',@orderedstatus)) {
$changes{'inststatus'}{'inststatusorder'} = 1;
}
- if ($currguests ne join(',',@orderedguests)) {
- $changes{'inststatus'}{'inststatusguest'} = 1;
- }
my $newtitles;
foreach my $item (@orderedstatus) {
$newtitles .= $alltypes{$item}.',';
@@ -10742,26 +11382,15 @@ sub modify_defaults {
foreach my $item (sort(keys(%changes))) {
if ($item eq 'inststatus') {
if (ref($changes{'inststatus'}) eq 'HASH') {
- if (($changes{'inststatus'}{'inststatustypes'}) || $changes{'inststatus'}{'inststatusorder'}) {
+ if (@orderedstatus) {
$resulttext .= ''.&mt('Institutional user status types set to:').' ';
foreach my $type (@orderedstatus) {
$resulttext .= $alltypes{$type}.', ';
}
$resulttext =~ s/, $//;
$resulttext .= '';
- }
- if ($changes{'inststatus'}{'inststatusguest'}) {
- $resulttext .= '';
- if (@orderedguests) {
- $resulttext .= &mt('Types assignable to "non-institutional" usernames set to:').' ';
- foreach my $type (@orderedguests) {
- $resulttext .= $alltypes{$type}.', ';
- }
- $resulttext =~ s/, $//;
- } else {
- $resulttext .= &mt('Types assignable to "non-institutional" usernames set to none.');
- }
- $resulttext .= '';
+ } else {
+ $resulttext .= ''.&mt('Institutional user status types deleted').'';
}
}
} else {
@@ -11163,6 +11792,10 @@ sub modify_coursecategories {
}
$resulttext .= '';
}
+ &Apache::lonnet::do_cache_new('cats',$dom,$cathash,3600);
+ if (ref($lastactref) eq 'HASH') {
+ $lastactref->{'cats'} = 1;
+ }
}
$resulttext .= '';
if ($changes{'unauth'} || $changes{'auth'}) {
@@ -11559,7 +12192,7 @@ sub modify_helpsettings {
order => 'Order',
desc => 'Role description',
access => 'Role usage',
- status => 'Allowed instituional types',
+ status => 'Allowed institutional types',
exc => 'Allowed personnel',
inc => 'Disallowed personnel',
);
@@ -11656,7 +12289,11 @@ sub modify_coursedefaults {
postsubmit => 60,
mysqltables => 172800,
);
-
+ my %texoptions = (
+ MathJax => 'MathJax',
+ mimetex => &mt('Convert to Images'),
+ tth => &mt('TeX to HTML'),
+ );
$defaultshash{'coursedefaults'} = {};
if (ref($domconfig{'coursedefaults'}) ne 'HASH') {
@@ -11703,7 +12340,6 @@ sub modify_coursedefaults {
$defaultshash{'coursedefaults'}{$setting}{$type} = $newdef;
}
if ($currdef ne $newdef) {
- my $staticdef;
if ($item eq 'anonsurvey_threshold') {
unless (($currdef eq '') && ($newdef == $staticdefaults{$item})) {
$changes{$item} = 1;
@@ -11716,6 +12352,21 @@ sub modify_coursedefaults {
}
}
}
+ my $texengine;
+ if ($env{'form.texengine'} =~ /^(MathJax|mimetex|tth)$/) {
+ $texengine = $env{'form.texengine'};
+ my $currdef = $domconfig{'coursedefaults'}{'texengine'};
+ if ($currdef eq '') {
+ unless ($texengine eq $Apache::lonnet::deftex) {
+ $changes{'texengine'} = 1;
+ }
+ } elsif ($currdef ne $texengine) {
+ $changes{'texengine'} = 1;
+ }
+ }
+ if ($texengine ne '') {
+ $defaultshash{'coursedefaults'}{'texengine'} = $texengine;
+ }
my $currclone = $domconfig{'coursedefaults'}{'canclone'};
my @currclonecode;
if (ref($currclone) eq 'HASH') {
@@ -11836,8 +12487,8 @@ sub modify_coursedefaults {
my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
if (($changes{'uploadquota'}) || ($changes{'postsubmit'}) ||
($changes{'coursecredits'}) || ($changes{'uselcmath'}) || ($changes{'usejsme'}) ||
- ($changes{'canclone'}) || ($changes{'mysqltables'})) {
- foreach my $item ('uselcmath','usejsme') {
+ ($changes{'canclone'}) || ($changes{'mysqltables'}) || ($changes{'texengine'})) {
+ foreach my $item ('uselcmath','usejsme','texengine') {
if ($changes{$item}) {
$domdefaults{$item}=$defaultshash{'coursedefaults'}{$item};
}
@@ -11900,6 +12551,11 @@ sub modify_coursedefaults {
} else {
$resulttext .= ''.&mt('Molecule editor uses JME (Java), if supported by client OS.').'';
}
+ } elsif ($item eq 'texengine') {
+ if ($defaultshash{'coursedefaults'}{'texengine'} ne '') {
+ $resulttext .= ''.&mt('Default method to display mathematics set to: "[_1]"',
+ $texoptions{$defaultshash{'coursedefaults'}{'texengine'}}).'';
+ }
} elsif ($item eq 'anonsurvey_threshold') {
$resulttext .= ''.&mt('Responder count required for display of anonymous survey submissions set to [_1].',$defaultshash{'coursedefaults'}{'anonsurvey_threshold'}).'';
} elsif ($item eq 'uploadquota') {
@@ -12224,12 +12880,12 @@ sub modify_selfenrollment {
$resulttext .= '';
}
}
- if ((exists($changes{'admin'})) || (exists($changes{'default'}))) {
- my $cachetime = 24*60*60;
- &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'domdefaults'} = 1;
- }
+ }
+ if ((exists($changes{'admin'})) || (exists($changes{'default'}))) {
+ my $cachetime = 24*60*60;
+ &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
+ if (ref($lastactref) eq 'HASH') {
+ $lastactref->{'domdefaults'} = 1;
}
}
$resulttext .= '';
@@ -12475,8 +13131,10 @@ sub modify_usersessions {
}
my $cachetime = 24*60*60;
&Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
+ &Apache::lonnet::do_cache_new('usersessions',$dom,$defaultshash{'usersessions'},3600);
if (ref($lastactref) eq 'HASH') {
$lastactref->{'domdefaults'} = 1;
+ $lastactref->{'usersessions'} = 1;
}
if (keys(%changes) > 0) {
my %lt = &usersession_titles();
@@ -13509,6 +14167,7 @@ function toggleDisplay(domForm,caller) {
var optionsElement = domForm.coursecredits;
var checkval = 1;
var dispval = 'block';
+ var selfcreateRegExp = /^cancreate_emailverified/;
if (caller == 'emailoptions') {
optionsElement = domForm.cancreate_email;
}
@@ -13519,6 +14178,11 @@ function toggleDisplay(domForm,caller) {
optionsElement = domForm.canclone;
checkval = 'instcode';
}
+ if (selfcreateRegExp.test(caller)) {
+ optionsElement = domForm.elements[caller];
+ checkval = 'other';
+ dispval = 'inline'
+ }
if (optionsElement.length) {
var currval;
for (var i=0; i |
| |
|