--- loncom/interface/lonuserutils.pm 2025/01/12 23:34:20 1.223 +++ loncom/interface/lonuserutils.pm 2025/01/13 01:00:58 1.225 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.223 2025/01/12 23:34:20 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.225 2025/01/13 01:00:58 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -3518,7 +3518,7 @@ END Future => 'Future', Expired => 'Expired', ); - my (%crslogins,%camanagers); + my (%crslogins,%camanagers,%othdoms); if ($context eq 'course') { # If this is for a single course get last course "log-in". %crslogins=&Apache::lonnet::dump('nohist_crslastlogin',$cdom,$cnum); @@ -3536,6 +3536,10 @@ END } # Get groups, role, permanent e-mail so we can sort on them if # necessary. + # Compare user's domain with $env{'request.role.dom'}, and if + # different add to the domains for which to retrieve data on + # viewable user information, by institutional status, for users + # from "other" domains. foreach my $user (keys(%{$userlist})) { if ($user eq '' ) { delete($userlist->{$user}); @@ -3666,6 +3670,9 @@ END $userlist->{$user}->[$index{'authorquota'}] = sprintf("%.2f",$disk_quota); } } + unless ($env{'request.role.domain'} eq $udom) { + $othdoms{$udom} = 1; + } $usercount ++; } my $autocount = 0; @@ -3707,17 +3714,82 @@ END $disabled = ' disabled="disabled"'; } } + my (%shownfields_by_dom,%checkshown); + if (keys(%othdoms)) { + my @userinfo = ('firstname','middlename','lastname','generation', + 'permanentemail','id'); + foreach my $dom (keys(%othdoms)) { + my %shownfields = &get_othdom_shownfields($dom,\@userinfo); + $shownfields_by_dom{$dom} = \%shownfields; + } + foreach my $item (@userinfo) { + if ($item eq 'id') { + if (grep(/^\Q$item\E$/,@cols)) { + $checkshown{$item} = 1; + } + } elsif ($item eq 'permamentemail') { + if (grep(/^email$/,@cols)) { + $checkshown{$item} = 1; + } + } elsif (grep(/^fullname$/,@cols)) { + $checkshown{$item} = 1; + } + } + } foreach my $user (@sorted_users) { my %in; my $sdata = $userlist->{$user}; - $rowcount ++; + $rowcount ++; foreach my $item (@{$keylist}) { $in{$item} = $sdata->[$index{$item}]; } - if (grep(/^clicker$/,@cols)) { - my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1]; - if ($clickers!~/\w/) { $clickers='-'; } - $in{'clicker'} = $clickers; + if ((grep(/^clicker$/,@cols)) || (keys(%checkshown) && (exists($othdoms{$in{'domain'}})))) { + my %info = &Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers','inststatus', + 'firstname','middlename','lastname','generation'); + if (grep(/^clicker$/,@cols)) { + if ($info{'clickers'} !~/\w/) { $info{'clickers'} = '-'; } + $in{'clicker'} = $info{'clickers'}; + } + if (keys(%checkshown) && exists($othdoms{$in{'domain'}})) { + my @statuses; + if ($info{'inststatus'} ne '') { + @statuses = split(/:/,$info{'inststatus'}); + } else { + @statuses = ('default'); + } + if (ref($shownfields_by_dom{$in{'domain'}}) eq 'HASH') { + my (%shown,$rebuildname,%names); + foreach my $type (@statuses) { + if (ref($shownfields_by_dom{$in{'domain'}}{$type}) eq 'HASH') { + foreach my $key (keys(%{$shownfields_by_dom{$in{'domain'}}{$type}})) { + $shown{$key} = 1; + } + } + } + foreach my $item ('id','permanentemail') { + if ($checkshown{$item} && !$shown{$item}) { + if ($item eq 'permanentemail') { + $in{'email'} = &mt('not shown'); + } else { + $in{$item} = &mt('not shown'); + } + } + } + foreach my $item ('firstname','middlename','lastname','generation') { + if ($checkshown{$item} && !$shown{$item}) { + $rebuildname = 1; + } else { + $names{$item} = $info{$item}; + } + } + if ($rebuildname) { + $in{'fullname'} = &Apache::lonnet::format_name($names{'firstname'}, + $names{'middlename'}, + $names{'lastname'}, + $names{'generation'},'lastname'); + } + } + } } my $role = $in{'role'}; $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype); @@ -3842,8 +3914,8 @@ END if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { $r->print(''.$in{'clicker'}.''); } else { - $r->print(' '."\n"); - } + $r->print(' '."\n"); + } } } elsif (($item eq 'authorquota') || ($item eq 'authorusage')) { $r->print(''.$in{$item}.''."\n"); @@ -6699,6 +6771,10 @@ sub can_modify_userinfo { $canmodify{$field} = 0; if (&Apache::lonnet::allowed('mau',$dom)) { $canmodify{$field} = 1; + } elsif (($context ne 'selfcreate') && + ($env{'request.role.dom'} ne $dom) && + ($env{'user.domain'} ne $dom)) { + $canmodify{$field} = 0; } else { if (ref($domconfig{'usermodification'}) eq 'HASH') { if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') { @@ -7892,6 +7968,27 @@ sub adhoc_staff { return $output; } +sub get_othdom_shownfields { + my ($dom,$userinfo) = @_; + return unless (ref($userinfo) eq 'ARRAY'); + my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); + my @insttypes; + if (ref($domdefaults{'inststatustypes'}) eq 'HASH') { + @insttypes = keys(%{$domdefaults{'inststatustypes'}}); + } + push(@insttypes,'default'); + my %shownfields; + if (ref($domdefaults{'privacyothdom'}) eq 'HASH') { + %shownfields = %{$domdefaults{'privacyothdom'}}; + } else { + foreach my $type (@insttypes) { + foreach my $field (@{$userinfo}) { + $shownfields{$type}{$field} = 1; + } + } + } + return %shownfields; +} 1;