Diff for /loncom/interface/loncreateuser.pm between versions 1.295.2.29 and 1.320

version 1.295.2.29, 2010/01/20 14:59:27 version 1.320, 2009/10/30 18:32:25
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 586  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 595  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 686  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 1039  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 1293  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 1414  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 1426  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;  
             }  
             $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'};
                 $class=$coursedata{'type'};                      $class=$coursedata{'type'};
             } else {  
                 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;
                 }                  }
   # - custom role. Needs more info, too
                   if ($croletitle) {
                       if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
                           $allowed=1;
                           $thisrole.='.'.$role_code;
                       }
                   }
                   # Compute the background color based on $area
                   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 {              } else {
                 if (&Apache::lonnet::allowed('c'.$role_code,'/')) {                  $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')) {
                   $area=~m{/($match_domain)/($match_username)};
                   if (&Apache::lonuserutils::authorpriv($2,$1)) {
                     $allowed=1;                      $allowed=1;
                   } else {
                       $allowed=0;
                 }                  }
             }              }
             if ($role_code eq 'ca' || $role_code eq 'au') {              my $row = '';
                 $class='Construction Space';              $row.= '<td>';
             } elsif ($role_code eq 'su') {              my $active=1;
                 $class='System';              $active=0 if (($role_end_time) && ($now>$role_end_time));
               if (($active) && ($allowed)) {
                   $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';
             } else {              } else {
                 $class='Domain';                  if ($active) {
                      $row.='&nbsp;';
                   } else {
                      $row.=&mt('expired or revoked');
                   }
             }              }
         }              $row.='</td><td>';
         if (($role_code eq 'ca') || ($role_code eq 'aa')) {              if ($allowed && !$active) {
             $area=~m{/($match_domain)/($match_username)};                  $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';
             if (&Apache::lonuserutils::authorpriv($2,$1)) {  
                 $allowed=1;  
             } else {              } else {
                 $allowed=0;                  $row.='&nbsp;';
             }              }
         }              $row.='</td><td>';
         my $row = '';              if ($delallowed) {
         $row.= '<td>';                  $row.= '<input type="checkbox" name="del:'.$thisrole.'" />';
         my $active=1;  
         $active=0 if (($role_end_time) && ($now>$role_end_time));  
         if (($active) && ($allowed)) {  
             $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />';  
         } else {  
             if ($active) {  
                $row.='&nbsp;';  
             } else {              } else {
                $row.=&mt('expired or revoked');                  $row.='&nbsp;';
             }              }
         }              my $plaintext='';
         $row.='</td><td>';              if (!$croletitle) {
         if ($allowed && !$active) {                  $plaintext=&Apache::lonnet::plaintext($role_code,$class)
             $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />';              } else {
         } else {                  $plaintext=
             $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=  
         "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";          "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom";
         }              }
         $row.= '</td><td>'.$plaintext.              $row.= '</td><td>'.$plaintext.
                '</td><td>'.$area.                     '</td><td>'.$area.
                '</td><td>'.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time)                     '</td><td>'.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time)
                                             : '&nbsp;' ).                                                  : '&nbsp;' ).
               '</td><td>'.($role_end_time  ?&Apache::lonlocal::locallocaltime($role_end_time)                     '</td><td>'.($role_end_time  ?&Apache::lonlocal::locallocaltime($role_end_time)
                                             : '&nbsp;' )                                                  : '&nbsp;' )
                ."</td>";                     ."</td>";
         $sortrole{$sortkey}=$envkey;              $sortrole{$sortkey}=$envkey;
         $roletext{$envkey}=$row;              $roletext{$envkey}=$row;
         $roleclass{$envkey}=$class;              $roleclass{$envkey}=$class;
         $rolepriv{$envkey}=$allowed;              $rolepriv{$envkey}=$allowed;
     } # end of foreach        (table building loop)              #$r->print($row);
     my $rolesdisplay = 0;          } # end of foreach        (table building loop)
     my %output = ();          my $rolesdisplay = 0;
     foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {          my %output = ();
         $output{$type} = '';          foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') {
         foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {              $output{$type} = '';
             if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {              foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
                 $output{$type}.=                  if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
                       &Apache::loncommon::start_data_table_row().                      $output{$type}.=
                       $roletext{$sortrole{$which}}.                            &Apache::loncommon::start_data_table_row().
                       &Apache::loncommon::end_data_table_row();                            $roletext{$sortrole{$which}}.
             }                            &Apache::loncommon::end_data_table_row();
         }                  }
         unless($output{$type} eq '') {              }
             $output{$type} = '<tr class="LC_info_row">'.              unless($output{$type} eq '') {
                       "<td align='center' colspan='7'>".&mt($type)."</td></tr>".                  $output{$type} = '<tr class="LC_info_row">'.
                       $output{$type};                            "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
             $rolesdisplay = 1;                             $output{$type};
         }                  $rolesdisplay = 1;
     }              }
     if ($rolesdisplay == 1) {          }
         my $contextrole='';          if ($rolesdisplay == 1) {
         if ($env{'request.course.id'}) {              my $contextrole='';
             if (&Apache::loncommon::course_type() eq 'Community') {              if ($env{'request.course.id'}) {
                 $contextrole = &mt('Existing Roles in this Community');                  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 = 'Existing Co-Author Roles in your Construction Space';  
         } else {  
             $contextrole = 'Existing Roles in this Domain';  
         }  
         $r->print('  
 <h3>'.$lt{'rer'}.'</h3>'.  <h3>'.$lt{'rer'}.'</h3>'.
 '<div>'.&mt($contextrole).'</div>'.  '<div>'.&mt($contextrole).'</div>'.
 &Apache::loncommon::start_data_table("LC_createuser").  &Apache::loncommon::start_data_table("LC_createuser").
Line 1668  sub display_existing_roles { Line 1524  sub display_existing_roles {
 '</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 2285  sub update_user_data { Line 2142  sub update_user_data {
  $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');   $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>');
     my (%alerts,%rulematch,%inst_results,%curr_rules);      my (%alerts,%rulematch,%inst_results,%curr_rules);
     my @usertools = ('aboutme','blog','portfolio');      my @usertools = ('aboutme','blog','portfolio');
     my @requestcourses = ('official','unofficial');      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'});
     if ($env{'form.makeuser'}) {      if ($env{'form.makeuser'}) {
Line 2691  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 3494  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 3620  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 3649  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 3657  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 3699  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 3765  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 3800  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 3820  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 3834  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 3902  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 4152  sub handler { Line 3957  sub handler {
                   text=>"List Users"});                    text=>"List Users"});
             my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);              my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);
             my $formname = 'studentform';              my $formname = 'studentform';
             if (($context eq 'domain') && (($env{'form.roletype'} eq 'course') ||              if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
                 ($env{'form.roletype'} eq 'community'))) {                  ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) = 
                 if ($env{'form.roletype'} eq 'course') {                      &Apache::lonuserutils::courses_selector($env{'request.role.domain'},
                     ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) =                                                              $formname);
                         &Apache::lonuserutils::courses_selector($env{'request.role.domain'},  
                                                                 $formname);  
                 } elsif ($env{'form.roletype'} eq 'community') {  
                     $cb_jscript =  
                         &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'});  
                     my %elements = (  
                                       coursepick => 'radio',  
                                       coursetotal => 'text',  
                                       courselist => 'text',  
                                    );  
                     $jscript = &Apache::lonhtmlcommon::set_form_elements(\%elements);  
                 }  
                 $jscript .= &verify_user_display();                  $jscript .= &verify_user_display();
                 my $js = &add_script($jscript).$cb_jscript;                  my $js = &add_script($jscript).$cb_jscript;
                 my $loadcode =                   my $loadcode = 
Line 4198  sub handler { Line 3991  sub handler {
             ({href=>'/adm/createuser?action=drop',              ({href=>'/adm/createuser?action=drop',
               text=>$brtext});                text=>$brtext});
         if (!exists($env{'form.state'})) {          if (!exists($env{'form.state'})) {
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',              $r->print(&Apache::lonhtmlcommon::breadcrumbs($brtext,
                                                           'Course_Drop_Student'));                                                            'Course_Drop_Student'));
   
             &Apache::lonuserutils::print_drop_menu($r,$context,$permission,$crstype);              &Apache::lonuserutils::print_drop_menu($r,$context,$permission,$crstype);
Line 4258  sub handler { Line 4051  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 4301  sub header { Line 4093  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 4333  sub print_main_menu { Line 4125  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 Single User',                              singleuser => 'Add/Modify a User',
                                    listusers => 'Manage Multiple Users',                              listusers  => 'Manage Users',
                                  },                              },
                        author => {                  author => {
                                    upload => 'Upload a File of Co-authors',                              upload     => 'Upload a File of Co-authors',
                                    singleuser => 'Add/Modify a Single Co-author',                              singleuser => 'Add/Modify a Co-author',
                                    listusers => 'Display Co-authors and Manage Multiple Users',                              listusers  => 'Manage Co-authors',
                                  },                              },
                        course => {                  course => {
                                    upload => 'Upload a File of Course Users',                              upload     => 'Upload a File of Course Users',
                                    singleuser => 'Add/Modify a Single 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 %linktitles = (
                   domain => {
                               singleuser => 'Add a user to the domain, and/or a course or community in the domain.',
                               listusers  => 'Show and manage users in this domain.',
                               },
                   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 =    my @menu = ( {categorytitle => 'Single Users', 
         (           items =>
           { text => $links{$context}{'upload'},           [
             help => 'Course_Create_Class_List',              {
             action => 'upload',               linktext => $links{$linkcontext}{'singleuser'},
             permission => $permission->{'cusr'},               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.',
               },
               {
                linktext => $links{$linkcontext}{'listusers'},
                icon => 'edit-find.png',
                #help => 'Course_View_Class_List',
                url => '/adm/createuser?action=listusers',
                permission => ($permission->{'view'} || $permission->{'cusr'}),
                linktitle => $linktitles{$linkcontext}{'listusers'}, 
             },              },
           { text => $links{$context}{'singleuser'},  
             help => 'Course_Change_Privileges',           ]},
             action => 'singleuser',  
             permission => $permission->{'cusr'},           {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 4472  sub restore_prev_selections { Line 4353  sub restore_prev_selections {
   
 sub print_selfenroll_menu {  sub print_selfenroll_menu {
     my ($r,$context,$permission) = @_;      my ($r,$context,$permission) = @_;
     my $crstype = &Apache::loncommon::course_type();  
     my $formname = 'enrollstudent';      my $formname = 'enrollstudent';
     my $nolink = 1;      my $nolink = 1;
     my ($row,$lt) = &get_selfenroll_titles();      my ($row,$lt) = &get_selfenroll_titles();
Line 4685  ENDSCRIPT Line 4565  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 4836  ENDSCRIPT Line 4714  ENDSCRIPT
                            &mt('No').'</label>';                             &mt('No').'</label>';
                 my %advhash = &Apache::lonnet::get_course_adv_roles($cid,1);                  my %advhash = &Apache::lonnet::get_course_adv_roles($cid,1);
                 my (@ccs,%notified);                  my (@ccs,%notified);
                 my $ccrole = 'cc';                  if ($advhash{'cc'}) {
                 if ($crstype eq 'Community') {                      @ccs = split(/,/,$advhash{'cc'});
                     $ccrole = 'co';  
                 }  
                 if ($advhash{$ccrole}) {  
                     @ccs = split(/,/,$advhash{$ccrole});  
                 }                  }
                 if ($currnotified) {                  if ($currnotified) {
                     foreach my $current (split(/,/,$currnotified)) {                      foreach my $current (split(/,/,$currnotified)) {
Line 5186  sub print_userchangelogs_display { Line 5060  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 5202  sub print_userchangelogs_display { Line 5069  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 5223  sub print_userchangelogs_display { Line 5093  sub print_userchangelogs_display {
         }          }
         $count ++;          $count ++;
         next if ($count < $minshown);          next if ($count < $minshown);
         if (!$showntablehdr) {  
             $r->print($tablehdr);  
             $showntablehdr = 1;  
         }  
         if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') {          if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') {
             $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} =              $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} =
                 &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'});                  &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'});
Line 5265  sub print_userchangelogs_display { Line 5132  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 5294  function chgPage(caller) { Line 5182  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 5324  sub role_display_filter { Line 5248  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 5347  sub role_display_filter { Line 5275  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 5368  sub role_display_filter { Line 5298  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 5789  sub build_search_response { Line 5719  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 5798  sub build_search_response { Line 5728  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 5816  sub build_search_response { Line 5746  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 5905  sub course_level_table { Line 5835  sub course_level_table {
             'end'  => "End"              'end'  => "End"
     );      );
   
     foreach my $protectedcourse (sort(keys(%inccourses))) {      foreach my $protectedcourse (sort( keys(%inccourses))) {
  my $thiscourse=$protectedcourse;   my $thiscourse=$protectedcourse;
  $thiscourse=~s:_:/:g;   $thiscourse=~s:_:/:g;
  my %coursedata=&Apache::lonnet::coursedescription($thiscourse);   my %coursedata=&Apache::lonnet::coursedescription($thiscourse);
         my $isowner = &is_courseowner($protectedcourse,$coursedata{'internal.courseowner'});  
  my $area=$coursedata{'description'};   my $area=$coursedata{'description'};
         my $crstype=$coursedata{'type'};          my $type=$coursedata{'type'};
  if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }   if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; }
  my ($domain,$cnum)=split(/\//,$thiscourse);   my ($domain,$cnum)=split(/\//,$thiscourse);
         my %sections_count;          my %sections_count;
Line 5921  sub course_level_table { Line 5850  sub course_level_table {
     &Apache::loncommon::get_sections($domain,$cnum);      &Apache::loncommon::get_sections($domain,$cnum);
             }              }
         }          }
         my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype);          my @roles = &Apache::lonuserutils::roles_by_context('course');
  foreach my $role (@roles) {   foreach my $role (@roles) {
             my $plrole=&Apache::lonnet::plaintext($role,$crstype);              my $plrole=&Apache::lonnet::plaintext($role,$type);
             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 5937  sub course_level_table { Line 5865  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 5969  sub course_level_row { Line 5896  sub course_level_row {
               $protectedcourse.'_'.$role.'" /></td>'."\n".                $protectedcourse.'_'.$role.'" /></td>'."\n".
               ' <td>'.$plrole.'</td>'."\n".                ' <td>'.$plrole.'</td>'."\n".
               ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";                ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";
     if (($role eq 'cc') || ($role eq 'co')) {      if ($role eq 'cc') {
         $row .= '<td>&nbsp;</td>';          $row .= '<td>&nbsp;</td>';
     } elsif ($env{'request.course.sec'} ne '') {      } elsif ($env{'request.course.sec'} ne '') {
         $row .= ' <td><input type="hidden" value="'.          $row .= ' <td><input type="hidden" value="'.
Line 6018  sub course_level_dc { Line 5945  sub course_level_dc {
                       '<input type="hidden" name="dccourse" value="" />';                        '<input type="hidden" name="dccourse" value="" />';
     my $courseform='<b>'.&Apache::loncommon::selectcourse_link      my $courseform='<b>'.&Apache::loncommon::selectcourse_link
             ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').'</b>';              ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').'</b>';
     my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role','Course/Community Browser');      my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role');
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'rol'  => "Role",                      'rol'  => "Role",
                     'grs'  => "Section",                      'grs'  => "Section",
Line 6029  sub course_level_dc { Line 5956  sub course_level_dc {
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
                   );                    );
     my $header = '<h4>'.&mt('Course/Community Level').'</h4>'.      my $header = '<h4>'.&mt('Course Level').'</h4>'.
                  &Apache::loncommon::start_data_table().                   &Apache::loncommon::start_data_table().
                  &Apache::loncommon::start_data_table_header_row().                   &Apache::loncommon::start_data_table_header_row().
                  '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.                   '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'.
                  &Apache::loncommon::end_data_table_header_row();                   &Apache::loncommon::end_data_table_header_row();
     my $otheritems = &Apache::loncommon::start_data_table_row()."\n".      my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
                      '<td><br /><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n".                       '<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".
                      '<td valign><br /><select name="role">'."\n";                       '<td><select name="role">'."\n";
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($role);          my $plrole=&Apache::lonnet::plaintext($role);
         $otheritems .= '  <option value="'.$role.'">'.$plrole;          $otheritems .= '  <option value="'.$role.'">'.$plrole;
Line 6056  sub course_level_dc { Line 5983  sub course_level_dc {
                      '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.                       '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.
                      '<input type="text" name="newsec" value="" />'.                       '<input type="text" name="newsec" value="" />'.
                      '<input type="hidden" name="section" value="" />'.                       '<input type="hidden" name="section" value="" />'.
                      '<input type="hidden" name="groups" value="" />'.                       '<input type="hidden" name="groups" value="" /></td>'.
                      '<input type="hidden" name="crstype" value="" /></td>'.  
                      '</tr></table></td>';                       '</tr></table></td>';
     $otheritems .= <<ENDTIMEENTRY;      $otheritems .= <<ENDTIMEENTRY;
 <td><br /><input type="hidden" name="start" value='' />  <td><input type="hidden" name="start" value='' />
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>  "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>
 <td><br /><input type="hidden" name="end" value='' />  <td><input type="hidden" name="end" value='' />
 <a href=  <a href=
 "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>  "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>
 ENDTIMEENTRY  ENDTIMEENTRY
Line 6127  sub update_selfenroll_config { Line 6053  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 6431  sub get_selfenroll_titles { Line 6356  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.29  
changed lines
  Added in v.1.320


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