Diff for /loncom/interface/loncreateuser.pm between versions 1.295.2.35 and 1.314

version 1.295.2.35, 2010/08/20 04:19:38 version 1.314, 2009/09/10 23:04:52
Line 51  In LON-CAPA, roles are actually collecti Line 51  In LON-CAPA, roles are actually collecti
 Assistant", "Course Coordinator", and other such roles are really just  Assistant", "Course Coordinator", and other such roles are really just
 collection of privileges that are useful in many circumstances.  collection of privileges that are useful in many circumstances.
   
 Custom roles can be defined by a Domain Coordinator, Course Coordinator  Creating custom roles can be done by the Domain Coordinator through
 or Community Coordinator via the Manage User functionality.  the Create User functionality. That screen will show all privileges
 The custom role editor screen will show all privileges which can be  that can be assigned to users. For a complete list of privileges,
 assigned to users. For a complete list of privileges, please see   please see C</home/httpd/lonTabs/rolesplain.tab>.
 C</home/httpd/lonTabs/rolesplain.tab>.  
   
 Custom role definitions are stored in the C<roles.db> file of the creator  Custom role definitions are stored in the C<roles.db> file of the role
 of the role.  author.
   
 =cut  =cut
   
Line 219  END_SCRIPT Line 218  END_SCRIPT
 sub build_tools_display {  sub build_tools_display {
     my ($ccuname,$ccdomain,$context) = @_;      my ($ccuname,$ccdomain,$context) = @_;
     my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay,      my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay,
         $colspan,$isadv,%domconfig);          $colspan);
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                    'blog'       => "Personal User Blog",                     'blog'       => "Personal User Blog",
                    'aboutme'    => "Personal Information Page",                     'aboutme'    => "Personal Information Page",
Line 243  sub build_tools_display { Line 242  sub build_tools_display {
         %reqtitles = &courserequest_titles();          %reqtitles = &courserequest_titles();
         %reqdisplay = &courserequest_display();          %reqdisplay = &courserequest_display();
         $colspan = ' colspan="2"';          $colspan = ' colspan="2"';
         %domconfig =  
             &Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain);  
         $isadv = &Apache::lonnet::is_advanced_user($ccuname,$ccdomain);  
     } else {      } else {
         %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,          %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                           'tools.aboutme','tools.portfolio','tools.blog');                            'tools.aboutme','tools.portfolio','tools.blog');
Line 292  sub build_tools_display { Line 288  sub build_tools_display {
                    &Apache::loncommon::start_data_table_row()."\n";                     &Apache::loncommon::start_data_table_row()."\n";
         if ($context eq 'requestcourses') {          if ($context eq 'requestcourses') {
             my ($curroption,$currlimit);              my ($curroption,$currlimit);
             if ($userenv{$context.'.'.$item} ne '') {              $curroption = $userenv{$context.'.'.$item};
                 $curroption = $userenv{$context.'.'.$item};  
             } else {  
                 my (@inststatuses);  
                 $curroption =  
                     &Apache::loncoursequeueadmin::get_processtype($ccuname,$ccdomain,$isadv,$ccdomain,  
                                                                $item,\@inststatuses,\%domconfig);  
             }  
             if (!$curroption) {              if (!$curroption) {
                 $curroption = 'norequest';                  $curroption = 'norequest';
             }              }
Line 479  sub courserequest_display { Line 468  sub courserequest_display {
 # =================================================================== Phase one  # =================================================================== Phase one
   
 sub print_username_entry_form {  sub print_username_entry_form {
     my ($r,$context,$response,$srch,$forcenewuser,$crstype) = @_;      my ($r,$context,$response,$srch,$forcenewuser) = @_;
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my $formtoset = 'crtuser';      my $formtoset = 'crtuser';
     if (exists($env{'form.startrolename'})) {      if (exists($env{'form.startrolename'})) {
Line 498  sub print_username_entry_form { Line 487  sub print_username_entry_form {
         '// ]]>'."\n".          '// ]]>'."\n".
         '</script>'."\n";          '</script>'."\n";
   
     my %existingroles=&Apache::lonuserutils::my_custom_roles($crstype);  
     if (($env{'form.action'} eq 'custom') && (keys(%existingroles) > 0)  
         && (&Apache::lonnet::allowed('mcr','/'))) {  
         $jscript .= &customrole_javascript();  
     }  
     my %loaditems = (      my %loaditems = (
                 'onload' => "javascript:setFormElements(document.$formtoset)",                  'onload' => "javascript:setFormElements(document.$formtoset)",
                     );                      );
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);      my %breadcrumb_text = &singleuser_breadcrumb();
     my $start_page =      my $start_page =
  &Apache::loncommon::start_page('User Management',   &Apache::loncommon::start_page('User Management',
        $jscript,{'add_entries' => \%loaditems,});         $jscript,{'add_entries' => \%loaditems,});
Line 528  sub print_username_entry_form { Line 512  sub print_username_entry_form {
     }      }
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',      my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                      $helpitem);                                                       $helpitem);
       my %existingroles=&Apache::lonuserutils::my_custom_roles();
       my $choice=&Apache::loncommon::select_form('make new role','rolename',
    ('make new role' => 'Generate new role ...',%existingroles));
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'srst' => 'Search for a user and enroll as a student',                      'srst' => 'Search for a user and enroll as a student',
                     'srme' => 'Search for a user and enroll as a member',  
                     'srad' => 'Search for a user and modify/add user information or roles',                      'srad' => 'Search for a user and modify/add user information or roles',
     'usr'  => "Username",      'usr'  => "Username",
                     'dom'  => "Domain",                      'dom'  => "Domain",
                     'ecrp' => "Define or Edit Custom Role",                      'ecrp' => "Edit Custom Role Privileges",
                     'nr'   => "role name",                      'nr'   => "Name of Role",
                     'cre'  => "Next",                      'cre'  => "Next",
        );         );
     $r->print($start_page."\n".$crumbs);      $r->print($start_page."\n".$crumbs);
     if ($env{'form.action'} eq 'custom') {      if ($env{'form.action'} eq 'custom') {
         if (&Apache::lonnet::allowed('mcr','/')) {          if (&Apache::lonnet::allowed('mcr','/')) {
             my $newroletext = &mt('Define new custom role:');              $r->print(<<ENDCUSTOM);
             $r->print('<form action="/adm/createuser" method="post" name="docustom">'.  <form action="/adm/createuser" method="post" name="docustom">
                       '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.  <input type="hidden" name="action" value="$env{'form.action'}" />
                       '<input type="hidden" name="phase" value="selected_custom_edit" />'.  <input type="hidden" name="phase" value="selected_custom_edit" />
                       '<h3>'.$lt{'ecrp'}.'</h3>'.  <h3>$lt{'ecrp'}</h3>
                       &Apache::loncommon::start_data_table().  $choice $lt{'nr'}: <input type="text" size="15" name="newrolename" /><br />
                       &Apache::loncommon::start_data_table_row().  <input name="customeditor" type="submit" value="$lt{'cre'}" />
                       '<td>');  </form>
             if (keys(%existingroles) > 0) {  ENDCUSTOM
                 $r->print('<br /><label><input type="radio" name="customroleaction" value="new" checked="checked" onclick="setCustomFields();" /><b>'.$newroletext.'</b></label>');  
             } else {  
                 $r->print('<br /><input type="hidden" name="customroleaction" value="new" /><b>'.$newroletext.'</b>');  
             }  
             $r->print('</td><td align="center">'.$lt{'nr'}.'<br /><input type="text" size="15" name="newrolename" onfocus="setCustomAction('."'new'".');" /></td>'.  
                       &Apache::loncommon::end_data_table_row());  
             if (keys(%existingroles) > 0) {  
                 $r->print(&Apache::loncommon::start_data_table_row().'<td><br />'.  
                           '<label><input type="radio" name="customroleaction" value="edit" onclick="setCustomFields();"/><b>'.  
                           &mt('View/Modify existing role:').'</b></label></td>'.  
                           '<td align="center"><br />'.  
                           '<select name="rolename" onchange="setCustomAction('."'edit'".');">'.  
                           '<option value="" selected="selected">'.  
                           &mt('Select'));  
                 foreach my $role (sort(keys(%existingroles))) {  
                     $r->print('<option value="'.$role.'">'.$role.'</option>');  
                 }  
                 $r->print('</select>'.  
                           '</td>'.  
                           &Apache::loncommon::end_data_table_row());  
             }  
             $r->print(&Apache::loncommon::end_data_table().'<p>'.  
                       '<input name="customeditor" type="submit" value="'.  
                       $lt{'cre'}.'" /></p>'.  
                       '</form>');  
         }          }
     } else {      } else {
         my $actiontext = $lt{'srad'};          my $actiontext = $lt{'srad'};
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             if ($crstype eq 'Community') {              $actiontext = $lt{'srst'};
                 $actiontext = $lt{'srme'};  
             } else {  
                 $actiontext = $lt{'srst'};  
             }  
         }          }
         $r->print("<h3>$actiontext</h3>");          $r->print("
   <h3>$actiontext</h3>");
         if ($env{'form.origform'} ne 'crtusername') {          if ($env{'form.origform'} ne 'crtusername') {
             $r->print("\n".$response);              $r->print("\n".$response);
         }          }
         $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response,$crstype));          $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response));
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
 sub customrole_javascript {  
     my $js = <<"END";  
 <script type="text/javascript">  
 // <![CDATA[  
   
 function setCustomFields() {  
     if (document.docustom.customroleaction.length > 0) {  
         for (var i=0; i<document.docustom.customroleaction.length; i++) {  
             if (document.docustom.customroleaction[i].checked) {  
                 if (document.docustom.customroleaction[i].value == 'new') {  
                     document.docustom.rolename.selectedIndex = 0;  
                 } else {  
                     document.docustom.newrolename.value = '';  
                 }  
             }  
         }  
     }  
     return;  
 }  
   
 function setCustomAction(caller) {  
     if (document.docustom.customroleaction.length > 0) {  
         for (var i=0; i<document.docustom.customroleaction.length; i++) {  
             if (document.docustom.customroleaction[i].value == caller) {  
                 document.docustom.customroleaction[i].checked = true;  
             }  
         }  
     }  
     setCustomFields();  
     return;  
 }  
   
 // ]]>  
 </script>  
 END  
     return $js;  
 }  
   
 sub entry_form {  sub entry_form {
     my ($dom,$srch,$forcenewuser,$context,$responsemsg,$crstype) = @_;      my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);      my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
     my ($usertype,$inexact);      my ($usertype,$inexact);
     if (ref($srch) eq 'HASH') {      if (ref($srch) eq 'HASH') {
Line 673  ENDBLOCK Line 593  ENDBLOCK
         my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');          my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
                   'enro' => 'Enroll one student',                    'enro' => 'Enroll one student',
                   'enrm' => 'Enroll one member',  
                   'admo' => 'Add/modify a single user',                    'admo' => 'Add/modify a single user',
                   'crea' => 'create new user if required',                    'crea' => 'create new user if required',
                   'uskn' => "username is known",                    'uskn' => "username is known",
Line 686  ENDBLOCK Line 605  ENDBLOCK
         my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain');          my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain');
         my ($title,$buttontext,$showresponse);          my ($title,$buttontext,$showresponse);
         if ($env{'form.action'} eq 'singlestudent') {             if ($env{'form.action'} eq 'singlestudent') {   
             if ($crstype eq 'Community') {              $title = $lt{'enro'};
                 $title = $lt{'enrm'};  
             } else {  
                 $title = $lt{'enro'};  
             }  
             $buttontext = $lt{'enrl'};              $buttontext = $lt{'enrl'};
         } else {          } else {
             $title = $lt{'admo'};              $title = $lt{'admo'};
Line 761  END Line 676  END
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub print_user_selection_page {  sub print_user_selection_page {
     my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements,$crstype) = @_;      my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements) = @_;
     my @fields = ('username','domain','lastname','firstname','permanentemail');      my @fields = ('username','domain','lastname','firstname','permanentemail');
     my $sortby = $env{'form.sortby'};      my $sortby = $env{'form.sortby'};
   
Line 789  ENDSCRIPT Line 704  ENDSCRIPT
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                                        'usrch'          => "User Search to add/modify roles",                                         'usrch'          => "User Search to add/modify roles",
                                        'stusrch'        => "User Search to enroll student",                                         'stusrch'        => "User Search to enroll student",
                                        'memsrch'        => "User Search to enroll member",  
                                        'usel'           => "Select a user to add/modify roles",                                         'usel'           => "Select a user to add/modify roles",
                                        'stusel'         => "Select a user to enroll as a student",                                         'stusel'         => "Select a user to enroll as a student", 
                                        'memsel'         => "Select a user to enroll as a member",  
                                        'username'       => "username",                                         'username'       => "username",
                                        'domain'         => "domain",                                         'domain'         => "domain",
                                        'lastname'       => "last name",                                         'lastname'       => "last name",
Line 804  ENDSCRIPT Line 717  ENDSCRIPT
     } else {      } else {
         $r->print(&Apache::loncommon::start_page('User Management',$jscript));          $r->print(&Apache::loncommon::start_page('User Management',$jscript));
   
         my %breadcrumb_text = &singleuser_breadcrumb($crstype);          my %breadcrumb_text = &singleuser_breadcrumb();
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:backPage(document.usersrchform,'','')",              ({href=>"javascript:backPage(document.usersrchform,'','')",
               text=>$breadcrumb_text{'search'},                text=>$breadcrumb_text{'search'},
Line 816  ENDSCRIPT Line 729  ENDSCRIPT
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                           'Course_Change_Privileges'));                                                            'Course_Change_Privileges'));
             $r->print("<b>$lt{'usrch'}</b><br />");              $r->print("<b>$lt{'usrch'}</b><br />");
             $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));              $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
             $r->print('<h3>'.$lt{'usel'}.'</h3>');              $r->print('<h3>'.$lt{'usel'}.'</h3>');
         } elsif ($env{'form.action'} eq 'singlestudent') {          } elsif ($env{'form.action'} eq 'singlestudent') {
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                           'Course_Add_Student'));                                                            'Course_Add_Student'));
             $r->print($jscript."<b>");              $r->print($jscript."<b>$lt{'stusrch'}</b><br />");
             if ($crstype eq 'Community') {              $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
                 $r->print($lt{'memsrch'});              $r->print('</form><h3>'.$lt{'stusel'}.'</h3>');
             } else {  
                 $r->print($lt{'stusrch'});  
             }  
             $r->print("</b><br />");  
             $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));  
             $r->print('</form><h3>');  
             if ($crstype eq 'Community') {  
                 $r->print($lt{'memsel'});  
             } else {  
                 $r->print($lt{'stusel'});  
             }  
             $r->print('</h3>');  
         }          }
     }      }
     $r->print('<form name="usersrchform" method="post">'.      $r->print('<form name="usersrchform" method="post">'.
Line 910  sub print_user_query_page { Line 811  sub print_user_query_page {
 }  }
   
 sub print_user_modification_page {  sub print_user_modification_page {
     my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission,$crstype) = @_;      my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_;
     if (($ccuname eq '') || ($ccdomain eq '')) {      if (($ccuname eq '') || ($ccdomain eq '')) {
         my $usermsg = &mt('No username and/or domain provided.');          my $usermsg = &mt('No username and/or domain provided.');
         $env{'form.phase'} = '';          $env{'form.phase'} = '';
  &print_username_entry_form($r,$context,$usermsg,'','',$crstype);   &print_username_entry_form($r,$context,$usermsg);
         return;          return;
     }      }
     my ($form,$formname);      my ($form,$formname);
Line 945  sub print_user_modification_page { Line 846  sub print_user_modification_page {
             );              );
             my $response;              my $response;
             if ($env{'form.origform'} eq 'crtusername') {              if ($env{'form.origform'} eq 'crtusername') {
                 $response =  '<span class="LC_warning">'.&mt('No match found for the username [_1] in LON-CAPA domain: [_2]','<b>'.$ccuname.'</b>',$ccdomain).                  $response =  '<span class="LC_warning">'.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain).
                             '</span><br />';                              '</span><br />';
             }              }
             $response .= '<p class="LC_warning">'              $response .= '<p class="LC_warning">'
Line 955  sub print_user_modification_page { Line 856  sub print_user_modification_page {
                             ,'<a href="'.$helplink.'">','</a>')                              ,'<a href="'.$helplink.'">','</a>')
                         .'</p><br />';                          .'</p><br />';
             $env{'form.phase'} = '';              $env{'form.phase'} = '';
             &print_username_entry_form($r,$context,$response,undef,undef,$crstype);              &print_username_entry_form($r,$context,$response);
             return;              return;
         }          }
         $newuser = 1;          $newuser = 1;
Line 979  sub print_user_modification_page { Line 880  sub print_user_modification_page {
                             'username');                              'username');
                     }                      }
                     $env{'form.phase'} = '';                      $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$userchkmsg,undef,undef,$crstype);                      &print_username_entry_form($r,$context,$userchkmsg);
                     return;                      return;
                 }                  }
             }              }
Line 1006  sub print_user_modification_page { Line 907  sub print_user_modification_page {
     }      }
     my $start_page =       my $start_page = 
  &Apache::loncommon::start_page('User Management',$js,$args);   &Apache::loncommon::start_page('User Management',$js,$args);
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);      my %breadcrumb_text = &singleuser_breadcrumb();
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage($form)",       ({href=>"javascript:backPage($form)",
        text=>$breadcrumb_text{'search'},         text=>$breadcrumb_text{'search'},
Line 1038  sub print_user_modification_page { Line 939  sub print_user_modification_page {
 <input type="hidden" name="pres_type"   value="" />  <input type="hidden" name="pres_type"   value="" />
 <input type="hidden" name="pres_marker" value="" />  <input type="hidden" name="pres_marker" value="" />
 ENDFORMINFO  ENDFORMINFO
     my (%inccourses,$roledom);      my %inccourses;
     if ($context eq 'course') {      foreach my $key (keys(%env)) {
         $inccourses{$env{'request.course.id'}}=1;   if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) {
         $roledom = $env{'course.'.$env{'request.course.id'}.'.domain'};      $inccourses{$1.'_'.$2}=1;
     } elsif ($context eq 'author') {  
         $roledom = $env{'request.role.domain'};  
     } elsif ($context eq 'domain') {  
         foreach my $key (keys(%env)) {  
             $roledom = $env{'request.role.domain'};  
             if ($key=~/^user\.priv\.cm\.\/($roledom)\/($match_username)/) {  
                 $inccourses{$1.'_'.$2}=1;  
             }  
         }  
     } else {  
         foreach my $key (keys(%env)) {  
             if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) {  
                 $inccourses{$1.'_'.$2}=1;  
             }  
         }          }
     }      }
     if ($newuser) {      if ($newuser) {
Line 1069  ENDFORMINFO Line 956  ENDFORMINFO
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
                 'cnu'            => 'Create New User',                  'cnu'            => 'Create New User',
                 'ast'            => 'as a student',                  'ast'            => 'as a student',
                 'ame'            => 'as a member',  
                 'ind'            => 'in domain',                  'ind'            => 'in domain',
                 'lg'             => 'Login Data',                  'lg'             => 'Login Data',
                 'hs'             => "Home Server",                  'hs'             => "Home Server",
Line 1088  $loginscript Line 974  $loginscript
 <h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain  <h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain
 ENDTITLE  ENDTITLE
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             if ($crstype eq 'Community') {              $r->print(' ('.$lt{'ast'}.')');
                 $r->print(' ('.$lt{'ame'}.')');  
             } else {  
                 $r->print(' ('.$lt{'ast'}.')');  
             }  
         }          }
         $r->print('</h2>'."\n".'<div class="LC_left_float">');          $r->print('</h2>'."\n".'<div class="LC_left_float">');
         my $personal_table =           my $personal_table = 
Line 1111  $lt{'hs'}: $home_server_pick Line 993  $lt{'hs'}: $home_server_pick
             $r->print($home_server_pick);              $r->print($home_server_pick);
         }          }
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
             $r->print('<br /><h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.              $r->print('<br /><h3>'.&mt('User Can Request Creation of Courses in this Domain?').'</h3>'.
                       &Apache::loncommon::start_data_table().                        &Apache::loncommon::start_data_table().
                       &build_tools_display($ccuname,$ccdomain,                        &build_tools_display($ccuname,$ccdomain,
                                            'requestcourses').                                             'requestcourses').
Line 1185  ENDAUTH Line 1067  ENDAUTH
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                     'cup'  => "Modify existing user: ",                      'cup'  => "Modify existing user: ",
                     'ens'  => "Enroll one student: ",                      'ens'  => "Enroll one student: ",
                     'enm'  => "Enroll one member: ",  
                     'id'   => "in domain",                      'id'   => "in domain",
        );         );
  $r->print(<<ENDCHANGEUSER);   $r->print(<<ENDCHANGEUSER);
Line 1195  $forminfo Line 1076  $forminfo
 <h2>  <h2>
 ENDCHANGEUSER  ENDCHANGEUSER
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             if ($crstype eq 'Community') {              $r->print($lt{'ens'});
                 $r->print($lt{'enm'});  
             } else {  
                 $r->print($lt{'ens'});  
             }  
         } else {          } else {
             $r->print($lt{'cup'});              $r->print($lt{'cup'});
         }          }
Line 1213  ENDCHANGEUSER Line 1090  ENDCHANGEUSER
             $r->print(&Apache::lonuserutils::forceid_change($context));              $r->print(&Apache::lonuserutils::forceid_change($context));
         }          }
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
             $r->print('<h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.              $r->print('<h3>'.&mt('User Can Request Creation of Courses in this Domain?').'</h3>'.
                       &Apache::loncommon::start_data_table());                        &Apache::loncommon::start_data_table());
             if ($env{'request.role.domain'} eq $ccdomain) {              if ($env{'request.role.domain'} eq $ccdomain) {
                 $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));                  $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));
Line 1292  ENDNOTOOLSPRIV Line 1169  ENDNOTOOLSPRIV
         }          }
         $r->print('</div><div class="LC_clear_float_footer"></div>');          $r->print('</div><div class="LC_clear_float_footer"></div>');
         if ($env{'form.action'} ne 'singlestudent') {          if ($env{'form.action'} ne 'singlestudent') {
             &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context,              &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses);
                                     $roledom,$crstype);  
         }          }
     } ## End of new user/old user logic      } ## End of new user/old user logic
   
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         my $btntxt;          $r->print('<br /><input type="button" value="'.&mt('Enroll Student').'" onclick="setSections(this.form)" />'."\n");
         if ($crstype eq 'Community') {  
             $btntxt = &mt('Enroll Member');  
         } else {  
             $btntxt = &mt('Enroll Student');  
         }  
         $r->print('<br /><input type="button" value="'.$btntxt.'" onclick="setSections(this.form)" />'."\n");  
     } else {      } else {
         $r->print('<h3>'.&mt('Add Roles').'</h3>');          $r->print('<h3>'.&mt('Add Roles').'</h3>');
         my $addrolesdisplay = 0;          my $addrolesdisplay = 0;
Line 1342  ENDNOTOOLSPRIV Line 1213  ENDNOTOOLSPRIV
 }  }
   
 sub singleuser_breadcrumb {  sub singleuser_breadcrumb {
     my ($crstype) = @_;  
     my %breadcrumb_text;      my %breadcrumb_text;
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         if ($crstype eq 'Community') {          $breadcrumb_text{'search'} = 'Enroll a student';
             $breadcrumb_text{'search'} = 'Enroll a member';  
         } else {  
             $breadcrumb_text{'search'} = 'Enroll a student';  
         }  
         $breadcrumb_text{'userpicked'} = 'Select a user',          $breadcrumb_text{'userpicked'} = 'Select a user',
         $breadcrumb_text{'modify'} = 'Set section/dates',          $breadcrumb_text{'modify'} = 'Set section/dates',
     } else {      } else {
Line 1413  sub validation_javascript { Line 1279  sub validation_javascript {
 }  }
   
 sub display_existing_roles {  sub display_existing_roles {
     my ($r,$ccuname,$ccdomain,$inccourses,$context,$roledom,$crstype) = @_;      my ($r,$ccuname,$ccdomain,$inccourses) = @_;
     my $now=time;      my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
     my %lt=&Apache::lonlocal::texthash(      # Build up table of user roles to allow revocation and re-enabling of roles.
       my ($tmp) = keys(%rolesdump);
       if ($tmp !~ /^(con_lost|error)/i) {
           my $now=time;
           my %lt=&Apache::lonlocal::texthash(
                     'rer'  => "Existing Roles",                      'rer'  => "Existing Roles",
                     'rev'  => "Revoke",                      'rev'  => "Revoke",
                     'del'  => "Delete",                      'del'  => "Delete",
Line 1425  sub display_existing_roles { Line 1295  sub display_existing_roles {
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End",                      'end'  => "End",
                                        );                                         );
     my (%rolesdump,%roletext,%sortrole,%roleclass,%rolepriv);          my (%roletext,%sortrole,%roleclass,%rolepriv);
     if ($context eq 'course' || $context eq 'author') {          foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
         my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype);                                      my $b1=join('_',(split('_',$b))[1,0]);
         my %roleshash =                                      return $a1 cmp $b1;
             &Apache::lonnet::get_my_roles($ccuname,$ccdomain,'userroles',                                  } keys(%rolesdump)) {
                               ['active','previous','future'],\@roles,$roledom,1);              next if ($area =~ /^rolesdef/);
         foreach my $key (keys(%roleshash)) {              my $envkey=$area;
             my ($start,$end) = split(':',$roleshash{$key});              my $role = $rolesdump{$area};
             next if ($start eq '-1' || $end eq '-1');              my $thisrole=$area;
             my ($rnum,$rdom,$role,$sec) = split(':',$key);              $area =~ s/\_\w\w$//;
             if ($context eq 'course') {              my ($role_code,$role_end_time,$role_start_time) =
                 next unless (($rnum eq $env{'course.'.$env{'request.course.id'}.'.num'})                  split(/_/,$role);
                              && ($rdom eq $env{'course.'.$env{'request.course.id'}.'.domain'}));  
             } elsif ($context eq 'author') {  
                 next unless (($rnum eq $env{'user.name'}) && ($rdom eq $env{'request.role.domain'}));  
             }  
             my ($newkey,$newvalue,$newrole);  
             $newkey = '/'.$rdom.'/'.$rnum;  
             if ($sec ne '') {  
                 $newkey .= '/'.$sec;  
             }  
             $newvalue = $role;  
             if ($role =~ /^cr/) {  
                 $newrole = 'cr';  
             } else {  
                 $newrole = $role;  
             }  
             $newkey .= '_'.$newrole;  
             if ($start ne '' && $end ne '') {  
                 $newvalue .= '_'.$end.'_'.$start;  
             } elsif ($end ne '') {  
                 $newvalue .= '_'.$end;  
             }  
             $rolesdump{$newkey} = $newvalue;  
         }  
     } else {  
         %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);  
     }  
     # Build up table of user roles to allow revocation and re-enabling of roles.  
     my ($tmp) = keys(%rolesdump);  
     return if ($tmp =~ /^(con_lost|error)/i);  
     foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);  
                                 my $b1=join('_',(split('_',$b))[1,0]);  
                                 return $a1 cmp $b1;  
                             } keys(%rolesdump)) {  
         next if ($area =~ /^rolesdef/);  
         my $envkey=$area;  
         my $role = $rolesdump{$area};  
         my $thisrole=$area;  
         $area =~ s/\_\w\w$//;  
         my ($role_code,$role_end_time,$role_start_time) =  
             split(/_/,$role);  
 # Is this a custom role? Get role owner and title.  # Is this a custom role? Get role owner and title.
         my ($croleudom,$croleuname,$croletitle)=              my ($croleudom,$croleuname,$croletitle)=
             ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});                  ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});
         my $allowed=0;              my $allowed=0;
         my $delallowed=0;              my $delallowed=0;
         my $sortkey=$role_code;              my $sortkey=$role_code;
         my $class='Unknown';              my $class='Unknown';
         if ($area =~ m{^/($match_domain)/($match_courseid)} ) {              if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
             $class='Course';                  $class='Course';
             my ($coursedom,$coursedir) = ($1,$2);                  my ($coursedom,$coursedir) = ($1,$2);
             my $cid = $1.'_'.$2;                  $sortkey.="\0$coursedom";
             # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).                  # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
             my %coursedata=                  my %coursedata=
                 &Apache::lonnet::coursedescription($cid);                      &Apache::lonnet::coursedescription($1.'_'.$2);
             if ($coursedir =~ /^$match_community$/) {                  my $carea;
                 $class='Community';                  if (defined($coursedata{'description'})) {
             }                      $carea=$coursedata{'description'}.
             $sortkey.="\0$coursedom";                          '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
             my $carea;  
             if (defined($coursedata{'description'})) {  
                 $carea=$coursedata{'description'}.  
                     '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).  
      &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);       &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);
                 $sortkey.="\0".$coursedata{'description'};                      $sortkey.="\0".$coursedata{'description'};
             } else {                      $class=$coursedata{'type'};
                 if ($class eq 'Community') {  
                     $carea=&mt('Unavailable community').': '.$area;  
                     $sortkey.="\0".&mt('Unavailable community').': '.$area;  
                 } else {                  } else {
                     $carea=&mt('Unavailable course').': '.$area;                      $carea=&mt('Unavailable course').': '.$area;
                     $sortkey.="\0".&mt('Unavailable course').': '.$area;                      $sortkey.="\0".&mt('Unavailable course').': '.$area;
                 }                  }
             }                  $sortkey.="\0$coursedir";
             $sortkey.="\0$coursedir";                  $inccourses->{$1.'_'.$2}=1;
             $inccourses->{$cid}=1;                  if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
             if ((&Apache::lonnet::allowed('c'.$role_code,$coursedom.'/'.$coursedir)) ||  
                 (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {  
                 $allowed=1;  
             }  
             unless ($allowed) {  
                 my $isowner = &is_courseowner($cid,$coursedata{'internal.courseowner'});  
                 if ($isowner) {  
                     if (($role_code eq 'co') && ($class eq 'Community')) {  
                         $allowed = 1;  
                     } elsif (($role_code eq 'cc') && ($class eq 'Course')) {  
                         $allowed = 1;  
                     }  
                 }  
             }  
             if ((&Apache::lonnet::allowed('dro',$coursedom)) ||  
                 (&Apache::lonnet::allowed('dro',$ccdomain))) {  
                $delallowed=1;  
             }  
 # - custom role. Needs more info, too  
             if ($croletitle) {  
                 if (&Apache::lonnet::allowed('ccr',$coursedom.'/'.$coursedir)) {  
                     $allowed=1;  
                     $thisrole.='.'.$role_code;  
                 }  
             }  
             if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {  
                 $carea.='<br />Section: '.$3;  
                 $sortkey.="\0$3";  
                 if (!$allowed) {  
                    if ($env{'request.course.sec'} eq $3) {  
                        if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {  
                            $allowed = 1;  
                        }  
                    }  
                 }  
             }  
             $area=$carea;  
         } else {  
             $sortkey.="\0".$area;  
             # Determine if current user is able to revoke privileges  
             if ($area=~m{^/($match_domain)/}) {  
                 if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||  
                     (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {                      (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                     $allowed=1;                      $allowed=1;
                 }                  }
                 if (((&Apache::lonnet::allowed('dro',$1))  ||                  if ((&Apache::lonnet::allowed('dro',$1)) ||
                     (&Apache::lonnet::allowed('dro',$ccdomain))) &&                      (&Apache::lonnet::allowed('dro',$ccdomain))) {
                     ($role_code ne 'dc')) {  
                     $delallowed=1;                      $delallowed=1;
                 }                  }
             } else {  # - custom role. Needs more info, too
                 if (&Apache::lonnet::allowed('c'.$role_code,'/')) {                  if ($croletitle) {
                     $allowed=1;                      if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
                           $allowed=1;
                           $thisrole.='.'.$role_code;
                       }
                 }                  }
             }                  # Compute the background color based on $area
             if ($role_code eq 'ca' || $role_code eq 'au') {                  if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {
                 $class='Construction Space';                      $carea.='<br />Section: '.$3;
             } elsif ($role_code eq 'su') {                      $sortkey.="\0$3";
                 $class='System';                      if (!$allowed) {
                           if ($env{'request.course.sec'} eq $3) {
                               if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {
                                   $allowed = 1;
                               }
                           }
                       }
                   }
                   $area=$carea;
             } else {              } else {
                 $class='Domain';                  $sortkey.="\0".$area;
                   # Determine if current user is able to revoke privileges
                   if ($area=~m{^/($match_domain)/}) {
                       if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
                          (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                           $allowed=1;
                       }
                       if (((&Apache::lonnet::allowed('dro',$1))  ||
                            (&Apache::lonnet::allowed('dro',$ccdomain))) &&
                           ($role_code ne 'dc')) {
                           $delallowed=1;
                       }
                   } else {
                       if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
                           $allowed=1;
                       }
                   }
                   if ($role_code eq 'ca' || $role_code eq 'au') {
                       $class='Construction Space';
                   } elsif ($role_code eq 'su') {
                       $class='System';
                   } else {
                       $class='Domain';
                   }
             }              }
         }              if (($role_code eq 'ca') || ($role_code eq 'aa')) {
         if (($role_code eq 'ca') || ($role_code eq 'aa')) {                  $area=~m{/($match_domain)/($match_username)};
             $area=~m{/($match_domain)/($match_username)};                  if (&Apache::lonuserutils::authorpriv($2,$1)) {
             if (&Apache::lonuserutils::authorpriv($2,$1)) {                      $allowed=1;
                 $allowed=1;                  } else {
             } else {                      $allowed=0;
                 $allowed=0;                  }
             }              }
         }              my $row = '';
         my $row = '';              $row.= '<td>';
         $row.= '<td>';              my $active=1;
         my $active=1;              $active=0 if (($role_end_time) && ($now>$role_end_time));
         $active=0 if (($role_end_time) && ($now>$role_end_time));              if (($active) && ($allowed)) {
         if (($active) && ($allowed)) {                  $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';
             $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';  
         } else {  
             if ($active) {  
                $row.='&nbsp;';  
             } else {              } else {
                $row.=&mt('expired or revoked');                  if ($active) {
                      $row.='&nbsp;';
                   } else {
                      $row.=&mt('expired or revoked');
                   }
             }              }
         }              $row.='</td><td>';
         $row.='</td><td>';              if ($allowed && !$active) {
         if ($allowed && !$active) {                  $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
             $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';              } else {
         } else {                  $row.='&nbsp;';
             $row.='&nbsp;';              }
         }              $row.='</td><td>';
         $row.='</td><td>';              if ($delallowed) {
         if ($delallowed) {                  $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
             $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';              } else {
         } else {                  $row.='&nbsp;';
             $row.='&nbsp;';              }
         }              my $plaintext='';
         my $plaintext='';              if (!$croletitle) {
         if (!$croletitle) {                  $plaintext=&Apache::lonnet::plaintext($role_code,$class)
             $plaintext=&Apache::lonnet::plaintext($role_code,$class)              } else {
         } else {                  $plaintext=
             $plaintext=          "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
                 &mt('Customrole [_1][_2]defined by [_3]',              }
                         '"'.$croletitle.'"',              $row.= '</td><td>'.$plaintext.
                         '<br />',                     '</td><td>'.$area.
                         $croleuname.':'.$croleudom);                     '</td><td>'.($role_start_time?localtime($role_start_time)
         }                                                  : '&nbsp;' ).
         $row.= '</td><td>'.$plaintext.                     '</td><td>'.($role_end_time  ?localtime($role_end_time)
                '</td><td>'.$area.                                                  : '&nbsp;' )
                '</td><td>'.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time)                     ."</td>";
                                             : '&nbsp;' ).              $sortrole{$sortkey}=$envkey;
               '</td><td>'.($role_end_time  ?&Apache::lonlocal::locallocaltime($role_end_time)              $roletext{$envkey}=$row;
                                             : '&nbsp;' )              $roleclass{$envkey}=$class;
                ."</td>";              $rolepriv{$envkey}=$allowed;
         $sortrole{$sortkey}=$envkey;              #$r->print($row);
         $roletext{$envkey}=$row;          } # end of foreach        (table building loop)
         $roleclass{$envkey}=$class;          my $rolesdisplay = 0;
         $rolepriv{$envkey}=$allowed;          my %output = ();
     } # end of foreach        (table building loop)          foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
               $output{$type} = '';
     my $rolesdisplay = 0;              foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
     my %output = ();                  if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
     foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {                      $output{$type}.=
         $output{$type} = '';                            &Apache::loncommon::start_data_table_row().
         foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {                            $roletext{$sortrole{$which}}.
             if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {                            &Apache::loncommon::end_data_table_row();
                 $output{$type}.=                  }
                       &Apache::loncommon::start_data_table_row().              }
                       $roletext{$sortrole{$which}}.              unless($output{$type} eq '') {
                       &Apache::loncommon::end_data_table_row();                  $output{$type} = '<tr class="LC_info_row">'.
             }                            "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
         }                             $output{$type};
         unless($output{$type} eq '') {                  $rolesdisplay = 1;
             $output{$type} = '<tr class="LC_info_row">'.              }
                       "<td align='center' colspan='7'>".&mt($type)."</td></tr>".          }
                       $output{$type};          if ($rolesdisplay == 1) {
             $rolesdisplay = 1;              my $contextrole='';
         }              if ($env{'request.course.id'}) {
     }                  $contextrole = 'Existing Roles in this Course';
     if ($rolesdisplay == 1) {              } elsif ($env{'request.role'} =~ /^au\./) {
         my $contextrole='';                  $contextrole = 'Existing Co-Author Roles in your Construction Space';
         if ($env{'request.course.id'}) {  
             if (&Apache::loncommon::course_type() eq 'Community') {  
                 $contextrole = &mt('Existing Roles in this Community');  
             } else {              } else {
                 $contextrole = &mt('Existing Roles in this Course');                  $contextrole = 'Existing Roles in this Domain';
             }              }
         } elsif ($env{'request.role'} =~ /^au\./) {              $r->print('
             $contextrole = &mt('Existing Co-Author Roles in your Construction Space');  
         } else {  
             $contextrole = &mt('Existing Roles in this Domain');  
         }  
         $r->print('  
 <h3>'.$lt{'rer'}.'</h3>'.  <h3>'.$lt{'rer'}.'</h3>'.
 '<div>'.$contextrole.'</div>'.  '<div>'.&mt($contextrole).'</div>'.
 &Apache::loncommon::start_data_table("LC_createuser").  &Apache::loncommon::start_data_table("LC_createuser").
 &Apache::loncommon::start_data_table_header_row().  &Apache::loncommon::start_data_table_header_row().
 '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}.  '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}.
 '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.  '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}.
 '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.  '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
 &Apache::loncommon::end_data_table_header_row());  &Apache::loncommon::end_data_table_header_row());
         foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {             foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
             if ($output{$type}) {                  if ($output{$type}) {
                 $r->print($output{$type}."\n");                      $r->print($output{$type}."\n");
                   }
             }              }
               $r->print(&Apache::loncommon::end_data_table());
         }          }
         $r->print(&Apache::loncommon::end_data_table());      }  # End of check for keys in rolesdump
     }  
     return;      return;
 }  }
   
Line 2068  sub personal_data_display { Line 1875  sub personal_data_display {
                 if ($canmodify_status{'inststatus'}) {                  if ($canmodify_status{'inststatus'}) {
                     $shown = &pick_inst_statuses($userenv{'inststatus'},$usertypes,$types);                      $shown = &pick_inst_statuses($userenv{'inststatus'},$usertypes,$types);
                 } else {                  } else {
                       $shown .= $userenv{'inststatus'};
                     if ($userenv{'inststatus'} eq '') {                      if ($userenv{'inststatus'} eq '') {
                         $hiderow = 1;                          $hiderow = 1;
                     } else {  
                         my @showitems;  
                         foreach my $item ( map { &unescape($_); } split(':',$userenv{'inststatus'})) {  
                             if (exists($usertypes->{$item})) {  
                                 push(@showitems,$usertypes->{$item});  
                             } else {  
                                 push(@showitems,$item);  
                             }  
                         }  
                         if (@showitems) {  
                             $shown = join(', ',@showitems);  
                         } else {  
                             $hiderow = 1;  
                         }  
                     }                      }
                 }                  }
                 if (!$hiderow) {                  if (!$hiderow) {
Line 2179  sub get_inststatuses { Line 1973  sub get_inststatuses {
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub update_user_data {  sub update_user_data {
     my ($r,$context,$crstype) = @_;       my ($r,$context) = @_; 
     my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},      my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
                                           $env{'form.ccdomain'});                                            $env{'form.ccdomain'});
     # Error messages      # Error messages
Line 2203  sub update_user_data { Line 1997  sub update_user_data {
                   $jsback."\n".                    $jsback."\n".
                   '// ]]>'."\n".                    '// ]]>'."\n".
                   '</script>'."\n";                    '</script>'."\n";
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);      my %breadcrumb_text = &singleuser_breadcrumb();
     my $args;      my $args;
     if ($env{'form.popup'}) {      if ($env{'form.popup'}) {
         $args->{'no_nav_bar'} = 1;          $args->{'no_nav_bar'} = 1;
Line 2300  sub update_user_data { Line 2094  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>');
     $r->print('<p class="LC_info">'.&mt('Please be patient').'</p>');  
     my (%alerts,%rulematch,%inst_results,%curr_rules);      my (%alerts,%rulematch,%inst_results,%curr_rules);
     my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');  
     my @usertools = ('aboutme','blog','portfolio');      my @usertools = ('aboutme','blog','portfolio');
     my @requestcourses = ('official','unofficial','community');      my @requestcourses = ('official','unofficial','community');
     my ($othertitle,$usertypes,$types) =       my ($othertitle,$usertypes,$types) = 
         &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});          &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});
     my %canmodify_status =  
         &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},  
                                                    ['inststatus']);  
     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 2369  sub update_user_data { Line 2158  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'});
         my (%changeHash,%newcustom,%changed,%changedinfo);          my (%changeHash,%newcustom,%changed);
         if ($uhome ne 'no_host') {          if ($uhome ne 'no_host') {
             if ($context eq 'domain') {              if ($env{'form.customquota'} == 1) {
                 if ($env{'form.customquota'} == 1) {                  if ($env{'form.portfolioquota'} eq '') {
                     if ($env{'form.portfolioquota'} eq '') {                      $newcustom{'quota'} = 0;
                         $newcustom{'quota'} = 0;                  } else {
                     } else {                      $newcustom{'quota'} = $env{'form.portfolioquota'};
                         $newcustom{'quota'} = $env{'form.portfolioquota'};                      $newcustom{'quota'} =~ s/[^\d\.]//g;
                         $newcustom{'quota'} =~ s/[^\d\.]//g;  
                     }  
                     $changed{'quota'} = &quota_admin($newcustom{'quota'},\%changeHash);  
                 }                  }
                 foreach my $item (@usertools) {                  $changed{'quota'} = &quota_admin($newcustom{'quota'},\%changeHash);
                     if ($env{'form.custom'.$item} == 1) {              }
                         $newcustom{$item} = $env{'form.tools_'.$item};              foreach my $item (@usertools) {
                         $changed{$item} = &tool_admin($item,$newcustom{$item},                  if ($env{'form.custom'.$item} == 1) {
                                                       \%changeHash,'tools');                      $newcustom{$item} = $env{'form.tools_'.$item};
                     }                      $changed{$item} = &tool_admin($item,$newcustom{$item},
                                                    \%changeHash,'tools');
                 }                  }
                 foreach my $item (@requestcourses) {              }
                     if ($env{'form.custom'.$item} == 1) {              foreach my $item (@requestcourses) {
                         $newcustom{$item} = $env{'form.crsreq_'.$item};                  $newcustom{$item} = $env{'form.crsreq_'.$item};
                         if ($env{'form.crsreq_'.$item} eq 'autolimit') {                  if ($env{'form.crsreq_'.$item} eq 'autolimit') {
                             $newcustom{$item} .= '=';                      $newcustom{$item} .= '=';
                             unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) {                      unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) {
                                 $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'};                          $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'};
                             }  
                         }  
                         $changed{$item} = &tool_admin($item,$newcustom{$item},  
                                                       \%changeHash,'requestcourses');  
                     }                      }
                 }                  }
                   $changed{$item} = &tool_admin($item,$newcustom{$item},
                                                 \%changeHash,'requestcourses');
             }              }
             if ($canmodify_status{'inststatus'}) {              if (exists($env{'form.inststatus'})) {
                 if (exists($env{'form.inststatus'})) {                  my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');
                     my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');                  if (@inststatuses > 0) {
                     if (@inststatuses > 0) {                      $changeHash{'inststatus'} = join(',',@inststatuses);
                         $changeHash{'inststatus'} = join(',',@inststatuses);                      $changed{'inststatus'} = $changeHash{'inststatus'};
                         $changed{'inststatus'} = $changeHash{'inststatus'};  
                     }  
                 }                  }
             }              }
             if (keys(%changed)) {              if (keys(%changed)) {
                 foreach my $item (@userinfo) {                  $changeHash{'firstname'}  = $env{'form.cfirstname'};
                     $changeHash{$item}  = $env{'form.c'.$item};                  $changeHash{'middlename'} = $env{'form.cmiddlename'};
                 }                  $changeHash{'lastname'}   = $env{'form.clastname'};
                   $changeHash{'generation'} = $env{'form.cgeneration'};
                   $changeHash{'id'}         = $env{'form.cid'};
                   $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
                 my $chgresult =                  my $chgresult =
                      &Apache::lonnet::put('environment',\%changeHash,                       &Apache::lonnet::put('environment',\%changeHash,
                                           $env{'form.ccdomain'},$env{'form.ccuname'});                                            $env{'form.ccdomain'},$env{'form.ccuname'});
Line 2442  sub update_user_data { Line 2228  sub update_user_data {
     $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.'.$end);          $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.'.$end);    
  }   }
     }      }
   
     $r->rflush(); # Finish display of header before time consuming actions start  
   
     ##      ##
     my (@userroles,%userupdate,$cnum,$cdom,%namechanged);      my (@userroles,%userupdate,$cnum,$cdom,$namechanged);
     if ($context eq 'course') {      if ($context eq 'course') {
         ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();          ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
         $crstype = &Apache::loncommon::course_type($cdom.'_'.$cnum);  
     }      }
     if (! $env{'form.makeuser'} ) {      if (! $env{'form.makeuser'} ) {
         # Check for need to change          # Check for need to change
Line 2533  sub update_user_data { Line 2315  sub update_user_data {
             if ($role eq 'cr') {              if ($role eq 'cr') {
                 push(@longroles,'Custom');                  push(@longroles,'Custom');
             } else {              } else {
                 push(@longroles,&Apache::lonnet::plaintext($role,$crstype));                   push(@longroles,&Apache::lonnet::plaintext($role)); 
             }              }
         }          }
           my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
         my %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles);          my %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles);
         foreach my $item (@userinfo) {          foreach my $item (@userinfo) {
             # Strip leading and trailing whitespace              # Strip leading and trailing whitespace
Line 2582  sub update_user_data { Line 2365  sub update_user_data {
             }              }
         }          }
         my ($quotachanged,$oldportfolioquota,$newportfolioquota,$oldinststatus,          my ($quotachanged,$oldportfolioquota,$newportfolioquota,$oldinststatus,
             $newinststatus,$oldisdefault,$newisdefault,%oldsettings,              $inststatus,$newinststatus,$oldisdefault,$newisdefault,$olddefquotatext,
             %oldsettingstext,%newsettings,%newsettingstext,@disporder,              $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext,
             $olddefquota,$oldsettingstatus,$newdefquota,$newsettingstatus);              $oldinststatuses,$newinststatuses);
         @disporder = ('inststatus');          my ($defquota,$settingstatus) = 
         if ($env{'request.role.domain'} eq $env{'form.ccdomain'}) {              &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);
             push(@disporder,'requestcourses');          my ($showquota,$showtools,$showrequestcourses,$showinststatus,$showreqotherdom);
         } else {  
             push(@disporder,'reqcrsotherdom');  
         }  
         push(@disporder,('quota','tools'));  
         $oldinststatus = $userenv{'inststatus'};  
         ($olddefquota,$oldsettingstatus) =  
             &Apache::loncommon::default_quota($env{'form.ccdomain'},$oldinststatus);  
         ($newdefquota,$newsettingstatus) = ($olddefquota,$oldsettingstatus);  
         my %canshow;  
         if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
             $canshow{'quota'} = 1;              $showquota = 1;
         }          }
         if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
             $canshow{'tools'} = 1;              $showtools = 1;
         }          }
         if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {
             $canshow{'requestcourses'} = 1;              $showrequestcourses = 1;
         } elsif (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {          } elsif (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
             $canshow{'reqcrsotherdom'} = 1;              $showreqotherdom = 1;
         }          }
         if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
             $canshow{'inststatus'} = 1;              $showinststatus = 1;
         }          }
         my (%changeHash,%changed);          my (%changeHash,%changed);
           $oldinststatus = $userenv{'inststatus'};
         if ($oldinststatus eq '') {          if ($oldinststatus eq '') {
             $oldsettings{'inststatus'} = $othertitle;              $oldinststatuses = $othertitle; 
         } else {          } else {
             if (ref($usertypes) eq 'HASH') {              if (ref($usertypes) eq 'HASH') {
                 $oldsettings{'inststatus'} = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'})));                  $oldinststatuses = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'})));
             } else {              } else {
                 $oldsettings{'inststatus'} = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'})));                  $oldinststatuses = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'})));
             }              }
         }          }
         $changeHash{'inststatus'} = $userenv{'inststatus'};          $changeHash{'inststatus'} = $userenv{'inststatus'};
         if ($canmodify_status{'inststatus'}) {          my %canmodify_inststatus = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},['inststatus'],\@userroles);
             $canshow{'inststatus'} = 1;          if ($canmodify_inststatus{'inststatus'}) {
             if (exists($env{'form.inststatus'})) {              if (exists($env{'form.inststatus'})) {
                 my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');                  my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');
                 if (@inststatuses > 0) {                  if (@inststatuses > 0) {
Line 2631  sub update_user_data { Line 2406  sub update_user_data {
                     $changeHash{'inststatus'} = $newinststatus;                      $changeHash{'inststatus'} = $newinststatus;
                     if ($newinststatus ne $oldinststatus) {                      if ($newinststatus ne $oldinststatus) {
                         $changed{'inststatus'} = $newinststatus;                          $changed{'inststatus'} = $newinststatus;
                         ($newdefquota,$newsettingstatus) =  
                             &Apache::loncommon::default_quota($env{'form.ccdomain'},$newinststatus);  
                     }                      }
                     if (ref($usertypes) eq 'HASH') {                      if (ref($usertypes) eq 'HASH') {
                         $newsettings{'inststatus'} = join(', ',map{ $usertypes->{$_}; } (@inststatuses));                          $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses)); 
                     } else {                      } else {
                         $newsettings{'inststatus'} = join(', ',@inststatuses);                          $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses));
                       }
                   } else {
                       $newinststatus = '';
                       $changeHash{'inststatus'} = $newinststatus;
                       $newinststatuses = $othertitle;
                       if ($newinststatus ne $oldinststatus) {
                           $changed{'inststatus'} = $changeHash{'inststatus'};
                     }                      }
                 }  
             } else {  
                 $newinststatus = '';  
                 $changeHash{'inststatus'} = $newinststatus;  
                 $newsettings{'inststatus'} = $othertitle;  
                 if ($newinststatus ne $oldinststatus) {  
                     $changed{'inststatus'} = $changeHash{'inststatus'};  
                     ($newdefquota,$newsettingstatus) =  
                         &Apache::loncommon::default_quota($env{'form.ccdomain'},$newinststatus);  
                 }                  }
             }              }
         } elsif ($context ne 'selfcreate') {  
             $canshow{'inststatus'} = 1;  
             $newsettings{'inststatus'} = $oldsettings{'inststatus'};  
         }          }
         $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};          $changeHash{'portfolioquota'} = $userenv{'portfolioquota'};
         if ($context eq 'domain') {          if ($userenv{'portfolioquota'} ne '') {
             if ($userenv{'portfolioquota'} ne '') {              $oldportfolioquota = $userenv{'portfolioquota'};
                 $oldportfolioquota = $userenv{'portfolioquota'};              if ($env{'form.customquota'} == 1) {
                 if ($env{'form.customquota'} == 1) {                  if ($env{'form.portfolioquota'} eq '') {
                     if ($env{'form.portfolioquota'} eq '') {                      $newportfolioquota = 0;
                         $newportfolioquota = 0;  
                     } else {  
                         $newportfolioquota = $env{'form.portfolioquota'};  
                         $newportfolioquota =~ s/[^\d\.]//g;  
                     }  
                     if ($newportfolioquota != $oldportfolioquota) {  
                         $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);  
                     }  
                 } else {                  } else {
                     $changed{'quota'} = &quota_admin('',\%changeHash);                      $newportfolioquota = $env{'form.portfolioquota'};
                     $newportfolioquota = $newdefquota;                      $newportfolioquota =~ s/[^\d\.]//g;
                     $newisdefault = 1;  
                 }                  }
             } else {                  if ($newportfolioquota != $oldportfolioquota) {
                 $oldisdefault = 1;  
                 $oldportfolioquota = $olddefquota;  
                 if ($env{'form.customquota'} == 1) {  
                     if ($env{'form.portfolioquota'} eq '') {  
                         $newportfolioquota = 0;  
                     } else {  
                         $newportfolioquota = $env{'form.portfolioquota'};  
                         $newportfolioquota =~ s/[^\d\.]//g;  
                     }  
                     $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);                      $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);
                 } else {  
                     $newportfolioquota = $newdefquota;  
                     $newisdefault = 1;  
                 }                  }
             }  
             if ($oldisdefault) {  
                 $oldsettingstext{'quota'} = &get_defaultquota_text($oldsettingstatus);  
             }  
             if ($newisdefault) {  
                 $newsettingstext{'quota'} = &get_defaultquota_text($newsettingstatus);  
             }  
             &tool_changes('tools',\@usertools,\%oldsettings,\%oldsettingstext,\%userenv,  
                           \%changeHash,\%changed,\%newsettings,\%newsettingstext);  
             if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) {  
                 &tool_changes('requestcourses',\@requestcourses,\%oldsettings,\%oldsettingstext,  
                               \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);  
             } else {              } else {
                 &tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext,                  $changed{'quota'} = &quota_admin('',\%changeHash);
                               \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);                  $newportfolioquota = $defquota;
                   $newisdefault = 1;
             }              }
         }          } else {
         foreach my $item (@userinfo) {              $oldisdefault = 1;
             if ($env{'form.c'.$item} ne $userenv{$item}) {              $oldportfolioquota = $defquota;
                 $namechanged{$item} = 1;              if ($env{'form.customquota'} == 1) {
                   if ($env{'form.portfolioquota'} eq '') {
                       $newportfolioquota = 0;
                   } else {
                       $newportfolioquota = $env{'form.portfolioquota'};
                       $newportfolioquota =~ s/[^\d\.]//g;
                   }
                   $changed{'quota'} = &quota_admin($newportfolioquota,\%changeHash);
               } else {
                   $newportfolioquota = $defquota;
                   $newisdefault = 1;
             }              }
         }          }
         $oldsettings{'quota'} = $oldportfolioquota.' Mb';          if ($oldisdefault) {
         $newsettings{'quota'} = $newportfolioquota.' Mb';              $olddefquotatext = &get_defaultquota_text($settingstatus);
         if ((keys(%namechanged) > 0) || (keys(%changed) > 0)) {          }
           if ($newisdefault) {
               $newdefquotatext = &get_defaultquota_text($settingstatus);
           }
           &tool_changes('tools',\@usertools,\%oldaccess,\%oldaccesstext,\%userenv,
                         \%changeHash,\%changed,\%newaccess,\%newaccesstext);
           if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) {
               &tool_changes('requestcourses',\@requestcourses,\%oldaccess,\%oldaccesstext,
                             \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);
           } else {
               &tool_changes('reqcrsotherdom',\@requestcourses,\%oldaccess,\%oldaccesstext,
                             \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);
           }
           if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
               $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
               $env{'form.clastname'}   ne $userenv{'lastname'}   ||
               $env{'form.cgeneration'} ne $userenv{'generation'} ||
               $env{'form.cid'} ne $userenv{'id'}                 ||
               $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) {
               $namechanged = 1;
           }
           if (($namechanged) || (keys(%changed) > 0)) {
               $changeHash{'firstname'}  = $env{'form.cfirstname'};
               $changeHash{'middlename'} = $env{'form.cmiddlename'};
               $changeHash{'lastname'}   = $env{'form.clastname'};
               $changeHash{'generation'} = $env{'form.cgeneration'};
               $changeHash{'id'}         = $env{'form.cid'};
               $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
             my ($chgresult,$namechgresult);              my ($chgresult,$namechgresult);
             if (keys(%changed) > 0) {              if (keys(%changed) > 0) {
                 $chgresult =                   $chgresult = 
Line 2728  sub update_user_data { Line 2501  sub update_user_data {
                                 $newenvhash{'environment.requestcourses.'.$key} =                                  $newenvhash{'environment.requestcourses.'.$key} =
                                     $changeHash{'requestcourses.'.$key};                                      $changeHash{'requestcourses.'.$key};
                                 if ($changeHash{'requestcourses.'.$key} ne '') {                                  if ($changeHash{'requestcourses.'.$key} ne '') {
                                     $newenvhash{'environment.canrequest.'.$key} = 1;                                      $newenvhash{'environment.canrequest.'.$key} =
                                           $changeHash{'requestcourses.'.$key};
                                 } else {                                  } else {
                                     $newenvhash{'environment.canrequest.'.$key} =                                      $newenvhash{'environment.canrequest.'.$key} =
           &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},            &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
Line 2752  sub update_user_data { Line 2526  sub update_user_data {
                     }                      }
                 }                  }
             }              }
             if (keys(%namechanged) > 0) {              if ($namechanged) {
                 foreach my $field (@userinfo) {              # Make the change
                     $changeHash{$field}  = $env{'form.c'.$field};  
                 }  
 # Make the change  
                 $namechgresult =                  $namechgresult =
                     &Apache::lonnet::modifyuser($env{'form.ccdomain'},                      &Apache::lonnet::modifyuser($env{'form.ccdomain'},
                         $env{'form.ccuname'},$changeHash{'id'},undef,undef,                          $env{'form.ccuname'},$changeHash{'id'},undef,undef,
                         $changeHash{'firstname'},$changeHash{'middlename'},                          $changeHash{'firstname'},$changeHash{'middlename'},
                         $changeHash{'lastname'},$changeHash{'generation'},                          $changeHash{'lastname'},$changeHash{'generation'},
                         $changeHash{'id'},undef,$changeHash{'permanentemail'},undef,\@userinfo);                          $changeHash{'id'},undef,$changeHash{'permanentemail'});
                 %userupdate = (                  %userupdate = (
                                lastname   => $env{'form.clastname'},                                 lastname   => $env{'form.clastname'},
                                middlename => $env{'form.cmiddlename'},                                 middlename => $env{'form.cmiddlename'},
Line 2771  sub update_user_data { Line 2542  sub update_user_data {
                                id         => $env{'form.cid'},                                 id         => $env{'form.cid'},
                              );                               );
             }              }
             if (((keys(%namechanged) > 0) && $namechgresult eq 'ok') ||              if (($namechanged && $namechgresult eq 'ok') || 
                 ((keys(%changed) > 0) && $chgresult eq 'ok')) {                  ((keys(%changed) > 0) && $chgresult eq 'ok')) {
             # Tell the user we changed the name              # Tell the user we changed the name
                 &display_userinfo($r,1,\@disporder,\%canshow,\@requestcourses,   my %lt=&Apache::lonlocal::texthash(
                                   \@usertools,\%userenv,\%changed,\%namechanged,                               'uic'        => 'User Information Changed',
                                   \%oldsettings, \%oldsettingstext,\%newsettings,                               'frst'       => 'First Name',
                                   \%newsettingstext);                               'mddl'       => 'Middle Name',
                                'lst'        => 'Last Name',
                                'gen'        => 'Generation',
                                'id'         => 'Student/Employee ID',
                                'mail'       => 'Permanent e-mail address',
                                'disk'       => 'Disk space allocated to portfolio files',
                                'blog'       => 'Blog Availability',
                                'aboutme'    => 'Personal Information Page Availability',
                                'portfolio'  => 'Portfolio Availability',
                                'official'   => 'Can Request Official Courses',
                                'unofficial' => 'Can Request Unofficial Courses',
                                'community'  => 'Can Request Communities',
                                'inststatus' => "Affiliation",
                                'prvs'       => 'Previous Value:',
                                'chto'       => 'Changed To:'
      );
                   $r->print('<h4>'.$lt{'uic'}.'</h4>'.
                             &Apache::loncommon::start_data_table().
                             &Apache::loncommon::start_data_table_header_row());
                   $r->print(<<"END");
       <th>&nbsp;</th>
       <th>$lt{'frst'}</th>
       <th>$lt{'mddl'}</th>
       <th>$lt{'lst'}</th>
       <th>$lt{'gen'}</th>
       <th>$lt{'id'}</th>
       <th>$lt{'mail'}</th>
   END
                   if ($showinststatus) {
                       $r->print("
       <th>$lt{'inststatus'}</th>\n");
                   }
                   if ($showrequestcourses) {
                       foreach my $item (@requestcourses) {
                           $r->print("
       <th>$lt{$item}</th>\n");
                       }
                   } elsif ($showreqotherdom) {
                       foreach my $item (@requestcourses) {
                           $r->print("
       <th>$lt{$item}</th>\n");
                       }
                   }
                   if ($showquota) {
                       $r->print("
       <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().
                             &Apache::loncommon::start_data_table_row());
                   $r->print(<<"END");
       <td><b>$lt{'prvs'}</b></td>
       <td>$userenv{'firstname'}  </td>
       <td>$userenv{'middlename'} </td>
       <td>$userenv{'lastname'}   </td>
       <td>$userenv{'generation'} </td>
       <td>$userenv{'id'}</td>
       <td>$userenv{'permanentemail'} </td>
   END
                   if ($showinststatus) {
                       $r->print("
       <td>$oldinststatuses</td>\n");
                   }  
                   if ($showrequestcourses) {
                       foreach my $item (@requestcourses) {
                           $r->print("
       <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n");
                       }
                   } elsif ($showreqotherdom) {
                       foreach my $item (@requestcourses) {
                           $r->print("
       <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n");
                       }
                   }
                   if ($showquota) {
                       $r->print("
       <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().
                             &Apache::loncommon::start_data_table_row());
                   $r->print(<<"END");
       <td><span class="LC_nobreak"><b>$lt{'chto'}</b></span></td>
       <td>$env{'form.cfirstname'}  </td>
       <td>$env{'form.cmiddlename'} </td>
       <td>$env{'form.clastname'}   </td>
       <td>$env{'form.cgeneration'} </td>
       <td>$env{'form.cid'} </td>
       <td>$env{'form.cpermanentemail'} </td>
   END
                   if ($showinststatus) {
                       $r->print("
       <td>$newinststatuses</td>\n");
                   }
                   if ($showrequestcourses) {
                       foreach my $item (@requestcourses) {
                           $r->print("
       <td>$newaccess{$item} $newaccesstext{$item} </td>\n");
                       }
                   } elsif ($showreqotherdom) {
                       foreach my $item (@requestcourses) {
                           $r->print("
       <td>$newaccess{$item} $newaccesstext{$item} </td>\n");
                       }
                   }
                   if ($showquota) {
                       $r->print("
       <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().
                             &Apache::loncommon::end_data_table().'<br />');
                 if ($env{'form.cid'} ne $userenv{'id'}) {                  if ($env{'form.cid'} ne $userenv{'id'}) {
                     &Apache::lonnet::idput($env{'form.ccdomain'},                      &Apache::lonnet::idput($env{'form.ccdomain'},
                          ($env{'form.ccuname'} => $env{'form.cid'}));                           ($env{'form.ccuname'} => $env{'form.cid'}));
Line 2804  sub update_user_data { Line 2700  sub update_user_data {
                       $env{'form.ccuname'}.' '.&mt('in domain').' '.                        $env{'form.ccuname'}.' '.&mt('in domain').' '.
                       $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, quota, tool availability,              # They did not want to change the users name, quota, tool availability,
             # or ability to request creation of courses,               # or ability to request creation of courses, 
             # but we can still tell them what the name and quota and availabilities are                # but we can still tell them what the name and quota and availabilities are  
             &display_userinfo($r,undef,\@disporder,\%canshow,\@requestcourses,      my %lt=&Apache::lonlocal::texthash(
                               \@usertools,\%userenv,\%changed,\%namechanged,\%oldsettings,                             'id'         => "Student/Employee ID",
                               \%oldsettingstext,\%newsettings,\%newsettingstext);                             'mail'       => "Permanent e-mail address",
                              'disk'       => "Disk space allocated to user's portfolio files",
                              'blog'       => "Blog Availability",
                              'aboutme'    => "Personal Information Page Availability",
                              'portfolio'  => "Portfolio Availability",
                              'official'   => "Can Request Official Courses",
                              'unofficial' => "Can Request Unofficial Courses",
                              'community'  => "Can Request Communities",
                              'inststatus' => "Affiliation",
          );
               $r->print(<<"END");
   <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}
   END
               if ($userenv{'permanentemail'} ne '') {
                   $r->print('<br />['.$lt{'mail'}.': '.
                             $userenv{'permanentemail'}.']');
               }
               if ($showinststatus) {
                   $r->print('<br />['.$lt{'inststatus'}.': '.$oldinststatuses.']');
               }
               if ($showrequestcourses) {
                   foreach my $item (@requestcourses) {
                       $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.
                                 $newaccesstext{$item}.']'."\n");
                   }
               } elsif ($showreqotherdom) {
                   foreach my $item (@requestcourses) {
                       $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.
                                 $newaccesstext{$item}.']'."\n");
                   }
               }
               if ($showtools) {
                   foreach my $item (@usertools) {
                       $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '.
                                 $newaccesstext{$item}.']'."\n");
                   }
               }
               if ($showquota) {
                   $r->print('<br />['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '.
                             $olddefquotatext.']');
               }
               $r->print('</h4>');
         }          }
         if (@mod_disallowed) {          if (@mod_disallowed) {
             my ($rolestr,$contextname);              my ($rolestr,$contextname);
Line 2847  sub update_user_data { Line 2784  sub update_user_data {
                   .'</span>');                    .'</span>');
     }      }
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype);          &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context);
         $r->print('<p><a href="javascript:backPage(document.userupdate)">');          $r->print('<p><a href="javascript:backPage(document.userupdate)">'.
         if ($crstype eq 'Community') {                    &mt('Enroll Another Student').'</a></p>');
             $r->print(&mt('Enroll Another Member'));  
         } else {  
             $r->print(&mt('Enroll Another Student'));  
         }  
         $r->print('</a></p>');  
     } else {      } else {
         my @rolechanges = &update_roles($r,$context);          my @rolechanges = &update_roles($r,$context);
         if (keys(%namechanged) > 0) {          if ($namechanged) {
             if ($context eq 'course') {              if ($context eq 'course') {
                 if (@userroles > 0) {                  if (@userroles > 0) {
                     if ((@rolechanges == 0) ||                       if ((@rolechanges == 0) || 
Line 2886  sub update_user_data { Line 2818  sub update_user_data {
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
 sub display_userinfo {  
     my ($r,$changed,$order,$canshow,$requestcourses,$usertools,$userenv,  
         $changedhash,$namechangedhash,$oldsetting,$oldsettingtext,  
         $newsetting,$newsettingtext) = @_;  
     return unless (ref($order) eq 'ARRAY' &&  
                    ref($canshow) eq 'HASH' &&  
                    ref($requestcourses) eq 'ARRAY' &&  
                    ref($usertools) eq 'ARRAY' &&  
                    ref($userenv) eq 'HASH' &&  
                    ref($changedhash) eq 'HASH' &&  
                    ref($oldsetting) eq 'HASH' &&  
                    ref($oldsettingtext) eq 'HASH' &&  
                    ref($newsetting) eq 'HASH' &&  
                    ref($newsettingtext) eq 'HASH');  
     my %lt=&Apache::lonlocal::texthash(  
          'ui'             => 'User Information (unchanged)',  
          'uic'            => 'User Information Changed',  
          'firstname'      => 'First Name',  
          'middlename'     => 'Middle Name',  
          'lastname'       => 'Last Name',  
          'generation'     => 'Generation',  
          'id'             => 'Student/Employee ID',  
          'permanentemail' => 'Permanent e-mail address',  
          'quota'          => 'Disk space allocated to portfolio files',  
          'blog'           => 'Blog Availability',  
          'aboutme'        => 'Personal Information Page Availability',  
          'portfolio'      => 'Portfolio Availability',  
          'official'       => 'Can Request Official Courses',  
          'unofficial'     => 'Can Request Unofficial Courses',  
          'community'      => 'Can Request Communities',  
          'inststatus'     => "Affiliation",  
          'prvs'           => 'Previous Value:',  
          'chto'           => 'Changed To:'  
     );  
     my $title = $lt{'ui'};  
     if ($changed) {  
         $title = $lt{'uic'};  
     }  
     $r->print('<h4>'.$title.'</h4>'.  
               &Apache::loncommon::start_data_table().  
               &Apache::loncommon::start_data_table_header_row());  
     if ($changed) {  
         $r->print("<th>&nbsp;</th>\n");  
     }  
     my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');  
     foreach my $item (@userinfo) {  
         $r->print("<th>$lt{$item}</th>\n");  
     }  
     foreach my $entry (@{$order}) {  
         if ($canshow->{$entry}) {  
             if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) {  
                 foreach my $item (@{$requestcourses}) {  
                     $r->print("<th>$lt{$item}</th>\n");  
                 }  
             } elsif ($entry eq 'tools') {  
                 foreach my $item (@{$usertools}) {  
                     $r->print("<th>$lt{$item}</th>\n");  
                 }  
             } else {  
                 $r->print("<th>$lt{$entry}</th>\n");  
             }  
         }  
     }  
     $r->print(&Apache::loncommon::end_data_table_header_row().  
              &Apache::loncommon::start_data_table_row());  
     if ($changed) {  
         $r->print('<td><b>'.$lt{'prvs'}.'</b></td>'."\n");  
     }  
     foreach my $item (@userinfo) {  
         $r->print('<td>'.$userenv->{$item}.' </td>'."\n");  
     }  
     foreach my $entry (@{$order}) {  
         if ($canshow->{$entry}) {  
             if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) {  
                 foreach my $item (@{$requestcourses}) {  
                     $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n");  
                 }  
             } elsif ($entry eq 'tools') {  
                 foreach my $item (@{$usertools}) {  
                     $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n");  
                 }  
             } else {  
                 $r->print("<td>$oldsetting->{$entry} $oldsettingtext->{$entry} </td>\n");  
             }  
         }  
     }  
     $r->print(&Apache::loncommon::end_data_table_row());  
     if ($changed) {  
         $r->print(&Apache::loncommon::start_data_table_row().  
                   '<td><span class="LC_nobreak"><b>'.$lt{'chto'}.'</b></span></td>'."\n");  
         foreach my $item (@userinfo) {  
             my $value = $env{'form.c'.$item};  
             if ($namechangedhash->{$item}) {  
                 $value = '<span class="LC_cusr_emph">'.$value.'</span>';  
             }  
             $r->print("<td>$value </td>\n");  
         }  
         foreach my $entry (@{$order}) {  
             if ($canshow->{$entry}) {  
                 if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) {  
                     foreach my $item (@{$requestcourses}) {  
                         my $value = $newsetting->{$item}.' '.$newsettingtext->{$item};  
                         if ($changedhash->{$item}) {  
                             $value = '<span class="LC_cusr_emph">'.$value.'</span>';  
                         }  
                         $r->print("<td>$value </td>\n");  
                     }  
                 } elsif ($entry eq 'tools') {  
                     foreach my $item (@{$usertools}) {  
                         my $value = $newsetting->{$item}.' '.$newsettingtext->{$item};  
                         if ($changedhash->{$item}) {  
                             $value = '<span class="LC_cusr_emph">'.$value.'</span>';  
                         }  
                         $r->print("<td>$value </td>\n");  
                     }  
                 } else {  
                     my $value = $newsetting->{$entry}.' '.$newsettingtext->{$entry};  
                     if ($changedhash->{$entry}) {  
                         $value = '<span class="LC_cusr_emph">'.$value.'</span>';  
                     }  
                     $r->print("<td>$value </td>\n");  
                 }  
             }  
         }  
         $r->print(&Apache::loncommon::end_data_table_row());  
     }  
     $r->print(&Apache::loncommon::end_data_table().'<br />');  
     return;  
 }  
   
 sub tool_changes {  sub tool_changes {
     my ($context,$usertools,$oldaccess,$oldaccesstext,$userenv,$changeHash,      my ($context,$usertools,$oldaccess,$oldaccesstext,$userenv,$changeHash,
         $changed,$newaccess,$newaccesstext) = @_;          $changed,$newaccess,$newaccesstext) = @_;
Line 3453  sub update_roles { Line 3255  sub update_roles {
 }  }
   
 sub enroll_single_student {  sub enroll_single_student {
     my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype) = @_;      my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context) = @_;
     $r->print('<h3>');      $r->print('<h3>'.&mt('Enrolling Student').'</h3>');
     if ($crstype eq 'Community') {  
         $r->print(&mt('Enrolling Member'));  
     } else {  
         $r->print(&mt('Enrolling Student'));  
     }  
     $r->print('</h3>');  
   
     # Remove non alphanumeric values from section      # Remove non alphanumeric values from section
     $env{'form.sections'}=~s/\W//g;      $env{'form.sections'}=~s/\W//g;
Line 3493  sub enroll_single_student { Line 3289  sub enroll_single_student {
         }          }
         $r->print('.<br />'.$showstart.'; '.$showend);          $r->print('.<br />'.$showstart.'; '.$showend);
         if ($startdate <= $now && !$newuser) {          if ($startdate <= $now && !$newuser) {
             $r->print('<p> ');              $r->print("<p> ".&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.')."</p>");
             if ($crstype eq 'Community') {  
                 $r->print(&mt('If the member is currently logged-in to LON-CAPA, the new role will be available when the member next logs in.'));  
             } else {  
                 $r->print(&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.'));  
             }  
             $r->print('</p>');  
         }          }
     } else {      } else {
         $r->print(&mt('unable to enroll').": ".$enroll_result);          $r->print(&mt('unable to enroll').": ".$enroll_result);
Line 3624  sub build_roles { Line 3414  sub build_roles {
   
 sub custom_role_editor {  sub custom_role_editor {
     my ($r) = @_;      my ($r) = @_;
     my $action = $env{'form.customroleaction'};      my $rolename=$env{'form.rolename'};
     my $rolename;  
     if ($action eq 'new') {      if ($rolename eq 'make new role') {
         $rolename=$env{'form.newrolename'};   $rolename=$env{'form.newrolename'};
     } else {  
         $rolename=$env{'form.rolename'};  
     }      }
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
   
     if (!$rolename || $env{'form.phase'} eq 'pickrole') {      if (!$rolename || $env{'form.phase'} eq 'pickrole') {
  &print_username_entry_form($r);   &print_username_entry_form($r);
         return;          return;
     }      }
     my ($crstype,$context);  
     if ($env{'request.course.id'}) {  
         $crstype = &Apache::loncommon::course_type();  
         $context = 'course';  
     } else {  
         $context = 'domain';  
         $crstype = $env{'form.templatecrstype'};  
     }  
 # ------------------------------------------------------- What can be assigned?  # ------------------------------------------------------- What can be assigned?
     my %full=();      my %full=();
     my %courselevel=();      my %courselevel=();
Line 3653  sub custom_role_editor { Line 3434  sub custom_role_editor {
     my $dompriv='';      my $dompriv='';
     my $coursepriv='';      my $coursepriv='';
     my $body_top;      my $body_top;
       my ($disp_dummy,$disp_roles) = &Apache::lonnet::get('roles',["st"]);
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
Line 3661  sub custom_role_editor { Line 3443  sub custom_role_editor {
  $body_top .= &mt('Existing Role').' "';   $body_top .= &mt('Existing Role').' "';
 # ------------------------------------------------- Get current role privileges  # ------------------------------------------------- Get current role privileges
  ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);   ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);
         if ($crstype eq 'Community') {  
             $syspriv =~ s/bre\&S//;  
         }  
     } else {      } else {
  $body_top .= &mt('New Role').' "';   $body_top .= &mt('New Role').' "';
  $roledef='';   $roledef='';
Line 3703  sub custom_role_editor { Line 3482  sub custom_role_editor {
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $button_code = "\n";      my $button_code = "\n";
     my $head_script = "\n";      my $head_script = "\n";
     $head_script .= '<script type="text/javascript">'."\n".      $head_script .= '<script type="text/javascript">'."\n"
                     '// <![CDATA['."\n";                     .'// <![CDATA['."\n";
     my @template_roles = ("in","ta","ep");      my @template_roles = ("cc","in","ta","ep","st");
     if ($context eq 'domain') {  
         push(@template_roles,"ad");  
     }  
     push(@template_roles,"st");  
     if ($crstype eq 'Community') {  
         unshift(@template_roles,'co');  
     } else {  
         unshift(@template_roles,'cc');  
     }  
     foreach my $role (@template_roles) {      foreach my $role (@template_roles) {
         $head_script .= &make_script_template($role,$crstype);          $head_script .= &make_script_template($role);
         $button_code .= &make_button_code($role,$crstype).' ';          $button_code .= &make_button_code($role).' ';
     }      }
     my $context_code;      $head_script .= "\n".$jsback."\n"
     if ($context eq 'domain') {                     .'// ]]>'."\n"
         my $checkedCommunity = '';                     .'</script>'."\n";
         my $checkedCourse = ' checked="checked"';  
         if ($env{'form.templatecrstype'} eq 'Community') {  
             $checkedCommunity = $checkedCourse;  
             $checkedCourse = '';  
         }  
         $context_code = '<label>'.  
                         '<input type="radio" name="templatecrstype" value="Course"'.$checkedCourse.' onclick="this.form.submit();">'.  
                         &mt('Course').  
                         '</label>'.('&nbsp;' x2).  
                         '<label>'.  
                         '<input type="radio" name="templatecrstype" value="Community"'.$checkedCommunity.' onclick="this.form.submit();">'.  
                         &mt('Community').  
                         '</label>'.  
                         '</fieldset>'.  
                         '<input type="hidden" name="customroleaction" value="'.  
                         $action.'" />';  
         if ($env{'form.customroleaction'} eq 'new') {  
             $context_code .= '<input type="hidden" name="newrolename" value="'.  
                              $rolename.'" />';  
         } else {  
             $context_code .= '<input type="hidden" name="rolename" value="'.  
                              $rolename.'" />';  
         }  
         $context_code .= '<input type="hidden" name="action" value="custom" />'.  
                          '<input type="hidden" name="phase" value="selected_custom_edit" />';  
     }  
     $head_script .= "\n".$jsback."\n".  
                     '// ]]>'."\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));
     &Apache::lonhtmlcommon::add_breadcrumb     &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage(document.form1,'pickrole','')",       ({href=>"javascript:backPage(document.form1,'pickrole','')",
        text=>"Pick custom role",         text=>"Pick custom role",
        faq=>282,bug=>'Instructor Interface',},         faq=>282,bug=>'Instructor Interface',},
Line 3769  sub custom_role_editor { Line 3510  sub custom_role_editor {
                     'dml'  => "Domain Level",                      'dml'  => "Domain Level",
                     'ssl'  => "System Level");                      'ssl'  => "System Level");
   
     $r->print('<div class="LC_left_float">'      $r->print('<div>'
              .'<form action=""><fieldset>'               .'<form action=""><fieldset>'
              .'<legend>'.&mt('Select a Template').'</legend>'               .'<legend>'.&mt('Select a Template').'</legend>'
              .$button_code               .$button_code
              .'</fieldset></form></div>');               .'</fieldset></form>'
     if ($context_code) {               .'</div>'
         $r->print('<div class="LC_left_float">'      );
                  .'<form action="/adm/createuser" method="post"><fieldset>'  
                  .'<legend>'.&mt('Context').'</legend>'  
                  .$context_code  
                  .'</form>'  
                  .'</div>'  
         );  
     }  
     $r->print('<br clear="all" />');  
   
     $r->print(<<ENDCCF);      $r->print(<<ENDCCF);
 <form name="form1" method="post">  <form name="form1" method="post">
Line 3795  ENDCCF Line 3528  ENDCCF
 '<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}.  '<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}.
 '</th><th>'.$lt{'ssl'}.'</th>'.  '</th><th>'.$lt{'ssl'}.'</th>'.
               &Apache::loncommon::end_data_table_header_row());                &Apache::loncommon::end_data_table_header_row());
     foreach my $priv (sort(keys(%full))) {      foreach my $priv (sort keys %full) {
         my $privtext = &Apache::lonnet::plaintext($priv,$crstype);          my $privtext = &Apache::lonnet::plaintext($priv);
         $r->print(&Apache::loncommon::start_data_table_row().          $r->print(&Apache::loncommon::start_data_table_row().
           '<td>'.$privtext.'</td><td>'.            '<td>'.$privtext.'</td><td>'.
     ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c"'.      ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c"'.
Line 3804  ENDCCF Line 3537  ENDCCF
     '</td><td>'.      '</td><td>'.
     ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d"'.      ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d"'.
     ($domainlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').      ($domainlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').
     '</td><td>');      '</td><td>'.
         if ($priv eq 'bre' && $crstype eq 'Community') {      ($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s"'.
             $r->print('&nbsp;');      ($systemlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').
         } else {      '</td>'.
             $r->print($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s"'.               &Apache::loncommon::end_data_table_row());
                       ($systemlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;');  
         }  
         $r->print('</td>'.  
                   &Apache::loncommon::end_data_table_row());  
     }      }
     $r->print(&Apache::loncommon::end_data_table().      $r->print(&Apache::loncommon::end_data_table().
    '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.     '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
Line 3824  ENDCCF Line 3553  ENDCCF
 }  }
 # --------------------------------------------------------  # --------------------------------------------------------
 sub make_script_template {  sub make_script_template {
     my ($role,$crstype) = @_;      my ($role) = @_;
     my %full_c=();      my %full_c=();
     my %full_d=();      my %full_d=();
     my %full_s=();      my %full_s=();
Line 3838  sub make_script_template { Line 3567  sub make_script_template {
         $full_d{$priv}=1;          $full_d{$priv}=1;
     }      }
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {      foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
         next if (($crstype eq 'Community') && ($item eq 'bre&S'));  
         my ($priv,$restrict)=split(/\&/,$item);          my ($priv,$restrict)=split(/\&/,$item);
         $full_s{$priv}=1;          $full_s{$priv}=1;
     }      }
Line 3891  sub make_script_template { Line 3619  sub make_script_template {
 }  }
 # ----------------------------------------------------------  # ----------------------------------------------------------
 sub make_button_code {  sub make_button_code {
     my ($role,$crstype) = @_;      my ($role) = @_;
     my $label = &Apache::lonnet::plaintext($role,$crstype);      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);
 }  }
Line 3906  sub set_custom_role { Line 3634  sub set_custom_role {
         return;          return;
     }      }
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $jscript = '<script type="text/javascript">'.      my $jscript = '<script type="text/javascript">'
                   '// <![CDATA['."\n".                   .'// <![CDATA['."\n"
                   $jsback."\n".                   .$jsback."\n"
                   '// ]]>'."\n".                   .'// ]]>'."\n"
                   '</script>';                   .'</script>'."\n";
   
     $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);      $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
Line 3992  sub handler { Line 3720  sub handler {
        $r->send_http_header;         $r->send_http_header;
        return OK;         return OK;
     }      }
     my ($context,$crstype);      my $context;
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         $context = 'course';          $context = 'course';
         $crstype = &Apache::loncommon::course_type();  
     } elsif ($env{'request.role'} =~ /^au\./) {      } elsif ($env{'request.role'} =~ /^au\./) {
         $context = 'author';          $context = 'author';
     } else {      } else {
Line 4014  sub handler { Line 3741  sub handler {
     #SD Following files not added to help, because the corresponding .tex-files seem to      #SD Following files not added to help, because the corresponding .tex-files seem to
     #be missing: Course_Approve_Selfenroll,Course_User_Logs,      #be missing: Course_Approve_Selfenroll,Course_User_Logs,
     my ($permission,$allowed) =       my ($permission,$allowed) = 
         &Apache::lonuserutils::get_permission($context,$crstype);          &Apache::lonuserutils::get_permission($context);
     if (!$allowed) {      if (!$allowed) {
         $env{'user.error.msg'}=          $env{'user.error.msg'}=
             "/adm/createuser:cst:0:0:Cannot create/modify user data ".              "/adm/createuser:cst:0:0:Cannot create/modify user data ".
Line 4029  sub handler { Line 3756  sub handler {
     if (! exists($env{'form.action'})) {      if (! exists($env{'form.action'})) {
         $r->print(&header());          $r->print(&header());
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));          $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
         $r->print(&print_main_menu($permission,$context,$crstype));          $r->print(&print_main_menu($permission,$context));
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {      } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {
         $r->print(&header());          $r->print(&header());
Line 4045  sub handler { Line 3772  sub handler {
             &Apache::lonuserutils::print_first_users_upload_form($r,$context);              &Apache::lonuserutils::print_first_users_upload_form($r,$context);
         } elsif ($env{'form.state'} eq 'got_file') {          } elsif ($env{'form.state'} eq 'got_file') {
             &Apache::lonuserutils::print_upload_manager_form($r,$context,              &Apache::lonuserutils::print_upload_manager_form($r,$context,
                                                              $permission,$crstype);                                                               $permission);
         } elsif ($env{'form.state'} eq 'enrolling') {          } elsif ($env{'form.state'} eq 'enrolling') {
             if ($env{'form.datatoken'}) {              if ($env{'form.datatoken'}) {
                 &Apache::lonuserutils::upfile_drop_add($r,$context,$permission);                  &Apache::lonuserutils::upfile_drop_add($r,$context,$permission);
Line 4070  sub handler { Line 3797  sub handler {
                 if ($env{'form.srchterm'} !~ /^$match_username$/) {                  if ($env{'form.srchterm'} !~ /^$match_username$/) {
                     my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');                      my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
                     $env{'form.phase'} = '';                      $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$response,$srch,undef,$crstype);                      &print_username_entry_form($r,$context,$response,$srch);
                 } else {                  } else {
                     my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});                      my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});
                     my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});                      my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});
                     &print_user_modification_page($r,$ccuname,$ccdomain,                      &print_user_modification_page($r,$ccuname,$ccdomain,
                                                   $srch,$response,$context,                                                    $srch,$response,$context,
                                                   $permission,$crstype);                                                    $permission);
                 }                  }
             } elsif ($env{'form.phase'} eq 'get_user_info') {              } elsif ($env{'form.phase'} eq 'get_user_info') {
                 my ($currstate,$response,$forcenewuser,$results) =                   my ($currstate,$response,$forcenewuser,$results) = 
Line 4086  sub handler { Line 3813  sub handler {
                 }                  }
                 if ($currstate eq 'select') {                  if ($currstate eq 'select') {
                     &print_user_selection_page($r,$response,$srch,$results,                      &print_user_selection_page($r,$response,$srch,$results,
                                                \@search,$context,undef,$crstype);                                                 \@search,$context);
                 } elsif ($currstate eq 'modify') {                  } elsif ($currstate eq 'modify') {
                     my ($ccuname,$ccdomain);                      my ($ccuname,$ccdomain);
                     if (($srch->{'srchby'} eq 'uname') &&                       if (($srch->{'srchby'} eq 'uname') && 
Line 4104  sub handler { Line 3831  sub handler {
                     }                      }
                     &print_user_modification_page($r,$ccuname,$ccdomain,                      &print_user_modification_page($r,$ccuname,$ccdomain,
                                                   $srch,$response,$context,                                                    $srch,$response,$context,
                                                   $permission,$crstype);                                                    $permission);
                 } elsif ($currstate eq 'query') {                  } elsif ($currstate eq 'query') {
                     &print_user_query_page($r,'createuser');                      &print_user_query_page($r,'createuser');
                 } else {                  } else {
                     $env{'form.phase'} = '';                      $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$response,$srch,                      &print_username_entry_form($r,$context,$response,$srch,
                                                $forcenewuser,$crstype);                                                 $forcenewuser);
                 }                  }
             } elsif ($env{'form.phase'} eq 'userpicked') {              } elsif ($env{'form.phase'} eq 'userpicked') {
                 my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});                  my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});
                 my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});                  my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});
                 &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',                  &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',
                                               $context,$permission,$crstype);                                                $context,$permission);
             }              }
         } elsif ($env{'form.phase'} eq 'update_user_data') {          } elsif ($env{'form.phase'} eq 'update_user_data') {
             &update_user_data($r,$context,$crstype);              &update_user_data($r,$context);
         } else {          } else {
             &print_username_entry_form($r,$context,undef,$srch,undef,$crstype);              &print_username_entry_form($r,$context,undef,$srch);
         }          }
     } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {      } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {
         if ($env{'form.phase'} eq 'set_custom_roles') {          if ($env{'form.phase'} eq 'set_custom_roles') {
Line 4143  sub handler { Line 3870  sub handler {
             $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users",              $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users",
                                                           'Course_View_Class_List'));                                                            'Course_View_Class_List'));
             if ($permission->{'cusr'}) {              if ($permission->{'cusr'}) {
                 &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice,$crstype);                  &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice);
                 $r->print(&Apache::loncommon::end_page());                  $r->print(&Apache::loncommon::end_page());
             } else {              } else {
                 $r->print(&mt('You are not authorized to make bulk changes to user roles'));                  $r->print(&mt('You are not authorized to make bulk changes to user roles'));
Line 4156  sub handler { Line 3883  sub handler {
                   text=>"List Users"});                    text=>"List Users"});
             my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);              my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);
             my $formname = 'studentform';              my $formname = 'studentform';
             if (($context eq 'domain') && (($env{'form.roletype'} eq 'course') ||              if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
                 ($env{'form.roletype'} eq 'community'))) {                  ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) = 
                 if ($env{'form.roletype'} eq 'course') {                      &Apache::lonuserutils::courses_selector($env{'request.role.domain'},
                     ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) =                                                              $formname);
                         &Apache::lonuserutils::courses_selector($env{'request.role.domain'},  
                                                                 $formname);  
                 } elsif ($env{'form.roletype'} eq 'community') {  
                     $cb_jscript =  
                         &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'});  
                     my %elements = (  
                                       coursepick => 'radio',  
                                       coursetotal => 'text',  
                                       courselist => 'text',  
                                    );  
                     $jscript = &Apache::lonhtmlcommon::set_form_elements(\%elements);  
                 }  
                 $jscript .= &verify_user_display();                  $jscript .= &verify_user_display();
                 my $js = &add_script($jscript).$cb_jscript;                  my $js = &add_script($jscript).$cb_jscript;
                 my $loadcode =                   my $loadcode = 
Line 4192  sub handler { Line 3907  sub handler {
         }          }
     } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {      } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {
         $r->print(&header());          $r->print(&header());
         my $brtext;  
         if ($crstype eq 'Community') {  
             $brtext = 'Drop Members';  
         } else {  
             $brtext = 'Drop Students';  
         }  
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/createuser?action=drop',              ({href=>'/adm/createuser?action=drop',
               text=>$brtext});                text=>"Drop Students"});
         if (!exists($env{'form.state'})) {          if (!exists($env{'form.state'})) {
             $r->print(&Apache::lonhtmlcommon::breadcrumbs($brtext,              $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                                                           'Course_Drop_Student'));                                                            'Course_Drop_Student'));
   
             &Apache::lonuserutils::print_drop_menu($r,$context,$permission,$crstype);              &Apache::lonuserutils::print_drop_menu($r,$context,$permission);
         } elsif ($env{'form.state'} eq 'done') {          } elsif ($env{'form.state'} eq 'done') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/createuser?action=drop',              ({href=>'/adm/createuser?action=drop',
               text=>"Result"});                text=>"Result"});
             $r->print(&Apache::lonhtmlcommon::breadcrumbs($brtext,              $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                                                           'Course_Drop_Student'));                                                            'Course_Drop_Student'));
             &Apache::lonuserutils::update_user_list($r,$context,undef,              &Apache::lonuserutils::update_user_list($r,$context,undef,
                                                     $env{'form.action'});                                                      $env{'form.action'});
Line 4220  sub handler { Line 3929  sub handler {
         if ($permission->{'cusr'}) {          if ($permission->{'cusr'}) {
             $r->print(&header(undef,undef,{'no_nav_bar' => 1}).              $r->print(&header(undef,undef,{'no_nav_bar' => 1}).
                       &Apache::lonuserutils::date_section_selector($context,                        &Apache::lonuserutils::date_section_selector($context,
                                                                    $permission,$crstype).                                                                     $permission).
                       &Apache::loncommon::end_page());                        &Apache::loncommon::end_page());
         } else {          } else {
             $r->print(&header().              $r->print(&header().
Line 4262  sub handler { Line 3971  sub handler {
             $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n");              $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n");
             $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context,              $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context,
                                                                        $cdom,$cnum));                                                                         $cdom,$cnum));
   
         } elsif ($env{'form.state'} eq 'done') {          } elsif ($env{'form.state'} eq 'done') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/createuser?action=selfenrollqueue',              ({href=>'/adm/createuser?action=selfenrollqueue',
Line 4286  sub handler { Line 3994  sub handler {
     } else {      } else {
         $r->print(&header());          $r->print(&header());
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));          $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
         $r->print(&print_main_menu($permission,$context,$crstype));          $r->print(&print_main_menu($permission,$context));
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
     }      }
     return OK;      return OK;
Line 4305  sub header { Line 4013  sub header {
   
 sub add_script {  sub add_script {
     my ($js) = @_;      my ($js) = @_;
     return '<script type="text/javascript">'."\n".      return '<script type="text/javascript">'."\n"
            '// <![CDATA['."\n".            .'// <![CDATA['."\n"
            "\n".$js."\n".            .$js."\n"
            '// ]]>'."\n".            .'// ]]>'."\n"
            '</script>'."\n";            .'</script>'."\n";
 }  }
   
 sub verify_user_display {  sub verify_user_display {
Line 4330  END Line 4038  END
 ###############################################################  ###############################################################
 #  Menu Phase One  #  Menu Phase One
 sub print_main_menu {  sub print_main_menu {
     my ($permission,$context,$crstype) = @_;      my ($permission,$context) = @_;
     my $linkcontext = $context;  
     my $stuterm = lc(&Apache::lonnet::plaintext('st',$crstype));  
     if (($context eq 'course') && ($crstype eq 'Community')) {  
         $linkcontext = lc($crstype);  
         $stuterm = 'Members';  
     }  
   
     my %links = (      my %links = (
                        domain => {                  domain => {
                                    upload => 'Upload a File of Users',                              upload     => 'Upload a File of Users',
                                    singleuser => 'Add/Modify a User',                              singleuser => 'Add/Modify a User',
                                    listusers => 'Manage Users',                              listusers  => 'Manage Users',
                                  },                              },
                        author => {                  author => {
                                    upload => 'Upload a File of Co-authors',                              upload     => 'Upload a File of Co-authors',
                                    singleuser => 'Add/Modify a Co-author',                              singleuser => 'Add/Modify a Co-author',
                                    listusers => 'Manage Co-authors',                              listusers  => 'Manage Co-authors',
                                  },                              },
                        course => {                  course => {
                                    upload => 'Upload a File of Course Users',                              upload     => 'Upload a File of Course Users',
                                    singleuser => 'Add/Modify a Course User',                              singleuser => 'Add/Modify a Course User',
                                    listusers => 'Display Class Lists and Manage Multiple Users',                              listusers  => 'Manage Course Users',
                                  },                              },
                        community => {  
                                    upload     => 'Upload a File of Community Users',  
                                    singleuser => 'Add/Modify a Community User',  
                                    listusers  => 'Manage Community Users',  
                                  },  
                 );                  );
     my @menu =    my @menu = ( {categorytitle => 'Single Users', 
         (           items =>
           { text => $links{$context}{'upload'},           [
             help => 'Course_Create_Class_List',              {
             action => 'upload',               linktext => $links{$context}{'singleuser'},
             permission => $permission->{'cusr'},               icon => 'edit-redo.png',
                #help => 'Course_Change_Privileges',
                url => '/adm/createuser?action=singleuser',
                permission => $permission->{'cusr'},
                linktitle => 'Add a user with a certain role to this course.',
             },              },
           { text => $links{$context}{'singleuser'},           ]},
             help => 'Course_Change_Privileges',  
             action => 'singleuser',           {categorytitle => 'Multiple Users',
             permission => $permission->{'cusr'},           items => 
            [
               {
                linktext => $links{$context}{'upload'},
                icon => 'sctr.png',
                #help => 'Course_Create_Class_List',
                url => '/adm/createuser?action=upload',
                permission => $permission->{'cusr'},
                linktitle => 'Upload a CSV or a text file containing users.',
               },
               {
                linktext => $links{$context}{'listusers'},
                icon => 'edit-find.png',
                #help => 'Course_View_Class_List',
                url => '/adm/createuser?action=listusers',
                permission => ($permission->{'view'} || $permission->{'cusr'}),
                linktitle => 'Show and manage users of this course.',
               },
   
            ]},
   
            {categorytitle => 'Administration',
            items => [ ]},
          );
               
       if ($context eq 'domain'){
           
           push(@{ $menu[2]->{items} }, #Category: Administration
               {
                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.',
             },              },
           { text => $links{$context}{'listusers'},  
             help => 'Course_View_Class_List',  
             action => 'listusers',  
             permission => ($permission->{'view'} || $permission->{'cusr'}),  
           },  
         );          );
     if ($context eq 'domain' || $context eq 'course') {          
         my $customlink =  { text => 'Edit Custom Roles',      }elsif ($context eq 'course'){
                             help => 'Course_Editing_Custom_Roles',  
                             action => 'custom',  
                             permission => $permission->{'custom'},  
                           };  
         push(@menu,$customlink);  
     }  
     if ($context eq 'course') {  
         my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();          my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
         my @courselinks =      
             (          push(@{ $menu[0]->{items} }, #Category: Single Users
               { text => 'Enroll a Single Student',              {   
                  help => 'Course_Add_Student',               linktext => 'Add/Modify a Student',
                  action => 'singlestudent',               #help => 'Course_Add_Student',
                  permission => $permission->{'cusr'},               icon => 'list-add.png',
                  },               url => '/adm/createuser?action=singlestudent',
               { text => 'Drop Students',               permission => $permission->{'cusr'},
                 help => 'Course_Drop_Student',               linktitle => 'Add a user with the role student to this course.',
                 action => 'drop',              },
                 permission => $permission->{'cusr'},          );
               });          
         if (!exists($permission->{'cusr_section'})) {          push(@{ $menu[1]->{items} }, #Category: Multiple Users 
             if ($crstype ne 'Community') {              {
                 push(@courselinks,               linktext => 'Drop Students',
                    { text => 'Automated Enrollment Manager',               icon => 'edit-undo.png',
                      help => 'Course_Automated_Enrollment',               #help => 'Course_Drop_Student',
                      permission => (&Apache::lonnet::auto_run($cnum,$cdom)               url => '/adm/createuser?action=drop',
                                    && $permission->{'cusr'}),               permission => $permission->{'cusr'},
                      url  => '/adm/populate',               linktitle =>'Remove a student from this course.',
                    });              },
              }          );
              push(@courselinks,          push(@{ $menu[2]->{items} }, #Category: Administration
                  { text  => 'Configure User Self-enrollment',              {    
                    help  => 'Course_Self_Enrollment',               linktext => 'Custom Roles',
                    action => 'selfenroll',               icon => 'emblem-photos.png',
                    permission => $permission->{'cusr'},               #help => 'Course_Editing_Custom_Roles',
                  });               url => '/adm/createuser?action=custom',
         }               permission => $permission->{'custom'},
                linktitle => 'Configure a custom role.',
               },
               {
                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.',
               },
           );
         if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {          if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {
             push(@courselinks,              push(@{ $menu[2]->{items} },
                     {   text => 'Enrollment Requests',                      {   
                         help => 'Course_Approve_Selfenroll',                       linktext => 'Enrollment Requests',
                         action => 'selfenrollqueue',                       icon => 'selfenrl-queue.png',
                         permission => $permission->{'cusr'},                       #help => 'Course_Approve_Selfenroll',
                     });                       url => '/adm/createuser?action=selfenrollqueue',
         }                       permission => $permission->{'cusr'},
         push(@courselinks,                       linktitle =>'Approve or reject enrollment requests.',
                { text => 'Manage Course Groups',                      },
                  help => 'Course_Manage_Group',              );
                  permission => $permission->{'grp_manage'},          }
                  url => '/adm/coursegroups?refpage=cusr',          
                },          if (!exists($permission->{'cusr_section'})){
                { text => 'View Change Logs',              
                  help => 'Course_User_Logs',              push(@{ $menu[2]->{items} },
                  action => 'changelogs',                  {
                    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'},                   permission => $permission->{'cusr'},
                },);                   linktitle => 'Configure user self enrollment.',
                   },
               );
           
           }
       };
   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 4476  sub restore_prev_selections { Line 4216  sub restore_prev_selections {
   
 sub print_selfenroll_menu {  sub print_selfenroll_menu {
     my ($r,$context,$permission) = @_;      my ($r,$context,$permission) = @_;
     my $crstype = &Apache::loncommon::course_type();  
     my $formname = 'enrollstudent';      my $formname = 'enrollstudent';
     my $nolink = 1;      my $nolink = 1;
     my ($row,$lt) = &get_selfenroll_titles();      my ($row,$lt) = &get_selfenroll_titles();
Line 4689  ENDSCRIPT Line 4428  ENDSCRIPT
             if (ref($lt) eq 'HASH') {              if (ref($lt) eq 'HASH') {
                 $title = $lt->{$item};                  $title = $lt->{$item};
             }              }
             $output .=               $output .= &Apache::lonhtmlcommon::row_title($title);
                 &Apache::lonhtmlcommon::row_title($title,  
                              'LC_selfenroll_pick_box_title','LC_oddrow_value')."\n";  
             if ($item eq 'types') {              if ($item eq 'types') {
                 my $curr_types = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_types'};                  my $curr_types = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_types'};
                 my $showdomdesc = 1;                  my $showdomdesc = 1;
Line 4840  ENDSCRIPT Line 4577  ENDSCRIPT
                            &mt('No').'</label>';                             &mt('No').'</label>';
                 my %advhash = &Apache::lonnet::get_course_adv_roles($cid,1);                  my %advhash = &Apache::lonnet::get_course_adv_roles($cid,1);
                 my (@ccs,%notified);                  my (@ccs,%notified);
                 my $ccrole = 'cc';                  if ($advhash{'cc'}) {
                 if ($crstype eq 'Community') {                      @ccs = split(/,/,$advhash{'cc'});
                     $ccrole = 'co';  
                 }  
                 if ($advhash{$ccrole}) {  
                     @ccs = split(/,/,$advhash{$ccrole});  
                 }                  }
                 if ($currnotified) {                  if ($currnotified) {
                     foreach my $current (split(/,/,$currnotified)) {                      foreach my $current (split(/,/,$currnotified)) {
Line 4874  ENDSCRIPT Line 4607  ENDSCRIPT
                                    '<input type="checkbox" name="selfenroll_notify"'.$notifyon.' value="'.$cc.'" />'.                                     '<input type="checkbox" name="selfenroll_notify"'.$notifyon.' value="'.$cc.'" />'.
                                    &Apache::loncommon::plainname($ccuname,$ccudom).                                     &Apache::loncommon::plainname($ccuname,$ccudom).
                                    '</label></span></td>';                                     '</label></span></td>';
                         $count ++;                          $count;
                     }                      }
                     my $rem = $count%$numcols;                      my $rem = $count%$numcols;
                     if ($rem) {                      if ($rem) {
Line 4891  ENDSCRIPT Line 4624  ENDSCRIPT
                 my $cid = $env{'request.course.id'};                  my $cid = $env{'request.course.id'};
                 my $currlim = $env{'course.'.$cid.'.internal.selfenroll_limit'};                  my $currlim = $env{'course.'.$cid.'.internal.selfenroll_limit'};
                 my $currcap = $env{'course.'.$cid.'.internal.selfenroll_cap'};                  my $currcap = $env{'course.'.$cid.'.internal.selfenroll_cap'};
                 $nolimit = ' checked="checked" ';                  my $nolimit = ' checked="checked" ';
                 if ($currlim eq 'allstudents') {                  if ($currlim eq 'allstudents') {
                     $crslimit = ' checked="checked" ';                      $crslimit = ' checked="checked" ';
                     $selflimit = ' ';                      $selflimit = ' ';
Line 4932  sub visible_in_cat { Line 4665  sub visible_in_cat {
     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);      my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
     my ($cathash,%settable,@vismsgs,$cansetvis);      my ($cathash,%settable,@vismsgs,$cansetvis);
     my %visactions = &Apache::lonlocal::texthash(      my %visactions = &Apache::lonlocal::texthash(
                    vis => 'Your course/community currently appears in the Course/Community Catalog for this domain.',                     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.',                     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/community does not currently appear in the Course/Community Catalog for this 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.',                     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.',                     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", then take action to include the course in the Catalog:',                     make => 'Make any changes to self-enrollment settings below, click "Save", then take action to include the course in the Catalog:',
Line 5150  sub print_userchangelogs_display { Line 4883  sub print_userchangelogs_display {
     my $formname = 'roleslog';      my $formname = 'roleslog';
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $crstype = &Apache::loncommon::course_type();  
     my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);      my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);
     if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }      if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }
   
Line 5189  sub print_userchangelogs_display { Line 4921  sub print_userchangelogs_display {
     }      }
     my (%whodunit,%changed,$version);      my (%whodunit,%changed,$version);
     ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);      ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);
     $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype));      $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version));
     my $showntablehdr = 0;  
     my $tablehdr = &Apache::loncommon::start_data_table().  
                    &Apache::loncommon::start_data_table_header_row().  
                    '<th>&nbsp;</th><th>'.&mt('When').'</th><th>'.&mt('Who made the change').  
                    '</th><th>'.&mt('Changed User').'</th><th>'.&mt('Role').'</th><th>'.&mt('Section').'</th><th>'.  
                    &mt('Context').'</th><th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.  
                    &Apache::loncommon::end_data_table_header_row();  
     my ($minshown,$maxshown);      my ($minshown,$maxshown);
     $minshown = 1;      $minshown = 1;
     my $count = 0;      my $count = 0;
Line 5206  sub print_userchangelogs_display { Line 4931  sub print_userchangelogs_display {
             $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};              $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
         }          }
     }      }
   
       # Collect user change log data
       my $content = '';
     foreach my $id (sort { $roleslog{$b}{'exe_time'}<=>$roleslog{$a}{'exe_time'} } (keys(%roleslog))) {      foreach my $id (sort { $roleslog{$b}{'exe_time'}<=>$roleslog{$a}{'exe_time'} } (keys(%roleslog))) {
         next if (($roleslog{$id}{'exe_time'} < $curr{'rolelog_start_date'}) ||          next if (($roleslog{$id}{'exe_time'} < $curr{'rolelog_start_date'}) ||
                  ($roleslog{$id}{'exe_time'} > $curr{'rolelog_end_date'}));                   ($roleslog{$id}{'exe_time'} > $curr{'rolelog_end_date'}));
Line 5227  sub print_userchangelogs_display { Line 4955  sub print_userchangelogs_display {
         }          }
         $count ++;          $count ++;
         next if ($count < $minshown);          next if ($count < $minshown);
         if (!$showntablehdr) {  
             $r->print($tablehdr);  
             $showntablehdr = 1;  
         }  
         if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') {          if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') {
             $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} =              $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} =
                 &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'});                  &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'});
Line 5265  sub print_userchangelogs_display { Line 4990  sub print_userchangelogs_display {
         if ($roleslog{$id}{'logentry'}{'selfenroll'}) {          if ($roleslog{$id}{'logentry'}{'selfenroll'}) {
             $chgcontext = 'selfenroll';              $chgcontext = 'selfenroll';
         }          }
         my %lt = &rolechg_contexts($crstype);          my %lt = &rolechg_contexts();
         if ($chgcontext ne '' && $lt{$chgcontext} ne '') {          if ($chgcontext ne '' && $lt{$chgcontext} ne '') {
             $chgcontext = $lt{$chgcontext};              $chgcontext = $lt{$chgcontext};
         }          }
         $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td><td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td><td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td><td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).'</td><td>'.$sec.'</td><td>'.$chgcontext.'</td><td>'.$rolestart.'</td><td>'.$roleend.'</td>'.&Apache::loncommon::end_data_table_row()."\n");          $content .=
               &Apache::loncommon::start_data_table_row()
              .'<td>'.$count.'</td>'
              .'<td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td>'
              .'<td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td>'
              .'<td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td>'
              .'<td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'}).'</td>'
              .'<td>'.$sec.'</td>'
              .'<td>'.$chgcontext.'</td>'
              .'<td>'.$rolestart.'</td>'
              .'<td>'.$roleend.'</td>'
              .&Apache::loncommon::end_data_table_row();
       }
   
       # Form Footer
       my $form_footer =
           '<input type="hidden" name="page" value="'.$curr{'page'}.'" />'
          .'<input type="hidden" name="action" value="changelogs" />'
          .'</form>';
   
       # Only display table, if content is available (has been collected above)
       if (!$content) {
           $r->print('<p class="LC_info">'
                    .&mt('There are no records to display.')
                    .'</p>'
           );
           $r->print($form_footer);
           return;
     }      }
     if ($showntablehdr) {  
         $r->print(&Apache::loncommon::end_data_table().'<br />');      # Content to display, so create navigation and display table
         if (($curr{'page'} > 1) || ($more_records)) {  
             $r->print('<table><tr>');      # Create Navigation:
             if ($curr{'page'} > 1) {      # Navigation Script
                 $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');      my $nav_script = <<"ENDSCRIPT";
             }  
             if ($more_records) {  
                 $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');  
             }  
             $r->print('</tr></table>');  
             $r->print(<<"ENDSCRIPT");  
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function chgPage(caller) {  function chgPage(caller) {
Line 5298  function chgPage(caller) { Line 5044  function chgPage(caller) {
 // ]]>  // ]]>
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
         }      # Navigation Buttons
     } else {      my $nav_links;
         $r->print('<p class="LC_info">'.      $nav_links = '<p>';
                   &mt('There are no records to display').      if (($curr{'page'} > 1) || ($more_records)) {
                   '</p>');          if ($curr{'page'} > 1) {
     }              $nav_links .= '<input type="button"'
     $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.                           .' onclick="javascript:chgPage('."'previous'".');"'
               '<input type="hidden" name="action" value="changelogs" /></form>');                           .' value="'.&mt('Previous [_1] changes',$curr{'show'})
                            .'" /> ';
           }
           if ($more_records) {
               $nav_links .= '<input type="button"'
                            .' onclick="javascript:chgPage('."'next'".');"'
                            .' value="'.&mt('Next [_1] changes',$curr{'show'})
                            .'" />';
           }
       }
       $nav_links .= '</p>';
   
       # Table Header
       my $tableheader =
           &Apache::loncommon::start_data_table_header_row()
          .'<th>&nbsp;</th>'
          .'<th>'.&mt('When').'</th>'
          .'<th>'.&mt('Who made the change').'</th>'
          .'<th>'.&mt('Changed User').'</th>'
          .'<th>'.&mt('Role').'</th>'
          .'<th>'.&mt('Section').'</th>'
          .'<th>'.&mt('Context').'</th>'
          .'<th>'.&mt('Start').'</th>'
          .'<th>'.&mt('End').'</th>'
          .&Apache::loncommon::end_data_table_header_row();
   
       # Print Content
       $r->print(
           $nav_script
          .$nav_links
          .&Apache::loncommon::start_data_table()
          .$tableheader
          .$content
          .&Apache::loncommon::end_data_table()
          .$nav_links
          .$form_footer
       );
     return;      return;
 }  }
   
 sub role_display_filter {  sub role_display_filter {
     my ($formname,$cdom,$cnum,$curr,$version,$crstype) = @_;      my ($formname,$cdom,$cnum,$curr,$version) = @_;
     my $context = 'course';      my $context = 'course';
     my $lctype = lc($crstype);  
     my $nolink = 1;      my $nolink = 1;
     my $output = '<table><tr><td valign="top">'.      my $output = '<table><tr><td valign="top">'.
                  '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b></span><br />'.                   '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b></span><br />'.
Line 5327  sub role_display_filter { Line 5108  sub role_display_filter {
         &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date',          &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date',
                                             $curr->{'rolelog_end_date'},undef,                                              $curr->{'rolelog_end_date'},undef,
                                             undef,undef,undef,undef,undef,undef,$nolink);                                              undef,undef,undef,undef,undef,undef,$nolink);
     my %lt = &rolechg_contexts($crstype);      my %lt = &rolechg_contexts();
     $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br /><table><tr><td>'.&mt('After:').      $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br />'.
                '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.                 '<table><tr><td>'.&mt('After:').
                $endform.'</td></tr></table></td><td>&nbsp;&nbsp;</td>'.                 '</td><td>'.$startform.'</td></tr>'.
                  '<tr><td>'.&mt('Before:').'</td>'.
                  '<td>'.$endform.'</td></tr></table>'.
                  '</td>'.
                  '<td>&nbsp;&nbsp;</td>'.
                '<td valign="top"><b>'.&mt('Role:').'</b><br />'.                 '<td valign="top"><b>'.&mt('Role:').'</b><br />'.
                '<select name="role"><option value="any"';                 '<select name="role"><option value="any"';
     if ($curr->{'role'} eq 'any') {      if ($curr->{'role'} eq 'any') {
         $output .= ' selected="selected"';          $output .= ' selected="selected"';
     }      }
     $output .=  '>'.&mt('Any').'</option>'."\n";      $output .=  '>'.&mt('Any').'</option>'."\n";
     my @roles = &Apache::lonuserutils::course_roles($context,undef,1,$lctype);      my @roles = &Apache::lonuserutils::course_roles($context,undef,1);
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $plrole;          my $plrole;
         if ($role eq 'cr') {          if ($role eq 'cr') {
             $plrole = &mt('Custom Role');              $plrole = &mt('Custom Role');
         } else {          } else {
             $plrole=&Apache::lonnet::plaintext($role,$crstype);              $plrole=&Apache::lonnet::plaintext($role);
         }          }
         my $selstr = '';          my $selstr = '';
         if ($role eq $curr->{'role'}) {          if ($role eq $curr->{'role'}) {
Line 5351  sub role_display_filter { Line 5136  sub role_display_filter {
         }          }
         $output .= '  <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>';          $output .= '  <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>';
     }      }
     $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="top"><b>'.      $output .= '</select></td>'.
                  '<td>&nbsp;&nbsp;</td>'.
                  '<td valign="top"><b>'.
                &mt('Context:').'</b><br /><select name="chgcontext">';                 &mt('Context:').'</b><br /><select name="chgcontext">';
     foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll','requestcourses') {      foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll') {
         my $selstr = '';          my $selstr = '';
         if ($curr->{'chgcontext'} eq $chgtype) {          if ($curr->{'chgcontext'} eq $chgtype) {
             $selstr = ' selected="selected"';              $selstr = ' selected="selected"';
Line 5372  sub role_display_filter { Line 5159  sub role_display_filter {
               .'</p>';                .'</p>';
   
     # Server version info      # Server version info
     $output .= '<p style="font-size: smaller;" class="LC_info">'      $output .= '<p class="LC_info">'
               .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'                .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
                   ,'2.6.99.0');                    ,'2.6.99.0');
     if ($version) {      if ($version) {
         $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);          $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);
     }      }
     $output .= '</p><hr /><br />';      $output .= '</p><hr />';
     return $output;      return $output;
 }  }
   
 sub rolechg_contexts {  sub rolechg_contexts {
     my ($crstype) = @_;  
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                                              any          => 'Any',                                               any          => 'Any',
                                              auto         => 'Automated enrollment',                                               auto         => 'Automated enrollment',
Line 5392  sub rolechg_contexts { Line 5178  sub rolechg_contexts {
                                              course       => 'User Management in course',                                               course       => 'User Management in course',
                                              domain       => 'User Management in domain',                                               domain       => 'User Management in domain',
                                              selfenroll   => 'Self-enrolled',                                               selfenroll   => 'Self-enrolled',
                                              requestcourses => 'Course Request',                                               requestcourses => 'Course Request', 
                                          );                                           );
     if ($crstype eq 'Community') {  
         $lt{'createcourse'} = &mt('Community Creation');  
         $lt{'course'} = &mt('User Management in community');  
         $lt{'requestcourses'} = &mt('Community Request');  
     }  
     return %lt;      return %lt;
 }  }
   
Line 5793  sub build_search_response { Line 5574  sub build_search_response {
                     &Apache::lonuserutils::can_create_user($createdom,$context);                      &Apache::lonuserutils::can_create_user($createdom,$context);
                 my $targetdom = '<span class="LC_cusr_emph">'.$createdom.'</span>';                  my $targetdom = '<span class="LC_cusr_emph">'.$createdom.'</span>';
                 if ($cancreate) {                  if ($cancreate) {
                     my $showdom = &display_domain_info($createdom);                      my $showdom = &display_domain_info($createdom); 
                     $response .= '<br /><br />'                      $response .= '<br /><br />'
                                 .'<b>'.&mt('To add a new user:').'</b>'                                  .'<b>'.&mt('To add a new user:').'</b>'
                                 .'<br />';                                  .'<br />';
Line 5802  sub build_search_response { Line 5583  sub build_search_response {
                     } else {                      } else {
                         $response .= &mt("(You can only create new users in your current role's domain - [_1])",$targetdom);                          $response .= &mt("(You can only create new users in your current role's domain - [_1])",$targetdom);
                     }                      }
                     $response .= '<ul><li>'                      $response .='<ul><li>'
                                 .&mt("Set 'Domain/institution to search' to: [_1]",'<span class="LC_cusr_emph">'.$showdom.'</span>')                                  .&mt("Set 'Domain/institution to search' to: [_1]",'<span class="LC_cusr_emph">'.$showdom.'</span>')
                                 .'</li><li>'                                  .'</li><li>'
                                 .&mt("Set 'Search criteria' to: [_1]username is ..... in selected LON-CAPA domain[_2]",'<span class="LC_cusr_emph">','</span>')                                  .&mt("Set 'Search criteria' to: [_1]username is ..... in selected LON-CAPA domain[_2]",'<span class="LC_cusr_emph">','</span>')
Line 5820  sub build_search_response { Line 5601  sub build_search_response {
                         $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom);                          $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom);
                     }                      }
                     $response .= '<br />'                      $response .= '<br />'
                                 .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.'                                   .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.'
                                     ,' <a'.$helplink.'>'                                      ,' <a'.$helplink.'>'
                                     ,'</a>')                                      ,'</a>')
                                 .'<br /><br />';                                   .'<br /><br />';
                 }                  }
             }              }
         }          }
Line 5909  sub course_level_table { Line 5690  sub course_level_table {
             'end'  => "End"              'end'  => "End"
     );      );
   
     foreach my $protectedcourse (sort(keys(%inccourses))) {      foreach my $protectedcourse (sort( keys(%inccourses))) {
  my $thiscourse=$protectedcourse;   my $thiscourse=$protectedcourse;
  $thiscourse=~s:_:/:g;   $thiscourse=~s:_:/:g;
  my %coursedata=&Apache::lonnet::coursedescription($thiscourse);   my %coursedata=&Apache::lonnet::coursedescription($thiscourse);
         my $isowner = &is_courseowner($protectedcourse,$coursedata{'internal.courseowner'});  
  my $area=$coursedata{'description'};   my $area=$coursedata{'description'};
         my $crstype=$coursedata{'type'};          my $type=$coursedata{'type'};
  if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }   if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }
  my ($domain,$cnum)=split(/\//,$thiscourse);   my ($domain,$cnum)=split(/\//,$thiscourse);
         my %sections_count;          my %sections_count;
Line 5925  sub course_level_table { Line 5705  sub course_level_table {
     &Apache::loncommon::get_sections($domain,$cnum);      &Apache::loncommon::get_sections($domain,$cnum);
             }              }
         }          }
         my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype);          my @roles = &Apache::lonuserutils::roles_by_context('course');
  foreach my $role (@roles) {   foreach my $role (@roles) {
             my $plrole=&Apache::lonnet::plaintext($role,$crstype);              my $plrole=&Apache::lonnet::plaintext($role);
             if ((&Apache::lonnet::allowed('c'.$role,$thiscourse)) ||      if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {
                 ((($role eq 'cc') || ($role eq 'co')) && ($isowner))) {  
                 $table .= &course_level_row($protectedcourse,$role,$area,$domain,                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
                                             $plrole,\%sections_count,\%lt);                                              $plrole,\%sections_count,\%lt);    
             } elsif ($env{'request.course.sec'} ne '') {              } elsif ($env{'request.course.sec'} ne '') {
                 if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.                  if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.
                                              $env{'request.course.sec'})) {                                               $env{'request.course.sec'})) {
Line 5941  sub course_level_table { Line 5720  sub course_level_table {
             }              }
         }          }
         if (&Apache::lonnet::allowed('ccr',$thiscourse)) {          if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
             foreach my $cust (sort(keys(%customroles))) {              foreach my $cust (sort keys %customroles) {
                 next if ($crstype eq 'Community' && $customroles{$cust} =~ /bre\&S/);  
                 my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust;                  my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust;
                 $table .= &course_level_row($protectedcourse,$role,$area,$domain,                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
                                             $cust,\%sections_count,\%lt);                                              $cust,\%sections_count,\%lt);
Line 5973  sub course_level_row { Line 5751  sub course_level_row {
               $protectedcourse.'_'.$role.'" /></td>'."\n".                $protectedcourse.'_'.$role.'" /></td>'."\n".
               ' <td>'.$plrole.'</td>'."\n".                ' <td>'.$plrole.'</td>'."\n".
               ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";                ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";
     if (($role eq 'cc') || ($role eq 'co')) {      if ($role eq 'cc') {
         $row .= '<td>&nbsp;</td>';          $row .= '<td>&nbsp;</td>';
     } elsif ($env{'request.course.sec'} ne '') {      } elsif ($env{'request.course.sec'} ne '') {
         $row .= ' <td><input type="hidden" value="'.          $row .= ' <td><input type="hidden" value="'.
Line 6021  sub course_level_dc { Line 5799  sub course_level_dc {
                       '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.                        '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="dccourse" value="" />';                        '<input type="hidden" name="dccourse" value="" />';
     my $courseform='<b>'.&Apache::loncommon::selectcourse_link      my $courseform='<b>'.&Apache::loncommon::selectcourse_link
             ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course/Community','crstype').'</b>';              ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').'</b>';
     my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role','Course/Community Browser');      my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu');
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'rol'  => "Role",                      'rol'  => "Role",
                     'grs'  => "Section",                      'grs'  => "Section",
Line 6033  sub course_level_dc { Line 5811  sub course_level_dc {
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
                   );                    );
     my $header = '<h4>'.&mt('Course/Community Level').'</h4>'.      my $header = '<h4>'.&mt('Course Level').'</h4>'.
                  &Apache::loncommon::start_data_table().                   &Apache::loncommon::start_data_table().
                  &Apache::loncommon::start_data_table_header_row().                   &Apache::loncommon::start_data_table_header_row().
                  '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.                   '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
                  &Apache::loncommon::end_data_table_header_row();                   &Apache::loncommon::end_data_table_header_row();
     my $otheritems = &Apache::loncommon::start_data_table_row()."\n".      my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
                      '<td><br /><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n".                       '<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".
                      '<td valign><br /><select name="role">'."\n";                       '<td><select name="role">'."\n";
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($role);          my $plrole=&Apache::lonnet::plaintext($role);
         $otheritems .= '  <option value="'.$role.'">'.$plrole;          $otheritems .= '  <option value="'.$role.'">'.$plrole;
Line 6060  sub course_level_dc { Line 5838  sub course_level_dc {
                      '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.                       '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.
                      '<input type="text" name="newsec" value="" />'.                       '<input type="text" name="newsec" value="" />'.
                      '<input type="hidden" name="section" value="" />'.                       '<input type="hidden" name="section" value="" />'.
                      '<input type="hidden" name="groups" value="" />'.                       '<input type="hidden" name="groups" value="" /></td>'.
                      '<input type="hidden" name="crstype" value="" /></td>'.  
                      '</tr></table></td>';                       '</tr></table></td>';
     $otheritems .= <<ENDTIMEENTRY;      $otheritems .= <<ENDTIMEENTRY;
 <td><br /><input type="hidden" name="start" value='' />  <td><input type="hidden" name="start" value='' />
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>  "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>
 <td><br /><input type="hidden" name="end" value='' />  <td><input type="hidden" name="end" value='' />
 <a href=  <a href=
 "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>  "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>
 ENDTIMEENTRY  ENDTIMEENTRY
Line 6131  sub update_selfenroll_config { Line 5908  sub update_selfenroll_config {
                             $newnum ++;                              $newnum ++;
                         }                          }
                     }                      }
                     for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) {                      for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) {                        if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) {
                         if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) {  
                             my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j);                              my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j);
                             if (@types > 0) {                              if (@types > 0) {
                                 @types = sort(@types);                                  @types = sort(@types);
Line 6435  sub get_selfenroll_titles { Line 6211  sub get_selfenroll_titles {
     return (\@row,\%lt);      return (\@row,\%lt);
 }  }
   
 sub is_courseowner {  
     my ($thiscourse,$courseowner) = @_;  
     if ($courseowner eq '') {  
         if ($env{'request.course.id'} eq $thiscourse) {  
             $courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'};  
         }  
     }  
     if ($courseowner ne '') {  
         if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) {  
             return 1;  
         }  
     }  
     return;  
 }  
   
 #---------------------------------------------- end functions for &phase_two  #---------------------------------------------- end functions for &phase_two
   
 #--------------------------------- functions for &phase_two and &phase_three  #--------------------------------- functions for &phase_two and &phase_three

Removed from v.1.295.2.35  
changed lines
  Added in v.1.314


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