Diff for /loncom/auth/lonroles.pm between versions 1.195 and 1.211

version 1.195, 2008/06/04 19:14:20 version 1.211, 2008/12/04 08:53:04
Line 27 Line 27
 #  #
 ###  ###
   
   =pod
   
   =head1 NAME
   
   Apache::lonroles - User Roles Screen
   
   =head1 SYNOPSIS
   
   Invoked by /etc/httpd/conf/srm.conf:
   
    <Location /adm/roles>
    PerlAccessHandler       Apache::lonacc
    SetHandler perl-script
    PerlHandler Apache::lonroles
    ErrorDocument     403 /adm/login
    ErrorDocument  500 /adm/errorhandler
    </Location>
   
   =head1 OVERVIEW
   
   =head2 Choosing Roles
   
   C<lonroles> is a handler that allows a user to switch roles in
   mid-session. LON-CAPA attempts to work with "No Role Specified", the
   default role that a user has before selecting a role, as widely as
   possible, but certain handlers for example need specification which
   course they should act on, etc. Both in this scenario, and when the
   handler determines via C<lonnet>'s C<&allowed> function that a certain
   action is not allowed, C<lonroles> is used as error handler. This
   allows the user to select another role which may have permission to do
   what they were trying to do. C<lonroles> can also be accessed via the
   B<CRS> button in the Remote Control. 
   
   =begin latex
   
   \begin{figure}
   \begin{center}
   \includegraphics[width=0.45\paperwidth,keepaspectratio]{Sample_Roles_Screen}
     \caption{\label{Sample_Roles_Screen}Sample Roles Screen} 
   \end{center}
   \end{figure}
   
   =end latex
   
   =head2 Role Initialization
   
   The privileges for a user are established at login time and stored in the session environment. As a consequence, a new role does not become active till the next login. Handlers are able to query for privileges using C<lonnet>'s C<&allowed> function. When a user first logs in, their role is the "common" role, which means that they have the sum of all of their privileges. During a session it might become necessary to choose a particular role, which as a consequence also limits the user to only the privileges in that particular role.
   
   =head1 INTRODUCTION
   
   This module enables a user to select what role he wishes to
   operate under (instructor, student, teaching assistant, course
   coordinator, etc).  These roles are pre-established by the actions
   of upper-level users.
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   =head1 HANDLER SUBROUTINE
   
   This routine is called by Apache and mod_perl.
   
   =over 4
   
   =item *
   
   Roles Initialization (yes/no)
   
   =item *
   
   Get Error Message from Environment
   
   =item *
   
   Who is this?
   
   =item *
   
   Generate Page Output
   
   =item *
   
   Choice or no choice
   
   =item *
   
   Table
   
   =item *
   
   Privileges
   
   =back
   
   =cut
   
   
 package Apache::lonroles;  package Apache::lonroles;
   
 use strict;  use strict;
Line 43  use Apache::lonpageflip(); Line 140  use Apache::lonpageflip();
 use Apache::lonnavdisplay();  use Apache::lonnavdisplay();
 use GDBM_File;  use GDBM_File;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   use HTML::Entities;
     
   
 sub redirect_user {  sub redirect_user {
Line 145  sub handler { Line 243  sub handler {
 # Is this an ad-hoc CA-role?  # Is this an ad-hoc CA-role?
                 if (my ($domain,$user) =                  if (my ($domain,$user) =
     ($envkey =~ m-^form\.ca\./($match_domain)/($match_username)$-)) {      ($envkey =~ m-^form\.ca\./($match_domain)/($match_username)$-)) {
                    # Check if author blocked ca-access                      if (($domain eq $env{'user.domain'}) && ($user eq $env{'user.name'})) {
                           delete($env{$envkey});
                           $env{'form.au./'.$domain.'/'} = 1;
                           my ($server_status,$home) = &check_author_homeserver($user,$domain);
                           if ($server_status eq 'switchserver') {
                               my $trolecode = 'au./'.$domain.'/';
                               my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;
                               $r->internal_redirect($switchserver);
                           }
                           last;
                       }
                       if (my ($castart,$caend) = ($env{'user.role.ca./'.$domain.'/'.$user} =~ /^(\d*)\.(\d*)$/)) {
                           if (((($castart) && ($castart < $now)) || !$castart) && 
                               ((!$caend) || (($caend) && ($caend > $now)))) {
                               my ($server_status,$home) = &check_author_homeserver($user,$domain);
                               if ($server_status eq 'switchserver') {
                                   my $trolecode = 'ca./'.$domain.'/'.$user;
                                   my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;
                                   $r->internal_redirect($switchserver);
                               }
                               last;
                           }
                       }
                       # Check if author blocked ca-access
                     my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],$domain,$user);                      my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],$domain,$user);
                     if ($blocked{'domcoord.author'} eq 'blocked') {                      if ($blocked{'domcoord.author'} eq 'blocked') {
                        delete($env{$envkey});                          delete($env{$envkey});
                        $env{'user.error.msg'}=':::1:User '.$user.' in domain '.$domain.' blocked domain coordinator access';                          $env{'user.error.msg'}=':::1:User '.$user.' in domain '.$domain.' blocked domain coordinator access';
                        last;                          last;
                     }                      }
                     if ($dcroles{$domain}) {                      if ($dcroles{$domain}) {
                         my ($server_status,$home) = &check_author_homeserver($user,$domain);                          my ($server_status,$home) = &check_author_homeserver($user,$domain);
Line 228  sub handler { Line 349  sub handler {
      $cdom,$cnum,       $cdom,$cnum,
                                                      $env{'user.domain'},                                                       $env{'user.domain'},
      $env{'user.name'},       $env{'user.name'},
       'Assigned from '.$ENV{'REMOTE_ADDR'}.' at '.localtime().' for '.                                                       &mt('Assigned from [_1] at [_2] for [_3]'
                                                      $trolecode);                                                          ,$ENV{'REMOTE_ADDR'}
                                                           ,&Apache::lonlocal::locallocaltime()
                                                           ,$trolecode)
                                                        );
  unless ($assignresult eq 'ok') {   unless ($assignresult eq 'ok') {
      $assignresult=~s/^error\:\s*//;       $assignresult=~s/^error\:\s*//;
      $message=&mt($assignresult).       $message=&mt($assignresult).
Line 245  $swinfo Line 369  $swinfo
 <form method="post">  <form method="post">
 <input type="hidden" name="selectrole" value="1" />  <input type="hidden" name="selectrole" value="1" />
 <input type="hidden" name="$trolecode" value="1" />  <input type="hidden" name="$trolecode" value="1" />
 <font size="+2">$message</font><br />  <span class="LC_fontsize_large">$message</span><br />
 <input type="submit" value="$buttontext" />  <input type="submit" value="$buttontext" />
 </form>  </form>
 $end_page  $end_page
Line 335  ENDENTERKEY Line 459  ENDENTERKEY
  } elsif ($env{'request.course.id'}) {   } elsif ($env{'request.course.id'}) {
                                     if ($env{'form.destinationurl'}) {                                      if ($env{'form.destinationurl'}) {
                                         my $dest = $env{'form.destinationurl'};                                          my $dest = $env{'form.destinationurl'};
                                           if ($env{'form.destsymb'} ne '') {
                                               my $esc_symb = &HTML::Entities::encode($env{'form.destsymb'},'"<>&');
                                               $dest .= '?symb='.$esc_symb;
                                           }
                                         &redirect_user($r,&mt('Entering [_1]',                                          &redirect_user($r,&mt('Entering [_1]',
                                                       $env{'course.'.$courseid.'.description'}),                                                        $env{'course.'.$courseid.'.description'}),
                                                $dest,$msg,                                                 $dest,$msg,
Line 349  ENDENTERKEY Line 477  ENDENTERKEY
  ) {   ) {
  my $startpage = &courseloadpage($courseid);   my $startpage = &courseloadpage($courseid);
  unless ($startpage eq 'firstres') {            unless ($startpage eq 'firstres') {         
     $msg = &mt('Entering [_1] ....',      $msg = &mt('Entering [_1] ...',
        $env{'course.'.$courseid.'.description'});         $env{'course.'.$courseid.'.description'});
     &redirect_user($r,&mt('New in course'),      &redirect_user($r,&mt('New in course'),
    '/adm/whatsnew?refpage=start',$msg,     '/adm/whatsnew?refpage=start',$msg,
Line 452  ENDHEADER Line 580  ENDHEADER
     my $advanced=$env{'user.adv'};      my $advanced=$env{'user.adv'};
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['tryagain']);      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['tryagain']);
     my $tryagain=$env{'form.tryagain'};      my $tryagain=$env{'form.tryagain'};
       my $reinit=$env{'user.reinit'};
       delete $env{'user.reinit'};
   
 # -------------------------------------------------------- Generate Page Output  # -------------------------------------------------------- Generate Page Output
 # --------------------------------------------------------------- Error Header?  # --------------------------------------------------------------- Error Header?
Line 481  ENDHEADER Line 611  ENDHEADER
  &Apache::lonenc::check_encrypt($fn));   &Apache::lonenc::check_encrypt($fn));
     } else {      } else {
         if ($env{'user.error.msg'}) {          if ($env{'user.error.msg'}) {
     $r->print(              if ($reinit) {
                   $r->print(
    '<h3><span class="LC_error">'.
    &mt('As your session file for the course has expired, you will need to re-select the course.').'</span></h3>');
               } else {
           $r->print(
  '<h3><span class="LC_error">'.   '<h3><span class="LC_error">'.
  &mt('You need to choose another user role or enter a specific course for this function').'</span></h3>');   &mt('You need to choose another user role or enter a specific course for this function').'</span></h3>');
  }      }
           }
     }      }
 # -------------------------------------------------------- Choice or no choice?  # -------------------------------------------------------- Choice or no choice?
     if ($nochoose) {      if ($nochoose) {
Line 501  ENDHEADER Line 637  ENDHEADER
         $r->print('<input type="hidden" name="selectrole" value="1" />');          $r->print('<input type="hidden" name="selectrole" value="1" />');
         $r->print('<input type="hidden" name="newrole" value="" />');          $r->print('<input type="hidden" name="newrole" value="" />');
     }      }
     if ($env{'user.adv'}) {  
  $r->print(  
       '<br /><span class="LC_rolesinfo"><label>'.&mt('Show all roles').': <input type="checkbox" name="showall"');  
  if ($env{'form.showall'}) { $r->print(' checked="checked" '); }  
  $r->print(' /></label><input type="submit" value="'.&mt('Display').'" /></span>');  
     }  
   
     my (%roletext,%sortrole,%roleclass);      my (%roletext,%sortrole,%roleclass);
     my $countactive=0;      my $countactive=0;
     my $countfuture=0;      my $countfuture=0;
Line 556  ENDHEADER Line 685  ENDHEADER
                     $countfuture ++;                      $countfuture ++;
                 } elsif ($tstatus eq 'will') {                  } elsif ($tstatus eq 'will') {
                     $tbg='#FFAA77';                      $tbg='#FFAA77';
                     $tremark.=&mt('Active at next login. ');                      $tremark.=&mt('Active at next login.').' ';
                     $roles_nextlogin{$trolecode} = $tstart.':'.$tend;                      $roles_nextlogin{$trolecode} = $tstart.':'.$tend;
                     $countwill ++;                      $countwill ++;
                 } elsif ($tstatus eq 'expired') {                  } elsif ($tstatus eq 'expired') {
Line 565  ENDHEADER Line 694  ENDHEADER
                     $button=0;                      $button=0;
                 } elsif ($tstatus eq 'will_not') {                  } elsif ($tstatus eq 'will_not') {
                     $tbg='#AAFF77';                      $tbg='#AAFF77';
                     $tremark.=&mt('Expired after logout. ');                      $tremark.=&mt('Expired after logout.').' ';
                 } elsif ($tstatus eq 'selected') {                  } elsif ($tstatus eq 'selected') {
                     $tbg='#11CC55';                      $tbg='#11CC55';
                     $tfont='#002200';                      $tfont='#002200';
     $inrole=1;      $inrole=1;
     $countactive++;      $countactive++;
                     $tremark.=&mt('Currently selected. ');                      $tremark.=&mt('Currently selected.').' ';
                 }                  }
                 my $trole;                  my $trole;
                 if ($role =~ /^cr\//) {                  if ($role =~ /^cr\//) {
                     my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);                      my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);
     if ($tremark) { $tremark.='<br />'; }      if ($tremark) { $tremark.='<br />'; }
                     $tremark.=&mt('Defined by ').$rauthor.                      $tremark.=&mt('Defined by [_1] at [_2].',$rauthor,$rdomain);
  &mt(' at ').$rdomain.'.';  
  }   }
  $trole=Apache::lonnet::plaintext($role);   $trole=Apache::lonnet::plaintext($role);
                 my $ttype;                  my $ttype;
Line 631  ENDHEADER Line 759  ENDHEADER
                         $twhere=$env{'course.'.$tcourseid.'.description'};                          $twhere=$env{'course.'.$tcourseid.'.description'};
  $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;   $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;
                         unless ($twhere eq &mt('Currently not available')) {                          unless ($twhere eq &mt('Currently not available')) {
     $twhere.=' <font size="-2">'.      $twhere.=' <span class="LC_fontsize_small">'.
         &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom,$tfont).          &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom,$tfont).
                                     '</font>';                                      '</span>';
  }   }
                     } else {                      } else {
                         my %newhash=&Apache::lonnet::coursedescription($tcourseid);                          my %newhash=&Apache::lonnet::coursedescription($tcourseid);
Line 641  ENDHEADER Line 769  ENDHEADER
     $sortkey=$role."\0".$tdom."\0".$newhash{'description'}.      $sortkey=$role."\0".$tdom."\0".$newhash{'description'}.
  "\0".$envkey;   "\0".$envkey;
                             $twhere=$newhash{'description'}.                              $twhere=$newhash{'description'}.
                               ' <font size="-2">'.                                ' <span class="LC_fontsize_small">'.
         &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom,$tfont).          &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom,$tfont).
                               '</font>';                                '</span>';
                             $ttype = $newhash{'type'};                              $ttype = $newhash{'type'};
                             $trole = &Apache::lonnet::plaintext($role,$ttype);                              $trole = &Apache::lonnet::plaintext($role,$ttype);
                         } else {                          } else {
Line 666  ENDHEADER Line 794  ENDHEADER
                     $twhere=&mt('system wide');                      $twhere=&mt('system wide');
     $sortkey=$role.$twhere;      $sortkey=$role.$twhere;
                 }                  }
                 $roletext.=&build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver);                  $roletext.=&build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit);
  $roletext{$envkey}=$roletext;   $roletext{$envkey}=$roletext;
  if (!$sortkey) {$sortkey=$twhere."\0".$envkey;}   if (!$sortkey) {$sortkey=$twhere."\0".$envkey;}
  $sortrole{$sortkey}=$envkey;   $sortrole{$sortkey}=$envkey;
Line 674  ENDHEADER Line 802  ENDHEADER
     }      }
         }          }
     }      }
       if ($env{'user.adv'}) {
           $r->print(
                 '<br /><span class="LC_rolesinfo"><label>'.&mt('Show all roles').': <input type="checkbox" name="showall"');
           if ($env{'form.showall'}) { $r->print(' checked="checked" '); }
           $r->print(' /></label><input type="submit" value="'.&mt('Display').'" /></span>');
       } else {
           if ($countactive > 0) {
               my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
               my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); 
               $r->print('<p>'.&mt('[_1]Visit the [_2]Course Catalog[_3] to view all [_4] LON-CAPA courses.','<b>','<a href="/adm/coursecatalog?showdom='.$esc_dom.'">','</a></b>',$domdesc).'<br />'.&mt('If a course is [_1]not[_2] in your list of current courses below, you may be able to enroll if self-enrollment is permitted.','<b>','</b>').'</p>');
           }
       }
   
 # No active roles  # No active roles
     if ($countactive==0) {      if ($countactive==0) {
  if ($inrole) {   if ($inrole) {
Line 693  ENDHEADER Line 834  ENDHEADER
             my $tfont='#003300';              my $tfont='#003300';
             if ($env{'request.role'} eq 'cm') {              if ($env{'request.role'} eq 'cm') {
                 $r->print('<tr bgcolor="#11CC55">');                  $r->print('<tr bgcolor="#11CC55">');
                 $tremark=&mt('Currently selected. ');                  $tremark=&mt('Currently selected.').' ';
                 $tfont='#002200';                  $tfont='#002200';
             } else {              } else {
                 $r->print('<tr bgcolor="#77FF77">');                  $r->print('<tr bgcolor="#77FF77">');
             }              }
             $r->print('<td></td><td colspan="3"><font color="'.$tfont.'"><span class="LC_rolesinfo">'.&mt('No role specified').              $r->print('<td></td><td colspan="3"><span style="color:'.$tfont.';"><span class="LC_rolesinfo">'.&mt('No role specified').
                       '</span></font></td><td><font color="'.$tfont.'">'.$tremark.                        '</span></font></td><td><span style="color:'.$tfont.';">'.$tremark.
                       '&nbsp;</font></td></tr>'."\n");                        '&nbsp;</font></td></tr>'."\n");
   
             $r->print('</table>');              $r->print('</table>');
         }          }
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
  return OK;   return OK;
 # Is there only one choice?  
     } elsif (($countactive==1) && ($env{'request.role'} eq 'cm')) {  
  $r->print('<h3>'.&mt('Please stand by.').'</h3>'.  
     '<input type="hidden" name="'.$possiblerole.'" value="1" />'.  
             '<noscript><br /><input type="submit" name="submit" value="'.&mt('Continue').'" /></noscript>');  
  $r->print("</form>\n");  
  $r->rflush();  
  $r->print('<script type="text/javascript">document.forms.rolechoice.submit();</script>');  
  $r->print(&Apache::loncommon::end_page());  
  return OK;  
     }      }
 # More than one possible role  
 # ----------------------------------------------------------------------- Table  # ----------------------------------------------------------------------- Table
     unless ((!&Apache::lonmenu::show_course()) || ($nochoose)) {      unless ((!&Apache::lonmenu::show_course()) || ($nochoose) || ($countactive==1)) {
  $r->print("<h2>".&mt('Select a Course to Enter')."</h2>\n");   $r->print("<h2>".&mt('Select a Course to Enter')."</h2>\n");
     }      }
     my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole,$nochoose);      my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole,$nochoose);
Line 741  ENDHEADER Line 871  ENDHEADER
             }               } 
  }   }
  if ($output) {   if ($output) {
     $r->print("<tr><td align='center' colspan='5'><font face='arial'>".      $r->print("<tr><td align='center' colspan='5'>".
       &mt('Recent Roles')."</font></td></tr>");        &mt('Recent Roles')."</td></tr>");
     $r->print($output);      $r->print($output);
             $doheaders ++;              $doheaders ++;
  }   }
Line 754  ENDHEADER Line 884  ENDHEADER
                   &Apache::loncommon::authorbrowser_javascript());                    &Apache::loncommon::authorbrowser_javascript());
     }      }
     &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext);      &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext);
     my $tremark='';      if ($countactive > 1) {
     my $tfont='#003300';          my $tremark='';
     if ($env{'request.role'} eq 'cm') {          my $tfont='#003300';
  $r->print('<tr bgcolor="#11CC55">');          if ($env{'request.role'} eq 'cm') {
         $tremark=&mt('Currently selected. ');      $r->print('<tr bgcolor="#11CC55">');
         $tfont='#002200';              $tremark=&mt('Currently selected.').' ';
     } else {              $tfont='#002200';
         $r->print('<tr bgcolor="#77FF77">');          } else {
     }              $r->print('<tr bgcolor="#77FF77">');
     unless ($nochoose) {          }
  if ($env{'request.role'} ne 'cm') {          unless ($nochoose) {
     $r->print('<td><input type="submit" value="'.      if ($env{'request.role'} ne 'cm') {
       &mt('Select').'" name="cm" /></td>');          $r->print('<td><input type="submit" value="'.
  } else {            &mt('Select').'" name="cm" /></td>');
     $r->print('<td>&nbsp;</td>');      } else {
  }          $r->print('<td>&nbsp;</td>');
     }      }
     $r->print('<td colspan="3"><font color="'.$tfont.'"><span class="LC_rolesinfo">'.&mt('No role specified').          }
       '</span></font></td><td><font color="'.$tfont.'">'.$tremark.          $r->print('<td colspan="3"><span style="color:'.$tfont.';"><span class="LC_rolesinfo">'.&mt('No role specified').
       '&nbsp;</font></td></tr>'."\n");                    '</span></span></td><td><span style="color:'.$tfont.';">'.$tremark.
                     '&nbsp;</span></td></tr>'."\n");
       } 
     $r->print('</table>');      $r->print('</table>');
     unless ($nochoose) {      unless ($nochoose) {
  $r->print("</form>\n");   $r->print("</form>\n");
Line 786  ENDHEADER Line 917  ENDHEADER
     }      }
     $r->print(&Apache::lonnet::getannounce());      $r->print(&Apache::lonnet::getannounce());
     if ($advanced) {      if ($advanced) {
           my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');
  $r->print('<p><small><i>'   $r->print('<p><small><i>'
                  .&mt('This is LON-CAPA [_1]',$r->dir_config('lonVersion'))                   .&mt('This is LON-CAPA [_1]',$r->dir_config('lonVersion'))
  .'</i><br />'   .'</i><br />'
  .'<a href="/adm/logout">'.&mt('Logout').'</a></small></p>');   .'<a href="/adm/logout">'.&mt('Logout').'</a>&nbsp;&nbsp;'
                    .'<a href="/adm/coursecatalog?showdom='.$esc_dom.'">'
                    .&mt('Course Catalog')
                    .'</small></p>');
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return OK;      return OK;
Line 847  sub print_rolerows { Line 982  sub print_rolerows {
             if ($output) {              if ($output) {
                 if ($doheaders > 0) {                  if ($doheaders > 0) {
                     $r->print("<tr>".                      $r->print("<tr>".
                               "<td align='center' colspan='5'><font face='arial'>".                                "<td align='center' colspan='5'>".
                               &mt($type)."</font></td></tr>");                                &mt($type)."</td></tr>");
                 }                  }
                 $r->print($output);                  $r->print($output);
             }              }
Line 859  sub print_rolerows { Line 994  sub print_rolerows {
 sub findcourse_advice {  sub findcourse_advice {
     my ($r) = @_;      my ($r) = @_;
     my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');      my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
     if (&check_autoenroll($env{'user.domain'})) {      my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');
       if (&Apache::lonnet::auto_run(undef,$env{'user.domain'})) {
         $r->print(&mt('If you were expecting to see an active role listed for a particular course in the [_1] domain, it may be missing for one of the following reasons:',$domdesc).'          $r->print(&mt('If you were expecting to see an active role listed for a particular course in the [_1] domain, it may be missing for one of the following reasons:',$domdesc).'
 <ul>  <ul>
  <li>'.&mt('The course has yet to be created.').'</li>   <li>'.&mt('The course has yet to be created.').'</li>
Line 871  sub findcourse_advice { Line 1007  sub findcourse_advice {
     } else {      } else {
         $r->print(&mt('If you were expecting to see an active role listed for a particular course, that course may not have been created yet.').'<br />');          $r->print(&mt('If you were expecting to see an active role listed for a particular course, that course may not have been created yet.').'<br />');
     }      }
     $r->print('<p>'.&mt('The [_1]Course Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created.','<a href="/adm/coursecatalog">','</a>',$domdesc).'<br />');      $r->print('<p>'.&mt('The [_1]Course Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created.','<a href="/adm/coursecatalog?showdom='.$esc_dom.'">','</a>',$domdesc).'<br />');
     $r->print(&mt('You can search the course catalog for courses which permit self-enrollment, if you would like to enroll in a course.').'</p>');      $r->print(&mt('You can search the course catalog for courses which permit self-enrollment, if you would like to enroll in a course.').'</p>');
     return;      return;
 }  }
Line 911  sub privileges_info { Line 1047  sub privileges_info {
     $ttype='System';      $ttype='System';
     $twhere='/';      $twhere='/';
  }   }
  $output .= "\n<h3>".$ttype.': '.$twhere.'</h3>'."\n<ul>";   $output .= "\n<h3>".&mt($ttype).': '.$twhere.'</h3>'."\n<ul>";
  foreach my $priv (sort(split(/:/,$env{$envkey}))) {   foreach my $priv (sort(split(/:/,$env{$envkey}))) {
     next if (!$priv);      next if (!$priv);
   
Line 957  sub role_status { Line 1093  sub role_status {
 }  }
   
 sub build_roletext {  sub build_roletext {
     my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver) = @_;      my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit) = @_;
     my $roletext='<tr bgcolor="'.$tbg.'" class="LC_rolesmenu_'.$tstatus.'">';      my $roletext='<tr bgcolor="'.$tbg.'" class="LC_rolesmenu_'.$tstatus.'">';
     my $is_dc=($trolecode =~ m/^dc\./);      my $is_dc=($trolecode =~ m/^dc\./);
     my $rowspan=($is_dc) ? ''      my $rowspan=($is_dc) ? ''
Line 987  sub build_roletext { Line 1123  sub build_roletext {
                 '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.                  '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                 &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.                  &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.
                         $trolecode."','".$buttonname.'\');" /></td>';                          $trolecode."','".$buttonname.'\');" /></td>';
           } elsif ($reinit) {
               $roletext.= 
                   '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                   &mt('Re-Select').'" onClick="javascript:enterrole(this.form,\''.
                           $trolecode."','".$buttonname.'\');" /></td>';
         } else {          } else {
             $roletext.='<td'.$rowspan.'>&nbsp;</td>';              $roletext.=
                   '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                   &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.
                           $trolecode."','".$buttonname.'\');" /></td>';
         }          }
     }      }
     if ($trolecode !~ m/^(dc|ca|au|aa)\./) {      if ($trolecode !~ m/^(dc|ca|au|aa)\./) {
  $tremark.=&Apache::lonannounce::showday(time,1,   $tremark.=&Apache::lonannounce::showday(time,1,
  &Apache::lonannounce::readcalendar($tdom.'_'.$trest));   &Apache::lonannounce::readcalendar($tdom.'_'.$trest));
     }      }
     $roletext.='<td><font color="'.$tfont.'">'.$trole.      $roletext.='<td><span style="color:'.$tfont.';">'.$trole.
        '</font></td><td><font color="'.$tfont.'">'.$twhere.         '</span></td><td><span style="color:'.$tfont.';">'.$twhere.
                '</font></td><td><font color="'.$tfont.'">'.$tpstart.                 '</span></td><td><span style="color:'.$tfont.';">'.$tpstart.
                '</font></td><td><font color="'.$tfont.'">'.$tpend.                 '</span></td><td><span style="color:'.$tfont.';">'.$tpend.
                '</font></td></tr>';                 '</span></td></tr>';
     if (!$is_dc) {      if (!$is_dc) {
  $roletext.='<tr bgcolor="'.$tbg.'"><td colspan="4"><font color="'.$tfont.'"><span class="LC_rolesinfo">'.$tremark.   $roletext.='<tr bgcolor="'.$tbg.'"><td colspan="4"><span style="color:'.$tfont.';"><span class="LC_rolesinfo">'.$tremark.
     '</span>&nbsp;</font></td></tr><tr><td colspan="5" height="3"></td></tr>'."\n";      '</span>&nbsp;</span></td></tr><tr><td colspan="5" height="3"></td></tr>'."\n";
     }      }
     return $roletext;      return $roletext;
 }  }
   
   sub check_needs_switchserver {
       my ($possiblerole) = @_;
       my $needs_switchserver;
       my ($role,$where) = split(/\./,$possiblerole,2);
       my (undef,$tdom,$twho) = split(/\//,$where);
       my ($server_status,$home);
       if (($role eq 'ca') || ($role eq 'aa')) {
           ($server_status,$home) = &check_author_homeserver($twho,$tdom);
       } else {
           ($server_status,$home) = &check_author_homeserver($env{'user.name'},
                                                             $env{'user.domain'});
       }
       if ($server_status eq 'switchserver') {
           $needs_switchserver = 1;
       }
       return $needs_switchserver;
   }
   
 sub check_author_homeserver {  sub check_author_homeserver {
     my ($uname,$udom)=@_;      my ($uname,$udom)=@_;
     if (($uname eq '') || ($udom eq '')) {      if (($uname eq '') || ($udom eq '')) {
Line 1062  sub check_fordc { Line 1224  sub check_fordc {
 sub adhoc_course_role {  sub adhoc_course_role {
     my ($then) = @_;       my ($then) = @_; 
     my ($cdom,$cnum);      my ($cdom,$cnum);
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     if (&check_forcc($cdom,$cnum,$then)) {      if (&check_forcc($cdom,$cnum,$then)) {
         my $setprivs;          my $setprivs;
         if (!defined($env{'user.role.'.$env{'form.selectrole'}})) {          if (!defined($env{'user.role.'.$env{'form.switchrole'}})) {
             $setprivs = 1;              $setprivs = 1;
         } else {          } else {
             my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.selectrole'}});              my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.switchrole'}});
             if (($start && ($start>$then || $start == -1)) ||              if (($start && ($start>$then || $start == -1)) ||
                 ($end && $end<$then)) {                  ($end && $end<$then)) {
                 $setprivs = 1;                  $setprivs = 1;
             }              }
         }           } 
         if ($setprivs) {          if ($setprivs) {
             if ($env{'form.switchrole'} =~ m-^(in|ta|ep|ad|st|cr)([\w/]*)\./\Q$cdom\E/\Q$cnum\E(/?\w*)$-) {              if ($env{'form.switchrole'} =~ m-^(in|ta|ep|ad|st|cr)([\w/]*)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) {
                 my $role = $1;                  my $role = $1;
                 my $custom_role = $2;                  my $custom_role = $2;
                 my $usec = $3;                  my $usec = $3;
                 if ($role eq 'cr') {                  if ($role eq 'cr') {
                     if ($custom_role =~ m-^$match_domain/$match_courseid/\w+$-) {                      if ($custom_role =~ m-^/$match_domain/$match_username/\w+$-) {
                         $role .= $custom_role;                          $role .= $custom_role;
                     } else {                      } else {
                         return;                          return;
                     }                      }
                 }                  }
                 my (%userroles,%newrole,%newgroups);                  my (%userroles,%newrole,%newgroups,%group_privs);
                   my %cgroups =
                       &Apache::lonnet::get_active_groups($env{'user.domain'},
                                               $env{'user.name'},$cdom,$cnum);
                   foreach my $group (keys(%cgroups)) {
                       $group_privs{$group} =
                           $env{'user.priv.cc./'.$cdom.'/'.$cnum.'./'.$cdom.'/'.$cnum.'/'.$group};
                   }
                   $newgroups{'/'.$cdom.'/'.$cnum} = \%group_privs;
                 my $area = '/'.$cdom.'/'.$cnum;                  my $area = '/'.$cdom.'/'.$cnum;
                 my $spec = $role.'.'.$area;                  my $spec = $role.'.'.$area;
                 if ($usec ne '') {                  if ($usec ne '') {
Line 1095  sub adhoc_course_role { Line 1265  sub adhoc_course_role {
                     $area .= '/'.$usec;                      $area .= '/'.$usec;
                 }                  }
                 &Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,$area);                  &Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,$area);
                 &Apache::lonnet::set_userprivs(\%userroles,\%newrole,%newgroups);                  &Apache::lonnet::set_userprivs(\%userroles,\%newrole,\%newgroups);
                 my $adhocstart = $then-1;                  my $adhocstart = $then-1;
                 $userroles{'user.role.'.$spec} = $adhocstart.'.';                  $userroles{'user.role.'.$spec} = $adhocstart.'.';
                 &Apache::lonnet::appenv(\%userroles,[$role,'cm']);                  &Apache::lonnet::appenv(\%userroles,[$role,'cm']);
Line 1198  sub display_cc_role { Line 1368  sub display_cc_role {
             my %newhash=&Apache::lonnet::coursedescription($tcourseid);              my %newhash=&Apache::lonnet::coursedescription($tcourseid);
             if (%newhash) {              if (%newhash) {
                 $twhere=$newhash{'description'}.                  $twhere=$newhash{'description'}.
                         ' <font size="-2">'.                          ' <span style="LC_fontsize_small">'.
                         &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$2,$1,$tfont).                          &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$2,$1,$tfont).
                         '</font>';                          '</span>';
                 $ttype = $newhash{'type'};                  $ttype = $newhash{'type'};
             } else {              } else {
                 $twhere=&mt('Currently not available');                  $twhere=&mt('Currently not available');
Line 1281  sub courseloadpage { Line 1451  sub courseloadpage {
     return $startpage;      return $startpage;
 }  }
   
 sub check_autoenroll {  
     my ($dom) = @_;  
     my $run_enroll = 0;  
     my $settings;  
     my %domconfig =  
         &Apache::lonnet::get_dom('configuration',['autoenroll'],$dom);  
     if (ref($domconfig{'autoenroll'}) eq 'HASH') {  
         $settings = $domconfig{'autoenroll'};  
         if ($settings->{'run'} eq '1') {  
             $run_enroll = 1;  
         }  
     } else {  
         $run_enroll = &localenroll::run($dom);  
     }  
     return $run_enroll;  
 }  
   
   
 1;  1;
 __END__  __END__
   

Removed from v.1.195  
changed lines
  Added in v.1.211


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