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

version 1.295.2.29, 2010/01/20 14:59:27 version 1.313, 2009/09/05 20:17:35
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 265  sub build_tools_display { Line 261  sub build_tools_display {
         }          }
         if ($context eq 'requestcourses') {          if ($context eq 'requestcourses') {
             if ($userenv{$context.'.'.$item} eq '') {              if ($userenv{$context.'.'.$item} eq '') {
                 $custom_access = &mt('Currently from default setting.');                  $custom_access = &mt('Currently from default setting.'); 
             } else {              } else {
                 $custom_access = &mt('Currently from custom setting.');                  $custom_access = &mt('Currently from custom setting.');
             }              }
         } else {          } else {
             if ($userenv{$context.'.'.$item} eq '') {              if ($userenv{$context.'.'.$item} eq '') {
                 $custom_access =                  $custom_access = 
                     &mt('Availability determined currently from default setting.');                      &mt('Availability determined currently from default setting.');
                 if (!$curr_access) {                  if (!$curr_access) {
                     $tool_off = 'checked="checked" ';                      $tool_off = 'checked="checked" ';
                     $tool_on = '';                      $tool_on = '';
                 }                  }
             } else {              } else {
                 $custom_access =                  $custom_access = 
                     &mt('Availability determined currently from custom setting.');                      &mt('Availability determined currently from custom setting.');
                 if ($userenv{$context.'.'.$item} == 0) {                  if ($userenv{$context.'.'.$item} == 0) {
                     $tool_off = 'checked="checked" ';                      $tool_off = 'checked="checked" ';
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';
             }              }
             if ($curroption =~ /^autolimit=(\d*)$/) {              if ($curroption =~ /^autolimit=(\d*)$/) {
                 $currlimit = $1;                  $currlimit = $1;
                 if ($currlimit eq '') {                  $currdisp = &mt('Yes, up to [quant,_1,request]/user',$currlimit); 
                     $currdisp = &mt('Yes, automatic creation');  
                 } else {  
                     $currdisp = &mt('Yes, up to [quant,_1,request]/user',$currlimit);  
                 }  
             } else {              } else {
                 $currdisp = $reqdisplay{$curroption};                  $currdisp = $reqdisplay{$curroption};
             }              }
Line 343  sub build_tools_display { Line 328  sub build_tools_display {
                 if ($option eq 'autolimit') {                  if ($option eq 'autolimit') {
                     $custdisp .= '<input type="text" name="crsreq_'.                      $custdisp .= '<input type="text" name="crsreq_'.
                                  $item.'_limit" size="1" '.                                   $item.'_limit" size="1" '.
                                  'value="'.$currlimit.'" /></span><br />'.                                   'value="'.$currlimit.'" />';
                                  $reqtitles{'unlimited'};  
                  } else {  
                      $custdisp .= '</span>';  
                  }                   }
                  $custdisp .= '</td></tr>';                   $custdisp .= '</span></td></tr>';
             }              }
             $custdisp .= '</table>';              $custdisp .= '</table>';
             $custradio = '</span></td><td>'.&mt('Custom setting').'<br />'.$custdisp;              $custradio = '</span></td><td>'.&mt('Custom setting').'<br />'.$custdisp;
         } else {          } else {
             $currdisp = ($curr_access?&mt('Yes'):&mt('No'));              $currdisp = ($curr_access?&mt('Yes'):&mt('No'));
             $custdisp = '<span class="LC_nobreak"><label>'.              $custdisp = '<span class="LC_nobreak"><label>'.
                         '<input type="radio" name="'.$context.'_'.$item.'"'.                          '<input type="radio" name="'.$context.'_'.$item.'"'. 
                         ' value="1"'. $tool_on.'/>'.&mt('On').'</label>&nbsp;<label>'.                          ' value="1"'. $tool_on.'/>'.&mt('On').'</label>&nbsp;<label>'.
                         '<input type="radio" name="'.$context.'_'.$item.'" value="0" '.                          '<input type="radio" name="'.$context.'_'.$item.'" value="0" '.
                         $tool_off.'/>'.&mt('Off').'</label></span>';                          $tool_off.'/>'.&mt('Off').'</label></span>';
Line 398  sub coursereq_externaluser { Line 380  sub coursereq_externaluser {
         my ($curroption,$currlimit,$tooloff);          my ($curroption,$currlimit,$tooloff);
         if ($userenv{'reqcrsotherdom.'.$item} ne '') {          if ($userenv{'reqcrsotherdom.'.$item} ne '') {
             my @curr = split(',',$userenv{'reqcrsotherdom.'.$item});              my @curr = split(',',$userenv{'reqcrsotherdom.'.$item});
             foreach my $req (@curr) {              if (grep(/^\Q$cdom\E:($optregex)=?(\d*)$/,@curr)) {
                 if ($req =~ /^\Q$cdom\E\:($optregex)=?(\d*)$/) {                  $curroption = $1;
                     $curroption = $1;                  $currlimit = $2;
                     $currlimit = $2;                  if (!$curroption) {
                     last;                      $curroption = 'norequest';
                 }                  }
             }              }
             if (!$curroption) {  
                 $curroption = 'norequest';  
                 $tooloff = ' checked="checked"';  
             }  
         } else {          } else {
             $curroption = 'norequest';              $curroption = 'norequest';
             $tooloff = ' checked="checked"';              $tooloff = ' checked="checked"';
         }          }
         $output.= &Apache::loncommon::start_data_table_row()."\n".          $output.= &Apache::loncommon::start_data_table_row()."\n".
                   '  <td><span class="LC_nobreak">'.$lt{$item}.': </span></td><td>'.                    '  <td><span class="LC_nobreak">'.$lt{$item}.': '.
                   '<table><tr><td valign="top">'."\n".  
                   '<label><input type="radio" name="reqcrsotherdom_'.$item.                    '<label><input type="radio" name="reqcrsotherdom_'.$item.
                   '" value=""'.$tooloff.' />'.$reqtitles{'norequest'}.                    '" value="0"'.$tooloff.' />'.$reqtitles{'norequest'}.
                   '</label></td>';                    '</label>&nbsp;';
         foreach my $option (@options) {          foreach my $option (@options) {
             if ($option eq 'validate') {              if ($option eq 'validate') {
                 my $canvalidate = 0;                  my $canvalidate = 0;
Line 433  sub coursereq_externaluser { Line 410  sub coursereq_externaluser {
             if ($option eq $curroption) {              if ($option eq $curroption) {
                 $checked = ' checked="checked"';                  $checked = ' checked="checked"';
             }              }
             $output .= '<td valign="top"><span class="LC_nobreak"><label>'.              $output .= '<span class="LC_nobreak"><label>'.
                        '<input type="radio" name="reqcrsotherdom_'.$item.                         '<input type="radio" name="reqcrsotherdom_'.$item.
                        '" value="'.$option.'"'.$checked.' />'.                         '" value="'.$option.'"'.$checked.' />'.
                        $reqtitles{$option}.'</label>';                         $reqtitles{$option}.'</label>&nbsp;';
             if ($option eq 'autolimit') {              if ($option eq 'autolimit') {
                 $output .= '&nbsp;<input type="text" name="reqcrsotherdom_'.                  $output .= '<input type="text" name="reqcrsotherdom_'.
                            $item.'_limit" size="1" '.                             $item.'_limit" size="1" '.
                            'value="'.$currlimit.'" /></span>'.                             'value="'.$currlimit.'" />';
                            '<br />'.$reqtitles{'unlimited'};  
             } else {  
                 $output .= '</span>';  
             }              }
             $output .= '</td>';              $output .= '&nbsp;'
         }          }
         $output .= '</td></tr></table></td>'."\n".          $output .= '</span></td>'."\n".
                    &Apache::loncommon::end_data_table_row()."\n";                     &Apache::loncommon::end_data_table_row()."\n";
     }      }
     return $output;      return $output;
Line 462  sub courserequest_titles { Line 436  sub courserequest_titles {
                                    approval   => 'Approval by Dom. Coord.',                                     approval   => 'Approval by Dom. Coord.',
                                    validate   => 'With validation',                                     validate   => 'With validation',
                                    autolimit  => 'Numerical limit',                                     autolimit  => 'Numerical limit',
                                    unlimited  => '(blank for unlimited)',  
                  );                   );
     return %titles;      return %titles;
 }  }
Line 479  sub courserequest_display { Line 452  sub courserequest_display {
 # =================================================================== Phase one  # =================================================================== Phase one
   
 sub print_username_entry_form {  sub print_username_entry_form {
     my ($r,$context,$response,$srch,$forcenewuser,$crstype) = @_;      my ($r,$context,$response,$srch,$forcenewuser) = @_;
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my $formtoset = 'crtuser';      my $formtoset = 'crtuser';
     if (exists($env{'form.startrolename'})) {      if (exists($env{'form.startrolename'})) {
Line 498  sub print_username_entry_form { Line 471  sub print_username_entry_form {
         '// ]]>'."\n".          '// ]]>'."\n".
         '</script>'."\n";          '</script>'."\n";
   
     my %existingroles=&Apache::lonuserutils::my_custom_roles($crstype);  
     if (($env{'form.action'} eq 'custom') && (keys(%existingroles) > 0)  
         && (&Apache::lonnet::allowed('mcr','/'))) {  
         $jscript .= &customrole_javascript();  
     }  
     my %loaditems = (      my %loaditems = (
                 'onload' => "javascript:setFormElements(document.$formtoset)",                  'onload' => "javascript:setFormElements(document.$formtoset)",
                     );                      );
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);      my %breadcrumb_text = &singleuser_breadcrumb();
     my $start_page =      my $start_page =
  &Apache::loncommon::start_page('User Management',   &Apache::loncommon::start_page('User Management',
        $jscript,{'add_entries' => \%loaditems,});         $jscript,{'add_entries' => \%loaditems,});
Line 528  sub print_username_entry_form { Line 496  sub print_username_entry_form {
     }      }
     my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',      my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                      $helpitem);                                                       $helpitem);
       my %existingroles=&Apache::lonuserutils::my_custom_roles();
       my $choice=&Apache::loncommon::select_form('make new role','rolename',
    ('make new role' => 'Generate new role ...',%existingroles));
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'srst' => 'Search for a user and enroll as a student',                      'srst' => 'Search for a user and enroll as a student',
                     'srme' => 'Search for a user and enroll as a member',  
   
                     'srad' => 'Search for a user and modify/add user information or roles',                      'srad' => 'Search for a user and modify/add user information or roles',
     'usr'  => "Username",      'usr'  => "Username",
                     'dom'  => "Domain",                      'dom'  => "Domain",
                     'ecrp' => "Define or Edit Custom Role",                      'ecrp' => "Edit Custom Role Privileges",
                     'nr'   => "role name",                      'nr'   => "Name of Role",
                     'cre'  => "Next",                      'cre'  => "Next",
        );         );
     $r->print($start_page."\n".$crumbs);      $r->print($start_page."\n".$crumbs);
     if ($env{'form.action'} eq 'custom') {      if ($env{'form.action'} eq 'custom') {
         if (&Apache::lonnet::allowed('mcr','/')) {          if (&Apache::lonnet::allowed('mcr','/')) {
             my $newroletext = &mt('Define new custom role:');              $r->print(<<ENDCUSTOM);
             $r->print('<form action="/adm/createuser" method="post" name="docustom">'.  <form action="/adm/createuser" method="post" name="docustom">
                       '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.  <input type="hidden" name="action" value="$env{'form.action'}" />
                       '<input type="hidden" name="phase" value="selected_custom_edit" />'.  <input type="hidden" name="phase" value="selected_custom_edit" />
                       '<h3>'.$lt{'ecrp'}.'</h3>'.  <h3>$lt{'ecrp'}</h3>
                       &Apache::loncommon::start_data_table().  $choice $lt{'nr'}: <input type="text" size="15" name="newrolename" /><br />
                       &Apache::loncommon::start_data_table_row().  <input name="customeditor" type="submit" value="$lt{'cre'}" />
                       '<td>');  </form>
             if (keys(%existingroles) > 0) {  ENDCUSTOM
                 $r->print('<br /><label><input type="radio" name="customroleaction" value="new" checked="checked" onclick="setCustomFields();" /><b>'.$newroletext.'</b></label>');  
             } else {  
                 $r->print('<br /><input type="hidden" name="customroleaction" value="new" /><b>'.$newroletext.'</b>');  
             }  
             $r->print('</td><td align="center">'.$lt{'nr'}.'<br /><input type="text" size="15" name="newrolename" onfocus="setCustomAction('."'new'".');" /></td>'.  
                       &Apache::loncommon::end_data_table_row());  
             if (keys(%existingroles) > 0) {  
                 $r->print(&Apache::loncommon::start_data_table_row().'<td><br />'.  
                           '<label><input type="radio" name="customroleaction" value="edit" onclick="setCustomFields();"/><b>'.  
                           &mt('View/Modify existing role:').'</b></label></td>'.  
                           '<td align="center"><br />'.  
                           '<select name="rolename" onchange="setCustomAction('."'edit'".');">'.  
                           '<option value="" selected="selected">'.  
                           &mt('Select'));  
                 foreach my $role (sort(keys(%existingroles))) {  
                     $r->print('<option value="'.$role.'">'.$role.'</option>');  
                 }  
                 $r->print('</select>'.  
                           '</td>'.  
                           &Apache::loncommon::end_data_table_row());  
             }  
             $r->print(&Apache::loncommon::end_data_table().'<p>'.  
                       '<input name="customeditor" type="submit" value="'.  
                       $lt{'cre'}.'" /></p>'.  
                       '</form>');  
         }          }
     } else {      } else {
         my $actiontext = $lt{'srad'};          my $actiontext = $lt{'srad'};
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             if ($crstype eq 'Community') {              $actiontext = $lt{'srst'};
                 $actiontext = $lt{'srme'};  
             } else {  
                 $actiontext = $lt{'srst'};  
             }  
         }          }
         $r->print("<h3>$actiontext</h3>");          $r->print("
   <h3>$actiontext</h3>");
         if ($env{'form.origform'} ne 'crtusername') {          if ($env{'form.origform'} ne 'crtusername') {
             $r->print("\n".$response);              $r->print("\n".$response);
         }          }
         $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response,$crstype));          $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response));
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }
   
 sub customrole_javascript {  
     my $js = <<"END";  
 <script type="text/javascript">  
 // <![CDATA[  
   
 function setCustomFields() {  
     if (document.docustom.customroleaction.length > 0) {  
         for (var i=0; i<document.docustom.customroleaction.length; i++) {  
             if (document.docustom.customroleaction[i].checked) {  
                 if (document.docustom.customroleaction[i].value == 'new') {  
                     document.docustom.rolename.selectedIndex = 0;  
                 } else {  
                     document.docustom.newrolename.value = '';  
                 }  
             }  
         }  
     }  
     return;  
 }  
   
 function setCustomAction(caller) {  
     if (document.docustom.customroleaction.length > 0) {  
         for (var i=0; i<document.docustom.customroleaction.length; i++) {  
             if (document.docustom.customroleaction[i].value == caller) {  
                 document.docustom.customroleaction[i].checked = true;  
             }  
         }  
     }  
     setCustomFields();  
     return;  
 }  
   
 // ]]>  
 </script>  
 END  
     return $js;  
 }  
   
 sub entry_form {  sub entry_form {
     my ($dom,$srch,$forcenewuser,$context,$responsemsg,$crstype) = @_;      my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);      my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
     my ($usertype,$inexact);      my ($usertype,$inexact);
     if (ref($srch) eq 'HASH') {      if (ref($srch) eq 'HASH') {
Line 674  ENDBLOCK Line 577  ENDBLOCK
         my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');          my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
                   'enro' => 'Enroll one student',                    'enro' => 'Enroll one student',
                   'enrm' => 'Enroll one member',  
                   'admo' => 'Add/modify a single user',                    'admo' => 'Add/modify a single user',
                   'crea' => 'create new user if required',                    'crea' => 'create new user if required',
                   'uskn' => "username is known",                    'uskn' => "username is known",
Line 687  ENDBLOCK Line 589  ENDBLOCK
         my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain');          my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain');
         my ($title,$buttontext,$showresponse);          my ($title,$buttontext,$showresponse);
         if ($env{'form.action'} eq 'singlestudent') {             if ($env{'form.action'} eq 'singlestudent') {   
             if ($crstype eq 'Community') {              $title = $lt{'enro'};
                 $title = $lt{'enrm'};  
             } else {  
                 $title = $lt{'enro'};  
             }  
             $buttontext = $lt{'enrl'};              $buttontext = $lt{'enrl'};
         } else {          } else {
             $title = $lt{'admo'};              $title = $lt{'admo'};
Line 738  sub user_modification_js { Line 636  sub user_modification_js {
     return <<END;      return <<END;
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
 // <![CDATA[  // <![CDATA[
   
     function pclose() {      function pclose() {
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",          parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                  "height=350,width=350,scrollbars=no,menubar=no");                   "height=350,width=350,scrollbars=no,menubar=no");
Line 762  END Line 659  END
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub print_user_selection_page {  sub print_user_selection_page {
     my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements,$crstype) = @_;      my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements) = @_;
     my @fields = ('username','domain','lastname','firstname','permanentemail');      my @fields = ('username','domain','lastname','firstname','permanentemail');
     my $sortby = $env{'form.sortby'};      my $sortby = $env{'form.sortby'};
   
Line 790  ENDSCRIPT Line 687  ENDSCRIPT
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                                        'usrch'          => "User Search to add/modify roles",                                         'usrch'          => "User Search to add/modify roles",
                                        'stusrch'        => "User Search to enroll student",                                         'stusrch'        => "User Search to enroll student",
                                        'memsrch'        => "User Search to enroll member",  
                                        'usel'           => "Select a user to add/modify roles",                                         'usel'           => "Select a user to add/modify roles",
                                        'stusel'         => "Select a user to enroll as a student",                                         'stusel'         => "Select a user to enroll as a student", 
                                        'memsel'         => "Select a user to enroll as a member",  
                                        'username'       => "username",                                         'username'       => "username",
                                        'domain'         => "domain",                                         'domain'         => "domain",
                                        'lastname'       => "last name",                                         'lastname'       => "last name",
Line 805  ENDSCRIPT Line 700  ENDSCRIPT
     } else {      } else {
         $r->print(&Apache::loncommon::start_page('User Management',$jscript));          $r->print(&Apache::loncommon::start_page('User Management',$jscript));
   
         my %breadcrumb_text = &singleuser_breadcrumb($crstype);          my %breadcrumb_text = &singleuser_breadcrumb();
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"javascript:backPage(document.usersrchform,'','')",              ({href=>"javascript:backPage(document.usersrchform,'','')",
               text=>$breadcrumb_text{'search'},                text=>$breadcrumb_text{'search'},
Line 817  ENDSCRIPT Line 712  ENDSCRIPT
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                           'Course_Change_Privileges'));                                                            'Course_Change_Privileges'));
             $r->print("<b>$lt{'usrch'}</b><br />");              $r->print("<b>$lt{'usrch'}</b><br />");
             $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));              $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
             $r->print('<h3>'.$lt{'usel'}.'</h3>');              $r->print('<h3>'.$lt{'usel'}.'</h3>');
         } elsif ($env{'form.action'} eq 'singlestudent') {          } elsif ($env{'form.action'} eq 'singlestudent') {
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
                                                           'Course_Add_Student'));                                                            'Course_Add_Student'));
             $r->print($jscript."<b>");              $r->print($jscript."<b>$lt{'stusrch'}</b><br />");
             if ($crstype eq 'Community') {              $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context));
                 $r->print($lt{'memsrch'});              $r->print('</form><h3>'.$lt{'stusel'}.'</h3>');
             } else {  
                 $r->print($lt{'stusrch'});  
             }  
             $r->print("</b><br />");  
             $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));  
             $r->print('</form><h3>');  
             if ($crstype eq 'Community') {  
                 $r->print($lt{'memsel'});  
             } else {  
                 $r->print($lt{'stusel'});  
             }  
             $r->print('</h3>');  
         }          }
     }      }
     $r->print('<form name="usersrchform" method="post">'.      $r->print('<form name="usersrchform" method="post">'.
Line 864  ENDSCRIPT Line 747  ENDSCRIPT
         my ($uname,$udom) = split(/:/,$user);          my ($uname,$udom) = split(/:/,$user);
         my $onclick;          my $onclick;
         if ($context eq 'requestcrs') {          if ($context eq 'requestcrs') {
             $onclick =              $onclick = 
                 'onclick="javascript:gochoose('."'$uname','$udom',".                  'onclick="javascript:gochoose('."'$uname','$udom',".
                                                "'$srch_results->{$user}->{firstname}',".                                                 "'$srch_results->{$user}->{firstname}',".
                                                "'$srch_results->{$user}->{lastname}',".                                                 "'$srch_results->{$user}->{lastname}',".
                                                "'$srch_results->{$user}->{permanentemail}'".');"';                                                 "'$srch_results->{$user}->{permanentemail}'".');"';
         } else {          } else {
             $onclick =              $onclick = 
                 ' onclick="javascript:pickuser('."'".$uname."'".','."'".$udom."'".');"';                  ' onclick="javascript:pickuser('."'".$uname."'".','."'".$udom."'".');"';
         }          }
         $r->print(&Apache::loncommon::start_data_table_row().          $r->print(&Apache::loncommon::start_data_table_row().
Line 911  sub print_user_query_page { Line 794  sub print_user_query_page {
 }  }
   
 sub print_user_modification_page {  sub print_user_modification_page {
     my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission,$crstype) = @_;      my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_;
     if (($ccuname eq '') || ($ccdomain eq '')) {      if (($ccuname eq '') || ($ccdomain eq '')) {
         my $usermsg = &mt('No username and/or domain provided.');          my $usermsg = &mt('No username and/or domain provided.');
         $env{'form.phase'} = '';          $env{'form.phase'} = '';
  &print_username_entry_form($r,$context,$usermsg,'','',$crstype);   &print_username_entry_form($r,$context,$usermsg);
         return;          return;
     }      }
     my ($form,$formname);      my ($form,$formname);
Line 956  sub print_user_modification_page { Line 839  sub print_user_modification_page {
                             ,'<a href="'.$helplink.'">','</a>')                              ,'<a href="'.$helplink.'">','</a>')
                         .'</p><br />';                          .'</p><br />';
             $env{'form.phase'} = '';              $env{'form.phase'} = '';
             &print_username_entry_form($r,$context,$response,undef,undef,$crstype);              &print_username_entry_form($r,$context,$response);
             return;              return;
         }          }
         $newuser = 1;          $newuser = 1;
Line 980  sub print_user_modification_page { Line 863  sub print_user_modification_page {
                             'username');                              'username');
                     }                      }
                     $env{'form.phase'} = '';                      $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$userchkmsg,undef,undef,$crstype);                      &print_username_entry_form($r,$context,$userchkmsg);
                     return;                      return;
                 }                  }
             }              }
Line 1007  sub print_user_modification_page { Line 890  sub print_user_modification_page {
     }      }
     my $start_page =       my $start_page = 
  &Apache::loncommon::start_page('User Management',$js,$args);   &Apache::loncommon::start_page('User Management',$js,$args);
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);      my %breadcrumb_text = &singleuser_breadcrumb();
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage($form)",       ({href=>"javascript:backPage($form)",
        text=>$breadcrumb_text{'search'},         text=>$breadcrumb_text{'search'},
Line 1039  sub print_user_modification_page { Line 922  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 1070  ENDFORMINFO Line 939  ENDFORMINFO
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
                 'cnu'            => 'Create New User',                  'cnu'            => 'Create New User',
                 'ast'            => 'as a student',                  'ast'            => 'as a student',
                 'ame'            => 'as a member',  
                 'ind'            => 'in domain',                  'ind'            => 'in domain',
                 'lg'             => 'Login Data',                  'lg'             => 'Login Data',
                 'hs'             => "Home Server",                  'hs'             => "Home Server",
Line 1089  $loginscript Line 957  $loginscript
 <h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain  <h2>$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain
 ENDTITLE  ENDTITLE
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             if ($crstype eq 'Community') {              $r->print(' ('.$lt{'ast'}.')');
                 $r->print(' ('.$lt{'ame'}.')');  
             } else {  
                 $r->print(' ('.$lt{'ast'}.')');  
             }  
         }          }
         $r->print('</h2>'."\n".'<div class="LC_left_float">');          $r->print('</h2>'."\n".'<div class="LC_left_float">');
         my $personal_table =           my $personal_table = 
             &personal_data_display($ccuname,$ccdomain,$newuser,$context,              &personal_data_display($ccuname,$ccdomain,$newuser,$context,
                                    $inst_results{$ccuname.':'.$ccdomain});                                     $inst_results{$ccuname.':'.$ccdomain});
         $r->print($personal_table);          $r->print($personal_table);
   #FIXME
         my ($home_server_pick,$numlib) =           my ($home_server_pick,$numlib) = 
             &Apache::loncommon::home_server_form_item($ccdomain,'hserver',              &Apache::loncommon::home_server_form_item($ccdomain,'hserver',
                                                       'default','hide');                                                        'default','hide');
Line 1112  $lt{'hs'}: $home_server_pick Line 977  $lt{'hs'}: $home_server_pick
             $r->print($home_server_pick);              $r->print($home_server_pick);
         }          }
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
             $r->print('<br /><h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.              $r->print('<br /><h3>'.&mt('User Can Request Creation of Courses in this Domain?').'</h3>'.
                       &Apache::loncommon::start_data_table().                        &Apache::loncommon::start_data_table().
                       &build_tools_display($ccuname,$ccdomain,                        &build_tools_display($ccuname,$ccdomain,
                                            'requestcourses').                                             'requestcourses').
Line 1186  ENDAUTH Line 1051  ENDAUTH
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                     'cup'  => "Modify existing user: ",                      'cup'  => "Modify existing user: ",
                     'ens'  => "Enroll one student: ",                      'ens'  => "Enroll one student: ",
                     'enm'  => "Enroll one member: ",  
                     'id'   => "in domain",                      'id'   => "in domain",
        );         );
  $r->print(<<ENDCHANGEUSER);   $r->print(<<ENDCHANGEUSER);
Line 1196  $forminfo Line 1060  $forminfo
 <h2>  <h2>
 ENDCHANGEUSER  ENDCHANGEUSER
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             if ($crstype eq 'Community') {              $r->print($lt{'ens'});
                 $r->print($lt{'enm'});  
             } else {  
                 $r->print($lt{'ens'});  
             }  
         } else {          } else {
             $r->print($lt{'cup'});              $r->print($lt{'cup'});
         }          }
Line 1214  ENDCHANGEUSER Line 1074  ENDCHANGEUSER
             $r->print(&Apache::lonuserutils::forceid_change($context));              $r->print(&Apache::lonuserutils::forceid_change($context));
         }          }
         if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {          if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
             $r->print('<h3>'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'</h3>'.              $r->print('<h3>'.&mt('User Can Request Creation of Courses in this Domain?').'</h3>'.
                       &Apache::loncommon::start_data_table());                        &Apache::loncommon::start_data_table());
             if ($env{'request.role.domain'} eq $ccdomain) {              if ($env{'request.role.domain'} eq $ccdomain) { 
                 $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));                  $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));
             } else {              } else {
                 $r->print(&coursereq_externaluser($ccuname,$ccdomain,                  $r->print(&coursereq_externaluser($ccuname,$ccdomain,
Line 1293  ENDNOTOOLSPRIV Line 1153  ENDNOTOOLSPRIV
         }          }
         $r->print('</div><div class="LC_clear_float_footer"></div>');          $r->print('</div><div class="LC_clear_float_footer"></div>');
         if ($env{'form.action'} ne 'singlestudent') {          if ($env{'form.action'} ne 'singlestudent') {
             &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context,              &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses);
                                     $roledom,$crstype);  
         }          }
     } ## End of new user/old user logic      } ## End of new user/old user logic
   
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         my $btntxt;          $r->print('<br /><input type="button" value="'.&mt('Enroll Student').'" onclick="setSections(this.form)" />'."\n");
         if ($crstype eq 'Community') {  
             $btntxt = &mt('Enroll Member');  
         } else {  
             $btntxt = &mt('Enroll Student');  
         }  
         $r->print('<br /><input type="button" value="'.$btntxt.'" onclick="setSections(this.form)" />'."\n");  
     } else {      } else {
         $r->print('<h3>'.&mt('Add Roles').'</h3>');          $r->print('<h3>'.&mt('Add Roles').'</h3>');
         my $addrolesdisplay = 0;          my $addrolesdisplay = 0;
Line 1343  ENDNOTOOLSPRIV Line 1197  ENDNOTOOLSPRIV
 }  }
   
 sub singleuser_breadcrumb {  sub singleuser_breadcrumb {
     my ($crstype) = @_;  
     my %breadcrumb_text;      my %breadcrumb_text;
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         if ($crstype eq 'Community') {          $breadcrumb_text{'search'} = 'Enroll a student';
             $breadcrumb_text{'search'} = 'Enroll a member';  
         } else {  
             $breadcrumb_text{'search'} = 'Enroll a student';  
         }  
         $breadcrumb_text{'userpicked'} = 'Select a user',          $breadcrumb_text{'userpicked'} = 'Select a user',
         $breadcrumb_text{'modify'} = 'Set section/dates',          $breadcrumb_text{'modify'} = 'Set section/dates',
     } else {      } else {
Line 1414  sub validation_javascript { Line 1263  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 1279  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?localtime($role_start_time)
                                             : '&nbsp;' ).                                                  : '&nbsp;' ).
               '</td><td>'.($role_end_time  ?&Apache::lonlocal::locallocaltime($role_end_time)                     '</td><td>'.($role_end_time  ?localtime($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','Group','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');                  $contextrole = 'Existing Roles in this Course';
               } 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 1462  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','Group','Domain','System','Unknown') {
             if ($output{$type}) {                  if ($output{$type}) {
                 $r->print($output{$type}."\n");                      $r->print($output{$type}."\n");
                   }
             }              }
               $r->print(&Apache::loncommon::end_data_table());
         }          }
         $r->print(&Apache::loncommon::end_data_table());      }  # End of check for keys in rolesdump
     }  
     return;      return;
 }  }
   
Line 2162  sub get_inststatuses { Line 1957  sub get_inststatuses {
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub update_user_data {  sub update_user_data {
     my ($r,$context,$crstype) = @_;       my ($r,$context) = @_; 
     my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},      my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
                                           $env{'form.ccdomain'});                                            $env{'form.ccdomain'});
     # Error messages      # Error messages
Line 2186  sub update_user_data { Line 1981  sub update_user_data {
                   $jsback."\n".                    $jsback."\n".
                   '// ]]>'."\n".                    '// ]]>'."\n".
                   '</script>'."\n";                    '</script>'."\n";
     my %breadcrumb_text = &singleuser_breadcrumb($crstype);      my %breadcrumb_text = &singleuser_breadcrumb();
     my $args;      my $args;
     if ($env{'form.popup'}) {      if ($env{'form.popup'}) {
         $args->{'no_nav_bar'} = 1;          $args->{'no_nav_bar'} = 1;
Line 2285  sub update_user_data { Line 2080  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 2418  sub update_user_data { Line 2213  sub update_user_data {
  }   }
     }      }
     ##      ##
     my (@userroles,%userupdate,$cnum,$cdom,$crstype,$namechanged);      my (@userroles,%userupdate,$cnum,$cdom,$namechanged);
     if ($context eq 'course') {      if ($context eq 'course') {
         ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();          ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
         $crstype = &Apache::loncommon::course_type($cdom.'_'.$cnum);  
     }      }
     if (! $env{'form.makeuser'} ) {      if (! $env{'form.makeuser'} ) {
         # Check for need to change          # Check for need to change
Line 2505  sub update_user_data { Line 2299  sub update_user_data {
             if ($role eq 'cr') {              if ($role eq 'cr') {
                 push(@longroles,'Custom');                  push(@longroles,'Custom');
             } else {              } else {
                 push(@longroles,&Apache::lonnet::plaintext($role,$crstype));                   push(@longroles,&Apache::lonnet::plaintext($role)); 
             }              }
         }          }
         my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');          my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
Line 2659  sub update_user_data { Line 2453  sub update_user_data {
                           \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);                            \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);
         } else {          } else {
             &tool_changes('reqcrsotherdom',\@requestcourses,\%oldaccess,\%oldaccesstext,              &tool_changes('reqcrsotherdom',\@requestcourses,\%oldaccess,\%oldaccesstext,
                           \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);                            \%userenv,
                                     \%changeHash,\%changed,\%newaccess,\%newaccesstext);
         }          }
         if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||          if ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
             $env{'form.cmiddlename'} ne $userenv{'middlename'} ||              $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
Line 2691  sub update_user_data { Line 2486  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 2973  END Line 2769  END
                   .'</span>');                    .'</span>');
     }      }
     if ($env{'form.action'} eq 'singlestudent') {      if ($env{'form.action'} eq 'singlestudent') {
         &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype);          &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context);
         $r->print('<p><a href="javascript:backPage(document.userupdate)">');          $r->print('<p><a href="javascript:backPage(document.userupdate)">'.
         if ($crstype eq 'Community') {                    &mt('Enroll Another Student').'</a></p>');
             $r->print(&mt('Enroll Another Member'));  
         } else {  
             $r->print(&mt('Enroll Another Student'));  
         }  
         $r->print('</a></p>');  
     } else {      } else {
         my @rolechanges = &update_roles($r,$context);          my @rolechanges = &update_roles($r,$context);
         if ($namechanged) {          if ($namechanged) {
Line 3027  sub tool_changes { Line 2818  sub tool_changes {
         my %reqdisplay = &courserequest_display();          my %reqdisplay = &courserequest_display();
         my $cdom = $env{'request.role.domain'};          my $cdom = $env{'request.role.domain'};
         foreach my $tool (@{$usertools}) {          foreach my $tool (@{$usertools}) {
             $oldaccesstext->{$tool} = &mt('No');              $oldaccesstext->{$tool} = &mt('no');
             $newaccesstext->{$tool} = $oldaccesstext->{$tool};  
             $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool};              $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool};
             my $newop;  
             if ($env{'form.'.$context.'_'.$tool}) {  
                 $newop = $env{'form.'.$context.'_'.$tool};  
                 if ($newop eq 'autolimit') {  
                     my $limit = $env{'form.'.$context.'_'.$tool.'_limit'};  
                     $limit =~ s/\D+//g;  
                     $newop .= '='.$limit;  
                 }  
             }  
             if ($userenv->{$context.'.'.$tool} eq '') {              if ($userenv->{$context.'.'.$tool} eq '') {
                 if ($newop) {                  if ($env{'form.'.$context.'_'.$tool}) {
                     $changed->{$tool}=&tool_admin($tool,$cdom.':'.$newop,                      $changed->{$tool}=&tool_admin($tool,$cdom,
                                                   $changeHash,$context);                                                    $changeHash,$context);
                     if ($changed->{$tool}) {                      if ($changed->{$tool}) {
                         $newaccesstext->{$tool} = &mt('Yes');                          $newaccesstext->{$tool} = &mt('yes');
                     } else {                      } else {
                         $newaccesstext->{$tool} = $oldaccesstext->{$tool};                          $newaccesstext->{$tool} = $oldaccesstext->{$tool};
                     }                      }
Line 3053  sub tool_changes { Line 2834  sub tool_changes {
                 my @curr = split(',',$userenv->{$context.'.'.$tool});                  my @curr = split(',',$userenv->{$context.'.'.$tool});
                 my @new;                  my @new;
                 my $changedoms;                  my $changedoms;
                 foreach my $req (@curr) {                  my $newop = $env{'form.'.$context.'_'.$tool};
                     if ($req =~ /^\Q$cdom\E\:($optregex\=?\d*)$/) {                  if ($newop eq 'autolimit') {
                         $oldaccesstext->{$tool} = &mt('Yes');                      $newop .= '=';
                         my $oldop = $1;                      unless ($env{'form.'.$context.'_'.$tool.'_limit'} =~ /\D/) {
                         if ($oldop ne $newop) {                          $newop .= $env{'form.'.$context.'_'.$tool.'_limit'};
                             $changedoms = 1;                      }
                             foreach my $item (@curr) {                  }  
                                 my ($reqdom,$option) = split(':',$item);                  if (grep(/^\Q$cdom:($optregex\=?\d*)\E$/,@curr)) {
                                 unless ($reqdom eq $cdom) {                      $oldaccesstext->{$tool} = &mt('yes');
                                     push(@new,$item);                      my $oldop = $1;
                                 }                      if ($oldop ne $newop) {
                             }                          $changedoms = 1;
                             if ($newop) {                          foreach my $dom (@curr) {
                                 push(@new,$cdom.':'.$newop);                              unless ($dom eq $cdom) {
                                   push(@new,$dom);
                             }                              }
                             @new = sort(@new);  
                         }                          }
                         last;                          if ($newop) {
                               push(@new,$cdom.':'.$newop);
                           }
                           @new = sort(@new);
                     }                      }
                 }                  } elsif ($env{'form.'.$context.'_'.$tool}) {
                 if ((!$changedoms) && ($newop)) {  
                     $changedoms = 1;                      $changedoms = 1;
                     @new = sort(@curr,$cdom.':'.$newop);                      @new = sort(@curr,$cdom.':'.$newop);
                 }                  }
                   $newaccesstext->{$tool} = $oldaccesstext->{$tool};
                 if ($changedoms) {                  if ($changedoms) {
                     my $newdomstr;                      my $newdomstr; 
                     if (@new) {                      if (@new) {
                         $newdomstr = join(',',@new);                          $newdomstr = join(',',@new);
                     }                      }
Line 3087  sub tool_changes { Line 2871  sub tool_changes {
                     if ($changed->{$tool}) {                      if ($changed->{$tool}) {
                         if ($env{'form.'.$context.'_'.$tool}) {                          if ($env{'form.'.$context.'_'.$tool}) {
                             if ($env{'form.'.$context.'_'.$tool} eq 'autolimit') {                              if ($env{'form.'.$context.'_'.$tool} eq 'autolimit') {
                                 my $limit = $env{'form.'.$context.'_'.$tool.'_limit'};                                  if ($env{'form.'.$context.'_'.$tool.'_limit'} =~ /\D/) {
                                 $limit =~ s/\D+//g;  
                                 if ($limit) {  
                                     $newaccesstext->{$tool} = &mt('Yes, up to limit of [quant,_1,request] per user.',$limit);  
                                 } else {  
                                     $newaccesstext->{$tool} = &mt('Yes, processed automatically');                                      $newaccesstext->{$tool} = &mt('Yes, processed automatically');
                                   } else {
                                       $newaccesstext->{$tool} = &mt('Yes, up to limit of [quant,_1,request] per user).',$env{'form.'.$context.'_'.$tool.'_limit'});
                                 }                                  }
                             } else {                              } else {  
                                 $newaccesstext->{$tool} = $reqdisplay{$env{'form.'.$context.'_'.$tool}};                                  $newaccesstext->{$tool} = $reqdisplay{$env{'form.'.$context.'_'.$tool}};
                             }                              }
                         } else {                          } else {
Line 3113  sub tool_changes { Line 2895  sub tool_changes {
             if ($newval eq 'autolimit') {              if ($newval eq 'autolimit') {
                 $newval .= '='.$env{'form.crsreq_'.$tool.'_limit'};                  $newval .= '='.$env{'form.crsreq_'.$tool.'_limit'};
             }              }
         } else {          } else {  
             $newval = $env{'form.'.$context.'_'.$tool};              $newval = $env{'form.'.$context.'_'.$tool};
         }          }
         if ($userenv->{$context.'.'.$tool} ne '') {          if ($userenv->{$context.'.'.$tool} ne '') {
Line 3449  sub update_roles { Line 3231  sub update_roles {
 }  }
   
 sub enroll_single_student {  sub enroll_single_student {
     my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype) = @_;      my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context) = @_;
     $r->print('<h3>');      $r->print('<h3>'.&mt('Enrolling Student').'</h3>');
     if ($crstype eq 'Community') {  
         $r->print(&mt('Enrolling Member'));  
     } else {  
         $r->print(&mt('Enrolling Student'));  
     }  
     $r->print('</h3>');  
   
     # Remove non alphanumeric values from section      # Remove non alphanumeric values from section
     $env{'form.sections'}=~s/\W//g;      $env{'form.sections'}=~s/\W//g;
Line 3489  sub enroll_single_student { Line 3265  sub enroll_single_student {
         }          }
         $r->print('.<br />'.$showstart.'; '.$showend);          $r->print('.<br />'.$showstart.'; '.$showend);
         if ($startdate <= $now && !$newuser) {          if ($startdate <= $now && !$newuser) {
             $r->print('<p> ');              $r->print("<p> ".&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.')."</p>");
             if ($crstype eq 'Community') {  
                 $r->print(&mt('If the member is currently logged-in to LON-CAPA, the new role will be available when the member next logs in.'));  
             } else {  
                 $r->print(&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.'));  
             }  
             $r->print('</p>');  
         }          }
     } else {      } else {
         $r->print(&mt('unable to enroll').": ".$enroll_result);          $r->print(&mt('unable to enroll').": ".$enroll_result);
Line 3620  sub build_roles { Line 3390  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 3410  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 3419  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 3458  sub custom_role_editor {
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $button_code = "\n";      my $button_code = "\n";
     my $head_script = "\n";      my $head_script = "\n";
     $head_script .= '<script type="text/javascript">'."\n".      $head_script .= '<script type="text/javascript">'."\n"
                     '// <![CDATA['."\n";                     .'// <![CDATA['."\n";
     my @template_roles = ("in","ta","ep");      my @template_roles = ("cc","in","ta","ep","st");
     if ($context eq 'domain') {  
         push(@template_roles,"ad");  
     }  
     push(@template_roles,"st");  
     if ($crstype eq 'Community') {  
         unshift(@template_roles,'co');  
     } else {  
         unshift(@template_roles,'cc');  
     }  
     foreach my $role (@template_roles) {      foreach my $role (@template_roles) {
         $head_script .= &make_script_template($role,$crstype);          $head_script .= &make_script_template($role);
         $button_code .= &make_button_code($role,$crstype).' ';          $button_code .= &make_button_code($role).' ';
     }      }
     my $context_code;      $head_script .= "\n".$jsback."\n"
     if ($context eq 'domain') {                     .'// ]]>'."\n"
         my $checkedCommunity = '';                     .'</script>'."\n";
         my $checkedCourse = ' checked="checked"';  
         if ($env{'form.templatecrstype'} eq 'Community') {  
             $checkedCommunity = $checkedCourse;  
             $checkedCourse = '';  
         }  
         $context_code = '<label>'.  
                         '<input type="radio" name="templatecrstype" value="Course"'.$checkedCourse.' onclick="this.form.submit();">'.  
                         &mt('Course').  
                         '</label>'.('&nbsp;' x2).  
                         '<label>'.  
                         '<input type="radio" name="templatecrstype" value="Community"'.$checkedCommunity.' onclick="this.form.submit();">'.  
                         &mt('Community').  
                         '</label>'.  
                         '</fieldset>'.  
                         '<input type="hidden" name="customroleaction" value="'.  
                         $action.'" />';  
         if ($env{'form.customroleaction'} eq 'new') {  
             $context_code .= '<input type="hidden" name="newrolename" value="'.  
                              $rolename.'" />';  
         } else {  
             $context_code .= '<input type="hidden" name="rolename" value="'.  
                              $rolename.'" />';  
         }  
         $context_code .= '<input type="hidden" name="action" value="custom" />'.  
                          '<input type="hidden" name="phase" value="selected_custom_edit" />';  
     }  
     $head_script .= "\n".$jsback."\n".  
                     '// ]]>'."\n".  
                     '</script>'."\n";  
     $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));      $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));
     &Apache::lonhtmlcommon::add_breadcrumb     &Apache::lonhtmlcommon::add_breadcrumb
      ({href=>"javascript:backPage(document.form1,'pickrole','')",       ({href=>"javascript:backPage(document.form1,'pickrole','')",
        text=>"Pick custom role",         text=>"Pick custom role",
        faq=>282,bug=>'Instructor Interface',},         faq=>282,bug=>'Instructor Interface',},
Line 3765  sub custom_role_editor { Line 3486  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 3792  ENDCCF Line 3505  ENDCCF
 '</th><th>'.$lt{'ssl'}.'</th>'.  '</th><th>'.$lt{'ssl'}.'</th>'.
               &Apache::loncommon::end_data_table_header_row());                &Apache::loncommon::end_data_table_header_row());
     foreach my $priv (sort keys %full) {      foreach my $priv (sort keys %full) {
         my $privtext = &Apache::lonnet::plaintext($priv,$crstype);          my $privtext = &Apache::lonnet::plaintext($priv);
         $r->print(&Apache::loncommon::start_data_table_row().          $r->print(&Apache::loncommon::start_data_table_row().
           '<td>'.$privtext.'</td><td>'.            '<td>'.$privtext.'</td><td>'.
     ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c"'.      ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c"'.
Line 3800  ENDCCF Line 3513  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 3529  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 3543  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 3887  sub make_script_template { Line 3595  sub make_script_template {
 }  }
 # ----------------------------------------------------------  # ----------------------------------------------------------
 sub make_button_code {  sub make_button_code {
     my ($role,$crstype) = @_;      my ($role) = @_;
     my $label = &Apache::lonnet::plaintext($role,$crstype);      my $label = &Apache::lonnet::plaintext($role);
     my $button_code = '<input type="button" onclick="set_'.$role.'()" value="'.$label.'" />';      my $button_code = '<input type="button" onclick="set_'.$role.'()" value="'.$label.'" />';
     return ($button_code);      return ($button_code);
 }  }
Line 3902  sub set_custom_role { Line 3610  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 3988  sub handler { Line 3696  sub handler {
        $r->send_http_header;         $r->send_http_header;
        return OK;         return OK;
     }      }
     my ($context,$crstype);      my $context;
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         $context = 'course';          $context = 'course';
         $crstype = &Apache::loncommon::course_type();  
     } elsif ($env{'request.role'} =~ /^au\./) {      } elsif ($env{'request.role'} =~ /^au\./) {
         $context = 'author';          $context = 'author';
     } else {      } else {
Line 4010  sub handler { Line 3717  sub handler {
     #SD Following files not added to help, because the corresponding .tex-files seem to      #SD Following files not added to help, because the corresponding .tex-files seem to
     #be missing: Course_Approve_Selfenroll,Course_User_Logs,      #be missing: Course_Approve_Selfenroll,Course_User_Logs,
     my ($permission,$allowed) =       my ($permission,$allowed) = 
         &Apache::lonuserutils::get_permission($context,$crstype);          &Apache::lonuserutils::get_permission($context);
     if (!$allowed) {      if (!$allowed) {
         $env{'user.error.msg'}=          $env{'user.error.msg'}=
             "/adm/createuser:cst:0:0:Cannot create/modify user data ".              "/adm/createuser:cst:0:0:Cannot create/modify user data ".
Line 4025  sub handler { Line 3732  sub handler {
     if (! exists($env{'form.action'})) {      if (! exists($env{'form.action'})) {
         $r->print(&header());          $r->print(&header());
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));          $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
         $r->print(&print_main_menu($permission,$context,$crstype));          $r->print(&print_main_menu($permission,$context));
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {      } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) {
         $r->print(&header());          $r->print(&header());
Line 4041  sub handler { Line 3748  sub handler {
             &Apache::lonuserutils::print_first_users_upload_form($r,$context);              &Apache::lonuserutils::print_first_users_upload_form($r,$context);
         } elsif ($env{'form.state'} eq 'got_file') {          } elsif ($env{'form.state'} eq 'got_file') {
             &Apache::lonuserutils::print_upload_manager_form($r,$context,              &Apache::lonuserutils::print_upload_manager_form($r,$context,
                                                              $permission,$crstype);                                                               $permission);
         } elsif ($env{'form.state'} eq 'enrolling') {          } elsif ($env{'form.state'} eq 'enrolling') {
             if ($env{'form.datatoken'}) {              if ($env{'form.datatoken'}) {
                 &Apache::lonuserutils::upfile_drop_add($r,$context,$permission);                  &Apache::lonuserutils::upfile_drop_add($r,$context,$permission);
Line 4066  sub handler { Line 3773  sub handler {
                 if ($env{'form.srchterm'} !~ /^$match_username$/) {                  if ($env{'form.srchterm'} !~ /^$match_username$/) {
                     my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');                      my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
                     $env{'form.phase'} = '';                      $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$response,$srch,undef,$crstype);                      &print_username_entry_form($r,$context,$response,$srch);
                 } else {                  } else {
                     my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});                      my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});
                     my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});                      my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});
                     &print_user_modification_page($r,$ccuname,$ccdomain,                      &print_user_modification_page($r,$ccuname,$ccdomain,
                                                   $srch,$response,$context,                                                    $srch,$response,$context,
                                                   $permission,$crstype);                                                    $permission);
                 }                  }
             } elsif ($env{'form.phase'} eq 'get_user_info') {              } elsif ($env{'form.phase'} eq 'get_user_info') {
                 my ($currstate,$response,$forcenewuser,$results) =                   my ($currstate,$response,$forcenewuser,$results) = 
Line 4082  sub handler { Line 3789  sub handler {
                 }                  }
                 if ($currstate eq 'select') {                  if ($currstate eq 'select') {
                     &print_user_selection_page($r,$response,$srch,$results,                      &print_user_selection_page($r,$response,$srch,$results,
                                                \@search,$context,undef,$crstype);                                                 \@search,$context);
                 } elsif ($currstate eq 'modify') {                  } elsif ($currstate eq 'modify') {
                     my ($ccuname,$ccdomain);                      my ($ccuname,$ccdomain);
                     if (($srch->{'srchby'} eq 'uname') &&                       if (($srch->{'srchby'} eq 'uname') && 
Line 4100  sub handler { Line 3807  sub handler {
                     }                      }
                     &print_user_modification_page($r,$ccuname,$ccdomain,                      &print_user_modification_page($r,$ccuname,$ccdomain,
                                                   $srch,$response,$context,                                                    $srch,$response,$context,
                                                   $permission,$crstype);                                                    $permission);
                 } elsif ($currstate eq 'query') {                  } elsif ($currstate eq 'query') {
                     &print_user_query_page($r,'createuser');                      &print_user_query_page($r,'createuser');
                 } else {                  } else {
                     $env{'form.phase'} = '';                      $env{'form.phase'} = '';
                     &print_username_entry_form($r,$context,$response,$srch,                      &print_username_entry_form($r,$context,$response,$srch,
                                                $forcenewuser,$crstype);                                                 $forcenewuser);
                 }                  }
             } elsif ($env{'form.phase'} eq 'userpicked') {              } elsif ($env{'form.phase'} eq 'userpicked') {
                 my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});                  my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});
                 my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});                  my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});
                 &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',                  &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',
                                               $context,$permission,$crstype);                                                $context,$permission);
             }              }
         } elsif ($env{'form.phase'} eq 'update_user_data') {          } elsif ($env{'form.phase'} eq 'update_user_data') {
             &update_user_data($r,$context,$crstype);              &update_user_data($r,$context);
         } else {          } else {
             &print_username_entry_form($r,$context,undef,$srch,undef,$crstype);              &print_username_entry_form($r,$context,undef,$srch);
         }          }
     } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {      } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {
         if ($env{'form.phase'} eq 'set_custom_roles') {          if ($env{'form.phase'} eq 'set_custom_roles') {
Line 4152  sub handler { Line 3859  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 4188  sub handler { Line 3883  sub handler {
         }          }
     } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {      } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {
         $r->print(&header());          $r->print(&header());
         my $brtext;  
         if ($crstype eq 'Community') {  
             $brtext = 'Drop Members';  
         } else {  
             $brtext = 'Drop Students';  
         }  
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/createuser?action=drop',              ({href=>'/adm/createuser?action=drop',
               text=>$brtext});                text=>"Drop Students"});
         if (!exists($env{'form.state'})) {          if (!exists($env{'form.state'})) {
             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',              $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                                                           'Course_Drop_Student'));                                                            'Course_Drop_Student'));
   
             &Apache::lonuserutils::print_drop_menu($r,$context,$permission,$crstype);              &Apache::lonuserutils::print_drop_menu($r,$context,$permission);
         } elsif ($env{'form.state'} eq 'done') {          } elsif ($env{'form.state'} eq 'done') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/createuser?action=drop',              ({href=>'/adm/createuser?action=drop',
               text=>"Result"});                text=>"Result"});
             $r->print(&Apache::lonhtmlcommon::breadcrumbs($brtext,              $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                                                           'Course_Drop_Student'));                                                            'Course_Drop_Student'));
             &Apache::lonuserutils::update_user_list($r,$context,undef,              &Apache::lonuserutils::update_user_list($r,$context,undef,
                                                     $env{'form.action'});                                                      $env{'form.action'});
Line 4216  sub handler { Line 3905  sub handler {
         if ($permission->{'cusr'}) {          if ($permission->{'cusr'}) {
             $r->print(&header(undef,undef,{'no_nav_bar' => 1}).              $r->print(&header(undef,undef,{'no_nav_bar' => 1}).
                       &Apache::lonuserutils::date_section_selector($context,                        &Apache::lonuserutils::date_section_selector($context,
                                                                    $permission,$crstype).                                                                     $permission).
                       &Apache::loncommon::end_page());                        &Apache::loncommon::end_page());
         } else {          } else {
             $r->print(&header().              $r->print(&header().
Line 4258  sub handler { Line 3947  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 4282  sub handler { Line 3970  sub handler {
     } else {      } else {
         $r->print(&header());          $r->print(&header());
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));          $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
         $r->print(&print_main_menu($permission,$context,$crstype));          $r->print(&print_main_menu($permission,$context));
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
     }      }
     return OK;      return OK;
Line 4301  sub header { Line 3989  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 4326  END Line 4014  END
 ###############################################################  ###############################################################
 #  Menu Phase One  #  Menu Phase One
 sub print_main_menu {  sub print_main_menu {
     my ($permission,$context,$crstype) = @_;      my ($permission,$context) = @_;
     my $linkcontext = $context;  
     my $stuterm = lc(&Apache::lonnet::plaintext('st',$crstype));  
     if (($context eq 'course') && ($crstype eq 'Community')) {  
         $linkcontext = lc($crstype);  
         $stuterm = 'Members';  
     }  
   
     my %links = (      my %links = (
                        domain => {                  domain => {
                                    upload => 'Upload a File of Users',                              upload     => 'Upload a File of Users',
                                    singleuser => 'Add/Modify a 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 => {  
                                    upload     => 'Upload a File of Community Users',  
                                    singleuser => 'Add/Modify a Community User',  
                                    listusers  => 'Manage Community Users',  
                                  },  
                 );                  );
     my @menu =    my @menu = ( {categorytitle => 'Single Users', 
         (           items =>
           { text => $links{$context}{'upload'},           [
             help => 'Course_Create_Class_List',              {
             action => 'upload',               linktext => $links{$context}{'singleuser'},
             permission => $permission->{'cusr'},               icon => 'edit-redo.png',
                #help => 'Course_Change_Privileges',
                url => '/adm/createuser?action=singleuser',
                permission => $permission->{'cusr'},
                linktitle => 'Add a user with a certain role to this course.',
               },
            ]},
   
            {categorytitle => 'Multiple Users',
            items => 
            [
               {
                linktext => $links{$context}{'upload'},
                icon => 'sctr.png',
                #help => 'Course_Create_Class_List',
                url => '/adm/createuser?action=upload',
                permission => $permission->{'cusr'},
                linktitle => 'Upload a CSV or a text file containing users.',
             },              },
           { text => $links{$context}{'singleuser'},              {
             help => 'Course_Change_Privileges',               linktext => $links{$context}{'listusers'},
             action => 'singleuser',               icon => 'edit-find.png',
             permission => $permission->{'cusr'},               #help => 'Course_View_Class_List',
                url => '/adm/createuser?action=listusers',
                permission => ($permission->{'view'} || $permission->{'cusr'}),
                linktitle => 'Show and manage users of this course.',
               },
   
            ]},
   
            {categorytitle => 'Administration',
            items => [ ]},
          );
               
       if ($context eq 'domain'){
           
           push(@{ $menu[2]->{items} }, #Category: Administration
               {
                linktext => 'Custom Roles',
                icon => 'emblem-photos.png',
                #help => 'Course_Editing_Custom_Roles',
                url => '/adm/createuser?action=custom',
                permission => $permission->{'custom'},
                linktitle => 'Configure a custom role.',
             },              },
           { text => $links{$context}{'listusers'},  
             help => 'Course_View_Class_List',  
             action => 'listusers',  
             permission => ($permission->{'view'} || $permission->{'cusr'}),  
           },  
         );          );
     if ($context eq 'domain' || $context eq 'course') {          
         my $customlink =  { text => 'Edit Custom Roles',      }elsif ($context eq 'course'){
                             help => 'Course_Editing_Custom_Roles',  
                             action => 'custom',  
                             permission => $permission->{'custom'},  
                           };  
         push(@menu,$customlink);  
     }  
     if ($context eq 'course') {  
         my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();          my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
         my @courselinks =      
             (          push(@{ $menu[0]->{items} }, #Category: Single Users
               { text => 'Enroll a Single Student',              {   
                  help => 'Course_Add_Student',               linktext => 'Add/Modify a Student',
                  action => 'singlestudent',               #help => 'Course_Add_Student',
                  permission => $permission->{'cusr'},               icon => 'list-add.png',
                  },               url => '/adm/createuser?action=singlestudent',
               { text => 'Drop Students',               permission => $permission->{'cusr'},
                 help => 'Course_Drop_Student',               linktitle => 'Add a user with the role student to this course.',
                 action => 'drop',              },
                 permission => $permission->{'cusr'},          );
               });          
         if (!exists($permission->{'cusr_section'})) {          push(@{ $menu[1]->{items} }, #Category: Multiple Users 
             if ($crstype ne 'Community') {              {
                 push(@courselinks,               linktext => 'Drop Students',
                    { text => 'Automated Enrollment Manager',               icon => 'edit-undo.png',
                      help => 'Course_Automated_Enrollment',               #help => 'Course_Drop_Student',
                      permission => (&Apache::lonnet::auto_run($cnum,$cdom)               url => '/adm/createuser?action=drop',
                                    && $permission->{'cusr'}),               permission => $permission->{'cusr'},
                      url  => '/adm/populate',               linktitle =>'Remove a student from this course.',
                    });              },
              }          );
              push(@courselinks,          push(@{ $menu[2]->{items} }, #Category: Administration
                  { text  => 'Configure User Self-enrollment',              {    
                    help  => 'Course_Self_Enrollment',               linktext => 'Custom Roles',
                    action => 'selfenroll',               icon => 'emblem-photos.png',
                    permission => $permission->{'cusr'},               #help => 'Course_Editing_Custom_Roles',
                  });               url => '/adm/createuser?action=custom',
         }               permission => $permission->{'custom'},
                linktitle => 'Configure a custom role.',
               },
               {
                linktext => 'Course Groups',
                icon => 'conf.png',
                #help => 'Course_Manage_Group',
                url => '/adm/coursegroups?refpage=cusr',
                permission => $permission->{'grp_manage'},
                linktitle => 'Manage course groups.',
               },
               {
                linktext => 'Change Logs',
                icon => 'document-properties.png',
                #help => 'Course_User_Logs',
                url => '/adm/createuser?action=changelogs',
                permission => $permission->{'cusr'},
                linktitle => 'View change log.',
               },
           );
         if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {          if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {
             push(@courselinks,              push(@{ $menu[2]->{items} },
                     {   text => 'Enrollment Requests',                      {   
                         help => 'Course_Approve_Selfenroll',                       linktext => 'Enrollment Requests',
                         action => 'selfenrollqueue',                       icon => 'selfenrl-queue.png',
                         permission => $permission->{'cusr'},                       #help => 'Course_Approve_Selfenroll',
                     });                       url => '/adm/createuser?action=selfenrollqueue',
         }                       permission => $permission->{'cusr'},
         push(@courselinks,                       linktitle =>'Approve or reject enrollment requests.',
                { text => 'Manage Course Groups',                      },
                  help => 'Course_Manage_Group',              );
                  permission => $permission->{'grp_manage'},          }
                  url => '/adm/coursegroups?refpage=cusr',          
                },          if (!exists($permission->{'cusr_section'})){
                { text => 'View Change Logs',              
                  help => 'Course_User_Logs',              push(@{ $menu[2]->{items} },
                  action => 'changelogs',                  {
                    linktext => 'Automated Enrollment',
                    icon => 'roles.png',
                    #help => 'Course_Automated_Enrollment',
                    permission => (&Apache::lonnet::auto_run($cnum,$cdom)
                                        && $permission->{'cusr'}),
                    url  => '/adm/populate',
                    linktitle => 'Automated enrollment manager.',
                   },
                   {
                    linktext => 'User Self-Enrollment',
                    icon => 'cstr.png',
                    #help => 'Course_Self_Enrollment',
                    url => '/adm/createuser?action=selfenroll',
                  permission => $permission->{'cusr'},                   permission => $permission->{'cusr'},
                },);                   linktitle => 'Configure user self enrollment.',
                   },
               );
           
           }
       };
   return Apache::lonhtmlcommon::generate_menu(@menu);
 #               { text => 'View Log-in History',  #               { text => 'View Log-in History',
 #                 help => 'Course_User_Logins',  #                 help => 'Course_User_Logins',
 #                 action => 'logins',  #                 action => 'logins',
 #                 permission => $permission->{'cusr'},  #                 permission => $permission->{'cusr'},
 #               });  #               });
         push(@menu,@courselinks);  
     }  
     my $menu_html = '';  
     foreach my $menu_item (@menu) {  
         next if (! $menu_item->{'permission'});  
         $menu_html.='<p>';  
         if (exists($menu_item->{'help'})) {  
             $menu_html.=  
                 &Apache::loncommon::help_open_topic($menu_item->{'help'});  
         }  
         $menu_html.='<font size="+1">';  
         if (exists($menu_item->{'url'})) {  
             $menu_html.=qq{<a href="$menu_item->{'url'}">};  
         } else {  
             $menu_html.=  
                 qq{<a href="/adm/createuser?action=$menu_item->{'action'}">};      }  
         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';  
         $menu_html.='</p>';  
     }  
     return $menu_html;  
 }  }
   
 sub restore_prev_selections {  sub restore_prev_selections {
Line 4472  sub restore_prev_selections { Line 4192  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 4404  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 4553  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 4928  sub visible_in_cat { Line 4641  sub visible_in_cat {
     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);      my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
     my ($cathash,%settable,@vismsgs,$cansetvis);      my ($cathash,%settable,@vismsgs,$cansetvis);
     my %visactions = &Apache::lonlocal::texthash(      my %visactions = &Apache::lonlocal::texthash(
                    vis => 'Your course/community currently appears in the Course/Community Catalog for this domain.',                     vis => 'Your course currently appears in the Course Catalog for this domain.',
                    gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.',                     gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.',
                    miss => 'Your course/community does not currently appear in the Course/Community Catalog for this domain.',                     miss => 'Your course does not currently appear in the Course Catalog for this domain.',
                    yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',                     yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',
                    coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',                     coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',
                    make => 'Make any changes to self-enrollment settings below, click "Save", then take action to include the course in the Catalog:',                     make => 'Make any changes to self-enrollment settings below, click "Save", then take action to include the course in the Catalog:',
Line 5146  sub print_userchangelogs_display { Line 4859  sub print_userchangelogs_display {
     my $formname = 'roleslog';      my $formname = 'roleslog';
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $crstype = &Apache::loncommon::course_type();  
     my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);      my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);
     if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }      if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }
   
Line 5185  sub print_userchangelogs_display { Line 4897  sub print_userchangelogs_display {
     }      }
     my (%whodunit,%changed,$version);      my (%whodunit,%changed,$version);
     ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);      ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);
     $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype));      $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version));
     my $showntablehdr = 0;  
     my $tablehdr = &Apache::loncommon::start_data_table().  
                    &Apache::loncommon::start_data_table_header_row().  
                    '<th>&nbsp;</th><th>'.&mt('When').'</th><th>'.&mt('Who made the change').  
                    '</th><th>'.&mt('Changed User').'</th><th>'.&mt('Role').'</th><th>'.&mt('Section').'</th><th>'.  
                    &mt('Context').'</th><th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.  
                    &Apache::loncommon::end_data_table_header_row();  
     my ($minshown,$maxshown);      my ($minshown,$maxshown);
     $minshown = 1;      $minshown = 1;
     my $count = 0;      my $count = 0;
Line 5202  sub print_userchangelogs_display { Line 4907  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 4931  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 5261  sub print_userchangelogs_display { Line 4966  sub print_userchangelogs_display {
         if ($roleslog{$id}{'logentry'}{'selfenroll'}) {          if ($roleslog{$id}{'logentry'}{'selfenroll'}) {
             $chgcontext = 'selfenroll';              $chgcontext = 'selfenroll';
         }          }
         my %lt = &rolechg_contexts($crstype);          my %lt = &rolechg_contexts();
         if ($chgcontext ne '' && $lt{$chgcontext} ne '') {          if ($chgcontext ne '' && $lt{$chgcontext} ne '') {
             $chgcontext = $lt{$chgcontext};              $chgcontext = $lt{$chgcontext};
         }          }
         $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td><td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td><td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td><td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).'</td><td>'.$sec.'</td><td>'.$chgcontext.'</td><td>'.$rolestart.'</td><td>'.$roleend.'</td>'.&Apache::loncommon::end_data_table_row()."\n");          $content .=
               &Apache::loncommon::start_data_table_row()
              .'<td>'.$count.'</td>'
              .'<td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td>'
              .'<td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td>'
              .'<td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td>'
              .'<td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'}).'</td>'
              .'<td>'.$sec.'</td>'
              .'<td>'.$chgcontext.'</td>'
              .'<td>'.$rolestart.'</td>'
              .'<td>'.$roleend.'</td>'
              .&Apache::loncommon::end_data_table_row();
       }
   
       # Form Footer
       my $form_footer =
           '<input type="hidden" name="page" value="'.$curr{'page'}.'" />'
          .'<input type="hidden" name="action" value="changelogs" />'
          .'</form>';
   
       # Only display table, if content is available (has been collected above)
       if (!$content) {
           $r->print('<p class="LC_info">'
                    .&mt('There are no records to display.')
                    .'</p>'
           );
           $r->print($form_footer);
           return;
     }      }
     if ($showntablehdr) {  
         $r->print(&Apache::loncommon::end_data_table().'<br />');      # Content to display, so create navigation and display table
         if (($curr{'page'} > 1) || ($more_records)) {  
             $r->print('<table><tr>');      # Create Navigation:
             if ($curr{'page'} > 1) {      # Navigation Script
                 $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');      my $nav_script = <<"ENDSCRIPT";
             }  
             if ($more_records) {  
                 $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');  
             }  
             $r->print('</tr></table>');  
             $r->print(<<"ENDSCRIPT");  
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function chgPage(caller) {  function chgPage(caller) {
Line 5294  function chgPage(caller) { Line 5020  function chgPage(caller) {
 // ]]>  // ]]>
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
         }      # Navigation Buttons
     } else {      my $nav_links;
         $r->print('<p class="LC_info">'.      $nav_links = '<p>';
                   &mt('There are no records to display').      if (($curr{'page'} > 1) || ($more_records)) {
                   '</p>');          if ($curr{'page'} > 1) {
     }              $nav_links .= '<input type="button"'
     $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.                           .' onclick="javascript:chgPage('."'previous'".');"'
               '<input type="hidden" name="action" value="changelogs" /></form>');                           .' value="'.&mt('Previous [_1] changes',$curr{'show'})
                            .'" /> ';
           }
           if ($more_records) {
               $nav_links .= '<input type="button"'
                            .' onclick="javascript:chgPage('."'next'".');"'
                            .' value="'.&mt('Next [_1] changes',$curr{'show'})
                            .'" />';
           }
       }
       $nav_links .= '</p>';
   
       # Table Header
       my $tableheader =
           &Apache::loncommon::start_data_table_header_row()
          .'<th>&nbsp;</th>'
          .'<th>'.&mt('When').'</th>'
          .'<th>'.&mt('Who made the change').'</th>'
          .'<th>'.&mt('Changed User').'</th>'
          .'<th>'.&mt('Role').'</th>'
          .'<th>'.&mt('Section').'</th>'
          .'<th>'.&mt('Context').'</th>'
          .'<th>'.&mt('Start').'</th>'
          .'<th>'.&mt('End').'</th>'
          .&Apache::loncommon::end_data_table_header_row();
   
       # Print Content
       $r->print(
           $nav_script
          .$nav_links
          .&Apache::loncommon::start_data_table()
          .$tableheader
          .$content
          .&Apache::loncommon::end_data_table()
          .$nav_links
          .$form_footer
       );
     return;      return;
 }  }
   
 sub role_display_filter {  sub role_display_filter {
     my ($formname,$cdom,$cnum,$curr,$version,$crstype) = @_;      my ($formname,$cdom,$cnum,$curr,$version) = @_;
     my $context = 'course';      my $context = 'course';
     my $lctype = lc($crstype);  
     my $nolink = 1;      my $nolink = 1;
     my $output = '<table><tr><td valign="top">'.      my $output = '<table><tr><td valign="top">'.
                  '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b></span><br />'.                   '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b></span><br />'.
Line 5323  sub role_display_filter { Line 5084  sub role_display_filter {
         &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date',          &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date',
                                             $curr->{'rolelog_end_date'},undef,                                              $curr->{'rolelog_end_date'},undef,
                                             undef,undef,undef,undef,undef,undef,$nolink);                                              undef,undef,undef,undef,undef,undef,$nolink);
     my %lt = &rolechg_contexts($crstype);      my %lt = &rolechg_contexts();
     $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br /><table><tr><td>'.&mt('After:').      $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br />'.
                '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.                 '<table><tr><td>'.&mt('After:').
                $endform.'</td></tr></table></td><td>&nbsp;&nbsp;</td>'.                 '</td><td>'.$startform.'</td></tr>'.
                  '<tr><td>'.&mt('Before:').'</td>'.
                  '<td>'.$endform.'</td></tr></table>'.
                  '</td>'.
                  '<td>&nbsp;&nbsp;</td>'.
                '<td valign="top"><b>'.&mt('Role:').'</b><br />'.                 '<td valign="top"><b>'.&mt('Role:').'</b><br />'.
                '<select name="role"><option value="any"';                 '<select name="role"><option value="any"';
     if ($curr->{'role'} eq 'any') {      if ($curr->{'role'} eq 'any') {
         $output .= ' selected="selected"';          $output .= ' selected="selected"';
     }      }
     $output .=  '>'.&mt('Any').'</option>'."\n";      $output .=  '>'.&mt('Any').'</option>'."\n";
     my @roles = &Apache::lonuserutils::course_roles($context,undef,1,$lctype);      my @roles = &Apache::lonuserutils::course_roles($context,undef,1);
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $plrole;          my $plrole;
         if ($role eq 'cr') {          if ($role eq 'cr') {
             $plrole = &mt('Custom Role');              $plrole = &mt('Custom Role');
         } else {          } else {
             $plrole=&Apache::lonnet::plaintext($role,$crstype);              $plrole=&Apache::lonnet::plaintext($role);
         }          }
         my $selstr = '';          my $selstr = '';
         if ($role eq $curr->{'role'}) {          if ($role eq $curr->{'role'}) {
Line 5347  sub role_display_filter { Line 5112  sub role_display_filter {
         }          }
         $output .= '  <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>';          $output .= '  <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>';
     }      }
     $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="top"><b>'.      $output .= '</select></td>'.
                  '<td>&nbsp;&nbsp;</td>'.
                  '<td valign="top"><b>'.
                &mt('Context:').'</b><br /><select name="chgcontext">';                 &mt('Context:').'</b><br /><select name="chgcontext">';
     foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll','requestcourses') {      foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll') {
         my $selstr = '';          my $selstr = '';
         if ($curr->{'chgcontext'} eq $chgtype) {          if ($curr->{'chgcontext'} eq $chgtype) {
             $selstr = ' selected="selected"';              $selstr = ' selected="selected"';
Line 5368  sub role_display_filter { Line 5135  sub role_display_filter {
               .'</p>';                .'</p>';
   
     # Server version info      # Server version info
     $output .= '<p style="font-size: smaller;" class="LC_info">'      $output .= '<p class="LC_info">'
               .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'                .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
                   ,'2.6.99.0');                    ,'2.6.99.0');
     if ($version) {      if ($version) {
         $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);          $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);
     }      }
     $output .= '</p><hr /><br />';      $output .= '</p><hr />';
     return $output;      return $output;
 }  }
   
 sub rolechg_contexts {  sub rolechg_contexts {
     my ($crstype) = @_;  
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                                              any          => 'Any',                                               any          => 'Any',
                                              auto         => 'Automated enrollment',                                               auto         => 'Automated enrollment',
Line 5388  sub rolechg_contexts { Line 5154  sub rolechg_contexts {
                                              course       => 'User Management in course',                                               course       => 'User Management in course',
                                              domain       => 'User Management in domain',                                               domain       => 'User Management in domain',
                                              selfenroll   => 'Self-enrolled',                                               selfenroll   => 'Self-enrolled',
                                              requestcourses => 'Course Request',                                               requestcourses => 'Course Request', 
                                          );                                           );
     if ($crstype eq 'Community') {  
         $lt{'createcourse'} = &mt('Community Creation');  
         $lt{'course'} = &mt('User Management in community');  
         $lt{'requestcourses'} = &mt('Community Request');  
     }  
     return %lt;      return %lt;
 }  }
   
Line 5789  sub build_search_response { Line 5550  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 5559  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 5811  sub build_search_response { Line 5572  sub build_search_response {
                     my $helplink = ' href="javascript:helpMenu('."'display'".')"';                      my $helplink = ' href="javascript:helpMenu('."'display'".')"';
                     $response .= '<br /><br />';                      $response .= '<br /><br />';
                     if ($context eq 'requestcrs') {                      if ($context eq 'requestcrs') {
                         $response .= &mt("You are not authorized to define new users in the new course's domain - [_1].",$targetdom);                          $response .= &mt("You are not authorized to defined new users in the new course's domain - [_1].",$targetdom);
                     } else {                      } else {
                         $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 5666  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 5681  sub course_level_table {
     &Apache::loncommon::get_sections($domain,$cnum);      &Apache::loncommon::get_sections($domain,$cnum);
             }              }
         }          }
         my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype);          my @roles = &Apache::lonuserutils::roles_by_context('course');
  foreach my $role (@roles) {   foreach my $role (@roles) {
             my $plrole=&Apache::lonnet::plaintext($role,$crstype);              my $plrole=&Apache::lonnet::plaintext($role);
             if ((&Apache::lonnet::allowed('c'.$role,$thiscourse)) ||      if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {
                 ((($role eq 'cc') || ($role eq 'co')) && ($isowner))) {  
                 $table .= &course_level_row($protectedcourse,$role,$area,$domain,                  $table .= &course_level_row($protectedcourse,$role,$area,$domain,
                                             $plrole,\%sections_count,\%lt);                                              $plrole,\%sections_count,\%lt);    
             } elsif ($env{'request.course.sec'} ne '') {              } elsif ($env{'request.course.sec'} ne '') {
                 if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.                  if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.
                                              $env{'request.course.sec'})) {                                               $env{'request.course.sec'})) {
Line 5937  sub course_level_table { Line 5696  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 5727  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 5776  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');
     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 5787  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 5814  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 5884  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 6187  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.313


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