--- loncom/interface/lonuserutils.pm 2007/10/22 22:16:38 1.1 +++ loncom/interface/lonuserutils.pm 2007/12/05 17:53:13 1.9 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.1 2007/10/22 22:16:38 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.9 2007/12/05 17:53:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -35,7 +35,8 @@ use Apache::lonnet; use Apache::loncommon(); use Apache::lonhtmlcommon; use Apache::lonlocal; -use LONCAPA(); +use Apache::longroup; +use LONCAPA qw(:DEFAULT :match); ############################################################### ############################################################### @@ -85,28 +86,39 @@ sub modifystudent { sub modifyuserrole { my ($context,$setting,$changeauth,$cid,$udom,$uname,$uid,$umode,$upass, $first,$middle,$last,$gene,$sec,$forceid,$desiredhome,$email,$role, - $end,$start) = @_; - my ($scope,$userresult,$authresult,$roleresult); + $end,$start,$checkid) = @_; + my ($scope,$userresult,$authresult,$roleresult,$idresult); if ($setting eq 'course' || $context eq 'course') { $scope = '/'.$cid; $scope =~ s/\_/\//g; if ($role ne 'cc' && $sec ne '') { $scope .='/'.$sec; } - } elsif ($setting eq 'domain') { + } elsif ($context eq 'domain') { $scope = '/'.$env{'request.role.domain'}.'/'; - } elsif ($setting eq 'construction_space') { + } elsif ($context eq 'construction_space') { $scope = '/'.$env{'user.domain'}.'/'.$env{'user.name'}; } if ($context eq 'domain') { my $uhome = &Apache::lonnet::homeserver($uname,$udom); if ($uhome ne 'no_host') { - if (($changeauth) && (&Apache::lonnet::allowed('mau',$udom))) { + if (($changeauth eq 'Yes') && (&Apache::lonnet::allowed('mau',$udom))) { if ((($umode =~ /^krb4|krb5|internal$/) && $upass ne '') || ($umode eq 'localauth')) { $authresult = &Apache::lonnet::modifyuserauth($udom,$uname,$umode,$upass); } } + if (($forceid) && (&Apache::lonnet::allowed('mau',$udom)) && + ($env{'form.recurseid'}) && ($checkid)) { + my %userupdate = ( + lastname => $last, + middlename => $middle, + firstname => $first, + generation => $gene, + id => $uid, + ); + $idresult = &propagate_id_change($uname,$udom,\%userupdate); + } } } $userresult = @@ -114,42 +126,127 @@ sub modifyuserrole { $middle,$last,$gene,$forceid,$desiredhome, $email,$role,$start,$end); if ($userresult eq 'ok') { - if ($role ne '') { + if ($role ne '') { $roleresult = &Apache::lonnet::assignrole($udom,$uname,$scope, $role,$end,$start); } } - return ($userresult,$authresult,$roleresult); + return ($userresult,$authresult,$roleresult,$idresult); } +sub propagate_id_change { + my ($uname,$udom,$user) = @_; + my (@types,@roles,@cdoms); + @types = ('active','future'); + @roles = ('st'); + my $idresult; + my %roleshash = &Apache::lonnet::get_my_roles($uname, + $udom,'userroles',\@types,\@roles,\@cdoms); + foreach my $item (keys(%roleshash)) { + my ($cnum,$cdom,$role) = split(/:/,$item); + my ($start,$end) = split(/:/,$roleshash{$item}); + if (&Apache::lonnet::is_course($cdom,$cnum)) { + my %userupdate; + my $result = &update_classlist($cdom,$cnum,$udom,$uname,\%userupdate); + if ($result eq 'ok') { + $idresult .= "Classlist change: $uname:$udom - class -> $cnum:$cdom\n"; + } else { + $idresult .= "Error - $result -during classlist update for $uname:$udom in $cnum:$cdom\n"; + } + } + } + return $idresult; +} + +sub update_classlist { + my ($cdom,$cnum,$udom,$uname,$user) = @_; + my ($uid,$classlistentry); + my $fullname = + &Apache::lonnet::format_name($user->{'firstname'},$user->{'middlename'}, + $user->{'lastname'},$user->{'generation'}, + 'lastname'); + my %classhash = &Apache::lonnet::get('classlist',[$uname.':'.$udom], + $cdom,$cnum); + my @classinfo = split(/:/,$classhash{$uname.':'.$udom}); + my $ididx=&Apache::loncoursedata::CL_ID() - 2; + my $nameidx=&Apache::loncoursedata::CL_FULLNAME() - 2; + for (my $i=0; $i<@classinfo; $i++) { + if ($i == $ididx) { + if (defined($user->{'id'})) { + $classlistentry .= $user->{'id'}.':'; + } else { + $classlistentry .= $classinfo[$i].':'; + } + } elsif ($i == $nameidx) { + $classlistentry .= $fullname.':'; + } else { + $classlistentry .= $classinfo[$i].':'; + } + } + $classlistentry =~ s/:$//; + my $reply=&Apache::lonnet::cput('classlist', + {"$uname:$udom" => $classlistentry}, + $cdom,$cnum); + if (($reply eq 'ok') || ($reply eq 'delayed')) { + return 'ok'; + } else { + return 'error: '.$reply; + } +} + + ############################################################### ############################################################### -# build a domain and server selection form -sub domain_form { - my ($defdom) = @_; - # Set up domain and server selection forms +# build a role type and role selection form +sub domain_roles_select { + # Set up the role type and role selection boxes when in + # domain context + # + # Role types + my @roletypes = ('domain','construction_space','course'); + my %lt = &role_type_names(); # - # Get the domains - my @domains = &Apache::lonnet::all_domains(); # build up the menu information to be passed to # &Apache::loncommon::linked_select_forms my %select_menus; - foreach my $dom (@domains) { + if ($env{'form.roletype'} eq '') { + $env{'form.roletype'} = 'domain'; + } + foreach my $roletype (@roletypes) { # set up the text for this domain - $select_menus{$dom}->{'text'}= $dom; + $select_menus{$roletype}->{'text'}= $lt{$roletype}; # we want a choice of 'default' as the default in the second menu - $select_menus{$dom}->{'default'}= 'default'; - $select_menus{$dom}->{'select2'}->{'default'} = 'default'; + if ($env{'form.roletype'} ne '') { + $select_menus{$roletype}->{'default'} = $env{'form.showrole'}; + } else { + $select_menus{$roletype}->{'default'} = 'Any'; + } # Now build up the other items in the second menu - my %servers = &Apache::lonnet::get_servers($dom,'library'); - foreach my $server (keys(%servers)) { - $select_menus{$dom}->{'select2'}->{$server} - = "$server $servers{$server}"; + my @roles; + if ($roletype eq 'domain') { + @roles = &domain_roles(); + } elsif ($roletype eq 'construction_space') { + @roles = &construction_space_roles(); + } else { + @roles = &course_roles('domain'); + unshift(@roles,'cr'); + } + my $order = ['Any',@roles]; + $select_menus{$roletype}->{'order'} = $order; + foreach my $role (@roles) { + if ($role eq 'cr') { + $select_menus{$roletype}->{'select2'}->{$role} = + &mt('Custom role'); + } else { + $select_menus{$roletype}->{'select2'}->{$role} = + &Apache::lonnet::plaintext($role); + } } + $select_menus{$roletype}->{'select2'}->{'Any'} = &mt('Any'); } - my $result = &Apache::loncommon::linked_select_forms - ('studentform',' with home server ',$defdom, - 'lcdomain','lcserver',\%select_menus); + my $result = &Apache::loncommon::linked_select_forms + ('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'}, + 'roletype','showrole',\%select_menus,['domain','construction_space','course']); return $result; } @@ -616,11 +713,15 @@ sub print_upload_manager_footer { &mt('Role and/or section for users without one in the uploaded file.'); } $Str .= '

'; - my ($options,$cb_script,$coursepick) = &default_role_selector($context); + my ($options,$cb_script,$coursepick) = &default_role_selector($context,'defaultrole',1); if ($context eq 'domain') { $Str .= ''.&mt('Domain Level').'
'.$options.'

'.&mt('Course Level').'
'.$cb_script.$coursepick; - } else { + } elsif ($context eq 'construction_space') { $Str .= $options; + } else { + $Str .= '
'.&mt('role').': '. + $options.' '. + ''.&mt('section').': 
'; } if ($context eq 'course') { $Str .= "

".&mt('Full Update')."

\n". @@ -628,12 +729,9 @@ sub print_upload_manager_footer { ' '.&mt('Full update (also print list of users not enrolled anymore)'). "

\n"; } - $Str .= "

".&mt('ID/Student Number')."

\n"; - $Str .= "

\n".'
'."\n". - &mt('(only do if you know what you are doing.)')."

\n"; + if ($context eq 'course' || $context eq 'domain') { + $Str .= &forceid_change($context); + } $Str .= '