Diff for /loncom/interface/lonuserutils.pm between versions 1.97.2.25 and 1.98

version 1.97.2.25, 2010/11/15 18:50:37 version 1.98, 2009/08/28 22:47:07
Line 47  sub modifystudent { Line 47  sub modifystudent {
     # this one.  If $csec is defined, drop them from all other sections of      # this one.  If $csec is defined, drop them from all other sections of
     # this course and add them to section $csec      # this course and add them to section $csec
     my ($cnum,$cdom) = &get_course_identity($courseid);      my ($cnum,$cdom) = &get_course_identity($courseid);
     my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1});      my %roles = &Apache::lonnet::dump('roles',$udom,$unam);
     my %roles = &Apache::lonnet::dump('roles',$udom,$unam,'.',undef,$extra);  
     my ($tmp) = keys(%roles);      my ($tmp) = keys(%roles);
     # Bail out if we were unable to get the students roles      # Bail out if we were unable to get the students roles
     return "$1" if ($tmp =~ /^(con_lost|error|no_such_host)/i);      return "$1" if ($tmp =~ /^(con_lost|error|no_such_host)/i);
Line 92  sub modifyuserrole { Line 91  sub modifyuserrole {
     if ($setting eq 'course' || $context eq 'course') {      if ($setting eq 'course' || $context eq 'course') {
         $scope = '/'.$cid;          $scope = '/'.$cid;
         $scope =~ s/\_/\//g;          $scope =~ s/\_/\//g;
         if (($role ne 'cc') && ($role ne 'co') && ($sec ne '')) {          if ($role ne 'cc' && $sec ne '') {
             $scope .='/'.$sec;              $scope .='/'.$sec;
         }          }
     } elsif ($context eq 'domain') {      } elsif ($context eq 'domain') {
Line 236  sub domain_roles_select { Line 235  sub domain_roles_select {
     # domain context         # domain context   
     #      #
     # Role types      # Role types
     my @roletypes = ('domain','author','course','community');      my @roletypes = ('domain','author','course');
     my %lt = &role_type_names();      my %lt = &role_type_names();
     #      #
     # build up the menu information to be passed to      # build up the menu information to be passed to
Line 248  sub domain_roles_select { Line 247  sub domain_roles_select {
     foreach my $roletype (@roletypes) {      foreach my $roletype (@roletypes) {
         # set up the text for this domain          # set up the text for this domain
         $select_menus{$roletype}->{'text'}= $lt{$roletype};          $select_menus{$roletype}->{'text'}= $lt{$roletype};
         my $crstype;  
         if ($roletype eq 'community') {  
             $crstype = 'Community';  
         }  
         # we want a choice of 'default' as the default in the second menu          # we want a choice of 'default' as the default in the second menu
         if ($env{'form.roletype'} ne '') {          if ($env{'form.roletype'} ne '') {
             $select_menus{$roletype}->{'default'} = $env{'form.showrole'};              $select_menus{$roletype}->{'default'} = $env{'form.showrole'};
Line 266  sub domain_roles_select { Line 261  sub domain_roles_select {
             @roles = &construction_space_roles();              @roles = &construction_space_roles();
         } else {          } else {
             my $custom = 1;              my $custom = 1;
             @roles = &course_roles('domain',undef,$custom,$roletype);              @roles = &course_roles('domain',undef,$custom);
         }          }
         my $order = ['Any',@roles];          my $order = ['Any',@roles];
         $select_menus{$roletype}->{'order'} = $order;           $select_menus{$roletype}->{'order'} = $order; 
Line 276  sub domain_roles_select { Line 271  sub domain_roles_select {
                               &mt('Custom role');                                &mt('Custom role');
             } else {              } else {
                 $select_menus{$roletype}->{'select2'}->{$role} =                   $select_menus{$roletype}->{'select2'}->{$role} = 
                               &Apache::lonnet::plaintext($role,$crstype);                                &Apache::lonnet::plaintext($role);
             }              }
         }          }
         $select_menus{$roletype}->{'select2'}->{'Any'} = &mt('Any');          $select_menus{$roletype}->{'select2'}->{'Any'} = &mt('Any');
     }      }
     my $result = &Apache::loncommon::linked_select_forms      my $result = &Apache::loncommon::linked_select_forms
         ('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'},          ('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'},
          'roletype','showrole',\%select_menus,           'roletype','showrole',\%select_menus,['domain','author','course']);
          ['domain','author','course','community']);  
     return $result;      return $result;
 }  }
   
Line 296  sub hidden_input { Line 290  sub hidden_input {
 }  }
   
 sub print_upload_manager_header {  sub print_upload_manager_header {
     my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission,$crstype,      my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission)=@_;
         $can_assign)=@_;  
     my $javascript;      my $javascript;
     #      #
     if (! exists($env{'form.upfile_associate'})) {      if (! exists($env{'form.upfile_associate'})) {
Line 311  sub print_upload_manager_header { Line 304  sub print_upload_manager_header {
         }          }
     }      }
     if ($env{'form.upfile_associate'} eq 'reverse') {      if ($env{'form.upfile_associate'} eq 'reverse') {
         $javascript=&upload_manager_javascript_reverse_associate($can_assign);          $javascript=&upload_manager_javascript_reverse_associate();
     } else {      } else {
         $javascript=&upload_manager_javascript_forward_associate($can_assign);          $javascript=&upload_manager_javascript_forward_associate();
     }      }
     #      #
     # Deal with restored settings      # Deal with restored settings
Line 334  sub print_upload_manager_header { Line 327  sub print_upload_manager_header {
     my $javascript_validations =      my $javascript_validations =
         &javascript_validations('upload',$krbdefdom,$password_choice,undef,          &javascript_validations('upload',$krbdefdom,$password_choice,undef,
                                 $env{'request.role.domain'},$context,                                  $env{'request.role.domain'},$context,
                                 $groupslist,$crstype);                                  $groupslist);
     my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');      my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
     $r->print('<p>'      $r->print('<p>'
              .&mt('Total number of records found in file: [_1]'               .&mt('Total number of records found in file: [_1]'
Line 367  sub print_upload_manager_header { Line 360  sub print_upload_manager_header {
 ###############################################################  ###############################################################
 sub javascript_validations {  sub javascript_validations {
     my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain,      my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain,
         $context,$groupslist,$crstype)=@_;          $context,$groupslist)=@_;
     my %param = (      my %param = (
                   kerb_def_dom => $krbdefdom,                    kerb_def_dom => $krbdefdom,
                   curr_authtype => $curr_authtype,                    curr_authtype => $curr_authtype,
Line 388  sub javascript_validations { Line 381  sub javascript_validations {
         if (($context eq 'course') || ($context eq 'domain')) {          if (($context eq 'course') || ($context eq 'domain')) {
             if ($context eq 'course') {              if ($context eq 'course') {
                 if ($env{'request.course.sec'} eq '') {                  if ($env{'request.course.sec'} eq '') {
                     $setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');';                      $setsection_call = 'setSections(document.'.$param{'formname'}.');';
                     $setsections_js =                      $setsections_js =
                         &setsections_javascript($param{'formname'},$groupslist,                          &setsections_javascript($param{'formname'},$groupslist,
                                                 $mode,'',$crstype);                                                  $mode);
                 } else {                  } else {
                     $setsection_call = "'ok'";                      $setsection_call = "'ok'";
                 }                  }
Line 534  END Line 527  END
         if (message!='') {          if (message!='') {
             message+='\\n';              message+='\\n';
         }          }
         message+='$alert{'section'}';  
     }      }
     if (foundemail==0) {      if (foundemail==0) {
         if (message!='') {          if (message!='') {
Line 588  END Line 580  END
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub upload_manager_javascript_forward_associate {  sub upload_manager_javascript_forward_associate {
     my ($can_assign) = @_;  
     my ($auth_update,$numbuttons,$argreset);  
     if (ref($can_assign) eq 'HASH') {  
         if ($can_assign->{'krb4'} || $can_assign->{'krb5'}) {  
             $argreset .= "      vf.krbarg.value='';\n";  
             $numbuttons ++ ;  
         }  
         if ($can_assign->{'int'}) {  
             $argreset .= "      vf.intarg.value='';\n";  
             $numbuttons ++;  
         }  
         if ($can_assign->{'loc'}) {  
             $argreset .= "      vf.locarg.value='';\n";  
             $numbuttons ++;  
         }  
         if (!$can_assign->{'int'}) {  
             my $warning = &mt('You may not specify an initial password for each user, as this is only available when new users use LON-CAPA internal authentication.\n').  
                           &mt('Your current role does not have rights to create users with that authentication type.');  
             $auth_update = <<"END";  
    // Currently the initial password field is only supported for internal auth  
    // (see bug 6368).  
    if (nw==9) {  
        eval('vf.f'+tf+'.selectedIndex=0;')  
        alert('$warning');  
    }  
 END  
         } elsif ($numbuttons > 1) {  
             $auth_update = <<"END";  
    // If we set the password, make the password form below correspond to  
    // the new value.  
    if (nw==9) {  
       changed_radio('int',document.studentform);  
       set_auth_radio_buttons('int',document.studentform);  
 $argreset  
    }  
   
 END  
         }  
     }  
   
     return(<<ENDPICK);      return(<<ENDPICK);
 function verify(vf,sec_caller) {  function verify(vf,sec_caller) {
     var founduname=0;      var founduname=0;
Line 704  function flip(vf,tf) { Line 656  function flip(vf,tf) {
          }           }
       }        }
    }     }
    $auth_update     // If we set the password, make the password form below correspond to
      // the new value.
      if (nw==9) {
          changed_radio('int',document.studentform);
          set_auth_radio_buttons('int',document.studentform);
          vf.intarg.value='';
          vf.krbarg.value='';
          vf.locarg.value='';
      }
 }  }
   
 function clearpwd(vf) {  function clearpwd(vf) {
Line 722  ENDPICK Line 682  ENDPICK
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub upload_manager_javascript_reverse_associate {  sub upload_manager_javascript_reverse_associate {
     my ($can_assign) = @_;  
     my ($auth_update,$numbuttons,$argreset);  
     if (ref($can_assign) eq 'HASH') {  
         if ($can_assign->{'krb4'} || $can_assign->{'krb5'}) {  
             $argreset .= "      vf.krbarg.value='';\n";  
             $numbuttons ++ ;  
         }  
         if ($can_assign->{'int'}) {  
             $argreset .= "      vf.intarg.value='';\n";  
             $numbuttons ++;  
         }  
         if ($can_assign->{'loc'}) {  
             $argreset .= "      vf.locarg.value='';\n";  
             $numbuttons ++;  
         }  
         if (!$can_assign->{'int'}) {  
             my $warning = &mt('You may not specify an initial password, as this is only available when new users use LON-CAPA internal authentication.\n').  
                           &mt('Your current role does not have rights to create users with that authentication type.');  
             $auth_update = <<"END";  
    // Currently the initial password field is only supported for internal auth  
    // (see bug 6368).  
    if (tf==8 && nw!=0) {  
        eval('vf.f'+tf+'.selectedIndex=0;')  
        alert('$warning');  
    }  
 END  
         } elsif ($numbuttons > 1) {  
             $auth_update = <<"END";  
    // initial password specified, pick internal authentication  
    if (tf==8 && nw!=0) {  
       changed_radio('int',document.studentform);  
       set_auth_radio_buttons('int',document.studentform);  
 $argreset  
    }  
   
 END  
         }  
     }  
   
     return(<<ENDPICK);      return(<<ENDPICK);
 function verify(vf,sec_caller) {  function verify(vf,sec_caller) {
     var founduname=0;      var founduname=0;
Line 768  function verify(vf,sec_caller) { Line 689  function verify(vf,sec_caller) {
     var foundname=0;      var foundname=0;
     var foundid=0;      var foundid=0;
     var foundsec=0;      var foundsec=0;
     var foundemail=0;  
     var foundrole=0;      var foundrole=0;
     var founddomain=0;      var founddomain=0;
     var foundinststatus=0;      var foundinststatus=0;
Line 780  function verify(vf,sec_caller) { Line 700  function verify(vf,sec_caller) {
         if (i==6 && tw!=0) { foundid=1; }          if (i==6 && tw!=0) { foundid=1; }
         if (i==7 && tw!=0) { foundsec=1; }          if (i==7 && tw!=0) { foundsec=1; }
         if (i==8 && tw!=0) { foundpwd=1; }          if (i==8 && tw!=0) { foundpwd=1; }
         if (i==9 && tw!=0) { foundemail=1; }          if (i==9 && tw!=0) { foundrole=1; }
         if (i==10 && tw!=0) { foundrole=1; }          if (i==10 && tw!=0) { founddomain=1; }
         if (i==11 && tw!=0) { founddomain=1; }          if (i==13 && tw!=0) { foundinstatus=1; }
         if (i==12 && tw!=0) { foundinstatus=1; }  
     }      }
     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus);      verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundrole,founddomain,foundinststatus);
 }  }
   
 function flip(vf,tf) {  function flip(vf,tf) {
Line 802  function flip(vf,tf) { Line 721  function flip(vf,tf) {
    if ((tf>=2) && (tf<=5) && (nw!=0)) {     if ((tf>=2) && (tf<=5) && (nw!=0)) {
       eval('vf.f1.selectedIndex=0;')        eval('vf.f1.selectedIndex=0;')
    }     }
    $auth_update     // intial password specified, pick internal authentication
      if (tf==8 && nw!=0) {
          changed_radio('int',document.studentform);
          set_auth_radio_buttons('int',document.studentform);
          vf.krbarg.value='';
          vf.intarg.value='';
          vf.locarg.value='';
      }
 }  }
   
 function clearpwd(vf) {  function clearpwd(vf) {
Line 817  ENDPICK Line 743  ENDPICK
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub print_upload_manager_footer {  sub print_upload_manager_footer {
     my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission,$crstype) = @_;      my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission) = @_;
     my $form = 'document.studentform';      my $form = 'document.studentform';
     my $formname = 'studentform';      my $formname = 'studentform';
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
Line 835  sub print_upload_manager_footer { Line 761  sub print_upload_manager_footer {
     my $intform = &Apache::loncommon::authform_internal(%param);      my $intform = &Apache::loncommon::authform_internal(%param);
     my $locform = &Apache::loncommon::authform_local(%param);      my $locform = &Apache::loncommon::authform_local(%param);
     my $date_table = &date_setting_table(undef,undef,$context,undef,      my $date_table = &date_setting_table(undef,undef,$context,undef,
                                          $formname,$permission,$crstype);                                           $formname,$permission);
   
     my $Str = "\n".'<div class="LC_left_float">';      my $Str = "\n".'<div class="LC_left_float">';
     $Str .= &hidden_input('nfields',$i);      $Str .= &hidden_input('nfields',$i);
Line 899  sub print_upload_manager_footer { Line 825  sub print_upload_manager_footer {
                .'&nbsp;'.&mt('Add a domain role').'</label>'                 .'&nbsp;'.&mt('Add a domain role').'</label>'
                .'&nbsp;&nbsp;&nbsp;<label>'                 .'&nbsp;&nbsp;&nbsp;<label>'
                .'<input type="radio" name="roleaction" value="course" />'                 .'<input type="radio" name="roleaction" value="course" />'
                .'&nbsp;'.&mt('Add a course/community role').'</label>'                 .'&nbsp;'.&mt('Add a course role').'</label>'
                .'</span>';                 .'</span>';
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         $Str .= &Apache::lonhtmlcommon::row_title(          $Str .= &Apache::lonhtmlcommon::row_title(
Line 934  sub print_upload_manager_footer { Line 860  sub print_upload_manager_footer {
         my ($cnum,$cdom) = &get_course_identity();          my ($cnum,$cdom) = &get_course_identity();
         my $rowtitle = &mt('section');          my $rowtitle = &mt('section');
         my $secbox = &section_picker($cdom,$cnum,'Any',$rowtitle,          my $secbox = &section_picker($cdom,$cnum,'Any',$rowtitle,
                                      $permission,$context,'upload',$crstype);                                       $permission,$context,'upload');
         $Str .= $secbox          $Str .= $secbox
                .&Apache::lonhtmlcommon::row_closure();                 .&Apache::lonhtmlcommon::row_closure();
         my %lt;  
         if ($crstype eq 'Community') {  
             %lt = &Apache::lonlocal::texthash (  
                     disp => 'Display members with current/future access who are not in the uploaded file',  
                     stus => 'Members selected from this list can be dropped.'  
             );  
         } else {  
             %lt = &Apache::lonlocal::texthash (  
                     disp => 'Display students with current/future access who are not in the uploaded file',  
                     stus => 'Students selected from this list can be dropped.'  
             );  
         }  
         $Str .= &Apache::lonhtmlcommon::row_title(&mt('Full Update'))          $Str .= &Apache::lonhtmlcommon::row_title(&mt('Full Update'))
                .'<label><input type="checkbox" name="fullup" value="yes" />'                 .'<label><input type="checkbox" name="fullup" value="yes" />'.
                .' '.$lt{'disp'}                  ' '.&mt('Display students with current/future access who are not in the uploaded file.')
                .'</label><br />'                 .'</label><br />'
                .$lt{'stus'}                 .&mt('Students selected from this list can be dropped.')
                .&Apache::lonhtmlcommon::row_closure();                 .&Apache::lonhtmlcommon::row_closure();
     }      }
     if ($context eq 'course' || $context eq 'domain') {      if ($context eq 'course' || $context eq 'domain') {
Line 968  sub print_upload_manager_footer { Line 883  sub print_upload_manager_footer {
            .'<hr />';             .'<hr />';
     if ($context eq 'course') {      if ($context eq 'course') {
         $Str .= '<p class="LC_info">'          $Str .= '<p class="LC_info">'
                .&mt('Note: This operation may be time consuming when adding several users.')                 .&mt('Note: For large courses, this operation may be time consuming.')
                .'</p>';                 .'</p>';
     }      }
     $Str .= '<p><input type="button"'      $Str .= '<p><input type="button"'
Line 1001  sub forceid_change { Line 916  sub forceid_change {
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub print_upload_manager_form {  sub print_upload_manager_form {
     my ($r,$context,$permission,$crstype) = @_;      my ($r,$context,$permission) = @_;
     my $firstLine;      my $firstLine;
     my $datatoken;      my $datatoken;
     if (!$env{'form.datatoken'}) {      if (!$env{'form.datatoken'}) {
Line 1047  sub print_upload_manager_form { Line 962  sub print_upload_manager_form {
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
         &Apache::loncommon::get_kerberos_defaults($defdom);          &Apache::loncommon::get_kerberos_defaults($defdom);
     #      #
     my ($authnum,%can_assign) =  &Apache::loncommon::get_assignable_auth($defdom);  
     &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom,$context,      &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom,$context,
                                  $permission,$crstype,\%can_assign);                                   $permission);
     my $i;      my $i;
     my $keyfields;      my $keyfields;
     if ($total>=0) {      if ($total>=0) {
Line 1085  sub print_upload_manager_form { Line 999  sub print_upload_manager_form {
     }      }
     $r->print('</div>');      $r->print('</div>');
     &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear,      &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear,
                                  $context,$permission,$crstype);                                   $context,$permission);
 }  }
   
 sub setup_date_selectors {  sub setup_date_selectors {
Line 1159  sub get_dates_from_form { Line 1073  sub get_dates_from_form {
 }  }
   
 sub date_setting_table {  sub date_setting_table {
     my ($starttime,$endtime,$mode,$bulkaction,$formname,$permission,$crstype) = @_;      my ($starttime,$endtime,$mode,$bulkaction,$formname,$permission) = @_;
     my $nolink;      my $nolink;
     if ($bulkaction) {      if ($bulkaction) {
         $nolink = 1;          $nolink = 1;
Line 1176  sub date_setting_table { Line 1090  sub date_setting_table {
             ($env{'form.action'} eq 'upload')) {              ($env{'form.action'} eq 'upload')) {
             if ($env{'request.course.sec'} eq '') {              if ($env{'request.course.sec'} eq '') {
                 $dateDefault = '<span class="LC_nobreak">'.                  $dateDefault = '<span class="LC_nobreak">'.
                     '<label><input type="checkbox" name="makedatesdefault" value="1" /> ';                      '<label><input type="checkbox" name="makedatesdefault" value="1" /> '.
                 if ($crstype eq 'Community') {                      &mt('make these dates the default access dates for future student enrollment').
                     $dateDefault .= &mt("make these dates the default access dates for future community enrollment");                      '</label></span>';
                 } else {  
                     $dateDefault .= &mt("make these dates the default access dates for future course enrollment");  
                 }  
                 $dateDefault .= '</label></span>';  
             }              }
         }          }
     }      }
Line 1211  sub date_setting_table { Line 1121  sub date_setting_table {
 }  }
   
 sub make_dates_default {  sub make_dates_default {
     my ($startdate,$enddate,$context,$crstype) = @_;      my ($startdate,$enddate,$context) = @_;
     my $result = '';      my $result = '';
     if ($context eq 'course') {      if ($context eq 'course') {
         my ($cnum,$cdom) = &get_course_identity();          my ($cnum,$cdom) = &get_course_identity();
Line 1219  sub make_dates_default { Line 1129  sub make_dates_default {
                 {'default_enrollment_start_date'=>$startdate,                  {'default_enrollment_start_date'=>$startdate,
                  'default_enrollment_end_date'  =>$enddate},$cdom,$cnum);                   'default_enrollment_end_date'  =>$enddate},$cdom,$cnum);
         if ($put_result eq 'ok') {          if ($put_result eq 'ok') {
             if ($crstype eq 'Community') {              $result .= &mt('Set default start and end access dates for course.').
                 $result .= &mt('Set default start and end access dates for community.');                         '<br />'."\n";
             } else {  
                 $result .= &mt('Set default start and end access dates for course.');  
             }  
             $result .= '<br />'."\n";  
             #              #
             # Refresh the course environment              # Refresh the course environment
             &Apache::lonnet::coursedescription($env{'request.course.id'},              &Apache::lonnet::coursedescription($env{'request.course.id'},
                                                {'freshen_cache' => 1});                                                 {'freshen_cache' => 1});
         } else {          } else {
             if ($crstype eq 'Community') {              $result .= &mt('Unable to set default access dates for course.').":".$put_result.
                 $result .= &mt('Unable to set default access dates for community');                         '<br />';
             } else {  
                 $result .= &mt('Unable to set default access dates for course');  
             }  
             $result .= ':'.$put_result.'<br />';  
         }          }
     }      }
     return $result;      return $result;
 }  }
   
 sub default_role_selector {  sub default_role_selector {
     my ($context,$checkpriv,$crstype) = @_;      my ($context,$checkpriv) = @_;
     my %customroles;      my %customroles;
     my ($options,$coursepick,$cb_jscript);      my ($options,$coursepick,$cb_jscript);
     if ($context ne 'author') {      if ($context ne 'author') {
         %customroles = &my_custom_roles($crstype);          %customroles = &my_custom_roles();
     }      }
   
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
Line 1258  sub default_role_selector { Line 1160  sub default_role_selector {
     $options = '<select name="defaultrole">'."\n".      $options = '<select name="defaultrole">'."\n".
                ' <option value="">'.&mt('Please select').'</option>'."\n";                  ' <option value="">'.&mt('Please select').'</option>'."\n"; 
     if ($context eq 'course') {      if ($context eq 'course') {
         $options .= &default_course_roles($context,$checkpriv,$crstype,%customroles);          $options .= &default_course_roles($context,$checkpriv,%customroles);
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         my @roles = &construction_space_roles($checkpriv);          my @roles = &construction_space_roles($checkpriv);
         foreach my $role (@roles) {          foreach my $role (@roles) {
Line 1272  sub default_role_selector { Line 1174  sub default_role_selector {
            $options .= '  <option value="'.$role.'">'.$plrole.'</option>';             $options .= '  <option value="'.$role.'">'.$plrole.'</option>';
         }          }
         my $courseform = &Apache::loncommon::selectcourse_link          my $courseform = &Apache::loncommon::selectcourse_link
             ('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course/Community');              ('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course');
         $cb_jscript =           $cb_jscript = 
             &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform','courserole','Course/Community');              &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform');
         $coursepick = &Apache::loncommon::start_data_table().          $coursepick = &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>'.$courseform.'</th><th>'.$lt{'rol'}.'</th>'.
                       '<th>'.$lt{'grs'}.'</th>'.                        '<th>'.$lt{'grs'}.'</th>'.
                       &Apache::loncommon::end_data_table_header_row().                        &Apache::loncommon::end_data_table_header_row().
                       &Apache::loncommon::start_data_table_row()."\n".                        &Apache::loncommon::start_data_table_row()."\n".
                       '<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n".                        '<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n".
                       '<td><select name="courserole">'."\n".                        '<td><select name="courserole">'."\n".
                       &default_course_roles($context,$checkpriv,'Course',%customroles)."\n".                        &default_course_roles($context,$checkpriv,%customroles)."\n".
                       '</select></td><td>'.                        '</select></td><td>'.
                       '<table class="LC_createuser">'.                        '<table class="LC_createuser">'.
                       '<tr class="LC_section_row"><td valign"top">'.                        '<tr class="LC_section_row"><td valign"top">'.
Line 1299  sub default_role_selector { Line 1201  sub default_role_selector {
                       $env{'request.role.domain'}.'" />'.                        $env{'request.role.domain'}.'" />'.
                       '<input type="hidden" name="dccourse" value="" />'.                        '<input type="hidden" name="dccourse" value="" />'.
                       '<input type="hidden" name="dcdomain" value="" />'.                        '<input type="hidden" name="dcdomain" value="" />'.
                       '<input type="hidden" name="crstype" value="" />'.  
                       '</td></tr></table></td>'.                        '</td></tr></table></td>'.
                       &Apache::loncommon::end_data_table_row().                        &Apache::loncommon::end_data_table_row().
                       &Apache::loncommon::end_data_table()."\n";                        &Apache::loncommon::end_data_table()."\n";
Line 1309  sub default_role_selector { Line 1210  sub default_role_selector {
 }  }
   
 sub default_course_roles {  sub default_course_roles {
     my ($context,$checkpriv,$crstype,%customroles) = @_;      my ($context,$checkpriv,%customroles) = @_;
     my $output;      my $output;
     my $custom = 1;      my $custom = 1;
     my @roles = &course_roles($context,$checkpriv,$custom,lc($crstype));      my @roles = &course_roles($context,$checkpriv,$custom);
     foreach my $role (@roles) {      foreach my $role (@roles) {
         if ($role ne 'cr') {          if ($role ne 'cr') {
             my $plrole=&Apache::lonnet::plaintext($role,$crstype);              my $plrole=&Apache::lonnet::plaintext($role);
             $output .= '  <option value="'.$role.'">'.$plrole.'</option>';              $output .= '  <option value="'.$role.'">'.$plrole.'</option>';
         }          }
     }      }
Line 1364  sub domain_roles { Line 1265  sub domain_roles {
 }  }
   
 sub course_roles {  sub course_roles {
     my ($context,$checkpriv,$custom,$roletype) = @_;      my ($context,$checkpriv,$custom) = @_;
     my $crstype;      my @allroles = &roles_by_context('course',$custom);
     if ($roletype eq 'community') {  
         $crstype = 'Community' ;  
     } else {  
         $crstype = 'Course';  
     }  
     my @allroles = &roles_by_context('course',$custom,$crstype);  
     my @roles;      my @roles;
     if ($context eq 'domain') {      if ($context eq 'domain') {
         @roles = @allroles;          @roles = @allroles;
Line 1382  sub course_roles { Line 1277  sub course_roles {
                     if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {                      if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
                         push(@roles,$role);                          push(@roles,$role);
                     } else {                      } else {
                         if ((($role ne 'cc') && ($role ne 'co')) && ($env{'request.course.sec'} ne '')) {                          if ($role ne 'cc' && $env{'request.course.sec'} ne '') {
                             if (&Apache::lonnet::allowed('c'.$role,                              if (&Apache::lonnet::allowed('c'.$role,
                                              $env{'request.course.id'}.'/'.                                               $env{'request.course.id'}.'/'.
                                              $env{'request.course.sec'})) {                                               $env{'request.course.sec'})) {
Line 1400  sub course_roles { Line 1295  sub course_roles {
 }  }
   
 sub curr_role_permissions {  sub curr_role_permissions {
     my ($context,$setting,$checkpriv,$type) = @_;       my ($context,$setting,$checkpriv) = @_; 
     my $custom = 1;      my $custom = 1;
     my @roles;      my @roles;
     if ($context eq 'author') {      if ($context eq 'author') {
         @roles = &construction_space_roles($checkpriv);          @roles = &construction_space_roles($checkpriv);
     } elsif ($context eq 'domain') {      } elsif ($context eq 'domain') {
         if ($setting eq 'course') {          if ($setting eq 'course') {
             @roles = &course_roles($context,$checkpriv,$custom,$type);               @roles = &course_roles($context,$checkpriv,$custom); 
         } else {          } else {
             @roles = &domain_roles($checkpriv);              @roles = &domain_roles($checkpriv);
         }          }
     } elsif ($context eq 'course') {      } elsif ($context eq 'course') {
         @roles = &course_roles($context,$checkpriv,$custom,$type);          @roles = &course_roles($context,$checkpriv,$custom);
     }      }
     return @roles;      return @roles;
 }  }
Line 1420  sub curr_role_permissions { Line 1315  sub curr_role_permissions {
 # ======================================================= Existing Custom Roles  # ======================================================= Existing Custom Roles
   
 sub my_custom_roles {  sub my_custom_roles {
     my ($crstype) = @_;  
     my %returnhash=();      my %returnhash=();
     my %rolehash=&Apache::lonnet::dump('roles');      my %rolehash=&Apache::lonnet::dump('roles');
     foreach my $key (keys(%rolehash)) {      foreach my $key (keys %rolehash) {
         if ($key=~/^rolesdef\_(\w+)$/) {          if ($key=~/^rolesdef\_(\w+)$/) {
             if ($crstype eq 'Community') {  
                 next if ($rolehash{$key} =~ /bre\&S/);   
             }  
             $returnhash{$1}=$1;              $returnhash{$1}=$1;
         }          }
     }      }
Line 1516  sub print_userlist { Line 1407  sub print_userlist {
                   '<input type="hidden" name="phase" value="" /></form>');                    '<input type="hidden" name="phase" value="" /></form>');
         return;          return;
     }      }
     if (!(($context eq 'domain') &&       if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) {
         (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) {          $r->print('&nbsp;'.&list_submit_button(&mt('Update Display')).
         $r->print(                    "\n</p>\n");
             "\n</p>\n"  
            .'<p>'  
            .&list_submit_button(&mt('Update Display'))  
            ."</p>\n"  
         );  
     }      }
     my ($indexhash,$keylist) = &make_keylist_array();      my ($indexhash,$keylist) = &make_keylist_array();
     my (%userlist,%userinfo,$clearcoursepick);      my (%userlist,%userinfo);
     if (($context eq 'domain') &&       if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
         ($env{'form.roletype'} eq 'course') ||  
         ($env{'form.roletype'} eq 'community')) {  
         my ($crstype,$numcodes,$title,$warning);  
         if ($env{'form.roletype'} eq 'course') {  
             $crstype = 'Course';  
             $numcodes = $totcodes;  
             $title = &mt('Select Courses');  
             $warning = &mt('Warning: data retrieval for multiple courses can take considerable time, as this operation is not currently optimized.');  
         } elsif ($env{'form.roletype'} eq 'community') {  
             $crstype = 'Community';  
             $numcodes = 0;  
             $title = &mt('Select Communities');  
             $warning = &mt('Warning: data retrieval for multiple communities can take considerable time, as this operation is not currently optimized.');  
         }  
         my $courseform =          my $courseform =
             &Apache::lonhtmlcommon::course_selection($formname,$numcodes,              &Apache::lonhtmlcommon::course_selection($formname,$totcodes,
                             $codetitles,$idlist,$idlist_titles,$crstype);                                           $codetitles,$idlist,$idlist_titles);
         $r->print('<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n".          $r->print('<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n".
                   &Apache::lonhtmlcommon::start_pick_box()."\n".                    &Apache::lonhtmlcommon::start_pick_box()."\n".
                   &Apache::lonhtmlcommon::row_title($title,'LC_oddrow_value')."\n".                    &Apache::lonhtmlcommon::row_title(&mt('Select Course(s)'),
                                                       'LC_oddrow_value')."\n".
                   $courseform."\n".                    $courseform."\n".
                   &Apache::lonhtmlcommon::row_closure(1).                    &Apache::lonhtmlcommon::row_closure(1).
                   &Apache::lonhtmlcommon::end_pick_box().'</p>'.                    &Apache::lonhtmlcommon::end_pick_box().'</p>'.
                   '<p><input type="hidden" name="origroletype" value="'.$env{'form.roletype'}.'" />'.                    '<p>'.&list_submit_button(&mt('Update Display')).
                   &list_submit_button(&mt('Update Display')).                    "\n".'</p><span class="LC_warning">'.&mt('Warning: data retrieval for multiple courses can take considerable time, as this operation is not currently optimized.').'</span>'."\n");
                   "\n".'</p><span class="LC_warning">'.$warning.'</span>'."\n");          if ($env{'form.coursepick'}) {
         $clearcoursepick = 0;  
         if (($env{'form.origroletype'} ne '') &&  
             ($env{'form.origroletype'} ne $env{'form.roletype'})) {  
             $clearcoursepick = 1;  
         }  
         if (($env{'form.coursepick'}) && (!$clearcoursepick)) {  
             $r->print('<hr />'.&mt('Searching').' ...<br />&nbsp;<br />');              $r->print('<hr />'.&mt('Searching').' ...<br />&nbsp;<br />');
         }          }
     } else {      } else {
Line 1632  sub print_userlist { Line 1499  sub print_userlist {
                         }                          }
                     }                      }
                 }                  }
             } elsif (($env{'form.roletype'} eq 'course') ||              } elsif ($env{'form.roletype'} eq 'course') {
                      ($env{'form.roletype'} eq 'community')) {                  if ($env{'form.coursepick'}) {
                 if (($env{'form.coursepick'}) && (!$clearcoursepick)) {  
                     my %courses = &process_coursepick();                      my %courses = &process_coursepick();
                     my %allusers;                      my %allusers;
                     my $hidepriv = 1;                      my $hidepriv = 1;
Line 1645  sub print_userlist { Line 1511  sub print_userlist {
                         my (@roles,@sections,%access,%users,%userdata,                          my (@roles,@sections,%access,%users,%userdata,
                             %statushash);                              %statushash);
                         if ($env{'form.showrole'} eq 'Any') {                          if ($env{'form.showrole'} eq 'Any') {
                             @roles = &course_roles($context,undef,$custom,                              @roles = &course_roles($context,undef,$custom);
                                                    $env{'form.roletype'});  
                         } else {                          } else {
                             @roles = ($env{'form.showrole'});                              @roles = ($env{'form.showrole'});
                         }                          }
Line 1692  sub print_userlist { Line 1557  sub print_userlist {
                 $r->print(&mt('There are no authors or co-authors to display.')."\n");                  $r->print(&mt('There are no authors or co-authors to display.')."\n");
             } elsif ($env{'form.roletype'} eq 'course') {              } elsif ($env{'form.roletype'} eq 'course') {
                 $r->print(&mt('There are no course users to display')."\n");                   $r->print(&mt('There are no course users to display')."\n"); 
             } elsif ($env{'form.roletype'} eq 'community') {  
                 $r->print(&mt('There are no community users to display')."\n");  
             }              }
         } elsif ($context eq 'course') {          } elsif ($context eq 'course') {
             $r->print(&mt('There are no course users to display.')."\n");              $r->print(&mt('There are no course users to display.')."\n");
Line 1736  sub role_filter { Line 1599  sub role_filter {
         $role_select = '<select name="showrole">'."\n".          $role_select = '<select name="showrole">'."\n".
                        '<option value="Any" '.$roleselected.'>'.                         '<option value="Any" '.$roleselected.'>'.
                        &mt('Any role').'</option>';                         &mt('Any role').'</option>';
         my ($roletype,$crstype);          my @poss_roles = &curr_role_permissions($context);
         if ($context eq 'course') {  
             $crstype = &Apache::loncommon::course_type();  
             if ($crstype eq 'Community') {  
                 $roletype = 'community';  
             } else {  
                 $roletype = 'course';  
             }   
         }  
         my @poss_roles = &curr_role_permissions($context,'','',$roletype);  
         foreach my $role (@poss_roles) {          foreach my $role (@poss_roles) {
             $roleselected = '';              $roleselected = '';
             if ($role eq $env{'form.showrole'}) {              if ($role eq $env{'form.showrole'}) {
Line 1755  sub role_filter { Line 1609  sub role_filter {
             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);
             }              }
             $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';              $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';
         }          }
Line 1791  sub section_group_filter { Line 1645  sub section_group_filter {
             $env{'form.'.$name{$item}} = 'all';              $env{'form.'.$name{$item}} = 'all';
         }          }
         if ($item eq 'sec') {          if ($item eq 'sec') {
             if (($env{'form.showrole'} eq 'cc') || ($env{'form.showrole'} eq 'co')) {              if ($env{'form.showrole'} eq 'cc') {
                 $env{'form.'.$name{$item}} = 'none';                  $env{'form.'.$name{$item}} = 'none';
             }              }
             my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);              my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
Line 1802  sub section_group_filter { Line 1656  sub section_group_filter {
         }          }
         if (@options > 0) {          if (@options > 0) {
             my $currsel;              my $currsel;
             $markup = '<select name="'.$name{$item}.'">'."\n";              $markup = '<select name="'.$name{$item}.'" />'."\n";
             foreach my $option ('all','none',@options) {               foreach my $option ('all','none',@options) { 
                 $currsel = '';                  $currsel = '';
                 if ($env{'form.'.$name{$item}} eq $option) {                  if ($env{'form.'.$name{$item}} eq $option) {
Line 1817  sub section_group_filter { Line 1671  sub section_group_filter {
                 $markup .= '</option>'."\n";                  $markup .= '</option>'."\n";
             }              }
             $markup .= '</select>'."\n";              $markup .= '</select>'."\n";
             $output .= ('&nbsp;'x3).'<span class="LC_nobreak">'              $output .= ('&nbsp;'x3).'<label>'.$title{$item}.': '.$markup.'</label>';
                       .'<label>'.$title{$item}.': '.$markup.'</label>'  
                       .'</span> ';  
         }          }
     }      }
     return $output;      return $output;
Line 1872  sub gather_userinfo { Line 1724  sub gather_userinfo {
                                            $indexhash,$uniqid,$userlist);                                             $indexhash,$uniqid,$userlist);
                     }                      }
                 }                  }
             } elsif (($env{'form.roletype'} eq 'course') ||               } elsif ($env{'form.roletype'} eq 'course') {
                      ($env{'form.roletype'} eq 'community')) {  
                 ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) =                  ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) =
                     split(/:/,$item);                      split(/:/,$item);
                 if (ref($rolehash->{$item}) eq 'HASH') {                  if (ref($rolehash->{$item}) eq 'HASH') {
Line 1923  sub gather_userinfo { Line 1774  sub gather_userinfo {
 sub build_user_record {  sub build_user_record {
     my ($context,$userdata,$userinfo,$indexhash,$record_key,$userlist) = @_;      my ($context,$userdata,$userinfo,$indexhash,$record_key,$userlist) = @_;
     next if ($userdata->{'start'} eq '-1' && $userdata->{'end'} eq '-1');      next if ($userdata->{'start'} eq '-1' && $userdata->{'end'} eq '-1');
     if (!(($context eq 'domain') && (($env{'form.roletype'} eq 'course')      if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) {
                              && ($env{'form.roletype'} eq 'community')))) {  
         &process_date_info($userdata);          &process_date_info($userdata);
     }      }
     my $username = $userdata->{'username'};      my $username = $userdata->{'username'};
Line 2039  sub process_coursepick { Line 1889  sub process_coursepick {
     my $coursefilter = $env{'form.coursepick'};      my $coursefilter = $env{'form.coursepick'};
     my $cdom = $env{'request.role.domain'};      my $cdom = $env{'request.role.domain'};
     my %courses;      my %courses;
     my $crssrch = 'Course';  
     if ($env{'form.roletype'} eq 'community') {  
         $crssrch = 'Community';  
     }  
     if ($coursefilter eq 'all') {      if ($coursefilter eq 'all') {
         %courses = &Apache::lonnet::courseiddump($cdom,'.','.','.','.','.',          %courses = &Apache::lonnet::courseiddump($cdom,'.','.','.','.','.',
                                                  undef,undef,$crssrch);                                                   undef,undef,'Course');
     } elsif ($coursefilter eq 'category') {      } elsif ($coursefilter eq 'category') {
         my $instcode = &instcode_from_coursefilter();          my $instcode = &instcode_from_coursefilter();
         %courses = &Apache::lonnet::courseiddump($cdom,'.','.',$instcode,'.','.',          %courses = &Apache::lonnet::courseiddump($cdom,'.','.',$instcode,'.','.',
                                                  undef,undef,$crssrch);                                                   undef,undef,'Course');
     } elsif ($coursefilter eq 'specific') {      } elsif ($coursefilter eq 'specific') {
         if ($env{'form.coursetotal'} > 1) {          if ($env{'form.coursetotal'} > 1) {
             my @course_ids = split(/&&/,$env{'form.courselist'});              my @course_ids = split(/&&/,$env{'form.courselist'});
Line 2193  sub show_users_list { Line 2039  sub show_users_list {
         $sortby = 'username';          $sortby = 'username';
     }      }
     my $setting = $env{'form.roletype'};      my $setting = $env{'form.roletype'};
     my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers,$crstype);      my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers);
     if ($context eq 'course') {      if ($context eq 'course') {
         $cid = $env{'request.course.id'};          $cid = $env{'request.course.id'};
         $crstype = &Apache::loncommon::course_type();  
         ($cnum,$cdom) = &get_course_identity($cid);          ($cnum,$cdom) = &get_course_identity($cid);
         ($classgroups) = &Apache::loncoursedata::get_group_memberships(          ($classgroups) = &Apache::loncoursedata::get_group_memberships(
                                      $userlist,$keylist,$cdom,$cnum);                                       $userlist,$keylist,$cdom,$cnum);
Line 2231  function photowindow(photolink) { Line 2076  function photowindow(photolink) {
 <input type="hidden" name="displayclickers" value="$displayclickers" />  <input type="hidden" name="displayclickers" value="$displayclickers" />
 END  END
         }          }
     } elsif ($context eq 'domain') {  
         if ($setting eq 'community') {  
             $crstype = 'Community';  
         } elsif ($setting eq 'course') {  
             $crstype = 'Course';  
         }  
     }      }
     if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {      if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
         my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();          my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();
Line 2333  END Line 2172  END
                       );                        );
     if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {      if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
         $lt{'extent'} = &mt('Course(s): description, section(s), status');          $lt{'extent'} = &mt('Course(s): description, section(s), status');
     } elsif ($context eq 'domain' && $env{'form.roletype'} eq 'community') {  
         $lt{'extent'} = &mt('Communities: description, section(s), status');  
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         $lt{'extent'} = &mt('Author');           $lt{'extent'} = &mt('Author'); 
     }      }
Line 2346  END Line 2183  END
         if ($context eq 'course') {          if ($context eq 'course') {
             push(@cols,'section');              push(@cols,'section');
         }          }
         if (!($context eq 'domain' && ($env{'form.roletype'} eq 'course')          if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) { 
                               && ($env{'form.roletype'} eq 'community'))) {  
             push(@cols,('start','end'));              push(@cols,('start','end'));
         }          }
         if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {          if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {
             push(@cols,'role');              push(@cols,'role');
         }          }
         if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||          if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||
                                     $env{'form.roletype'} eq 'course' ||                                      $env{'form.roletype'} eq 'course')) {
                                     $env{'form.roletype'} eq 'community')) {  
             push (@cols,'extent');              push (@cols,'extent');
         }          }
         if (($statusmode eq 'Any') &&          if (($statusmode eq 'Any') && 
             (!($context eq 'domain' && (($env{'form.roletype'} eq 'course')              (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) {
              || ($env{'form.roletype'} eq 'community'))))) {  
             push(@cols,'status');              push(@cols,'status');
         }          }
         if ($context eq 'course') {          if ($context eq 'course') {
Line 2373  END Line 2207  END
     if ($env{'form.showrole'} eq 'cr') {      if ($env{'form.showrole'} eq 'cr') {
         $rolefilter = &mt('custom');            $rolefilter = &mt('custom');  
     } elsif ($env{'form.showrole'} ne 'Any') {      } elsif ($env{'form.showrole'} ne 'Any') {
         $rolefilter = &Apache::lonnet::plaintext($env{'form.showrole'},$crstype);          $rolefilter = &Apache::lonnet::plaintext($env{'form.showrole'});
     }      }
     my $results_description;      my $results_description;
     if ($mode ne 'autoenroll') {      if ($mode ne 'autoenroll') {
         $results_description = &results_header_row($rolefilter,$statusmode,          $results_description = &results_header_row($rolefilter,$statusmode,
                                                    $context,$permission,$mode,$crstype);                                                     $context,$permission,$mode);
   
         $r->print('<b>'.$results_description.'</b><br /><br />');          $r->print('<b>'.$results_description.'</b><br /><br />');
     }      }
     my ($output,$actionselect,%canchange,%canchangesec);      my ($output,$actionselect,%canchange,%canchangesec);
     if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {      if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
         if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {          if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
             if ($permission->{'cusr'}) {              if ($permission->{'cusr'}) {
                 unless (($context eq 'domain') &&                   $actionselect = &select_actions($context,$setting,$statusmode,$formname);
                         (($setting eq 'course') || ($setting eq 'community'))) {  
                     $actionselect =   
                         &select_actions($context,$setting,$statusmode,$formname);  
                 }  
             }              }
             $r->print(<<END);              $r->print(<<END);
 <input type="hidden" name="srchby"  value="uname" />  <input type="hidden" name="srchby"  value="uname" />
Line 2401  END Line 2230  END
 END  END
             if ($actionselect) {              if ($actionselect) {
                 $output .= <<"END";                  $output .= <<"END";
 <div class="LC_left_float"><fieldset><legend><b>$lt{'ac'}</b></legend>  <div class="LC_left_float"><fieldset><legend>$lt{'ac'}</legend>
 $actionselect  $actionselect
 <br/><br /><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.$formname.actionlist)" /> &nbsp;  <br/><br /><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.$formname.actionlist)" /> &nbsp;
 <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.$formname.actionlist)" /><br /><input type="button" value="$lt{'pr'}" onclick="javascript:verify_action('actionlist')" /></fieldset></div>  <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.$formname.actionlist)" /><br /><input type="button" value="$lt{'pr'}" onclick="javascript:verify_action('actionlist')" /></fieldset></div>
Line 2410  END Line 2239  END
                 if ($env{'form.showrole'} eq 'Any') {                  if ($env{'form.showrole'} eq 'Any') {
                     my $custom = 1;                      my $custom = 1;
                     if ($context eq 'domain') {                      if ($context eq 'domain') {
                         @allroles = &roles_by_context($setting,$custom,$crstype);                          @allroles = &roles_by_context($setting,$custom);
                     } else {                      } else {
                         @allroles = &roles_by_context($context,$custom,$crstype);                          @allroles = &roles_by_context($context,$custom);
                     }                      }
                 } else {                  } else {
                     @allroles = ($env{'form.showrole'});                      @allroles = ($env{'form.showrole'});
Line 2446  END Line 2275  END
                     }                      }
                 }                  }
             }              }
             $output .= '<div class="LC_left_float"><fieldset><legend><b>'.$lt{'link'}.'</b></legend>'.              $output .= '<div class="LC_left_float"><fieldset><legend>'.$lt{'link'}.'</legend>'.
                        '<table><tr>';                         '<table><tr>';
             my @linkdests = ('aboutme');              my @linkdests = ('aboutme');
             if ($permission->{'cusr'}) {              if ($permission->{'cusr'}) {
Line 2457  END Line 2286  END
                                          $env{'request.course.sec'})) {                                           $env{'request.course.sec'})) {
                 push(@linkdests,'track');                  push(@linkdests,'track');
             }              }
   
             $output .= '<td>';              $output .= '<td>';
             my $usernamelink = $env{'form.usernamelink'};              my $usernamelink = $env{'form.usernamelink'};
             if ($usernamelink eq '') {              if ($usernamelink eq '') {
Line 2473  END Line 2303  END
             if ($env{'form.userwin'}) {              if ($env{'form.userwin'}) {
                 $checkwin = ' checked="checked"';                  $checkwin = ' checked="checked"';
             }              }
             $output .= '</td><td valign="top" style="border-left: 1px solid;><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>';              $output .= '</td><td valign="top"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>';
         }          }
         $output .= "\n".'<div class="LC_clear_float_footer">&nbsp;</div>'."\n".          $output .= "\n".'<div class="LC_clear_float_footer">&nbsp;</div>'."\n".
                   &Apache::loncommon::start_data_table().                    &Apache::loncommon::start_data_table().
Line 2483  END Line 2313  END
  <th><a href=\"javascript:document.$formname.sortby.value='type';document.$formname.submit();\">$lt{'type'}</a></th>   <th><a href=\"javascript:document.$formname.sortby.value='type';document.$formname.submit();\">$lt{'type'}</a></th>
             ";              ";
         } else {          } else {
             $output .= "\n".'<th>&nbsp;</th>'."\n";              if ($mode eq 'pickauthor') {
                   $output .= "\n".'<th>&nbsp;</th>'."\n";
               } else { 
                   $output .= "\n".'<th>'.&mt('Count').'</th>'."\n";
               }
             if ($actionselect) {              if ($actionselect) {
                 $output .= '<th>'.&mt('Select').'</th>'."\n";                  $output .= '<th>'.&mt('Select').'</th>'."\n";
             }              }
Line 2538  END Line 2372  END
                        time.'_'.rand(1000000000).'.csv';                         time.'_'.rand(1000000000).'.csv';
         unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {          unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {
             $r->log_error("Couldn't open $CSVfilename for output $!");              $r->log_error("Couldn't open $CSVfilename for output $!");
             $r->print(              $r->print(&mt('Problems occurred in writing the CSV file. '
                 '<p class="LC_error">'                           .'This error has been logged. '
                .&mt('Problems occurred in writing the CSV file.')                           .'Please alert your LON-CAPA administrator.'));
                .' '.&mt('This error has been logged.')  
                .' '.&mt('Please alert your LON-CAPA administrator.')  
                .'</p>'  
             );  
             $CSVfile = undef;              $CSVfile = undef;
         }          }
         #          #
Line 2618  END Line 2448  END
                 }                  }
             } elsif ($env{'form.roletype'} eq 'author') {              } elsif ($env{'form.roletype'} eq 'author') {
                 ($uname,$udom,$role) = split(/:/,$user,-1);                  ($uname,$udom,$role) = split(/:/,$user,-1);
             } elsif (($env{'form.roletype'} eq 'course') ||               } elsif ($env{'form.roletype'} eq 'course') {
                      ($env{'form.roletype'} eq 'community')) {  
                 ($uname,$udom,$role) = split(/:/,$user);                  ($uname,$udom,$role) = split(/:/,$user);
             }              }
         } else {          } else {
Line 2726  END Line 2555  END
         if ($clickers!~/\w/) { $clickers='-'; }          if ($clickers!~/\w/) { $clickers='-'; }
         $in{'clicker'} = $clickers;           $in{'clicker'} = $clickers; 
  my $role = $in{'role'};   my $role = $in{'role'};
         $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype);           $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}]); 
         if (! defined($in{'start'}) || $in{'start'} == 0) {          if (! defined($in{'start'}) || $in{'start'} == 0) {
             $in{'start'} = &mt('none');              $in{'start'} = &mt('none');
         } else {          } else {
Line 3013  sub print_username_link { Line 2842  sub print_username_link {
         $output = $in->{'username'};          $output = $in->{'username'};
     } else {      } else {
         $output = '<a href="javascript:username_display_launch('.          $output = '<a href="javascript:username_display_launch('.
                   "'$in->{'username'}','$in->{'domain'}'".')">'.                    "'$in->{'username'}','$in->{'domain'}'".')" />'.
                   $in->{'username'}.'</a>';                    $in->{'username'}.'</a>';
     }      }
     return $output;      return $output;
Line 3024  sub role_type_names { Line 2853  sub role_type_names {
                          'domain' => 'Domain Roles',                           'domain' => 'Domain Roles',
                          'author' => 'Co-Author Roles',                           'author' => 'Co-Author Roles',
                          'course' => 'Course Roles',                           'course' => 'Course Roles',
                          'community' => 'Community Roles',  
              );               );
     return %lt;      return %lt;
 }  }
Line 3161  ENDTWO Line 2989  ENDTWO
 }  }
   
 sub date_section_selector {  sub date_section_selector {
     my ($context,$permission,$crstype) = @_;      my ($context,$permission) = @_;
     my $callingform = $env{'form.callingform'};      my $callingform = $env{'form.callingform'};
     my $formname = 'dateselect';        my $formname = 'dateselect';  
     my $groupslist = &get_groupslist();      my $groupslist = &get_groupslist();
Line 3186  END Line 3014  END
         } else {          } else {
             opener.document.$callingform.retainsec.value = formname.retainsec.value;              opener.document.$callingform.retainsec.value = formname.retainsec.value;
         }          }
         setSections(formname,'$crstype');          setSections(formname);
         if (seccheck == 'ok') {          if (seccheck == 'ok') {
             opener.document.$callingform.newsecs.value = formname.sections.value;              opener.document.$callingform.newsecs.value = formname.sections.value;
         }          }
Line 3243  ENDJS Line 3071  ENDJS
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                  chac => 'Access dates to apply for selected users',                   chac => 'Access dates to apply for selected users',
                  chse => 'Changes in section affiliation to apply to selected users',                   chse => 'Changes in section affiliation to apply to selected users',
                  fors => 'For student roles, changing the section will result in a section switch as students may only be in one section of a course at a time.',                   fors => 'For student roles changing the section, will result in a section switch as students may only be in one section of a course at a time.',
                  forn => 'For a course role that is not "student", users may have roles in more than one section at a time.',                   forn => 'For a role in a course that is not a student role, a user may have roles in more than one section of a course at a time.',
                  reta => "Retain each user's current section affiliations?",                    reta => "Retain each user's current section affiliations?", 
                  dnap => '(Does not apply to student roles).',                   dnap => '(Does not apply to student roles).', 
             );              );
     my ($date_items,$headertext);      my ($date_items,$headertext);
     if ($env{'form.bulkaction'} eq 'chgsec') {      if ($env{'form.bulkaction'} eq 'chgsec') {
Line 3260  ENDJS Line 3088  ENDJS
         }          }
         $date_items = &date_setting_table($starttime,undef,$context,          $date_items = &date_setting_table($starttime,undef,$context,
                                           $env{'form.bulkaction'},$formname,                                            $env{'form.bulkaction'},$formname,
                                           $permission,$crstype);                                            $permission);
     }      }
     $output .= '<h3>'.$headertext.'</h3>'.      $output .= '<h3>'.$headertext.'</h3>'.
                '<form name="'.$formname.'" method="post" action="">'."\n".                 '<form name="'.$formname.'" method="post">'."\n".
                 $date_items;                  $date_items;
     if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') {      if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') {
         my ($cnum,$cdom) = &get_course_identity();          my ($cnum,$cdom) = &get_course_identity();
         if ($crstype eq 'Community') {  
             $lt{'fors'} = &mt('For member roles, changing the section will result in a section switch, as members may only be in one section of a community at a time.');  
             $lt{'forn'} = &mt('For a community role that is not "member", users may have roles in more than one section at a time.');  
             $lt{'dnap'} = &mt('(Does not apply to member roles).');   
         }  
         my $info;          my $info;
         if ($env{'form.showrole'} eq 'st') {          if ($env{'form.showrole'} eq 'st') {
             $output .= '<p>'.$lt{'fors'}.'</p>';               $output .= '<p>'.$lt{'fors'}.'</p>'; 
Line 3297  ENDJS Line 3120  ENDJS
             $info = '<input type="hidden" name="retainsec" value="0" />';               $info = '<input type="hidden" name="retainsec" value="0" />'; 
         }          }
         my $rowtitle = &mt('New section to assign');          my $rowtitle = &mt('New section to assign');
         my $secbox = &section_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context,'',$crstype);          my $secbox = &section_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context);
         $output .= $info.$secbox;          $output .= $info.$secbox;
     }      }
     $output .= '<p>'.      $output .= '<p>'.
Line 3307  ENDJS Line 3130  ENDJS
 }  }
   
 sub section_picker {  sub section_picker {
     my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype) = @_;      my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode) = @_;
     my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);      my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
     my $sections_select .= &course_sections(\%sections_count,$role);      my $sections_select .= &course_sections(\%sections_count,$role);
     my $secbox = '<div>'.&Apache::lonhtmlcommon::start_pick_box()."\n";      my $secbox = '<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n";
     if ($mode eq 'upload') {      if ($mode eq 'upload') {
         my ($options,$cb_script,$coursepick) =          my ($options,$cb_script,$coursepick) =
             &default_role_selector($context,1,$crstype);              &default_role_selector($context,1);
         $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value').          $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value').
                    $options. &Apache::lonhtmlcommon::row_closure(1)."\n";                     $options. &Apache::lonhtmlcommon::row_closure(1)."\n";
     }      }
Line 3323  sub section_picker { Line 3146  sub section_picker {
                    '<td align="center">'.&mt('Existing sections')."\n".                     '<td align="center">'.&mt('Existing sections')."\n".
                    '<br />'.$sections_select.'</td><td align="center">'.                     '<br />'.$sections_select.'</td><td align="center">'.
                    &mt('New section').'<br />'."\n".                     &mt('New section').'<br />'."\n".
                    '<input type="text" name="newsec" size="15" value="" />'."\n".                     '<input type="text" name="newsec" size="15" />'."\n".
                    '<input type="hidden" name="sections" value="" />'."\n".                     '<input type="hidden" name="sections" value="" />'."\n".
                    '</td></tr></table>'."\n";                     '</td></tr></table>'."\n";
     } else {      } else {
Line 3332  sub section_picker { Line 3155  sub section_picker {
                    $env{'request.course.sec'};                     $env{'request.course.sec'};
     }      }
     $secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n".      $secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n".
                &Apache::lonhtmlcommon::end_pick_box().'</div>';                 &Apache::lonhtmlcommon::end_pick_box().'</p>';
     return $secbox;      return $secbox;
 }  }
   
 sub results_header_row {  sub results_header_row {
     my ($rolefilter,$statusmode,$context,$permission,$mode,$crstype) = @_;      my ($rolefilter,$statusmode,$context,$permission,$mode) = @_;
     my ($description,$showfilter);      my ($description,$showfilter);
     if ($rolefilter ne 'Any') {      if ($rolefilter ne 'Any') {
         $showfilter = $rolefilter;          $showfilter = $rolefilter;
     }      }
     if ($context eq 'course') {      if ($context eq 'course') {
         if ($mode eq 'csv' || $mode eq 'excel') {          if ($mode eq 'csv' || $mode eq 'excel') {
             if ($crstype eq 'Community') {              $description = &mt('Course - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' ';
                 $description = &mt('Community - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' ';  
             } else {  
                 $description = &mt('Course - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' ';  
             }  
         }          }
         if ($statusmode eq 'Expired') {          if ($statusmode eq 'Expired') {
             if ($crstype eq 'Community') {              $description .= &mt('Users in course with expired [_1] roles',$showfilter);
                 $description .= &mt('Users in community with expired [_1] roles',$showfilter);  
             } else {  
                 $description .= &mt('Users in course with expired [_1] roles',$showfilter);  
             }  
         } elsif ($statusmode eq 'Future') {          } elsif ($statusmode eq 'Future') {
             if ($crstype eq 'Community') {              $description .= &mt('Users in course with future [_1] roles',$showfilter);
                 $description .= &mt('Users in community with future [_1] roles',$showfilter);  
             } else {  
                 $description .= &mt('Users in course with future [_1] roles',$showfilter);  
             }  
         } elsif ($statusmode eq 'Active') {          } elsif ($statusmode eq 'Active') {
             if ($crstype eq 'Community') {              $description .= &mt('Users in course with active [_1] roles',$showfilter);
                 $description .= &mt('Users in community with active [_1] roles',$showfilter);  
             } else {  
                 $description .= &mt('Users in course with active [_1] roles',$showfilter);  
             }  
         } else {          } else {
             if ($rolefilter eq 'Any') {              if ($rolefilter eq 'Any') {
                 if ($crstype eq 'Community') {                  $description .= &mt('All users in course');
                     $description .= &mt('All users in community');  
                 } else {  
                     $description .= &mt('All users in course');  
                 }  
             } else {              } else {
                 if ($crstype eq 'Community') {                  $description .= &mt('All users in course with [_1] roles',$rolefilter);
                     $description .= &mt('All users in community with [_1] roles',$rolefilter);  
                 } else {  
                     $description .= &mt('All users in course with [_1] roles',$rolefilter);  
                 }  
             }              }
         }          }
         my $constraint;          my $constraint;
Line 3388  sub results_header_row { Line 3187  sub results_header_row {
         if ($viewablesec ne '') {          if ($viewablesec ne '') {
             if ($env{'form.showrole'} eq 'st') {              if ($env{'form.showrole'} eq 'st') {
                 $constraint = &mt('only users in section "[_1]"',$viewablesec);                  $constraint = &mt('only users in section "[_1]"',$viewablesec);
             } elsif (($env{'form.showrole'} ne 'cc') && ($env{'form.showrole'} ne 'co')) {              } elsif ($env{'form.showrole'} ne 'cc') {
                 $constraint = &mt('only users affiliated with no section or section "[_1]"',$viewablesec);                  $constraint = &mt('only users affiliated with no section or section "[_1]"',$viewablesec);
             }              }
             if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) {              if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) {
Line 3473  sub results_header_row { Line 3272  sub results_header_row {
                 if ($rolefilter eq 'Any') {                  if ($rolefilter eq 'Any') {
                     $description .= &mt('All users with co-author roles in domain',$showfilter);                      $description .= &mt('All users with co-author roles in domain',$showfilter);
                 } else {                  } else {
                     $description .= &mt('All co-authors in domain with [_1] roles',$rolefilter);                      $description .= &mt('All co-authors in domain  with [_1] roles',$rolefilter);
                 }                  }
             }              }
         } elsif (($env{'form.roletype'} eq 'course') ||           } elsif ($env{'form.roletype'} eq 'course') {
                  ($env{'form.roletype'} eq 'community')) {  
   
             my $coursefilter = $env{'form.coursepick'};              my $coursefilter = $env{'form.coursepick'};
             if ($env{'form.roletype'} eq 'course') {              if ($coursefilter eq 'category') {
                 if ($coursefilter eq 'category') {                  my $instcode = &instcode_from_coursefilter();
                     my $instcode = &instcode_from_coursefilter();                  if ($instcode eq '.') {
                     if ($instcode eq '.') {  
                         $description .= &mt('All courses in domain').' - ';  
                     } else {  
                         $description .= &mt('Courses in domain with institutional code: [_1]',$instcode).' - ';  
                     }  
                 } elsif ($coursefilter eq 'selected') {  
                     $description .= &mt('Selected courses in domain').' - ';  
                 } elsif ($coursefilter eq 'all') {  
                     $description .= &mt('All courses in domain').' - ';                      $description .= &mt('All courses in domain').' - ';
                   } else {
                       $description .= &mt('Courses in domain with institutional code: [_1]',$instcode).' - ';
                 }                  }
             } elsif ($env{'form.roletype'} eq 'community') {              } elsif ($coursefilter eq 'selected') {
                 if ($coursefilter eq 'selected') {                  $description .= &mt('Selected courses in domain').' - ';
                     $description .= &mt('Selected communities in domain').' - ';              } elsif ($coursefilter eq 'all') {
                 } elsif ($coursefilter eq 'all') {                  $description .= &mt('All courses in domain').' - ';
                     $description .= &mt('All communities in domain').' - ';  
                 }  
             }              }
             if ($statusmode eq 'Expired') {              if ($statusmode eq 'Expired') {
                 $description .= &mt('users with expired [_1] roles',$showfilter);                  $description .= &mt('users with expired [_1] roles',$showfilter);
Line 3535  sub viewable_section { Line 3324  sub viewable_section {
 #################################################  #################################################
 #################################################  #################################################
 sub show_drop_list {  sub show_drop_list {
     my ($r,$classlist,$nosort,$permission,$crstype) = @_;      my ($r,$classlist,$nosort,$permission) = @_;
     my $cid = $env{'request.course.id'};      my $cid = $env{'request.course.id'};
     my ($cnum,$cdom) = &get_course_identity($cid);      my ($cnum,$cdom) = &get_course_identity($cid);
     if (! exists($env{'form.sortby'})) {      if (! exists($env{'form.sortby'})) {
Line 3581  END Line 3370  END
         }          }
     }      }
     if (!$studentcount) {      if (!$studentcount) {
         if ($crstype eq 'Community') {          $r->print(&mt('There are no students to drop.'));
             $r->print(&mt('There are no members to drop.'));  
         } else {  
             $r->print(&mt('There are no students to drop.'));  
         }  
         return;          return;
     }      }
     my ($classgroups) = &Apache::loncoursedata::get_group_memberships(      my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
Line 3593  END Line 3378  END
     my %lt=&Apache::lonlocal::texthash('usrn'   => "username",      my %lt=&Apache::lonlocal::texthash('usrn'   => "username",
                                        'dom'    => "domain",                                         'dom'    => "domain",
                                        'sn'     => "student name",                                         'sn'     => "student name",
                                        'mn'     => "member name",  
                                        'sec'    => "section",                                         'sec'    => "section",
                                        'start'  => "start date",                                         'start'  => "start date",
                                        'end'    => "end date",                                         'end'    => "end date",
                                        'groups' => "active groups",                                         'groups' => "active groups",
                                       );                                        );
     my $nametitle = $lt{'sn'};  
     if ($crstype eq 'Community') {  
         $nametitle = $lt{'mn'};  
     }  
     if ($nosort) {      if ($nosort) {
         $r->print(&Apache::loncommon::start_data_table().          $r->print(&Apache::loncommon::start_data_table().
                   &Apache::loncommon::start_data_table_header_row());                    &Apache::loncommon::start_data_table_header_row());
Line 3611  END Line 3391  END
     <th>$lt{'usrn'}</th>      <th>$lt{'usrn'}</th>
     <th>$lt{'dom'}</th>      <th>$lt{'dom'}</th>
     <th>ID</th>      <th>ID</th>
     <th>$nametitle</th>      <th>$lt{'sn'}</th>
     <th>$lt{'sec'}</th>      <th>$lt{'sec'}</th>
     <th>$lt{'start'}</th>      <th>$lt{'start'}</th>
     <th>$lt{'end'}</th>      <th>$lt{'end'}</th>
Line 3630  END Line 3410  END
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=id">ID</a>         <a href="/adm/createuser?action=$action&sortby=id">ID</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=fullname">$nametitle</a>         <a href="/adm/createuser?action=$action&sortby=fullname">$lt{'sn'}</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=section">$lt{'sec'}</a>         <a href="/adm/createuser?action=$action&sortby=section">$lt{'sec'}</a>
     </th><th>      </th><th>
Line 3700  END Line 3480  END
     $r->print(&Apache::loncommon::end_data_table().'<br />');      $r->print(&Apache::loncommon::end_data_table().'<br />');
     %lt=&Apache::lonlocal::texthash(      %lt=&Apache::lonlocal::texthash(
                        'dp'   => "Drop Students",                         'dp'   => "Drop Students",
                        'dm'   => "Drop Members",  
                        'ca'   => "check all",                         'ca'   => "check all",
                        'ua'   => "uncheck all",                         'ua'   => "uncheck all",
                                        );                                         );
     my $btn = $lt{'dp'};  
     if ($crstype eq 'Community') {  
         $btn = $lt{'dm'};   
     }  
     $r->print(<<"END");      $r->print(<<"END");
 </p>  </p>
 <p>  <p>
Line 3715  END Line 3490  END
 <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)" />  <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)" />
 </p>  </p>
 <p>  <p>
 <input type="submit" value="$btn" />  <input type="submit" value="$lt{'dp'}" />
 </p>  </p>
 END  END
     return;      return;
Line 3729  sub print_first_users_upload_form { Line 3504  sub print_first_users_upload_form {
     my $str;      my $str;
     $str  = '<input type="hidden" name="phase" value="two" />';      $str  = '<input type="hidden" name="phase" value="two" />';
     $str .= '<input type="hidden" name="action" value="upload" />';      $str .= '<input type="hidden" name="action" value="upload" />';
     $str .= '<input type="hidden" name="state"  value="got_file" />';      $str .= '<input type="hidden"   name="state"  value="got_file" />';
   
     $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n";      $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n";
   
     # Excel and CSV Help      # Excel and CSV Help
     $str .= '<div class="LC_left_float">'      $str .= '<p>'
            .&Apache::loncommon::help_open_topic("Course_Create_Class_List",             .&Apache::loncommon::help_open_topic("Course_Create_Class_List",
                 &mt("How do I create a users list from a spreadsheet"))                  &mt("How do I create a users list from a spreadsheet"))
            .'</div><div class="LC_left_float">'."\n"             ."<br />\n"
            .&Apache::loncommon::help_open_topic("Course_Convert_To_CSV",             .&Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
                 &mt("How do I create a CSV file from a spreadsheet"))                  &mt("How do I create a CSV file from a spreadsheet"))
            .'</div><br clear="all" />'."\n";             ."</p>\n";
   
     $str .= &Apache::lonhtmlcommon::start_pick_box()      $str .= &Apache::lonhtmlcommon::start_pick_box()
            .&Apache::lonhtmlcommon::row_title(&mt('File'))             .&Apache::lonhtmlcommon::row_title(&mt('File'))
              .'<p class="LC_info">'."\n"
              .&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.')."\n"
              .'</p>'."\n"
            .&Apache::loncommon::upfile_select_html()             .&Apache::loncommon::upfile_select_html()
            .&Apache::lonhtmlcommon::row_closure()             .&Apache::lonhtmlcommon::row_closure()
            .&Apache::lonhtmlcommon::row_title(             .&Apache::lonhtmlcommon::row_title(
Line 3757  sub print_first_users_upload_form { Line 3536  sub print_first_users_upload_form {
            .'<input type="submit" name="fileupload" value="'.&mt('Next').'" />'             .'<input type="submit" name="fileupload" value="'.&mt('Next').'" />'
            .'</p>';             .'</p>';
   
       $str .= &Apache::loncommon::end_page();
   
     $r->print($str);      $r->print($str);
     return;      return;
 }  }
Line 3803  sub upfile_drop_add { Line 3584  sub upfile_drop_add {
                                                 'domain_choice' => 'scalar',                                                  'domain_choice' => 'scalar',
                                                 'inststatus_choice' => 'scalar'});                                                  'inststatus_choice' => 'scalar'});
     #      #
     my ($cid,$crstype,$setting);  
     if ($context eq 'domain') {  
         $setting = $env{'form.roleaction'};  
     }  
     if ($env{'request.course.id'} ne '') {  
         $cid = $env{'request.course.id'};  
         $crstype = &Apache::loncommon::course_type();  
     } elsif ($setting eq 'course') {  
         if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) {  
             $cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'};  
             $crstype = &Apache::loncommon::course_type($cid);  
         }  
     }  
     my ($startdate,$enddate) = &get_dates_from_form();      my ($startdate,$enddate) = &get_dates_from_form();
     if ($env{'form.makedatesdefault'}) {      if ($env{'form.makedatesdefault'}) {
         $r->print(&make_dates_default($startdate,$enddate,$context,$crstype));          $r->print(&make_dates_default($startdate,$enddate,$context));
     }      }
     # Determine domain and desired host (home server)      # Determine domain and desired host (home server)
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
Line 3870  sub upfile_drop_add { Line 3638  sub upfile_drop_add {
             $amode = ''; # This causes the loop below to be skipped              $amode = ''; # This causes the loop below to be skipped
         }          }
     }      }
     my ($defaultsec,$defaultrole);      my ($cid,$defaultsec,$defaultrole,$setting);
     if ($context eq 'domain') {      if ($context eq 'domain') {
           $setting = $env{'form.roleaction'};
         if ($setting eq 'domain') {          if ($setting eq 'domain') {
             $defaultrole = $env{'form.defaultrole'};              $defaultrole = $env{'form.defaultrole'};
         } elsif ($setting eq 'course') {          } elsif ($setting eq 'course') {
             $defaultrole = $env{'form.courserole'};              $defaultrole = $env{'form.courserole'};
             $defaultsec = $env{'form.sections'};              $defaultsec = $env{'form.sections'};
         }          }  
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         $defaultrole = $env{'form.defaultrole'};          $defaultrole = $env{'form.defaultrole'};
     } elsif ($context eq 'course') {      } elsif ($context eq 'course') {
         $defaultrole = $env{'form.defaultrole'};          $defaultrole = $env{'form.defaultrole'};
         $defaultsec = $env{'form.sections'};          $defaultsec = $env{'form.sections'};
     }      }
       if ($env{'request.course.id'} ne '') {
           $cid = $env{'request.course.id'};
       } elsif ($setting eq 'course') {
           if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) {
               $cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'};
           }
       }
     # Check to see if user information can be changed      # Check to see if user information can be changed
     my @userinfo = ('firstname','middlename','lastname','generation',      my @userinfo = ('firstname','middlename','lastname','generation',
                     'permanentemail','id');                      'permanentemail','id');
Line 3896  sub upfile_drop_add { Line 3672  sub upfile_drop_add {
     }      }
     my (%userlist,%modifiable_fields,@poss_roles);      my (%userlist,%modifiable_fields,@poss_roles);
     my $secidx = &Apache::loncoursedata::CL_SECTION();      my $secidx = &Apache::loncoursedata::CL_SECTION();
     my @courseroles = &roles_by_context('course',1,$crstype);      my @courseroles = &roles_by_context('course',1);
     if (!&Apache::lonnet::allowed('mau',$domain)) {      if (!&Apache::lonnet::allowed('mau',$domain)) {
         if ($context eq 'course' || $context eq 'author') {          if ($context eq 'course' || $context eq 'author') {
             @poss_roles =  &curr_role_permissions($context,'','',$crstype);              @poss_roles =  &curr_role_permissions($context);
             my @statuses = ('active','future');              my @statuses = ('active','future');
             my ($indexhash,$keylist) = &make_keylist_array();              my ($indexhash,$keylist) = &make_keylist_array();
             my %info;              my %info;
Line 3984  sub upfile_drop_add { Line 3760  sub upfile_drop_add {
                 $r->print($groupwarn.'<br />');                  $r->print($groupwarn.'<br />');
             }              }
         }          }
         my (%curr_rules,%got_rules,%alerts,%cancreate);          my (%curr_rules,%got_rules,%alerts);
         my %customroles = &my_custom_roles($crstype);          my %customroles = &my_custom_roles();
         my @permitted_roles =           my @permitted_roles = &roles_on_upload($context,$setting,%customroles); 
             &roles_on_upload($context,$setting,$crstype,%customroles);   
         my %longtypes = &Apache::lonlocal::texthash(  
                             official   => 'Institutional',  
                             unofficial => 'Non-institutional',  
                         );  
         map { $cancreate{$_} = &can_create_user($domain,$context,$_); } keys(%longtypes);  
         # Get new users list          # Get new users list
         foreach my $line (@userdata) {          foreach my $line (@userdata) {
             my @secs;              my @secs;
             my %entries=&Apache::loncommon::record_sep($line);              my %entries=&Apache::loncommon::record_sep($line);
             # Determine user name              # Determine user name
             $entries{$fields{'username'}} =~ s/^\s+|\s+$//g;  
             unless (($entries{$fields{'username'}} eq '') ||              unless (($entries{$fields{'username'}} eq '') ||
                     (!defined($entries{$fields{'username'}}))) {                      (!defined($entries{$fields{'username'}}))) {
                 my ($fname, $mname, $lname,$gen) = ('','','','');                  my ($fname, $mname, $lname,$gen) = ('','','','');
Line 4021  sub upfile_drop_add { Line 3790  sub upfile_drop_add {
                 }                  }
                 if ($entries{$fields{'username'}}                  if ($entries{$fields{'username'}}
                     ne &LONCAPA::clean_username($entries{$fields{'username'}})) {                      ne &LONCAPA::clean_username($entries{$fields{'username'}})) {
                     my $nowhitespace;  
                     if ($entries{$fields{'username'}} =~ /\s/) {  
                         $nowhitespace = ' - '.&mt('usernames may not contain spaces.');  
                     }  
                     $r->print('<br />'.                      $r->print('<br />'.
       &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]',        &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]',
           '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen).            '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen));
                               $nowhitespace);  
                     next;                      next;
                 } else {                  } else {
                     $entries{$fields{'domain'}} =~ s/^\s+|\s+$//g;  
                     if ($entries{$fields{'domain'}}                       if ($entries{$fields{'domain'}} 
                         ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) {                          ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) {
                         $r->print('<br />'. '<b>'.$entries{$fields{'domain'}}.                          $r->print('<br />'. '<b>'.$entries{$fields{'domain'}}.
Line 4090  sub upfile_drop_add { Line 3853  sub upfile_drop_add {
                     # determine email address                      # determine email address
                     my $email='';                      my $email='';
                     if (defined($fields{'email'})) {                      if (defined($fields{'email'})) {
                         $entries{$fields{'email'}} =~ s/^\s+|\s+$//g;  
                         if (defined($entries{$fields{'email'}})) {                          if (defined($entries{$fields{'email'}})) {
                             $email=$entries{$fields{'email'}};                              $email=$entries{$fields{'email'}};
                             unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }                              unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }
Line 4137  sub upfile_drop_add { Line 3899  sub upfile_drop_add {
                         $role = $defaultrole;                          $role = $defaultrole;
                     }                      }
                     # Clean up whitespace                      # Clean up whitespace
                     foreach (\$id,\$fname,\$mname,\$lname,\$gen,\$inststatus) {                      foreach (\$id,\$fname,\$mname,\$lname,\$gen) {
                         $$_ =~ s/(\s+$|^\s+)//g;                          $$_ =~ s/(\s+$|^\s+)//g;
                     }                      }
                     # check against rules                      # check against rules
Line 4146  sub upfile_drop_add { Line 3908  sub upfile_drop_add {
                     my (%rulematch,%inst_results,%idinst_results);                      my (%rulematch,%inst_results,%idinst_results);
                     my $uhome=&Apache::lonnet::homeserver($username,$userdomain);                      my $uhome=&Apache::lonnet::homeserver($username,$userdomain);
                     if ($uhome eq 'no_host') {                      if ($uhome eq 'no_host') {
                         if ($userdomain ne $domain) {                          next if ($userdomain ne $domain);
                             $r->print('<br />'.  
                                 &mt('[_1]: The domain specified ([_2]) is different to that of the course.',  
                                     '<b>'.$username.'</b>',$userdomain).'<br />'.  
                                 &mt('The user does not already exist, and you may not create a new user in a different domain.'));  
                             next;  
                         }  
                         $checkid = 1;                          $checkid = 1;
                         $newuser = 1;                          $newuser = 1;
                         my $user = $username.':'.$domain;  
                         my $checkhash;                          my $checkhash;
                         my $checks = { 'username' => 1 };                          my $checks = { 'username' => 1 };
                         $checkhash->{$username.':'.$domain} = { 'newuser' => 1, };                          $checkhash->{$username.':'.$domain} = { 'newuser' => 1, };
Line 4164  sub upfile_drop_add { Line 3919  sub upfile_drop_add {
                             \%got_rules);                              \%got_rules);
                         if (ref($alerts{'username'}) eq 'HASH') {                          if (ref($alerts{'username'}) eq 'HASH') {
                             if (ref($alerts{'username'}{$domain}) eq 'HASH') {                              if (ref($alerts{'username'}{$domain}) eq 'HASH') {
                                 if ($alerts{'username'}{$domain}{$username}) {                                  next if ($alerts{'username'}{$domain}{$username});
                                     $r->print('<br />'.  
                                               &mt('[_1]: matches the username format at your institution, but is not known to your directory service.','<b>'.$username.'</b>').'<br />'.  
                                               &mt('Consequently, the user was not created.'));  
                                     next;  
                                 }  
                             }  
                         }  
                         my $usertype = 'unofficial';  
                         if (ref($rulematch{$user}) eq 'HASH') {  
                             if ($rulematch{$user}{'username'}) {  
                                 $usertype = 'official';  
                             }                              }
                         }                          }
                         unless ($cancreate{$usertype}) {  
                             my $showtype = $longtypes{$usertype};  
                             $r->print('<br />'.  
                                       &mt('[_1]: The user does not exist, and you are not permitted to create users of type: [_2].','<b>'.$username.'</b>',$showtype));  
                             next;  
                         }  
                     } else {                      } else {
                         if ($context eq 'course' || $context eq 'author') {                          if ($context eq 'course' || $context eq 'author') {
                             if ($userdomain eq $domain ) {                              if ($userdomain eq $domain ) {
Line 4234  sub upfile_drop_add { Line 3972  sub upfile_drop_add {
                                 \%got_rules);                                  \%got_rules);
                             if (ref($alerts{'id'}) eq 'HASH') {                              if (ref($alerts{'id'}) eq 'HASH') {
                                 if (ref($alerts{'id'}{$userdomain}) eq 'HASH') {                                  if (ref($alerts{'id'}{$userdomain}) eq 'HASH') {
                                     if ($alerts{'id'}{$userdomain}{$id}) {                                      next if ($alerts{'id'}{$userdomain}{$id});
                                         $r->print(&mt('[_1]: has a student/employee ID matching the format at your institution, but the ID is found by your directory service.',  
                                                   '<b>'.$username.'</b>').'<br />'.  
                                                   &mt('Consequently, the user was not created.'));  
                                         next;  
                                     }  
                                 }                                  }
                             }                              }
                         }                          }
Line 4271  sub upfile_drop_add { Line 4004  sub upfile_drop_add {
                                         $role = 'cr_'.$env{'user.domain'}.'_'.                                          $role = 'cr_'.$env{'user.domain'}.'_'.
                                                 $env{'user.name'}.'_'.$role;                                                  $env{'user.name'}.'_'.$role;
                                     }                                      }
                                     if (($role ne 'cc') && ($role ne 'co')) {                                      if ($role ne 'cc') { 
                                         if (@secs > 1) {                                          if (@secs > 1) {
                                             $multiple = 1;                                              $multiple = 1;
                                             foreach my $sec (@secs) {                                              foreach my $sec (@secs) {
Line 4334  sub upfile_drop_add { Line 4067  sub upfile_drop_add {
             }              }
         } # end of foreach (@userdata)          } # end of foreach (@userdata)
         # Flush the course logs so reverse user roles immediately updated          # Flush the course logs so reverse user roles immediately updated
         $r->register_cleanup(\&Apache::lonnet::flushcourselogs);          &Apache::lonnet::flushcourselogs();
         $r->print("</p>\n<p>\n".&mt('Processed [quant,_1,user].',$counts{'user'}).          $r->print("</p>\n<p>\n".&mt('Processed [quant,_1,user].',$counts{'user'}).
                   "</p>\n");                    "</p>\n");
         if ($counts{'role'} > 0) {          if ($counts{'role'} > 0) {
Line 4472  sub user_change_result { Line 4205  sub user_change_result {
   
 # ========================================================= Menu Phase Two Drop  # ========================================================= Menu Phase Two Drop
 sub print_drop_menu {  sub print_drop_menu {
     my ($r,$context,$permission,$crstype) = @_;      my ($r,$context,$permission) = @_;
     my $heading;      $r->print('<h3>'.&mt("Drop Students").'</h3>'."\n".
     if ($crstype eq 'Community') {  
         $heading = &mt("Drop Members");  
     } else {  
         $heading = &mt("Drop Students");  
     }  
     $r->print('<h3>'.$heading.'</h3>'."\n".  
               '<form name="studentform" method="post">'."\n");                '<form name="studentform" method="post">'."\n");
     my $classlist = &Apache::loncoursedata::get_classlist();      my $classlist = &Apache::loncoursedata::get_classlist();
     if (! defined($classlist)) {      if (! defined($classlist)) {
         if ($crstype eq 'Community') {          $r->print(&mt('There are no students currently enrolled.')."\n");
             $r->print(&mt('There are no members currently enrolled.')."\n");  
         } else {  
             $r->print(&mt('There are no students currently enrolled.')."\n");  
         }  
     } else {      } else {
         &show_drop_list($r,$classlist,'nosort',$permission,$crstype);          &show_drop_list($r,$classlist,'nosort',$permission);
     }      }
     $r->print('</form>'. &Apache::loncommon::end_page());      $r->print('</form>'. &Apache::loncommon::end_page());
     return;      return;
Line 4498  sub print_drop_menu { Line 4221  sub print_drop_menu {
 # ================================================================== Phase four  # ================================================================== Phase four
   
 sub update_user_list {  sub update_user_list {
     my ($r,$context,$setting,$choice,$crstype) = @_;      my ($r,$context,$setting,$choice) = @_;
     my $now = time;      my $now = time;
     my $count=0;      my $count=0;
     if ($context eq 'course') {  
         $crstype = &Apache::loncommon::course_type();  
     }  
     my @changelist;      my @changelist;
     if ($choice eq 'drop') {      if ($choice eq 'drop') {
         @changelist = &Apache::loncommon::get_env_multiple('form.droplist');          @changelist = &Apache::loncommon::get_env_multiple('form.droplist');
Line 4515  sub update_user_list { Line 4235  sub update_user_list {
                                    'reenable' => 'Re-enabled',                                     'reenable' => 'Re-enabled',
                                    'activate' => 'Activated',                                     'activate' => 'Activated',
                                    'chgdates' => 'Changed Access Dates for',                                     'chgdates' => 'Changed Access Dates for',
                                    'chgsec'   => 'Changed section(s) for',                                     'chgsec'   => 'Changed section for',
                                    'drop'     => 'Dropped',                                     'drop'     => 'Dropped',
                                  },                                   },
                         error => {'revoke'    => 'revoking',                          error => {'revoke'    => 'revoking',
Line 4532  sub update_user_list { Line 4252  sub update_user_list {
         ($startdate,$enddate) = &get_dates_from_form();          ($startdate,$enddate) = &get_dates_from_form();
     }      }
     foreach my $item (@changelist) {      foreach my $item (@changelist) {
         my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype,          my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype,@sections,
             @sections,$scopestem,$singlesec,$showsecs,$warn_singlesec,              $scopestem);
             $nothingtodo,$keepnosection);  
         if ($choice eq 'drop') {          if ($choice eq 'drop') {
             ($uname,$udom,$sec) = split(/:/,$item,-1);              ($uname,$udom,$sec) = split(/:/,$item,-1);
             $role = 'st';              $role = 'st';
Line 4575  sub update_user_list { Line 4294  sub update_user_list {
                 }                  }
             }              }
         }          }
         my $plrole = &Apache::lonnet::plaintext($role,$crstype);          my $plrole = &Apache::lonnet::plaintext($role);
         my $start = $env{'form.'.$item.'_start'};          my $start = $env{'form.'.$item.'_start'};
         my $end = $env{'form.'.$item.'_end'};          my $end = $env{'form.'.$item.'_end'};
         if ($choice eq 'drop') {          if ($choice eq 'drop') {
Line 4632  sub update_user_list { Line 4351  sub update_user_list {
                 }                  }
             } elsif ($choice eq 'chgsec') {              } elsif ($choice eq 'chgsec') {
                 my (@newsecs,$revresult,$nochg,@retained);                  my (@newsecs,$revresult,$nochg,@retained);
                 if (($role ne 'cc') && ($role ne 'co')) {                  if ($role ne 'cc') {
                     my @secs = sort(split(/,/,$env{'form.newsecs'}));                      @newsecs = split(/,/,$env{'form.newsecs'});
                     if (@secs) {  
                         my %curr_groups = &Apache::longroup::coursegroups();  
                         foreach my $sec (@secs) {  
                             next if (($sec =~ /\W/) || ($sec eq 'none') ||  
                             (exists($curr_groups{$sec})));  
                             push(@newsecs,$sec);  
                         }  
                     }  
                 }                  }
                 # remove existing section if not to be retained.                     # remove existing section if not to be retained.   
                 if (!$env{'form.retainsec'} || ($role eq 'st')) {                  if (!$env{'form.retainsec'}) {
                     if ($sec eq '') {                      if ($sec eq '') {
                         if (@newsecs == 0) {                          if (@newsecs == 0) {
                             $result = 'ok';                              $result = &mt('No change in section assignment (none)');
                             $nochg = 1;                              $nochg = 1;
                             $nothingtodo = 1;  
                         } else {                          } else {
                             $revresult =                              $revresult =
                                 &Apache::lonnet::revokerole($udom,$uname,                                  &Apache::lonnet::revokerole($udom,$uname,
Line 4676  sub update_user_list { Line 4386  sub update_user_list {
                 } else {                  } else {
                     if ($sec eq '') {                      if ($sec eq '') {
                         $nochg = 1;                          $nochg = 1;
                         $keepnosection = 1;  
                     } else {                       } else { 
                         push(@retained,$sec);                          push(@retained,$sec);
                     }                      }
                 }                  }
                 # add new sections                  # add new sections
                 my (@diffs,@shownew);  
                 if (@retained) {  
                     @diffs = &Apache::loncommon::compare_arrays(\@retained,\@newsecs);  
                 } else {  
                     @diffs = @newsecs;  
                 }  
                 if (@newsecs == 0) {                  if (@newsecs == 0) {
                     if ($nochg) {                      if (!$nochg) {
                         $result = 'ok';  
                         $nothingtodo = 1;  
                     } else {  
                         if ($role eq 'st') {                          if ($role eq 'st') {
                             $result =                               $result = 
                                 &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context);                                  &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context);
Line 4701  sub update_user_list { Line 4401  sub update_user_list {
                             $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context);                              $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context);
                         }                          }
                     }                      }
                     $showsecs = &mt('No section');  
                 } elsif (@diffs == 0) {  
                     $result = 'ok';  
                     $nothingtodo = 1;  
                 } else {                  } else {
                     foreach my $newsec (@newsecs) {                       foreach my $newsec (@newsecs) { 
                         if (!grep(/^\Q$newsec\E$/,@retained)) {                          if (!grep(/^\Q$newsec\E$/,@retained)) {
                             if ($role eq 'st') {                              if ($role eq 'st') {
                                 $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context);                                  $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context);
                                 if (@newsecs > 1) {  
                                     my $showsingle;  
                                     if ($newsec eq '') {  
                                         $showsingle = &mt('No section');  
                                     } else {  
                                         $showsingle = $newsec;  
                                     }  
                                     if ($crstype eq 'Community') {  
                                         $warn_singlesec = &mt('Although more than one section was indicated, a role was only added for the first section - [_1], as each community member may only be in one section at a time.','<i>'.$showsingle.'</i>');  
                                     } else {  
                                         $warn_singlesec = &mt('Although more than one section was indicated, a role was only added for the first section - [_1], as each student may only be in one section of a course at a time.','<i>'.$showsingle.'</i>');  
                                     }  
                                     $showsecs = $showsingle;  
                                     last;  
                                 } else {  
                                     if ($newsec eq '') {  
                                         $showsecs = &mt('No section');  
                                     } else {  
                                         $showsecs = $newsec;  
                                     }  
                                 }  
                             } else {                              } else {
                                 my $newscope = $scopestem;                                  my $newscope = $scopestem;
                                 if ($newsec ne '') {                                  if ($newsec ne '') {
                                    $newscope .= '/'.$newsec;                                     $newscope .= '/'.$newsec;
                                    push(@shownew,$newsec);  
                                 }                                  }
                                 $result = &Apache::lonnet::assignrole($udom,$uname,                                  $result = &Apache::lonnet::assignrole($udom,$uname,
                                                         $newscope,$role,$end,$start);                                                          $newscope,$role,$end,$start);
Line 4743  sub update_user_list { Line 4417  sub update_user_list {
                         }                          }
                     }                      }
                 }                  }
                 unless ($role eq 'st') {  
                     unless ($showsecs) {  
                         my @tolist = sort(@shownew,@retained);  
                         if ($keepnosection) {  
                             push(@tolist,&mt('No section'));  
                         }  
                         $showsecs = join(', ',@tolist);  
                     }  
                 }  
             }              }
         }          }
         my $extent = $scope;          my $extent = $scope;
Line 4762  sub update_user_list { Line 4427  sub update_user_list {
             }              }
         }          }
         if ($result eq 'ok' || $result eq 'ok:') {          if ($result eq 'ok' || $result eq 'ok:') {
             my $dates;              $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for [_3]",
             if (($choice eq 'chgsec') || ($choice eq 'chgdates')) {                            $plrole,$extent,$uname.':'.$udom).'<br />');
                 $dates = &dates_feedback($start,$end,$now);              $count++;
             }  
             if ($choice eq 'chgsec') {  
                 if ($nothingtodo) {  
                     $r->print(&mt("Section assignment for role of '[_1]' in [_2] for '[_3]' unchanged.",$plrole,$extent,'<i>'.  
                           &Apache::loncommon::plainname($uname,$udom).  
                           '</i>').' ');  
                     if ($sec eq '') {  
                         $r->print(&mt('[_1]No section[_2] - [_3]','<b>','</b>',$dates));  
                     } else {  
                         $r->print(&mt('Section(s): [_1] - [_2]',  
                                       '<b>'.$showsecs.'</b>',$dates));  
                     }  
                     $r->print('<br />');  
                 } else {  
                     $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for '[_3]' to [_4] - [_5]",$plrole,$extent,  
                         '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>',  
                         '<b>'.$showsecs.'</b>',$dates).'<br />');  
                    $count ++;  
                }  
                if ($warn_singlesec) {  
                    $r->print('<div class="LC_warning">'.$warn_singlesec.'</div>');  
                }  
             } elsif ($choice eq 'chgdates') {  
                 $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for '[_3]' - [_4]",$plrole,$extent,  
                       '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>',  
                       $dates).'<br />');  
                $count ++;  
             } else {  
                 $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for '[_3]'.",$plrole,$extent,  
                       '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>').  
                           '<br />');  
                 $count ++;  
             }  
         } else {          } else {
             $r->print(              $r->print(
                 &mt("Error $result_text{'error'}{$choice} [_1] in [_2] for '[_3]': [_4].",                  &mt("Error $result_text{'error'}{$choice} [_1] in [_2] for [_3]: [_4].",
                     $plrole,$extent,                      $plrole,$extent,$uname.':'.$udom,$result).'<br />');
                     '<i>'.&Apache::loncommon::plainname($uname,$udom).'</i>',  
                     $result).'<br />');  
         }          }
     }      }
     $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n");      $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n");
Line 4819  sub update_user_list { Line 4449  sub update_user_list {
             }              }
         }          }
     }      }
     $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} for [quant,_1,user role,user roles,no user roles].",$count).'</b></p>');      $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,no users].",$count).'</b></p>');
     if ($count > 0) {      if ($count > 0) {
         if ($choice eq 'revoke' || $choice eq 'drop') {          if ($choice eq 'revoke' || $choice eq 'drop') {
             $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>');              $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>');
         }          }
         # Flush the course logs so reverse user roles immediately updated          # Flush the course logs so reverse user roles immediately updated
         $r->register_cleanup(\&Apache::lonnet::flushcourselogs);          &Apache::lonnet::flushcourselogs();
     }      }
     if ($env{'form.makedatesdefault'}) {      if ($env{'form.makedatesdefault'}) {
         if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') {          if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') {
             $r->print(&make_dates_default($startdate,$enddate,$context,$crstype));              $r->print(&make_dates_default($startdate,$enddate,$context));
         }          }
     }      }
     my $linktext = &mt('Display User Lists');      my $linktext = &mt('Display User Lists');
Line 4839  sub update_user_list { Line 4469  sub update_user_list {
     $r->print('<a href="javascript:document.studentform.submit()">'.$linktext.'</a></form>'."\n");      $r->print('<a href="javascript:document.studentform.submit()">'.$linktext.'</a></form>'."\n");
 }  }
   
 sub dates_feedback {  
     my ($start,$end,$now) = @_;  
     my $dates;  
     if ($start < $now) {  
         if ($end == 0) {  
             $dates .= &mt('role(s) active now; no end date');  
         } elsif ($end > $now) {  
             $dates = &mt('role(s) active now; ends [_1].',&Apache::lonlocal::locallocaltime($end));  
         } else {  
             $dates = &mt('role(s) expired: [_1].',&Apache::lonlocal::locallocaltime($end));  
         }  
      } else {  
         if ($end == 0 || $end > $now) {  
             $dates = &mt('future role(s); starts: [_1].',&Apache::lonlocal::locallocaltime($start));  
         } else {  
             $dates = &mt('role(s) expired: [_1].',&Apache::lonlocal::locallocaltime($end));  
         }  
     }  
     return $dates;  
 }  
   
 sub classlist_drop {  sub classlist_drop {
     my ($scope,$uname,$udom,$now) = @_;      my ($scope,$uname,$udom,$now) = @_;
     my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});      my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});
Line 4997  sub get_groupslist { Line 4606  sub get_groupslist {
 }  }
   
 sub setsections_javascript {  sub setsections_javascript {
     my ($formname,$groupslist,$mode,$checkauth,$crstype) = @_;      my ($formname,$groupslist,$mode,$checkauth) = @_;
     my ($checkincluded,$finish,$rolecode,$setsection_js);      my ($checkincluded,$finish,$rolecode,$setsection_js);
     if ($mode eq 'upload') {      if ($mode eq 'upload') {
         $checkincluded = 'formname.name == "'.$formname.'"';          $checkincluded = 'formname.name == "'.$formname.'"';
Line 5036  sub setsections_javascript { Line 4645  sub setsections_javascript {
     }      }
     my %alerts = &Apache::lonlocal::texthash(      my %alerts = &Apache::lonlocal::texthash(
                     secd => 'Section designations do not apply to Course Coordinator roles.',                      secd => 'Section designations do not apply to Course Coordinator roles.',
                     sedn => 'Section designations do not apply to Coordinator roles.',  
                     accr => 'A course coordinator role will be added with access to all sections.',                      accr => 'A course coordinator role will be added with access to all sections.',
                     acor => 'A coordinator role will be added with access to all sections',  
                     inea => 'In each course, each user may only have one student role at a time.',                      inea => 'In each course, each user may only have one student role at a time.',
                     inco => 'In each community, each user may only have one member role at a time.',  
                     youh => 'You had selected ',                      youh => 'You had selected ',
                     secs => 'sections.',                      secs => 'sections.',
                     plmo => 'Please modify your selections so they include no more than one section.',                      plmo => 'Please modify your selections so they include no more than one section.',
Line 5048  sub setsections_javascript { Line 4654  sub setsections_javascript {
                     plch => 'Please choose a different section name.',                      plch => 'Please choose a different section name.',
                     mnot => 'may not be used as a section name, as it is the name of a course group.',                      mnot => 'may not be used as a section name, as it is the name of a course group.',
                     secn => 'Section names and group names must be distinct. Please choose a different section name.',                      secn => 'Section names and group names must be distinct. Please choose a different section name.',
                     nonw => 'Section names may only contain letters or numbers.',  
                  );                                   );                
     $setsection_js .= <<"ENDSECCODE";      $setsection_js .= <<"ENDSECCODE";
   
 function setSections(formname,crstype) {  function setSections(formname) {
     var re1 = /^currsec_/;      var re1 = /^currsec_/;
     var re2 =/\\W/;  
     var trimleading = /^\\s+/;  
     var trimtrailing = /\\s+\$/;  
     var groups = new Array($groupslist);      var groups = new Array($groupslist);
     for (var i=0;i<formname.elements.length;i++) {      for (var i=0;i<formname.elements.length;i++) {
         var str = formname.elements[i].name;          var str = formname.elements[i].name;
         var checkcurr = str.match(re1);          var checkcurr = str.match(re1);
         if (checkcurr != null) {          if (checkcurr != null) {
             var num = i;  
             if ($checkincluded) {              if ($checkincluded) {
                 $rolecode                  $rolecode
                 if (role == 'cc' || role == 'co') {                  if (role == 'cc') {
                     if (role == 'cc') {                      alert("$alerts{'secd'}\\n$alerts{'accr'}");
                         alert("$alerts{'secd'}\\n$alerts{'accr'}");                  }
                     } else {                  else {
                         alert("$alerts{'sedn'}\\n$alerts{'acor'}");  
                     }  
                 } else {  
                     var sections = '';                      var sections = '';
                     var numsec = 0;                      var numsec = 0;
                     var fromexisting = new Array();                      var sections;
                     for (var j=0; j<formname.elements[num].length; j++) {                      for (var j=0; j<formname.elements[i].length; j++) {
                         if (formname.elements[num].options[j].selected == true ) {                          if (formname.elements[i].options[j].selected == true ) {
                             var addsec = formname.elements[num].options[j].value;                              if (formname.elements[i].options[j].value != "") {
                             if ((addsec != "") && (addsec != null)) {  
                                 fromexisting.push(addsec);  
                                 if (numsec == 0) {                                  if (numsec == 0) {
                                     sections = addsec;                                      if (formname.elements[i].options[j].value != "") {
                                 } else {                                          sections = formname.elements[i].options[j].value;
                                     sections = sections + "," +  addsec;                                          numsec ++;
                                 }  
                                 numsec ++;  
                             }  
                         }  
                     }  
                     var newsecs = formname.elements[num+1].value;  
                     var validsecs = new Array();  
                     var validsecstr = '';  
                     var badsecs = new Array();  
                     if (newsecs != null && newsecs != "") {  
                         var numsplit;  
                         if (newsecs.indexOf(',') == -1) {  
                             numsplit = new Array(newsecs);  
                         } else {  
                             numsplit = newsecs.split(/,/g);  
                         }  
                         for (var m=0; m<numsplit.length; m++) {  
                             var newsec = numsplit[m];  
                             newsec = newsec.replace(trimleading,'');  
                             newsec = newsec.replace(trimtrailing,'');  
                             if (re2.test(newsec) == true) {  
                                 badsecs.push(newsec);  
                             } else {  
                                 if (newsec != '') {  
                                     var isnew = 1;  
                                     if (fromexisting != null) {  
                                         for (var n=0; n<fromexisting.length; n++) {  
                                             if (newsec == fromexisting[n]) {  
                                                 isnew = 0;  
                                             }  
                                         }  
                                     }  
                                     if (isnew == 1) {  
                                         validsecs.push(newsec);  
                                     }                                      }
                                 }                                  }
                                   else {
                                       sections = sections + "," +  formname.elements[i].options[j].value
                                       numsec ++;
                                   }
                             }                              }
                         }                          }
                         if (badsecs.length > 0) {                      }
                             alert("$alerts{'nonw'}\\n$alerts{'plch'}");                      if (numsec > 0) {
                             return;                          if (formname.elements[i+1].value != "" && formname.elements[i+1].value != null) {
                               sections = sections + "," +  formname.elements[i+1].value;
                         }                          }
                         numsec = numsec + validsecs.length;  
                     }                      }
                       else {
                           sections = formname.elements[i+1].value;
                       }
                       var newsecs = formname.elements[i+1].value;
                       var numsplit;
                       if (newsecs != null && newsecs != "") {
                           numsplit = newsecs.split(/,/g);
                           numsec = numsec + numsplit.length;
                       }
   
                     if ((role == 'st') && (numsec > 1)) {                      if ((role == 'st') && (numsec > 1)) {
                         if (crstype == 'Community') {                          alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}")
                             alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");  
                         } else {  
                             alert("$alerts{'inco'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");  
                         }  
                         return;                          return;
                     } else {                      }
                         if (validsecs != null) {                      else {
                             for (var j=0; j<validsecs.length; j++) {                          if (numsplit != null) {
                                 if (validsecstr == '' || validsecstr == null) {                              for (var j=0; j<numsplit.length; j++) {
                                     validsecstr = validsecs[j];                                  if ((numsplit[j] == 'all') ||
                                 } else {                                      (numsplit[j] == 'none')) {
                                     validsecstr += ','+validsecs[j];                                      alert("'"+numsplit[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");
                                 }  
                                 if ((validsecs[j] == 'all') ||  
                                     (validsecs[j] == 'none')) {  
                                     alert("'"+validsecs[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");  
                                     return;                                      return;
                                 }                                  }
                                 for (var k=0; k<groups.length; k++) {                                  for (var k=0; k<groups.length; k++) {
                                     if (validsecs[j] == groups[k]) {                                      if (numsplit[j] == groups[k]) {
                                         alert("'"+validsecs[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");                                          alert("'"+numsplit[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");
                                         return;                                          return;
                                     }                                      }
                                 }                                  }
                             }                              }
                         }                          }
                           formname.elements[i+2].value = sections;
                     }                      }
                     if ((validsecstr != '') && (validsecstr != null)) {  
                         if ((sections == '') || (sections == null)) {  
                             sections = validsecstr;  
                         } else {  
                             sections = sections + "," + validsecstr;  
                         }  
                     }  
                     formname.elements[num+2].value = sections;  
                 }                  }
             }              }
         }          }
Line 5184  sub can_create_user { Line 4745  sub can_create_user {
     }      }
     if (ref($domconf{'usercreation'}) eq 'HASH') {      if (ref($domconf{'usercreation'}) eq 'HASH') {
         if (ref($domconf{'usercreation'}{'cancreate'}) eq 'HASH') {          if (ref($domconf{'usercreation'}{'cancreate'}) eq 'HASH') {
             if ($context eq 'course' || $context eq 'author' || $context eq 'requestcrs') {              if ($context eq 'course' || $context eq 'author') {
                 my $creation = $domconf{'usercreation'}{'cancreate'}{$context};                  my $creation = $domconf{'usercreation'}{'cancreate'}{$context};
                 if ($creation eq 'none') {                  if ($creation eq 'none') {
                     $cancreate = 0;                      $cancreate = 0;
Line 5282  sub check_usertype { Line 4843  sub check_usertype {
 }  }
   
 sub roles_by_context {  sub roles_by_context {
     my ($context,$custom,$crstype) = @_;      my ($context,$custom) = @_;
     my @allroles;      my @allroles;
     if ($context eq 'course') {      if ($context eq 'course') {
         @allroles = ('st');          @allroles = ('st','ad','ta','ep','in','cc');
         if ($env{'request.role'} =~ m{^dc\./}) {  
             push(@allroles,'ad');  
         }  
         push(@allroles,('ta','ep','in'));  
         if ($crstype eq 'Community') {  
             push(@allroles,'co');  
         } else {  
             push(@allroles,'cc');  
         }  
         if ($custom) {          if ($custom) {
             push(@allroles,'cr');              push(@allroles,'cr');
         }          }
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         @allroles = ('ca','aa');          @allroles = ('ca','aa');
     } elsif ($context eq 'domain') {      } elsif ($context eq 'domain') {
         @allroles = ('li','ad','dg','sc','au','dc');          @allroles = ('li','dg','sc','au','dc');
     }      }
     return @allroles;      return @allroles;
 }  }
   
 sub get_permission {  sub get_permission {
     my ($context,$crstype) = @_;      my ($context,$roles) = @_;
     my %permission;      my %permission;
     if ($context eq 'course') {      if ($context eq 'course') {
         my $custom = 1;          my $custom = 1;
         my @allroles = &roles_by_context($context,$custom,$crstype);          my @allroles = &roles_by_context($context,$custom);
         foreach my $role (@allroles) {          foreach my $role (@allroles) {
             if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {              if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
                 $permission{'cusr'} = 1;                  $permission{'cusr'} = 1;
Line 5380  sub authorpriv { Line 4932  sub authorpriv {
 }  }
   
 sub roles_on_upload {  sub roles_on_upload {
     my ($context,$setting,$crstype,%customroles) = @_;      my ($context,$setting,%customroles) = @_;
     my (@possible_roles,@permitted_roles);      my (@possible_roles,@permitted_roles);
     @possible_roles = &curr_role_permissions($context,$setting,1,$crstype);      @possible_roles = &curr_role_permissions($context,$setting,1);
     foreach my $role (@possible_roles) {      foreach my $role (@possible_roles) {
         if ($role eq 'cr') {          if ($role eq 'cr') {
             push(@permitted_roles,keys(%customroles));              push(@permitted_roles,keys(%customroles));
Line 5418  sub dc_setcourse_js { Line 4970  sub dc_setcourse_js {
     my ($formname,$mode,$context) = @_;      my ($formname,$mode,$context) = @_;
     my ($dc_setcourse_code,$authen_check);      my ($dc_setcourse_code,$authen_check);
     my $cctext = &Apache::lonnet::plaintext('cc');      my $cctext = &Apache::lonnet::plaintext('cc');
     my $cotext = &Apache::lonnet::plaintext('co');  
     my %alerts = &sectioncheck_alerts();      my %alerts = &sectioncheck_alerts();
     my $role = 'role';      my $role = 'role';
     if ($mode eq 'upload') {      if ($mode eq 'upload') {
Line 5465  function setCourse() { Line 5016  function setCourse() {
             numsections = numsections + newsecs.length;              numsections = numsections + newsecs.length;
         }          }
         if ((userrole == 'st') && (numsections > 1)) {          if ((userrole == 'st') && (numsections > 1)) {
             if (document.$formname.crstype.value == 'Community') {              alert("$alerts{'inea'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.")
                 alert("$alerts{'inco'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.")  
             } else {  
                 alert("$alerts{'inea'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.")  
             }  
             return;              return;
         }          }
         for (var j=0; j<newsecs.length; j++) {          for (var j=0; j<newsecs.length; j++) {
Line 5481  function setCourse() { Line 5028  function setCourse() {
                 var groups = document.$formname.groups.value.split(/,/g);                  var groups = document.$formname.groups.value.split(/,/g);
                 for (var k=0; k<groups.length; k++) {                  for (var k=0; k<groups.length; k++) {
                     if (newsecs[j] == groups[k]) {                      if (newsecs[j] == groups[k]) {
                         if (document.$formname.crstype.value == 'Community') {                          alert("'"+newsecs[j]+"' $alerts{'mayt'}.\\n$alerts{'secn'}. $alerts{'plsc'}.");
                             alert("'"+newsecs[j]+"' $alerts{'mayc'}.\\n$alerts{'secn'}. $alerts{'plsc'}.");  
                         } else {  
                             alert("'"+newsecs[j]+"' $alerts{'mayt'}.\\n$alerts{'secn'}. $alerts{'plsc'}.");  
                         }  
                         return;                          return;
                     }                      }
                 }                  }
Line 5495  function setCourse() { Line 5038  function setCourse() {
             alert("$alerts{'secd'} $cctext $alerts{'role'}.\\n$alerts{'accr'}.");              alert("$alerts{'secd'} $cctext $alerts{'role'}.\\n$alerts{'accr'}.");
             section = "";              section = "";
         }          }
         if ((userrole == 'co') && (numsections > 0)) {  
             alert("$alerts{'secd'} $cotext $alerts{'role'}.\\n$alerts{'accr'}.");  
             section = "";  
         }  
 SCRIPTTOP  SCRIPTTOP
     if ($mode ne 'upload') {      if ($mode ne 'upload') {
         $dc_setcourse_code .= (<<"ENDSCRIPT");          $dc_setcourse_code .= (<<"ENDSCRIPT");
         var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole          var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole
         var numcourse = getIndex(document.$formname.dccourse);          var numcourse = getIndex(document.$formname.dccourse);
         if (numcourse == "-1") {          if (numcourse == "-1") {
             if (document.$formname.type == 'Community') {              alert("$alerts{'thwa'}");
                 alert("$alerts{'thwc'}");  
             } else {  
                 alert("$alerts{'thwa'}");  
             }  
             return;              return;
         }          }
         else {          else {
Line 5618  ENDSCRIPT Line 5153  ENDSCRIPT
   
 sub sectioncheck_alerts {  sub sectioncheck_alerts {
     my %alerts = &Apache::lonlocal::texthash(      my %alerts = &Apache::lonlocal::texthash(
                     curd => 'You must select a course or community in the current domain',                      curd => 'You must select a course in the current domain',
                     inea => 'In each course, each user may only have one student role at a time',                      inea => 'In each course, each user may only have one student role at a time',
                     inco => 'In each community, each user may only have one member role at a time',  
                     youh => 'You had selected',                      youh => 'You had selected',
                     sect => 'sections',                      sect => 'sections',
                     plsm => 'Please modify your selections so they include no more than one section',                      plsm => 'Please modify your selections so they include no more than one section',
                     mayn => 'may not be used as the name for a section, as it is a reserved word',                      mayn => 'may not be used as the name for a section, as it is a reserved word',
                     plsc => 'Please choose a different section name',                      plsc => 'Please choose a different section name',
                     mayt => 'may not be used as the name for a section, as it is the name of a course group',                      mayt => 'may not be used as the name for a section, as it is the name of a course group',
                     mayc => 'may not be used as the name for a section, as it is the name of a community group',  
                     secn => 'Section names and group names must be distinct',                      secn => 'Section names and group names must be distinct',
                     secd => 'Section designations do not apply to ',                      secd => 'Section designations do not apply to ',
                     role => 'roles',                      role => 'roles',
                     accr => 'role will be added with access to all sections',                      accr => 'role will be added with access to all sections',
                     thwa => 'There was a problem with your course selection',                      thwa => 'There was a problem with your course selection'
                     thwc => 'There was a problem with your community selection',  
                  );                   );
     return %alerts;      return %alerts;
 }  }

Removed from v.1.97.2.25  
changed lines
  Added in v.1.98


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