Diff for /loncom/interface/loncreateuser.pm between versions 1.403 and 1.414

version 1.403, 2014/06/30 14:49:35 version 1.414, 2016/10/04 21:02:16
Line 251  sub build_tools_display { Line 251  sub build_tools_display {
                    'unofficial' => 'Can request creation of unofficial courses',                     'unofficial' => 'Can request creation of unofficial courses',
                    'community'  => 'Can request creation of communities',                     'community'  => 'Can request creation of communities',
                    'textbook'   => 'Can request creation of textbook courses',                     'textbook'   => 'Can request creation of textbook courses',
                      'placement'  => 'Can request creation of placement tests',
                    'requestauthor'  => 'Can request author space',                     'requestauthor'  => 'Can request author space',
     );      );
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,          %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                       'requestcourses.official','requestcourses.unofficial',                        'requestcourses.official','requestcourses.unofficial',
                       'requestcourses.community','requestcourses.textbook');                        'requestcourses.community','requestcourses.textbook',
         @usertools = ('official','unofficial','community','textbook');                        'requestcourses.placement');
           @usertools = ('official','unofficial','community','textbook','placement');
         @options =('norequest','approval','autolimit','validate');          @options =('norequest','approval','autolimit','validate');
         %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain);          %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain);
         %reqtitles = &courserequest_titles();          %reqtitles = &courserequest_titles();
Line 447  sub coursereq_externaluser { Line 449  sub coursereq_externaluser {
                    'unofficial' => 'Can request creation of unofficial courses',                     'unofficial' => 'Can request creation of unofficial courses',
                    'community'  => 'Can request creation of communities',                     'community'  => 'Can request creation of communities',
                    'textbook'   => 'Can request creation of textbook courses',                     'textbook'   => 'Can request creation of textbook courses',
                      'placement'  => 'Can request creation of placement tests',
     );      );
   
     %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,      %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
                       'reqcrsotherdom.official','reqcrsotherdom.unofficial',                        'reqcrsotherdom.official','reqcrsotherdom.unofficial',
                       'reqcrsotherdom.community','reqcrsotherdom.textbook');                        'reqcrsotherdom.community','reqcrsotherdom.textbook',
     @usertools = ('official','unofficial','community','textbook');                        'reqcrsotherdom.placement');
       @usertools = ('official','unofficial','community','textbook','placement');
     @options = ('approval','validate','autolimit');      @options = ('approval','validate','autolimit');
     %validations = &Apache::lonnet::auto_courserequest_checks($cdom);      %validations = &Apache::lonnet::auto_courserequest_checks($cdom);
     my $optregex = join('|',@options);      my $optregex = join('|',@options);
Line 527  sub domainrole_req { Line 531  sub domainrole_req {
            &Apache::loncommon::end_data_table();             &Apache::loncommon::end_data_table();
 }  }
   
   sub domadhocroles {
       my ($ccuname,$ccdomain) = @_;
       my $confname = &Apache::lonnet::get_domainconfiguser($env{'request.role.domain'}); 
       my %existing=&Apache::lonnet::dump('roles',$env{'request.role.domain'},
                                          $confname,'rolesdef_');
       my $output;
       if (keys(%existing) > 0) {
           my @current;
           my $curradhoc = 'adhocroles.'.$env{'request.role.domain'}; 
           my %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,$curradhoc);
           if ($userenv{$curradhoc}) {
               @current = split(/,/,$userenv{$curradhoc});
           }
           my %customroles;
           foreach my $key (keys(%existing)) {
               if ($key=~/^rolesdef\_(\w+)$/) {
                   my $rolename = $1;
                   my %privs;
                   ($privs{'system'},$privs{'domain'},$privs{'course'}) = split(/\_/,$existing{$key});
                   $customroles{$rolename} = \%privs;
               }
           }
           $output = '<br /><h3>'.
                     &mt('Ad Hoc Course Roles Selectable via Helpdesk Role').
                     '</h3>'."\n".
                     &Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row().
                     '<th>'.&mt('Action').'</th><th>'.&mt('Role').'</th>'.
                     '<th>'.&mt('Privileges in Course').'<th>'.
                     &Apache::loncommon::end_data_table_header_row(); 
           foreach my $key (sort(keys(%customroles))) {
               $output .= &Apache::loncommon::start_data_table_row();
               if (grep(/^\Q$key\E$/,@current)) {
                   $output .= '<td><label>'.
                              '<input type="checkbox" name="adhocroledel" value="'.$key.'" />'.
                              &mt('Delete').'</label>'.
                              '</td>';
               } else {
                   $output .= '<td><label>'.
                              '<input type="checkbox" name="adhocroleadd" value="'.$key.'" />'.
                              &mt('Add').'</label>'.
                              '</td>';
               }
               $output .= '<td>'.$key.'</td><td>';
               foreach my $level ('course','domain','system') {
                   if ($customroles{$key}{$level}) {
                       my $suffix;
                       if (($level eq 'domain') || ($level eq 'system')) {
                           $suffix = '&nbsp;('.&mt($level).')';
                       }
                       my @privs = split(/:/,$customroles{$key}{$level});
                       foreach my $item (@privs) {
                           next if ($item eq ''); 
                           my ($priv,$cond) = split(/\&/,$item);
                           $output .= &Apache::lonnet::plaintext($priv,'Course').$suffix.'<br />';
                       }
                   }
               }
               $output .= '</td>'.
                          &Apache::loncommon::end_data_table_row();
           }
           $output .= &Apache::loncommon::end_data_table();
       }
       return $output;
   }
   
 sub courserequest_titles {  sub courserequest_titles {
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
                                    official   => 'Official',                                     official   => 'Official',
                                    unofficial => 'Unofficial',                                     unofficial => 'Unofficial',
                                    community  => 'Communities',                                     community  => 'Communities',
                                    textbook   => 'Textbook',                                     textbook   => 'Textbook',
                                      placement  => 'Placement Tests',
                                    norequest  => 'Not allowed',                                     norequest  => 'Not allowed',
                                    approval   => 'Approval by Dom. Coord.',                                     approval   => 'Approval by Dom. Coord.',
                                    validate   => 'With validation',                                     validate   => 'With validation',
Line 813  sub entry_form { Line 884  sub entry_form {
     }      }
     my $cancreate =      my $cancreate =
         &Apache::lonuserutils::can_create_user($dom,$context,$usertype);          &Apache::lonuserutils::can_create_user($dom,$context,$usertype);
     my $userpicker =       my ($userpicker,$cansearch) = 
        &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,         &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,
                                        'document.crtuser',$cancreate,$usertype);                                         'document.crtuser',$cancreate,$usertype);
     my $srchbutton = &mt('Search');      my $srchbutton = &mt('Search');
Line 822  sub entry_form { Line 893  sub entry_form {
     } elsif ($cancreate && $responsemsg ne '' && $inexact) {      } elsif ($cancreate && $responsemsg ne '' && $inexact) {
         $srchbutton = &mt('Search or Add New User');          $srchbutton = &mt('Search or Add New User');
     }      }
     my $output = <<"ENDBLOCK";      my $output;
       if ($cansearch) {
           $output = <<"ENDBLOCK";
 <form action="/adm/createuser" method="post" name="crtuser">  <form action="/adm/createuser" method="post" name="crtuser">
 <input type="hidden" name="action" value="$env{'form.action'}" />  <input type="hidden" name="action" value="$env{'form.action'}" />
 <input type="hidden" name="phase" value="get_user_info" />  <input type="hidden" name="phase" value="get_user_info" />
Line 830  $userpicker Line 903  $userpicker
 <input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.crtuser)" />  <input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.crtuser)" />
 </form>  </form>
 ENDBLOCK  ENDBLOCK
       } else {
           $output = '<p>'.$userpicker.'</p>';
       }
     if ($env{'form.phase'} eq '') {      if ($env{'form.phase'} eq '') {
         my $defdom=$env{'request.role.domain'};          my $defdom=$env{'request.role.domain'};
         my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');          my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain');
Line 1231  ENDFORMINFO Line 1307  ENDFORMINFO
     }      }
     my $title = '';      my $title = '';
     if ($newuser) {      if ($newuser) {
         my ($portfolioform,$domroleform);          my ($portfolioform,$domroleform,$adhocroleform);
         if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) ||          if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) ||
             (&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) {              (&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) {
             # Current user has quota or user tools modification privileges              # Current user has quota or user tools modification privileges
Line 1241  ENDFORMINFO Line 1317  ENDFORMINFO
             ($ccdomain eq $env{'request.role.domain'})) {              ($ccdomain eq $env{'request.role.domain'})) {
             $domroleform = '<br />'.&domainrole_req($ccuname,$ccdomain);              $domroleform = '<br />'.&domainrole_req($ccuname,$ccdomain);
         }          }
           if (&Apache::lonnet::allowed('cdh',$env{'request.role.domain'})) {
               $adhocroleform = &domadhocroles($ccuname,$ccdomain);
               if ($adhocroleform) {
                   $adhocroleform = '<br />'.$adhocroleform;
               }
           }
         &initialize_authen_forms($ccdomain,$formname);          &initialize_authen_forms($ccdomain,$formname);
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
                 'lg'             => 'Login Data',                  'lg'             => 'Login Data',
Line 1351  ENDAUTH Line 1433  ENDAUTH
         } else {          } else {
             $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));               $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc)); 
         }          }
         $r->print($portfolioform.$domroleform);          $r->print($portfolioform.$domroleform.$adhocroleform);
         if ($env{'form.action'} eq 'singlestudent') {          if ($env{'form.action'} eq 'singlestudent') {
             $r->print(&date_sections_select($context,$newuser,$formname,              $r->print(&date_sections_select($context,$newuser,$formname,
                                             $permission,$crstype,$ccuname,                                              $permission,$crstype,$ccuname,
Line 1388  ENDAUTH Line 1470  ENDAUTH
             $r->print(&Apache::loncommon::end_data_table());              $r->print(&Apache::loncommon::end_data_table());
         }          }
         $r->print('</div>');          $r->print('</div>');
         my @order = ('auth','quota','tools','requestauthor');          my @order = ('auth','quota','tools','requestauthor','adhocroles');
         my %user_text;          my %user_text;
         my ($isadv,$isauthor) =           my ($isadv,$isauthor) = 
             &Apache::lonnet::is_advanced_user($ccuname,$ccdomain);              &Apache::lonnet::is_advanced_user($ccuname,$ccdomain);
Line 1397  ENDAUTH Line 1479  ENDAUTH
             && ($env{'request.role.domain'} eq $ccdomain)) {              && ($env{'request.role.domain'} eq $ccdomain)) {
             $user_text{'requestauthor'} = &domainrole_req($ccuname,$ccdomain);              $user_text{'requestauthor'} = &domainrole_req($ccuname,$ccdomain);
         }          }
           if (&Apache::lonnet::allowed('cdh',$env{'request.role.domain'})) {
               $user_text{'adhocroles'} = &domadhocroles($ccuname,$ccdomain);
           }
         $user_text{'auth'} =  &user_authentication($ccuname,$ccdomain,$formname);          $user_text{'auth'} =  &user_authentication($ccuname,$ccdomain,$formname);
         if ((&Apache::lonnet::allowed('mpq',$ccdomain)) ||          if ((&Apache::lonnet::allowed('mpq',$ccdomain)) ||
             (&Apache::lonnet::allowed('mut',$ccdomain))) {              (&Apache::lonnet::allowed('mut',$ccdomain))) {
Line 2244  sub personal_data_display { Line 2329  sub personal_data_display {
                    '<input type="text" name="uname" size="25" value="" autocomplete="off" />';                     '<input type="text" name="uname" size="25" value="" autocomplete="off" />';
         $rowcount ++;          $rowcount ++;
         $output .= &Apache::lonhtmlcommon::row_closure(1);          $output .= &Apache::lonhtmlcommon::row_closure(1);
         my $upassone = '<input type="password" name="upass'.$now.'" size="10" autocomplete="off" />';          my $upassone = '<input type="password" name="upass'.$now.'" size="20" autocomplete="off" />';
         my $upasstwo = '<input type="password" name="upasscheck'.$now.'" size="10" autocomplete="off" />';          my $upasstwo = '<input type="password" name="upasscheck'.$now.'" size="20" autocomplete="off" />';
         $output .= &Apache::lonhtmlcommon::row_title(&mt('Password').'<b>*</b>',          $output .= &Apache::lonhtmlcommon::row_title(&mt('Password').'<b>*</b>',
                                                     'LC_pick_box_title',                                                      'LC_pick_box_title',
                                                     'LC_oddrow_value')."\n".                                                      'LC_oddrow_value')."\n".
Line 2351  sub personal_data_display { Line 2436  sub personal_data_display {
     }      }
     if (($context eq 'selfcreate') && ($newuser eq 'email')) {      if (($context eq 'selfcreate') && ($newuser eq 'email')) {
         if ($captchaform) {          if ($captchaform) {
             $output .= &Apache::lonhtmlcommon::row_title($lt{'valid'},              $output .= &Apache::lonhtmlcommon::row_title($lt{'valid'}.'*',
                                                          'LC_pick_box_title')."\n".                                                           'LC_pick_box_title')."\n".
                        $captchaform."\n".'<br /><br />'.                         $captchaform."\n".'<br /><br />'.
                        &Apache::lonhtmlcommon::row_closure(1)                         &Apache::lonhtmlcommon::row_closure(1)
Line 2579  sub update_user_data { Line 2664  sub update_user_data {
     my (%alerts,%rulematch,%inst_results,%curr_rules);      my (%alerts,%rulematch,%inst_results,%curr_rules);
     my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');      my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
     my @usertools = ('aboutme','blog','webdav','portfolio');      my @usertools = ('aboutme','blog','webdav','portfolio');
     my @requestcourses = ('official','unofficial','community','textbook');      my @requestcourses = ('official','unofficial','community','textbook','placement');
     my @requestauthor = ('requestauthor');      my @requestauthor = ('requestauthor');
     my ($othertitle,$usertypes,$types) =       my ($othertitle,$usertypes,$types) = 
         &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});          &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});
Line 2689  sub update_user_data { Line 2774  sub update_user_data {
                                                     $newcustom{'requestauthor'},                                                      $newcustom{'requestauthor'},
                                                     \%changeHash,'requestauthor');                                                      \%changeHash,'requestauthor');
                 }                  }
                   if (&Apache::lonnet::allowed('cdh',$env{'request.role.domain'})) {
                       my @adds = &Apache::loncommon::get_env_multiple('form.adhocroleadd');
                       if (&adhocrole_changes(\%changeHash)) {
                           $changed{'adhocroles.'.$env{'request.role.domain'}} = $changeHash{'adhocroles.'.$env{'request.role.domain'}};
                       }  
                   }
             }              }
             if ($canmodify_status{'inststatus'}) {              if ($canmodify_status{'inststatus'}) {
                 if (exists($env{'form.inststatus'})) {                  if (exists($env{'form.inststatus'})) {
Line 2752  sub update_user_data { Line 2843  sub update_user_data {
              'requestcourses.community','requestcourses.textbook',               'requestcourses.community','requestcourses.textbook',
              'reqcrsotherdom.official','reqcrsotherdom.unofficial',               'reqcrsotherdom.official','reqcrsotherdom.unofficial',
              'reqcrsotherdom.community','reqcrsotherdom.textbook',               'reqcrsotherdom.community','reqcrsotherdom.textbook',
              'requestauthor'],               'reqcrsotherdom.placement','requestauthor',
                'adhocroles.'.$env{'request.role.domain'}],
               $env{'form.ccdomain'},$env{'form.ccuname'});                $env{'form.ccdomain'},$env{'form.ccuname'});
         my ($tmp) = keys(%userenv);          my ($tmp) = keys(%userenv);
         if ($tmp =~ /^(con_lost|error)/i) {           if ($tmp =~ /^(con_lost|error)/i) { 
Line 2891  sub update_user_data { Line 2983  sub update_user_data {
                 &Apache::loncommon::default_quota($env{'form.ccdomain'},$oldinststatus,$name);                  &Apache::loncommon::default_quota($env{'form.ccdomain'},$oldinststatus,$name);
             ($newdefquota{$name},$newsettingstatus{$name}) = ($olddefquota{$name},$oldsettingstatus{$name});              ($newdefquota{$name},$newsettingstatus{$name}) = ($olddefquota{$name},$oldsettingstatus{$name});
         }          }
           push(@disporder,'adhocroles');
         my %canshow;          my %canshow;
         if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
             $canshow{'quota'} = 1;              $canshow{'quota'} = 1;
Line 2909  sub update_user_data { Line 3002  sub update_user_data {
         if (&Apache::lonnet::allowed('cau',$env{'form.ccdomain'})) {          if (&Apache::lonnet::allowed('cau',$env{'form.ccdomain'})) {
             $canshow{'requestauthor'} = 1;              $canshow{'requestauthor'} = 1;
         }          }
           if (&Apache::lonnet::allowed('cdh',$env{'request.role.domain'})) {
               $canshow{'adhocroles'} = 1;
           }
         my (%changeHash,%changed);          my (%changeHash,%changed);
         if ($oldinststatus eq '') {          if ($oldinststatus eq '') {
             $oldsettings{'inststatus'} = $othertitle;               $oldsettings{'inststatus'} = $othertitle; 
Line 3022  sub update_user_data { Line 3118  sub update_user_data {
                 &tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext,                  &tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext,
                               \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);                                \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
             }              }
               if ($userenv{'adhocroles.'.$env{'request.role.domain'}}) {
                   $changeHash{'adhocroles.'.$env{'request.role.domain'}} = $userenv{'adhocroles.'.$env{'request.role.domain'}};
               }
               if (&adhocrole_changes(\%changeHash,\%userenv)) {
                   $changed{'adhocroles'} = 1;
                   $oldsettings{'adhocroles'} = $userenv{'adhocroles.'.$env{'request.role.domain'}};
                   $newsettings{'adhocroles'} = $changeHash{'adhocroles.'.$env{'request.role.domain'}}; 
               }
         }          }
         foreach my $item (@userinfo) {          foreach my $item (@userinfo) {
             if ($env{'form.c'.$item} ne $userenv{$item}) {              if ($env{'form.c'.$item} ne $userenv{$item}) {
Line 3043  sub update_user_data { Line 3147  sub update_user_data {
                         ($env{'user.domain'} eq $env{'form.ccdomain'})) {                          ($env{'user.domain'} eq $env{'form.ccdomain'})) {
                         my %newenvhash;                          my %newenvhash;
                         foreach my $key (keys(%changed)) {                          foreach my $key (keys(%changed)) {
                             if (($key eq 'official') || ($key eq 'unofficial')                              if (($key eq 'official') || ($key eq 'unofficial') ||
                                 || ($key eq 'community') || ($key eq 'textbook')) {                                  ($key eq 'community') || ($key eq 'textbook') ||
                                   ($key eq 'placement')) {
                                 $newenvhash{'environment.requestcourses.'.$key} =                                  $newenvhash{'environment.requestcourses.'.$key} =
                                     $changeHash{'requestcourses.'.$key};                                      $changeHash{'requestcourses.'.$key};
                                 if ($changeHash{'requestcourses.'.$key}) {                                  if ($changeHash{'requestcourses.'.$key}) {
Line 3063  sub update_user_data { Line 3168  sub update_user_data {
           &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},            &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
                                             $key,'reload','requestauthor');                                              $key,'reload','requestauthor');
                                 }                                  }
                               } elsif ($key eq 'adhocroles') {
                                   $newenvhash{'adhocroles.'.$env{'request.role.domain'}} =
                                       $changeHash{'adhocroles.'.$env{'request.role.domain'}};
                             } elsif ($key ne 'quota') {                              } elsif ($key ne 'quota') {
                                 $newenvhash{'environment.tools.'.$key} =                                   $newenvhash{'environment.tools.'.$key} = 
                                     $changeHash{'tools.'.$key};                                      $changeHash{'tools.'.$key};
Line 3110  sub update_user_data { Line 3218  sub update_user_data {
                                   \%newsettingstext);                                    \%newsettingstext);
                 if ($env{'form.cid'} ne $userenv{'id'}) {                  if ($env{'form.cid'} ne $userenv{'id'}) {
                     &Apache::lonnet::idput($env{'form.ccdomain'},                      &Apache::lonnet::idput($env{'form.ccdomain'},
                          ($env{'form.ccuname'} => $env{'form.cid'}));                           {$env{'form.ccuname'} => $env{'form.cid'}},$uhome,'ids');
                     if (($recurseid) &&                      if (($recurseid) &&
                         (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) {                          (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) {
                         my $idresult =                           my $idresult = 
Line 3253  sub display_userinfo { Line 3361  sub display_userinfo {
          'unofficial'     => 'Can Request Unofficial Courses',           'unofficial'     => 'Can Request Unofficial Courses',
          'community'      => 'Can Request Communities',           'community'      => 'Can Request Communities',
          'textbook'       => 'Can Request Textbook Courses',           'textbook'       => 'Can Request Textbook Courses',
            'placement'      => 'Can Request Placement Tests',
          'requestauthor'  => 'Can Request Author Role',           'requestauthor'  => 'Can Request Author Role',
            'adhocroles'     => 'Ad Hoc Roles Selectable via Helpdesk Role',
          'inststatus'     => "Affiliation",           'inststatus'     => "Affiliation",
          'prvs'           => 'Previous Value:',           'prvs'           => 'Previous Value:',
          'chto'           => 'Changed To:'           'chto'           => 'Changed To:'
Line 3619  sub tool_changes { Line 3729  sub tool_changes {
     return;      return;
 }  }
   
   sub adhocrole_changes {
       my ($changehashref,$userenv) = @_;
       my @adds = &Apache::loncommon::get_env_multiple('form.adhocroleadd');
       my @dels = &Apache::loncommon::get_env_multiple('form.adhocroledel');
       my (@saved,@added,@alladhoc,$changed);
       my $adhoc_key = 'adhocroles.'.$env{'request.role.domain'};
       if (!$env{'form.makeuser'}) {
           if (ref($userenv) eq 'HASH') {
               my @current;
               if ($userenv->{$adhoc_key}) {
                   @current = split(/,/,$userenv->{$adhoc_key});
                   if (@dels) {
                       foreach my $curr (@current) {
                           next if ($curr eq ''); 
                           unless (grep(/\Q$curr\E$/,@dels)) {
                               push(@saved,$curr);
                           }
                       }
                       $changed = 1;
                   } else {
                       @saved = @current;
                   }
               }
           }
       }
       if (@adds) {
           my $confname = &Apache::lonnet::get_domainconfiguser($env{'request.role.domain'});
           my %existing=&Apache::lonnet::dump('roles',$env{'request.role.domain'},
                                              $confname,'rolesdef_');
           foreach my $poss (@adds) {
               if (exists($existing{'rolesdef_'.$poss})) {
                   push(@added,$poss);
                   $changed = 1;
               }
           }
       }
       if (@added) {
           if (@saved) {
               foreach my $add (@added) {
                   unless (grep(/^\Q$add\E$/,@saved)) {
                       push(@alladhoc,$add);
                   }
               }
           } else {
               push(@alladhoc,@added);
           }
       }
       if (@saved) {
           push(@alladhoc,@saved);
       }
       if (@alladhoc) {
           my $adhocstr = join(',',sort(@alladhoc)); 
           $changehashref->{$adhoc_key} = $adhocstr;
       } elsif (@dels) {
           &Apache::lonnet::del('environment',[$adhoc_key],$env{'form.ccdomain'},$env{'form.ccuname'});
           delete($changehashref->{$adhoc_key});
           if (($env{'form.ccdomain'} eq $env{'user.domain'}) &&
               ($env{'form.ccuname'} eq $env{'user.name'})) {
               &Apache::lonnet::delenv($adhoc_key);
           }
       }
       return $changed;
   }
   
 sub update_roles {  sub update_roles {
     my ($r,$context,$showcredits) = @_;      my ($r,$context,$showcredits) = @_;
     my $now=time;      my $now=time;
     my @rolechanges;      my @rolechanges;
     my %disallowed;      my %disallowed;
     $r->print('<h3>'.&mt('Modifying Roles').'</h3>');      $r->print('<h3>'.&mt('Modifying Roles').'</h3>');
     foreach my $key (keys (%env)) {      foreach my $key (keys(%env)) {
  next if (! $env{$key});   next if (! $env{$key});
         next if ($key eq 'form.action');          next if ($key eq 'form.action');
  # Revoke roles   # Revoke roles
Line 3807  sub update_roles { Line 3981  sub update_roles {
                 } else {                  } else {
     my %curr_groups =      my %curr_groups =
  &Apache::longroup::coursegroups($one,$two);   &Apache::longroup::coursegroups($one,$two);
                     foreach my $sec (sort {$a cmp $b} keys %sections) {                      foreach my $sec (sort {$a cmp $b} keys(%sections)) {
                         if (($sec eq 'none') || ($sec eq 'all') ||                           if (($sec eq 'none') || ($sec eq 'all') || 
                             exists($curr_groups{$sec})) {                              exists($curr_groups{$sec})) {
                             $disallowed{$sec} = $url;                              $disallowed{$sec} = $url;
Line 3853  sub update_roles { Line 4027  sub update_roles {
                     my %curr_groups =                       my %curr_groups = 
  &Apache::longroup::coursegroups($one,$two);   &Apache::longroup::coursegroups($one,$two);
                     my $emptysec = 0;                      my $emptysec = 0;
                     foreach my $sec (sort {$a cmp $b} keys %sections) {                      foreach my $sec (sort {$a cmp $b} keys(%sections)) {
                         $sec =~ s/\W//g;                          $sec =~ s/\W//g;
                         if ($sec ne '') {                          if ($sec ne '') {
                             if (($sec eq 'none') || ($sec eq 'all') ||                               if (($sec eq 'none') || ($sec eq 'all') || 
Line 3893  sub update_roles { Line 4067  sub update_roles {
                     $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context));                      $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context));
                 } else {                  } else {
                     my $emptysec = 0;                      my $emptysec = 0;
                     foreach my $sec (sort {$a cmp $b} keys %sections) {                      foreach my $sec (sort {$a cmp $b} keys(%sections)) {
                         if ($sec ne '') {                          if ($sec ne '') {
                             my $securl = $url.'/'.$sec;                              my $securl = $url.'/'.$sec;
                             $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$two,$start,$end,$one,undef,$sec,$context));                              $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$two,$start,$end,$one,undef,$sec,$context));
Line 4149  sub build_roles { Line 4323  sub build_roles {
 # ========================================================== Custom Role Editor  # ========================================================== Custom Role Editor
   
 sub custom_role_editor {  sub custom_role_editor {
     my ($r,$brcrum) = @_;      my ($r,$brcrum,$prefix) = @_;
     my $action = $env{'form.customroleaction'};      my $action = $env{'form.customroleaction'};
     my $rolename;       my $rolename; 
     if ($action eq 'new') {      if ($action eq 'new') {
Line 4164  sub custom_role_editor { Line 4338  sub custom_role_editor {
         $context = 'course';          $context = 'course';
     } else {      } else {
         $context = 'domain';          $context = 'domain';
         $crstype = $env{'form.templatecrstype'};          $crstype = 'course';
     }      }
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
Line 4173  sub custom_role_editor { Line 4347  sub custom_role_editor {
         return;          return;
     }      }
   
 # ------------------------------------------------------- What can be assigned?      my $formname = 'form1';
     my %full=();      my %privs=();
     my %courselevel=();      my $body_top = '<h2>';
     my %courselevelcurrent=();  # ------------------------------------------------------- Does this role exist?
     my $syspriv='';  
     my $dompriv='';  
     my $coursepriv='';  
     my $body_top;  
     my $newrole;  
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
 # ------------------------------------------------------- Does this role exist?  
     $body_top .= '<h2>';  
     if (($rdummy ne 'con_lost') && ($roledef ne '')) {      if (($rdummy ne 'con_lost') && ($roledef ne '')) {
  $body_top .= &mt('Existing Role').' "';          $body_top .= &mt('Existing Role').' "';
 # ------------------------------------------------- Get current role privileges  # ------------------------------------------------- Get current role privileges
  ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);          ($privs{'system'},$privs{'domain'},$privs{'course'})=split(/\_/,$roledef);
         if ($crstype eq 'Community') {          if ($privs{'system'} =~ /bre\&S/) {
             $syspriv =~ s/bre\&S//;                 if ($context eq 'domain') {
                   $crstype = 'Course'; 
               } elsif ($crstype eq 'Community') {
                   $privs{'system'} =~ s/bre\&S//;
               }
           } elsif ($context eq 'domain') {
               $crstype = 'Course';
         }          }
     } else {      } else {
         $newrole = 1;          $body_top .= &mt('New Role').' "';
  $body_top .= &mt('New Role').' "';          $roledef='';
  $roledef='';  
     }      }
     $body_top .= $rolename.'"</h2>';      $body_top .= $rolename.'"</h2>';
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {  
  my ($priv,$restrict)=split(/\&/,$item);  # ------------------------------------------------------- What can be assigned?
         if (!$restrict) { $restrict='F'; }      my %full=();
         $courselevel{$priv}=$restrict;      my %levels=( 
         if ($coursepriv=~/\:$priv/) {                   course => {},
     $courselevelcurrent{$priv}=1;                   domain => {},
  }                   system => {},
  $full{$priv}=1;                 );
     }      my %levelscurrent=(
     my %domainlevel=();                          course => {},
     my %domainlevelcurrent=();                          domain => {},
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {                          system => {},
  my ($priv,$restrict)=split(/\&/,$item);                        );
         if (!$restrict) { $restrict='F'; }      &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent);
         $domainlevel{$priv}=$restrict;  
         if ($dompriv=~/\:$priv/) {  
     $domainlevelcurrent{$priv}=1;  
  }  
  $full{$priv}=1;  
     }  
     my %systemlevel=();  
     my %systemlevelcurrent=();  
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {  
  my ($priv,$restrict)=split(/\&/,$item);  
         if (!$restrict) { $restrict='F'; }  
         $systemlevel{$priv}=$restrict;  
         if ($syspriv=~/\:$priv/) {  
     $systemlevelcurrent{$priv}=1;  
  }  
  $full{$priv}=1;  
     }  
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
     my $button_code = "\n";      my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype);
     my $head_script = "\n";      my $head_script = 
     $head_script .= '<script type="text/javascript">'."\n"          &Apache::lonuserutils::custom_roledefs_js($context,$crstype,$formname,
                    .'// <![CDATA['."\n";                                                    \%full,\@templateroles,$jsback);
     my @template_roles = ("in","ta","ep");  
     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) {  
         $head_script .= &make_script_template($role,$crstype);  
         $button_code .= &make_button_code($role,$crstype).' ';  
     }  
     my $context_code;  
     if ($context eq 'domain') {  
         my $checkedCommunity = '';  
         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";  
     push (@{$brcrum},      push (@{$brcrum},
               {href => "javascript:backPage(document.form1,'pickrole','')",                {href => "javascript:backPage(document.$formname,'pickrole','')",
                text => "Pick custom role",                 text => "Pick custom role",
                faq  => 282,bug=>'Instructor Interface',},                 faq  => 282,bug=>'Instructor Interface',},
               {href => "javascript:backPage(document.form1,'','')",                {href => "javascript:backPage(document.$formname,'','')",
                text => "Edit custom role",                 text => "Edit custom role",
                faq  => 282,                 faq  => 282,
                bug  => 'Instructor Interface',                 bug  => 'Instructor Interface',
Line 4298  sub custom_role_editor { Line 4406  sub custom_role_editor {
     $r->print(&Apache::loncommon::start_page('Custom Role Editor',      $r->print(&Apache::loncommon::start_page('Custom Role Editor',
                                              $head_script,$args).                                               $head_script,$args).
               $body_top);                $body_top);
     my %lt=&Apache::lonlocal::texthash(      $r->print('<form name="'.$formname.'" method="post" action="">'."\n".
     'prv'  => "Privilege",                &Apache::lonuserutils::custom_role_header($context,$crstype,
     'crl'  => "Course Level",                                                          \@templateroles,$prefix));
                     'dml'  => "Domain Level",  
                     'ssl'  => "System Level");  
   
     $r->print('<div class="LC_left_float">'  
              .'<form action=""><fieldset>'  
              .'<legend>'.&mt('Select a Template').'</legend>'  
              .$button_code  
              .'</fieldset></form></div>');  
     if ($context_code) {  
         $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" action="">  
 <input type="hidden" name="phase" value="set_custom_roles" />  <input type="hidden" name="phase" value="set_custom_roles" />
 <input type="hidden" name="rolename" value="$rolename" />  <input type="hidden" name="rolename" value="$rolename" />
 ENDCCF  ENDCCF
     $r->print(&Apache::loncommon::start_data_table().      $r->print(&Apache::lonuserutils::custom_role_table($crstype,\%full,\%levels,
               &Apache::loncommon::start_data_table_header_row().                                                          \%levelscurrent,$prefix));
 '<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}.  
 '</th><th>'.$lt{'ssl'}.'</th>'.  
               &Apache::loncommon::end_data_table_header_row());  
     foreach my $priv (sort(keys(%full))) {  
         my $privtext = &Apache::lonnet::plaintext($priv,$crstype);  
         $r->print(&Apache::loncommon::start_data_table_row().  
           '<td>'.$privtext.'</td><td>'.  
     ($courselevel{$priv}?'<input type="checkbox" name="'.$priv.'_c"'.  
     ($courselevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').  
     '</td><td>'.  
     ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d"'.  
     ($domainlevelcurrent{$priv}?' checked="checked"':'').' />':'&nbsp;').  
     '</td><td>');  
         if ($priv eq 'bre' && $crstype eq 'Community') {  
             $r->print('&nbsp;');    
         } else {  
             $r->print($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s"'.  
                       ($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'}.'" />'.
    '<input type="hidden" name="startrolename" value="'.$env{'form.rolename'}.     '<input type="hidden" name="startrolename" value="'.$env{'form.rolename'}.
Line 4356  ENDCCF Line 4423  ENDCCF
    '<input type="reset" value="'.&mt("Reset").'" />'."\n".     '<input type="reset" value="'.&mt("Reset").'" />'."\n".
    '<input type="submit" value="'.&mt('Save').'" /></form>');     '<input type="submit" value="'.&mt('Save').'" /></form>');
 }  }
 # --------------------------------------------------------  
 sub make_script_template {  
     my ($role,$crstype) = @_;  
     my %full_c=();  
     my %full_d=();  
     my %full_s=();  
     my $return_script;  
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {  
         my ($priv,$restrict)=split(/\&/,$item);  
         $full_c{$priv}=1;  
     }  
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {  
         my ($priv,$restrict)=split(/\&/,$item);  
         $full_d{$priv}=1;  
     }  
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {  
         next if (($crstype eq 'Community') && ($item eq 'bre&S'));  
         my ($priv,$restrict)=split(/\&/,$item);  
         $full_s{$priv}=1;  
     }  
     $return_script .= 'function set_'.$role.'() {'."\n";  
     my @temp = split(/:/,$Apache::lonnet::pr{$role.':c'});  
     my %role_c;  
     foreach my $priv (@temp) {  
         my ($priv_item, $dummy) = split(/\&/,$priv);  
         $role_c{$priv_item} = 1;  
     }  
     my %role_d;  
     @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});  
     foreach my $priv(@temp) {  
         my ($priv_item, $dummy) = split(/\&/,$priv);  
         $role_d{$priv_item} = 1;  
     }  
     my %role_s;  
     @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});  
     foreach my $priv(@temp) {  
         my ($priv_item, $dummy) = split(/\&/,$priv);  
         $role_s{$priv_item} = 1;  
     }  
     foreach my $priv_item (keys(%full_c)) {  
         my ($priv, $dummy) = split(/\&/,$priv_item);  
         if ((exists($role_c{$priv})) || (exists($role_d{$priv})) ||   
             (exists($role_s{$priv}))) {  
             $return_script .= "document.form1.$priv"."_c.checked = true;\n";  
         } else {  
             $return_script .= "document.form1.$priv"."_c.checked = false;\n";  
         }  
     }  
     foreach my $priv_item (keys(%full_d)) {  
         my ($priv, $dummy) = split(/\&/,$priv_item);  
         if ((exists($role_d{$priv})) || (exists($role_s{$priv}))) {  
             $return_script .= "document.form1.$priv"."_d.checked = true;\n";  
         } else {  
             $return_script .= "document.form1.$priv"."_d.checked = false;\n";  
         }  
     }  
     foreach my $priv_item (keys(%full_s)) {  
         my ($priv, $dummy) = split(/\&/,$priv_item);  
         if (exists($role_s{$priv})) {  
             $return_script .= "document.form1.$priv"."_s.checked = true;\n";  
         } else {  
             $return_script .= "document.form1.$priv"."_s.checked = false;\n";  
         }  
     }  
     $return_script .= '}'."\n";  
     return ($return_script);  
 }  
 # ----------------------------------------------------------  
 sub make_button_code {  
     my ($role,$crstype) = @_;  
     my $label = &Apache::lonnet::plaintext($role,$crstype);  
     my $button_code = '<input type="button" onclick="set_'.$role.'()" value="'.$label.'" />';  
     return ($button_code);  
 }  
 # ---------------------------------------------------------- Call to definerole  # ---------------------------------------------------------- Call to definerole
 sub set_custom_role {  sub set_custom_role {
     my ($r,$context,$brcrum) = @_;      my ($r,$context,$brcrum,$prefix) = @_;
     my $rolename=$env{'form.rolename'};      my $rolename=$env{'form.rolename'};
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
     if (!$rolename) {      if (!$rolename) {
  &custom_role_editor($r,$brcrum);   &custom_role_editor($r,$brcrum,$prefix);
         return;          return;
     }      }
     my ($jsback,$elements) = &crumb_utilities();      my ($jsback,$elements) = &crumb_utilities();
Line 4461  sub set_custom_role { Line 4455  sub set_custom_role {
          help => 'Course_Editing_Custom_Roles'},           help => 'Course_Editing_Custom_Roles'},
         );          );
     my $args = { bread_crumbs           => $brcrum,      my $args = { bread_crumbs           => $brcrum,
                  bread_crumbs_component => 'User Management'};                    bread_crumbs_component => 'User Management'};
     $r->print(&Apache::loncommon::start_page('Save Custom Role',$jscript,$args));      $r->print(&Apache::loncommon::start_page('Save Custom Role',$jscript,$args));
   
     my $newrole;      my $newrole;
Line 4478  sub set_custom_role { Line 4472  sub set_custom_role {
         $newrole = 1;          $newrole = 1;
     }      }
     $r->print($rolename.'"</h3>');      $r->print($rolename.'"</h3>');
 # ------------------------------------------------------- What can be assigned?  # ------------------------------------------------- Assign role and show result
     my $sysrole='';  
     my $domrole='';  
     my $courole='';  
   
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {  
  my ($priv,$restrict)=split(/\&/,$item);  
         if (!$restrict) { $restrict=''; }  
         if ($env{'form.'.$priv.'_c'}) {  
     $courole.=':'.$item;  
  }  
     }  
   
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {  
  my ($priv,$restrict)=split(/\&/,$item);  
         if (!$restrict) { $restrict=''; }  
         if ($env{'form.'.$priv.'_d'}) {  
     $domrole.=':'.$item;  
  }  
     }  
   
     foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {  
  my ($priv,$restrict)=split(/\&/,$item);  
         if (!$restrict) { $restrict=''; }  
         if ($env{'form.'.$priv.'_s'}) {  
     $sysrole.=':'.$item;  
  }  
     }  
     # Assign role; Compile and show result  
     my $errmsg;      my $errmsg;
     my $result =      my %newprivs = &Apache::lonuserutils::custom_role_update($rolename,$prefix);
         &Apache::lonnet::definerole($rolename,$sysrole,$domrole,$courole);      # Assign role and return result
       my $result = &Apache::lonnet::definerole($rolename,$newprivs{'s'},$newprivs{'d'},
                                                $newprivs{'c'});
     if ($result ne 'ok') {      if ($result ne 'ok') {
         $errmsg = ': '.$result;          $errmsg = ': '.$result;
     }      }
Line 4716  sub handler { Line 4685  sub handler {
                                        $brcrum);                                         $brcrum);
         }          }
     } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {      } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {
           my $prefix;
         if ($env{'form.phase'} eq 'set_custom_roles') {          if ($env{'form.phase'} eq 'set_custom_roles') {
             &set_custom_role($r,$context,$brcrum);              &set_custom_role($r,$context,$brcrum,$prefix);
         } else {          } else {
             &custom_role_editor($r,$brcrum);              &custom_role_editor($r,$brcrum,$prefix);
         }          }
     } elsif (($env{'form.action'} eq 'processauthorreq') &&      } elsif (($env{'form.action'} eq 'processauthorreq') &&
              ($permission->{'cusr'}) &&                ($permission->{'cusr'}) && 
Line 5400  sub print_main_menu { Line 5370  sub print_main_menu {
                                           groups => 'Community Groups',                                            groups => 'Community Groups',
                                         },                                          },
                        );                         );
           $linktext{'Placement'} = $linktext{'Course'};
   
         my %linktitle = (          my %linktitle = (
             'Course' => {              'Course' => {
Line 5414  sub print_main_menu { Line 5385  sub print_main_menu {
                            },                             },
         );          );
   
           $linktitle{'Placement'} = $linktitle{'Course'};
   
         push(@{ $menu[0]->{items} }, #Category: Single Users          push(@{ $menu[0]->{items} }, #Category: Single Users
             {                 {   
              linktext => $linktext{$crstype}{'single'},               linktext => $linktext{$crstype}{'single'},
Line 5544  sub print_selfenroll_menu { Line 5517  sub print_selfenroll_menu {
         butn => 'but no user types have been checked.',          butn => 'but no user types have been checked.',
         wilf => "Please uncheck 'activate' or check at least one type.",          wilf => "Please uncheck 'activate' or check at least one type.",
     );      );
       &js_escape(\%alerts);
     my $selfenroll_js = <<"ENDSCRIPT";      my $selfenroll_js = <<"ENDSCRIPT";
 function update_types(caller,num) {  function update_types(caller,num) {
     var delidx = getIndexByName('selfenroll_delete');      var delidx = getIndexByName('selfenroll_delete');
Line 5745  ENDSCRIPT Line 5719  ENDSCRIPT
         $cathash = $domconfig{'coursecategories'}{'cats'};          $cathash = $domconfig{'coursecategories'}{'cats'};
         $cattype{'auth'} = $domconfig{'coursecategories'}{'auth'};          $cattype{'auth'} = $domconfig{'coursecategories'}{'auth'};
         $cattype{'unauth'} = $domconfig{'coursecategories'}{'unauth'};          $cattype{'unauth'} = $domconfig{'coursecategories'}{'unauth'};
           if ($cattype{'auth'} eq '') {
               $cattype{'auth'} = 'std';
           }
           if ($cattype{'unauth'} eq '') {
               $cattype{'unauth'} = 'std';
           }
     } else {      } else {
         $cathash = {};          $cathash = {};
         $cattype{'auth'} = 'std';          $cattype{'auth'} = 'std';
Line 6816  sub user_search_result { Line 6796  sub user_search_result {
         }          }
     }      }
     if ($response ne '') {      if ($response ne '') {
         $response = '<span class="LC_warning">'.$response.'</span>';          $response = '<span class="LC_warning">'.$response.'</span><br />';
     }      }
     if ($srch->{'srchin'} eq 'instd') {      if ($srch->{'srchin'} eq 'instd') {
         my $instd_chk = &directorysrch_check($srch);          my $instd_chk = &instdirectorysrch_check($srch);
         if ($instd_chk ne 'ok') {          if ($instd_chk ne 'ok') {
             $response = '<span class="LC_warning">'.$instd_chk.'</span>'.              my $domd_chk = &domdirectorysrch_check($srch);
                         '<br />'.&mt('You may want to search in the LON-CAPA domain instead of the institutional directory.').'<br /><br />';              $response .= '<span class="LC_warning">'.$instd_chk.'</span><br />';
               if ($domd_chk eq 'ok') {
                   $response .= &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.');
               }
               $response .= '<br /><br />';
           }
       } else {
           unless (($context eq 'requestcrs') && ($srch->{'srchtype'} eq 'exact')) { 
               my $domd_chk = &domdirectorysrch_check($srch);
               if ($domd_chk ne 'ok') {
                   my $instd_chk = &instdirectorysrch_check($srch);
                   $response .= '<span class="LC_warning">'.$domd_chk.'</span><br />';
                   if ($instd_chk eq 'ok') {
                       $response .= &mt('You may want to search in the institutional directory instead of the LON-CAPA domain.');
                   }
                   $response .= '<br /><br />';
               }
         }          }
     }      }
     if ($response ne '') {      if ($response ne '') {
Line 6986  sub user_search_result { Line 6982  sub user_search_result {
                 ($currstate,$response,$forcenewuser) =                   ($currstate,$response,$forcenewuser) = 
                     &build_search_response($context,$srch,%srch_results);                      &build_search_response($context,$srch,%srch_results);
             } else {              } else {
                 my $showdom = &display_domain_info($srch->{'srchdomain'});                $response = '<span class="LC_warning">'.                  my $showdom = &display_domain_info($srch->{'srchdomain'});
                   $response = '<span class="LC_warning">'.
                     &mt('Institutional directory search is not available in domain: [_1]',$showdom).                      &mt('Institutional directory search is not available in domain: [_1]',$showdom).
                     '</span><br />'.                      '</span><br />'.
                     &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.').                      &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.').
Line 6997  sub user_search_result { Line 6994  sub user_search_result {
     return ($currstate,$response,$forcenewuser,\%srch_results);      return ($currstate,$response,$forcenewuser,\%srch_results);
 }  }
   
 sub directorysrch_check {  sub domdirectorysrch_check {
       my ($srch) = @_;
       my $response;
       my %dom_inst_srch = &Apache::lonnet::get_dom('configuration',
                                                ['directorysrch'],$srch->{'srchdomain'});
       my $showdom = &display_domain_info($srch->{'srchdomain'});
       if (ref($dom_inst_srch{'directorysrch'}) eq 'HASH') {
           if ($dom_inst_srch{'directorysrch'}{'lcavailable'} eq '0') {
               return &mt('LON-CAPA directory search is not available in domain: [_1]',$showdom);
           }
           if ($dom_inst_srch{'directorysrch'}{'lclocalonly'}) {
               if ($env{'request.role.domain'} ne $srch->{'srchdomain'}) {
                   return &mt('LON-CAPA directory search in domain: [_1] is only allowed for users with a current role in the domain.',$showdom);
               }
           }
       }
       return 'ok';
   }
   
   sub instdirectorysrch_check {
     my ($srch) = @_;      my ($srch) = @_;
     my $can_search = 0;      my $can_search = 0;
     my $response;      my $response;
Line 7451  sub course_level_dc { Line 7467  sub course_level_dc {
         my $plrole=&Apache::lonnet::plaintext($role);          my $plrole=&Apache::lonnet::plaintext($role);
         $otheritems .= '  <option value="'.$role.'">'.$plrole.'</option>';          $otheritems .= '  <option value="'.$role.'">'.$plrole.'</option>';
     }      }
     if ( keys %customroles > 0) {      if ( keys(%customroles) > 0) {
         foreach my $cust (sort keys %customroles) {          foreach my $cust (sort(keys(%customroles))) {
             my $custrole='cr_cr_'.$env{'user.domain'}.              my $custrole='cr_cr_'.$env{'user.domain'}.
                     '_'.$env{'user.name'}.'_'.$cust;                      '_'.$env{'user.name'}.'_'.$cust;
             $otheritems .= '  <option value="'.$custrole.'">'.$cust.'</option>';              $otheritems .= '  <option value="'.$custrole.'">'.$cust.'</option>';

Removed from v.1.403  
changed lines
  Added in v.1.414


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