--- loncom/interface/lonuserutils.pm 2007/11/06 04:39:19 1.2 +++ 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.2 2007/11/06 04:39:19 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 .= '<span class="LC_role_level">'.&mt('Domain Level').'</span><br />'.$options.'<br /><br /><span class="LC_role_level">'.&mt('Course Level').'</span><br />'.$cb_script.$coursepick; - } else { + } elsif ($context eq 'construction_space') { $Str .= $options; + } else { + $Str .= '<table><tr><td><span class="LC_nobreak"<b>'.&mt('role').': </b>'. + $options.'</span></td><td> </td><td><span class="LC_nobreak">'. + '<b>'.&mt('section').': </b><input type="text" name="section" value="" size="12" /></span></td></tr></table>'; } if ($context eq 'course') { $Str .= "<h3>".&mt('Full Update')."</h3>\n". @@ -646,12 +728,9 @@ sub print_upload_manager_footer { ' '.&mt('Full update (also print list of users not enrolled anymore)'). "</label></p>\n"; } - $Str .= "<h3>".&mt('ID/Student Number')."</h3>\n"; - $Str .= "<p>\n".'<label><input type="checkbox" name="forceid" value="yes">'; - $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '. - 'of Conflicting IDs'). - '</label><br />'."\n". - &mt('(only do if you know what you are doing.)')."</p><p>\n"; + if ($context eq 'course' || $context eq 'domain') { + $Str .= &forceid_change($context); + } $Str .= '</div><div class="LC_clear_float_footer"><br /><input type="button"'. 'onClick="javascript:verify(this.form,this.form.csec)" '. 'value="Update Users" />'."<br />\n"; @@ -664,6 +743,23 @@ sub print_upload_manager_footer { return; } +sub forceid_change { + my ($context) = @_; + my $output = + "<h3>".&mt('ID/Student Number')."</h3>\n". + "<p>\n".'<label><input type="checkbox" name="forceid" value="yes">'. + &mt('Disable ID/Student Number Safeguard and Force Change '. + 'of Conflicting IDs').'</label><br />'."\n". + &mt('(only do if you know what you are doing.)')."</br><br />\n"; + if ($context eq 'domain') { + $output .= '<label><input type="checkbox" name="recurseid"'. + ' value="yes">'. + &mt('Update ID/Student Number in courses in which user is an Active or Future student, (if forcing change).'). + '</label></p>'."\n"; + } + return $output; +} + ############################################################### ############################################################### sub print_upload_manager_form { @@ -1130,23 +1226,36 @@ sub print_userlist { } my ($indexhash,$keylist) = &make_keylist_array(); my (%userlist,%userinfo); + if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { + my $courseform = + &Apache::lonhtmlcommon::course_selection($formname,$totcodes, + $codetitles,$idlist,$idlist_titles); + $r->print('<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n". + &Apache::lonhtmlcommon::start_pick_box()."\n". + &Apache::lonhtmlcommon::row_title(&mt('Select Course(s)'), + 'LC_oddrow_value')."\n". + $courseform."\n". + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::end_pick_box().'</p>'. + '<p>'.&list_submit_button(&mt('Update Display')). + "\n</p>\n"); + } + $r->print('<hr />'.&mt('Searching').' ...<br /> <br />'); + $r->rflush(); if ($context eq 'course') { - # - # Print the userlist - $r->print('<h2>'.&mt('Current User List').'</h2>'); - (my $classlist,$keylist)=&Apache::loncoursedata::get_classlist(); - - if (exists($permission->{'view_section'})) { - my $sec = &Apache::loncoursedata::CL_SECTION(); - foreach my $student (keys(%{$classlist})) { - if ($userlist{$student}[$sec] ne $permission->{'view_section'}) { - delete($userlist{$student}); + my $classlist = &Apache::loncoursedata::get_classlist(); + my $secidx = &Apache::loncoursedata::CL_SECTION(); + foreach my $student (keys(%{$classlist})) { + if (exists($permission->{'view_section'})) { + if ($classlist->{$student}[$secidx] ne $permission->{'view_section'}) { + next; + } else { + $userlist{$student} = $classlist->{$student}; } + } else { + $userlist{$student} = $classlist->{$student}; } } - foreach my $item (keys(%{$classlist})) { - $userlist{$item} = $classlist->{$item}; - } my $cid =$env{'request.course.id'}; my $cdom=$env{'course.'.$cid.'.domain'}; my $cnum=$env{'course.'.$cid.'.num'}; @@ -1206,19 +1315,6 @@ sub print_userlist { } } } elsif ($env{'form.roletype'} eq 'course') { - my $courseform = - &Apache::lonhtmlcommon::course_selection($formname,$totcodes, - $codetitles,$idlist,$idlist_titles); - my $output='<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n". - &Apache::lonhtmlcommon::start_pick_box()."\n". - &Apache::lonhtmlcommon::row_title(&mt('Select Course(s)'), - 'LC_oddrow_value')."\n". - $courseform."\n". - &Apache::lonhtmlcommon::row_closure(1). - &Apache::lonhtmlcommon::end_pick_box().'</p>'; - $r->print($output); - $r->print('<p>'.&list_submit_button(&mt('Update Display')). - "\n</p>\n"); if ($env{'form.coursepick'}) { my %courses = &process_coursepick(); my %allusers; @@ -1232,6 +1328,7 @@ sub print_userlist { %users,%statushash); if ($env{'form.showrole'} eq 'Any') { @roles = &course_roles($context); + unshift(@roles,'cr'); } else { @roles = ($env{'form.showrole'}); } @@ -1264,29 +1361,33 @@ sub print_userlist { } } } - if (keys(%userlist) == 0) { - if ($context eq 'construction_space') { - $r->print(&mt('There are no co-authors to display.')."\n"); - } elsif ($context eq 'domain') { - if ($env{'form.roletype'} eq 'domain') { - $r->print(&mt('There are no users with domain roles to display.')."\n"); - } elsif ($env{'form.roletype'} eq 'construction_space') { - $r->print(&mt('There are no authors or co-authors to display.')."\n"); - } elsif ($env{'form.roletype'} eq 'course') { - $r->print(&mt('There are no course users to display')."\n"); - } - } elsif ($context eq 'course') { - $r->print(&mt('There are no course users to display.')."\n"); + } + if (keys(%userlist) == 0) { + if ($context eq 'construction_space') { + $r->print(&mt('There are no co-authors to display.')."\n"); + } elsif ($context eq 'domain') { + if ($env{'form.roletype'} eq 'domain') { + $r->print(&mt('There are no users with domain roles to display.')."\n"); + } elsif ($env{'form.roletype'} eq 'construction_space') { + $r->print(&mt('There are no authors or co-authors to display.')."\n"); + } elsif ($env{'form.roletype'} eq 'course') { + $r->print(&mt('There are no course users to display')."\n"); } - } else { - # Print out the available choices - if ($env{'form.action'} eq 'modifystudent') { - &show_users_list($r,$context,'view','modify', - $env{'form.Status'},\%userlist,$keylist); - } else { - &show_users_list($r,$context,$env{'form.output'},'aboutme', + } elsif ($context eq 'course') { + $r->print(&mt('There are no course users to display.')."\n"); + } + } else { + # Print out the available choices + my $usercount; + if ($env{'form.action'} eq 'modifystudent') { + ($usercount) = &show_users_list($r,$context,'view','modify', $env{'form.Status'},\%userlist,$keylist); - } + } else { + ($usercount) = &show_users_list($r,$context,$env{'form.output'}, + 'aboutme',$env{'form.Status'},\%userlist,$keylist); + } + if (!$usercount) { + $r->print('<br />'.&mt('There are no users matching the search criteria.')); } } $r->print('</form>'); @@ -1603,14 +1704,14 @@ sub show_users_list { my ($CSVfile,$CSVfilename); # my $sortby = $env{'form.sortby'}; + my @sortable = ('username','domain','id','fullname','start','end','email','role'); if ($context eq 'course') { - if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end|type)$/) { - $sortby = 'username'; - } + push(@sortable,('section','groups','type')); } else { - if ($sortby !~ /^(username|domain|id|fullname|start|end|role|email|extent)$/) { - $sortby = 'username'; - } + push(@sortable,'extent'); + } + if (!grep(/^\Q$sortby\E$/,@sortable)) { + $sortby = 'username'; } my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers); if ($context eq 'course') { @@ -1683,7 +1784,7 @@ END if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) { push(@cols,('start','end')); } - if ($env{'form.showrole'} eq 'Any') { + if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') { push(@cols,'role'); } if ($context eq 'domain' && ($env{'form.roletype'} eq 'construction_space' || @@ -1699,76 +1800,78 @@ END } push(@cols,'email'); - my $rolefilter; - if ($env{'form.showrole'} ne 'Any') { + my $rolefilter = $env{'form.showrole'}; + if ($env{'form.showrole'} eq 'cr') { + $rolefilter = &mt('custom'); + } elsif ($env{'form.showrole'} ne 'Any') { $rolefilter = &Apache::lonnet::plaintext($env{'form.showrole'}); } my $results_description = &results_header_row($rolefilter,$statusmode, $context); - + $r->print('<b>'.$results_description.'</b><br />'); + my $output; if ($mode eq 'html' || $mode eq 'view') { - $r->print('<hr />'.&mt('Searching').' ...<br /> <br />'); - $r->rflush(); - $r->print('<b>'.$results_description.'</b><br />'); - if ($linkto eq 'aboutme') { - $r->print(&mt("Select a user name to view the user's personal page.")); - } elsif ($linkto eq 'modify') { - $r->print(&mt("Select a user name to modify the user's information")); - } $r->print(<<END); <input type="hidden" name="sname" value="" /> <input type="hidden" name="sdom" value="" /> END - $r->print("\n<p>\n". + if ($linkto eq 'aboutme') { + $output = &mt("Select a user name to view the user's personal page."); + } elsif ($linkto eq 'modify') { + $output = &mt("Select a user name to modify the user's information"); + } + $output .= "\n<p>\n". &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row()); + &Apache::loncommon::start_data_table_header_row(); if ($mode eq 'autoenroll') { - $r->print(" + $output .= " <th><a href=\"javascript:document.studentform.sortby.value='type';document.studentform.submit();\">$lt{'type'}</a></th> - "); + "; } else { - $r->print(" + $output .= " <th>Count</th> - "); + "; } foreach my $item (@cols) { - $r->print("<th><a href=\"javascript:document.studentform.sortby.value='$item';document.studentform.submit();\">$lt{$item}</a></th>\n"); + $output .= "<th><a href=\"javascript:document.studentform.sortby.value='$item';document.studentform.submit();\">$lt{$item}</a></th>\n"; } my %role_types = &role_type_names(); if ($context eq 'course') { - # Clicker display on or off? - my %clicker_options = &Apache::lonlocal::texthash( - 'on' => 'Show', - 'off' => 'Hide', - ); - my $clickerchg = 'on'; - if ($displayclickers eq 'on') { - $clickerchg = 'off'; - } - $r->print(' <th>'."\n".' '. - '<a href="javascript:document.studentform.displayclickers.value='. + if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { + # Clicker display on or off? + my %clicker_options = &Apache::lonlocal::texthash( + 'on' => 'Show', + 'off' => 'Hide', + ); + my $clickerchg = 'on'; + if ($displayclickers eq 'on') { + $clickerchg = 'off'; + } + $output .= ' <th>'."\n".' '. + '<a href="javascript:document.studentform.displayclickers.value='. "'".$clickerchg."'".';document.studentform.submit();">'. $clicker_options{$clickerchg}.'</a> '.$lt{'clicker'}."\n". - ' </th>'."\n"); + ' </th>'."\n"; - # Photo display on or off? - if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { - my %photo_options = &Apache::lonlocal::texthash( - 'on' => 'Show', - 'off' => 'Hide', - ); - my $photochg = 'on'; - if ($displayphotos eq 'on') { - $photochg = 'off'; - } - $r->print(' <th>'."\n".' '. - '<a href="javascript:document.studentform.displayphotos.value='. + # Photo display on or off? + if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { + my %photo_options = &Apache::lonlocal::texthash( + 'on' => 'Show', + 'off' => 'Hide', + ); + my $photochg = 'on'; + if ($displayphotos eq 'on') { + $photochg = 'off'; + } + $output .= ' <th>'."\n".' '. + '<a href="javascript:document.studentform.displayphotos.value='. "'".$photochg."'".';document.studentform.submit();">'. $photo_options{$photochg}.'</a> '.$lt{'photo'}."\n". - ' </th>'."\n"); + ' </th>'."\n"; + } } - $r->print(&Apache::loncommon::end_data_table_header_row()); - } + $output .= &Apache::loncommon::end_data_table_header_row(); + } # Done with the HTML header line } elsif ($mode eq 'csv') { # @@ -1808,10 +1911,16 @@ END foreach my $idx (@$keylist) { $index{$idx} = $i++; } + my $usercount = 0; # Get groups, role, permanent e-mail so we can sort on them if # necessary. foreach my $user (keys(%{$userlist})) { my ($uname,$udom,$role,$groups,$email); + if (($statusmode ne 'Any') && + ($userlist->{$user}->[$index{'status'}] ne $statusmode)) { + delete($userlist->{$user}); + next; + } if ($context eq 'domain') { if ($env{'form.roletype'} eq 'domain') { ($role,$uname,$udom) = split(/:/,$user); @@ -1842,8 +1951,21 @@ END if ($emails{'permanentemail'} =~ /\S/) { $userlist->{$user}->[$index{'email'}] = $emails{'permanentemail'}; } + $usercount ++; + } + my $autocount = 0; + my $manualcount = 0; + my $lockcount = 0; + my $unlockcount = 0; + if ($usercount) { + $r->print($output); + } else { + if ($mode eq 'autoenroll') { + return ($usercount,$autocount,$manualcount,$lockcount,$unlockcount); + } else { + return; + } } - # # Sort the users my $index = $index{$sortby}; @@ -1855,18 +1977,14 @@ END lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second]) || lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third]) } (keys(%$userlist)); - my $usercount = 0; - my $autocount = 0; - my $manualcount = 0; - my $lockcount = 0; - my $unlockcount = 0; + my $rowcount = 0; foreach my $user (@sorted_users) { - my $sdata = $userlist->{$user}; my %in; + my $sdata = $userlist->{$user}; + $rowcount ++; foreach my $item (@{$keylist}) { $in{$item} = $sdata->[$index{$item}]; } - next if (($statusmode ne 'Any') && ($in{'status'} ne $statusmode)); $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}]); if (! defined($in{'start'}) || $in{'start'} == 0) { $in{'start'} = &mt('none'); @@ -1878,10 +1996,9 @@ END } else { $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'}); } - $usercount ++; if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { $r->print(&Apache::loncommon::start_data_table_row()); - $r->print("<td>$usercount</td>\n"); + $r->print("<td>$rowcount</td>\n"); if ($linkto eq 'aboutme') { $in{'username'} = &Apache::loncommon::aboutmewrapper($in{'username'}, @@ -1900,23 +2017,25 @@ END $r->print('<td>'.$in{$item}.'</td>'."\n"); } if ($context eq 'course') { - if ($displayclickers eq 'on') { - my $clickers = + if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { + if ($displayclickers eq 'on') { + my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1]; - if ($clickers!~/\w/) { $clickers='-'; } - $r->print('<td>'.$clickers.'</td>'); - } else { - $r->print(' <td> </td> '); - } - if ($displayphotos eq 'on') { - if ($env{'course.'.$env{'request.course.id'}. - '.internal.showphoto'}) { - my $imgurl = - &Apache::lonnet::retrievestudentphoto($in{'domain'},$in{'username'},'gif','thumbnail'); - $r->print(' <td align="right"><a href="javascript:photowindow('."'".&Apache::lonnet::studentphoto($in{'domain'},$in{'username'},'jpg')."'".')"><img src="'.$imgurl.'" border="1"></a></td>'); + if ($clickers!~/\w/) { $clickers='-'; } + $r->print('<td>'.$clickers.'</td>'); } else { $r->print(' <td> </td> '); } + if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { + if ($displayphotos eq 'on' && $sdata->[$index{'role'}] eq 'st') { + my $imgurl = + &Apache::lonnet::retrievestudentphoto($in{'domain'},$in{'username'}, + 'gif','thumbnail'); + $r->print(' <td align="right"><a href="javascript:photowindow('."'".&Apache::lonnet::studentphoto($in{'domain'},$in{'username'},'jpg')."'".')"><img src="'.$imgurl.'" border="1"></a></td>'); + } else { + $r->print(' <td> </td> '); + } + } } } $r->print(&Apache::loncommon::end_data_table_row()); @@ -1971,8 +2090,9 @@ END } if ($mode eq 'autoenroll') { return ($usercount,$autocount,$manualcount,$lockcount,$unlockcount); + } else { + return ($usercount); } - return; } sub role_type_names { @@ -1986,16 +2106,19 @@ sub role_type_names { sub results_header_row { my ($rolefilter,$statusmode,$context) = @_; - my $description; + my ($description,$showfilter); + if ($rolefilter ne 'Any') { + $showfilter = $rolefilter; + } if ($context eq 'course') { - $description = &mt('Course - ').$env{'course.'.env{'request.course.id'}.'.description'}.': '; + $description = &mt('Course - ').$env{'course.'.$env{'request.course.id'}.'.description'}.': '; if ($statusmode eq 'Expired') { - $description .= &mt('Users in course with expired [_1] roles',$rolefilter); + $description .= &mt('Users in course with expired [_1] roles',$showfilter); } if ($statusmode eq 'Future') { - $description .= &mt('Users in course with future [_1] roles',$rolefilter); + $description .= &mt('Users in course with future [_1] roles',$showfilter); } elsif ($statusmode eq 'Active') { - $description .= &mt('Users in course with active [_1] roles',$rolefilter); + $description .= &mt('Users in course with active [_1] roles',$showfilter); } else { if ($rolefilter eq 'Any') { $description .= &mt('All users in course'); @@ -2006,14 +2129,14 @@ sub results_header_row { } elsif ($context eq 'construction_space') { $description = &mt('Author space for [_1].').' '; if ($statusmode eq 'Expired') { - $description .= &mt('Co-authors with expired [_1] roles',$rolefilter); + $description .= &mt('Co-authors with expired [_1] roles',$showfilter); } elsif ($statusmode eq 'Future') { - $description .= &mt('Co-authors with future [_1] roles',$rolefilter); + $description .= &mt('Co-authors with future [_1] roles',$showfilter); } elsif ($statusmode eq 'Active') { - $description .= &mt('Co-authors with active [_1] roles',$rolefilter); + $description .= &mt('Co-authors with active [_1] roles',$showfilter); } else { if ($rolefilter eq 'Any') { - $description .= &mt('All co-authors',$rolefilter); + $description .= &mt('All co-authors'); } else { $description .= &mt('All co-authors with [_1] roles',$rolefilter); } @@ -2023,28 +2146,28 @@ sub results_header_row { $description = &mt('Domain - ').$domdesc.': '; if ($env{'form.roletype'} eq 'domain') { if ($statusmode eq 'Expired') { - $description .= &mt('Users in domain with expired [_1] roles',$rolefilter); + $description .= &mt('Users in domain with expired [_1] roles',$showfilter); } elsif ($statusmode eq 'Future') { - $description .= &mt('Users in domain with future [_1] roles',$rolefilter); + $description .= &mt('Users in domain with future [_1] roles',$showfilter); } elsif ($statusmode eq 'Active') { - $description .= &mt('Users in domain with active [_1] roles',$rolefilter); + $description .= &mt('Users in domain with active [_1] roles',$showfilter); } else { if ($rolefilter eq 'Any') { - $description .= &mt('All users in domain',$rolefilter); + $description .= &mt('All users in domain'); } else { $description .= &mt('All users in domain with [_1] roles',$rolefilter); } } } elsif ($env{'form.roletype'} eq 'construction_space') { if ($statusmode eq 'Expired') { - $description .= &mt('Co-authors in domain with expired [_1] roles',$rolefilter); + $description .= &mt('Co-authors in domain with expired [_1] roles',$showfilter); } elsif ($statusmode eq 'Future') { - $description .= &mt('Co-authors in domain with future [_1] roles',$rolefilter); + $description .= &mt('Co-authors in domain with future [_1] roles',$showfilter); } elsif ($statusmode eq 'Active') { - $description .= &mt('Co-authors in domain with active [_1] roles',$rolefilter); + $description .= &mt('Co-authors in domain with active [_1] roles',$showfilter); } else { if ($rolefilter eq 'Any') { - $description .= &mt('All users with co-author roles in domain',$rolefilter); + $description .= &mt('All users with co-author roles in domain',$showfilter); } else { $description .= &mt('All co-authors in domain with [_1] roles',$rolefilter); } @@ -2064,11 +2187,11 @@ sub results_header_row { $description .= &mt('All courses in domain').' - '; } if ($statusmode eq 'Expired') { - $description .= &mt('users with expired [_1] roles',$rolefilter); + $description .= &mt('users with expired [_1] roles',$showfilter); } elsif ($statusmode eq 'Future') { - $description .= &mt('users with future [_1] roles',$rolefilter); + $description .= &mt('users with future [_1] roles',$showfilter); } elsif ($statusmode eq 'Active') { - $description .= &mt('users with active [_1] roles',$rolefilter); + $description .= &mt('users with active [_1] roles',$showfilter); } else { if ($rolefilter eq 'Any') { $description .= &mt('all users'); @@ -2402,6 +2525,7 @@ sub upfile_drop_add { # Get information about course groups %curr_groups = &Apache::longroup::coursegroups(); } + my (%curr_rules,%got_rules,%alerts); # Get new users list foreach (@userdata) { my %entries=&Apache::loncommon::record_sep($_); @@ -2433,7 +2557,7 @@ sub upfile_drop_add { $entries{$fields{'username'}},$fname,$mname,$lname,$gen). '</b>'); } else { - my $username = $entries{$fields{'username'}}; + my $username = $entries{$fields{'username'}}; my $sec; if ($context eq 'course' || $setting eq 'course') { # determine section number @@ -2504,6 +2628,48 @@ sub upfile_drop_add { \$lname,\$gen,\$sec,\$role) { $$_ =~ s/(\s+$|^\s+)//g; } + # check against rules + my $checkid = 0; + my $newuser = 0; + my (%rulematch,%inst_results,%idinst_results); + my $uhome=&Apache::lonnet::homeserver($username,$domain); + if ($uhome eq 'no_host') { + $checkid = 1; + $newuser = 1; + my $checkhash; + my $checks = { 'username' => 1 }; + $checkhash->{$username.':'.$domain} = { 'newuser' => 1, }; + &Apache::loncommon::user_rule_check($checkhash,$checks, + \%alerts,\%rulematch,\%inst_results,\%curr_rules, + \%got_rules); + if (ref($alerts{'username'}) eq 'HASH') { + if (ref($alerts{'username'}{$domain}) eq 'HASH') { + next if ($alerts{'username'}{$domain}{$username}); + } + } + } + if ($id ne '') { + if (!$newuser) { + my %idhash = &Apache::lonnet::idrget($domain,($username)); + if ($idhash{$username} ne $id) { + $checkid = 1; + } + } + if ($checkid) { + my $checkhash; + my $checks = { 'id' => 1 }; + $checkhash->{$username.':'.$domain} = { 'newuser' => $newuser, + 'id' => $id }; + &Apache::loncommon::user_rule_check($checkhash,$checks, + \%alerts,\%rulematch,\%idinst_results,\%curr_rules, + \%got_rules); + if (ref($alerts{'id'}) eq 'HASH') { + if (ref($alerts{'id'}{$domain}) eq 'HASH') { + next if ($alerts{'id'}{$domain}{$id}); + } + } + } + } if ($password || $env{'form.login'} eq 'loc') { my ($userresult,$authresult,$roleresult); if ($role eq 'st') { @@ -2522,7 +2688,7 @@ sub upfile_drop_add { $id,$amode,$password,$fname, $mname,$lname,$gen,$sec, $env{'form.forceid'},$desiredhost, - $email,$role,$enddate,$startdate); + $email,$role,$enddate,$startdate,$checkid); } $flushc = &user_change_result($r,$userresult,$authresult, @@ -2547,9 +2713,7 @@ sub upfile_drop_add { } } # end of foreach (@userdata) # Flush the course logs so reverse user roles immediately updated - if ($context eq 'course' || ($context eq 'domain' && $setting eq 'course')) { - &Apache::lonnet::flushcourselogs(); - } + &Apache::lonnet::flushcourselogs(); $r->print("</p>\n<p>\n".&mt('Processed [_1] user(s).',$counts{'user'}). "</p>\n"); if ($counts{'role'} > 0) { @@ -2561,6 +2725,39 @@ sub upfile_drop_add { &mt('Authentication changed for [_1] existing users.', $counts{'auth'})."</p>\n"); } + if (keys(%alerts) > 0) { + if (ref($alerts{'username'}) eq 'HASH') { + foreach my $dom (sort(keys(%{$alerts{'username'}}))) { + my $count; + if (ref($alerts{'username'}{$dom}) eq 'HASH') { + $count = keys(%{$alerts{'username'}{$dom}}); + } + my $domdesc = &Apache::lonnet::domain($domain,'description'); + if (ref($curr_rules{$dom}) eq 'HASH') { + $r->print(&Apache::loncommon::instrule_disallow_msg( + 'username',$domdesc,$count,'upload')); + } + $r->print(&Apache::loncommon::user_rule_formats($dom, + $domdesc,$curr_rules{$dom}{'username'}, + 'username')); + } + } + if (ref($alerts{'id'}) eq 'HASH') { + foreach my $dom (sort(keys(%{$alerts{'id'}}))) { + my $count; + if (ref($alerts{'id'}{$dom}) eq 'HASH') { + $count = keys(%{$alerts{'id'}{$dom}}); + } + my $domdesc = &Apache::lonnet::domain($domain,'description'); + if (ref($curr_rules{$dom}) eq 'HASH') { + $r->print(&Apache::loncommon::instrule_disallow_msg( + 'id',$domdesc,$count,'upload')); + } + $r->print(&Apache::loncommon::user_rule_formats($dom, + $domdesc,$curr_rules{$dom}{'id'},'id')); + } + } + } $r->print('<form name="uploadresult" action="/adm/createuser">'); $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','prevphase','currstate'])); $r->print('</form>');