Diff for /loncom/interface/loncreateuser.pm between versions 1.83 and 1.111

version 1.83, 2004/07/02 10:03:44 version 1.111, 2006/03/21 18:51:28
Line 73  my $authformint; Line 73  my $authformint;
 my $authformfsys;  my $authformfsys;
 my $authformloc;  my $authformloc;
   
 BEGIN {  sub initialize_authen_forms {
     $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;      my ($krbdefdom)=( $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/);
     my $krbdefdom=$1;      $krbdefdom= uc($krbdefdom);
     $krbdefdom=~tr/a-z/A-Z/;  
     my %param = ( formname => 'document.cu',      my %param = ( formname => 'document.cu',
                   kerb_def_dom => $krbdefdom                     kerb_def_dom => $krbdefdom 
                   );                    );
Line 109  sub my_custom_roles { Line 108  sub my_custom_roles {
   
 sub authorpriv {  sub authorpriv {
     my ($auname,$audom)=@_;      my ($auname,$audom)=@_;
     if (($auname ne $ENV{'user.name'}) ||      unless ((&Apache::lonnet::allowed('cca',$audom.'/'.$auname))
         (($audom ne $ENV{'user.domain'}) &&           || (&Apache::lonnet::allowed('caa',$audom.'/'.$auname))) { return ''; }
          ($audom ne $ENV{'request.role.domain'}))) { return ''; }  
     unless (&Apache::lonnet::allowed('cca',$audom)) { return ''; }  
     return 1;      return 1;
 }  }
   
 # =================================================================== Phase one  # =================================================================== Phase one
   
 sub print_username_entry_form {  sub print_username_entry_form {
     my $r=shift;      my ($r) = @_;
     my $defdom=$ENV{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my @domains = &Apache::loncommon::get_domains();      my @domains = &Apache::loncommon::get_domains();
     my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');      my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');
     my $bodytag =&Apache::loncommon::bodytag(  
                                   'Create Users, Change User Privileges').  
   &Apache::loncommon::help_open_faq(282).  
   &Apache::loncommon::help_open_bug('Instructor Interface');  
     my $selscript=&Apache::loncommon::studentbrowser_javascript();      my $selscript=&Apache::loncommon::studentbrowser_javascript();
       my $start_page =
    &Apache::loncommon::start_page('Create Users, Change User Privileges',
          $selscript);
   
     my $sellink=&Apache::loncommon::selectstudent_link      my $sellink=&Apache::loncommon::selectstudent_link
                                         ('crtuser','ccuname','ccdomain');                                          ('crtuser','ccuname','ccdomain');
     my %existingroles=&my_custom_roles();      my %existingroles=&my_custom_roles();
Line 142  sub print_username_entry_form { Line 139  sub print_username_entry_form {
                     'nr'   => "Name of Role",                      'nr'   => "Name of Role",
                     'cre'  => "Custom Role Editor"                      'cre'  => "Custom Role Editor"
        );         );
       my $help = &Apache::loncommon::help_open_menu('',undef,undef,'',282,'Instructor Interface');
     my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');      my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');
     my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');      my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');
     $r->print(<<"ENDDOCUMENT");      $r->print(<<"ENDDOCUMENT");
 <html>  $start_page
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 $selscript  
 </head>  
 $bodytag  
 <form action="/adm/createuser" method="post" name="crtuser">  <form action="/adm/createuser" method="post" name="crtuser">
 <input type="hidden" name="phase" value="get_user_info">  <input type="hidden" name="phase" value="get_user_info">
 <h2>$lt{siur}$helpsiur</h2>  <h2>$lt{siur}$helpsiur</h2>
Line 161  $lt{'dom'}:</td><td>$domform</td></tr> Line 154  $lt{'dom'}:</td><td>$domform</td></tr>
 </table>  </table>
 <input name="userrole" type="submit" value="$lt{usrr}" />  <input name="userrole" type="submit" value="$lt{usrr}" />
 </form>  </form>
   ENDDOCUMENT
      if (&Apache::lonnet::allowed('mcr','/')) {
          $r->print(<<ENDCUSTOM);
 <form action="/adm/createuser" method="post" name="docustom">  <form action="/adm/createuser" method="post" name="docustom">
 <input type="hidden" name="phase" value="selected_custom_edit">  <input type="hidden" name="phase" value="selected_custom_edit">
 <h2>$lt{'ecrp'}$helpecpr</h2>  <h2>$lt{'ecrp'}$helpecpr</h2>
 $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />  $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />
 <input name="customeditor" type="submit" value="$lt{'cre'}" />  <input name="customeditor" type="submit" value="$lt{'cre'}" />
 </body>  </form>
 </html>  ENDCUSTOM
 ENDDOCUMENT      }
       $r->print(&Apache::loncommon::end_page());
   }
   
   
   sub user_modification_js {
       my ($pjump_def, $dc_setcourse_code)=@_;
       return <<END;
   <script type="text/javascript" language="Javascript">
   
       function pclose() {
           parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    "height=350,width=350,scrollbars=no,menubar=no");
           parmwin.close();
       }
   
       $pjump_def
       $dc_setcourse_code
   
       function dateset() {
           eval("document.cu."+document.cu.pres_marker.value+
               ".value=document.cu.pres_value.value");
           pclose();
       }
   
       function setSections() {
           var re1 = /^currsec_/;
           for (var i=0;i<document.cu.elements.length;i++) {
               var str = document.cu.elements[i].name;
               var checkcurr = str.match(re1);
               if (checkcurr != null) {
                   var re2 = /^currsec_[a-zA-Z0-9]+_[a-zA-Z0-9]+_(\\w+)\$/;
                   if (document.cu.elements[i-1].checked == true) {
                       var re2 = /^currsec_[a-zA-Z0-9]+_[a-zA-Z0-9]+_(\\w+)\$/;
                       match = re2.exec(str);
                       var role = match[1];
                       if (role == 'cc') {
                           alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");
                       }
                       else {
                           var sections = '';
                           var numsec = 0;
                           var sections;
                           for (var j=0; j<document.cu.elements[i].length; j++) {
                               if (document.cu.elements[i].options[j].selected == true ) {
                                   if (document.cu.elements[i].options[j].value != "") {
                                       if (numsec == 0) {
                                           if (document.cu.elements[i].options[j].value != "") {
                                               sections = document.cu.elements[i].options[j].value;
                                               numsec ++;
                                           }
                                       }
                                       else {
                                           sections = sections + "," +  document.cu.elements[i].options[j].value
                                           numsec ++;
                                       }
                                   }
                               }
                           }
                           if (numsec > 0) {
                               if (document.cu.elements[i+1].value != "" && document.cu.elements[i+1].value != null) {
                                   sections = sections + "," +  document.cu.elements[i+1].value;
                               } 
                           }
                           else {
                               sections = document.cu.elements[i+1].value;    
                           }
                           var newsecs = document.cu.elements[i+1].value;
                           if (newsecs != null && newsecs != "") {
                               var numsplit = newsecs.split(/,/g);
                               numsec = numsec + numsplit.length;
                           }
                           if ((role == 'st') && (numsec > 1)) {
                               alert("In each course, each user may only have one student role at a time. You had selected "+numsec+" sections.\\nPlease modify your selections so they include no more than one section.")  
                               return;
                           }
                           else { 
                               document.cu.elements[i+2].value = sections;
                           }
                       }
                   }
               }
           }
           document.cu.submit();
       }
   </script>
   END
 }  }
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub print_user_modification_page {  sub print_user_modification_page {
     my $r=shift;      my $r=shift;
     my $ccuname=$ENV{'form.ccuname'};      my $ccuname=$env{'form.ccuname'};
     my $ccdomain=$ENV{'form.ccdomain'};      my $ccdomain=$env{'form.ccdomain'};
   
     $ccuname=~s/\W//gs;      $ccuname=~s/\W//g;
     $ccdomain=~s/\W//gs;      $ccdomain=~s/\W//g;
   
     unless (($ccuname) && ($ccdomain)) {      unless (($ccuname) && ($ccdomain)) {
  &print_username_entry_form($r);   &print_username_entry_form($r);
         return;          return;
     }      }
   
     my $defdom=$ENV{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
   
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
        &Apache::loncommon::get_kerberos_defaults($defdom);         &Apache::loncommon::get_kerberos_defaults($defdom);
Line 200  sub print_user_modification_page { Line 282  sub print_user_modification_page {
     $ccuname=~s/\W//g;      $ccuname=~s/\W//g;
     $ccdomain=~s/\W//g;      $ccdomain=~s/\W//g;
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();      my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
     my $dochead =<<"ENDDOCHEAD";      my $dc_setcourse_code = '';
 <html>      my $loaditem;
 <head>      if ($env{'request.role'} =~ m-^dc\./(\w+)/$-) {
 <title>The LearningOnline Network with CAPA</title>          my $dcdom = $1;
 <script type="text/javascript" language="Javascript">          $loaditem = qq|OnLoad="document.cu.coursedesc.value=''"|;
           $dc_setcourse_code = <<"ENDSCRIPT";
     function pclose() {      function setCourse() {
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",          var course = document.cu.dccourse.value;
                  "height=350,width=350,scrollbars=no,menubar=no");          if (course != "") {
         parmwin.close();              if (document.cu.dcdomain.value != document.cu.origdom.value) {
                   alert("You must select a course in the current domain");
                   return;
               } 
               var userrole = document.cu.role.options[document.cu.role.selectedIndex].value
               var section="";
               var numsections = 0;
               for (var i=0; i<document.cu.currsec.length; i++) {
                   if (document.cu.currsec.options[i].selected == true ) {
                       if (document.cu.currsec.options[i].value != "" && document.cu.currsec.options[i].value != null) { 
                           if (numsections == 0) {
                               section = document.cu.currsec.options[i].value
                               numsections = 1;
                           }
                           else {
                               section = section + "," +  document.cu.currsec.options[i].value
                               numsections ++;
                           }
                       }
                   }
               }
               if (document.cu.newsec.value != "" && document.cu.newsec.value != null) {
                   if (numsections == 0) {
                       section = document.cu.newsec.value
                   }
                   else {
                       section = section + "," +  document.cu.newsec.value
                   }
                   var numsplit = document.cu.newsec.value.split(/,/g);
                   numsections = numsections + numsplit.length;
               }
               if ((userrole == 'st') && (numsections > 1)) {
                   alert("In each course, each user may only have one student role at a time. You had selected "+numsections+" sections.\\nPlease modify your selections so they include no more than one section.")
                   return;
               }
               if ((userrole == 'cc') && (numsections > 0)) {
                   alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");
                   section = "";
               }
               var numcourse = getIndex(document.cu.dccourse);
               if (numcourse == "-1") {
                   alert("There was a problem with your course selection");
                   return
               }
               else { 
                   var coursename = "_$dcdom"+"_"+course+"_"+userrole
                   document.cu.elements[numcourse].name = "act"+coursename
                   document.cu.elements[numcourse+4].name = "sec"+coursename
                   document.cu.elements[numcourse+4].value = section
                   document.cu.elements[numcourse+5].name = "start"+coursename
                   document.cu.elements[numcourse+6].name = "end"+coursename
               }
           }
           document.cu.submit();
     }      }
   
     $pjump_def      function getIndex(caller) {
           for (var i=0;i<document.cu.elements.length;i++) {
     function dateset() {              if (document.cu.elements[i] == caller) {
         eval("document.cu."+document.cu.pres_marker.value+                  return i;
             ".value=document.cu.pres_value.value");              }
         pclose();          }
           return -1;
       }
   ENDSCRIPT
     }      }
   
 </script>      my $js = &user_modification_js($pjump_def, $dc_setcourse_code);
 </head>      my $start_page = 
 ENDDOCHEAD   &Apache::loncommon::start_page('Create Users, Change User Privileges',
     $r->print(&Apache::loncommon::bodytag(         $js,{'add_entries' => $loaditem,});
                                      'Create Users, Change User Privileges'));  
     my $forminfo =<<"ENDFORMINFO";      my $forminfo =<<"ENDFORMINFO";
 <form action="/adm/createuser" method="post" name="cu">  <form action="/adm/createuser" method="post" name="cu">
 <input type="hidden" name="phase"       value="update_user_data">  <input type="hidden" name="phase"       value="update_user_data">
Line 240  ENDFORMINFO Line 378  ENDFORMINFO
     foreach (values(%Apache::lonnet::hostdom)) {      foreach (values(%Apache::lonnet::hostdom)) {
        $incdomains{$_}=1;         $incdomains{$_}=1;
     }      }
     foreach (keys(%ENV)) {      foreach (keys(%env)) {
  if ($_=~/^user\.priv\.cm\.\/(\w+)\/(\w+)/) {   if ($_=~/^user\.priv\.cm\.\/(\w+)\/(\w+)/) {
     $inccourses{$1.'_'.$2}=1;      $inccourses{$1.'_'.$2}=1;
         }          }
Line 264  ENDFORMINFO Line 402  ENDFORMINFO
                     'lg'   => "Login Data"                      'lg'   => "Login Data"
        );         );
  my $genhelp=&Apache::loncommon::help_open_topic('Generation');   my $genhelp=&Apache::loncommon::help_open_topic('Generation');
           &initialize_authen_forms();
  $r->print(<<ENDNEWUSER);   $r->print(<<ENDNEWUSER);
 $dochead  $start_page
 <h1>$lt{'cnu'}</h1>  <h1>$lt{'cnu'}</h1>
 $forminfo  $forminfo
 <h2>$lt{'nu'} "$ccuname" $lt{'id'} $ccdomain</h2>  <h2>$lt{'nu'} "$ccuname" $lt{'id'} $ccdomain</h2>
Line 306  ENDNEWUSER Line 445  ENDNEWUSER
                     'gen'  => "generation"                      'gen'  => "generation"
        );         );
  $r->print(<<ENDCHANGEUSER);   $r->print(<<ENDCHANGEUSER);
 $dochead  $start_page
 <h1>$lt{'cup'}</h1>  <h1>$lt{'cup'}</h1>
 $forminfo  $forminfo
 <h2>$lt{'usr'} "$ccuname" $lt{'id'} "$ccdomain"</h2>  <h2>$lt{'usr'} "$ccuname" $lt{'id'} "$ccdomain"</h2>
Line 351  END Line 490  END
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End"                      'end'  => "End"
        );         );
            $r->print(<<END);             my (%roletext,%sortrole,%roleclass,%rolepriv);
 <hr />  
 <h3>$lt{'rer'}</h3>  
 <table>  
 <tr><th>$lt{'rev'}</th><th>$lt{'ren'}</th><th>$lt{'del'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th>  
 END  
            my (%roletext,%sortrole,%roleclass);  
    foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);     foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
     my $b1=join('_',(split('_',$b))[1,0]);      my $b1=join('_',(split('_',$b))[1,0]);
     return $a1 cmp $b1;      return $a1 cmp $b1;
Line 392  END Line 525  END
        $sortkey.="\0".$coursedata{'description'};         $sortkey.="\0".$coursedata{'description'};
    } else {     } else {
        $carea=&mt('Unavailable course').': '.$area;         $carea=&mt('Unavailable course').': '.$area;
        $sortkey.="\0".&mt('Unavailable course');         $sortkey.="\0".&mt('Unavailable course').': '.$area;
    }     }
                    $inccourses{$1.'_'.$2}=1;                     $inccourses{$1.'_'.$2}=1;
                    if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||                     if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
Line 415  END Line 548  END
                    $bgcol=~s/[^7-9a-e]//g;                     $bgcol=~s/[^7-9a-e]//g;
                    $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);                     $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);
                    if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {                     if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {
                        $carea.='<br>Section/Group: '.$3;                         $carea.='<br />Section/Group: '.$3;
          $sortkey.="\0$3";
                    }                     }
                    $area=$carea;                     $area=$carea;
                } else {                 } else {
Line 444  END Line 578  END
        $class='Domain';         $class='Domain';
    }     }
                }                 }
                if ($role_code eq 'ca') {                 if (($role_code eq 'ca') || ($role_code eq 'aa')) {
                    $area=~/\/(\w+)\/(\w+)/;                     $area=~/\/(\w+)\/(\w+)/;
    if (&authorpriv($2,$1)) {     if (&authorpriv($2,$1)) {
        $allowed=1;         $allowed=1;
Line 495  END Line 629  END
        $sortrole{$sortkey}=$envkey;         $sortrole{$sortkey}=$envkey;
        $roletext{$envkey}=$row;         $roletext{$envkey}=$row;
        $roleclass{$envkey}=$class;         $roleclass{$envkey}=$class;
                  $rolepriv{$envkey}=$allowed;
                #$r->print($row);                 #$r->print($row);
            } # end of foreach        (table building loop)             } # end of foreach        (table building loop)
              my $rolesdisplay = 0;
              my %output = ();
    foreach my $type ('Construction Space','Course','Domain','System','Unknown') {     foreach my $type ('Construction Space','Course','Domain','System','Unknown') {
        my $output;         $output{$type} = '';
        foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {         foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
    if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) {      if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) { 
        $output.=$roletext{$sortrole{$which}};         $output{$type}.=$roletext{$sortrole{$which}};
    }     }
        }         }
        if (defined($output)) {         unless($output{$type} eq '') {
    $r->print("<tr bgcolor='#BBffBB'>".     $output{$type} = "<tr bgcolor='#BBffBB'>".
      "<td align='center' colspan='7'>".&mt($type)."</td>");       "<td align='center' colspan='7'>".&mt($type)."</td>".
                                 $output{$type};
                      $rolesdisplay = 1;
        }         }
        $r->print($output);  
    }     }
    $r->print('</table>');             if ($rolesdisplay == 1) {
                  $r->print(<<END);
   <hr />
   <h3>$lt{'rer'}</h3>
   <table>
   <tr><th>$lt{'rev'}</th><th>$lt{'ren'}</th><th>$lt{'del'}</th><th>$lt{'rol'}</th><th>$lt{'e
   xt'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th>
   END
                  foreach my $type ('Construction Space','Course','Domain','System','Unknown') {
                      if ($output{$type}) {
                          $r->print($output{$type}."\n");
                      }
                  }
          $r->print('</table>');
              }
         }  # End of unless          }  # End of unless
  my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);   my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
  if ($currentauth=~/^krb(4|5):/) {   if ($currentauth=~/^krb(4|5):/) {
     $currentauth=~/^krb(4|5):(.*)/;      $currentauth=~/^krb(4|5):(.*)/;
     my $krbdefdom=$1;      my $krbdefdom=$2;
             my %param = ( formname => 'document.cu',              my %param = ( formname => 'document.cu',
                           kerb_def_dom => $krbdefdom                             kerb_def_dom => $krbdefdom 
                           );                            );
Line 527  END Line 679  END
  $currentauth=~/^internal:/ or   $currentauth=~/^internal:/ or
  $currentauth=~/^localauth:/   $currentauth=~/^localauth:/
  ) { # bad authentication scheme   ) { # bad authentication scheme
     if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {      if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
                   &initialize_authen_forms();
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                                'err'   => "ERROR",                                 'err'   => "ERROR",
        'uuas'  => "This user has an unrecognized authentication scheme",         'uuas'  => "This user has an unrecognized authentication scheme",
Line 569  ENDBADAUTH Line 722  ENDBADAUTH
         } else { # Authentication type is valid          } else { # Authentication type is valid
     my $authformcurrent='';      my $authformcurrent='';
     my $authform_other='';      my $authform_other='';
               &initialize_authen_forms();
     if ($currentauth=~/^krb(4|5):/) {      if ($currentauth=~/^krb(4|5):/) {
  $authformcurrent=$authformkrb;   $authformcurrent=$authformkrb;
  $authform_other="<p>$authformint</p>\n".   $authform_other="<p>$authformint</p>\n".
Line 590  ENDBADAUTH Line 744  ENDBADAUTH
                     "<p>$authformint</p><p>$authformfsys</p>";                      "<p>$authformint</p><p>$authformfsys</p>";
     }      }
             $authformcurrent.=' <i>(will override current values)</i><br />';              $authformcurrent.=' <i>(will override current values)</i><br />';
             if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {              if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
  # Current user has login modification privileges   # Current user has login modification privileges
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                                'ccld'  => "Change Current Login Data",                                 'ccld'  => "Change Current Login Data",
Line 615  ENDOTHERAUTHS Line 769  ENDOTHERAUTHS
 #  #
 # Co-Author  # Co-Author
 #   # 
     if (&authorpriv($ENV{'user.name'},$ENV{'request.role.domain'}) &&      if (&authorpriv($env{'user.name'},$env{'request.role.domain'}) &&
         ($ENV{'user.name'} ne $ccuname || $ENV{'user.domain'} ne $ccdomain)) {          ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) {
         # No sense in assigning co-author role to yourself          # No sense in assigning co-author role to yourself
  my $cuname=$ENV{'user.name'};   my $cuname=$env{'user.name'};
         my $cudom=$ENV{'request.role.domain'};          my $cudom=$env{'request.role.domain'};
    my %lt=&Apache::lonlocal::texthash(     my %lt=&Apache::lonlocal::texthash(
     'cs'   => "Construction Space",      'cs'   => "Construction Space",
                     'act'  => "Activate",                                          'act'  => "Activate",                    
Line 628  ENDOTHERAUTHS Line 782  ENDOTHERAUTHS
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End",                      'end'  => "End",
                     'cau'  => "Co-Author",                      'cau'  => "Co-Author",
                       'caa'  => "Assistant Co-Author",
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
        );         );
Line 646  ENDOTHERAUTHS Line 801  ENDOTHERAUTHS
 <a href=  <a href=
 "javascript:pjump('date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'sed'}</a></td>  "javascript:pjump('date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'sed'}</a></td>
 </tr>  </tr>
   <tr>
   <td><input type=checkbox name="act_$cudom\_$cuname\_aa" /></td>
   <td>$lt{'caa'}</td>
   <td>$cudom\_$cuname</td>
   <td><input type=hidden name="start_$cudom\_$cuname\_aa" value='' />
   <a href=
   "javascript:pjump('date_start','Start Date Assistant Co-Author',document.cu.start_$cudom\_$cuname\_aa.value,'start_$cudom\_$cuname\_aa','cu.pres','dateset')">$lt{'ssd'}</a></td>
   <td><input type=hidden name="end_$cudom\_$cuname\_aa" value='' />
   <a href=
   "javascript:pjump('date_end','End Date Assistant Co-Author',document.cu.end_$cudom\_$cuname\_aa.value,'end_$cudom\_$cuname\_aa','cu.pres','dateset')">$lt{'sed'}</a></td>
   </tr>
 </table>  </table>
 ENDCOAUTH  ENDCOAUTH
     }      }
 #  #
 # Domain level  # Domain level
 #  #
     $r->print('<h4>'.&mt('Domain Level').'</h4>'.      my $num_domain_level = 0;
       my $domaintext = 
       '<h4>'.&mt('Domain Level').'</h4>'.
     '<table border=2><tr><th>'.&mt('Activate').'</th><th>'.&mt('Role').'</th><th>'.&mt('Extent').'</th>'.      '<table border=2><tr><th>'.&mt('Activate').'</th><th>'.&mt('Role').'</th><th>'.&mt('Extent').'</th>'.
     '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th></tr>');      '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th></tr>';
     foreach ( sort( keys(%incdomains))) {      foreach ( sort( keys(%incdomains))) {
  my $thisdomain=$_;   my $thisdomain=$_;
         foreach ('dc','li','dg','au','sc') {          foreach ('dc','li','dg','au','sc') {
Line 664  ENDCOAUTH Line 832  ENDCOAUTH
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
        );         );
                $r->print(<<ENDDROW);                 $num_domain_level ++;
                  $domaintext .= <<"ENDDROW";
 <tr>  <tr>
 <td><input type=checkbox name="act_$thisdomain\_$_"></td>  <td><input type=checkbox name="act_$thisdomain\_$_"></td>
 <td>$plrole</td>  <td>$plrole</td>
Line 680  ENDDROW Line 849  ENDDROW
             }              }
         }           } 
     }      }
     $r->print('</table>');      $domaintext.='</table>';
       if ($num_domain_level > 0) {
           $r->print($domaintext);
       }
 #  #
 # Course level  # Course level
 #  #
     $r->print(&course_level_table(%inccourses));      my $num_sections;
     $r->print("<hr /><input type=submit value=\"".&mt('Modify User')."\">\n");  
     $r->print("</form></body></html>");      if ($env{'request.role'} =~ m-^dc\./(\w+)/$-) {
           $r->print(&course_level_dc($1));
           $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()">'."\n");
       } else {
           $r->print(&course_level_table(%inccourses));
           $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setSections()">'."\n");
       }
       $r->print("</form>".&Apache::loncommon::end_page());
 }  }
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub update_user_data {  sub update_user_data {
     my $r=shift;      my $r=shift;
     my $uhome=&Apache::lonnet::homeserver($ENV{'form.ccuname'},      my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
                                           $ENV{'form.ccdomain'});                                            $env{'form.ccdomain'});
     # Error messages      # Error messages
     my $error     = '<font color="#ff0000">'.&mt('Error').':</font>';      my $error     = '<font color="#ff0000">'.&mt('Error').':</font>';
     my $end       = '</body></html>';      my $end       = &Apache::loncommon::end_page();
     # Print header  
     $r->print(<<ENDTHREEHEAD);  
 <html>  
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 </head>  
 ENDTHREEHEAD  
     my $title;      my $title;
     if (exists($ENV{'form.makeuser'})) {      if (exists($env{'form.makeuser'})) {
  $title='Set Privileges for New User';   $title='Set Privileges for New User';
     } else {      } else {
         $title='Modify User Privileges';          $title='Modify User Privileges';
     }      }
     $r->print(&Apache::loncommon::bodytag($title));      $r->print(&Apache::loncommon::start_page($title));
     # Check Inputs      # Check Inputs
     if (! $ENV{'form.ccuname'} ) {      if (! $env{'form.ccuname'} ) {
  $r->print($error.&mt('No login name specified').'.'.$end);   $r->print($error.&mt('No login name specified').'.'.$end);
  return;   return;
     }      }
     if (  $ENV{'form.ccuname'}  =~/\W/) {      if (  $env{'form.ccuname'}  =~/\W/) {
  $r->print($error.&mt('Invalid login name').'.  '.   $r->print($error.&mt('Invalid login name').'.  '.
   &mt('Only letters, numbers, and underscores are valid').'.'.    &mt('Only letters, numbers, and underscores are valid').'.'.
   $end);    $end);
  return;   return;
     }      }
     if (! $ENV{'form.ccdomain'}       ) {      if (! $env{'form.ccdomain'}       ) {
  $r->print($error.&mt('No domain specified').'.'.$end);   $r->print($error.&mt('No domain specified').'.'.$end);
  return;   return;
     }      }
     if (  $ENV{'form.ccdomain'} =~/\W/) {      if (  $env{'form.ccdomain'} =~/\W/) {
  $r->print($error.&mt ('Invalid domain name').'.  '.   $r->print($error.&mt ('Invalid domain name').'.  '.
   &mt('Only letters, numbers, and underscores are valid').'.'.    &mt('Only letters, numbers, and underscores are valid').'.'.
   $end);    $end);
  return;   return;
     }      }
     if (! exists($ENV{'form.makeuser'})) {      if (! exists($env{'form.makeuser'})) {
         # Modifying an existing user, so check the validity of the name          # Modifying an existing user, so check the validity of the name
         if ($uhome eq 'no_host') {          if ($uhome eq 'no_host') {
             $r->print($error.&mt('Unable to determine home server for ').              $r->print($error.&mt('Unable to determine home server for ').
                       $ENV{'form.ccuname'}.&mt(' in domain ').                        $env{'form.ccuname'}.&mt(' in domain ').
                       $ENV{'form.ccdomain'}.'.');                        $env{'form.ccdomain'}.'.');
             return;              return;
         }          }
     }      }
     # Determine authentication method and password for the user being modified      # Determine authentication method and password for the user being modified
     my $amode='';      my $amode='';
     my $genpwd='';      my $genpwd='';
     if ($ENV{'form.login'} eq 'krb') {      if ($env{'form.login'} eq 'krb') {
  $amode='krb';   $amode='krb';
  $amode.=$ENV{'form.krbver'};   $amode.=$env{'form.krbver'};
  $genpwd=$ENV{'form.krbarg'};   $genpwd=$env{'form.krbarg'};
     } elsif ($ENV{'form.login'} eq 'int') {      } elsif ($env{'form.login'} eq 'int') {
  $amode='internal';   $amode='internal';
  $genpwd=$ENV{'form.intarg'};   $genpwd=$env{'form.intarg'};
     } elsif ($ENV{'form.login'} eq 'fsys') {      } elsif ($env{'form.login'} eq 'fsys') {
  $amode='unix';   $amode='unix';
  $genpwd=$ENV{'form.fsysarg'};   $genpwd=$env{'form.fsysarg'};
     } elsif ($ENV{'form.login'} eq 'loc') {      } elsif ($env{'form.login'} eq 'loc') {
  $amode='localauth';   $amode='localauth';
  $genpwd=$ENV{'form.locarg'};   $genpwd=$env{'form.locarg'};
  $genpwd=" " if (!$genpwd);   $genpwd=" " if (!$genpwd);
     } elsif (($ENV{'form.login'} eq 'nochange') ||      } elsif (($env{'form.login'} eq 'nochange') ||
              ($ENV{'form.login'} eq ''        )) {                ($env{'form.login'} eq ''        )) { 
         # There is no need to tell the user we did not change what they          # There is no need to tell the user we did not change what they
         # did not ask us to change.          # did not ask us to change.
         # If they are creating a new user but have not specified login          # If they are creating a new user but have not specified login
Line 768  ENDTHREEHEAD Line 941  ENDTHREEHEAD
     $r->print($error.&mt('Invalid login mode or password').$end);          $r->print($error.&mt('Invalid login mode or password').$end);    
     return;      return;
     }      }
     if ($ENV{'form.makeuser'}) {      if ($env{'form.makeuser'}) {
         # Create a new user          # Create a new user
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                     'cru'  => "Creating user",                                          'cru'  => "Creating user",                    
                     'id'   => "in domain"                      'id'   => "in domain"
    );     );
  $r->print(<<ENDNEWUSERHEAD);   $r->print(<<ENDNEWUSERHEAD);
 <h3>$lt{'cru'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h3>  <h3>$lt{'cru'} "$env{'form.ccuname'}" $lt{'id'} "$env{'form.ccdomain'}"</h3>
 ENDNEWUSERHEAD  ENDNEWUSERHEAD
         # Check for the authentication mode and password          # Check for the authentication mode and password
         if (! $amode || ! $genpwd) {          if (! $amode || ! $genpwd) {
Line 783  ENDNEWUSERHEAD Line 956  ENDNEWUSERHEAD
     return;      return;
  }   }
         # Determine desired host          # Determine desired host
         my $desiredhost = $ENV{'form.hserver'};          my $desiredhost = $env{'form.hserver'};
         if (lc($desiredhost) eq 'default') {          if (lc($desiredhost) eq 'default') {
             $desiredhost = undef;              $desiredhost = undef;
         } else {          } else {
             my %home_servers = &Apache::loncommon::get_library_servers              my %home_servers = &Apache::loncommon::get_library_servers
                 ($ENV{'form.ccdomain'});                    ($env{'form.ccdomain'});  
             if (! exists($home_servers{$desiredhost})) {              if (! exists($home_servers{$desiredhost})) {
                 $r->print($error.&mt('Invalid home server specified'));                  $r->print($error.&mt('Invalid home server specified'));
                 return;                  return;
Line 796  ENDNEWUSERHEAD Line 969  ENDNEWUSERHEAD
         }          }
  # Call modifyuser   # Call modifyuser
  my $result = &Apache::lonnet::modifyuser   my $result = &Apache::lonnet::modifyuser
     ($ENV{'form.ccdomain'},$ENV{'form.ccuname'},$ENV{'form.cstid'},      ($env{'form.ccdomain'},$env{'form.ccuname'},$env{'form.cstid'},
              $amode,$genpwd,$ENV{'form.cfirst'},               $amode,$genpwd,$env{'form.cfirst'},
              $ENV{'form.cmiddle'},$ENV{'form.clast'},$ENV{'form.cgen'},               $env{'form.cmiddle'},$env{'form.clast'},$env{'form.cgen'},
              undef,$desiredhost               undef,$desiredhost
      );       );
  $r->print(&mt('Generating user').': '.$result);   $r->print(&mt('Generating user').': '.$result);
         my $home = &Apache::lonnet::homeserver($ENV{'form.ccuname'},          my $home = &Apache::lonnet::homeserver($env{'form.ccuname'},
                                                $ENV{'form.ccdomain'});                                                 $env{'form.ccdomain'});
         $r->print('<br />'.&mt('Home server').': '.$home.' '.          $r->print('<br />'.&mt('Home server').': '.$home.' '.
                   $Apache::lonnet::libserv{$home});                    $Apache::lonnet::libserv{$home});
     } elsif (($ENV{'form.login'} ne 'nochange') &&      } elsif (($env{'form.login'} ne 'nochange') &&
              ($ENV{'form.login'} ne ''        )) {               ($env{'form.login'} ne ''        )) {
  # Modify user privileges   # Modify user privileges
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'usr'  => "User",                                          'usr'  => "User",                    
                     'id'   => "in domain"                      'id'   => "in domain"
        );         );
  $r->print(<<ENDMODIFYUSERHEAD);   $r->print(<<ENDMODIFYUSERHEAD);
 <h2>$lt{'usr'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h2>  <h2>$lt{'usr'} "$env{'form.ccuname'}" $lt{'id'} "$env{'form.ccdomain'}"</h2>
 ENDMODIFYUSERHEAD  ENDMODIFYUSERHEAD
         if (! $amode || ! $genpwd) {          if (! $amode || ! $genpwd) {
     $r->print($error.'Invalid login mode or password'.$end);          $r->print($error.'Invalid login mode or password'.$end);    
     return;      return;
  }   }
  # Only allow authentification modification if the person has authority   # Only allow authentification modification if the person has authority
  if (&Apache::lonnet::allowed('mau',$ENV{'form.ccdomain'})) {   if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
     $r->print('Modifying authentication: '.      $r->print('Modifying authentication: '.
                       &Apache::lonnet::modifyuserauth(                        &Apache::lonnet::modifyuserauth(
        $ENV{'form.ccdomain'},$ENV{'form.ccuname'},         $env{'form.ccdomain'},$env{'form.ccuname'},
                        $amode,$genpwd));                         $amode,$genpwd));
             $r->print('<br>'.&mt('Home server').': '.&Apache::lonnet::homeserver              $r->print('<br />'.&mt('Home server').': '.&Apache::lonnet::homeserver
   ($ENV{'form.ccuname'},$ENV{'form.ccdomain'}));    ($env{'form.ccuname'},$env{'form.ccdomain'}));
  } else {   } else {
     # Okay, this is a non-fatal error.      # Okay, this is a non-fatal error.
     $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.');          $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.');    
  }   }
     }      }
     ##      ##
     if (! $ENV{'form.makeuser'} ) {      if (! $env{'form.makeuser'} ) {
         # Check for need to change          # Check for need to change
         my %userenv = &Apache::lonnet::get          my %userenv = &Apache::lonnet::get
             ('environment',['firstname','middlename','lastname','generation'],              ('environment',['firstname','middlename','lastname','generation'],
              $ENV{'form.ccdomain'},$ENV{'form.ccuname'});               $env{'form.ccdomain'},$env{'form.ccuname'});
         my ($tmp) = keys(%userenv);          my ($tmp) = keys(%userenv);
         if ($tmp =~ /^(con_lost|error)/i) {           if ($tmp =~ /^(con_lost|error)/i) { 
             %userenv = ();              %userenv = ();
Line 846  ENDMODIFYUSERHEAD Line 1019  ENDMODIFYUSERHEAD
         # Check to see if we need to change user information          # Check to see if we need to change user information
         foreach ('firstname','middlename','lastname','generation') {          foreach ('firstname','middlename','lastname','generation') {
             # Strip leading and trailing whitespace              # Strip leading and trailing whitespace
             $ENV{'form.c'.$_} =~ s/(\s+$|^\s+)//g;               $env{'form.c'.$_} =~ s/(\s+$|^\s+)//g; 
         }          }
         if (&Apache::lonnet::allowed('mau',$ENV{'form.ccdomain'}) &&           if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}) && 
             ($ENV{'form.cfirstname'}  ne $userenv{'firstname'}  ||              ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
              $ENV{'form.cmiddlename'} ne $userenv{'middlename'} ||               $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
              $ENV{'form.clastname'}   ne $userenv{'lastname'}   ||               $env{'form.clastname'}   ne $userenv{'lastname'}   ||
              $ENV{'form.cgeneration'} ne $userenv{'generation'} )) {               $env{'form.cgeneration'} ne $userenv{'generation'} )) {
             # Make the change              # Make the change
             my %changeHash;              my %changeHash;
             $changeHash{'firstname'}  = $ENV{'form.cfirstname'};              $changeHash{'firstname'}  = $env{'form.cfirstname'};
             $changeHash{'middlename'} = $ENV{'form.cmiddlename'};              $changeHash{'middlename'} = $env{'form.cmiddlename'};
             $changeHash{'lastname'}   = $ENV{'form.clastname'};              $changeHash{'lastname'}   = $env{'form.clastname'};
             $changeHash{'generation'} = $ENV{'form.cgeneration'};              $changeHash{'generation'} = $env{'form.cgeneration'};
             my $putresult = &Apache::lonnet::put              my $putresult = &Apache::lonnet::put
                 ('environment',\%changeHash,                  ('environment',\%changeHash,
                  $ENV{'form.ccdomain'},$ENV{'form.ccuname'});                   $env{'form.ccdomain'},$env{'form.ccuname'});
             if ($putresult eq 'ok') {              if ($putresult eq 'ok') {
             # Tell the user we changed the name              # Tell the user we changed the name
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
Line 887  ENDMODIFYUSERHEAD Line 1060  ENDMODIFYUSERHEAD
     <td>$userenv{'lastname'}   </td>      <td>$userenv{'lastname'}   </td>
     <td>$userenv{'generation'} </td></tr>      <td>$userenv{'generation'} </td></tr>
 <tr><td>$lt{'chto'}</td>  <tr><td>$lt{'chto'}</td>
     <td>$ENV{'form.cfirstname'}  </td>      <td>$env{'form.cfirstname'}  </td>
     <td>$ENV{'form.cmiddlename'} </td>      <td>$env{'form.cmiddlename'} </td>
     <td>$ENV{'form.clastname'}   </td>      <td>$env{'form.clastname'}   </td>
     <td>$ENV{'form.cgeneration'} </td></tr>      <td>$env{'form.cgeneration'} </td></tr>
 </table>  </table>
 END  END
             } else { # error occurred              } else { # error occurred
                 $r->print("<h2>".&mt('Unable to successfully change environment for')." ".                  $r->print("<h2>".&mt('Unable to successfully change environment for')." ".
                       $ENV{'form.ccuname'}." ".&mt('in domain')." ".                        $env{'form.ccuname'}." ".&mt('in domain')." ".
                       $ENV{'form.ccdomain'}."</h2>");                        $env{'form.ccdomain'}."</h2>");
             }              }
         }  else { # End of if ($ENV ... ) logic          }  else { # End of if ($env ... ) logic
             # They did not want to change the users name but we can              # They did not want to change the users name but we can
             # still tell them what the name is              # still tell them what the name is
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
Line 907  END Line 1080  END
                            'gen'  => "Generation"                             'gen'  => "Generation"
        );         );
                 $r->print(<<"END");                  $r->print(<<"END");
 <h2>$lt{'usr'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h2>  <h2>$lt{'usr'} "$env{'form.ccuname'}" $lt{'id'} "$env{'form.ccdomain'}"</h2>
 <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} </h4>  <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} </h4>
 <h4>$lt{'gen'}: $userenv{'generation'}</h4>  <h4>$lt{'gen'}: $userenv{'generation'}</h4>
 END  END
Line 916  END Line 1089  END
     ##      ##
     my $now=time;      my $now=time;
     $r->print('<h3>'.&mt('Modifying Roles').'</h3>');      $r->print('<h3>'.&mt('Modifying Roles').'</h3>');
     foreach (keys (%ENV)) {      foreach (keys (%env)) {
  next if (! $ENV{$_});   next if (! $env{$_});
  # Revoke roles   # Revoke roles
  if ($_=~/^form\.rev/) {   if ($_=~/^form\.rev/) {
     if ($_=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) {      if ($_=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) {
 # Revoke standard role  # Revoke standard role
         $r->print(&mt('Revoking').' '.$2.' in '.$1.': <b>'.          $r->print(&mt('Revoking').' '.$2.' in '.$1.': <b>'.
                      &Apache::lonnet::revokerole($ENV{'form.ccdomain'},                       &Apache::lonnet::revokerole($env{'form.ccdomain'},
                      $ENV{'form.ccuname'},$1,$2).'</b><br>');                       $env{'form.ccuname'},$1,$2).'</b><br />');
  if ($2 eq 'st') {   if ($2 eq 'st') {
     $1=~/^\/(\w+)\/(\w+)/;      $1=~/^\/(\w+)\/(\w+)/;
     my $cid=$1.'_'.$2;      my $cid=$1.'_'.$2;
     $r->print(&mt('Drop from classlist').': <b>'.      $r->print(&mt('Drop from classlist').': <b>'.
  &Apache::lonnet::critical('put:'.   &Apache::lonnet::critical('put:'.
                              $ENV{'course.'.$cid.'.domain'}.':'.                               $env{'course.'.$cid.'.domain'}.':'.
                      $ENV{'course.'.$cid.'.num'}.':classlist:'.                       $env{'course.'.$cid.'.num'}.':classlist:'.
                          &Apache::lonnet::escape($ENV{'form.ccuname'}.':'.                           &Apache::lonnet::escape($env{'form.ccuname'}.':'.
                              $ENV{'form.ccdomain'}).'='.                               $env{'form.ccdomain'}).'='.
                          &Apache::lonnet::escape($now.':'),                           &Apache::lonnet::escape($now.':'),
                      $ENV{'course.'.$cid.'.home'}).'</b><br>');                       $env{'course.'.$cid.'.home'}).'</b><br />');
  }   }
     }       } 
     if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {      if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {
 # Revoke custom role  # Revoke custom role
  $r->print(&mt('Revoking custom role').   $r->print(&mt('Revoking custom role').
                       ' '.$4.' by '.$3.'@'.$2.' in '.$1.': <b>'.                        ' '.$4.' by '.$3.'@'.$2.' in '.$1.': <b>'.
                       &Apache::lonnet::revokecustomrole($ENV{'form.ccdomain'},                        &Apache::lonnet::revokecustomrole($env{'form.ccdomain'},
   $ENV{'form.ccuname'},$1,$2,$3,$4).    $env{'form.ccuname'},$1,$2,$3,$4).
  '</b><br>');   '</b><br />');
     }      }
  } elsif ($_=~/^form\.del/) {   } elsif ($_=~/^form\.del/) {
     if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) {      if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) {
         $r->print(&mt('Deleting').' '.$2.' in '.$1.': '.          $r->print(&mt('Deleting').' '.$2.' in '.$1.': '.
                      &Apache::lonnet::assignrole($ENV{'form.ccdomain'},                       &Apache::lonnet::assignrole($env{'form.ccdomain'},
                      $ENV{'form.ccuname'},$1,$2,$now,0,1).'<br>');                       $env{'form.ccuname'},$1,$2,$now,0,1).'<br />');
  if ($2 eq 'st') {   if ($2 eq 'st') {
     $1=~/^\/(\w+)\/(\w+)/;      $1=~/^\/(\w+)\/(\w+)/;
     my $cid=$1.'_'.$2;      my $cid=$1.'_'.$2;
     $r->print(&mt('Drop from classlist').': <b>'.      $r->print(&mt('Drop from classlist').': <b>'.
  &Apache::lonnet::critical('put:'.   &Apache::lonnet::critical('put:'.
                              $ENV{'course.'.$cid.'.domain'}.':'.                               $env{'course.'.$cid.'.domain'}.':'.
                      $ENV{'course.'.$cid.'.num'}.':classlist:'.                       $env{'course.'.$cid.'.num'}.':classlist:'.
                          &Apache::lonnet::escape($ENV{'form.ccuname'}.':'.                           &Apache::lonnet::escape($env{'form.ccuname'}.':'.
                              $ENV{'form.ccdomain'}).'='.                               $env{'form.ccdomain'}).'='.
                          &Apache::lonnet::escape($now.':'),                           &Apache::lonnet::escape($now.':'),
                      $ENV{'course.'.$cid.'.home'}).'</b><br>');                       $env{'course.'.$cid.'.home'}).'</b><br />');
  }   }
     }       } 
  } elsif ($_=~/^form\.ren/) {   } elsif ($_=~/^form\.ren/) {
               my $udom = $env{'form.ccdomain'};
               my $uname = $env{'form.ccuname'};
     if ($_=~/^form\.ren\:([^\_]+)\_([^\_]+)$/) {      if ($_=~/^form\.ren\:([^\_]+)\_([^\_]+)$/) {
  my $result=&Apache::lonnet::assignrole($ENV{'form.ccdomain'},                  my $url = $1;
  $ENV{'form.ccuname'},$1,$2,0,$now);                  my $role = $2;
  $r->print(&mt('Re-Enabling [_1] in [_2]: [_3]',                  my $logmsg;
       $2,$1,$result).'<br />');                  my $output;
  if ($2 eq 'st') {                  if ($role eq 'st') {
     $1=~/^\/(\w+)\/(\w+)/;                      if ($url =~ m-^/(\w+)/(\w+)/?(\w*)$-) {
     my $cid=$1.'_'.$2;                          my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$1,$2,$3);
     $r->print(&mt('Add to classlist').': <b>'.                          if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) {
       &Apache::lonnet::critical(                              $output = "Error: $result\n";
   'put:'.$ENV{'course.'.$cid.'.domain'}.':'.                          } else {
                            $ENV{'course.'.$cid.'.num'}.':classlist:'.                              $output = &mt('Assigning').' '.$role.' in '.$url.
                                    &Apache::lonnet::escape(                                        &mt('starting').' '.localtime($now).
                                        $ENV{'form.ccuname'}.':'.                                        ': <br />'.$logmsg.'<br />'.
                                        $ENV{'form.ccdomain'} ).'='.                                        &mt('Add to classlist').': <b>ok</b><br />';
                                    &Apache::lonnet::escape(':'.$now),                          }
        $ENV{'course.'.$cid.'.home'})                      }
       .'</b><br>');                  } else {
       my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},
                                  $env{'form.ccuname'},$url,$role,0,$now);
       $output = &mt('Re-Enabling [_1] in [_2]: [_3]',
         $role,$url,$result).'<br />';
  }   }
                   $r->print($output);
     }       } 
  } elsif ($_=~/^form\.act/) {   } elsif ($_=~/^form\.act/) {
               my $udom = $env{'form.ccdomain'};
               my $uname = $env{'form.ccuname'};
     if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) {      if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) {
                 # Activate a custom role                  # Activate a custom role
  my ($one,$two,$three,$four,$five)=($1,$2,$3,$4,$5);   my ($one,$two,$three,$four,$five)=($1,$2,$3,$4,$5);
  my $url='/'.$one.'/'.$two;   my $url='/'.$one.'/'.$two;
  my $full=$one.'_'.$two.'_cr_cr_'.$three.'_'.$four.'_'.$five;   my $full=$one.'_'.$two.'_cr_cr_'.$three.'_'.$four.'_'.$five;
  $ENV{'form.sec_'.$full}=~s/\W//g;  
  if ($ENV{'form.sec_'.$full}) {  
     $url.='/'.$ENV{'form.sec_'.$full};  
  }  
   
  my $start = ( $ENV{'form.start_'.$full} ?   
       $ENV{'form.start_'.$full} :   
       $now );  
  my $end   = ( $ENV{'form.end_'.$full} ?   
       $ENV{'form.end_'.$full} :  
       0 );  
   
     $r->print(&mt('Assigning custom role').' "'.$five.'" by '.$four.'@'.$three.' in '.$url.                  my $start = ( $env{'form.start_'.$full} ?
                          ($start?', '.&mt('starting').' '.localtime($start):'').                                $env{'form.start_'.$full} :
                          ($end?', ending '.localtime($end):'').': <b>'.                                $now );
       &Apache::lonnet::assigncustomrole(                  my $end   = ( $env{'form.end_'.$full} ?
  $ENV{'form.ccdomain'},$ENV{'form.ccuname'},$url,$three,$four,$five,$end,$start).                                $env{'form.end_'.$full} :
       '</b><br>');                                0 );
     } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_([^\_]+)$/) {                                                                                       
                   # split multiple sections
                   my %sections = ();
                   my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5);
                   if ($num_sections == 0) {
                       $r->print(&commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end));
                   } else {
                       foreach (sort {$a cmp $b} keys %sections) {
                           my $securl = $url.'/'.$_;
           $r->print(&commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));
                       }
                   }
       } elsif ($_=~/^form\.act\_([^\_]+)\_(\w+)\_([^\_]+)$/) {
  # Activate roles for sections with 3 id numbers   # Activate roles for sections with 3 id numbers
  # set start, end times, and the url for the class   # set start, end times, and the url for the class
  my ($one,$two,$three)=($1,$2,$3);   my ($one,$two,$three)=($1,$2,$3);
  my $start = ( $ENV{'form.start_'.$one.'_'.$two.'_'.$three} ?    my $start = ( $env{'form.start_'.$one.'_'.$two.'_'.$three} ? 
       $ENV{'form.start_'.$one.'_'.$two.'_'.$three} :         $env{'form.start_'.$one.'_'.$two.'_'.$three} : 
       $now );        $now );
  my $end   = ( $ENV{'form.end_'.$one.'_'.$two.'_'.$three} ?    my $end   = ( $env{'form.end_'.$one.'_'.$two.'_'.$three} ? 
       $ENV{'form.end_'.$one.'_'.$two.'_'.$three} :        $env{'form.end_'.$one.'_'.$two.'_'.$three} :
       0 );        0 );
  my $url='/'.$one.'/'.$two;   my $url='/'.$one.'/'.$two;
  $ENV{'form.sec_'.$one.'_'.$two.'_'.$three}=~s/\W//g;                  my $type = 'three';
  if ($ENV{'form.sec_'.$one.'_'.$two.'_'.$three}) {                  # split multiple sections
     $url.='/'.$ENV{'form.sec_'.$one.'_'.$two.'_'.$three};                  my %sections = ();
  }                  my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three);
  # Assign the role and report it                  if ($num_sections == 0) {
  $r->print(&mt('Assigning').' '.$three.' in '.$url.                      $r->print(&commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
                          ($start?', '.&mt('starting').' '.localtime($start):'').                  } else {
                          ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.                      my $emptysec = 0;
                           &Apache::lonnet::assignrole(                      foreach my $sec (sort {$a cmp $b} keys %sections) {
                               $ENV{'form.ccdomain'},$ENV{'form.ccuname'},                          $sec =~ s/\W//g;
                               $url,$three,$end,$start).                          if ($sec ne '') {  
   '</b><br>');                              my $securl = $url.'/'.$sec;
  # Handle students differently                              $r->print(&commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec));
  if ($three eq 'st') {                          } else {
     $url=~/^\/(\w+)\/(\w+)/;                              $emptysec = 1;
     my $cid=$one.'_'.$two;                          }
     $r->print(&mt('Add to classlist').': <b>'.                      }
       &Apache::lonnet::critical(                      if ($emptysec) {
   'put:'.$ENV{'course.'.$cid.'.domain'}.':'.                          $r->print(&commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
                            $ENV{'course.'.$cid.'.num'}.':classlist:'.                      }
                                    &Apache::lonnet::escape(                  } 
                                        $ENV{'form.ccuname'}.':'.  
                                        $ENV{'form.ccdomain'} ).'='.  
                                    &Apache::lonnet::escape($end.':'.$start),  
        $ENV{'course.'.$cid.'.home'})  
       .'</b><br>');  
  }  
     } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {      } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {
  # Activate roles for sections with two id numbers   # Activate roles for sections with two id numbers
  # set start, end times, and the url for the class   # set start, end times, and the url for the class
  my $start = ( $ENV{'form.start_'.$1.'_'.$2} ?    my $start = ( $env{'form.start_'.$1.'_'.$2} ? 
       $ENV{'form.start_'.$1.'_'.$2} :         $env{'form.start_'.$1.'_'.$2} : 
       $now );        $now );
  my $end   = ( $ENV{'form.end_'.$1.'_'.$2} ?    my $end   = ( $env{'form.end_'.$1.'_'.$2} ? 
       $ENV{'form.end_'.$1.'_'.$2} :        $env{'form.end_'.$1.'_'.$2} :
       0 );        0 );
  my $url='/'.$1.'/';   my $url='/'.$1.'/';
  # Assign the role and report it.                  # split multiple sections
  $r->print(&mt('Assigning').' '.$2.' in '.$url.': '.                  my %sections = ();
                          ($start?', '.&mt('starting').' '.localtime($start):'').                  my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2);
                          ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.                  if ($num_sections == 0) {
                           &Apache::lonnet::assignrole(                      $r->print(&commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
                               $ENV{'form.ccdomain'},$ENV{'form.ccuname'},                  } else {
                               $url,$2,$end,$start)                      my $emptysec = 0;
   .'</b><br>');                      foreach my $sec (sort {$a cmp $b} keys %sections) {
                           if ($sec ne '') {
                               my $securl = $url.'/'.$sec;
                               $r->print(&commit_standardrole($udom,$uname,$securl,$2,$start,$end,$1,undef,$sec));
                           } else {
                               $emptysec = 1;
                           }
                       }
                       if ($emptysec) {
                           $r->print(&commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
                       }
                   }
     } else {      } else {
  $r->print('<p>'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$_.'</tt></p><br>');   $r->print('<p>'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$_.'</tt></p><br />');
             }              }
  }    } 
     } # End of foreach (keys(%ENV))      } # End of foreach (keys(%env))
 # Flush the course logs so reverse user roles immediately updated  # Flush the course logs so reverse user roles immediately updated
     &Apache::lonnet::flushcourselogs();      &Apache::lonnet::flushcourselogs();
     $r->print('</body></html>');      $r->print('<p><a href="/adm/createuser">Create/Modify Another User</a></p>');
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub commit_customrole {
       my ($udom,$uname,$url,$three,$four,$five,$start,$end) = @_;
       my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.'@'.$three.' in '.$url.
                            ($start?', '.&mt('starting').' '.localtime($start):'').
                            ($end?', ending '.localtime($end):'').': <b>'.
                 &Apache::lonnet::assigncustomrole(
                    $udom,$uname,$url,$three,$four,$five,$end,$start).
                    '</b><br />';
       return $output;
   }
   
   sub commit_standardrole {
       my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_;
       my $output;
       my $logmsg;
       if ($three eq 'st') {
           my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec);
           if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) {
               $output = "Error: $result\n"; 
           } else {
               $output = &mt('Assigning').' '.$three.' in '.$url.
                  ($start?', '.&mt('starting').' '.localtime($start):'').
                  ($end?', '.&mt('ending').' '.localtime($end):'').
                  ': <b>'.$result.'</b><br />'.
                  &mt('Add to classlist').': <b>ok</b><br />';
           }
       } else {
           $output = &mt('Assigning').' '.$three.' in '.$url.
                  ($start?', '.&mt('starting').' '.localtime($start):'').
                  ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.
                  &Apache::lonnet::assignrole(
                      $udom,$uname,$url,$three,$end,$start).
                      '</b><br />';
       }
       return $output;
   }
   
   sub commit_studentrole {
       my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_;
       my $linefeed =  '<br />'."\n";
       my $result;
       if (defined($one) && defined($two)) {
           my $cid=$one.'_'.$two;
           my $oldsec=&Apache::lonnet::getsection($udom,$uname,$cid);
           my $secchange = 0;
           my $expire_role_result;
           my $modify_section_result;
           unless ($oldsec eq '-1') {
               unless ($sec eq $oldsec) {
                   $secchange = 1;
                   my $uurl='/'.$cid;
                   $uurl=~s/\_/\//g;
                   if ($oldsec) {
                       $uurl.='/'.$oldsec;
                   }
                   $expire_role_result = &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',time);
                   $result = $expire_role_result;
               }
           }
           if (($expire_role_result eq 'ok') || ($secchange == 0)) {
               $modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid);
               if ($modify_section_result =~ /^ok/) {
                   if ($secchange == 1) {
                       $$logmsg .= "Section for $uname switched from old section: $oldsec to new section: $sec".$linefeed;
                   } elsif ($oldsec eq '-1') {
                       $$logmsg .= "New student role for $uname in section $sec in course $cid".$linefeed;
                   } else {
                       $$logmsg .= "Student $uname assigned to unchanged section $sec in course $cid".$linefeed;
                   }
               } else {
                   $$logmsg .= "Error when attempting section change for $uname from old section $oldsec to new section: $sec in course $cid -error: $modify_section_result".$linefeed;
               }
               $result = $modify_section_result;
           } elsif ($secchange == 1) {
               $$logmsg .= "Error when attempting to expire role for $uname in old section $oldsec in course $cid -error: $expire_role_result".$linefeed;
           }
       } else {
           $$logmsg .= "Incomplete course id defined.  Addition of user $uname from domain $udom to course $one\_$two, section $sec not completed.$linefeed";
           $result = "Error: incomplete course id\n";
       }
       return $result;
   }
   
   sub build_roles {
       my ($sectionstr,$sections,$role) = @_;
       my $num_sections = 0;
       if ($sectionstr=~ /,/) {
           my @secnums = split/,/,$sectionstr;
           if ($role eq 'st') {
               $secnums[0] =~ s/\W//g;
               $$sections{$secnums[0]} = 1;
               $num_sections = 1;
           } else {
               foreach my $sec (@secnums) {
                   $sec =~ ~s/\W//g;
                   unless ($sec eq "") {
                       if (exists($$sections{$sec})) {
                           $$sections{$sec} ++;
                       } else {
                           $$sections{$sec} = 1;
                           $num_sections ++;
                       }
                   }
               }
           }
       } else {
           $sectionstr=~s/\W//g;
           unless ($sectionstr eq '') {
               $$sections{$sectionstr} = 1;
               $num_sections ++;
           }
       }
                                                                                        
       return $num_sections;
 }  }
   
 # ========================================================== Custom Role Editor  # ========================================================== Custom Role Editor
   
 sub custom_role_editor {  sub custom_role_editor {
     my $r=shift;      my $r=shift;
     my $rolename=$ENV{'form.rolename'};      my $rolename=$env{'form.rolename'};
   
     if ($rolename eq 'make new role') {      if ($rolename eq 'make new role') {
  $rolename=$ENV{'form.newrolename'};   $rolename=$env{'form.newrolename'};
     }      }
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
Line 1092  sub custom_role_editor { Line 1397  sub custom_role_editor {
         return;          return;
     }      }
   
     $r->print(&Apache::loncommon::bodytag(      $r->print(&Apache::loncommon::start_page('Custom Role Editor'));
                      'Create Users, Change User Privileges').'<h2>');  
     my $syspriv='';      my $syspriv='';
     my $dompriv='';      my $dompriv='';
     my $coursepriv='';      my $coursepriv='';
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
       $r->print('<h2>');
     if (($rdummy ne 'con_lost') && ($roledef ne '')) {      if (($rdummy ne 'con_lost') && ($roledef ne '')) {
  $r->print(&mt('Existing Role').' "');   $r->print(&mt('Existing Role').' "');
 # ------------------------------------------------- Get current role privileges  # ------------------------------------------------- Get current role privileges
Line 1171  ENDCCF Line 1476  ENDCCF
     '</td></tr>');      '</td></tr>');
     }      }
     $r->print(      $r->print(
    '<table><input type="submit" value="'.&mt('Define Role').'" /></form></body></html>');     '<table><input type="submit" value="'.&mt('Define Role').'" /></form>'.
         &Apache::loncommon::end_page());
 }  }
   
 # ---------------------------------------------------------- Call to definerole  # ---------------------------------------------------------- Call to definerole
 sub set_custom_role {  sub set_custom_role {
     my $r=shift;      my ($r) = @_;
   
     my $rolename=$ENV{'form.rolename'};      my $rolename=$env{'form.rolename'};
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
   
Line 1187  sub set_custom_role { Line 1493  sub set_custom_role {
         return;          return;
     }      }
   
     $r->print(&Apache::loncommon::bodytag(      $r->print(&Apache::loncommon::start_page('Save Custom Role').'<h2>');
                      'Create Users, Change User Privileges').'<h2>');  
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
   
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
     if (($rdummy ne 'con_lost') && ($roledef ne '')) {      if (($rdummy ne 'con_lost') && ($roledef ne '')) {
  $r->print(&mt('Existing Role').' "');   $r->print(&mt('Existing Role').' "');
Line 1207  sub set_custom_role { Line 1513  sub set_custom_role {
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {      foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$_);
         unless ($restrict) { $restrict=''; }          unless ($restrict) { $restrict=''; }
         if ($ENV{'form.'.$priv.':c'}) {          if ($env{'form.'.$priv.':c'}) {
     $courole.=':'.$_;      $courole.=':'.$_;
  }   }
     }      }
Line 1215  sub set_custom_role { Line 1521  sub set_custom_role {
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {      foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$_);
         unless ($restrict) { $restrict=''; }          unless ($restrict) { $restrict=''; }
         if ($ENV{'form.'.$priv.':d'}) {          if ($env{'form.'.$priv.':d'}) {
     $domrole.=':'.$_;      $domrole.=':'.$_;
  }   }
     }      }
Line 1223  sub set_custom_role { Line 1529  sub set_custom_role {
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {      foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$_);
         unless ($restrict) { $restrict=''; }          unless ($restrict) { $restrict=''; }
         if ($ENV{'form.'.$priv.':s'}) {          if ($env{'form.'.$priv.':s'}) {
     $sysrole.=':'.$_;      $sysrole.=':'.$_;
  }   }
     }      }
     $r->print('<br />Defining Role: '.      $r->print('<br />Defining Role: '.
    &Apache::lonnet::definerole($rolename,$sysrole,$domrole,$courole));     &Apache::lonnet::definerole($rolename,$sysrole,$domrole,$courole));
     if ($ENV{'request.course.id'}) {      if ($env{'request.course.id'}) {
         my $url='/'.$ENV{'request.course.id'};          my $url='/'.$env{'request.course.id'};
         $url=~s/\_/\//g;          $url=~s/\_/\//g;
  $r->print('<br />'.&mt('Assigning Role to Self').': '.   $r->print('<br />'.&mt('Assigning Role to Self').': '.
       &Apache::lonnet::assigncustomrole($ENV{'user.domain'},        &Apache::lonnet::assigncustomrole($env{'user.domain'},
  $ENV{'user.name'},   $env{'user.name'},
  $url,   $url,
  $ENV{'user.domain'},   $env{'user.domain'},
  $ENV{'user.name'},   $env{'user.name'},
  $rolename));   $rolename));
     }      }
     $r->print('</body></html>');      $r->print('<p><a href="/adm/createuser">Create another role, or Create/Modify a user.</a></p>');
       $r->print(&Apache::loncommon::end_page());
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
Line 1253  sub handler { Line 1560  sub handler {
        return OK;         return OK;
     }      }
   
     if ((&Apache::lonnet::allowed('cta',$ENV{'request.course.id'})) ||      if ((&Apache::lonnet::allowed('cta',$env{'request.course.id'})) ||
         (&Apache::lonnet::allowed('cin',$ENV{'request.course.id'})) ||           (&Apache::lonnet::allowed('cin',$env{'request.course.id'})) || 
         (&Apache::lonnet::allowed('ccr',$ENV{'request.course.id'})) ||           (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) || 
         (&Apache::lonnet::allowed('cep',$ENV{'request.course.id'})) ||          (&Apache::lonnet::allowed('cep',$env{'request.course.id'})) ||
         (&Apache::lonnet::allowed('cca',$ENV{'request.role.domain'})) ||   (&authorpriv($env{'user.name'},$env{'request.role.domain'})) ||
         (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'}))) {          (&Apache::lonnet::allowed('mau',$env{'request.role.domain'}))) {
        &Apache::loncommon::content_type($r,'text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
        unless ($ENV{'form.phase'}) {         unless ($env{'form.phase'}) {
    &print_username_entry_form($r);     &print_username_entry_form($r);
        }         }
        if ($ENV{'form.phase'} eq 'get_user_info') {         if ($env{'form.phase'} eq 'get_user_info') {
            &print_user_modification_page($r);             &print_user_modification_page($r);
        } elsif ($ENV{'form.phase'} eq 'update_user_data') {         } elsif ($env{'form.phase'} eq 'update_user_data') {
            &update_user_data($r);             &update_user_data($r);
        } elsif ($ENV{'form.phase'} eq 'selected_custom_edit') {         } elsif ($env{'form.phase'} eq 'selected_custom_edit') {
            &custom_role_editor($r);             &custom_role_editor($r);
        } elsif ($ENV{'form.phase'} eq 'set_custom_roles') {         } elsif ($env{'form.phase'} eq 'set_custom_roles') {
    &set_custom_role($r);     &set_custom_role($r);
        }         }
    } else {     } else {
       $ENV{'user.error.msg'}=        $env{'user.error.msg'}=
         "/adm/createuser:mau:0:0:Cannot modify user data";          "/adm/createuser:mau:0:0:Cannot modify user data";
       return HTTP_NOT_ACCEPTABLE;         return HTTP_NOT_ACCEPTABLE; 
    }     }
Line 1283  sub handler { Line 1590  sub handler {
   
 #-------------------------------------------------- functions for &phase_two  #-------------------------------------------------- functions for &phase_two
 sub course_level_table {  sub course_level_table {
     my %inccourses = @_;      my (%inccourses) = @_;
     my $table = '';      my $table = '';
 # Custom Roles?  # Custom Roles?
   
     my %customroles=&my_custom_roles();      my %customroles=&my_custom_roles();
       my %lt=&Apache::lonlocal::texthash(
               'exs'  => "Existing sections",
               'new'  => "Define new section",
               'ssd'  => "Set Start Date",
               'sed'  => "Set End Date",
               'crl'  => "Course Level",
               'act'  => "Activate",
               'rol'  => "Role",
               'ext'  => "Extent",
               'grs'  => "Group/Section",
               'sta'  => "Start",
               'end'  => "End"
       );
   
     foreach (sort( keys(%inccourses))) {      foreach (sort( keys(%inccourses))) {
  my $thiscourse=$_;   my $thiscourse=$_;
Line 1299  sub course_level_table { Line 1619  sub course_level_table {
  my $bgcol=$thiscourse;   my $bgcol=$thiscourse;
  $bgcol=~s/[^7-9a-e]//g;   $bgcol=~s/[^7-9a-e]//g;
  $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);   $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);
  my ($domain)=split(/\//,$thiscourse);   my ($domain,$cnum)=split(/\//,$thiscourse);
           my %sections_count = ();
           my $num_sections = 0;
           if (defined($env{'request.course.id'})) {
               if ($env{'request.course.id'} eq $domain.'_'.$cnum) {
                   $num_sections = &Apache::loncommon::get_sections($domain,$cnum,\%sections_count);
               }
           }
  foreach  ('st','ta','ep','ad','in','cc') {   foreach  ('st','ta','ep','ad','in','cc') {
     if (&Apache::lonnet::allowed('c'.$_,$thiscourse)) {      if (&Apache::lonnet::allowed('c'.$_,$thiscourse)) {
  my $plrole=&Apache::lonnet::plaintext($_);   my $plrole=&Apache::lonnet::plaintext($_);
Line 1310  sub course_level_table { Line 1637  sub course_level_table {
 <td>$area<br />Domain: $domain</td>  <td>$area<br />Domain: $domain</td>
 ENDEXTENT  ENDEXTENT
         if ($_ ne 'cc') {          if ($_ ne 'cc') {
     $table .= <<ENDSECTION;                      if ($num_sections > 0) {
 <td><input type="text" size="5" name="sec_$protectedcourse\_$_"></td>                          my $currsec = &course_sections($num_sections,\%sections_count,$protectedcourse.'_'.$_);
 ENDSECTION                          $table .= 
                       '<td><table border="0" cellspacing="0" cellpadding="0">'.
                        '<tr><td valign="top">'.$lt{'exs'}.'<br />'.
                           $currsec.'</td>'.
                        '<td>&nbsp;&nbsp;</td>'.
                        '<td valign="top">&nbsp;'.$lt{'new'}.'<br />'.
                        '<input type="text" name="newsec_'.$protectedcourse.'_'.$_.'" value="" /></td>'.
                        '<input type="hidden" '.
                        'name="sec_'.$protectedcourse.'_'.$_.'"></td>'.
                        '</tr></table></td>';
                       } else {
                           $table .= '<td><input type="text" size="10" '.
                        'name="sec_'.$protectedcourse.'_'.$_.'"></td>';
                       }
                 } else {                   } else { 
     $table .= <<ENDSECTION;      $table .= '<td>&nbsp</td>';
 <td>&nbsp</td>   
 ENDSECTION  
                 }                  }
  my %lt=&Apache::lonlocal::texthash(  
                                'ssd'  => "Set Start Date",  
                                'sed'  => "Set End Date"  
    );  
  $table .= <<ENDTIMEENTRY;   $table .= <<ENDTIMEENTRY;
 <td><input type=hidden name="start_$protectedcourse\_$_" value=''>  <td><input type=hidden name="start_$protectedcourse\_$_" value=''>
 <a href=  <a href=
Line 1336  ENDTIMEENTRY Line 1670  ENDTIMEENTRY
         foreach (sort keys %customroles) {          foreach (sort keys %customroles) {
     if (&Apache::lonnet::allowed('ccr',$thiscourse)) {      if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
  my $plrole=$_;   my $plrole=$_;
                 my $customrole=$protectedcourse.'_cr_cr_'.$ENV{'user.domain'}.                  my $customrole=$protectedcourse.'_cr_cr_'.$env{'user.domain'}.
     '_'.$ENV{'user.name'}.'_'.$plrole;      '_'.$env{'user.name'}.'_'.$plrole;
  my %lt=&Apache::lonlocal::texthash(   $table .= <<END;
                                'ssd'  => "Set Start Date",  
                                'sed'  => "Set End Date"  
    );  
  $table .= <<ENDENTRY;  
 <tr bgcolor="#$bgcol">  <tr bgcolor="#$bgcol">
 <td><input type="checkbox" name="act_$customrole"></td>  <td><input type="checkbox" name="act_$customrole"></td>
 <td>$plrole</td>  <td>$plrole</td>
 <td>$area</td>  <td>$area</td>
 <td><input type="text" size="5" name="sec_$customrole"></td>  END
                   if ($num_sections > 0) {
                       my $currsec = &course_sections($num_sections,\%sections_count,$customrole);
                       $table.=
                      '<td><table border="0" cellspacing="0" cellpadding="0">'.
                      '<tr><td valign="top">'.$lt{'exs'}.'<br />'.
                        $currsec.'</td>'.
                      '<td>&nbsp;&nbsp;</td>'.
                      '<td valign="top">&nbsp;'.$lt{'new'}.'<br />'.
                      '<input type="text" name="newsec_'.$customrole.'" value="" /></td>'.
                      '<input type="hidden" '.
                      'name="sec_'.$customrole.'"></td>'.
                      '</tr></table></td>';
                   } else {
                       $table .= '<td><input type="text" size="10" '.
                        'name="sec_'.$customrole.'"></td>';
                   }
                   $table .= <<ENDENTRY;
 <td><input type=hidden name="start_$customrole" value=''>  <td><input type=hidden name="start_$customrole" value=''>
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$customrole.value,'start_$customrole','cu.pres','dateset')">$lt{'ssd'}</a></td>  "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$customrole.value,'start_$customrole','cu.pres','dateset')">$lt{'ssd'}</a></td>
Line 1360  ENDENTRY Line 1707  ENDENTRY
     }      }
     return '' if ($table eq ''); # return nothing if there is nothing       return '' if ($table eq ''); # return nothing if there is nothing 
                                  # in the table                                   # in the table
     my %lt=&Apache::lonlocal::texthash(  
     'crl'  => "Course Level",  
                     'act'  => "Activate",  
                     'rol'  => "Role",  
                     'ext'  => "Extent",  
                     'grs'  => "Group/Section",  
                     'sta'  => "Start",  
                     'end'  => "End"  
        );  
     my $result = <<ENDTABLE;      my $result = <<ENDTABLE;
 <h4>$lt{'crl'}</h4>  <h4>$lt{'crl'}</h4>
 <table border=2><tr><th>$lt{'act'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th>  <table border=2><tr><th>$lt{'act'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th>
Line 1378  $table Line 1716  $table
 ENDTABLE  ENDTABLE
     return $result;      return $result;
 }  }
   
   sub course_sections {
       my ($num_sections,$sections_count,$role) = @_;
       my $output = '';
       my @sections = (sort {$a <=> $b} keys %{$sections_count});
       if ($num_sections == 1) {
           $output = '<select name="currsec_'.$role.'" >'."\n".
                     '  <option value="">Select</option>'."\n".
                     '  <option value="">No section</option>'."\n".
                     '  <option value="'.$sections[0].'" >'.$sections[0].'</option>'."\n";
       } else {
           $output = '<select name="currsec_'.$role.'" ';
           my $multiple = 4;
           if ($num_sections <4) { $multiple = $num_sections; }
           $output .= '"multiple" size="'.$multiple.'">'."\n";
           foreach (@sections) {
               $output .= '<option value="'.$_.'">'.$_."</option>\n";
           }
       }
       $output .= '</select>'; 
       return $output;
   }
   
   sub course_level_dc {
       my ($dcdom) = @_;
       my %customroles=&my_custom_roles();
       my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'.
                         '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.
                         '<input type="hidden" name="dccourse" value="" />';
       my $courseform='<b>'.&Apache::loncommon::selectcourse_link
                        ('cu','dccourse','dcdomain','coursedesc').'</b>';
                                                                                         
       my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,$dcdom);
       my %lt=&Apache::lonlocal::texthash(
                       'crl'  => "Course Level",
                       'crt'  => "Course Title",
                       'rol'  => "Role",
                       'grs'  => "Group/Section",
                       'exs'  => "Existing sections",
                       'new'  => "Define new section", 
                       'sta'  => "Start",
                       'end'  => "End",
                       'ssd'  => "Set Start Date",
                       'sed'  => "Set End Date"
                     );
       my $header = '<h4>'.$lt{'crl'}.'</h4>'.
                    '<table border="2"><tr><th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th></tr>';
       my $otheritems = '<tr><td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'".'cu'."'".','."'".'dccourse'."'".','."'".'dcdomain'."'".','."'".'coursedesc'."',''".')" /></td>'.
                        '<td><select name="role">'."\n";
       foreach  ('st','ta','ep','ad','in','cc') {
           my $plrole=&Apache::lonnet::plaintext($_);
           $otheritems .= '  <option value="'.$_.'">'.$plrole;
       }
       if ( keys %customroles > 0) {
           foreach (sort keys %customroles) {
               my $custrole='cr_cr_'.$env{'user.domain'}.
                       '_'.$env{'user.name'}.'_'.$_;
               $otheritems .= '  <option value="'.$custrole.'">'.$_;
           }
       }
       $otheritems .= '</select></td><td>'.
                        '<table border="0" cellspacing="0" cellpadding="0">'.
                        '<tr><td valign="top"><b>'.$lt{'exs'}.'</b><br /><select name="currsec">'.
                        ' <option value=""><--'.&mt('Pick course first').'</select></td>'.
                        '<td>&nbsp;&nbsp;</td>'.
                        '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.
                        '<input type="text" name="newsec" value="" /></td>'.
                        '</tr></table></td>';
       $otheritems .= <<ENDTIMEENTRY;
   <td><input type=hidden name="start" value=''>
   <a href=
   "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>
   <td><input type=hidden name="end" value=''>
   <a href=
   "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>
   ENDTIMEENTRY
       $otheritems .= "</tr></table>\n";
       return $cb_jscript.$header.$hiddenitems.$otheritems;
   }
   
 #---------------------------------------------- end functions for &phase_two  #---------------------------------------------- end functions for &phase_two
   
 #--------------------------------- functions for &phase_two and &phase_three  #--------------------------------- functions for &phase_two and &phase_three

Removed from v.1.83  
changed lines
  Added in v.1.111


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