Diff for /loncom/interface/loncreateuser.pm between versions 1.254 and 1.269

version 1.254, 2008/07/13 09:53:16 version 1.269, 2008/12/15 00:12:38
Line 33  package Apache::loncreateuser; Line 33  package Apache::loncreateuser;
   
 =head1 NAME  =head1 NAME
   
 Apache::loncreateuser - handler to create users and custom roles  Apache::loncreateuser.pm
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 Apache::loncreateuser provides an Apache handler for creating users,      Handler to create users and custom roles
   
       Provides an Apache handler for creating users,
     editing their login parameters, roles, and removing roles, and      editing their login parameters, roles, and removing roles, and
     also creating and assigning custom roles.      also creating and assigning custom roles.
   
Line 120  sub auth_abbrev { Line 122  sub auth_abbrev {
 sub portfolio_quota {  sub portfolio_quota {
     my ($ccuname,$ccdomain) = @_;      my ($ccuname,$ccdomain) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                    'disk' => "Disk space allocated to user's portfolio files",                     'usrt'      => "User Tools",
                    'cuqu' => "Current quota",                     'blog'      => "Personal User Blog",
                    'cust' => "Custom quota",                     'aboutme'   => "Personal Information Page",
                    'defa' => "Default",                     'portfolio' => "Personal User Portfolio",
                    'chqu' => "Change quota",                     'avai'      => "Available",
                      'cusa'      => "availability",
                      'chse'      => "Change setting",
                      'disk'      => "Disk space allocated to user's portfolio files",
                      'cuqu'      => "Current quota",
                      'cust'      => "Custom quota",
                      'defa'      => "Default",
                      'usde'      => "Use default",
                      'uscu'      => "Use custom",
                      'chqu'      => "Change quota",
     );      );
     my ($currquota,$quotatype,$inststatus,$defquota) =       my ($currquota,$quotatype,$inststatus,$defquota) = 
         &Apache::loncommon::get_user_quota($ccuname,$ccdomain);          &Apache::loncommon::get_user_quota($ccuname,$ccdomain);
Line 173  END_SCRIPT Line 184  END_SCRIPT
                                " affiliation ([_2]).",$defquota,$longinsttype);                                 " affiliation ([_2]).",$defquota,$longinsttype);
         }          }
     }      }
     my $output = $quota_javascript.  
                  '<h3>'.$lt{'disk'}.'</h3>'.      my $output = $quota_javascript."\n".
                  &Apache::loncommon::start_data_table().                   '<h3>'.$lt{'usrt'}.'</h3>'."\n".
                  &Apache::loncommon::start_data_table_row().                   &Apache::loncommon::start_data_table();
                  '<td>'.$lt{'cuqu'}.': '.$currquota.'&nbsp;Mb.&nbsp;&nbsp;'.  
                  $defaultinfo.'</td>'.      if (&Apache::lonnet::allowed('mut',$ccdomain)) {
                  &Apache::loncommon::end_data_table_row().          my %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                  &Apache::loncommon::start_data_table_row().                            'tools.aboutme','tools.portfolio','tools.blog');
                  '<td><span class="LC_nobreak">'.$lt{'chqu'}.          my @usertools = ('aboutme','blog','portfolio');
                  ': <label>'.          foreach my $item (@usertools) {
                  '<input type="radio" name="customquota" value="0" '.              my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off);
                  $custom_off.' onchange="javascript:quota_changes('."'custom'".')"              $cust_off = 'checked="checked" ';
                   />'.$lt{'defa'}.'&nbsp;('.$defquota.' Mb).</label>&nbsp;'.              $tool_on = 'checked="checked" ';
                  '&nbsp;<label><input type="radio" name="customquota" value="1" '.               $curr_access = &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item);
                  $custom_on.'  onchange="javascript:quota_changes('."'custom'".')" />'.              if ($userenv{'tools.'.$item} eq '') {
                  $lt{'cust'}.':</label>&nbsp;'.                  $custom_access = 'default';
                  '<input type="text" name="portfolioquota" size ="5" value="'.                  if (!$curr_access) {
                  $showquota.'" onfocus="javascript:quota_changes('."'quota'".')" '.                      $tool_off = 'checked="checked" ';
                  '/>&nbsp;Mb</span></td>'.                      $tool_on = '';
                  &Apache::loncommon::end_data_table_row().                  }
                  &Apache::loncommon::end_data_table();              } else {
                   $custom_access = 'custom';
                   $cust_on = ' checked="checked" ';
                   $cust_off = '';
                   if ($userenv{'tools.'.$item} == 0) {
                       $tool_off = 'checked="checked" ';
                       $tool_on = '';
                   }
               }
               $curr_access = &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item);
               $output .= '  <tr class="LC_info_row">'."\n".
                          '   <td>'.$lt{$item}.'</td>'."\n".
                          '  </tr>'."\n".
                          &Apache::loncommon::start_data_table_row()."\n".
                          '  <td>'.&mt('Availability determined currently from [_1] setting.',$custom_access).
                          '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$lt{'avai'}.': '.
                          ($curr_access?&mt('Yes'):&mt('No')).'</td>'."\n".
                          &Apache::loncommon::end_data_table_row()."\n".
                          &Apache::loncommon::start_data_table_row()."\n".
                          '  <td><span class="LC_nobreak">'.$lt{'chse'}.': <label>'.
                          '<input type="radio" name="custom'.$item.'" value="0" '.
                          $cust_off.'/>'.$lt{'usde'}.'</label>&nbsp;&nbsp;&nbsp;'.
                          '<label><input type="radio" name="custom'.$item.'" value="1" '.
                          $cust_on.'/>'.$lt{'uscu'}.'</label>&nbsp;&nbsp;--&nbsp;&nbsp;'.
                          $lt{'cusa'}.':&nbsp;<label>'.
                          '<input type="radio" name="tools_'.$item.'" value="1" '.
                          $tool_on.'/>'.&mt('On').'</label>&nbsp;<label>'.
                          '<input type="radio" name="tools_'.$item.'" value="0" '.
                          $tool_off.'/>'.&mt('Off').'</label></span></td>'."\n".
                          &Apache::loncommon::end_data_table_row()."\n";
           }
       }
       if (&Apache::lonnet::allowed('mpq',$ccdomain)) {
           $output .= '<tr class="LC_info_row">'."\n".
                      '    <td>'.$lt{'disk'}.'</td>'."\n".
                      '  </tr>'."\n".
                      &Apache::loncommon::start_data_table_row()."\n".
                      '  <td>'.$lt{'cuqu'}.': '.
                      $currquota.'&nbsp;Mb.&nbsp;&nbsp;'.
                      $defaultinfo.'</td>'."\n".
                      &Apache::loncommon::end_data_table_row()."\n".
                      &Apache::loncommon::start_data_table_row()."\n".
                      '  <td><span class="LC_nobreak">'.$lt{'chqu'}.
                      ': <label>'.
                      '<input type="radio" name="customquota" value="0" '.
                      $custom_off.' onchange="javascript:quota_changes('."'custom'".')"'.
                      ' />'.$lt{'defa'}.'&nbsp;('.$defquota.' Mb).</label>&nbsp;'.
                      '&nbsp;<label><input type="radio" name="customquota" value="1" '. 
                      $custom_on.'  onchange="javascript:quota_changes('."'custom'".')" />'.
                      $lt{'cust'}.':</label>&nbsp;'.
                      '<input type="text" name="portfolioquota" size ="5" value="'.
                      $showquota.'" onfocus="javascript:quota_changes('."'quota'".')" '.
                      '/>&nbsp;Mb</span></td>'."\n".
                      &Apache::loncommon::end_data_table_row()."\n";
       }  
       $output .= &Apache::loncommon::end_data_table();
     return $output;      return $output;
 }  }
   
Line 649  ENDFORMINFO Line 715  ENDFORMINFO
     }      }
     if ($newuser) {      if ($newuser) {
         my $portfolioform;          my $portfolioform;
         if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {          if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) ||
             # Current user has quota modification privileges              (&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) {
               # Current user has quota or user tools modification privileges
             $portfolioform = '<br />'.&portfolio_quota($ccuname,$ccdomain);              $portfolioform = '<br />'.&portfolio_quota($ccuname,$ccdomain);
         }          }
         &initialize_authen_forms($ccdomain,$formname);          &initialize_authen_forms($ccdomain,$formname);
Line 775  ENDCHANGEUSER Line 842  ENDCHANGEUSER
         }          }
         $r->print('</div>');          $r->print('</div>');
         my $user_auth_text =  &user_authentication($ccuname,$ccdomain,$formname);          my $user_auth_text =  &user_authentication($ccuname,$ccdomain,$formname);
         my $user_quota_text;          my ($user_quota_text,$user_tools_text);
         if (&Apache::lonnet::allowed('mpq',$ccdomain)) {          if ((&Apache::lonnet::allowed('mpq',$ccdomain)) ||
               (&Apache::lonnet::allowed('mut',$ccdomain))) {
             # Current user has quota modification privileges              # Current user has quota modification privileges
             $user_quota_text = &portfolio_quota($ccuname,$ccdomain);              $user_quota_text = &portfolio_quota($ccuname,$ccdomain);
         } elsif (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {          }
             # Get the user's portfolio information          if (!&Apache::lonnet::allowed('mpq',$ccdomain)) {
             my %portq = &Apache::lonnet::get('environment',['portfolioquota'],              if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
                                              $ccdomain,$ccuname);                  # Get the user's portfolio information
                   my %portq = &Apache::lonnet::get('environment',['portfolioquota'],
             my %lt=&Apache::lonlocal::texthash(                                                   $ccdomain,$ccuname);
                 'dska'  => "Disk space allocated to user's portfolio files",                  my %lt=&Apache::lonlocal::texthash(
                 'youd'  => "You do not have privileges to modify the portfolio quota for this user.",                      'dska'  => "Disk space allocated to user's portfolio files",
                 'ichr'  => "If a change is required, contact a domain coordinator for the domain",                      'youd'  => "You do not have privileges to modify the portfolio quota for this user.",
             );                      'ichr'  => "If a change is required, contact a domain coordinator for the domain",
             $user_quota_text = <<ENDNOPORTPRIV;                  );
                   $user_quota_text = <<ENDNOPORTPRIV;
 <h3>$lt{'dska'}</h3>  <h3>$lt{'dska'}</h3>
 $lt{'youd'} $lt{'ichr'}: $ccdomain  $lt{'youd'} $lt{'ichr'}: $ccdomain
 ENDNOPORTPRIV  ENDNOPORTPRIV
               }
           }
           if (!&Apache::lonnet::allowed('mut',$ccdomain)) {
               if (&Apache::lonnet::allowed('mut',$env{'request.role.domain'})) {
                   my %lt=&Apache::lonlocal::texthash(
                       'utav'  => "User Tools Availability",
                       'yodo'  => "You do not have privileges to modify Portfolio, Blog or Home Page settings for this user.",
                       'ifch'  => "If a change is required, contact a domain coordinator for the domain",
                   );
                   $user_tools_text = <<ENDNOTOOLSPRIV;
   <h3>$lt{'utav'}</h3>
   $lt{'yodo'} $lt{'ifch'}: $ccdomain
   ENDNOTOOLSPRIV
               }
         }          }
         if ($user_auth_text ne '') {          if ($user_auth_text ne '') {
             $r->print('<div class="LC_left_float">'.$user_auth_text);              $r->print('<div class="LC_left_float">'.$user_auth_text);
             if ($user_quota_text ne '') {              if ($user_quota_text ne '') {
                 $r->print($user_quota_text);                  $r->print($user_quota_text);
             }              }
               if ($user_tools_text ne '') {
                   $r->print($user_tools_text);
               }
             if ($env{'form.action'} eq 'singlestudent') {              if ($env{'form.action'} eq 'singlestudent') {
                 $r->print(&date_sections_select($context,$newuser,$formname));                  $r->print(&date_sections_select($context,$newuser,$formname));
             }              }
         } elsif ($user_quota_text ne '') {          } elsif ($user_quota_text ne '') {
             $r->print('<div class="LC_left_float">'.$user_quota_text);              $r->print('<div class="LC_left_float">'.$user_quota_text);
               if ($user_tools_text ne '') {
                   $r->print($user_tools_text);
               }
               if ($env{'form.action'} eq 'singlestudent') {
                   $r->print(&date_sections_select($context,$newuser,$formname));
               }
           } elsif ($user_tools_text ne '') {
               $r->print('<div class="LC_left_float">'.$user_tools_text);
             if ($env{'form.action'} eq 'singlestudent') {              if ($env{'form.action'} eq 'singlestudent') {
                 $r->print(&date_sections_select($context,$newuser,$formname));                  $r->print(&date_sections_select($context,$newuser,$formname));
             }              }
Line 833  ENDNOPORTPRIV Line 927  ENDNOPORTPRIV
                 $addrolesdisplay = $add_domainroles;                  $addrolesdisplay = $add_domainroles;
             }              }
             $r->print(&course_level_dc($env{'request.role.domain'},'Course'));              $r->print(&course_level_dc($env{'request.role.domain'},'Course'));
             $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()" />'."\n");              $r->print('<br /><input type="button" value="'.&mt('Save').'" onClick="setCourse()" />'."\n");
         } elsif ($context eq 'author') {          } elsif ($context eq 'author') {
             if ($addrolesdisplay) {              if ($addrolesdisplay) {
                 $r->print('<br /><input type="button" value="'.&mt('Modify User').'"');                  $r->print('<br /><input type="button" value="'.&mt('Save').'"');
                 if ($newuser) {                  if ($newuser) {
                     $r->print(' onClick="auth_check()" \>'."\n");                      $r->print(' onClick="auth_check()" \>'."\n");
                 } else {                  } else {
Line 848  ENDNOPORTPRIV Line 942  ENDNOPORTPRIV
             }              }
         } else {          } else {
             $r->print(&course_level_table(%inccourses));              $r->print(&course_level_table(%inccourses));
             $r->print('<br /><input type="button" value="'.&mt('Modify User').'" onClick="setSections(this.form)" />'."\n");              $r->print('<br /><input type="button" value="'.&mt('Save').'" onClick="setSections(this.form)" />'."\n");
         }          }
     }      }
     $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));      $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
Line 967  sub display_existing_roles { Line 1061  sub display_existing_roles {
                 if (defined($coursedata{'description'})) {                  if (defined($coursedata{'description'})) {
                     $carea=$coursedata{'description'}.                      $carea=$coursedata{'description'}.
                         '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).                          '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
      &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);       &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);
                     $sortkey.="\0".$coursedata{'description'};                      $sortkey.="\0".$coursedata{'description'};
                     $class=$coursedata{'type'};                      $class=$coursedata{'type'};
                 } else {                  } else {
Line 1397  sub modify_login_block { Line 1491  sub modify_login_block {
   
 sub personal_data_display {  sub personal_data_display {
     my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray) = @_;      my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray) = @_;
     my ($output,$showforceid,%userenv,%canmodify,@inststatuses);      my ($output,$showforceid,%userenv,%canmodify);
     my @userinfo = ('firstname','middlename','lastname','generation',      my @userinfo = ('firstname','middlename','lastname','generation',
                     'permanentemail','id');                      'permanentemail','id');
     my $rowcount = 0;      my $rowcount = 0;
     my $editable = 0;      my $editable = 0;
     if ($context eq 'selfcreate') {  
         if (ref($inst_results) eq 'HASH') {  
             @inststatuses = &get_inststatuses($inst_results);  
             if (@inststatuses == 0) {  
                 @inststatuses = ('default');  
             }  
             $rolesarray = \@inststatuses;  
         }  
     }  
     if (!$newuser) {      if (!$newuser) {
         # Get the users information          # Get the users information
         %userenv = &Apache::lonnet::get('environment',          %userenv = &Apache::lonnet::get('environment',
                    ['firstname','middlename','lastname','generation',                     ['firstname','middlename','lastname','generation',
                     'permanentemail','id'],$ccdomain,$ccuname);                      'permanentemail','id'],$ccdomain,$ccuname);
     }  
     if ((!$newuser) || ($context eq 'selfcreate')) {  
         %canmodify =          %canmodify =
             &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,              &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
                                                        \@userinfo,$rolesarray);                                                         \@userinfo,$rolesarray);
       } elsif ($context eq 'selfcreate') {
           %canmodify = &selfcreate_canmodify($context,$ccdomain,\@userinfo,
                                              $inst_results,$rolesarray);
     }      }
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                 'pd'             => "Personal Data",                  'pd'             => "Personal Data",
Line 1429  sub personal_data_display { Line 1515  sub personal_data_display {
                 'lastname'       => "Last Name",                  'lastname'       => "Last Name",
                 'generation'     => "Generation",                  'generation'     => "Generation",
                 'permanentemail' => "Permanent e-mail address",                  'permanentemail' => "Permanent e-mail address",
                 'id'             => "ID/Student Number",                  'id'             => "Student/Employee ID",
                 'lg'             => "Login Data"                  'lg'             => "Login Data"
     );      );
     my %textboxsize = (      my %textboxsize = (
Line 1506  sub personal_data_display { Line 1592  sub personal_data_display {
     }      }
 }  }
   
   sub selfcreate_canmodify {
       my ($context,$dom,$userinfo,$inst_results,$rolesarray) = @_;
       if (ref($inst_results) eq 'HASH') {
           my @inststatuses = &get_inststatuses($inst_results);
           if (@inststatuses == 0) {
               @inststatuses = ('default');
           }
           $rolesarray = \@inststatuses;
       }
       my %canmodify =
           &Apache::lonuserutils::can_modify_userinfo($context,$dom,$userinfo,
                                                      $rolesarray);
       return %canmodify;
   }
   
 sub get_inststatuses {  sub get_inststatuses {
     my ($insthashref) = @_;      my ($insthashref) = @_;
     my @inststatuses = ();      my @inststatuses = ();
Line 1638  sub update_user_data { Line 1739  sub update_user_data {
     $r->print('<h3>'.&mt('User [_1] in domain [_2]',      $r->print('<h3>'.&mt('User [_1] in domain [_2]',
  $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');   $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');
     my (%alerts,%rulematch,%inst_results,%curr_rules);      my (%alerts,%rulematch,%inst_results,%curr_rules);
       my @usertools = ('aboutme','blog','portfolio');
     if ($env{'form.makeuser'}) {      if ($env{'form.makeuser'}) {
  $r->print('<h3>'.&mt('Creating new account.').'</h3>');   $r->print('<h3>'.&mt('Creating new account.').'</h3>');
         # Check for the authentication mode and password          # Check for the authentication mode and password
Line 1697  sub update_user_data { Line 1799  sub update_user_data {
  $r->print(&mt('Generating user').': '.$result);   $r->print(&mt('Generating user').': '.$result);
         $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'},          $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'},
                                                $env{'form.ccdomain'});                                                 $env{'form.ccdomain'});
         if (($uhome ne 'no_host') && ($env{'form.customquota'} == 1)) {          my (%changeHash,%newcustom,%changed);
             my (%changeHash,$newportfolioquota);          if ($uhome ne 'no_host') {
             if ($env{'form.portfolioquota'} eq '') {              if ($env{'form.customquota'} == 1) {
                 $newportfolioquota = 0;                  if ($env{'form.portfolioquota'} eq '') {
             } else {                      $newcustom{'quota'} = 0;
                 $newportfolioquota = $env{'form.portfolioquota'};                  } else {
                 $newportfolioquota =~ s/[^\d\.]//g;                      $newcustom{'quota'} = $env{'form.portfolioquota'};
                       $newcustom{'quota'} =~ s/[^\d\.]//g;
                   }
                   $changed{'quota'} = &quota_admin($newcustom{'quota'},\%changeHash);
               }
               foreach my $item (@usertools) {
                   if ($env{'form.custom'.$item} == 1) {
                       $newcustom{$item} = $env{'form.tools_'.$item};
                       $changed{$item} = &tool_admin($item,$newcustom{$item},\%changeHash);
                   }
             }              }
             my $quotachanged = &quota_admin($newportfolioquota,\%changeHash);              if (keys(%changed)) {
             if ($quotachanged) {  
                 $changeHash{'firstname'}  = $env{'form.cfirstname'};                  $changeHash{'firstname'}  = $env{'form.cfirstname'};
                 $changeHash{'middlename'} = $env{'form.cmiddlename'};                  $changeHash{'middlename'} = $env{'form.cmiddlename'};
                 $changeHash{'lastname'}   = $env{'form.clastname'};                  $changeHash{'lastname'}   = $env{'form.clastname'};
                 $changeHash{'generation'} = $env{'form.cgeneration'};                  $changeHash{'generation'} = $env{'form.cgeneration'};
                 $changeHash{'id'}         = $env{'form.cid'};                  $changeHash{'id'}         = $env{'form.cid'};
                 $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};                  $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
                 my $quotachgresult =                  my $chgresult =
                     &Apache::lonnet::put('environment',\%changeHash,                       &Apache::lonnet::put('environment',\%changeHash,
                                          $env{'form.ccdomain'},$env{'form.ccuname'});                                            $env{'form.ccdomain'},$env{'form.ccuname'});
             }              } 
         }          }
         $r->print('<br />'.&mt('Home server').': '.$uhome.' '.          $r->print('<br />'.&mt('Home server').': '.$uhome.' '.
                   &Apache::lonnet::hostname($uhome));                    &Apache::lonnet::hostname($uhome));
Line 1749  sub update_user_data { Line 1859  sub update_user_data {
         # Check for need to change          # Check for need to change
         my %userenv = &Apache::lonnet::get          my %userenv = &Apache::lonnet::get
             ('environment',['firstname','middlename','lastname','generation',              ('environment',['firstname','middlename','lastname','generation',
              'id','permanentemail','portfolioquota','inststatus'],               'id','permanentemail','portfolioquota','inststatus','tools.aboutme',
                'tools.blog','tools.portfolio'],
               $env{'form.ccdomain'},$env{'form.ccuname'});                $env{'form.ccdomain'},$env{'form.ccuname'});
         my ($tmp) = keys(%userenv);          my ($tmp) = keys(%userenv);
         if ($tmp =~ /^(con_lost|error)/i) {           if ($tmp =~ /^(con_lost|error)/i) { 
Line 1840  sub update_user_data { Line 1951  sub update_user_data {
                 $env{'form.c'.$item} = $userenv{$item};                  $env{'form.c'.$item} = $userenv{$item};
             }              }
         }          }
         # Check to see if we can change the ID/student number          # Check to see if we can change the Student/Employee ID
         my $forceid = $env{'form.forceid'};          my $forceid = $env{'form.forceid'};
         my $recurseid = $env{'form.recurseid'};          my $recurseid = $env{'form.recurseid'};
         my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);          my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);
Line 1851  sub update_user_data { Line 1962  sub update_user_data {
             (!$forceid)) {              (!$forceid)) {
             if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {              if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {
                 $env{'form.cid'} = $userenv{'id'};                  $env{'form.cid'} = $userenv{'id'};
                 $no_forceid_alert = &mt('New student/employeeID does not match existing ID for this user.').'<br />'.&mt('Change is not permitted without checking the \'Force ID change\' checkbox on the previous page.').'<br />'."\n";                          $no_forceid_alert = &mt('New Student/Employee ID does not match existing ID for this user.')
                                      .'<br />'
                                      .&mt("Change is not permitted without checking the 'Force ID change' checkbox on the previous page.")
                                      .'<br />'."\n";
             }              }
         }          }
         if ($env{'form.cid'} ne $userenv{'id'}) {          if ($env{'form.cid'} ne $userenv{'id'}) {
Line 1871  sub update_user_data { Line 1985  sub update_user_data {
         }          }
         my ($quotachanged,$oldportfolioquota,$newportfolioquota,          my ($quotachanged,$oldportfolioquota,$newportfolioquota,
             $inststatus,$oldisdefault,$newisdefault,$olddefquotatext,              $inststatus,$oldisdefault,$newisdefault,$olddefquotatext,
             $newdefquotatext);              $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext);
         my ($defquota,$settingstatus) =           my ($defquota,$settingstatus) = 
             &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);              &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);
         my $showquota;          my ($showquota,$showtools);
         if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
             $showquota = 1;              $showquota = 1;
         }          }
         my %changeHash;          if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
               $showtools = 1;
           }
           my (%changeHash,%changed);
         $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};          $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};
         if ($userenv{'portfolioquota'} ne '') {          if ($userenv{'portfolioquota'} ne '') {
             $oldportfolioquota = $userenv{'portfolioquota'};              $oldportfolioquota = $userenv{'portfolioquota'};
Line 1890  sub update_user_data { Line 2007  sub update_user_data {
                     $newportfolioquota =~ s/[^\d\.]//g;                      $newportfolioquota =~ s/[^\d\.]//g;
                 }                  }
                 if ($newportfolioquota != $oldportfolioquota) {                  if ($newportfolioquota != $oldportfolioquota) {
                     $quotachanged = &quota_admin($newportfolioquota,\%changeHash);                      $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);
                 }                  }
             } else {              } else {
                 $quotachanged = &quota_admin('',\%changeHash);                  $changed{'quota'} = &quota_admin('',\%changeHash);
                 $newportfolioquota = $defquota;                  $newportfolioquota = $defquota;
                 $newisdefault = 1;                   $newisdefault = 1; 
             }              }
Line 1907  sub update_user_data { Line 2024  sub update_user_data {
                     $newportfolioquota = $env{'form.portfolioquota'};                      $newportfolioquota = $env{'form.portfolioquota'};
                     $newportfolioquota =~ s/[^\d\.]//g;                      $newportfolioquota =~ s/[^\d\.]//g;
                 }                  }
                 $quotachanged = &quota_admin($newportfolioquota,\%changeHash);                  $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);
             } else {              } else {
                 $newportfolioquota = $defquota;                  $newportfolioquota = $defquota;
                 $newisdefault = 1;                  $newisdefault = 1;
Line 1919  sub update_user_data { Line 2036  sub update_user_data {
         if ($newisdefault) {          if ($newisdefault) {
             $newdefquotatext = &get_defaultquota_text($settingstatus);              $newdefquotatext = &get_defaultquota_text($settingstatus);
         }          }
           
           foreach my $tool (@usertools) {
               if ($userenv{'tools.'.$tool} ne '') {
                   $oldaccess{$tool} = &mt('custom');
                   if ($userenv{'tools_'.$tool}) {
                       $oldaccesstext{$tool} = &mt("availability set to 'on'");
                   } else {
                       $oldaccesstext{$tool} = &mt("availability set to 'off'");
                   }
                   $changeHash{'tools.'.$tool} = $userenv{'tools.'.$tool};
                   if ($env{'form.custom'.$tool} == 1) {
                       if ($env{'form.tools_'.$tool} ne $userenv{'tools.'.$tool}) {
                           $changed{$tool} = &tool_admin($tool,$env{'form.tools_'.$tool},
                                                         \%changeHash);
                           if ($changed{$tool}) {
                               $newaccess{$tool} = &mt('custom');
                               if ($env{'form.tools_'.$tool}) { 
                                   $newaccesstext{$tool} = &mt("availability set to 'on'");
                               } else {
                                   $newaccesstext{$tool} = &mt("availability set to 'off'");
                               }
                           } else {
                               $newaccess{$tool} = $oldaccess{$tool};
                               if ($userenv{'tools.'.$tool}) {
                                   $newaccesstext{$tool} = &mt("availability set to 'on'");
                               } else {
                                   $newaccesstext{$tool} = &mt("availability set to 'off'");
                               }
                           }
                       } else {
                           $newaccess{$tool} = $oldaccess{$tool};
                           $newaccesstext{$tool} = $oldaccesstext{$tool};
                       }
                   } else {
                       $changed{$tool} = &tool_admin($tool,'',\%changeHash);
                       print STDERR "for $tool - changed is $changed{$tool}\n";
                       if ($changed{$tool}) {
                           $newaccess{$tool} = &mt('default');
                       } else {
                           $newaccess{$tool} = $oldaccess{$tool};
                           if ($userenv{'tools.'.$tool}) {
                                $newaccesstext{$tool} = &mt("availability set to 'on'");
                           } else {
                                $newaccesstext{$tool} = &mt("availability set to 'off'");
                           }
                       }
                   }
               } else {
                   $oldaccess{$tool} = &mt('default');
                   if ($env{'form.custom'.$tool} == 1) {
                       $changed{$tool} = &tool_admin($tool,$env{'form.tools_'.$tool},
                                                     \%changeHash);
                       if ($changed{$tool}) {
                           $newaccess{$tool} = &mt('custom');
                           if ($env{'form.tools_'.$tool}) {
                               $newaccesstext{$tool} = &mt("availability set to 'on'");
                           } else {
                               $newaccesstext{$tool} = &mt("availability set to 'off'");
                           }
                       } else {
                           $newaccess{$tool} = $oldaccess{$tool};
                       }
                   } else {
                       $newaccess{$tool} = $oldaccess{$tool};
                   }
               }
           }
   
         if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||          if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
             $env{'form.cmiddlename'} ne $userenv{'middlename'} ||              $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
             $env{'form.clastname'}   ne $userenv{'lastname'}   ||              $env{'form.clastname'}   ne $userenv{'lastname'}   ||
Line 1927  sub update_user_data { Line 2112  sub update_user_data {
             $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) {              $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) {
             $namechanged = 1;              $namechanged = 1;
         }          }
         if ($namechanged || $quotachanged) {          if (($namechanged) || (keys(%changed) > 0)) {
             $changeHash{'firstname'}  = $env{'form.cfirstname'};              $changeHash{'firstname'}  = $env{'form.cfirstname'};
             $changeHash{'middlename'} = $env{'form.cmiddlename'};              $changeHash{'middlename'} = $env{'form.cmiddlename'};
             $changeHash{'lastname'}   = $env{'form.clastname'};              $changeHash{'lastname'}   = $env{'form.clastname'};
             $changeHash{'generation'} = $env{'form.cgeneration'};              $changeHash{'generation'} = $env{'form.cgeneration'};
             $changeHash{'id'}         = $env{'form.cid'};              $changeHash{'id'}         = $env{'form.cid'};
             $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};              $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
             my ($quotachgresult,$namechgresult);              my ($chgresult,$namechgresult);
             if ($quotachanged) {              if (keys(%changed) > 0) {
                 $quotachgresult =                   $chgresult = 
                     &Apache::lonnet::put('environment',\%changeHash,                      &Apache::lonnet::put('environment',\%changeHash,
                                   $env{'form.ccdomain'},$env{'form.ccuname'});                                    $env{'form.ccdomain'},$env{'form.ccuname'});
                   if ($chgresult eq 'ok') {
                       my %newenvhash;
                       my $hashid="$env{'form.ccuname'}:$env{'form.ccdomain'}";
                       foreach my $key (keys(%changed)) {
                           if ($key ne 'quota') {
                               &Apache::lonnet::devalidate_cache_new('usertools.'.$key,$hashid);
                               $newenvhash{'environment.tools.'.$key} = 
                                   $changeHash{'tools.'.$key};
                           }
                       }
                       if (($env{'user.name'} eq $env{'form.ccuname'}) &&
                           ($env{'user.domain'} eq $env{'form.ccdomain'})) {
                           &Apache::lonnet::appenv(\%newenvhash);
                       }
                   }
             }              }
             if ($namechanged) {              if ($namechanged) {
             # Make the change              # Make the change
Line 1957  sub update_user_data { Line 2157  sub update_user_data {
                              );                               );
             }              }
             if (($namechanged && $namechgresult eq 'ok') ||               if (($namechanged && $namechgresult eq 'ok') || 
                 ($quotachanged && $quotachgresult eq 'ok')) {                  ((keys(%changed) > 0) && $chgresult eq 'ok')) {
             # Tell the user we changed the name              # Tell the user we changed the name
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                              'uic'  => "User Information Changed",                                            'uic'       => "User Information Changed",             
                              'frst' => "first",                               'frst'      => "First",
                              'mddl' => "middle",                               'mddl'      => "Middle",
                              'lst'  => "last",                               'lst'       => "Last",
      'gen'  => "generation",       'gen'       => "Generation",
                              'id'   => "ID/Student number",                               'id'        => "Student/Employee ID",
                              'mail' => "permanent e-mail",                               'mail'      => "Permanent E-mail",
                              'disk' => "disk space allocated to portfolio files",                               'disk'      => "Disk space allocated to portfolio files",
                              'prvs' => "Previous",                               'blog'      => "Blog Availability",
                              'chto' => "Changed To"                               'aboutme'   => "Home Page Availability",
                                'portfolio' => "Portfolio Availability",
                                'prvs'      => "Previous",
                                'chto'      => "Changed To"
    );     );
                 $r->print('<h4>'.$lt{'uic'}.'</h4>'.                  $r->print('<h4>'.$lt{'uic'}.'</h4>'.
                           &Apache::loncommon::start_data_table().                            &Apache::loncommon::start_data_table().
Line 1987  END Line 2190  END
                     $r->print("                      $r->print("
     <th>$lt{'disk'}</th>\n");      <th>$lt{'disk'}</th>\n");
                 }                  }
                   if ($showtools) {
                       foreach my $item (@usertools) {
                           $r->print("
       <th>$lt{$item}</th>\n");
                       }
                   }
                 $r->print(&Apache::loncommon::end_data_table_header_row().                  $r->print(&Apache::loncommon::end_data_table_header_row().
                           &Apache::loncommon::start_data_table_row());                            &Apache::loncommon::start_data_table_row());
                 $r->print(<<"END");                  $r->print(<<"END");
Line 2002  END Line 2211  END
                     $r->print("                      $r->print("
     <td>$oldportfolioquota Mb $olddefquotatext </td>\n");      <td>$oldportfolioquota Mb $olddefquotatext </td>\n");
                 }                  }
                   if ($showtools) {
                       foreach my $item (@usertools) {
                           $r->print("
       <td>$oldaccess{$item} $oldaccesstext{$item} </td>\n");
                       }
                   }
                 $r->print(&Apache::loncommon::end_data_table_row().                  $r->print(&Apache::loncommon::end_data_table_row().
                           &Apache::loncommon::start_data_table_row());                            &Apache::loncommon::start_data_table_row());
                 $r->print(<<"END");                  $r->print(<<"END");
     <td><b>$lt{'chto'}</b></td>      <td><span class="LC_nobreak"><b>$lt{'chto'}</b></span></td>
     <td>$env{'form.cfirstname'}  </td>      <td>$env{'form.cfirstname'}  </td>
     <td>$env{'form.cmiddlename'} </td>      <td>$env{'form.cmiddlename'} </td>
     <td>$env{'form.clastname'}   </td>      <td>$env{'form.clastname'}   </td>
Line 2017  END Line 2232  END
                     $r->print("                      $r->print("
     <td>$newportfolioquota Mb $newdefquotatext </td>\n");      <td>$newportfolioquota Mb $newdefquotatext </td>\n");
                 }                  }
                   if ($showtools) {
                       foreach my $item (@usertools) {
                           $r->print("
       <td>$newaccess{$item} $newaccesstext{$item} </td>\n");
                       }
                   }
                 $r->print(&Apache::loncommon::end_data_table_row().                  $r->print(&Apache::loncommon::end_data_table_row().
                           &Apache::loncommon::end_data_table().'<br />');                            &Apache::loncommon::end_data_table().'<br />');
                 if ($env{'form.cid'} ne $userenv{'id'}) {                  if ($env{'form.cid'} ne $userenv{'id'}) {
Line 2045  END Line 2266  END
                       $env{'form.ccdomain'}.'</span><br />');                        $env{'form.ccdomain'}.'</span><br />');
             }              }
         }  else { # End of if ($env ... ) logic          }  else { # End of if ($env ... ) logic
             # They did not want to change the users name or quota but we can              # They did not want to change the users name, quota or tool availability,
             # still tell them what the name and quota are               # but we can still tell them what the name and quota and availabilities are  
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                            'id'   => "ID/Student number",                             'id'        => "Student/Employee ID",
                            'mail' => "Permanent e-mail",                             'mail'      => "Permanent e-mail",
                            'disk' => "Disk space allocated to user's portfolio files",                             'disk'      => "Disk space allocated to user's portfolio files",
                              'blog'      => "Blog Availability",
                              'aboutme'   => "Home Page Availability",
                              'portfolio' => "Portfolio Availability",
        );         );
             $r->print(<<"END");              $r->print(<<"END");
 <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}  <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}
Line 2059  END Line 2283  END
                 $r->print('<br />['.$lt{'mail'}.': '.                  $r->print('<br />['.$lt{'mail'}.': '.
                           $userenv{'permanentemail'}.']');                            $userenv{'permanentemail'}.']');
             }              }
               if ($showtools) {
                   foreach my $item (@usertools) {
                       $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.
                                 $newaccesstext{$item}.']'."\n");
                   }
               }
             if ($showquota) {              if ($showquota) {
                 $r->print('<br />['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '.                   $r->print('<br />['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '.
                           $olddefquotatext.']');                            $olddefquotatext.']');
             }              }
             $r->print('</h4>');              $r->print('</h4>');
Line 2091  END Line 2321  END
             $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'.              $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'.
                       &mt('Contact your <a href="[_1]">helpdesk</a> for more information.',"javascript:helpMenu('display')").'<br />');                        &mt('Contact your <a href="[_1]">helpdesk</a> for more information.',"javascript:helpMenu('display')").'<br />');
         }          }
         $r->print($no_forceid_alert.          $r->print('<span class="LC_warning">'
                   &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts,\%curr_rules));                    .$no_forceid_alert
                     .&Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts,\%curr_rules)
                     .'</span>');
     }      }
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context);          &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context);
Line 2234  sub update_roles { Line 2466  sub update_roles {
     my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},      my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},
                                $env{'form.ccuname'},$url,$role,0,$now,'','',                                 $env{'form.ccuname'},$url,$role,0,$now,'','',
                                $context);                                 $context);
     $output = &mt('Re-enabling [_1] in [_2]: <b>[_3]</b>',      $output = &mt('Re-enabling [_1] in [_2]: [_3]',
       $role,$url,$result).'<br />';        $role,$url,'<b>'.$result.'</b>').'<br />';
  }   }
                 $r->print($output);                  $r->print($output);
                 if (!grep(/^\Q$role\E$/,@rolechanges)) {                  if (!grep(/^\Q$role\E$/,@rolechanges)) {
Line 2248  sub update_roles { Line 2480  sub update_roles {
                 my $result = &Apache::lonnet::assigncustomrole(                  my $result = &Apache::lonnet::assigncustomrole(
                                $env{'form.ccdomain'}, $env{'form.ccuname'},                                 $env{'form.ccdomain'}, $env{'form.ccuname'},
                                $url,$rdom,$rnam,$rolename,0,$now,undef,$context);                                 $url,$rdom,$rnam,$rolename,0,$now,undef,$context);
                 $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : <b>[_5]</b>',                  $r->print(&mt('Re-enabling custom role [_1] by [_2]:[_3] in [_4] : [_5]',
                           $rolename,$rnam,$rdom,$url,$result).'<br />');                            $rolename,$rnam,$rdom,$url,'<b>'.$result.'</b>').'<br />');
                 if (!grep(/^cr$/,@rolechanges)) {                  if (!grep(/^cr$/,@rolechanges)) {
                     push(@rolechanges,'cr');                      push(@rolechanges,'cr');
                 }                  }
Line 2478  sub quota_admin { Line 2710  sub quota_admin {
     my $quotachanged;      my $quotachanged;
     if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {      if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
         # Current user has quota modification privileges          # Current user has quota modification privileges
         $quotachanged = 1;          if (ref($changeHash) eq 'HASH') {
         $changeHash->{'portfolioquota'} = $setquota;              $quotachanged = 1;
               $changeHash->{'portfolioquota'} = $setquota;
           }
     }      }
     return $quotachanged;      return $quotachanged;
 }  }
   
   sub tool_admin {
       my ($tool,$settool,$changeHash) = @_;
       my $toolchanged;
       if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
           # Current user has quota modification privileges
           if (ref($changeHash) eq 'HASH') {
               $toolchanged = 1;
               $changeHash->{'tools.'.$tool} = $settool;
           }
       }
       return $toolchanged;
   }
   
 sub build_roles {  sub build_roles {
     my ($sectionstr,$sections,$role) = @_;      my ($sectionstr,$sections,$role) = @_;
     my $num_sections = 0;      my $num_sections = 0;
Line 2593  sub custom_role_editor { Line 2840  sub custom_role_editor {
     my @template_roles = ("cc","in","ta","ep","st");      my @template_roles = ("cc","in","ta","ep","st");
     foreach my $role (@template_roles) {      foreach my $role (@template_roles) {
         $head_script .= &make_script_template($role);          $head_script .= &make_script_template($role);
         $button_code .= &make_button_code($role);          $button_code .= &make_button_code($role).' ';
     }      }
     $head_script .= "\n".$jsback."\n".'</script>'."\n";      $head_script .= "\n".$jsback."\n".'</script>'."\n";
     $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));      $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));
Line 2613  sub custom_role_editor { Line 2860  sub custom_role_editor {
     'crl'  => "Course Level",      'crl'  => "Course Level",
                     'dml'  => "Domain Level",                      'dml'  => "Domain Level",
                     'ssl'  => "System Level");                      'ssl'  => "System Level");
     $r->print(&mt('Select a Template').'<br />');  
     $r->print('<form action="">');      $r->print('<div>'
     $r->print($button_code);               .'<form action=""><fieldset>'
     $r->print('</form>');               .'<legend>'.&mt('Select a Template').'</legend>'
                .$button_code
                .'</fieldset></form>'
                .'</div>'
       );
   
     $r->print(<<ENDCCF);      $r->print(<<ENDCCF);
 <form name="form1" method="post">  <form name="form1" method="post">
 <input type="hidden" name="phase" value="set_custom_roles" />  <input type="hidden" name="phase" value="set_custom_roles" />
Line 2676  sub make_script_template { Line 2928  sub make_script_template {
         my ($priv_item, $dummy) = split(/\&/,$priv);          my ($priv_item, $dummy) = split(/\&/,$priv);
         $role_c{$priv_item} = 1;          $role_c{$priv_item} = 1;
     }      }
       my %role_d;
       @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});
       foreach my $priv(@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_d{$priv_item} = 1;
       }
       my %role_s;
       @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});
       foreach my $priv(@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_s{$priv_item} = 1;
       }
     foreach my $priv_item (keys(%full_c)) {      foreach my $priv_item (keys(%full_c)) {
         my ($priv, $dummy) = split(/\&/,$priv_item);          my ($priv, $dummy) = split(/\&/,$priv_item);
         if (exists($role_c{$priv})) {          if ((exists($role_c{$priv})) || (exists($role_d{$priv})) || 
               (exists($role_s{$priv}))) {
             $return_script .= "document.form1.$priv"."_c.checked = true;\n";              $return_script .= "document.form1.$priv"."_c.checked = true;\n";
         } else {          } else {
             $return_script .= "document.form1.$priv"."_c.checked = false;\n";              $return_script .= "document.form1.$priv"."_c.checked = false;\n";
         }          }
     }      }
     my %role_d;  
     @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});  
     foreach my $priv(@temp) {  
         my ($priv_item, $dummy) = split(/\&/,$priv);  
         $role_d{$priv_item} = 1;  
     }  
     foreach my $priv_item (keys(%full_d)) {      foreach my $priv_item (keys(%full_d)) {
         my ($priv, $dummy) = split(/\&/,$priv_item);          my ($priv, $dummy) = split(/\&/,$priv_item);
         if (exists($role_d{$priv})) {          if ((exists($role_d{$priv})) || (exists($role_s{$priv}))) {
             $return_script .= "document.form1.$priv"."_d.checked = true;\n";              $return_script .= "document.form1.$priv"."_d.checked = true;\n";
         } else {          } else {
             $return_script .= "document.form1.$priv"."_d.checked = false;\n";              $return_script .= "document.form1.$priv"."_d.checked = false;\n";
         }          }
     }      }
     my %role_s;  
     @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});  
     foreach my $priv(@temp) {  
         my ($priv_item, $dummy) = split(/\&/,$priv);  
         $role_s{$priv_item} = 1;  
     }  
     foreach my $priv_item (keys(%full_s)) {      foreach my $priv_item (keys(%full_s)) {
         my ($priv, $dummy) = split(/\&/,$priv_item);          my ($priv, $dummy) = split(/\&/,$priv_item);
         if (exists($role_s{$priv})) {          if (exists($role_s{$priv})) {
Line 2719  sub make_script_template { Line 2972  sub make_script_template {
 sub make_button_code {  sub make_button_code {
     my ($role) = @_;      my ($role) = @_;
     my $label = &Apache::lonnet::plaintext($role);      my $label = &Apache::lonnet::plaintext($role);
     my $button_code = '<input type="button" onClick="set_'.$role.'()" value="'.$label.'" />';          my $button_code = '<input type="button" onClick="set_'.$role.'()" value="'.$label.'" />';
     return ($button_code);      return ($button_code);
 }  }
 # ---------------------------------------------------------- Call to definerole  # ---------------------------------------------------------- Call to definerole
Line 3112  sub print_main_menu { Line 3365  sub print_main_menu {
                                    listusers => 'Display Co-authors and Manage Multiple Users',                                     listusers => 'Display Co-authors and Manage Multiple Users',
                                  },                                   },
                        course => {                         course => {
                                    upload => 'Upload a File of Course Users',                                     upload => 'File of Course Users',
                                    singleuser => 'Add/Modify a Single Course User',                                     singleuser => 'Single Course User',
                                    listusers => 'Display Class Lists and Manage Multiple Users',                                     listusers => 'Course User Lists',
                                  },                                   },
                      );                       );
     my @menu =    my @menu = ( {categorytitle => 'Add Users',
         (       items =>
           { text => $links{$context}{'upload'},       [{
             help => 'Course_Create_Class_List',           linktext => $links{$context}{'upload'},
             action => 'upload',           icon => 'sctr.png',
             permission => $permission->{'cusr'},           #help => 'Course_Create_Class_List',
             },           url => '/adm/createuser?action=upload',
           { text => $links{$context}{'singleuser'},            permission => $permission->{'cusr'},
             help => 'Course_Change_Privileges',           linktitle => 'Upload a CSV or a text file containing users.',
             action => 'singleuser',       },
             permission => $permission->{'cusr'},       {
             },           linktext => $links{$context}{'singleuser'},
           { text => $links{$context}{'listusers'},           icon => 'edit-redo.png',
             help => 'Course_View_Class_List',           #help => 'Course_Change_Privileges',
             action => 'listusers',           url => '/adm/createuser?action=singleuser',
             permission => ($permission->{'view'} || $permission->{'cusr'}),           permission => $permission->{'cusr'},
           },           linktitle => 'Add a user with a certain role to this course.',
         );       }]},
     if ($context eq 'domain' || $context eq 'course') {       {categorytitle => 'Administration',
         my $customlink =  { text => 'Edit Custom Roles',       items =>
                             help => 'Course_Editing_Custom_Roles',       [{
                             action => 'custom',           linktext => $links{$context}{'listusers'},
                             permission => $permission->{'custom'},                   icon => 'edit-find.png',
                           };                   #help => 'Course_View_Class_List',
         push(@menu,$customlink);                   url => '/adm/createuser?action=listusers',
     }           permission => ($permission->{'view'} || $permission->{'cusr'}),
     if ($context eq 'course') {           linktitle => 'Show and manage users of this course.',
         my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();       }]},
         my @courselinks =       {categorytitle => 'Configuration',
             (       items =>
               { text => 'Enroll a Single Student',       [
                  help => 'Course_Add_Student',       ]},
                  action => 'singlestudent',     );
                  permission => $permission->{'cusr'},  
                  },      if ($context eq 'domain'){
               { text => 'Drop Students',  
                 help => 'Course_Drop_Student',   push(@{ $menu[1]->{items} },
                 action => 'drop',   { linktext => 'Custom Roles',
                 permission => $permission->{'cusr'},   icon => 'emblem-photos.png',
               });   #help => 'Course_Editing_Custom_Roles',
         if (!exists($permission->{'cusr_section'})) {   url => '/adm/createuser?action=custom',
             push(@courselinks,   permission => $permission->{'custom'},
                { text => 'Automated Enrollment Manager',   linktitle => 'Configure a custom role.',
                  help => 'Course_Automated_Enrollment',   });
                  permission => (&Apache::lonnet::auto_run($cnum,$cdom)  
                                 && $permission->{'cusr'}),      }elsif ($context eq 'course'){
                  url  => '/adm/populate',      my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
                  },  
                { text => 'Configure User Self-enrollment',          push(@{ $menu[0]->{items} },
                  help => 'Course_Self_Enrollment',   { linktext => 'Single Student',
                  action => 'selfenroll',              #help => 'Course_Add_Student',
                  permission => $permission->{'cusr'},       icon => 'list-add.png',
                });              url => '/adm/createuser?action=singlestudent',
         }   permission => $permission->{'cusr'},
         push(@courselinks,              linktitle => 'Add a user with the role student to this course.',
                { text => 'Manage Course Groups',          });
                  help => 'Course_Manage_Group',  
                  permission => $permission->{'grp_manage'},          push(@{ $menu[1]->{items} },  
                  url => '/adm/coursegroups?refpage=cusr',   { linktext => 'Drop Students',
                },   icon => 'edit-undo.png',
                { text => 'View Change Logs',              #help => 'Course_Drop_Student',
                  help => 'Course_User_Logs',              url => '/adm/createuser?action=drop',
                  action => 'changelogs',   permission => $permission->{'cusr'},
                  permission => $permission->{'cusr'},              linktitle =>'Remove a student from this course.',
                },);          },
    { linktext => 'Custom Roles',
    icon => 'emblem-photos.png',
               #help => 'Course_Editing_Custom_Roles',
               url => '/adm/createuser?action=custom',
    permission => $permission->{'custom'},
    linktitle => 'Configure a custom role.',
           });
   
           if (!exists($permission->{'cusr_section'})){
          
    push(@{ $menu[2]->{items} },
    { linktext => 'Automated Enrollment',
    icon => 'roles.png',
             #help => 'Course_Automated_Enrollment',
           permission => (&Apache::lonnet::auto_run($cnum,$cdom)
                                   && $permission->{'cusr'}),
    url  => '/adm/populate',
    linktitle => 'Automated enrollment manager.',
    },
    { linktext => 'User Self-Enrollment',
    icon => 'cstr.png',
          #help => 'Course_Self_Enrollment',
    url => '/adm/createuser?action=selfenroll',
    permission => $permission->{'cusr'},
    linktitle => 'Configure user self enrollment.',
           });
   
    }
   
    push(@{ $menu[2]->{items} },
    { linktext => 'Course Groups',
    icon => 'conf.png',
           #help => 'Course_Manage_Group',
               url => '/adm/coursegroups?refpage=cusr',
    permission => $permission->{'grp_manage'},
    linktitle => 'Manage course groups.',
           },
           { linktext => 'Change Logs',
    icon => 'document-properties.png',
           #help => 'Course_User_Logs',
           url => '/adm/createuser?action=changelogs',
    permission => $permission->{'cusr'},
    linktitle => 'View change log.',
           });
       };
   return Apache::lonhtmlcommon::generate_menu(@menu);
 #               { text => 'View Log-in History',  #               { text => 'View Log-in History',
 #                 help => 'Course_User_Logins',  #                 help => 'Course_User_Logins',
 #                 action => 'logins',  #                 action => 'logins',
 #                 permission => $permission->{'cusr'},  #                 permission => $permission->{'cusr'},
 #               });  #               });
         push(@menu,@courselinks);  
     }  
     my $menu_html = '';  
     foreach my $menu_item (@menu) {  
         next if (! $menu_item->{'permission'});  
         $menu_html.='<p>';  
         if (exists($menu_item->{'help'})) {  
             $menu_html.=  
                 &Apache::loncommon::help_open_topic($menu_item->{'help'});  
         }  
         $menu_html.='<font size="+1">';  
         if (exists($menu_item->{'url'})) {  
             $menu_html.=qq{<a href="$menu_item->{'url'}">};  
         } else {  
             $menu_html.=  
                 qq{<a href="/adm/createuser?action=$menu_item->{'action'}">};  
         }  
         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';  
         $menu_html.='</p>';  
     }  
     return $menu_html;  
 }  }
   
 sub restore_prev_selections {  sub restore_prev_selections {
Line 3400  function getIndexByName(item) { Line 3678  function getIndexByName(item) {
     return -1;      return -1;
 }  }
 ENDSCRIPT  ENDSCRIPT
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
   
     my $output = '<script type="text/javascript">'."\n".      my $output = '<script type="text/javascript">'."\n".
                  $setsec_js."\n".$selfenroll_js."\n".                   $setsec_js."\n".$selfenroll_js."\n".
                  '</script>'."\n".                   '</script>'."\n".
                  '<h3>'.$lt->{'selfenroll'}.'</h3>'."\n".                   '<h3>'.$lt->{'selfenroll'}.'</h3>'."\n";
                  '<form name="'.$formname.'" method="post" action="/adm/createuser">'."\n".      my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
                  &Apache::lonhtmlcommon::start_pick_box();      if (ref($visactions) eq 'HASH') {
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          if ($visible) {
     my $cnum = $env{'course.'.$env{'request.course.id'},'.num'};              $output .= '<p>'.$visactions->{'vis'}.'</p>';
           } else {
               $output .= $visactions->{'miss'}.'<br />'.$visactions->{'yous'}.
                          '<p>'.$visactions->{'gen'}.'<br />'.$visactions->{'coca'};
               if (ref($vismsgs) eq 'ARRAY') {
                   $output .= '<br />'.$visactions->{'make'}.'<ul>';
                   foreach my $item (@{$vismsgs}) {
                       $output .= '<li>'.$visactions->{$item}.'</li>';
                   }
                   $output .= '</ul>';
               }
               $output .= '</p>';
           }
       }
       $output .= '<form name="'.$formname.'" method="post" action="/adm/createuser">'."\n".
                  &Apache::lonhtmlcommon::start_pick_box();
     if (ref($row) eq 'ARRAY') {      if (ref($row) eq 'ARRAY') {
         foreach my $item (@{$row}) {          foreach my $item (@{$row}) {
             my $title = $item;               my $title = $item; 
Line 3559  ENDSCRIPT Line 3855  ENDSCRIPT
     return;      return;
 }  }
   
   sub visible_in_cat {
       my ($cdom,$cnum) = @_;
       my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
       my ($cathash,%settable,@vismsgs,$cansetvis);
       my %visactions = &Apache::lonlocal::texthash(
                      vis => 'Your course currently appears in the Course Catalog for this domain.',
                      gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.',
                      miss => 'Your course does not currently appear in the Course Catalog for this domain.',
                      yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',
                      coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',
                      make => 'Make any changes to self-enrollment settings below, click "Save changes", then take action to include the course in the Catalog:',
                      take => 'Take the following action to ensure the course appears in the Catalog:',
                      dc_unhide  => 'Ask a domain coordinator to change the "Exclude from course catalog" setting.',
                      dc_addinst => 'Ask a domain coordinator to enable display the catalog of "Official courses (with institutional codes)".',
                      dc_instcode => 'Ask a domain coordinator to assign an institutional code (if this is an official course).',
                      dc_catalog  => 'Ask a domain coordinator to enable or create at least one course category in the domain.',
                      dc_categories => 'Ask a domain coordinator to create a hierarchy of categories and sub categories for courses in the domain.',
                      dc_chgcat => 'Ask a domain coordinator to change the category assigned to the course, as the one currently assigned is no longer used in the domain',
                      dc_addcat => 'Ask a domain coordinator to assign a category to the course.',
       );
       $visactions{'unhide'} = &mt('Use [_1]Set course environment[_2] to change the "Exclude from course catalog" setting.','"<a href="/adm/parmset?action=crsenv">','</a>"');
       $visactions{'chgcat'} = &mt('Use [_1]Set course environment[_2] to change the category assigned to the course, as the one currently assigned is no longer used in the domain.','"<a href="/adm/parmset?action=crsenv">','</a>"');
       $visactions{'addcat'} = &mt('Use [_1]Set course environment[_2] to assign a category to the course.','"<a href="/adm/parmset?action=crsenv">','</a>"');
       if (ref($domconf{'coursecategories'}) eq 'HASH') {
           if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
               $settable{'togglecats'} = 1;
           }
           if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
               $settable{'categorize'} = 1;
           }
           $cathash = $domconf{'coursecategories'}{'cats'};
       }
       if ($settable{'togglecats'} && $settable{'categorize'}) {
           $cansetvis = &mt('You are able to both assign a course category and choose to exclude this course from the catalog.');   
       } elsif ($settable{'togglecats'}) {
           $cansetvis = &mt('You are able to choose to exclude this course from the catalog, but only a Domain Coordinator may assign a course category.'); 
       } elsif ($settable{'categorize'}) {
           $cansetvis = &mt('You may assign a course category, but only a Domain Coordinator may choose to exclude this course from the catalog.');  
       } else {
           $cansetvis = &mt('Only a Domain Coordinator may assign a course category or choose to exclude this course from the catalog.'); 
       }
        
       my %currsettings =
           &Apache::lonnet::get('environment',['hidefromcat','categories','internal.coursecode'],
                                $cdom,$cnum);
       my $visible = 0;
       if ($currsettings{'internal.coursecode'} ne '') {
           if (ref($domconf{'coursecategories'}) eq 'HASH') {
               $cathash = $domconf{'coursecategories'}{'cats'};
               if (ref($cathash) eq 'HASH') {
                   if ($cathash->{'instcode::0'} eq '') {
                       push(@vismsgs,'dc_addinst'); 
                   } else {
                       $visible = 1;
                   }
               } else {
                   $visible = 1;
               }
           } else {
               $visible = 1;
           }
       } else {
           if (ref($cathash) eq 'HASH') {
               if ($cathash->{'instcode::0'} ne '') {
                   push(@vismsgs,'dc_instcode');
               }
           } else {
               push(@vismsgs,'dc_instcode');
           }
       }
       if ($currsettings{'categories'} ne '') {
           my $cathash;
           if (ref($domconf{'coursecategories'}) eq 'HASH') {
               $cathash = $domconf{'coursecategories'}{'cats'};
               if (ref($cathash) eq 'HASH') {
                   if (keys(%{$cathash}) == 0) {
                       push(@vismsgs,'dc_catalog');
                   } elsif ((keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} ne '')) {
                       push(@vismsgs,'dc_categories');
                   } else {
                       my @currcategories = split('&',$currsettings{'categories'});
                       my $matched = 0;
                       foreach my $cat (@currcategories) {
                           if ($cathash->{$cat} ne '') {
                               $visible = 1;
                               $matched = 1;
                               last;
                           }
                       }
                       if (!$matched) {
                           if ($settable{'categorize'}) { 
                               push(@vismsgs,'chgcat');
                           } else {
                               push(@vismsgs,'dc_chgcat');
                           }
                       }
                   }
               }
           }
       } else {
           if (ref($cathash) eq 'HASH') {
               if ((keys(%{$cathash}) > 1) || 
                   (keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} eq '')) {
                   if ($settable{'categorize'}) {
                       push(@vismsgs,'addcat');
                   } else {
                       push(@vismsgs,'dc_addcat');
                   }
               }
           }
       }
       if ($currsettings{'hidefromcat'} eq 'yes') {
           $visible = 0;
           if ($settable{'togglecats'}) {
               unshift(@vismsgs,'unhide');
           } else {
               unshift(@vismsgs,'dc_unhide')
           }
       }
       return ($visible,$cansetvis,\@vismsgs,\%visactions);
   }
   
 sub new_selfenroll_dom_row {  sub new_selfenroll_dom_row {
     my ($newdom,$num) = @_;      my ($newdom,$num) = @_;
     my $domdesc = &Apache::lonnet::domain($newdom);      my $domdesc = &Apache::lonnet::domain($newdom);
Line 3598  sub selfenroll_inst_types { Line 4016  sub selfenroll_inst_types {
                 $output .= '</tr><tr>';                  $output .= '</tr><tr>';
             }              }
             if (defined($usertypes->{$type})) {              if (defined($usertypes->{$type})) {
                   my $esc_type = &escape($type);
                 $output .= '<td><span class="LC_nobreak"><label><input type = "checkbox" value="'.                  $output .= '<td><span class="LC_nobreak"><label><input type = "checkbox" value="'.
                            $type.'" ';                             $esc_type.'" ';
                 if (ref($currinsttypes) eq 'ARRAY') {                  if (ref($currinsttypes) eq 'ARRAY') {
                     if (@{$currinsttypes} > 0) {                      if (@{$currinsttypes} > 0) {
                         if (grep(/^any$/,@{$currinsttypes})) {                          if (grep(/^any$/,@{$currinsttypes})) {
                             $output .= 'checked="checked"';                              $output .= 'checked="checked"';
                         } elsif (grep(/^\Q$type\E$/,@{$currinsttypes})) {                          } elsif (grep(/^\Q$esc_type\E$/,@{$currinsttypes})) {
                             $output .= 'checked="checked"';                              $output .= 'checked="checked"';
                         }                          }
                     } else {                      } else {
Line 3706  sub print_userchangelogs_display { Line 4125  sub print_userchangelogs_display {
                    &mt('Context').'</th><th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.                     &mt('Context').'</th><th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.
                    &Apache::loncommon::end_data_table_header_row();                     &Apache::loncommon::end_data_table_header_row();
     my ($minshown,$maxshown);      my ($minshown,$maxshown);
     my $minshown = 1;      $minshown = 1;
     my $count = 0;      my $count = 0;
     if ($curr{'show'} ne &mt('all')) {       if ($curr{'show'} ne &mt('all')) { 
         $maxshown = $curr{'page'} * $curr{'show'};          $maxshown = $curr{'page'} * $curr{'show'};
Line 4265  sub build_search_response { Line 4684  sub build_search_response {
                     &Apache::lonuserutils::can_create_user($env{'request.role.domain'},$context);                      &Apache::lonuserutils::can_create_user($env{'request.role.domain'},$context);
                 if ($cancreate) {                  if ($cancreate) {
                     my $showdom = &display_domain_info($env{'request.role.domain'});                       my $showdom = &display_domain_info($env{'request.role.domain'}); 
                     $response .= '<br /><br />'.&mt("<b>To add a new user</b> (you can only create new users in your current role's domain - <span class=\"LC_cusr_emph\">[_1]</span>):",$env{'request.role.domain'}).'<ul><li>'.&mt("Set 'Domain/institution to search' to: <span class=\"LC_cusr_emph\">[_1]</span>",$showdom).'<li>'.&mt("Set 'Search criteria' to: <span class=\"LC_cusr_emph\">'username is ...... in selected LON-CAPA domain'").'</span></li><li>'.&mt('Provide the proposed username').'</li><li>'.&mt('Search').'</li></ul><br />';                      $response .= '<br /><br />'
                                   .'<b>'.&mt('To add a new user:').'</b>'
                                   .'<br />'
                                   .&mt("(You can only create new users in your current role's domain - [_1])"
                                       ,'<span class="LC_cusr_emph">'.$env{'request.role.domain'}.'</span>')
                                   .'<ul><li>'
                                   .&mt("Set 'Domain/institution to search' to: [_1]",'<span class="LC_cusr_emph">'.$showdom.'</span>')
                                   .'</li><li>'
                                   .&mt("Set 'Search criteria' to: [_1]username is ..... in selected LON-CAPA domain[_2]",'<span class="LC_cusr_emph">','</span>')
                                   .'</li><li>'
                                   .&mt('Provide the proposed username')
                                   .'</li><li>'
                                   .&mt("Click 'Search'")
                                   .'</li></ul><br />';
                 } else {                  } else {
                     my $helplink = ' href="javascript:helpMenu('."'display'".')"';                      my $helplink = ' href="javascript:helpMenu('."'display'".')"';
                     $response .= '<br /><br />'.&mt("You are not authorized to create new users in your current role's domain - <span class=\"LC_cusr_emph\">[_1]</span>.",$env{'request.role.domain'}).'<br />'.&mt('Contact the <a[_1]>helpdesk</a> if you need to create a new user.',$helplink).'<br /><br />';                      $response .= '<br /><br />'
                                   .&mt("You are not authorized to create new users in your current role's domain - [_1]."
                                       ,'<span class="LC_cusr_emph">'.$env{'request.role.domain'}.'</span>')
                                   .'<br />'
                                   .&mt('Contact the [_1]helpdesk[_2] if you need to create a new user.'
                                       ,' <a'.$helplink.'>'
                                       ,'</a>')
                                   .'<br /><br />';
                 }                  }
             }              }
         }          }
Line 4594  sub update_selfenroll_config { Line 5033  sub update_selfenroll_config {
                             my $othervalue = 'any';                              my $othervalue = 'any';
                             if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) {                              if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) {
                                 if (@{$types} > 0) {                                  if (@{$types} > 0) {
                                       my @esc_types = map { &escape($_); } @{$types};
                                     $othervalue = 'other';                                      $othervalue = 'other';
                                     $typestr = join(',',(@{$types},$othervalue));                                      $typestr = join(',',(@esc_types,$othervalue));
                                 }                                  }
                                 $typestr = $othervalue;                                  $typestr = $othervalue;
                             } else {                              } else {
Line 4717  sub update_selfenroll_config { Line 5157  sub update_selfenroll_config {
     } else {      } else {
         $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.'));          $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.'));
     }      }
       my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
       if (ref($visactions) eq 'HASH') {
           if (!$visible) {
               $r->print('<br />'.$visactions->{'miss'}.'<br />'.$visactions->{'yous'}.
                         '<br />');
               if (ref($vismsgs) eq 'ARRAY') {
                   $r->print('<br />'.$visactions->{'take'}.'<ul>');
                   foreach my $item (@{$vismsgs}) {
                       $r->print('<li>'.$visactions->{$item}.'</li>');
                   }
                   $r->print('</ul>');
               }
               $r->print($cansetvis);
           }
       } 
     return;      return;
 }  }
   
Line 4726  sub get_selfenroll_titles { Line 5181  sub get_selfenroll_titles {
                 types        => 'Users allowed to self-enroll in this course',                  types        => 'Users allowed to self-enroll in this course',
                 registered   => 'Restrict self-enrollment to students officially registered for the course',                  registered   => 'Restrict self-enrollment to students officially registered for the course',
                 enroll_dates => 'Dates self-enrollment available',                  enroll_dates => 'Dates self-enrollment available',
                 access_dates => 'Course access dates for self-enrolled users',                  access_dates => 'Course access dates assigned to self-enrolling users',
                 section      => 'Section assigned to self-enrolled users',                  section      => 'Section assigned to self-enrolling users',
              );               );
     return (\@row,\%lt);      return (\@row,\%lt);
 }  }

Removed from v.1.254  
changed lines
  Added in v.1.269


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>