Diff for /loncom/interface/loncreateuser.pm between versions 1.61 and 1.72

version 1.61, 2003/07/18 19:50:28 version 1.72, 2003/12/10 20:38:09
Line 29 Line 29
   
 package Apache::loncreateuser;  package Apache::loncreateuser;
   
   =pod
   
   =head1 NAME
   
   Apache::loncreateuser - handler to create users and custom roles
   
   =head1 SYNOPSIS
   
   Apache::loncreateuser provides an Apache handler for creating users,
       editing their login parameters, roles, and removing roles, and
       also creating and assigning custom roles.
   
   =head1 OVERVIEW
   
   =head2 Custom Roles
   
   In LON-CAPA, roles are actually collections of privileges. "Teaching
   Assistant", "Course Coordinator", and other such roles are really just
   collection of privileges that are useful in many circumstances.
   
   Creating custom roles can be done by the Domain Coordinator through
   the Create User functionality. That screen will show all privileges
   that can be assigned to users. For a complete list of privileges,
   please see C</home/httpd/lonTabs/rolesplain.tab>.
   
   Custom role definitions are stored in the C<roles.db> file of the role
   author.
   
   =cut
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
   use Apache::lonlocal;
   
 my $loginscript; # piece of javascript used in two separate instances  my $loginscript; # piece of javascript used in two separate instances
 my $generalrule;  my $generalrule;
Line 100  sub print_username_entry_form { Line 131  sub print_username_entry_form {
     my %existingroles=&my_custom_roles();      my %existingroles=&my_custom_roles();
     my $choice=&Apache::loncommon::select_form('make new role','rolename',      my $choice=&Apache::loncommon::select_form('make new role','rolename',
  ('make new role' => 'Generate new role ...',%existingroles));   ('make new role' => 'Generate new role ...',%existingroles));
       my %lt=&Apache::lonlocal::texthash(
       'siur'   => "Set Individual User Roles",
       'usr'  => "Username",
                       'dom'  => "Domain",
                       'usrr' => "User Roles",
                       'ecrp' => "Edit Custom Role Privileges",
                       'nr'   => "Name of Role",
                       'cre'  => "Custom Role Editor"
          );
     $r->print(<<"ENDDOCUMENT");      $r->print(<<"ENDDOCUMENT");
 <html>  <html>
 <head>  <head>
Line 109  $selscript Line 149  $selscript
 $bodytag  $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>Set Individual User Roles</h2>  <h2>$lt{siur}</h2>
 <table>  <table>
 <tr><td>Username:</td><td><input type="text" size="15" name="ccuname">  <tr><td>$lt{usr}:</td><td><input type="text" size="15" name="ccuname">
 </td><td rowspan="2">$sellink</td></tr><tr><td>  </td><td rowspan="2">$sellink</td></tr><tr><td>
 Domain:</td><td>$domform</td></tr>  $lt{'dom'}:</td><td>$domform</td></tr>
 </table>  </table>
 <input name="userrole" type="submit" value="User Roles" />  <input name="userrole" type="submit" value="$lt{usrr}" />
 </form>  </form>
 <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>Edit Custom Role Privileges</h2>  <h2>$lt{'ecrp'}</h2>
 Name of Role: $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="Custom Role Editor" />  <input name="customeditor" type="submit" value="$lt{'cre'}" />
 </body>  </body>
 </html>  </html>
 ENDDOCUMENT  ENDDOCUMENT
Line 206  ENDFORMINFO Line 246  ENDFORMINFO
             '<option value="default" selected>default</option>'."\n".              '<option value="default" selected>default</option>'."\n".
                 &Apache::loncommon::home_server_option_list($ccdomain);                  &Apache::loncommon::home_server_option_list($ccdomain);
                   
       my %lt=&Apache::lonlocal::texthash(
                       'cnu'  => "Create New User",
                       'nu'   => "New User",
                       'id'   => "in domain",
                       'pd'   => "Personal Data",
                       'fn'   => "First Name",
                       'mn'   => "Middle Name",
                       'ln'   => "Last Name",
                       'gen'  => "Generation",
                       'idsn' => "ID/Student Number",
                       'hs'   => "Home Server",
                       'lg'   => "Login Data"
          );
  $r->print(<<ENDNEWUSER);   $r->print(<<ENDNEWUSER);
 $dochead  $dochead
 <h1>Create New User</h1>  <h1>$lt{'cnu'}</h1>
 $forminfo  $forminfo
 <h2>New user "$ccuname" in domain $ccdomain</h2>  <h2>$lt{'nu'} "$ccuname" $lt{'id'} $ccdomain</h2>
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
 $loginscript  $loginscript
 </script>  </script>
 <input type='hidden' name='makeuser' value='1' />  <input type='hidden' name='makeuser' value='1' />
 <h3>Personal Data</h3>  <h3>$lt{'pd'}</h3>
 <p>  <p>
 <table>  <table>
 <tr><td>First Name  </td>  <tr><td>$lt{'fn'}  </td>
     <td><input type='text' name='cfirst'  size='15' /></td></tr>      <td><input type='text' name='cfirst'  size='15' /></td></tr>
 <tr><td>Middle Name </td>   <tr><td>$lt{'mn'} </td> 
     <td><input type='text' name='cmiddle' size='15' /></td></tr>      <td><input type='text' name='cmiddle' size='15' /></td></tr>
 <tr><td>Last Name   </td>  <tr><td>$lt{'ln'}   </td>
     <td><input type='text' name='clast'   size='15' /></td></tr>      <td><input type='text' name='clast'   size='15' /></td></tr>
 <tr><td>Generation  </td>  <tr><td>$lt{'gen'}  </td>
     <td><input type='text' name='cgen'    size='5'  /></td></tr>      <td><input type='text' name='cgen'    size='5'  /></td></tr>
 </table>  </table>
 ID/Student Number <input type='text' name='cstid'   size='15' /></p>  $lt{'idsn'} <input type='text' name='cstid'   size='15' /></p>
 Home Server: <select name="hserver" size="1"> $home_server_list </select>  ${'hs'}: <select name="hserver" size="1"> $home_server_list </select>
 <hr />  <hr />
 <h3>Login Data</h3>  <h3>$lt{'lg'}</h3>
 <p>$generalrule </p>  <p>$generalrule </p>
 <p>$authformkrb </p>  <p>$authformkrb </p>
 <p>$authformint </p>  <p>$authformint </p>
Line 238  Home Server: <select name="hserver" size Line 291  Home Server: <select name="hserver" size
 <p>$authformloc </p>  <p>$authformloc </p>
 ENDNEWUSER  ENDNEWUSER
     } else { # user already exists      } else { # user already exists
       my %lt=&Apache::lonlocal::texthash(
                       'cup'  => "Change User Privileges",
                       'usr'  => "User",                    
                       'id'   => "in domain",
                       'fn'   => "first name",
                       'mn'   => "middle name",
                       'ln'   => "last name",
                       'gen'  => "generation"
          );
  $r->print(<<ENDCHANGEUSER);   $r->print(<<ENDCHANGEUSER);
 $dochead  $dochead
 <h1>Change User Privileges</h1>  <h1>$lt{'cup'}</h1>
 $forminfo  $forminfo
 <h2>User "$ccuname" in domain "$ccdomain"</h2>  <h2>$lt{'usr'} "$ccuname" $lt{'id'} "$ccdomain"</h2>
 ENDCHANGEUSER  ENDCHANGEUSER
         # Get the users information          # Get the users information
         my %userenv = &Apache::lonnet::get('environment',          my %userenv = &Apache::lonnet::get('environment',
Line 253  ENDCHANGEUSER Line 315  ENDCHANGEUSER
 <hr />  <hr />
 <table border="2">  <table border="2">
 <tr>  <tr>
 <th>first name</th><th>middle name</th><th>last name</th><th>generation</th>  <th>$lt{'fn'}</th><th>$lt{'mn'}</th><th>$lt{'ln'}</th><th>$lt{'gen'}</th>
 </tr>  </tr>
 <tr>  <tr>
 END  END
Line 266  END Line 328  END
                $r->print('<td>'.$userenv{$_}.'</td>');                 $r->print('<td>'.$userenv{$_}.'</td>');
            }             }
         }          }
         $r->print(<<END);        $r->print(<<END);
 </tr>  </tr>
 </table>  </table>
 END  END
Line 274  END Line 336  END
         my ($tmp) = keys(%rolesdump);          my ($tmp) = keys(%rolesdump);
         unless ($tmp =~ /^(con_lost|error)/i) {          unless ($tmp =~ /^(con_lost|error)/i) {
            my $now=time;             my $now=time;
      my %lt=&Apache::lonlocal::texthash(
       'rer'  => "Revoke Existing Roles",
                       'rev'  => "Revoke",                    
                       'del'  => "Delete",
                       'rol'  => "Role",
                       'ext'  => "Extent",
                       'sta'  => "Start",
                       'end'  => "End"
          );
            $r->print(<<END);             $r->print(<<END);
 <hr />  <hr />
 <h3>Revoke Existing Roles</h3>  <h3>$lt{'rer'}</h3>
 <table border=2>  <table border=2>
 <tr><th>Revoke</th><th>Delete</th><th>Role</th><th>Extent</th><th>Start</th><th>End</th>  <tr><th>$lt{'rev'}</th><th>$lt{'del'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th>
 END  END
    foreach my $area (keys(%rolesdump)) {     foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
       my $b1=join('_',(split('_',$b))[1,0]);
       return $a1 cmp $b1;
    } keys(%rolesdump)) {
                next if ($area =~ /^rolesdef/);                 next if ($area =~ /^rolesdef/);
                my $role = $rolesdump{$area};                 my $role = $rolesdump{$area};
                my $thisrole=$area;                 my $thisrole=$area;
                $area =~ s/\_\w\w$//;                 $area =~ s/\_\w\w$//;
                my ($role_code,$role_end_time,$role_start_time) =                  my ($role_code,$role_end_time,$role_start_time) = 
                    split(/_/,$role);                     split(/_/,$role);
   # Is this a custom role? Get role owner and title.
          my ($croleudom,$croleuname,$croletitle)=
              ($role_code=~/^cr\/(\w+)\/(\w+)\/(\w+)$/);
                my $bgcol='ffffff';                 my $bgcol='ffffff';
                my $allowed=0;                 my $allowed=0;
                my $delallowed=0;                 my $delallowed=0;
Line 297  END Line 374  END
                        &Apache::lonnet::coursedescription($1.'_'.$2);                         &Apache::lonnet::coursedescription($1.'_'.$2);
    my $carea;     my $carea;
    if (defined($coursedata{'description'})) {     if (defined($coursedata{'description'})) {
        $carea='Course: '.$coursedata{'description'}.         $carea=&mt('Course').': '.$coursedata{'description'}.
                            '<br />Domain: '.$coursedom.('&nbsp;'x8).                             '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
      &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);       &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);
    } else {     } else {
        $carea='Unavailable course: '.$area;         $carea=&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 312  END Line 389  END
                        (&Apache::lonnet::allowed('dro',$ccdomain))) {                         (&Apache::lonnet::allowed('dro',$ccdomain))) {
                        $delallowed=1;                         $delallowed=1;
                    }                     }
   # - custom role. Needs more info, too
      if ($croletitle) {
          if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
      $allowed=1;
      $thisrole.='.'.$role_code;
          }
      }
                    # Compute the background color based on $area                     # Compute the background color based on $area
                    $bgcol=$1.'_'.$2;                     $bgcol=$1.'_'.$2;
                    $bgcol=~s/[^8-9b-e]//g;                     $bgcol=~s/[^7-9a-e]//g;
                    $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',0,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;
                    }                     }
Line 347  END Line 431  END
                    }                     }
                }                 }
                my $row = '';                 my $row = '';
                $row.='<tr bgcolor=#"'.$bgcol.'"><td>';                 $row.='<tr bgcolor="#'.$bgcol.'"><td>';
                my $active=1;                 my $active=1;
                $active=0 if (($role_end_time) && ($now>$role_end_time));                 $active=0 if (($role_end_time) && ($now>$role_end_time));
                if (($active) && ($allowed)) {                 if (($active) && ($allowed)) {
Line 356  END Line 440  END
                    if ($active) {                     if ($active) {
                       $row.='&nbsp;';                        $row.='&nbsp;';
    } else {     } else {
                       $row.='expired or revoked';                        $row.=&mt('expired or revoked');
    }     }
                }                 }
        $row.='</td><td>';         $row.='</td><td>';
Line 365  END Line 449  END
                } else {                 } else {
                    $row.='&nbsp;';                     $row.='&nbsp;';
                }                 }
                $row.= '</td><td>'.&Apache::lonnet::plaintext($role_code).         my $plaintext='';
          unless ($croletitle) {
      $plaintext=&Apache::lonnet::plaintext($role_code);
          } else {
              $plaintext=
    "Customrole '$croletitle' defined by $croleuname\@$croleudom";
          }
                  $row.= '</td><td>'.$plaintext.
                       '</td><td>'.$area.                        '</td><td>'.$area.
                       '</td><td>'.($role_start_time?localtime($role_start_time)                        '</td><td>'.($role_start_time?localtime($role_start_time)
                                                    : '&nbsp;' ).                                                     : '&nbsp;' ).
Line 462  ENDOTHERAUTHS Line 553  ENDOTHERAUTHS
             }              }
         }  ## End of "check for bad authentication type" logic          }  ## End of "check for bad authentication type" logic
     } ## End of new user/old user logic      } ## End of new user/old user logic
     $r->print('<hr /><h3>Add Roles</h3>');      $r->print('<hr /><h3>'.&mt('Add Roles').'</h3>');
 #  #
 # Co-Author  # Co-Author
 #   # 
Line 471  ENDOTHERAUTHS Line 562  ENDOTHERAUTHS
         # 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(
       'cs'   => "Construction Space",
                       'act'  => "Activate",                    
                       'rol'  => "Role",
                       'ext'  => "Extent",
                       'sta'  => "Start",
                       'end'  => "End".
                       'cau'  => "Co-Author",
                       'ssd'  => "Set Start Date",
                       'sed'  => "Set End Date"
          );
        $r->print(<<ENDCOAUTH);         $r->print(<<ENDCOAUTH);
 <h4>Construction Space</h4>  <h4>$lt{'cs'}</h4>
 <table border=2><tr><th>Activate</th><th>Role</th><th>Extent</th>  <table border=2><tr><th>${'act'}</th><th>${'rol'}</th><th>${'ext'}</th>
 <th>Start</th><th>End</th></tr>  <th>$lt{'sta'}</th><th>$lt{'end'}</th></tr>
 <tr>  <tr>
 <td><input type=checkbox name="act_$cudom\_$cuname\_ca"></td>  <td><input type=checkbox name="act_$cudom\_$cuname\_ca"></td>
 <td>Co-Author</td>  <td>$lt{'cau'}</td>
 <td>$cudom\_$cuname</td>  <td>$cudom\_$cuname</td>
 <td><input type=hidden name="start_$cudom\_$cuname\_ca" value=''>  <td><input type=hidden name="start_$cudom\_$cuname\_ca" value=''>
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date Co-Author',document.cu.start_$cudom\_$cuname\_ca.value,'start_$cudom\_$cuname\_ca','cu.pres','dateset')">Set Start Date</a></td>  "javascript:pjump('date_start','Start Date Co-Author',document.cu.start_$cudom\_$cuname\_ca.value,'start_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'ssd'}</a></td>
 <td><input type=hidden name="end_$cudom\_$cuname\_ca" value=''>  <td><input type=hidden name="end_$cudom\_$cuname\_ca" value=''>
 <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')">Set End Date</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>
 </table>  </table>
 ENDCOAUTH  ENDCOAUTH
Line 492  ENDCOAUTH Line 594  ENDCOAUTH
 #  #
 # Domain level  # Domain level
 #  #
     $r->print('<h4>Domain Level</h4>'.      $r->print('<h4>'.&mt('Domain Level').'</h4>'.
     '<table border=2><tr><th>Activate</th><th>Role</th><th>Extent</th>'.      '<table border=2><tr><th>Activate</th><th>Role</th><th>Extent</th>'.
     '<th>Start</th><th>End</th></tr>');      '<th>Start</th><th>End</th></tr>');
     foreach ( sort( keys(%incdomains))) {      foreach ( sort( keys(%incdomains))) {
  my $thisdomain=$_;   my $thisdomain=$_;
         foreach ('dc','li','dg','au') {          foreach ('dc','li','dg','au','sc') {
             if (&Apache::lonnet::allowed('c'.$_,$thisdomain)) {              if (&Apache::lonnet::allowed('c'.$_,$thisdomain)) {
                my $plrole=&Apache::lonnet::plaintext($_);                 my $plrole=&Apache::lonnet::plaintext($_);
          my %lt=&Apache::lonlocal::texthash(
                       'ssd'  => "Set Start Date",
                       'sed'  => "Set End Date"
          );
                $r->print(<<ENDDROW);                 $r->print(<<ENDDROW);
 <tr>  <tr>
 <td><input type=checkbox name="act_$thisdomain\_$_"></td>  <td><input type=checkbox name="act_$thisdomain\_$_"></td>
Line 507  ENDCOAUTH Line 613  ENDCOAUTH
 <td>$thisdomain</td>  <td>$thisdomain</td>
 <td><input type=hidden name="start_$thisdomain\_$_" value=''>  <td><input type=hidden name="start_$thisdomain\_$_" value=''>
 <a href=  <a href=
 "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$thisdomain\_$_.value,'start_$thisdomain\_$_','cu.pres','dateset')">Set Start Date</a></td>  "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$thisdomain\_$_.value,'start_$thisdomain\_$_','cu.pres','dateset')">$lt{'ssd'}</a></td>
 <td><input type=hidden name="end_$thisdomain\_$_" value=''>  <td><input type=hidden name="end_$thisdomain\_$_" value=''>
 <a href=  <a href=
 "javascript:pjump('date_end','End Date $plrole',document.cu.end_$thisdomain\_$_.value,'end_$thisdomain\_$_','cu.pres','dateset')">Set End Date</a></td>  "javascript:pjump('date_end','End Date $plrole',document.cu.end_$thisdomain\_$_.value,'end_$thisdomain\_$_','cu.pres','dateset')">$lt{'sed'}</a></td>
 </tr>  </tr>
 ENDDROW  ENDDROW
             }              }
Line 521  ENDDROW Line 627  ENDDROW
 # Course level  # Course level
 #  #
     $r->print(&course_level_table(%inccourses));      $r->print(&course_level_table(%inccourses));
     $r->print("<hr /><input type=submit value=\"Modify User\">\n");      $r->print("<hr /><input type=submit value=\"".&mt('Modify User')."\">\n");
     $r->print("</form></body></html>");      $r->print("</form></body></html>");
 }  }
   
Line 607  ENDTHREEHEAD Line 713  ENDTHREEHEAD
     if ($ENV{'form.makeuser'}) {      if ($ENV{'form.makeuser'}) {
         # Create a new user          # Create a new user
  $r->print(<<ENDNEWUSERHEAD);   $r->print(<<ENDNEWUSERHEAD);
 <h3>Creating user "$ENV{'form.ccuname'}" in domain "$ENV{'form.ccdomain'}"</h2>  <h3>Creating user "$ENV{'form.ccuname'}" in domain "$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 636  ENDNEWUSERHEAD Line 742  ENDNEWUSERHEAD
  $r->print('Generating user: '.$result);   $r->print('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>Home server: '.$home.' '.          $r->print('<br />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 ''        )) {
Line 735  END Line 841  END
  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
         $r->print('Revoking '.$2.' in '.$1.': <b>'.          $r->print('Revoking '.$2.' in '.$1.': <b>'.
                      &Apache::lonnet::assignrole($ENV{'form.ccdomain'},                       &Apache::lonnet::revokerole($ENV{'form.ccdomain'},
                      $ENV{'form.ccuname'},$1,$2,$now).'</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;
Line 752  END Line 859  END
                      $ENV{'course.'.$cid.'.home'}).'</b><br>');                       $ENV{'course.'.$cid.'.home'}).'</b><br>');
  }   }
     }       } 
       if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {
   # Revoke custom role
    $r->print(
                   'Revoking custom role '.$4.' by '.$3.'@'.$2.' in '.$1.': <b>'.
   &Apache::lonnet::revokecustomrole($ENV{'form.ccdomain'},
     $ENV{'form.ccuname'},$1,$2,$3,$4).
    '</b><br>');
       }
  } elsif ($_=~/^form\.del/) {   } elsif ($_=~/^form\.del/) {
     if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) {      if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) {
         $r->print('Deleting '.$2.' in '.$1.': '.          $r->print('Deleting '.$2.' in '.$1.': '.
Line 771  END Line 886  END
  }   }
     }       } 
  } elsif ($_=~/^form\.act/) {   } elsif ($_=~/^form\.act/) {
     if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_([^\_]+)$/) {      if 
   ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) {
                   # Activate a custom role
    my $url='/'.$1.'/'.$2;
    my $full=$1.'_'.$2.'_cr_cr_'.$3.'_'.$4.'_'.$5;
    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('Assigning custom role "'.$5.'" by '.$4.'@'.$3.' in '.$url.
                            ($start?', starting '.localtime($start):'').
                            ($end?', ending '.localtime($end):'').': <b>'.
         &Apache::lonnet::assigncustomrole(
    $ENV{'form.ccdomain'},$ENV{'form.ccuname'},$url,$3,$4,$5,$end,$start).
         '</b><br>');
       } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_([^\_]+)$/) {
  # 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
   
Line 786  END Line 923  END
     $url.='/'.$ENV{'form.sec_'.$1.'_'.$2.'_'.$3};      $url.='/'.$ENV{'form.sec_'.$1.'_'.$2.'_'.$3};
  }   }
  # Assign the role and report it   # Assign the role and report it
  $r->print('Assigning: '.$3.' in '.$url.   $r->print('Assigning '.$3.' in '.$url.
                          ($start?', starting '.localtime($start):'').                           ($start?', starting '.localtime($start):'').
                          ($end?', ending '.localtime($end):'').': <b>'.                           ($end?', ending '.localtime($end):'').': <b>'.
                           &Apache::lonnet::assignrole(                            &Apache::lonnet::assignrole(
Line 819  END Line 956  END
       0 );        0 );
  my $url='/'.$1.'/';   my $url='/'.$1.'/';
  # Assign the role and report it.   # Assign the role and report it.
  $r->print('Assigning: '.$2.' in '.$url.': '.   $r->print('Assigning '.$2.' in '.$url.': '.
                          ($start?', starting '.localtime($start):'').                           ($start?', starting '.localtime($start):'').
                          ($end?', ending '.localtime($end):'').': <b>'.                           ($end?', ending '.localtime($end):'').': <b>'.
                           &Apache::lonnet::assignrole(                            &Apache::lonnet::assignrole(
                               $ENV{'form.ccdomain'},$ENV{'form.ccuname'},                                $ENV{'form.ccdomain'},$ENV{'form.ccuname'},
                               $url,$2,$end,$start)                                $url,$2,$end,$start)
   .'</b><br>');    .'</b><br>');
     }      } else {
    $r->print('<p>ERROR: Unknown command <tt>'.$_.'</tt></p><br>');
               }
  }    } 
     } # End of foreach (keys(%ENV))      } # End of foreach (keys(%ENV))
     $r->print('</body></html>');      $r->print('</body></html>');
Line 842  sub custom_role_editor { Line 981  sub custom_role_editor {
  $rolename=$ENV{'form.newrolename'};   $rolename=$ENV{'form.newrolename'};
     }      }
   
     $rolename=~s/\W//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
   
     unless ($rolename) {      unless ($rolename) {
  &print_username_entry_form($r);   &print_username_entry_form($r);
Line 861  sub custom_role_editor { Line 1000  sub custom_role_editor {
  $r->print('Existing Role "');   $r->print('Existing Role "');
 # ------------------------------------------------- Get current role privileges  # ------------------------------------------------- Get current role privileges
  ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);   ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);
  $r->print($syspriv.' '.$dompriv.' '.$coursepriv);  
     } else {      } else {
  $r->print('New Role "');   $r->print('New Role "');
  $roledef='';   $roledef='';
Line 902  sub custom_role_editor { Line 1040  sub custom_role_editor {
  }   }
  $full{$priv}=1;   $full{$priv}=1;
     }      }
   
     $r->print(<<ENDCCF);      $r->print(<<ENDCCF);
 <form method="post">  <form method="post">
 <input type="hidden" name="phase" value="set_custom_roles" />  <input type="hidden" name="phase" value="set_custom_roles" />
Line 932  sub set_custom_role { Line 1071  sub set_custom_role {
   
     my $rolename=$ENV{'form.rolename'};      my $rolename=$ENV{'form.rolename'};
   
     $rolename=~s/\W//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
   
     unless ($rolename) {      unless ($rolename) {
  &print_username_entry_form($r);   &print_username_entry_form($r);
Line 979  sub set_custom_role { Line 1118  sub set_custom_role {
     $sysrole.=':'.$_;      $sysrole.=':'.$_;
  }   }
     }      }
     $r->print('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'}) {
           my $url='/'.$ENV{'request.course.id'};
           $url=~s/\_/\//g;
    $r->print('<br />Assigning Role to Self: '.
         &Apache::lonnet::assigncustomrole($ENV{'user.domain'},
    $ENV{'user.name'},
    $url,
    $ENV{'user.domain'},
    $ENV{'user.name'},
    $rolename));
       }
     $r->print('</body></html>');      $r->print('</body></html>');
 }  }
   
Line 989  sub handler { Line 1139  sub handler {
     my $r = shift;      my $r = shift;
   
     if ($r->header_only) {      if ($r->header_only) {
        $r->content_type('text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
        return OK;         return OK;
     }      }
Line 1000  sub handler { Line 1150  sub handler {
         (&Apache::lonnet::allowed('cep',$ENV{'request.course.id'})) ||          (&Apache::lonnet::allowed('cep',$ENV{'request.course.id'})) ||
         (&Apache::lonnet::allowed('cca',$ENV{'request.role.domain'})) ||          (&Apache::lonnet::allowed('cca',$ENV{'request.role.domain'})) ||
         (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'}))) {          (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'}))) {
        $r->content_type('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);
Line 1026  sub handler { Line 1176  sub handler {
 sub course_level_table {  sub course_level_table {
     my %inccourses = @_;      my %inccourses = @_;
     my $table = '';      my $table = '';
   # Custom Roles?
   
       my %customroles=&my_custom_roles();
   
     foreach (sort( keys(%inccourses))) {      foreach (sort( keys(%inccourses))) {
  my $thiscourse=$_;   my $thiscourse=$_;
  my $protectedcourse=$_;   my $protectedcourse=$_;
  $thiscourse=~s:_:/:g;   $thiscourse=~s:_:/:g;
  my %coursedata=&Apache::lonnet::coursedescription($thiscourse);   my %coursedata=&Apache::lonnet::coursedescription($thiscourse);
  my $area=$coursedata{'description'};   my $area=$coursedata{'description'};
  if (!defined($area)) { $area='Unavailable course: '.$_; }   if (!defined($area)) { $area=&mt('Unavailable course').': '.$_; }
  my $bgcol=$thiscourse;   my $bgcol=$thiscourse;
  $bgcol=~s/[^8-9b-e]//g;   $bgcol=~s/[^7-9a-e]//g;
  $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',0,6);   $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);
  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 1065  ENDTIMEENTRY Line 1219  ENDTIMEENTRY
                 $table.= "</tr>\n";                  $table.= "</tr>\n";
             }              }
         }          }
           foreach (sort keys %customroles) {
       if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
    my $plrole=$_;
                   my $customrole=$protectedcourse.'_cr_cr_'.$ENV{'user.domain'}.
       '_'.$ENV{'user.name'}.'_'.$plrole;
    $table .= <<ENDENTRY;
   <tr bgcolor="#$bgcol">
   <td><input type="checkbox" name="act_$customrole"></td>
   <td>$plrole</td>
   <td>$area</td>
   <td><input type="text" size="5" name="sec_$customrole"></td>
   <td><input type=hidden name="start_$customrole" value=''>
   <a href=
   "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$customrole.value,'start_$customrole','cu.pres','dateset')">Set Start Date</a></td>
   <td><input type=hidden name="end_$customrole" value=''>
   <a href=
   "javascript:pjump('date_end','End Date $plrole',document.cu.end_$customrole.value,'end_$customrole','cu.pres','dateset')">Set End Date</a></td></tr>
   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

Removed from v.1.61  
changed lines
  Added in v.1.72


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