--- loncom/interface/lonuserutils.pm 2007/11/10 22:18:09 1.4 +++ loncom/interface/lonuserutils.pm 2007/11/15 21:24:51 1.5 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.4 2007/11/10 22:18:09 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.5 2007/11/15 21:24:51 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -85,28 +85,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,14 +125,75 @@ 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,$fullname,$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 role type and role selection form @@ -156,12 +228,18 @@ sub domain_roles_select { @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) { - $select_menus{$roletype}->{'select2'}->{$role} = - &Apache::lonnet::plaintext($role); + 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'); } @@ -637,8 +715,12 @@ sub print_upload_manager_footer { 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". @@ -646,12 +728,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 .= '