--- loncom/interface/domainprefs.pm 2007/09/26 12:42:32 1.30 +++ loncom/interface/domainprefs.pm 2007/12/12 19:44:53 1.34 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.30 2007/09/26 12:42:32 raeburn Exp $ +# $Id: domainprefs.pm,v 1.34 2007/12/12 19:44:53 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', @@ -127,11 +127,21 @@ sub handler { 'usercreation' => { text => 'User creation', help => 'Domain_User_Creation', - header => [{col1 => 'Setting', - col2 => 'Value',}, + header => [{col1 => 'Format Rule Type', + col2 => 'Format Rules in force'}, + {col1 => 'User account creation', + col2 => 'Usernames which may be created',}, {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 +316,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 +339,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 +353,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); } @@ -360,7 +374,20 @@ sub print_config_box { if ($action eq 'autoupdate') { $output .= &print_autoupdate('bottom',$dom,$settings,\$rowtotal); } elsif ($action eq 'usercreation') { - $output .= &print_usercreation('bottom',$dom,$settings,\$rowtotal); + $output .= &print_usercreation('middle',$dom,$settings,\$rowtotal).' + + + + + + + + + '. + &print_usercreation('bottom',$dom,$settings,\$rowtotal); + $rowtotal ++; + } elsif ($action eq 'usermodification') { + $output .= &print_usermodification('bottom',$dom,$settings,\$rowtotal); } else { $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
'.$item->{'header'}->[2]->{'col1'}.''.$item->{'header'}->[2]->{'col2'}.'
@@ -460,18 +487,18 @@ function changePage(formname,newphase) { } elsif ($phase eq 'display') { $js .= &color_pick_js()."\n"; } - $js .= &Apache::lonhtmlcommon::javascript_window_dims().' + $js .= &Apache::loncommon::viewport_size_js().' '; my $additem; if ($phase eq 'pickactions') { my %loaditems = ( - 'onload' => "javascript:;getDimensions(document.$phase.width,document.$phase.height);setDisplayColumns();setFormElements(document.pickactions);", + 'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);setDisplayColumns();setFormElements(document.pickactions);", ); $additem = {'add_entries' => \%loaditems,}; } else { my %loaditems = ( - 'onload' => "javascript:getDimensions(document.$phase.width,document.$phase.height)", + 'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);", ); $additem = {'add_entries' => \%loaditems,}; } @@ -1056,14 +1083,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,39 +1309,71 @@ 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: ', - author => 'When adding a co-author/assistant author', - course => 'When adding users to a course', - ); if ($position eq 'top') { + $$rowtotal ++; + my $rowcount = 0; + my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom,'username'); + if (ref($rules) eq 'HASH') { + if (keys(%{$rules}) > 0) { + $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 ++; + } + } + } elsif ($position eq 'middle') { + my @creators = ('author','course'); + my %lt = &usercreation_types(); my %checked; if (ref($settings) eq 'HASH') { - if (ref($settings->{'cancreate'}) eq 'ARRAY') { - foreach my $item (@{$settings->{'cancreate'}}) { - $checked{$item} = ' checked="checked" '; + if (ref($settings->{'cancreate'}) eq 'HASH') { + foreach my $item (@creators) { + $checked{$item} = $settings->{'cancreate'}{$item}; + } + } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') { + foreach my $item (@creators) { + if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) { + $checked{$item} = 'none'; + } } } } - $datatable = ''. - ''.$lt{'nondc'}. - ''; - foreach my $item ('author','course') { - $datatable .= ''; - } - $datatable .= '
'; - $$rowtotal ++; - if (ref($rules) eq 'HASH') { - if (keys(%{$rules}) > 0) { - $datatable .= &username_formats_row($settings,$rules, - $ruleorder,$numinrow); - $$rowtotal ++; + my $rownum = 0; + foreach my $item (@creators) { + $rownum ++; + if ($checked{$item} eq '') { + $checked{$item} = 'any'; } + my $css_class; + if ($rownum%2) { + $css_class = ''; + } else { + $css_class = ' class="LC_odd_row" '; + } + $datatable .= ''. + ''.$lt{$item}. + ''; + foreach my $option ('any','official','unofficial','none') { + my $check = ' '; + if ($checked{$item} eq $option) { + $check = ' checked="checked" '; + } + $datatable .= '  '; + } + $datatable .= ''; } } else { my @contexts = ('author','course','domain'); @@ -1369,13 +1421,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 +1446,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 .= ''; } @@ -1413,6 +1471,18 @@ sub username_formats_row { return $output; } +sub usercreation_types { + my %lt = &Apache::lonlocal::texthash ( + author => 'When adding a co-author', + course => 'When adding a user to a course', + any => 'Any', + official => 'Institutional only ', + unofficial => 'Non-institutional only', + none => 'None', + ); + return %lt; +} + sub authtype_names { my %lt = &Apache::lonlocal::texthash( int => 'Internal', @@ -1432,6 +1502,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) = @_; @@ -2706,7 +2866,7 @@ sub modify_contacts { } $resulttext .= ''; } else { - $resulttext = &mt('No changes made to contact information.'); + $resulttext = &mt('No changes made to contact information'); } } else { $resulttext = ''. @@ -2717,7 +2877,7 @@ sub modify_contacts { sub modify_usercreation { my ($dom,%domconfig) = @_; - my ($resulttext,%curr_usercreation,%changes,%authallowed); + my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate); if (ref($domconfig{'usercreation'}) eq 'HASH') { foreach my $key (keys(%{$domconfig{'usercreation'}})) { $curr_usercreation{$key} = $domconfig{'usercreation'}{$key}; @@ -2728,21 +2888,35 @@ sub modify_usercreation { course => 'adding users to a course', ); my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule'); - my @cancreate = &Apache::loncommon::get_env_multiple('form.can_createuser'); - if (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') { - foreach my $type (@{$curr_usercreation{'cancreate'}}) { - if (!grep(/^\Q$type\E$/,@cancreate)) { - push(@{$changes{'cancreate'}},$type); - } + my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule'); + my @contexts = ('author','course'); + foreach my $item(@contexts) { + $cancreate{$item} = $env{'form.can_createuser_'.$item}; + } + if (ref($curr_usercreation{'cancreate'}) eq 'HASH') { + foreach my $item (@contexts) { + if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) { + push(@{$changes{'cancreate'}},$item); + } } - foreach my $type (@cancreate) { - if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'cancreate'}})) { - push(@{$changes{'cancreate'}},$type); + } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') { + foreach my $item (@contexts) { + if (grep(/^\Q$item\E$/,@{$curr_usercreation{'cancreate'}})) { + if ($cancreate{$item} ne 'any') { + push(@{$changes{'cancreate'}},$item); + } + } else { + if ($cancreate{$item} ne 'none') { + push(@{$changes{'cancreate'}},$item); + } } } } else { - push(@{$changes{'cancreate'}},@cancreate); + foreach my $item ('author','course') { + push(@{$changes{'cancreate'}},$item); + } } + if (ref($curr_usercreation{'username_rule'}) eq 'ARRAY') { foreach my $type (@{$curr_usercreation{'username_rule'}}) { if (!grep(/^\Q$type\E$/,@username_rule)) { @@ -2758,6 +2932,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; @@ -2790,9 +2979,10 @@ sub modify_usercreation { my %usercreation_hash = ( usercreation => { - cancreate => \@cancreate, + cancreate => \%cancreate, username_rule => \@username_rule, - authtypes => \%authhash, + id_rule => \@id_rule, + authtypes => \%authhash, } ); @@ -2802,19 +2992,24 @@ sub modify_usercreation { if (keys(%changes) > 0) { $resulttext = &mt('Changes made:').'
    '; if (ref($changes{'cancreate'}) eq 'ARRAY') { - my $chgtext = '
      '; - foreach my $type (@cancreate) { - $chgtext .= '
    • '.$title{$type}.'
    • '; - } - $chgtext .= '
    '; - if (@cancreate > 0) { - $resulttext .= '
  • '.&mt('Creation of new users is permitted by a Domain Coordinator, and also by other users when: ').$chgtext.'
  • '; - } else { - $resulttext .= '
  • '.&mt("Creation of new users is now only allowed when the user's role is Domain Coordinator.").'
  • '; + my %lt = &usercreation_types(); + foreach my $type (@{$changes{'cancreate'}}) { + my $chgtext; + if ($cancreate{$type} eq 'none') { + $chgtext = $lt{$type}.' '.&mt('creation of new users is not permitted, except by a Domain Coordinator.'); + } elsif ($cancreate{$type} eq 'any') { + $chgtext = $lt{$type}.' '.&mt('creation of new users is permitted for both institutional and non-institutional usernames.'); + } elsif ($cancreate{$type} eq 'official') { + $chgtext = $lt{$type}.' '.&mt('creation of new users is only permitted for institutional usernames.',$lt{$type}); + } elsif ($cancreate{$type} eq 'unofficial') { + $chgtext = $lt{$type}.' '.&mt('creation of new users is only permitted for non-institutional usernames.',$lt{$type}); + } + $resulttext .= '
  • '.$chgtext.'
  • '; } } 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 +3023,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 +3063,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 .= '
'. + ''. + '