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

version 1.295.2.35, 2010/08/20 04:19:38 version 1.323, 2009/11/04 14:13:32
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 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)",
                     );                      );
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',                      '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'};
Line 585  sub print_username_entry_form { Line 547  sub print_username_entry_form {
                 $actiontext = $lt{'srst'};                  $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);
         }          }
Line 594  sub print_username_entry_form { Line 557  sub print_username_entry_form {
     $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,$crstype) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);      my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
Line 685  ENDBLOCK Line 610  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') {              if ($crstype eq 'Community') {
                 $title = $lt{'enrm'};                  $title = $lt{'enrm'};
             } else {              } else {
Line 945  sub print_user_modification_page { Line 870  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 1038  sub print_user_modification_page { Line 963  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 1292  ENDNOTOOLSPRIV Line 1203  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;          my $btntxt;
         if ($crstype eq 'Community') {          if ($crstype eq 'Community') {
Line 1413  sub validation_javascript { Line 1324  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 1340  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.='</td><td>';                     $row.=&mt('expired or revoked');
         if ($allowed && !$active) {                  }
             $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';  
         } else {  
             $row.='&nbsp;';  
         }  
         $row.='</td><td>';  
         if ($delallowed) {  
             $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';  
         } else {  
             $row.='&nbsp;';  
         }  
         my $plaintext='';  
         if (!$croletitle) {  
             $plaintext=&Apache::lonnet::plaintext($role_code,$class)  
         } else {  
             $plaintext=  
                 &mt('Customrole [_1][_2]defined by [_3]',  
                         '"'.$croletitle.'"',  
                         '<br />',  
                         $croleuname.':'.$croleudom);  
         }  
         $row.= '</td><td>'.$plaintext.  
                '</td><td>'.$area.  
                '</td><td>'.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time)  
                                             : '&nbsp;' ).  
               '</td><td>'.($role_end_time  ?&Apache::lonlocal::locallocaltime($role_end_time)  
                                             : '&nbsp;' )  
                ."</td>";  
         $sortrole{$sortkey}=$envkey;  
         $roletext{$envkey}=$row;  
         $roleclass{$envkey}=$class;  
         $rolepriv{$envkey}=$allowed;  
     } # end of foreach        (table building loop)  
   
     my $rolesdisplay = 0;  
     my %output = ();  
     foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {  
         $output{$type} = '';  
         foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {  
             if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {  
                 $output{$type}.=  
                       &Apache::loncommon::start_data_table_row().  
                       $roletext{$sortrole{$which}}.  
                       &Apache::loncommon::end_data_table_row();  
             }              }
         }              $row.='</td><td>';
         unless($output{$type} eq '') {              if ($allowed && !$active) {
             $output{$type} = '<tr class="LC_info_row">'.                  $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
                       "<td align='center' colspan='7'>".&mt($type)."</td></tr>".              } else {
                       $output{$type};                  $row.='&nbsp;';
             $rolesdisplay = 1;              }
         }              $row.='</td><td>';
     }              if ($delallowed) {
     if ($rolesdisplay == 1) {                  $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
         my $contextrole='';              } else {
         if ($env{'request.course.id'}) {                  $row.='&nbsp;';
             if (&Apache::loncommon::course_type() eq 'Community') {              }
                 $contextrole = &mt('Existing Roles in this Community');              my $plaintext='';
               if (!$croletitle) {
                   $plaintext=&Apache::lonnet::plaintext($role_code,$class)
               } else {
                   $plaintext=
           "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
               }
               $row.= '</td><td>'.$plaintext.
                      '</td><td>'.$area.
                      '</td><td>'.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time)
                                                   : '&nbsp;' ).
                      '</td><td>'.($role_end_time  ?&Apache::lonlocal::locallocaltime($role_end_time)
                                                   : '&nbsp;' )
                      ."</td>";
               $sortrole{$sortkey}=$envkey;
               $roletext{$envkey}=$row;
               $roleclass{$envkey}=$class;
               $rolepriv{$envkey}=$allowed;
               #$r->print($row);
           } # end of foreach        (table building loop)
           my $rolesdisplay = 0;
           my %output = ();
           foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {
               $output{$type} = '';
               foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
                   if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
                       $output{$type}.=
                             &Apache::loncommon::start_data_table_row().
                             $roletext{$sortrole{$which}}.
                             &Apache::loncommon::end_data_table_row();
                   }
               }
               unless($output{$type} eq '') {
                   $output{$type} = '<tr class="LC_info_row">'.
                             "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
                              $output{$type};
                   $rolesdisplay = 1;
               }
           }
           if ($rolesdisplay == 1) {
               my $contextrole='';
               if ($env{'request.course.id'}) {
                   my $crstype = &Apache::loncommon::course_type();
                   $contextrole = "Existing Roles in this $crstype";
               } elsif ($env{'request.role'} =~ /^au\./) {
                   $contextrole = 'Existing Co-Author Roles in your Construction Space';
             } 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','Community','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 1921  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 2300  sub update_user_data { Line 2140  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 2204  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 2274  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,$crstype,$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);          $crstype = &Apache::loncommon::course_type($cdom.'_'.$cnum);
Line 2536  sub update_user_data { Line 2365  sub update_user_data {
                 push(@longroles,&Apache::lonnet::plaintext($role,$crstype));                   push(@longroles,&Apache::lonnet::plaintext($role,$crstype)); 
             }              }
         }          }
           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 2412  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 2453  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 2548  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 2573  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 2589  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 2747  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 2857  sub update_user_data { Line 2841  sub update_user_data {
         $r->print('</a></p>');          $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 2870  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 3498  sub enroll_single_student { Line 3352  sub enroll_single_student {
                 $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.'));                  $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 {              } 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(&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>');             $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 3478  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 3498  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 3507  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 3546  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 $crstype;
     if ($context eq 'domain') {      if ($env{'request.course.id'}) {
         push(@template_roles,"ad");          $crstype = &Apache::loncommon::course_type();
     }      }
     push(@template_roles,"st");      my @template_roles = ("in","ta","ep","st");
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         unshift(@template_roles,'co');          unshift(@template_roles,'co');
     } else {      } else {
         unshift(@template_roles,'cc');          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,$crstype).' ';
     }      }
     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 3583  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 3601  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,$crstype);
         $r->print(&Apache::loncommon::start_data_table_row().          $r->print(&Apache::loncommon::start_data_table_row().
           '<td>'.$privtext.'</td><td>'.            '<td>'.$privtext.'</td><td>'.
Line 3804  ENDCCF Line 3610  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 3626  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 3640  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 3906  sub set_custom_role { Line 3707  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 4143  sub handler { Line 3944  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 4159  sub handler { Line 3960  sub handler {
             if (($context eq 'domain') && (($env{'form.roletype'} eq 'course') ||              if (($context eq 'domain') && (($env{'form.roletype'} eq 'course') ||
                 ($env{'form.roletype'} eq 'community'))) {                  ($env{'form.roletype'} eq 'community'))) {
                 if ($env{'form.roletype'} eq 'course') {                  if ($env{'form.roletype'} eq 'course') {
                     ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) =                      ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) = 
                         &Apache::lonuserutils::courses_selector($env{'request.role.domain'},                          &Apache::lonuserutils::courses_selector($env{'request.role.domain'},
                                                                 $formname);                                                                  $formname);
                 } elsif ($env{'form.roletype'} eq 'community') {                  } elsif ($env{'form.roletype'} eq 'community') {
                     $cb_jscript =                      $cb_jscript = 
                         &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'});                          &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'});
                     my %elements = (                      my %elements = (
                                       coursepick => 'radio',                                        coursepick => 'radio',
Line 4262  sub handler { Line 4063  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 4305  sub header { Line 4105  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 4337  sub print_main_menu { Line 4137  sub print_main_menu {
         $linkcontext = lc($crstype);          $linkcontext = lc($crstype);
         $stuterm = 'Members';          $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 => {                  community => {
                                    upload     => 'Upload a File of Community Users',                              upload     => 'Upload a File of Community Users',
                                    singleuser => 'Add/Modify a Community User',                              singleuser => 'Add/Modify a Community User',
                                    listusers  => 'Manage Community Users',                              listusers  => 'Manage Community Users',
                                  },                             },
                 );                  );
     my @menu =       my %linktitles = (
         (                  domain => {
           { text => $links{$context}{'upload'},                              singleuser => 'Add a user to the domain, and/or a course or community in the domain.',
             help => 'Course_Create_Class_List',                              listusers  => 'Show and manage users in this domain.',
             action => 'upload',                              },
             permission => $permission->{'cusr'},                  author => {
                               singleuser => 'Add a user with a co- or assistant author role.',
                               listusers  => 'Show and manage co- or assistant authors.',
                               },
                   course => {
                               singleuser => 'Add a user with a certain role to this course.',
                               listusers  => 'Show and manage users in this course.',
                               },
                   community => {
                               singleuser => 'Add a user with a certain role to this community.',
                               listusers  => 'Show and manage users in this community.',
                              },
                   );
     my @menu = ( {categorytitle => 'Single Users', 
            items =>
            [
               {
                linktext => $links{$linkcontext}{'singleuser'},
                icon => 'edit-redo.png',
                #help => 'Course_Change_Privileges',
                url => '/adm/createuser?action=singleuser',
                permission => $permission->{'cusr'},
                linktitle => $linktitles{$linkcontext}{'singleuser'},
               },
            ]},
   
            {categorytitle => 'Multiple Users',
            items => 
            [
               {
                linktext => $links{$linkcontext}{'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.',
             },              },
           { text => $links{$context}{'singleuser'},              {
             help => 'Course_Change_Privileges',               linktext => $links{$linkcontext}{'listusers'},
             action => 'singleuser',               icon => 'edit-find.png',
             permission => $permission->{'cusr'},               #help => 'Course_View_Class_List',
                url => '/adm/createuser?action=listusers',
                permission => ($permission->{'view'} || $permission->{'cusr'}),
                linktitle => $linktitles{$linkcontext}{'listusers'}, 
               },
   
            ]},
   
            {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 =  
             (          my %linktext = (
               { text => 'Enroll a Single Student',                           'Course'    => {
                  help => 'Course_Add_Student',                                            single => 'Add/Modify a Student', 
                  action => 'singlestudent',                                            drop   => 'Drop Students',
                  permission => $permission->{'cusr'},                                            groups => 'Course Groups',
                  },                                          },
               { text => 'Drop Students',                           'Community' => {
                 help => 'Course_Drop_Student',                                            single => 'Add/Modify a Member', 
                 action => 'drop',                                            drop   => 'Drop Members',
                 permission => $permission->{'cusr'},                                            groups => 'Community Groups',
               });                                          },
         if (!exists($permission->{'cusr_section'})) {                         );
   
           my %linktitle = (
               'Course' => {
                     single => 'Add a user with the role of student to this course',
                     drop   => 'Remove a student from this course.',
                     groups => 'Manage course groups',
                           },
               'Community' => {
                     single => 'Add a user with the role of member to this community',
                     drop   => 'Remove a member from this community.',
                     groups => 'Manage community groups',
                              },
           );
   
           push(@{ $menu[0]->{items} }, #Category: Single Users
               {   
                linktext => $linktext{$crstype}{'single'},
                #help => 'Course_Add_Student',
                icon => 'list-add.png',
                url => '/adm/createuser?action=singlestudent',
                permission => $permission->{'cusr'},
                linktitle => $linktitle{$crstype}{'single'},
               },
           );
           
           push(@{ $menu[1]->{items} }, #Category: Multiple Users 
               {
                linktext => $linktext{$crstype}{'drop'},
                icon => 'edit-undo.png',
                #help => 'Course_Drop_Student',
                url => '/adm/createuser?action=drop',
                permission => $permission->{'cusr'},
                linktitle => $linktitle{$crstype}{'drop'},
               },
           );
           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.',
               },
               {
                linktext => $linktext{$crstype}{'groups'},
                icon => 'conf.png',
                #help => 'Course_Manage_Group',
                url => '/adm/coursegroups?refpage=cusr',
                permission => $permission->{'grp_manage'},
                linktitle => $linktitle{$crstype}{'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'}) {
               push(@{ $menu[2]->{items} },
                       {   
                        linktext => 'Enrollment Requests',
                        icon => 'selfenrl-queue.png',
                        #help => 'Course_Approve_Selfenroll',
                        url => '/adm/createuser?action=selfenrollqueue',
                        permission => $permission->{'cusr'},
                        linktitle =>'Approve or reject enrollment requests.',
                       },
               );
           }
           
           if (!exists($permission->{'cusr_section'})){
             if ($crstype ne 'Community') {              if ($crstype ne 'Community') {
                 push(@courselinks,                  push(@{ $menu[2]->{items} },
                    { text => 'Automated Enrollment Manager',                      {
                      help => 'Course_Automated_Enrollment',                       linktext => 'Automated Enrollment',
                        icon => 'roles.png',
                        #help => 'Course_Automated_Enrollment',
                      permission => (&Apache::lonnet::auto_run($cnum,$cdom)                       permission => (&Apache::lonnet::auto_run($cnum,$cdom)
                                    && $permission->{'cusr'}),                                           && $permission->{'cusr'}),
                      url  => '/adm/populate',                       url  => '/adm/populate',
                    });                       linktitle => 'Automated enrollment manager.',
              }                      }
              push(@courselinks,                  );
                  { text  => 'Configure User Self-enrollment',              }
                    help  => 'Course_Self_Enrollment',              push(@{ $menu[2]->{items} }, 
                    action => 'selfenroll',                  {
                    permission => $permission->{'cusr'},                   linktext => 'User Self-Enrollment',
                  });                   icon => 'cstr.png',
         }                   #help => 'Course_Self_Enrollment',
         if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {                   url => '/adm/createuser?action=selfenroll',
             push(@courselinks,  
                     {   text => 'Enrollment Requests',  
                         help => 'Course_Approve_Selfenroll',  
                         action => 'selfenrollqueue',  
                         permission => $permission->{'cusr'},  
                     });  
         }  
         push(@courselinks,  
                { text => 'Manage Course Groups',  
                  help => 'Course_Manage_Group',  
                  permission => $permission->{'grp_manage'},  
                  url => '/adm/coursegroups?refpage=cusr',  
                },  
                { text => 'View Change Logs',  
                  help => 'Course_User_Logs',  
                  action => 'changelogs',  
                  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 4689  ENDSCRIPT Line 4578  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 4874  ENDSCRIPT Line 4761  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 4778  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 5190  sub print_userchangelogs_display { Line 5077  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,$crstype));
     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 5086  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 5110  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 5269  sub print_userchangelogs_display { Line 5149  sub print_userchangelogs_display {
         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'},$crstype).'</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 5199  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;
 }  }
   
Line 5328  sub role_display_filter { Line 5265  sub role_display_filter {
                                             $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($crstype);
     $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') {
Line 5351  sub role_display_filter { Line 5292  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','requestcourses') {
         my $selstr = '';          my $selstr = '';
Line 5372  sub role_display_filter { Line 5315  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;
 }  }
   
Line 5793  sub build_search_response { Line 5736  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 5745  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 5763  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 5852  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 $crstype=$coursedata{'type'};
  if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }   if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }
Line 5928  sub course_level_table { Line 5870  sub course_level_table {
         my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype);          my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype);
  foreach my $role (@roles) {   foreach my $role (@roles) {
             my $plrole=&Apache::lonnet::plaintext($role,$crstype);              my $plrole=&Apache::lonnet::plaintext($role,$crstype);
             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 5882  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 6131  sub update_selfenroll_config { Line 6071  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 6374  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.323


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