--- loncom/interface/domainprefs.pm 2007/09/27 15:36:23 1.31 +++ loncom/interface/domainprefs.pm 2007/12/11 00:44:23 1.33 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.31 2007/09/27 15:36:23 raeburn Exp $ +# $Id: domainprefs.pm,v 1.33 2007/12/11 00:44:23 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -68,10 +68,10 @@ sub handler { my %domconfig = &Apache::lonnet::get_dom('configuration',['login','rolecolors', 'quotas','autoenroll','autoupdate','directorysrch', - 'usercreation','contacts'],$dom); + 'usercreation','usermodification','contacts'],$dom); my @prefs_order = ('rolecolors','login','quotas','autoenroll', 'autoupdate','directorysrch','contacts', - 'usercreation'); + 'usercreation','usermodification'); my %prefs = ( 'rolecolors' => { text => 'Default color schemes', @@ -132,6 +132,14 @@ sub handler { {col1 => 'Context', col2 => 'Assignable Authentication Types'}], }, + 'usermodification' => + { text => 'User modification', + help => 'Domain_User_Modification', + header => [{col1 => 'Target user has role', + col2 => 'User information updateable in author context'}, + {col1 => 'Target user has role', + col2 => 'User information updateable in course context'}], + }, ); my @roles = ('student','coordinator','author','admin'); my @actions = &Apache::loncommon::get_env_multiple('form.actions'); @@ -306,6 +314,8 @@ sub process_changes { $output = &modify_directorysrch($dom,%domconfig); } elsif ($action eq 'usercreation') { $output = &modify_usercreation($dom,%domconfig); + } elsif ($action eq 'usermodification') { + $output = &modify_usermodification($dom,%domconfig); } elsif ($action eq 'contacts') { $output = &modify_contacts($dom,%domconfig); } @@ -327,7 +337,7 @@ sub print_config_box { # '); $rowtotal ++; if (($action eq 'autoupdate') || ($action eq 'rolecolors') || - ($action eq 'usercreation')) { + ($action eq 'usercreation') || ($action eq 'usermodification')) { my $colspan = ($action eq 'rolecolors')?' colspan="2"':''; $output .= ' @@ -341,7 +351,9 @@ sub print_config_box { if ($action eq 'autoupdate') { $output .= &print_autoupdate('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'usercreation') { - $output .= &print_usercreation('top',$dom,$settings,\$rowtotal); + $output .= &print_usercreation('top',$dom,$settings,\$rowtotal); + } elsif ($action eq 'usermodification') { + $output .= &print_usermodification('top',$dom,$settings,\$rowtotal); } else { $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal); } @@ -361,6 +373,8 @@ sub print_config_box { $output .= &print_autoupdate('bottom',$dom,$settings,\$rowtotal); } elsif ($action eq 'usercreation') { $output .= &print_usercreation('bottom',$dom,$settings,\$rowtotal); + } elsif ($action eq 'usermodification') { + $output .= &print_usermodification('bottom',$dom,$settings,\$rowtotal); } else { $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).' @@ -1056,14 +1070,7 @@ sub print_autoupdate { my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom); my @fields = ('lastname','firstname','middlename','gen', 'permanentemail','id'); - my %fieldtitles = &Apache::lonlocal::texthash ( - id => 'Student/Employee ID', - permanentemail => 'E-mail address', - lastname => 'Last Name', - firstname => 'First Name', - middlename => 'Middle Name', - gen => 'Generation', - ); + my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); my $numrows = 0; if (ref($types) eq 'ARRAY') { if (@{$types} > 0) { @@ -1289,7 +1296,6 @@ sub contact_titles { sub print_usercreation { my ($position,$dom,$settings,$rowtotal) = @_; my $numinrow = 4; - my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom); my $datatable; my %lt = &Apache::lonlocal::texthash ( nondc => 'User creation other than by Domain Coordinator: ', @@ -1316,11 +1322,23 @@ sub print_usercreation { } $datatable .= ''; $$rowtotal ++; + my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom,'username'); + my $rowcount = 0; if (ref($rules) eq 'HASH') { if (keys(%{$rules}) > 0) { - $datatable .= &username_formats_row($settings,$rules, - $ruleorder,$numinrow); + $datatable .= &user_formats_row('username',$settings,$rules, + $ruleorder,$numinrow,$rowcount); + $$rowtotal ++; + $rowcount ++; + } + } + my ($idrules,$idruleorder) = &Apache::lonnet::inst_userrules($dom,'id'); + if (ref($idrules) eq 'HASH') { + if (keys(%{$idrules}) > 0) { + $datatable .= &user_formats_row('id',$settings,$idrules, + $idruleorder,$numinrow,$rowcount); $$rowtotal ++; + $rowcount ++; } } } else { @@ -1369,13 +1387,19 @@ sub print_usercreation { return $datatable; } -sub username_formats_row { - my ($settings,$rules,$ruleorder,$numinrow) = @_; - my $output = ''. - ''. - &mt('Format rules to check for new usernames: '). - ''. - ''; +sub user_formats_row { + my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_; + my $output; + my %text = ( + 'username' => 'new usernames', + 'id' => 'IDs', + ); + my $css_class = $rowcount%2?' class="LC_odd_row"':''; + $output = ''. + ''. + '
'. + &mt("Format rules to check for $text{$type}: "). + ''; my $rem; if (ref($ruleorder) eq 'ARRAY') { for (my $i=0; $i<@{$ruleorder}; $i++) { @@ -1388,14 +1412,14 @@ sub username_formats_row { $output .= ''; } my $check = ' '; - if (ref($settings->{'username_rule'}) eq 'ARRAY') { - if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{'username_rule'}})) { + if (ref($settings->{$type.'_rule'}) eq 'ARRAY') { + if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}})) { $check = ' checked="checked" '; } } $output .= ''; } @@ -1432,6 +1456,96 @@ sub context_names { return %context_title; } +sub print_usermodification { + my ($position,$dom,$settings,$rowtotal) = @_; + my $numinrow = 4; + my ($context,$datatable,$rowcount); + if ($position eq 'top') { + $rowcount = 0; + $context = 'author'; + foreach my $role ('ca','aa') { + $datatable .= &modifiable_userdata_row($context,$role,$settings, + $numinrow,$rowcount); + $$rowtotal ++; + $rowcount ++; + } + } else { + $context = 'course'; + $rowcount = 0; + foreach my $role ('st','ep','ta','in','cr') { + $datatable .= &modifiable_userdata_row($context,$role,$settings, + $numinrow,$rowcount); + $$rowtotal ++; + $rowcount ++; + } + } + return $datatable; +} + +sub modifiable_userdata_row { + my ($context,$role,$settings,$numinrow,$rowcount) = @_; + my $rolename; + if ($role eq 'cr') { + $rolename = &mt('Custom role'); + } else { + $rolename = &Apache::lonnet::plaintext($role); + } + my @fields = ('lastname','firstname','middlename','generation', + 'permanentemail','id'); + my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); + my $output; + my $css_class = $rowcount%2?' class="LC_odd_row"':''; + $output = ''. + ''. + ''; + return $output; +} sub users_cansearch_row { my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle) = @_; @@ -2728,6 +2842,7 @@ sub modify_usercreation { course => 'adding users to a course', ); my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule'); + my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule'); my @cancreate = &Apache::loncommon::get_env_multiple('form.can_createuser'); if (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') { foreach my $type (@{$curr_usercreation{'cancreate'}}) { @@ -2758,6 +2873,21 @@ sub modify_usercreation { push(@{$changes{'username_rule'}},@username_rule); } + if (ref($curr_usercreation{'id_rule'}) eq 'ARRAY') { + foreach my $type (@{$curr_usercreation{'id_rule'}}) { + if (!grep(/^\Q$type\E$/,@id_rule)) { + push(@{$changes{'id_rule'}},$type); + } + } + foreach my $type (@id_rule) { + if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'id_rule'}})) { + push(@{$changes{'id_rule'}},$type); + } + } + } else { + push(@{$changes{'id_rule'}},@id_rule); + } + my @contexts = ('author','course','domain'); my @authtypes = ('int','krb4','krb5','loc'); my %authhash; @@ -2792,7 +2922,8 @@ sub modify_usercreation { usercreation => { cancreate => \@cancreate, username_rule => \@username_rule, - authtypes => \%authhash, + id_rule => \@id_rule, + authtypes => \%authhash, } ); @@ -2814,7 +2945,8 @@ sub modify_usercreation { } } if (ref($changes{'username_rule'}) eq 'ARRAY') { - my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom); + my ($rules,$ruleorder) = + &Apache::lonnet::inst_userrules($dom,'username'); my $chgtext = '
    '; foreach my $type (@username_rule) { if (ref($rules->{$type}) eq 'HASH') { @@ -2828,10 +2960,25 @@ sub modify_usercreation { $resulttext .= '
  • '.&mt('There are now no username formats restricted to verified users in the institutional directory.').'
  • '; } } + if (ref($changes{'id_rule'}) eq 'ARRAY') { + my ($idrules,$idruleorder) = + &Apache::lonnet::inst_userrules($dom,'id'); + my $chgtext = '
      '; + foreach my $type (@id_rule) { + if (ref($idrules->{$type}) eq 'HASH') { + $chgtext .= '
    • '.$idrules->{$type}{'name'}.'
    • '; + } + } + $chgtext .= '
    '; + if (@id_rule > 0) { + $resulttext .= '
  • '.&mt('IDs with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'
  • '; + } else { + $resulttext .= '
  • '.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'
  • '; + } + } my %authname = &authtype_names(); my %context_title = &context_names(); if (ref($changes{'authtypes'}) eq 'ARRAY') { - my @unchanged; my $chgtext = '
      '; foreach my $type (@{$changes{'authtypes'}}) { my @allowed; @@ -2853,6 +3000,106 @@ sub modify_usercreation { } } else { $resulttext = ''. + &mt('An error occurred: [_1]',$putresult).''; + } + return $resulttext; +} + +sub modify_usermodification { + my ($dom,%domconfig) = @_; + my ($resulttext,%curr_usermodification,%changes); + if (ref($domconfig{'usermodification'}) eq 'HASH') { + foreach my $key (keys(%{$domconfig{'usermodification'}})) { + $curr_usermodification{$key} = $domconfig{'usermodification'}{$key}; + } + } + my @contexts = ('author','course'); + my %context_title = ( + author => 'In author context', + course => 'In course context', + ); + my @fields = ('lastname','firstname','middlename','generation', + 'permanentemail','id'); + my %roles = ( + author => ['ca','aa'], + course => ['st','ep','ta','in','cr'], + ); + my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); + my %modifyhash; + foreach my $context (@contexts) { + foreach my $role (@{$roles{$context}}) { + my @modifiable = &Apache::loncommon::get_env_multiple('form.canmodify_'.$role); + foreach my $item (@fields) { + if (grep(/^\Q$item\E$/,@modifiable)) { + $modifyhash{$context}{$role}{$item} = 1; + } else { + $modifyhash{$context}{$role}{$item} = 0; + } + } + } + if (ref($curr_usermodification{$context}) eq 'HASH') { + foreach my $role (@{$roles{$context}}) { + if (ref($curr_usermodification{$context}{$role}) eq 'HASH') { + foreach my $field (@fields) { + if ($modifyhash{$context}{$role}{$field} ne + $curr_usermodification{$context}{$role}{$field}) { + push(@{$changes{$context}},$role); + last; + } + } + } + } + } else { + foreach my $context (@contexts) { + foreach my $role (@{$roles{$context}}) { + push(@{$changes{$context}},$role); + } + } + } + } + my %usermodification_hash = ( + usermodification => \%modifyhash, + ); + my $putresult = &Apache::lonnet::put_dom('configuration', + \%usermodification_hash,$dom); + if ($putresult eq 'ok') { + if (keys(%changes) > 0) { + $resulttext = &mt('Changes made: ').'
        '; + foreach my $context (@contexts) { + if (ref($changes{$context}) eq 'ARRAY') { + $resulttext .= '
      • '.$context_title{$context}.':
          '; + if (ref($changes{$context}) eq 'ARRAY') { + foreach my $role (@{$changes{$context}}) { + my $rolename; + if ($role eq 'cr') { + $rolename = &mt('Custom'); + } else { + $rolename = &Apache::lonnet::plaintext($role); + } + my @modifiable; + $resulttext .= '
        • '.&mt('Target user with [_1] role',$rolename).' - '.&mt('modifiable fields: '); + foreach my $field (@fields) { + if ($modifyhash{$context}{$role}{$field}) { + push(@modifiable,$fieldtitles{$field}); + } + } + if (@modifiable > 0) { + $resulttext .= join(', ',@modifiable); + } else { + $resulttext .= &mt('none'); + } + $resulttext .= '
        • '; + } + $resulttext .= '
      • '; + } + } + } + $resulttext .= '
      '; + } else { + $resulttext = &mt('No changes made to user modification settings'); + } + } else { + $resulttext = ''. &mt('An error occurred: [_1]',$putresult).''; } return $resulttext;
'. '
'.$rolename.''; + my $rem; + my %checks; + if (ref($settings) eq 'HASH') { + if (ref($settings->{$context}) eq 'HASH') { + if (ref($settings->{$context}->{$role}) eq 'HASH') { + foreach my $field (@fields) { + if ($settings->{$context}->{$role}->{$field}) { + $checks{$field} = ' checked="checked" '; + } + } + } + } + } + for (my $i=0; $i<@fields; $i++) { + my $rem = $i%($numinrow); + if ($rem == 0) { + if ($i > 0) { + $output .= ''; + } + $output .= ''; + } + my $check = ' '; + if (exists($checks{$fields[$i]})) { + $check = $checks{$fields[$i]} + } else { + if ($role eq 'st') { + if (ref($settings) ne 'HASH') { + $check = ' checked="checked" '; + } + } + } + $output .= ''; + $rem = @fields%($numinrow); + } + my $colsleft = $numinrow - $rem; + if ($colsleft > 1 ) { + $output .= ''; + } elsif ($colsleft == 1) { + $output .= ''; + } + $output .= '
'. + ''. + '