Diff for /loncom/interface/lonuserutils.pm between versions 1.131 and 1.165

version 1.131, 2010/11/14 20:29:34 version 1.165, 2014/03/31 01:09:11
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 238  sub domain_roles_select { Line 237  sub domain_roles_select {
     # Role types      # Role types
     my @roletypes = ('domain','author','course','community');      my @roletypes = ('domain','author','course','community');
     my %lt = &role_type_names();      my %lt = &role_type_names();
       my $onchangefirst = "updateCols('showrole')";
       my $onchangesecond = "updateCols('showrole')";
     #      #
     # build up the menu information to be passed to      # build up the menu information to be passed to
     # &Apache::loncommon::linked_select_forms      # &Apache::loncommon::linked_select_forms
Line 284  sub domain_roles_select { Line 285  sub domain_roles_select {
     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','community']);           ['domain','author','course','community'],$onchangefirst,
            $onchangesecond);
     return $result;      return $result;
 }  }
   
Line 336  sub print_upload_manager_header { Line 338  sub print_upload_manager_header {
                                 $env{'request.role.domain'},$context,                                  $env{'request.role.domain'},$context,
                                 $groupslist,$crstype);                                  $groupslist,$crstype);
     my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');      my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
     $r->print('<p>'      $r->print(
              .&mt('Total number of records found in file: [_1]'          '<h3>'.&mt('Identify fields in uploaded list')."</h3>\n".
                  ,'<b>'.$distotal.'</b>')          '<p class="LC_info">'.
              ."</p>\n");          &mt('Total number of records found in file: [_1]'
     $r->print('<div class="LC_left_float"><h3>'.             ,'<b>'.$distotal.'</b>').
               &mt('Identify fields in uploaded list')."</h3>\n");          "</p>\n"
     $r->print(&mt('Enter as many fields as you can.<br /> The system will inform you and bring you back to this page, <br /> if the data selected are insufficient to add users.')."<br />\n");      );
       if ($distotal == 0) {
           $r->print('<p class="LC_warning">'.&mt('None found').'</p>');
       }
       $r->print(
           '<p>'.
           &mt('Enter as many fields as you can.').'<br />'.
           &mt('The system will inform you and bring you back to this page,[_1]if the data selected are insufficient to add users.','<br />').
           "</p>\n"
       );
     $r->print(&hidden_input('action','upload').      $r->print(&hidden_input('action','upload').
               &hidden_input('state','got_file').                &hidden_input('state','got_file').
               &hidden_input('associate','').                &hidden_input('associate','').
Line 350  sub print_upload_manager_header { Line 361  sub print_upload_manager_header {
               &hidden_input('fileupload',$env{'form.fileupload'}).                &hidden_input('fileupload',$env{'form.fileupload'}).
               &hidden_input('upfiletype',$env{'form.upfiletype'}).                &hidden_input('upfiletype',$env{'form.upfiletype'}).
               &hidden_input('upfile_associate',$env{'form.upfile_associate'}));                &hidden_input('upfile_associate',$env{'form.upfile_associate'}));
     $r->print('<br /><label><input type="checkbox" name="noFirstLine"'.$checked.' />'.      $r->print(
               &mt('Ignore First Line').'</label><br />');          '<div class="LC_left_float">'.
     $r->print('<br /><input type="button" value="'.&mt('Reverse Association').'" '.          '<fieldset><legend>'.&mt('Functions').'</legend>'.
           '<label><input type="checkbox" name="noFirstLine"'.$checked.' />'.
                 &mt('Ignore First Line').'</label>'.
           ' <input type="button" value="'.&mt('Reverse Association').'" '.
               'name="Reverse Association" '.                'name="Reverse Association" '.
               'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');                'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'.
     $r->print("<br /><br />\n".          '</fieldset></div><br clear="all" />'
               '<script type="text/javascript" language="Javascript">'."\n".      );
               '// <![CDATA['."\n".      $r->print(
               $javascript."\n".$javascript_validations."\n".          '<script type="text/javascript" language="Javascript">'."\n".
               '// ]]>'."\n".          '// <![CDATA['."\n".
               '</script>');          $javascript."\n".$javascript_validations."\n".
           '// ]]>'."\n".
           '</script>'
       );
 }  }
   
 ###############################################################  ###############################################################
Line 382  sub javascript_validations { Line 399  sub javascript_validations {
         $param{'curr_autharg'} = $curr_authfield;          $param{'curr_autharg'} = $curr_authfield;
     }      }
   
       my $showcredits;
       my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
       if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'}) {
           $showcredits = 1;
       }
   
     my ($setsection_call,$setsections_js);      my ($setsection_call,$setsections_js);
     my $finish = "  vf.submit();\n";      my $finish = "  vf.submit();\n";
     if ($mode eq 'upload') {      if ($mode eq 'upload') {
Line 391  sub javascript_validations { Line 414  sub javascript_validations {
                     $setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');';                      $setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');';
                     $setsections_js =                      $setsections_js =
                         &setsections_javascript($param{'formname'},$groupslist,                          &setsections_javascript($param{'formname'},$groupslist,
                                                 $mode,'',$crstype);                                                  $mode,'',$crstype,$showcredits);
                 } else {                  } else {
                     $setsection_call = "'ok'";                      $setsection_call = "'ok'";
                 }                  }
             } elsif ($context eq 'domain') {              } elsif ($context eq 'domain') {
                 $setsection_call = 'setCourse()';                  $setsection_call = 'setCourse()';
                 $setsections_js = &dc_setcourse_js($param{'formname'},$mode,$context);                  $setsections_js = &dc_setcourse_js($param{'formname'},$mode,
                                                      $context,$showcredits);
             }              }
             $finish = "  var checkSec = $setsection_call\n".              $finish = "  var checkSec = $setsection_call\n".
                       "  if (checkSec == 'ok') {\n".                        "  if (checkSec == 'ok') {\n".
Line 420  sub javascript_validations { Line 444  sub javascript_validations {
          domain   => 'The optional domain field was not specified.',           domain   => 'The optional domain field was not specified.',
          continue => 'Continue adding users?',           continue => 'Continue adding users?',
          );           );
       if ($showcredits) {
           $alert{'credits'} = &mt('The optional credits field was not specified');
       }
     if (($mode eq 'upload') && ($context eq 'domain')) {      if (($mode eq 'upload') && ($context eq 'domain')) {
         $alert{'inststatus'} = &mt('The optional affiliation field was not specified');           $alert{'inststatus'} = &mt('The optional affiliation field was not specified'); 
     }      }
     my $function_name = <<"END";      my $function_name = <<"END";
 $setsections_js  $setsections_js
   
 function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus) {  function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits) {
 END  END
     my ($authnum,%can_assign) =  &Apache::loncommon::get_assignable_auth($domain);      my ($authnum,%can_assign) =  &Apache::loncommon::get_assignable_auth($domain);
     my $auth_checks;      my $auth_checks;
Line 483  END Line 510  END
             return;              return;
         }          }
     }      }
   /* regexp here to check for non \d \. in credits */
 END  END
     } else {      } else {
         $auth_checks .= (<<END);          $auth_checks .= (<<END);
Line 555  END Line 583  END
         message+='$alert{'domain'}';          message+='$alert{'domain'}';
     }      }
 END  END
           if ($showcredits) {
               $optional_checks .= <<END;
       if (foundcredits==0) {
           if (message!='') {
               message+='\\n';
           }
           message+='$alert{'credits'}';
       }
   END
           }
         if (($mode eq 'upload') && ($context eq 'domain')) {          if (($mode eq 'upload') && ($context eq 'domain')) {
             $optional_checks .= (<<END);              $optional_checks .= (<<END);
   
Line 589  END Line 627  END
 ###############################################################  ###############################################################
 sub upload_manager_javascript_forward_associate {  sub upload_manager_javascript_forward_associate {
     my ($can_assign) = @_;      my ($can_assign) = @_;
     my $auth_update;      my ($auth_update,$numbuttons,$argreset);
     if (ref($can_assign) eq 'HASH') {      if (ref($can_assign) eq 'HASH') {
         if (keys(%{$can_assign}) > 1) {          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";              $auth_update = <<"END";
    // If we set the password, make the password form below correspond to     // If we set the password, make the password form below correspond to
    // the new value.     // the new value.
    if (nw==9) {     if (nw==9) {
       changed_radio('int',document.studentform);        changed_radio('int',document.studentform);
       set_auth_radio_buttons('int',document.studentform);        set_auth_radio_buttons('int',document.studentform);
   $argreset
      }
   
 END  END
         }          }
         if ($can_assign->{'krb4'} || $can_assign->{'krb5'}) {  
            $auth_update .= "      vf.krbarg.value='';\n";  
         }  
         if ($can_assign->{'int'}) {  
            $auth_update .= "      vf.intarg.value='';\n";  
         }  
         if ($can_assign->{'loc'}) {  
            $auth_update .= "      vf.locarg.value='';\n";  
         }  
         $auth_update .= "  
    }\n";  
     }      }
   
     return(<<ENDPICK);      return(<<ENDPICK);
Line 624  function verify(vf,sec_caller) { Line 677  function verify(vf,sec_caller) {
     var foundrole=0;      var foundrole=0;
     var founddomain=0;      var founddomain=0;
     var foundinststatus=0;      var foundinststatus=0;
       var foundcredits=0;
     var tw;      var tw;
     for (i=0;i<=vf.nfields.value;i++) {      for (i=0;i<=vf.nfields.value;i++) {
         tw=eval('vf.f'+i+'.selectedIndex');          tw=eval('vf.f'+i+'.selectedIndex');
Line 636  function verify(vf,sec_caller) { Line 690  function verify(vf,sec_caller) {
         if (tw==11) { foundrole=1; }          if (tw==11) { foundrole=1; }
         if (tw==12) { founddomain=1; }          if (tw==12) { founddomain=1; }
         if (tw==13) { foundinststatus=1; }          if (tw==13) { foundinststatus=1; }
           if (tw==14) { foundcredits=1; }
     }      }
     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus);      verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits);
 }  }
   
 //  //
Line 660  function verify(vf,sec_caller) { Line 715  function verify(vf,sec_caller) {
 // 11 = role  // 11 = role
 // 12 = domain  // 12 = domain
 // 13 = inststatus  // 13 = inststatus
   // 14 = foundcredits 
   
 function flip(vf,tf) {  function flip(vf,tf) {
    var nw=eval('vf.f'+tf+'.selectedIndex');     var nw=eval('vf.f'+tf+'.selectedIndex');
Line 708  ENDPICK Line 764  ENDPICK
 ###############################################################  ###############################################################
 sub upload_manager_javascript_reverse_associate {  sub upload_manager_javascript_reverse_associate {
     my ($can_assign) = @_;      my ($can_assign) = @_;
     my $auth_update;       my ($auth_update,$numbuttons,$argreset);
     if (ref($can_assign) eq 'HASH') {      if (ref($can_assign) eq 'HASH') {
         if (keys(%{$can_assign}) > 1) {          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";              $auth_update = <<"END";
    // initial password specified, pick internal authentication     // initial password specified, pick internal authentication
    if (tf==8 && nw!=0) {     if (tf==8 && nw!=0) {
       changed_radio('int',document.studentform);        changed_radio('int',document.studentform);
       set_auth_radio_buttons('int',document.studentform);        set_auth_radio_buttons('int',document.studentform);
   $argreset
      }
   
 END  END
         }          }
         if ($can_assign->{'krb'}) {        
            $auth_update .= "      vf.krbarg.value='';\n";  
         }  
         if ($can_assign->{'int'}) {  
            $auth_update .= "      vf.intarg.value='';\n";  
         }  
         if ($can_assign->{'loc'}) {  
            $auth_update .= "      vf.locarg.value='';\n";  
         }  
         $auth_update .= "  
    }\n";  
     }      }
   
     return(<<ENDPICK);      return(<<ENDPICK);
 function verify(vf,sec_caller) {  function verify(vf,sec_caller) {
     var founduname=0;      var founduname=0;
Line 741  function verify(vf,sec_caller) { Line 813  function verify(vf,sec_caller) {
     var foundrole=0;      var foundrole=0;
     var founddomain=0;      var founddomain=0;
     var foundinststatus=0;      var foundinststatus=0;
       var foundcredits=0;
     var tw;      var tw;
     for (i=0;i<=vf.nfields.value;i++) {      for (i=0;i<=vf.nfields.value;i++) {
         tw=eval('vf.f'+i+'.selectedIndex');          tw=eval('vf.f'+i+'.selectedIndex');
Line 753  function verify(vf,sec_caller) { Line 826  function verify(vf,sec_caller) {
         if (i==10 && tw!=0) { foundrole=1; }          if (i==10 && tw!=0) { foundrole=1; }
         if (i==11 && tw!=0) { founddomain=1; }          if (i==11 && tw!=0) { founddomain=1; }
         if (i==12 && tw!=0) { foundinstatus=1; }          if (i==12 && tw!=0) { foundinstatus=1; }
           if (i==13 && tw!=0) { foundcredits=1; }
     }      }
     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus);      verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits);
 }  }
   
 function flip(vf,tf) {  function flip(vf,tf) {
Line 786  ENDPICK Line 860  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,$crstype,
           $showcredits) = @_;
     my $form = 'document.studentform';      my $form = 'document.studentform';
     my $formname = 'studentform';      my $formname = 'studentform';
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
Line 875  sub print_upload_manager_footer { Line 950  sub print_upload_manager_footer {
                     &mt('Default role'))                      &mt('Default role'))
                .&mt('Choose the role to assign to users without a value specified in the uploaded file.')                 .&mt('Choose the role to assign to users without a value specified in the uploaded file.')
     } elsif ($context eq 'course') {      } elsif ($context eq 'course') {
         $Str .= &Apache::lonhtmlcommon::row_title(          if ($showcredits) {
               $Str .= &Apache::lonhtmlcommon::row_title(
                       &mt('Default role, section and credits'))
                      .&mt('Choose the role and/or section(s) and/or credits to assign to users without values specified in the uploaded file.');
           } else { 
               $Str .= &Apache::lonhtmlcommon::row_title(
                     &mt('Default role and section'))                      &mt('Default role and section'))
                .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.');                     .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.');
           }
     } else {      } else {
         $Str .= &Apache::lonhtmlcommon::row_title(          $Str .= &Apache::lonhtmlcommon::row_title(
                     &mt('Default role and/or section(s)'))                      &mt('Default role and/or section(s)'))
Line 885  sub print_upload_manager_footer { Line 966  sub print_upload_manager_footer {
     }      }
     if (($context eq 'domain') || ($context eq 'author')) {      if (($context eq 'domain') || ($context eq 'author')) {
         $Str .= '<br />';          $Str .= '<br />';
         my ($options,$cb_script,$coursepick) = &default_role_selector($context,1);          my ($options,$cb_script,$coursepick) = 
               &default_role_selector($context,1,'',$showcredits);
         if ($context eq 'domain') {          if ($context eq 'domain') {
             $Str .= '<p>'              $Str .= '<p>'
                    .'<b>'.&mt('Domain Level').'</b><br />'                     .'<b>'.&mt('Domain Level').'</b><br />'
Line 902  sub print_upload_manager_footer { Line 984  sub print_upload_manager_footer {
     } else {      } else {
         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 $defaultcredits;
                                      $permission,$context,'upload',$crstype);          if ($showcredits) {
               $defaultcredits = &get_defaultcredits();
           }
           my $secbox = &section_picker($cdom,$cnum,'Any',$rowtitle,$permission,
                                        $context,'upload',$crstype,$showcredits,
                                        $defaultcredits);
         $Str .= $secbox          $Str .= $secbox
                .&Apache::lonhtmlcommon::row_closure();                 .&Apache::lonhtmlcommon::row_closure();
         my %lt;          my %lt;
Line 926  sub print_upload_manager_footer { Line 1013  sub print_upload_manager_footer {
                .&Apache::lonhtmlcommon::row_closure();                 .&Apache::lonhtmlcommon::row_closure();
     }      }
     if ($context eq 'course' || $context eq 'domain') {      if ($context eq 'course' || $context eq 'domain') {
         $Str .= &forceid_change($context);          $Str .= &Apache::lonhtmlcommon::row_title(&mt('Student/Employee ID'))
                  .&forceid_change($context)
                  .&Apache::lonhtmlcommon::row_closure(1); # last row in pick_box
     }      }
   
     $Str .= &Apache::lonhtmlcommon::end_pick_box();      $Str .= &Apache::lonhtmlcommon::end_pick_box();
Line 949  sub print_upload_manager_footer { Line 1038  sub print_upload_manager_footer {
     return;      return;
 }  }
   
   sub get_defaultcredits {
       my ($cdom,$cnum) = @_;
        
       if ($cdom eq '' || $cnum eq '') {
           return unless ($env{'request.course.id'});
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       }
       return unless(($cdom =~ /^$match_domain$/) && ($cnum =~ /^$match_courseid$/)); 
       my ($defaultcredits,$domdefcredits);
       my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
       if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'}) {
           my $instcode = $env{'course.'.$cdom.'_'.$cnum.'.internal.coursecode'};
           if ($instcode) {
               $domdefcredits = $domdefaults{'officialcredits'};
           } elsif ($env{'course.'.$cdom.'_'.$cnum.'.internal.textbook'}) {
               $domdefcredits = $domdefaults{'textbookcredits'};
           } else {
               $domdefcredits = $domdefaults{'unofficialcredits'};
           }
       } else {
           return;
       }
   
       if ($env{'request.course.id'} eq $cdom.'_'.$cnum) {
           $defaultcredits = $env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'};
       } elsif (exists($env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'})) {
           $defaultcredits = $env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'};
       } else {
           my %crsinfo =
               &Apache::lonnet::coursedescription("$cdom/$cnum",{'one_time' => 1});
           $defaultcredits = $crsinfo{'internal.defaultcredits'};
       }
       if ($defaultcredits eq '') {
           $defaultcredits = $domdefcredits;
       }
       return $defaultcredits;
   }
   
 sub forceid_change {  sub forceid_change {
     my ($context) = @_;      my ($context) = @_;
     my $output =       my $output = 
         &Apache::lonhtmlcommon::row_title(&mt('Student/Employee ID'))          '<label><input type="checkbox" name="forceid" value="yes" />'
        .'<label><input type="checkbox" name="forceid" value="yes" />'         .&mt('Force change of existing ID')
        .&mt('Disable Student/Employee ID Safeguard and force change of conflicting IDs')         .'</label>'.&Apache::loncommon::help_open_topic('ForceIDChange')."\n";
        .'</label><br />'."\n"  
        .&mt('(only do if you know what you are doing.)')."\n";  
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $output .= '<br /><label><input type="checkbox" name="recurseid"'.          $output .= 
                    ' value="yes" />'.               '<br />'
   &mt('Update student/employee ID in courses in which user is active/future student,[_1](if forcing change).','<br />').             .'<label><input type="checkbox" name="recurseid" value="yes" />'
                    '</label>'."\n";             .&mt("Update ID in user's course(s).").'</label>'."\n";
     }      }
     $output .= &Apache::lonhtmlcommon::row_closure(1); # last row in pick_box  
     return $output;      return $output;
 }  }
   
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub print_upload_manager_form {  sub print_upload_manager_form {
     my ($r,$context,$permission,$crstype) = @_;      my ($r,$context,$permission,$crstype,$showcredits) = @_;
     my $firstLine;      my $firstLine;
     my $datatoken;      my $datatoken;
     if (!$env{'form.datatoken'}) {      if (!$env{'form.datatoken'}) {
Line 1003  sub print_upload_manager_form { Line 1128  sub print_upload_manager_form {
                                'domain_choice' => 'scalar',                                 'domain_choice' => 'scalar',
                                'inststatus_choice' => 'scalar',                                 'inststatus_choice' => 'scalar',
                              };                               };
     my $defdom = $env{'request.role.domain'};      if ($showcredits) {
           $col_setting_names->{'credits_choice'} = 'scalar';
       }
     if ($context eq 'course') {      if ($context eq 'course') {
         &Apache::loncommon::restore_course_settings('enrollment_upload',          &Apache::loncommon::restore_course_settings('enrollment_upload',
                                                     $col_setting_names);                                                      $col_setting_names);
Line 1011  sub print_upload_manager_form { Line 1138  sub print_upload_manager_form {
         &Apache::loncommon::restore_settings($context,'user_upload',          &Apache::loncommon::restore_settings($context,'user_upload',
                                              $col_setting_names);                                               $col_setting_names);
     }      }
       my $defdom = $env{'request.role.domain'};
     #      #
     # Determine kerberos parameters as appropriate      # Determine kerberos parameters as appropriate
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
Line 1036  sub print_upload_manager_form { Line 1164  sub print_upload_manager_form {
              ['role',&mt('Role'),             $env{'form.role_choice'}],               ['role',&mt('Role'),             $env{'form.role_choice'}],
              ['domain',&mt('Domain'),         $env{'form.domain_choice'}],               ['domain',&mt('Domain'),         $env{'form.domain_choice'}],
              ['inststatus',&mt('Affiliation'), $env{'form.inststatus_choice'}]);               ['inststatus',&mt('Affiliation'), $env{'form.inststatus_choice'}]);
           if ($showcredits) {     
               push(@field,
                    ['credits',&mt('Student Credits'), $env{'form.credits_choice'}]);
           }
         if ($env{'form.upfile_associate'} eq 'reverse') {          if ($env{'form.upfile_associate'} eq 'reverse') {
             &Apache::loncommon::csv_print_samples($r,\@records);              &Apache::loncommon::csv_print_samples($r,\@records);
             $i=&Apache::loncommon::csv_print_select_table($r,\@records,              $i=&Apache::loncommon::csv_print_select_table($r,\@records,
Line 1052  sub print_upload_manager_form { Line 1184  sub print_upload_manager_form {
             $keyfields=join(',',sort(keys(%sone)));              $keyfields=join(',',sort(keys(%sone)));
         }          }
     }      }
     $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,$crstype,$showcredits);
 }  }
   
 sub setup_date_selectors {  sub setup_date_selectors {
Line 1211  sub make_dates_default { Line 1342  sub make_dates_default {
 }  }
   
 sub default_role_selector {  sub default_role_selector {
     my ($context,$checkpriv,$crstype) = @_;      my ($context,$checkpriv,$crstype,$showcredits) = @_;
     my %customroles;      my %customroles;
     my ($options,$coursepick,$cb_jscript);      my ($options,$coursepick,$cb_jscript);
     if ($context ne 'author') {      if ($context ne 'author') {
Line 1223  sub default_role_selector { Line 1354  sub default_role_selector {
                     'grs'  => "Section",                      'grs'  => "Section",
                     'exs'  => "Existing sections",                      'exs'  => "Existing sections",
                     'new'  => "New section",                      'new'  => "New section",
                       'crd'  => "Credits",
                   );                    );
     $options = '<select name="defaultrole">'."\n".      $options = '<select name="defaultrole">'."\n".
                ' <option value="">'.&mt('Please select').'</option>'."\n";                  ' <option value="">'.&mt('Please select').'</option>'."\n"; 
Line 1242  sub default_role_selector { Line 1374  sub default_role_selector {
         }          }
         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/Community');
           my ($credit_elem,$creditsinput);
           if ($showcredits) {
               $credit_elem = 'credits';
               $creditsinput = '<td><input type="text" name="credits" value="" /></td>';
           }
         $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','courserole','Course/Community',$credit_elem);
         $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>'.
                         '<th>'.$lt{'crd'}.'</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','','','','crstype'".')" /></td>'."\n".
Line 1255  sub default_role_selector { Line 1393  sub default_role_selector {
                       &default_course_roles($context,$checkpriv,'Course',%customroles)."\n".                        &default_course_roles($context,$checkpriv,'Course',%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">'.
                       $lt{'exs'}.'<br /><select name="currsec">'.                        $lt{'exs'}.'<br /><select name="currsec">'.
                       ' <option value=""><--'.&mt('Pick course first').                        ' <option value="">&lt;--'.&mt('Pick course first').
                       '</select></td>'.                        '</select></td>'.
                       '<td>&nbsp;&nbsp;</td>'.                        '<td>&nbsp;&nbsp;</td>'.
                       '<td valign="top">'.$lt{'new'}.'<br />'.                        '<td valign="top">'.$lt{'new'}.'<br />'.
Line 1269  sub default_role_selector { Line 1407  sub default_role_selector {
                       '<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="" />'.                        '<input type="hidden" name="crstype" value="" />'.
                       '</td></tr></table></td>'.                        '</td></tr></table></td>'.$creditsinput.
                       &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 1391  sub curr_role_permissions { Line 1529  sub curr_role_permissions {
 sub my_custom_roles {  sub my_custom_roles {
     my ($crstype) = @_;      my ($crstype) = @_;
     my %returnhash=();      my %returnhash=();
       my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1});
     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+)$/) {
Line 1405  sub my_custom_roles { Line 1544  sub my_custom_roles {
   
 sub print_userlist {  sub print_userlist {
     my ($r,$mode,$permission,$context,$formname,$totcodes,$codetitles,      my ($r,$mode,$permission,$context,$formname,$totcodes,$codetitles,
         $idlist,$idlist_titles) = @_;          $idlist,$idlist_titles,$showcredits) = @_;
     my $format = $env{'form.output'};      my $format = $env{'form.output'};
     if (! exists($env{'form.sortby'})) {      if (! exists($env{'form.sortby'})) {
         $env{'form.sortby'} = 'username';          $env{'form.sortby'} = 'username';
Line 1413  sub print_userlist { Line 1552  sub print_userlist {
     if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {      if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
         $env{'form.Status'} = 'Active';          $env{'form.Status'} = 'Active';
     }      }
       my $onchange = "javascript:updateCols('Status');";
     my $status_select = &Apache::lonhtmlcommon::StatusOptions      my $status_select = &Apache::lonhtmlcommon::StatusOptions
         ($env{'form.Status'});          ($env{'form.Status'},undef,undef,$onchange);
   
     if ($env{'form.showrole'} eq '') {      if ($env{'form.showrole'} eq '') {
         if ($context eq 'course') {          if ($context eq 'course') {
Line 1439  sub print_userlist { Line 1579  sub print_userlist {
         @statuses = ('future');          @statuses = ('future');
     }      }
   
 #    if ($context eq 'course') {   
 #        $r->print(&display_adv_courseroles());  
 #    }  
     #  
     # Interface output      # Interface output
     $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n".      $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n".
               '<input type="hidden" name="action" value="'.                '<input type="hidden" name="action" value="'.
               $env{'form.action'}.'" />');                $env{'form.action'}.'" />');
     $r->print("<p>\n");      $r->print('<div>'."\n");
     if ($env{'form.action'} ne 'modifystudent') {      if ($env{'form.action'} ne 'modifystudent') {
         my %lt=&Apache::lonlocal::texthash('csv' => "CSV",          my %lt=&Apache::lonlocal::texthash('csv' => "CSV",
                                            'excel' => "Excel",                                             'excel' => "Excel",
                                            'html'  => 'HTML');                                             'html'  => 'HTML');
         my $output_selector = '<select size="1" name="output" >';          my $output_selector = '<select size="1" name="output" onchange="javascript:updateCols('."'output'".');" >';
         foreach my $outputformat ('html','csv','excel') {          foreach my $outputformat ('html','csv','excel') {
             my $option = '<option value="'.$outputformat.'"';              my $option = '<option value="'.$outputformat.'"';
             if ($outputformat eq $env{'form.output'}) {              if ($outputformat eq $env{'form.output'}) {
Line 1462  sub print_userlist { Line 1598  sub print_userlist {
             $output_selector .= "\n".$option;              $output_selector .= "\n".$option;
         }          }
         $output_selector .= '</select>';          $output_selector .= '</select>';
         $r->print('<label><span class="LC_nobreak">'          $r->print('<span class="LC_nobreak">'
                  .&mt('Output Format: [_1]',$output_selector)                   .&mt('Output Format: [_1]',$output_selector)
                  .'</span></label>'.('&nbsp;'x3));                   .'</span>'.('&nbsp;'x3));
     }      }
     $r->print('<label><span class="LC_nobreak">'      $r->print('<span class="LC_nobreak">'
              .&mt('User Status: [_1]',$status_select)               .&mt('User Status: [_1]',$status_select)
              .'</span></label>'.('&nbsp;'x3)."\n");               .'</span>'.('&nbsp;'x3)."\n");
     my $roleselected = '';      my $roleselected = '';
     if ($env{'form.showrole'} eq 'Any') {      if ($env{'form.showrole'} eq 'Any') {
        $roleselected = ' selected="selected"';          $roleselected = ' selected="selected"'; 
Line 1479  sub print_userlist { Line 1615  sub print_userlist {
         ($cnum,$cdom) = &get_course_identity();          ($cnum,$cdom) = &get_course_identity();
         $r->print(&section_group_filter($cnum,$cdom));          $r->print(&section_group_filter($cnum,$cdom));
     }      }
       $r->print('</div><div class="LC_left_float">'.
                 &column_checkboxes($context,$mode,$formname,$showcredits).
                 '</div>');
     if ($env{'form.phase'} eq '') {      if ($env{'form.phase'} eq '') {
         $r->print('<br /><br />'.&list_submit_button(&mt('Display List of Users')).          $r->print('<br clear="all" />'.
                   "\n</p>\n".                    &list_submit_button(&mt('Display List of Users'))."\n".
                   '<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 'community')))) {            (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) {
         $r->print(          $r->print('<br clear="all" />'.
             "\n</p>\n"                    &list_submit_button(&mt('Update Display'))."\n");
            .'<p>'      }
            .&list_submit_button(&mt('Update Display'))  
            ."</p>\n"      my @cols = &infocolumns($context,$mode,$showcredits);  
         );      if (!@cols) {
            $r->print('<hr style="clear:both;" /><span class="LC_warning">'.
                      &mt('No user information selected for display.').'</span>'.
                      '<input type="hidden" name="phase" value="display" /></form>'."\n");
            return;
     }      }
     my ($indexhash,$keylist) = &make_keylist_array();      my ($indexhash,$keylist) = &make_keylist_array();
     my (%userlist,%userinfo,$clearcoursepick);      my (%userlist,%userinfo,$clearcoursepick,$needauthorquota,$needauthorusage);
     if (($context eq 'domain') &&       if (($context eq 'domain') && 
         ($env{'form.roletype'} eq 'course') ||           ($env{'form.roletype'} eq 'course') || 
         ($env{'form.roletype'} eq 'community')) {          ($env{'form.roletype'} eq 'community')) {
Line 1516  sub print_userlist { Line 1659  sub print_userlist {
             &Apache::lonhtmlcommon::course_selection($formname,$numcodes,              &Apache::lonhtmlcommon::course_selection($formname,$numcodes,
                             $codetitles,$idlist,$idlist_titles,$crstype,                              $codetitles,$idlist,$idlist_titles,$crstype,
                             \@standardnames);                              \@standardnames);
         $r->print('<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n".          $r->print('<div class="LC_left_float">'.
                   &Apache::lonhtmlcommon::start_pick_box()."\n".                    '<fieldset><legend>'.$title.'</legend>'."\n".
                   &Apache::lonhtmlcommon::row_title($title,'LC_oddrow_value')."\n".  
                   $courseform."\n".                    $courseform."\n".
                   &Apache::lonhtmlcommon::row_closure(1).                    '</fieldset></div><br clear="all" />'.
                   &Apache::lonhtmlcommon::end_pick_box().'</p>'.  
                   '<p><input type="hidden" name="origroletype" value="'.$env{'form.roletype'}.'" />'.                    '<p><input type="hidden" name="origroletype" value="'.$env{'form.roletype'}.'" />'.
                   &list_submit_button(&mt('Update Display')).                    &list_submit_button(&mt('Update Display')).
                   "\n".'</p><span class="LC_warning">'.$warning.'</span>'."\n");                    "\n".'</p><span class="LC_warning">'.$warning.'</span>'."\n");
Line 1531  sub print_userlist { Line 1672  sub print_userlist {
             $clearcoursepick = 1;              $clearcoursepick = 1;
         }          }
         if (($env{'form.coursepick'}) && (!$clearcoursepick)) {          if (($env{'form.coursepick'}) && (!$clearcoursepick)) {
             $r->print('<hr />'.&mt('Searching').' ...<br />&nbsp;<br />');              $r->print('<hr />'.&mt('Searching ...').'<br />&nbsp;<br />');
         }          }
     } else {      } else {
         $r->print('<hr />'.&mt('Searching').' ...<br />&nbsp;<br />');          $r->print('<hr style="clear:both;" /><div id="searching">'.&mt('Searching ...').'</div>');
     }      }
     $r->rflush();      $r->rflush();
     if ($context eq 'course') {      if ($context eq 'course') {
Line 1569  sub print_userlist { Line 1710  sub print_userlist {
                              \%cstr_roles,$permission);                               \%cstr_roles,$permission);
         } elsif ($context eq 'domain') {          } elsif ($context eq 'domain') {
             if ($env{'form.roletype'} eq 'domain') {              if ($env{'form.roletype'} eq 'domain') {
                   if (grep(/^authorusage$/,@cols)) {
                       $needauthorusage = 1;
                   }
                   if (grep(/^authorquota$/,@cols)) {
                       $needauthorquota = 1;
                   }
                 %dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'});                  %dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'});
                 foreach my $key (keys(%dom_roles)) {                  foreach my $key (keys(%dom_roles)) {
                     if (ref($dom_roles{$key}) eq 'HASH') {                      if (ref($dom_roles{$key}) eq 'HASH') {
Line 1654  sub print_userlist { Line 1801  sub print_userlist {
         }          }
     }      }
     if (keys(%userlist) == 0) {      if (keys(%userlist) == 0) {
           my $msg = '';
         if ($context eq 'author') {          if ($context eq 'author') {
             $r->print(&mt('There are no co-authors to display.')."\n");              $msg = &mt('There are no co-authors to display.');
         } elsif ($context eq 'domain') {          } elsif ($context eq 'domain') {
             if ($env{'form.roletype'} eq 'domain') {              if ($env{'form.roletype'} eq 'domain') {
                 $r->print(&mt('There are no users with domain roles to display.')."\n");                  $msg = &mt('There are no users with domain roles to display.');
             } elsif ($env{'form.roletype'} eq 'author') {              } elsif ($env{'form.roletype'} eq 'author') {
                 $r->print(&mt('There are no authors or co-authors to display.')."\n");                  $msg = &mt('There are no authors or co-authors to display.');
             } elsif ($env{'form.roletype'} eq 'course') {              } elsif ($env{'form.roletype'} eq 'course') {
                 $r->print(&mt('There are no course users to display')."\n");                   $msg = &mt('There are no course users to display');
             } elsif ($env{'form.roletype'} eq 'community') {              } elsif ($env{'form.roletype'} eq 'community') {
                 $r->print(&mt('There are no community users to display')."\n");                  $msg = &mt('There are no community users to display');
             }              }
         } 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");
         }          }
           $r->print('<p class="LC_info">'.$msg.'</p>'."\n") if $msg;
     } else {      } else {
         # Print out the available choices          # Print out the available choices
         my $usercount;          my $usercount;
         if ($env{'form.action'} eq 'modifystudent') {          if ($env{'form.action'} eq 'modifystudent') {
             ($usercount) = &show_users_list($r,$context,'view',$permission,              ($usercount) = &show_users_list($r,$context,'view',$permission,
                                  $env{'form.Status'},\%userlist,$keylist);                                   $env{'form.Status'},\%userlist,$keylist,'',
                                    $showcredits);
         } else {          } else {
             ($usercount) = &show_users_list($r,$context,$env{'form.output'},              ($usercount) = &show_users_list($r,$context,$env{'form.output'},
                                $permission,$env{'form.Status'},\%userlist,$keylist);                                 $permission,$env{'form.Status'},\%userlist,
                                  $keylist,'',$showcredits,$needauthorquota,$needauthorusage);
         }          }
         if (!$usercount) {          if (!$usercount) {
             $r->print('<br /><span class="LC_warning">'              $r->print('<br /><span class="LC_info">'
                      .&mt('There are no users matching the search criteria.')                       .&mt('There are no users matching the search criteria.')
                      .'</span>'                       .'</span>'
             );               ); 
Line 1688  sub print_userlist { Line 1839  sub print_userlist {
     }      }
     $r->print('<input type="hidden" name="phase" value="'.      $r->print('<input type="hidden" name="phase" value="'.
               $env{'form.phase'}.'" /></form>');                $env{'form.phase'}.'" /></form>');
       return;
 }  }
   
 sub role_filter {  sub role_filter {
Line 1700  sub role_filter { Line 1852  sub role_filter {
     my ($role_select);      my ($role_select);
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $role_select = &domain_roles_select();          $role_select = &domain_roles_select();
         $output = '<label><span class="LC_nobreak">'          $output = '<span class="LC_nobreak">'
                  .&mt('Role Type: [_1]',$role_select)                   .&mt('Role Type: [_1]',$role_select)
                  .'</span></label>';                   .'</span>';
     } else {      } else {
         $role_select = '<select name="showrole">'."\n".          $role_select = '<select name="showrole" onchange="javascript:updateCols('."'showrole'".');">'."\n".
                        '<option value="Any" '.$roleselected.'>'.                         '<option value="Any" '.$roleselected.'>'.
                        &mt('Any role').'</option>';                         &mt('Any role').'</option>';
         my ($roletype,$crstype);          my ($roletype,$crstype);
Line 1731  sub role_filter { Line 1883  sub role_filter {
             $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';              $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';
         }          }
         $role_select .= '</select>';          $role_select .= '</select>';
         $output = '<label><span class="LC_nobreak">'          $output = '<span class="LC_nobreak">'
                  .&mt('Role: [_1]',$role_select)                   .&mt('Role: [_1]',$role_select)
                  .'</span></label> ';                   .'</span>';
     }      }
     return $output;      return $output;
 }  }
Line 1796  sub section_group_filter { Line 1948  sub section_group_filter {
     return $output;      return $output;
 }  }
   
   sub infocolumns {
       my ($context,$mode,$showcredits) = @_;
       my @cols;
       if (($mode eq 'pickauthor') || ($mode eq 'autoenroll')) {
           @cols = &get_cols_array($context,$mode,$showcredits);
       } else {
           my @posscols = &get_cols_array($context,$mode,$showcredits);
           if ($env{'form.phase'} ne '') {
               my @checkedcols = &Apache::loncommon::get_env_multiple('form.showcol');
               foreach my $col (@checkedcols) {
                   if (grep(/^$col$/,@posscols)) {
                       push(@cols,$col);
                   }
               }
           } else {
               @cols = @posscols;
           }
       }
       return @cols;
   }
   
   sub get_cols_array {
       my ($context,$mode,$showcredits) = @_;
       my @cols;
       if ($mode eq 'pickauthor') {
           @cols = ('username','fullname','status','email');
       } else {
           @cols = ('username','domain','id','fullname');
           if ($context eq 'course') {
               push(@cols,'section');
           }
           push(@cols,('start','end','role'));
           unless (($mode eq 'autoenroll') && ($env{'form.Status'} ne 'Any')) {
               push(@cols,'status');
           }
           if ($context eq 'course') {
               push(@cols,'groups');
           }
           push(@cols,'email');
           if (($context eq 'course') && ($mode ne 'autoenroll')) {
               if ($showcredits) {
                   push(@cols,'credits');
               }
               push(@cols,'lastlogin','clicker');
           }
           if (($context eq 'course') && ($mode ne 'autoenroll') &&
               ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'})) {
               push(@cols,'photo');
           }
           if ($context eq 'domain') {
               push (@cols,('authorusage','authorquota','extent'));
           }
       }
       return @cols;
   }
   
   sub column_checkboxes {
       my ($context,$mode,$formname,$showcredits) = @_;
       my @cols = &get_cols_array($context,$mode,$showcredits);
       my @showncols = &Apache::loncommon::get_env_multiple('form.showcol');
       my (%disabledchk,%unchecked);
       if ($env{'form.phase'} eq '') {
           $disabledchk{'status'} = 1;
           if ($context eq 'course') {
               $disabledchk{'role'} = 1;
               $unchecked{'photo'} = 1;
               $unchecked{'clicker'} = 1;
               if ($showcredits) {
                   $unchecked{'credits'} = 1;
               }
           } elsif ($context eq 'domain') { 
               $unchecked{'extent'} = 1; 
           }
           $unchecked{'start'} = 1;
           $unchecked{'end'} = 1;
       } else {
           if ($env{'form.Status'} ne 'Any') {
               $disabledchk{'status'} = 1;
           }
           if (($env{'form.showrole'} ne 'Any') && ($env{'form.showrole'} ne 'cr')) {
               $disabledchk{'role'} = 1;
           }
           if ($context eq 'domain') {
               if (($env{'form.roletype'} eq 'course') || 
                   ($env{'form.roletype'} eq 'community')) {
                   $disabledchk{'status'} = 1;
                   $disabledchk{'authorusage'} = 1;
                   $disabledchk{'authorquota'} = 1;
               } elsif ($env{'form.roletype'} eq 'domain') {
                   $disabledchk{'extent'} = 1; 
               }
           }
       }
       my $numposs = scalar(@cols);
       my $numinrow = 7;
       my %lt = &get_column_names($context);
       my $output = '<fieldset><legend>'.&mt('Information to show').'</legend>'."\n".'<span class="LC_nobreak">'.
                    '<input type="button" onclick="javascript:checkAll(document.'.$formname.'.showcol);" value="'.&mt('check all').'" />'.
                    ('&nbsp;'x3).
                    '<input type="button" onclick="javascript:uncheckAll(document.'.$formname.'.showcol);" value="'.&mt('uncheck all').'" />'.
                    '</span><table>';
       
       for (my $i=0; $i<$numposs; $i++) {
           my $rem = $i%($numinrow);
           if ($rem == 0) {
               if ($i > 0) {
                   $output .= '</tr>';
               }
               $output .= '<tr>';
           }
           my $checked;
           if ($env{'form.phase'} eq '') {
               $checked = ' checked="checked"';
               if ($unchecked{$cols[$i]}) { 
                  $checked = '';
               }
               if ($disabledchk{$cols[$i]}) {
                   $checked = ' disabled="disabled"';
               }
           } elsif (grep(/^\Q$cols[$i]\E$/,@showncols)) {
               $checked = ' checked="checked"';
           } elsif ($disabledchk{$cols[$i]}) {
               $checked = ' disabled="disabled"';
           }
           if ($i == $numposs-1) {
               my $colsleft = $numinrow-$rem;
               if ($colsleft > 1) {
                   $output .= '<td colspan="'.$colsleft.'">';
               } else {
                   $output .= '<td>';
               }
           } else {
               $output .= '<td>';
           }
           my $style;
           if ($cols[$i] eq 'extent') {
               if (($env{'form.roletype'} eq 'domain') || ($env{'form.roletype'} eq '')) {
                   $style = ' style="display: none;"';
               } 
           } elsif (($cols[$i] eq 'authorusage') || ($cols[$i] eq 'authorquota')) {
               if ($env{'form.roletype'} ne 'domain') {
                   $style = ' style="display: none;"';
               }
           }
           $output .= '<span id="show'.$cols[$i].'"'.$style.'><label>'.
                      '<input id="showcol'.$cols[$i].'" type="checkbox" name="showcol" value="'.$cols[$i].'"'.$checked.' /><span id="showcoltext'.$cols[$i].'">'.
                      $lt{$cols[$i]}.'</span>'.
                      '</label></span></td>';
       }
       $output .= '</tr></table></fieldset>';
       return $output;
   }
   
 sub list_submit_button {  sub list_submit_button {
     my ($text) = @_;      my ($text) = @_;
     return '<input type="button" name="updatedisplay" value="'.$text.'" onclick="javascript:display_update()" />';      return '<input type="button" name="updatedisplay" value="'.$text.'" onclick="javascript:display_update()" />';
 }  }
   
   sub get_column_names {
       my ($context) = @_;
       my %lt = &Apache::lonlocal::texthash(
           'username'   => "username",
           'domain'     => "domain",
           'id'         => 'ID',
           'fullname'   => "name",
           'section'    => "section",
           'groups'     => "active groups",
           'start'      => "start date",
           'end'        => "end date",
           'status'     => "status",
           'role'       => "role",
           'credits'    => "credits",
           'type'       => "enroll type/action",
           'email'      => "e-mail address",
           'photo'      => "photo",
           'lastlogin'  => "last login",
           'extent'     => "extent",
           'authorusage' => "disk usage (%)",
           'authorquota' => "disk quota (MB)",
           'ca'         => "check all",
           'ua'         => "uncheck all",
           'clicker'    => "clicker-ID",
       );
       if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
           $lt{'extent'} = &mt('course(s): description, section(s), status');
       } elsif ($context eq 'domain' && $env{'form.roletype'} eq 'community') {
           $lt{'extent'} = &mt('community(s): description, section(s), status');
       } elsif (($context eq 'author') || 
                ($context eq 'domain' && $env{'form.roletype'} eq 'author')) {
           $lt{'extent'} = &mt('author');
       }
       return %lt;
   }
   
 sub gather_userinfo {  sub gather_userinfo {
     my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash,$permission) = @_;      my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash,$permission) = @_;
     my $viewablesec;      my $viewablesec;
Line 2050  sub instcode_from_coursefilter { Line 2391  sub instcode_from_coursefilter {
     return $instcode;      return $instcode;
 }  }
   
 sub display_adv_courseroles {  
     my $output;  
     #  
     # List course personnel  
     my %coursepersonnel =   
        &Apache::lonnet::get_course_adv_roles($env{'request.course.id'});  
     #  
     $output = '<br />'.&Apache::loncommon::start_data_table();  
     foreach my $role (sort(keys(%coursepersonnel))) {  
         next if ($role =~ /^\s*$/);  
         $output .= &Apache::loncommon::start_data_table_row().  
                   '<td>'.$role.'</td><td>';  
         foreach my $user (split(',',$coursepersonnel{$role})) {  
             my ($puname,$pudom)=split(':',$user);  
             $output .= ' '.&Apache::loncommon::aboutmewrapper(  
                        &Apache::loncommon::plainname($puname,$pudom),  
                        $puname,$pudom);  
         }  
         $output .= '</td>'.&Apache::loncommon::end_data_table_row();  
     }  
     $output .= &Apache::loncommon::end_data_table();  
 }  
   
 sub make_keylist_array {  sub make_keylist_array {
     my ($index,$keylist);      my ($index,$keylist);
     $index->{'domain'} = &Apache::loncoursedata::CL_SDOM();      $index->{'domain'} = &Apache::loncoursedata::CL_SDOM();
Line 2091  sub make_keylist_array { Line 2409  sub make_keylist_array {
     $index->{'extent'} = &Apache::loncoursedata::CL_EXTENT();      $index->{'extent'} = &Apache::loncoursedata::CL_EXTENT();
     $index->{'photo'} = &Apache::loncoursedata::CL_PHOTO();      $index->{'photo'} = &Apache::loncoursedata::CL_PHOTO();
     $index->{'thumbnail'} = &Apache::loncoursedata::CL_THUMBNAIL();      $index->{'thumbnail'} = &Apache::loncoursedata::CL_THUMBNAIL();
       $index->{'credits'} = &Apache::loncoursedata::CL_CREDITS();
       $index->{'authorquota'} = &Apache::loncoursedata::CL_AUTHORQUOTA();
       $index->{'authorusage'} = &Apache::loncoursedata::CL_AUTHORUSAGE();
     foreach my $key (keys(%{$index})) {      foreach my $key (keys(%{$index})) {
         $keylist->[$index->{$key}] = $key;          $keylist->[$index->{$key}] = $key;
     }      }
Line 2139  sub process_date_info { Line 2460  sub process_date_info {
 }  }
   
 sub show_users_list {  sub show_users_list {
     my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname)=@_;      my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname,
           $showcredits,$needauthorquota,$needauthorusage)=@_;
     if ($formname eq '') {      if ($formname eq '') {
         $formname = 'studentform';          $formname = 'studentform';
     }      }
       my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     #      #
     # Variables for excel output      # Variables for excel output
     my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);      my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
Line 2154  sub show_users_list { Line 2477  sub show_users_list {
     my @sortable = ('username','domain','id','fullname','start','end','email','role');      my @sortable = ('username','domain','id','fullname','start','end','email','role');
     if ($context eq 'course') {      if ($context eq 'course') {
         push(@sortable,('section','groups','type'));          push(@sortable,('section','groups','type'));
           if ($showcredits) {
               push(@sortable,'credits');
           }
     } else {      } else {
         push(@sortable,'extent');          push(@sortable,'extent');
           if (($context eq 'domain') && ($env{'form.roletype'} eq 'domain') &&
               (($env{'form.showrole'} eq 'Any') || ($env{'form.showrole'} eq 'au'))) {
               push(@sortable,('authorusage','authorquota'));
           }
     }      }
     if ($mode eq 'pickauthor') {      if ($mode eq 'pickauthor') {
         @sortable = ('username','fullname','email','status');          @sortable = ('username','fullname','email','status');
     }      }
     if (!grep(/^\Q$sortby\E$/,@sortable)) {      my %is_sortable;
       map { $is_sortable{$_} = 1; } @sortable;
       unless ($is_sortable{$sortby}) {
         $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,$crstype,$defaultcredits);
     if ($context eq 'course') {      if ($context eq 'course') {
         $cid = $env{'request.course.id'};          $cid = $env{'request.course.id'};
         $crstype = &Apache::loncommon::course_type();          $crstype = &Apache::loncommon::course_type();
         ($cnum,$cdom) = &get_course_identity($cid);          ($cnum,$cdom) = &get_course_identity($cid);
           $defaultcredits = $env{'course.'.$cid.'.internal.defaultcredits'};
         ($classgroups) = &Apache::loncoursedata::get_group_memberships(          ($classgroups) = &Apache::loncoursedata::get_group_memberships(
                                      $userlist,$keylist,$cdom,$cnum);                                       $userlist,$keylist,$cdom,$cnum);
         if ($mode eq 'autoenroll') {          if ($mode eq 'autoenroll') {
             $env{'form.showrole'} = 'st';              $env{'form.showrole'} = 'st';
         } else {          } else {
             if (! exists($env{'form.displayphotos'})) {  
                 $env{'form.displayphotos'} = 'off';  
             }  
             $displayphotos = $env{'form.displayphotos'};  
             if (! exists($env{'form.displayclickers'})) {  
                 $env{'form.displayclickers'} = 'off';  
             }  
             $displayclickers = $env{'form.displayclickers'};  
             if ($env{'course.'.$cid.'.internal.showphoto'}) {              if ($env{'course.'.$cid.'.internal.showphoto'}) {
                 $r->print('                  $r->print('
 <script type="text/javascript">  <script type="text/javascript">
Line 2197  function photowindow(photolink) { Line 2522  function photowindow(photolink) {
 </script>  </script>
                ');                 ');
             }              }
             $r->print(<<END);  
 <input type="hidden" name="displayphotos" value="$displayphotos" />  
 <input type="hidden" name="displayclickers" value="$displayclickers" />  
 END  
         }          }
     } elsif ($context eq 'domain') {      } elsif ($context eq 'domain') {
         if ($setting eq 'community') {          if ($setting eq 'community') {
Line 2210  END Line 2531  END
         }          }
     }      }
     if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {      if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
         my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();  
         my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode);          my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode);
         my $verify_action_js = &bulkaction_javascript($formname);          my $verify_action_js = &bulkaction_javascript($formname);
         $r->print(<<END);          $r->print(<<END);
   
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
 // <![CDATA[  // <![CDATA[
 $check_uncheck_js  
   
 $verify_action_js  $verify_action_js
   
Line 2275  END Line 2594  END
     $r->print(<<END);      $r->print(<<END);
 <input type="hidden" name="sortby" value="$sortby" />  <input type="hidden" name="sortby" value="$sortby" />
 END  END
       my @cols = &infocolumns($context,$mode,$showcredits);
     my %lt=&Apache::lonlocal::texthash(      my %coltxt = &get_column_names($context);
                        'username'   => "username",      my %acttxt = &Apache::lonlocal::texthash(
                        'domain'     => "domain",  
                        'id'         => 'ID',  
                        'fullname'   => "name",  
                        'section'    => "section",  
                        'groups'     => "active groups",  
                        'start'      => "start date",  
                        'end'        => "end date",  
                        'status'     => "status",  
                        'role'       => "role",  
                        'type'       => "enroll type/action",  
                        'email'      => "e-mail address",  
                        'photo'      => "photo",  
                        'extent'     => "extent",  
                        'pr'         => "Proceed",                         'pr'         => "Proceed",
                        'ca'         => "check all",  
                        'ua'         => "uncheck all",  
                        'ac'         => "Action to take for selected users",                         'ac'         => "Action to take for selected users",
                        'link'       => "Behavior of clickable username link for each user",                         'link'       => "Behavior of clickable username link for each user",
                        'aboutme'    => "Display a user's personal information page",                         'aboutme'    => "Display a user's personal information page",
                        'owin'       => "Open in a new window",                         'owin'       => "Open in a new window",
                        'modify'     => "Modify a user's information",                         'modify'     => "Modify a user's information",
                        'track'      => "View a user's recent activity",                         'track'      => "View a user's recent activity",
                        'clicker'    => "Clicker-ID",  
                       );                        );
     if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {      my %lt = (%coltxt,%acttxt);
         $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') {  
         $lt{'extent'} = &mt('Author');   
     }  
     my @cols;  
     if ($mode eq 'pickauthor') {  
         @cols = ('username','fullname','status','email');  
     } else {  
         @cols = ('username','domain','id','fullname');  
         if ($context eq 'course') {  
             push(@cols,'section');  
         }  
         if (!($context eq 'domain' && ($env{'form.roletype'} eq 'course')  
                               && ($env{'form.roletype'} eq 'community'))) {   
             push(@cols,('start','end'));  
         }  
         if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {  
             push(@cols,'role');  
         }  
         if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||  
                                     $env{'form.roletype'} eq 'course' ||  
                                     $env{'form.roletype'} eq 'community')) {  
             push (@cols,'extent');  
         }  
         if (($statusmode eq 'Any') &&   
             (!($context eq 'domain' && (($env{'form.roletype'} eq 'course')  
              || ($env{'form.roletype'} eq 'community'))))) {  
             push(@cols,'status');  
         }  
         if ($context eq 'course') {  
             push(@cols,'groups');  
         }  
         push(@cols,'email');  
     }  
   
     my $rolefilter = $env{'form.showrole'};      my $rolefilter = $env{'form.showrole'};
     if ($env{'form.showrole'} eq 'cr') {      if ($env{'form.showrole'} eq 'cr') {
         $rolefilter = &mt('custom');            $rolefilter = &mt('custom');  
Line 2350  END Line 2616  END
     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,$crstype);
         $r->print('<b>'.$results_description.'</b><br /><br />');          $r->print('<b>'.$results_description.'</b><br clear="all" />');
     }      }
     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') {
Line 2412  END Line 2678  END
                             if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {                              if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
                                 $canchangesec{$role} = $env{'request.course.sec'};                                  $canchangesec{$role} = $env{'request.course.sec'};
                             }                              }
                           } elsif ((($role eq 'co') && ($crstype eq 'Community')) ||
                                    (($role eq 'cc') && ($crstype eq 'Course'))) {
                               if (&is_courseowner($env{'request.course.id'},
                                                   $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'})) {
                                   $canchange{$role} = 1;
                               }
                         }                          }
                     }                      }
                 }                  }
Line 2444  END Line 2716  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"  style="border-left: 1px solid;">'
                  .'<span class="LC_nobreak"><label>'
                  .'<input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}
                  .'</label></span></td></tr></table></fieldset></div>';
         }          }
         $output .= "\n".'<div class="LC_clear_float_footer">&nbsp;</div>'."\n".          $output .= "\n".'<br clear="all" />'."\n".
                   &Apache::loncommon::start_data_table().                    &Apache::loncommon::start_data_table().
                   &Apache::loncommon::start_data_table_header_row();                    &Apache::loncommon::start_data_table_header_row();
         if ($mode eq 'autoenroll') {          if ($mode eq 'autoenroll') {
Line 2456  END Line 2732  END
         } else {          } else {
             $output .= "\n".'<th>&nbsp;</th>'."\n";              $output .= "\n".'<th>&nbsp;</th>'."\n";
             if ($actionselect) {              if ($actionselect) {
                 $output .= '<th>'.&mt('Select').'</th>'."\n";                  $output .= '<th class="LC_nobreak" valign="top">'.&mt('Select').'</th>'."\n";
             }              }
         }          }
         foreach my $item (@cols) {          foreach my $item (@cols) {
             $output .= "<th><a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a></th>\n";              $output .= '<th class="LC_nobreak" valign="top">';
         }              if ($is_sortable{$item}) {
         my %role_types = &role_type_names();                  $output .= "<a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\" style=\"text-decoration:none;\">$lt{$item}<span class=\"LC_fontsize_small\"> &#9660;</span></a>";
         if ($context eq 'course' && $mode ne 'autoenroll') {              } else {
             if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {                  $output .= $lt{$item};
                 # Clicker display on or off?  
                 my %clicker_options = (  
                                         'on' => 'Show',  
                                         'off' => 'Hide',  
                                       );  
                 my $clickerchg = 'on';  
                 if ($displayclickers eq 'on') {  
                     $clickerchg = 'off';  
                 }  
                 $output .= '    <th>'."\n".'     '  
                         .&mt('[_1]'.$clicker_options{$clickerchg}.'[_2] clicker id'  
                             ,'<a href="javascript:document.'.$formname.'.displayclickers.value='  
                              ."'".$clickerchg."'".';document.'.$formname.'.submit();">'  
                             ,'</a>')  
                         ."\n".'    </th>'."\n";  
   
                 # Photo display on or off?  
                 if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {  
                     my %photo_options = &Apache::lonlocal::texthash(  
                                                             'on' => 'Show',  
                                                             'off' => 'Hide',  
                                                                 );  
                     my $photochg = 'on';  
                     if ($displayphotos eq 'on') {  
                         $photochg = 'off';  
                     }  
                     $output .= '    <th>'."\n".'     '.  
                 '<a href="javascript:document.'.$formname.'.displayphotos.value='.  
                       "'".$photochg."'".';document.'.$formname.'.submit();">'.  
                       $photo_options{$photochg}.'</a>&nbsp;'.$lt{'photo'}."\n".  
                       '    </th>'."\n";  
                 }  
             }              }
               $output .= "</th>\n";
         }          }
           my %role_types = &role_type_names();
         $output .= &Apache::loncommon::end_data_table_header_row();          $output .= &Apache::loncommon::end_data_table_header_row();
 # Done with the HTML header line  # Done with the HTML header line
     } elsif ($mode eq 'csv') {      } elsif ($mode eq 'csv') {
Line 2519  END Line 2765  END
             $CSVfile = undef;              $CSVfile = undef;
         }          }
         #          #
         push @cols,'clicker';  
         # Write headers and data to file          # Write headers and data to file
         print $CSVfile '"'.$results_description.'"'."\n";           print $CSVfile '"'.$results_description.'"'."\n"; 
         print $CSVfile '"'.join('","',map {          print $CSVfile '"'.join('","',map {
             &Apache::loncommon::csv_translate($lt{$_})              &Apache::loncommon::csv_translate($lt{$_})
             } (@cols))."\"\n";              } (@cols))."\"\n";
     } elsif ($mode eq 'excel') {      } elsif ($mode eq 'excel') {
         push @cols,'clicker';  
         # Create the excel spreadsheet          # Create the excel spreadsheet
         ($excel_workbook,$excel_filename,$format) =          ($excel_workbook,$excel_filename,$format) =
             &Apache::loncommon::create_workbook($r);              &Apache::loncommon::create_workbook($r);
Line 2562  END Line 2806  END
                                                 Future  => 'Future',                                                  Future  => 'Future',
                                                 Expired => 'Expired',                                                  Expired => 'Expired',
                                                );                                                 );
       # If this is for a single course get last course "log-in".
       my %crslogins;
       if ($context eq 'course') {
           %crslogins=&Apache::lonnet::dump('nohist_crslastlogin',$cdom,$cnum);
       }
     # Get groups, role, permanent e-mail so we can sort on them if      # Get groups, role, permanent e-mail so we can sort on them if
     # necessary.      # necessary.
     foreach my $user (keys(%{$userlist})) {      foreach my $user (keys(%{$userlist})) {
Line 2645  END Line 2894  END
                     }                      }
                 }                  }
                 if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {                  if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
                     if (($displayphotos eq 'on') && ($role eq 'st')) {                      if ((grep/^photo$/,@cols) && ($role eq 'st')) {
                         $userlist->{$user}->[$index{'photo'}] =                          $userlist->{$user}->[$index{'photo'}] =
                             &Apache::lonnet::retrievestudentphoto($udom,$uname,'jpg');                              &Apache::lonnet::retrievestudentphoto($udom,$uname,'jpg');
                         $userlist->{$user}->[$index{'thumbnail'}] =                          $userlist->{$user}->[$index{'thumbnail'}] =
Line 2653  END Line 2902  END
                                                                 'gif','thumbnail');                                                                  'gif','thumbnail');
                     }                      }
                 }                  }
                   if (($role eq 'st') && ($defaultcredits)) {
                       if ($userlist->{$user}->[$index{'credits'}] eq '') {
                           $userlist->{$user}->[$index{'credits'}] = $defaultcredits;
                       }
                   }
             }              }
         }          }
         my %emails   = &Apache::loncommon::getemails($uname,$udom);          my %emails   = &Apache::loncommon::getemails($uname,$udom);
         if ($emails{'permanentemail'} =~ /\S/) {          if ($emails{'permanentemail'} =~ /\S/) {
             $userlist->{$user}->[$index{'email'}] = $emails{'permanentemail'};              $userlist->{$user}->[$index{'email'}] = $emails{'permanentemail'};
         }          }
           if (($context eq 'domain') && ($env{'form.roletype'} eq 'domain') && 
               ($role eq 'au')) {
               my ($disk_quota,$current_disk_usage,$percent); 
               if (($needauthorusage) || ($needauthorquota)) {
                   $disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,'author');
               }
               if ($needauthorusage) {
                   $current_disk_usage =
                       &Apache::lonnet::diskusage($udom,$uname,"$londocroot/priv/$udom/$uname");
                   if ($disk_quota == 0) {
                       $percent = 100.0;
                   } else {
                       $percent = $current_disk_usage/(10 * $disk_quota);
                   }
                   $userlist->{$user}->[$index{'authorusage'}] = sprintf("%.0f",$percent);
               }
               if ($needauthorquota) {
                   $userlist->{$user}->[$index{'authorquota'}] = sprintf("%.2f",$disk_quota);
               }
           }
         $usercount ++;          $usercount ++;
     }      }
     my $autocount = 0;      my $autocount = 0;
Line 2679  END Line 2953  END
     my $index  = $index{$sortby};      my $index  = $index{$sortby};
     my $second = $index{'username'};      my $second = $index{'username'};
     my $third  = $index{'domain'};      my $third  = $index{'domain'};
     my @sorted_users = sort {      my @sorted_users;
         lc($userlist->{$a}->[$index])  cmp lc($userlist->{$b}->[$index])      if (($sortby eq 'authorquota') || ($sortby eq 'authorusage')) {  
             ||          @sorted_users = sort {
         lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second])            ||              $userlist->{$b}->[$index] <=> $userlist->{$a}->[$index]           ||
         lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third])              lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second]) ||
         } (keys(%$userlist));              lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third])
               } (keys(%$userlist));
       } else {
           @sorted_users = sort {
               lc($userlist->{$a}->[$index]) cmp lc($userlist->{$b}->[$index])   ||
               lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second]) ||
               lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third])
               } (keys(%$userlist));
       }
     my $rowcount = 0;      my $rowcount = 0;
     foreach my $user (@sorted_users) {      foreach my $user (@sorted_users) {
         my %in;          my %in;
Line 2695  END Line 2977  END
         }          }
         my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];          my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];
         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'}],$crstype);
         if (! defined($in{'start'}) || $in{'start'} == 0) {          unless ($mode eq 'excel') {
             $in{'start'} = &mt('none');              if (! defined($in{'start'}) || $in{'start'} == 0) {
         } else {                  $in{'start'} = &mt('none');
             $in{'start'} = &Apache::lonlocal::locallocaltime($in{'start'});              } else {
                   $in{'start'} = &Apache::lonlocal::locallocaltime($in{'start'});
               }
               if (! defined($in{'end'}) || $in{'end'} == 0) {
                   $in{'end'} = &mt('none');
               } else {
                   $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});
               }
         }          }
         if (! defined($in{'end'}) || $in{'end'} == 0) {          if ($context eq 'course') {
             $in{'end'} = &mt('none');              my $lastlogin = $crslogins{$in{'username'}.':'.$in{'domain'}.':'.$in{'section'}.':'.$role};
         } else {              if ($lastlogin ne '') {
             $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});                  $in{'lastlogin'} = &Apache::lonlocal::locallocaltime($lastlogin);
               }
         }          }
         if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {          if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
             $r->print(&Apache::loncommon::start_data_table_row());              $r->print(&Apache::loncommon::start_data_table_row());
Line 2714  END Line 3004  END
             if ($mode eq 'autoenroll') {              if ($mode eq 'autoenroll') {
                 my $cellentry;                  my $cellentry;
                 if ($in{'type'} eq 'auto') {                  if ($in{'type'} eq 'auto') {
                     $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;Change</label>';                      $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Change').'</label>';
                     $autocount ++;                      $autocount ++;
                 } else {                  } else {
                     $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><span class="LC_nobreak"><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;Change</label></span></td></tr><tr><td><span class="LC_nobreak">';                      $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><span class="LC_nobreak"><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Change').'</label></span></td></tr><tr><td><span class="LC_nobreak">';
                     $manualcount ++;                      $manualcount ++;
                     if ($in{'lockedtype'}) {                      if ($in{'lockedtype'}) {
                         $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Unlock').'</label>';                          $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Unlock').'</label>';
Line 2752  END Line 3042  END
                     if ($showcheckbox) {                      if ($showcheckbox) {
                         $checkval = $user;                           $checkval = $user; 
                         if ($context eq 'course') {                          if ($context eq 'course') {
                             if ($role eq 'st') {                              if (($role eq 'co' || $role eq 'cc') &&
                                 $checkval .= ':st';                                  ($user =~ /^\Q$env{'user.name'}:$env{'user.domain'}:$role\E/)) {
                             }                                  $showcheckbox = 0;
                             $checkval .= ':'.$in{'section'};                              } else {
                             if ($role eq 'st') {                                  if ($role eq 'st') {
                                 $checkval .= ':'.$in{'type'}.':'.                                      $checkval .= ':st';
                                              $in{'lockedtype'};                                  }
                             }                                  $checkval .= ':'.$in{'section'};
                                   if ($role eq 'st') {
                                       $checkval .= ':'.$in{'type'}.':'.
                                                    $in{'lockedtype'}.':'.
                                                    $in{'credits'};
                                   }
                                }
                           }
                           if ($showcheckbox) {
                               $r->print('<td><input type="checkbox" name="'.
                                         'actionlist" value="'.$checkval.'" /></td>');
                           } else {
                               $r->print('<td>&nbsp;</td>');
                         }                          }
                         $r->print('<td><input type="checkbox" name="'.  
                                   'actionlist" value="'.$checkval.'" /></td>');  
                     } else {                      } else {
                         $r->print('<td>&nbsp;</td>');                          $r->print('<td>&nbsp;</td>');
                     }                      }
Line 2781  END Line 3081  END
                         $showitem = $ltstatus{$in{$item}};                          $showitem = $ltstatus{$in{$item}};
                     }                      }
                     $r->print('<td>'.$showitem.'</td>'."\n");                      $r->print('<td>'.$showitem.'</td>'."\n");
                 } else {                  } elsif ($item eq 'photo') {
                     $r->print('<td>'.$in{$item}.'</td>'."\n");                       if (($context eq 'course') && ($mode ne 'autoenroll') && 
                 }                           ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'})) { 
             }                           if ($role eq 'st') {
             if (($context eq 'course') && ($mode ne 'autoenroll')) {                               $r->print('<td align="right"><a href="javascript:photowindow('."'".$in{'photo'}."'".')"><img src="'.$in{'thumbnail'}.'" border="1" alt="" /></a></td>');
                 if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {                           } else {
                     if ($displayclickers eq 'on') {                               $r->print('<td>&nbsp;</td>');
                         my $clickers =                           }
                        }
                   } elsif ($item eq 'clicker') {
                       if (($context eq 'course') && ($mode ne 'autoenroll')) {
                           if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {
                               my $clickers =
                    (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];                     (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];
                         if ($clickers!~/\w/) { $clickers='-'; }                              if ($clickers!~/\w/) { $clickers='-'; }
                         $r->print('<td>'.$clickers.'</td>');                              $r->print('<td>'.$clickers.'</td>');
                     } else {  
                         $r->print('    <td>&nbsp;</td>  ');  
                     }  
                     if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {  
                         if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') {  
                             $r->print('    <td align="right"><a href="javascript:photowindow('."'".$in{'photo'}."'".')"><img src="'.$in{'thumbnail'}.'" border="1" alt="" /></a></td>');  
                         } else {                          } else {
                             $r->print('    <td>&nbsp;</td>  ');                               $r->print('<td>&nbsp;</td>'."\n");
                         }                          } 
                     }                      }
                   } elsif (($item eq 'authorquota') || ($item eq 'authorusage')) {
                       $r->print('<td align="right">'.$in{$item}.'</td>'."\n");
                   } else {
                       $r->print('<td>'.$in{$item}.'</td>'."\n");
                 }                  }
             }              }
             $r->print(&Apache::loncommon::end_data_table_row());              $r->print(&Apache::loncommon::end_data_table_row());
         } elsif ($mode eq 'csv') {          } elsif ($mode eq 'csv') {
             next if (! defined($CSVfile));              next if (! defined($CSVfile));
             # no need to bother with $linkto              # no need to bother with $linkto
             if (! defined($in{'start'}) || $in{'start'} == 0) {  
                 $in{'start'} = &mt('none');  
             } else {  
                 $in{'start'} = &Apache::lonlocal::locallocaltime($in{'start'});  
             }  
             if (! defined($in{'end'}) || $in{'end'} == 0) {  
                 $in{'end'} = &mt('none');  
             } else {  
                 $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});  
             }  
             my @line = ();              my @line = ();
             foreach my $item (@cols) {              foreach my $item (@cols) {
                 push @line,&Apache::loncommon::csv_translate($in{$item});                  push @line,&Apache::loncommon::csv_translate($in{$item});
Line 2827  END Line 3120  END
             my $col = 0;              my $col = 0;
             foreach my $item (@cols) {              foreach my $item (@cols) {
                 if ($item eq 'start' || $item eq 'end') {                  if ($item eq 'start' || $item eq 'end') {
                     if (defined($item) && $item != 0) {                      if ((defined($in{$item})) && ($in{$item} != 0)) {
                         $excel_sheet->write($row,$col++,                          $excel_sheet->write($row,$col++,
                             &Apache::lonstathelpers::calc_serial($in{item}),                              &Apache::lonstathelpers::calc_serial($in{$item}),
                                     $format->{'date'});                                      $format->{'date'});
                     } else {                      } else {
                         $excel_sheet->write($row,$col++,'none');                          $excel_sheet->write($row,$col++,'none');
Line 2845  END Line 3138  END
             $r->print(&Apache::loncommon::end_data_table().'<br />');              $r->print(&Apache::loncommon::end_data_table().'<br />');
     } elsif ($mode eq 'excel') {      } elsif ($mode eq 'excel') {
         $excel_workbook->close();          $excel_workbook->close();
  $r->print(&mt('[_1]Your Excel spreadsheet[_2] is ready for download.', '<p><a href="'.$excel_filename.'">','</a>')."</p>\n");   $r->print('<p>'.&mt('[_1]Your Excel spreadsheet[_2] is ready for download.', '<a href="'.$excel_filename.'">','</a>')."</p>\n");
     } elsif ($mode eq 'csv') {      } elsif ($mode eq 'csv') {
         close($CSVfile);          close($CSVfile);
  $r->print(&mt('[_1]Your CSV file[_2] is ready for download.', '<p><a href="'.$CSVfilename.'">','</a>')."</p>\n");   $r->print('<p>'.&mt('[_1]Your CSV file[_2] is ready for download.', '<a href="'.$CSVfilename.'">','</a>')."</p>\n");
         $r->rflush();          $r->rflush();
     }      }
     if ($mode eq 'autoenroll') {      if ($mode eq 'autoenroll') {
Line 3010  sub select_actions { Line 3303  sub select_actions {
                 chgdates  => "Change starting/ending dates",                  chgdates  => "Change starting/ending dates",
                 chgsec   => "Change section associated with user roles",                  chgsec   => "Change section associated with user roles",
     );      );
       # FIXME Add an option to change credits for student roles.
     my ($output,$options,%choices);      my ($output,$options,%choices);
     # FIXME Disable actions for now for roletype=course in domain context      # FIXME Disable actions for now for roletype=course in domain context
     if ($context eq 'domain' && $setting eq 'course') {      if ($context eq 'domain' && $setting eq 'course') {
Line 3017  sub select_actions { Line 3311  sub select_actions {
     }      }
     if ($context eq 'course') {      if ($context eq 'course') {
         if ($env{'form.showrole'} ne 'Any') {          if ($env{'form.showrole'} ne 'Any') {
              if (!&Apache::lonnet::allowed('c'.$env{'form.showrole'},              my $showactions;
                                            $env{'request.course.id'})) {              if (&Apache::lonnet::allowed('c'.$env{'form.showrole'},
                  if ($env{'request.course.sec'} eq '') {                                            $env{'request.course.id'})) {
                      return;                  $showactions = 1;  
                  } else {              } elsif ($env{'request.course.sec'} ne '') {
                      if (!&Apache::lonnet::allowed('c'.$env{'form.showrole'},$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {                  if (&Apache::lonnet::allowed('c'.$env{'form.showrole'},$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
                          return;                      $showactions = 1;
                      }                  }
                  }              }
               unless ($showactions) {
                   unless (&is_courseowner($env{'request.course.id'},
                                          $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'})) {
                       return; 
                   }
             }              }
         }          }
     }      }
Line 3132  ENDTWO Line 3431  ENDTWO
 }  }
   
 sub date_section_selector {  sub date_section_selector {
     my ($context,$permission,$crstype) = @_;      my ($context,$permission,$crstype,$showcredits) = @_;
     my $callingform = $env{'form.callingform'};      my $callingform = $env{'form.callingform'};
     my $formname = 'dateselect';        my $formname = 'dateselect';  
     my $groupslist = &get_groupslist();      my $groupslist = &get_groupslist();
     my $sec_js = &setsections_javascript($formname,$groupslist);      my $sec_js =
           &setsections_javascript($formname,$groupslist,undef,undef,$crstype,
                                   $showcredits);
     my $output = <<"END";      my $output = <<"END";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 3268  ENDJS Line 3569  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,'chgsec',$crstype);
         $output .= $info.$secbox;          $output .= $info.$secbox;
     }      }
     $output .= '<p>'.      $output .= '<p>'.
Line 3278  ENDJS Line 3580  ENDJS
 }  }
   
 sub section_picker {  sub section_picker {
     my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype) = @_;      my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype,
           $showcredits,$credits) = @_;
     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 = '<div>'.&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,$crstype,$showcredits);
         $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 3298  sub section_picker { Line 3601  sub section_picker {
                    '<input type="hidden" name="sections" value="" />'."\n".                     '<input type="hidden" name="sections" value="" />'."\n".
                    '</td></tr></table>'."\n";                     '</td></tr></table>'."\n";
     } else {      } else {
        $secbox .= '<input type="hidden" name="sections" value="'.          $secbox .= '<input type="hidden" name="sections" value="'.
                    $env{'request.course.sec'}.'" />'.                     $env{'request.course.sec'}.'" />'.
                    $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>';      unless ($mode eq 'chgsec') {
           if ($showcredits) {
               $secbox .= 
                   &Apache::lonhtmlcommon::row_title(&mt('credits (students)'),
                                                     'LC_evenrow_value')."\n".
                   '<input type="text" name="credits" size="3" value="'.$credits.'" />'."\n".
                   &Apache::lonhtmlcommon::row_closure(1)."\n";
           }
       }
       $secbox .= &Apache::lonhtmlcommon::end_pick_box().'</div>';
     return $secbox;      return $secbox;
 }  }
   
Line 3527  sub show_drop_list { Line 3839  sub show_drop_list {
 $check_uncheck_js  $check_uncheck_js
 // ]]>  // ]]>
 </script>  </script>
 <p>  
 <input type="hidden" name="phase" value="four" />  <input type="hidden" name="phase" value="four" />
 END  END
     my ($indexhash,$keylist) = &make_keylist_array();      my ($indexhash,$keylist) = &make_keylist_array();
Line 3551  END Line 3862  END
         }          }
     }      }
     if (!$studentcount) {      if (!$studentcount) {
          my $msg = '';
         if ($crstype eq 'Community') {          if ($crstype eq 'Community') {
             $r->print(&mt('There are no members to drop.'));              $msg = &mt('There are no members to drop.');
         } else {          } else {
             $r->print(&mt('There are no students to drop.'));              $msg = &mt('There are no students to drop.');
         }          }
           $r->print('<p class="LC_info">'.$msg.'</p>');
         return;          return;
     }      }
     my ($classgroups) = &Apache::loncoursedata::get_group_memberships(      my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
                                               $classlist,$keylist,$cdom,$cnum);                                                $classlist,$keylist,$cdom,$cnum);
     my %lt=&Apache::lonlocal::texthash('usrn'   => "username",      my %lt=&Apache::lonlocal::texthash('usrn'   => "username",
                                        'dom'    => "domain",                                         'dom'    => "domain",
                                          'id'     => "ID",
                                        'sn'     => "student name",                                         'sn'     => "student name",
                                        'mn'     => "member name",                                         'mn'     => "member name",
                                        'sec'    => "section",                                         'sec'    => "section",
Line 3580  END Line 3894  END
     <th>&nbsp;</th>      <th>&nbsp;</th>
     <th>$lt{'usrn'}</th>      <th>$lt{'usrn'}</th>
     <th>$lt{'dom'}</th>      <th>$lt{'dom'}</th>
     <th>ID</th>      <th>$lt{'id'}</th>
     <th>$nametitle</th>      <th>$nametitle</th>
     <th>$lt{'sec'}</th>      <th>$lt{'sec'}</th>
     <th>$lt{'start'}</th>      <th>$lt{'start'}</th>
Line 3594  END Line 3908  END
         $r->print(<<END);          $r->print(<<END);
     <th>&nbsp;</th>      <th>&nbsp;</th>
     <th>      <th>
        <a href="/adm/createuser?action=$action&sortby=username">$lt{'usrn'}</a>         <a href="/adm/createuser?action=$action&amp;sortby=username">$lt{'usrn'}</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=domain">$lt{'dom'}</a>         <a href="/adm/createuser?action=$action&amp;sortby=domain">$lt{'dom'}</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=id">ID</a>         <a href="/adm/createuser?action=$action&amp;sortby=id">$lt{'id'}</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=fullname">$nametitle</a>         <a href="/adm/createuser?action=$action&amp;sortby=fullname">$nametitle</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=section">$lt{'sec'}</a>         <a href="/adm/createuser?action=$action&amp;sortby=section">$lt{'sec'}</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=start">$lt{'start'}</a>         <a href="/adm/createuser?action=$action&amp;sortby=start">$lt{'start'}</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=end">$lt{'end'}</a>         <a href="/adm/createuser?action=$action&amp;sortby=end">$lt{'end'}</a>
     </th><th>      </th><th>
        <a href="/adm/createuser?action=$action&sortby=groups">$lt{'groups'}</a>         <a href="/adm/createuser?action=$action&amp;sortby=groups">$lt{'groups'}</a>
     </th>      </th>
 END  END
         $r->print(&Apache::loncommon::end_data_table_header_row());          $r->print(&Apache::loncommon::end_data_table_header_row());
Line 3679  END Line 3993  END
         $btn = $lt{'dm'};           $btn = $lt{'dm'}; 
     }      }
     $r->print(<<"END");      $r->print(<<"END");
 </p>  
 <p>  <p>
 <input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)" /> &nbsp;  <input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)" /> &nbsp;
 <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)" />  <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)" />
Line 3701  sub print_first_users_upload_form { Line 4014  sub print_first_users_upload_form {
     $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 .= &Apache::grades::checkforfile_js();
   
     $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 .= '<div class="LC_columnSection">'
            .&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"             .' '.&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";             ."</div>\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'));
     if (&Apache::lonlocal::current_language() ne 'en') {      if (&Apache::lonlocal::current_language() ne 'en') {
Line 3731  sub print_first_users_upload_form { Line 4045  sub print_first_users_upload_form {
            .&Apache::lonhtmlcommon::end_pick_box();             .&Apache::lonhtmlcommon::end_pick_box();
   
     $str .= '<p>'      $str .= '<p>'
            .'<input type="submit" name="fileupload" value="'.&mt('Next').'" />'             .'<input type="submit" name="fileupload" value="'.&mt('Next').'"'
              .' onclick="javascript:checkUpload(this.form);" />'
            .'</p>';             .'</p>';
   
     $r->print($str);      $r->print($str);
Line 3740  sub print_first_users_upload_form { Line 4055  sub print_first_users_upload_form {
   
 # ================================================= Drop/Add from uploaded file  # ================================================= Drop/Add from uploaded file
 sub upfile_drop_add {  sub upfile_drop_add {
     my ($r,$context,$permission) = @_;      my ($r,$context,$permission,$showcredits) = @_;
     &Apache::loncommon::load_tmp_file($r);      &Apache::loncommon::load_tmp_file($r);
     my @userdata=&Apache::loncommon::upfile_record_sep();      my @userdata=&Apache::loncommon::upfile_record_sep();
     if($env{'form.noFirstLine'}){shift(@userdata);}      if($env{'form.noFirstLine'}){shift(@userdata);}
Line 3761  sub upfile_drop_add { Line 4076  sub upfile_drop_add {
     }      }
     #      #
     # Store the field choices away      # Store the field choices away
     foreach my $field (qw/username names      my @storefields = qw/username names fname mname lname gen id 
                        fname mname lname gen id sec ipwd email role domain/) {                           sec ipwd email role domain inststatus/;
       if ($showcredits) {
           push (@storefields,'credits');
       }
       my %fieldstype; 
       foreach my $field (@storefields) {
         $env{'form.'.$field.'_choice'}=$fields{$field};          $env{'form.'.$field.'_choice'}=$fields{$field};
           $fieldstype{$field.'_choice'} = 'scalar';
     }      }
     &Apache::loncommon::store_course_settings('enrollment_upload',      &Apache::loncommon::store_course_settings('enrollment_upload',\%fieldstype);
                                               { 'username_choice' => 'scalar',  
                                                 'names_choice' => 'scalar',  
                                                 'fname_choice' => 'scalar',  
                                                 'mname_choice' => 'scalar',  
                                                 'lname_choice' => 'scalar',  
                                                 'gen_choice' => 'scalar',  
                                                 'id_choice' => 'scalar',  
                                                 'sec_choice' => 'scalar',  
                                                 'ipwd_choice' => 'scalar',  
                                                 'email_choice' => 'scalar',  
                                                 'role_choice'  => 'scalar',  
                                                 'domain_choice' => 'scalar',  
                                                 'inststatus_choice' => 'scalar'});  
     #  
     my ($cid,$crstype,$setting);      my ($cid,$crstype,$setting);
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $setting = $env{'form.roleaction'};          $setting = $env{'form.roleaction'};
Line 3847  sub upfile_drop_add { Line 4154  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 ($defaultsec,$defaultrole,$defaultcredits,$commoncredits);
     if ($context eq 'domain') {      if ($context eq 'domain') {
         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'};
         }                if ($showcredits) {
                   $commoncredits = $env{'form.credits'};
                   if ($crstype ne 'Community') {
                       my %coursehash=&Apache::lonnet::coursedescription($cid);
                       $defaultcredits = $coursehash{'internal.defaultcredits'};
                   }
               }
           }
     } 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 ($showcredits) {
               $commoncredits = $env{'form.credits'};
               $defaultcredits = $env{'course.'.$cid.'.internal.defaultcredits'};
           }
     }      }
     # 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',
Line 3969  sub upfile_drop_add { Line 4287  sub upfile_drop_add {
                             official   => 'Institutional',                              official   => 'Institutional',
                             unofficial => 'Non-institutional',                              unofficial => 'Non-institutional',
                         );                          );
         map { $cancreate{$_} = &can_create_user($domain,$context,$_); } keys(%longtypes);          my $newuserdom = $env{'request.role.domain'};
           map { $cancreate{$_} = &can_create_user($newuserdom,$context,$_); } keys(%longtypes);
         # Get new users list          # Get new users list
         foreach my $line (@userdata) {          foreach my $line (@userdata) {
             my @secs;              my @secs;
Line 4003  sub upfile_drop_add { Line 4322  sub upfile_drop_add {
                     if ($entries{$fields{'username'}} =~ /\s/) {                      if ($entries{$fields{'username'}} =~ /\s/) {
                         $nowhitespace = ' - '.&mt('usernames may not contain spaces.');                          $nowhitespace = ' - '.&mt('usernames may not contain spaces.');
                     }                      }
                     $r->print('<br />'.                      $r->print(
       &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]',                          '<br />'.
           '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen).                          &mt('Unacceptable username [_1] for user [_2] [_3] [_4] [_5]',
                               $nowhitespace);                                  '"<b>'.$entries{$fields{'username'}}.'</b>"',
                                   $fname,$mname,$lname,$gen).
                           $nowhitespace);
                     next;                      next;
                 } else {                  } else {
                     $entries{$fields{'domain'}} =~ s/^\s+|\s+$//g;                      $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(
                                   '</b>: '.&mt('Unacceptable domain for user [_2] [_3] [_4] [_5]',$fname,$mname,$lname,$gen));                              '<br />'.
                         next;                              &mt('Unacceptable domain [_1] for user [_2] [_3] [_4] [_5]',
                                      '"<b>'.$entries{$fields{'domain'}}.'</b>"',
                                       $fname,$mname,$lname,$gen));
                       next;
                     }                      }
                     my $username = $entries{$fields{'username'}};                      my $username = $entries{$fields{'username'}};
                     my $userdomain = $entries{$fields{'domain'}};                      my $userdomain = $entries{$fields{'domain'}};
Line 4118  sub upfile_drop_add { Line 4442  sub upfile_drop_add {
                     foreach (\$id,\$fname,\$mname,\$lname,\$gen,\$inststatus) {                      foreach (\$id,\$fname,\$mname,\$lname,\$gen,\$inststatus) {
                         $$_ =~ s/(\s+$|^\s+)//g;                          $$_ =~ s/(\s+$|^\s+)//g;
                     }                      }
                       my $credits;
                       if ($showcredits) {
                           if (($role eq 'st') && ($crstype ne 'Community')) {
                               $credits = $entries{$fields{'credits'}};
                               if ($credits ne '') {
                                   $credits =~ s/[^\d\.]//g;
                               }
                               if ($credits eq '') {
                                   $credits = $commoncredits;
                               }
                               if ($credits eq $defaultcredits) {
                                   undef($credits);
                               }
                           }
                       }
                     # check against rules                      # check against rules
                     my $checkid = 0;                      my $checkid = 0;
                     my $newuser = 0;                      my $newuser = 0;
                     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) {                          if ($userdomain ne $newuserdom) {
                             $r->print('<br />'.                              if ($context eq 'course') {
                                 &mt('[_1]: The domain specified ([_2]) is different to that of the course.',                                  $r->print('<br />'.
                                     '<b>'.$username.'</b>',$userdomain).'<br />'.                                            &mt('[_1]: The domain specified ([_2]) is different to that of the course.',
                                 &mt('The user does not already exist, and you may not create a new user in a different domain.'));                                            '<b>'.$username.'</b>',$userdomain).'<br />');
                               } elsif ($context eq 'author') {
                                   $r->print(&mt('[_1]: The domain specified ([_2]) is different to that of the author.',
                                           '<b>'.$username.'</b>',$userdomain).'<br />'); 
                               } else {
                                   $r->print(&mt('[_1]: The domain specified ([_2]) is different to that of your current role.',
                                           '<b>'.$username.'</b>',$userdomain).'<br />');
                               }
                               $r->print(&mt('The user does not already exist, and you may not create a new user in a different domain.'));
                             next;                              next;
                         }                          }
                         $checkid = 1;                          $checkid = 1;
                         $newuser = 1;                          $newuser = 1;
                         my $user = $username.':'.$domain;                          my $user = $username.':'.$newuserdom;
                         my $checkhash;                          my $checkhash;
                         my $checks = { 'username' => 1 };                          my $checks = { 'username' => 1 };
                         $checkhash->{$username.':'.$domain} = { 'newuser' => 1, };                          $checkhash->{$username.':'.$newuserdom} = { 'newuser' => 1, };
                         &Apache::loncommon::user_rule_check($checkhash,$checks,                          &Apache::loncommon::user_rule_check($checkhash,$checks,
                             \%alerts,\%rulematch,\%inst_results,\%curr_rules,                              \%alerts,\%rulematch,\%inst_results,\%curr_rules,
                             \%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'}{$newuserdom}) eq 'HASH') {
                                 if ($alerts{'username'}{$domain}{$username}) {                                  if ($alerts{'username'}{$newuserdom}{$username}) {
                                     $r->print('<br />'.                                      $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('[_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.'));                                                &mt('Consequently, the user was not created.'));
Line 4159  sub upfile_drop_add { Line 4506  sub upfile_drop_add {
                         unless ($cancreate{$usertype}) {                          unless ($cancreate{$usertype}) {
                             my $showtype = $longtypes{$usertype};                              my $showtype = $longtypes{$usertype};
                             $r->print('<br />'.                              $r->print('<br />'.
                                       &mt("[_1]: The user does not exist, and you are not permitted to create users of type: $showtype.",'<b>'.$username.'</b>'));                                        &mt('[_1]: The user does not exist, and you are not permitted to create users of type: [_2].','<b>'.$username.'</b>',$showtype));
                             next;                              next;
                         }                          }
                     } else {                      } else {
Line 4240  sub upfile_drop_add { Line 4587  sub upfile_drop_add {
                                      $fname,$mname,$lname,$gen,$sec,$enddate,                                       $fname,$mname,$lname,$gen,$sec,$enddate,
                                      $startdate,$env{'form.forceid'},                                       $startdate,$env{'form.forceid'},
                                      $desiredhost,$email,'manual','',$cid,                                       $desiredhost,$email,'manual','',$cid,
                                      '',$context,$inststatus);                                       '',$context,$inststatus,$credits);
                             $userresult = $roleresult;                              $userresult = $roleresult;
                         } else {                          } else {
                             if ($role ne '') {                               if ($role ne '') { 
Line 4335  sub upfile_drop_add { Line 4682  sub upfile_drop_add {
             #  Get current classlist              #  Get current classlist
             my $classlist = &Apache::loncoursedata::get_classlist();              my $classlist = &Apache::loncoursedata::get_classlist();
             if (! defined($classlist)) {              if (! defined($classlist)) {
                 $r->print('<form name="studentform" method="post" action="/adm/createuser" />'.                  $r->print('<form name="studentform" method="post" action="/adm/createuser">'.
                           '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.                            '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
                           &mt('There are no students with current/future access to the course.').                            '<p class="LC_info">'.&mt('There are no students with current/future access to the course.').'</p>'.
                           '</form>'."\n");                            '</form>'."\n");
             } elsif (ref($classlist) eq 'HASH') {              } elsif (ref($classlist) eq 'HASH') {
                 # Remove the students we just added from the list of students.                  # Remove the students we just added from the list of students.
Line 4458  sub print_drop_menu { Line 4805  sub print_drop_menu {
         $heading = &mt("Drop Students");          $heading = &mt("Drop Students");
     }      }
     $r->print('<h3>'.$heading.'</h3>'."\n".      $r->print('<h3>'.$heading.'</h3>'."\n".
               '<form name="studentform" method="post">'."\n");                '<form name="studentform" method="post" action="">'."\n");
     my $classlist = &Apache::loncoursedata::get_classlist();      my $classlist = &Apache::loncoursedata::get_classlist();
     if (! defined($classlist)) {      if (! defined($classlist)) {
           my $msg = '';
         if ($crstype eq 'Community') {          if ($crstype eq 'Community') {
             $r->print(&mt('There are no members currently enrolled.')."\n");              $msg = &mt('There are no members currently enrolled.');
         } else {          } else {
             $r->print(&mt('There are no students currently enrolled.')."\n");              $msg = &mt('There are no students currently enrolled.');
         }          }
           $r->print('<p class="LC_info">'.$msg."</p>\n");
     } else {      } else {
         &show_drop_list($r,$classlist,'nosort',$permission,$crstype);          &show_drop_list($r,$classlist,'nosort',$permission,$crstype);
     }      }
     $r->print('</form>'. &Apache::loncommon::end_page());      $r->print('</form>');
     return;      return;
 }  }
   
Line 4512  sub update_user_list { Line 4861  sub update_user_list {
     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,$scopestem,$singlesec,$showsecs,$warn_singlesec,              @sections,$scopestem,$singlesec,$showsecs,$warn_singlesec,
             $nothingtodo,$keepnosection);              $nothingtodo,$keepnosection,$credits);
         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 4525  sub update_user_list { Line 4874  sub update_user_list {
                 $scope = $scopestem.'/'.$sec;                  $scope = $scopestem.'/'.$sec;
             }              }
         } elsif ($context eq 'course') {          } elsif ($context eq 'course') {
             ($uname,$udom,$role,$sec,$type,$locktype) = split(/\:/,$item,-1);              ($uname,$udom,$role,$sec,$type,$locktype,$credits) =
                   split(/\:/,$item);
             $cid = $env{'request.course.id'};              $cid = $env{'request.course.id'};
             $scopestem = '/'.$cid;              $scopestem = '/'.$cid;
             $scopestem =~s/\_/\//g;              $scopestem =~s/\_/\//g;
Line 4544  sub update_user_list { Line 4894  sub update_user_list {
             } elsif ($setting eq 'author') {               } elsif ($setting eq 'author') { 
                 ($uname,$udom,$role,$scope) = split(/\:/,$item);                  ($uname,$udom,$role,$scope) = split(/\:/,$item);
             } elsif ($setting eq 'course') {              } elsif ($setting eq 'course') {
                 ($uname,$udom,$role,$cid,$sec,$type,$locktype) =                   ($uname,$udom,$role,$cid,$sec,$type,$locktype,$credits) = 
                     split(/\:/,$item);                      split(/\:/,$item);
                 $scope = '/'.$cid;                  $scope = '/'.$cid;
                 $scope =~s/\_/\//g;                  $scope =~s/\_/\//g;
Line 4567  sub update_user_list { Line 4917  sub update_user_list {
             $end = $now;               $end = $now; 
             if ($role eq 'st') {              if ($role eq 'st') {
                 $result =                   $result = 
                     &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);                      &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits);
             } else {              } else {
                 $result =                   $result = 
                     &Apache::lonnet::revokerole($udom,$uname,$scope,$role,                      &Apache::lonnet::revokerole($udom,$uname,$scope,$role,
Line 4575  sub update_user_list { Line 4925  sub update_user_list {
             }              }
         } elsif ($choice eq 'delete') {          } elsif ($choice eq 'delete') {
             if ($role eq 'st') {              if ($role eq 'st') {
                 &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context);                  &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context,$credits);
             }              }
             $result =              $result =
                 &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now,                  &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now,
Line 4588  sub update_user_list { Line 4938  sub update_user_list {
             }              }
             if ($choice eq 'reenable') {              if ($choice eq 'reenable') {
                 if ($role eq 'st') {                  if ($role eq 'st') {
                     $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);                      $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits);
                 } else {                  } else {
                     $result =                       $result = 
                         &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,                          &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
Line 4596  sub update_user_list { Line 4946  sub update_user_list {
                 }                  }
             } elsif ($choice eq 'activate') {              } elsif ($choice eq 'activate') {
                 if ($role eq 'st') {                  if ($role eq 'st') {
                     $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);                      $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits);
                 } else {                  } else {
                     $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,                      $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
                                             $now,'','',$context);                                              $now,'','',$context);
                 }                  }
             } elsif ($choice eq 'chgdates') {              } elsif ($choice eq 'chgdates') {
                 if ($role eq 'st') {                  if ($role eq 'st') {
                     $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);                      $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits);
                 } else {                  } else {
                     $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,                      $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
                                                 $start,'','',$context);                                                  $start,'','',$context);
Line 4673  sub update_user_list { Line 5023  sub update_user_list {
                     } else {                      } 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,$credits);
                         } else {                          } else {
                             my $newscope = $scopestem;                              my $newscope = $scopestem;
                             $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context);                              $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context);
Line 4687  sub update_user_list { Line 5037  sub update_user_list {
                     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,$credits);
                                 if (@newsecs > 1) {                                  if (@newsecs > 1) {
                                     my $showsingle;                                       my $showsingle; 
                                     if ($newsec eq '') {                                      if ($newsec eq '') {
Line 4798  sub update_user_list { Line 5148  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} [quant,_1,user role,user roles,no user roles].",$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>');
Line 4815  sub update_user_list { Line 5165  sub update_user_list {
     if ($choice eq 'drop') {      if ($choice eq 'drop') {
         $linktext = &mt('Display current class roster');          $linktext = &mt('Display current class roster');
     }      }
     $r->print('<a href="javascript:document.studentform.submit()">'.$linktext.'</a></form>'."\n");      $r->print(
           &Apache::lonhtmlcommon::actionbox(
               ['<a href="javascript:document.studentform.submit()">'.$linktext.'</a>'])
          .'</form>'."\n");
 }  }
   
 sub dates_feedback {  sub dates_feedback {
Line 4823  sub dates_feedback { Line 5176  sub dates_feedback {
     my $dates;      my $dates;
     if ($start < $now) {      if ($start < $now) {
         if ($end == 0) {          if ($end == 0) {
             $dates .= &mt('role(s) active now; no end date');              $dates = &mt('role(s) active now; no end date');
         } elsif ($end > $now) {          } elsif ($end > $now) {
             $dates = &mt('role(s) active now; ends [_1].',&Apache::lonlocal::locallocaltime($end));              $dates = &mt('role(s) active now; ends [_1].',&Apache::lonlocal::locallocaltime($end));
         } else {          } else {
Line 4976  sub get_groupslist { Line 5329  sub get_groupslist {
 }  }
   
 sub setsections_javascript {  sub setsections_javascript {
     my ($formname,$groupslist,$mode,$checkauth,$crstype) = @_;      my ($formname,$groupslist,$mode,$checkauth,$crstype,$showcredits) = @_;
     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.'"';
         $finish = "return 'ok';";          $finish = "return 'ok';";
         $rolecode = "var role = formname.defaultrole.options[formname.defaultrole.selectedIndex].value;\n";          $rolecode = "var role = formname.defaultrole.options[formname.defaultrole.selectedIndex].value;\n";
     } elsif ($formname eq 'cu') {      } elsif ($formname eq 'cu') {
         $checkincluded = 'formname.elements[i-1].checked == true';          if (($crstype eq 'Course') && ($showcredits)) {
               $checkincluded = "((role == 'st') && (formname.elements[i-2].checked == true)) || ((role != 'st') && (formname.elements[i-1].checked == true))";
           } else {
               $checkincluded = 'formname.elements[i-1].checked == true';
           }
         if ($checkauth) {          if ($checkauth) {
             $finish = "var authcheck = auth_check();\n".              $finish = "var authcheck = auth_check();\n".
                       "   if (authcheck == 'ok') {\n".                        "   if (authcheck == 'ok') {\n".
Line 4994  sub setsections_javascript { Line 5351  sub setsections_javascript {
         }          }
         $rolecode = "var match = str.split('_');          $rolecode = "var match = str.split('_');
                 var role = match[3];\n";                  var role = match[3];\n";
     } elsif ($formname eq 'enrollstudent') {      } elsif (($formname eq 'enrollstudent') || ($formname eq 'selfenroll')) {
         $checkincluded = 'formname.name == "'.$formname.'"';          $checkincluded = 'formname.name == "'.$formname.'"';
         if ($checkauth) {          if ($checkauth) {
             $finish = "var authcheck = auth_check();\n".              $finish = "var authcheck = auth_check();\n".
Line 5020  sub setsections_javascript { Line 5377  sub setsections_javascript {
                     acor => 'A 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.',                      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.',
                     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.',
Line 5042  function setSections(formname,crstype) { Line 5399  function setSections(formname,crstype) {
         var checkcurr = str.match(re1);          var checkcurr = str.match(re1);
         if (checkcurr != null) {          if (checkcurr != null) {
             var num = i;              var num = i;
               $rolecode
             if ($checkincluded) {              if ($checkincluded) {
                 $rolecode  
                 if (role == 'cc' || role == 'co') {                  if (role == 'cc' || role == 'co') {
                     if (role == 'cc') {                      if (role == 'cc') {
                         alert("$alerts{'secd'}\\n$alerts{'accr'}");                          alert("$alerts{'secd'}\\n$alerts{'accr'}");
Line 5240  sub can_modify_userinfo { Line 5597  sub can_modify_userinfo {
 }  }
   
 sub check_usertype {  sub check_usertype {
     my ($dom,$uname,$rules) = @_;      my ($dom,$uname,$rules,$curr_rules,$got_rules) = @_;
     my $usertype;      my $usertype;
     if (ref($rules) eq 'HASH') {      if ((ref($got_rules) eq 'HASH') && (ref($curr_rules) eq 'HASH')) {
         my @user_rules = keys(%{$rules});          if (!$got_rules->{$dom}) {
         if (@user_rules > 0) {              my %domconfig = &Apache::lonnet::get_dom('configuration',
             my %rule_check = &Apache::lonnet::inst_rulecheck($dom,$uname,undef,'username',\@user_rules);                                                ['usercreation'],$dom);
             if (keys(%rule_check) > 0) {              if (ref($domconfig{'usercreation'}) eq 'HASH') {
                 $usertype = 'unofficial';                  foreach my $item ('username','id') {
                 foreach my $item (keys(%rule_check)) {                      if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') {
                     if ($rule_check{$item}) {                          $curr_rules->{$dom}{$item} =
                         $usertype = 'official';                                  $domconfig{'usercreation'}{$item.'_rule'};
                         last;                      }
                   }
               }
               $got_rules->{$dom} = 1;
           }
           if (ref($rules) eq 'HASH') {
               my @user_rules;
               if (ref($curr_rules->{$dom}{'username'}) eq 'ARRAY') {
                   foreach my $rule (keys(%{$rules})) {
                       if (grep(/^\Q$rule\E/,@{$curr_rules->{$dom}{'username'}})) {
                           push(@user_rules,$rule);
                       }
                   } 
               }
               if (@user_rules > 0) {
                   my %rule_check = &Apache::lonnet::inst_rulecheck($dom,$uname,undef,'username',\@user_rules);
                   if (keys(%rule_check) > 0) {
                       $usertype = 'unofficial';
                       foreach my $item (keys(%rule_check)) {
                           if ($rule_check{$item}) {
                               $usertype = 'official';
                               last;
                           }
                     }                      }
                 }                  }
             }              }
Line 5322  sub get_permission { Line 5701  sub get_permission {
         if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {          if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
             $permission{'grp_manage'} = 1;              $permission{'grp_manage'} = 1;
         }          }
           if ($permission{'cusr'}) {
               my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
               my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
               my %coursehash = (
                   'internal.selfenrollmgrdc' => $env{'course.'.$env{'request.course.id'}.'.internal.selfenrollmgrdc'},
                   'internal.selfenrollmgrcc' => $env{'course.'.$env{'request.course.id'}.'.internal.selfenrollmgrcc'},
                   'internal.coursecode'      => $env{'course.'.$env{'request.course.id'}.'.internal.coursecode'},
                   'internal.textbook'        =>$env{'course.'.$env{'request.course.id'}.'.internal.textbook'},
               );
               my ($managed_by_cc,$managed_by_dc) = &selfenrollment_administration($cdom,$cnum,$crstype,\%coursehash);
               if (ref($managed_by_cc) eq 'ARRAY') {
                   if (@{$managed_by_cc}) {
                       $permission{'selfenrolladmin'} = 1;
                   }
               }
           }
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         $permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'});          $permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'});
         $permission{'view'} = $permission{'cusr'};          $permission{'view'} = $permission{'cusr'};
Line 5394  sub get_course_identity { Line 5789  sub get_course_identity {
 }  }
   
 sub dc_setcourse_js {  sub dc_setcourse_js {
     my ($formname,$mode,$context) = @_;      my ($formname,$mode,$context,$showcredits) = @_;
     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 $cotext = &Apache::lonnet::plaintext('co');
Line 5480  function setCourse() { Line 5875  function setCourse() {
         }          }
 SCRIPTTOP  SCRIPTTOP
     if ($mode ne 'upload') {      if ($mode ne 'upload') {
         $dc_setcourse_code .= (<<"ENDSCRIPT");          $dc_setcourse_code .= (<<"SCRIPTMID");
         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") {
Line 5506  SCRIPTTOP Line 5901  SCRIPTTOP
             if (numend != "-1") {              if (numend != "-1") {
                 document.$formname.elements[numend].name = "end"+coursename                  document.$formname.elements[numend].name = "end"+coursename
             }              }
   SCRIPTMID
           if ($showcredits) {
               $dc_setcourse_code .= <<ENDCRED;
               var numcredits = getIndex(document.$formname.credits);
               if (numcredits != "-1") {
                   document.$formname.elements[numcredits].name = "credits"+coursename;
               }
   ENDCRED
           }
           $dc_setcourse_code .= <<ENDSCRIPT; 
         }          }
     }      }
     var authcheck = auth_check();      var authcheck = auth_check();
Line 5627  sub authcheck_alerts { Line 6032  sub authcheck_alerts {
     return %alerts;      return %alerts;
 }  }
   
   sub is_courseowner {
       my ($thiscourse,$courseowner) = @_;
       if ($courseowner eq '') {
           if ($env{'request.course.id'} eq $thiscourse) {
               $courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'};
           }
       }
       if ($courseowner ne '') {
           if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) {
               return 1;
           }
       }
       return;
   }
   
   sub get_selfenroll_titles {
       my @row = ('types','registered','enroll_dates','access_dates','section',
                  'approval','limit');
       my %lt = &Apache::lonlocal::texthash (
                   types        => 'Users allowed to self-enroll',
                   registered   => 'Registration status (official courses)' ,
                   enroll_dates => 'Dates self-enrollment available',
                   access_dates => 'Access dates for self-enrolling users',
                   section      => "Self-enrolling users' section",
                   approval     => 'Processing of requests',
                   limit        => 'Enrollment limit',
                );
       return (\@row,\%lt);
   }
   
   sub selfenroll_default_descs {
       my %desc = (
                    types => {
                               dom => &mt('Course domain'),
                               all => &mt('Any domain'),
                               ''  => &mt('None'),
                             },
                    limit => {
                               none         => &mt('No limit'),
                               allstudents  => &mt('Limit by total students'),
                               selfenrolled => &mt('Limit by total self-enrolled'),
                             },
                    approval => {
                                   '0' => &mt('Processed automatically'),
                                   '1' => &mt('Queued for approval'),
                                   '2' => &mt('Queued, pending validation'),
                                },
                    registered => {
                                    0 => 'No registration required',
                                    1 => 'Registered students only',
                                  },
                  );
       return %desc;
   }
   
   sub selfenroll_validation_types {
       my @items = ('url','fields','button','markup');
       my %names =  &Apache::lonlocal::texthash (
               url      => 'Web address of validation server/script',
               fields   => 'Form fields to send to validator',
               button   => 'Text for validation button',
               markup   => 'Validation description (HTML)',
       );
       my @fields = ('username','domain','uniquecode','course','token','coursetype');
       return (\@items,\%names,\@fields);
   }
   
   sub get_extended_type {
       my ($cdom,$cnum,$crstype,$current) = @_;
       my $type = 'unofficial';
       my %settings;
       if (ref($current) eq 'HASH') {
           %settings = %{$current};
       } else {
           %settings = &Apache::lonnet::get('environment',['internal.coursecode','internal.textbook'],$cdom,$cnum);
       }
       if ($crstype eq 'Community') {
           $type = 'community';
       } elsif ($settings{'internal.coursecode'}) {
           $type = 'official';
       } elsif ($settings{'internal.textbook'}) {
           $type = 'textbook';
       }
       return $type;
   }
   
   sub selfenrollment_administration {
       my ($cdom,$cnum,$crstype,$coursehash) = @_;
       my %settings;
       if (ref($coursehash) eq 'HASH') {
           %settings = %{$coursehash};
       } else {
           %settings = &Apache::lonnet::get('environment',
                           ['internal.selfenrollmgrdc','internal.selfenrollmgrcc',
                            'internal.coursecode','internal.textbook'],$cdom,$cnum);
       }
       my ($possconfigs) = &get_selfenroll_titles(); 
       my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
       my $selfenrolltype = &get_extended_type($cdom,$cnum,$crstype,\%settings);
   
       my (@in_course,@in_domain); 
       if ($settings{'internal.selfenrollmgrcc'} ne '') {
           @in_course = split(/,/,$settings{'internal.selfenrollmgrcc'}); 
           my @diffs = &Apache::loncommon::compare_arrays($possconfigs,\@in_course);
           unless (@diffs) {
               return (\@in_course,\@in_domain);
           }
       }
       if ($settings{'internal.selfenrollmgrdc'} ne '') {
           my @in_domain = split(/,/,$settings{'internal.selfenrollmgrdc'});
           my @diffs = &Apache::loncommon::compare_arrays(\@in_domain,$possconfigs);
           unless (@diffs) {
               return (\@in_course,\@in_domain);
           }
       }
       my @combined = @in_course;
       push(@combined,@in_domain);
       my @diffs = &Apache::loncommon::compare_arrays(\@combined,$possconfigs); 
       unless (@diffs) {
           return (\@in_course,\@in_domain);
       }
       if ($domdefaults{$selfenrolltype.'selfenrolladmdc'} eq '') {
           push(@in_course,@diffs);
       } else {
           my @defaultdc = split(/,/,$domdefaults{$selfenrolltype.'selfenrolladmdc'});
           foreach my $item (@diffs) {
               if (grep(/^\Q$item\E$/,@defaultdc)) {
                   push(@in_domain,$item);
               } else {
                   push(@in_course,$item);
               }
           }
       }
       return (\@in_course,\@in_domain);
   }
   
 1;  1;
   

Removed from v.1.131  
changed lines
  Added in v.1.165


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.