Diff for /loncom/auth/lonroles.pm between versions 1.215 and 1.248

version 1.215, 2009/01/03 00:16:10 version 1.248, 2010/06/02 14:55:37
Line 57  course they should act on, etc. Both in Line 57  course they should act on, etc. Both in
 handler determines via C<lonnet>'s C<&allowed> function that a certain  handler determines via C<lonnet>'s C<&allowed> function that a certain
 action is not allowed, C<lonroles> is used as error handler. This  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  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  what they were trying to do.
 B<CRS> button in the Remote Control.   
   
 =begin latex  =begin latex
   
Line 138  use Apache::lonannounce; Line 137  use Apache::lonannounce;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonpageflip();  use Apache::lonpageflip();
 use Apache::lonnavdisplay();  use Apache::lonnavdisplay();
   use Apache::loncoursequeueadmin;
 use GDBM_File;  use GDBM_File;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
 use HTML::Entities;  use HTML::Entities;
     
   
 sub redirect_user {  sub redirect_user {
     my ($r,$title,$url,$msg,$launch_nav) = @_;      my ($r,$title,$url,$msg) = @_;
     $msg = $title if (! defined($msg));      $msg = $title if (! defined($msg));
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     &Apache::loncommon::no_cache($r);      &Apache::loncommon::no_cache($r);
     $r->send_http_header;      $r->send_http_header;
     my $swinfo=&Apache::lonmenu::rawconfig();  
     my $navwindow;      # Breadcrumbs
     if ($launch_nav eq 'on') {      my $brcrum = [{'href' => $url,
  $navwindow.=&Apache::lonnavdisplay::launch_win('now',undef,undef,                     'text' => 'Switching Role'},];
        ($url =~ m-^/adm/whatsnew-));  
     } else {  
  $navwindow.=&Apache::lonnavmaps::close();  
     }  
     my $start_page = &Apache::loncommon::start_page('Switching Role',undef,      my $start_page = &Apache::loncommon::start_page('Switching Role',undef,
     {'redirect' => [1,$url],});                                                      {'redirect' => [1,$url],
                                                        'bread_crumbs' => $brcrum,});
     my $end_page   = &Apache::loncommon::end_page();      my $end_page   = &Apache::loncommon::end_page();
   
 # Note to style police:   # Note to style police: 
Line 166  sub redirect_user { Line 163  sub redirect_user {
     $url=~s/ /\%20/g;      $url=~s/ /\%20/g;
     $r->print(<<ENDREDIR);      $r->print(<<ENDREDIR);
 $start_page  $start_page
 <script type="text/javascript">  <p>$msg</p>
 $swinfo  
 </script>  
 $navwindow  
 <h1>$msg</h1>  
 $end_page  $end_page
 ENDREDIR  ENDREDIR
     return;      return;
Line 182  sub error_page { Line 175  sub error_page {
     &Apache::loncommon::no_cache($r);      &Apache::loncommon::no_cache($r);
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
     $r->print(&Apache::loncommon::start_page('Problems during Course Initialization').      # Breadcrumbs
       '<script type="text/javascript">'.      my $brcrum = [{'href' => $dest,
       &Apache::lonmenu::rawconfig().'</script>'.                     'text' => 'Problems during Course Initialization'},];
       '<p>'.&mt('The following problems occurred:').      $r->print(&Apache::loncommon::start_page('Problems during Course Initialization',
                                                undef,
                                                {'bread_crumbs' => $brcrum,})
       );
       $r->print(
           '<script type="text/javascript">'.
           '// <![CDATA['.
           &Apache::lonmenu::rawconfig().
           '// ]]>'.
           '</script>'.
         '<p class="LC_error">'.&mt('The following problems occurred:').
             '<br />'.
       $error.        $error.
       '</p><br /><a href="'.$dest.'">'.&mt('Continue').'</a>'.        '</p><br /><a href="'.$dest.'">'.&mt('Continue').'</a>'
       &Apache::loncommon::end_page());      );
       $r->print(&Apache::loncommon::end_page());
 }  }
   
 sub handler {  sub handler {
Line 197  sub handler { Line 202  sub handler {
   
     my $now=time;      my $now=time;
     my $then=$env{'user.login.time'};      my $then=$env{'user.login.time'};
       my $refresh=$env{'user.refresh.time'};
       if (!$refresh) {
           $refresh = $then;
       }
     my $envkey;      my $envkey;
     my %dcroles = ();      my %dcroles = ();
     my $numdc = &check_fordc(\%dcroles,$then);      my $numdc = &check_fordc(\%dcroles,$then);
Line 215  sub handler { Line 224  sub handler {
             # Check if user is CC trying to select a course role              # Check if user is CC trying to select a course role
             if ($env{'form.switchrole'}) {              if ($env{'form.switchrole'}) {
                 if (!defined($env{'user.role.'.$env{'form.switchrole'}})) {                  if (!defined($env{'user.role.'.$env{'form.switchrole'}})) {
                     &adhoc_course_role($then);                      &adhoc_course_role($refresh,$then);
                 }                  }
             }              }
     my %temp=('logout_'.$env{'request.course.id'} => time);      my %temp=('logout_'.$env{'request.course.id'} => time);
Line 232  sub handler { Line 241  sub handler {
 # Check if user is a DC trying to enter a course or author space and needs privs to be created  # Check if user is a DC trying to enter a course or author space and needs privs to be created
         if ($numdc > 0) {          if ($numdc > 0) {
             foreach my $envkey (keys %env) {              foreach my $envkey (keys %env) {
 # Is this an ad-hoc CC-role?  # Is this an ad-hoc Coordinator role?
                 if (my ($domain,$coursenum) =                  if (my ($ccrole,$domain,$coursenum) =
     ($envkey =~ m-^form\.cc\./($match_domain)/($match_courseid)$-)) {      ($envkey =~ m-^form\.(cc|co)\./($match_domain)/($match_courseid)$-)) {
                     if ($dcroles{$domain}) {                      if ($dcroles{$domain}) {
                         &check_privs($domain,$coursenum,$then,$now,'cc');                          &Apache::lonnet::check_adhoc_privs($domain,$coursenum,
                                                              $then,$refresh,$now,$ccrole);
                     }                      }
                     last;                      last;
                 }                  }
Line 249  sub handler { Line 259  sub handler {
                         my ($server_status,$home) = &check_author_homeserver($user,$domain);                          my ($server_status,$home) = &check_author_homeserver($user,$domain);
                         if ($server_status eq 'switchserver') {                          if ($server_status eq 'switchserver') {
                             my $trolecode = 'au./'.$domain.'/';                              my $trolecode = 'au./'.$domain.'/';
                             my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;                              my $switchserver = '/adm/switchserver?otherserver='.$home.'&amp;role='.$trolecode;
                             $r->internal_redirect($switchserver);                              $r->internal_redirect($switchserver);
                         }                          }
                         last;                          last;
Line 260  sub handler { Line 270  sub handler {
                             my ($server_status,$home) = &check_author_homeserver($user,$domain);                              my ($server_status,$home) = &check_author_homeserver($user,$domain);
                             if ($server_status eq 'switchserver') {                              if ($server_status eq 'switchserver') {
                                 my $trolecode = 'ca./'.$domain.'/'.$user;                                  my $trolecode = 'ca./'.$domain.'/'.$user;
                                 my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;                                  my $switchserver = '/adm/switchserver?otherserver='.$home.'&amp;role='.$trolecode;
                                 $r->internal_redirect($switchserver);                                  $r->internal_redirect($switchserver);
                             }                              }
                             last;                              last;
Line 276  sub handler { Line 286  sub handler {
                     if ($dcroles{$domain}) {                      if ($dcroles{$domain}) {
                         my ($server_status,$home) = &check_author_homeserver($user,$domain);                          my ($server_status,$home) = &check_author_homeserver($user,$domain);
                         if (($server_status eq 'ok') || ($server_status eq 'switchserver')) {                          if (($server_status eq 'ok') || ($server_status eq 'switchserver')) {
                             &check_privs($domain,$user,$then,$now,'ca');                              &Apache::lonnet::check_adhoc_privs($domain,$user,$then,
                                                                  $refresh,$now,'ca');
                             if ($server_status eq 'switchserver') {                              if ($server_status eq 'switchserver') {
                                 my $trolecode = 'ca./'.$domain.'/'.$user;                                   my $trolecode = 'ca./'.$domain.'/'.$user; 
                                 my $switchserver = '/adm/switchserver?'                                  my $switchserver = '/adm/switchserver?'
                                                   .'otherserver='.$home.'&role='.$trolecode;                                                    .'otherserver='.$home.'&amp;role='.$trolecode;
                                 $r->internal_redirect($switchserver);                                  $r->internal_redirect($switchserver);
                             }                              }
                         } else {                          } else {
Line 297  sub handler { Line 308  sub handler {
         foreach $envkey (keys %env) {          foreach $envkey (keys %env) {
             next if ($envkey!~/^user\.role\./);              next if ($envkey!~/^user\.role\./);
             my ($where,$trolecode,$role,$tstatus,$tend,$tstart);              my ($where,$trolecode,$role,$tstatus,$tend,$tstart);
             &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);              &Apache::lonnet::role_status($envkey,$then,$refresh,$now,\$role,\$where,
                                            \$trolecode,\$tstatus,\$tstart,\$tend);
             if ($env{'form.'.$trolecode}) {              if ($env{'form.'.$trolecode}) {
  if ($tstatus eq 'is') {   if ($tstatus eq 'is') {
     $where=~s/^\///;      $where=~s/^\///;
Line 364  sub handler { Line 376  sub handler {
  $r->print(<<ENDENTEREDKEY);   $r->print(<<ENDENTEREDKEY);
 $start_page  $start_page
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 $swinfo  $swinfo
   // ]]>
 </script>  </script>
 <form method="post">  <form action="" 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" />
 <span class="LC_fontsize_large">$message</span><br />  <span class="LC_fontsize_large">$message</span><br />
Line 387  ENDENTEREDKEY Line 401  ENDENTEREDKEY
  $r->print(<<ENDENTERKEY);   $r->print(<<ENDENTERKEY);
 $start_page  $start_page
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 $swinfo  $swinfo
   // ]]>
 </script>  </script>
 <form method="post">  <form action="" 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" />
 <input type="text" size="20" name="newkey" value="$env{'form.newkey'}" />  <input type="text" size="20" name="newkey" value="$env{'form.newkey'}" />
Line 420  ENDENTERKEY Line 436  ENDENTERKEY
  if (($env{'form.orgurl'}) &&    if (($env{'form.orgurl'}) && 
     ($env{'form.orgurl'}!~/^\/adm\/flip/)) {      ($env{'form.orgurl'}!~/^\/adm\/flip/)) {
     my $dest=$env{'form.orgurl'};      my $dest=$env{'form.orgurl'};
                               if ($env{'form.symb'}) {
                                   if ($dest =~ /\?/) {
                                       $dest .= '&';
                                   } else {
                                       $dest .= '?'
                                   }
                                   $dest .= 'symb='.$env{'form.symb'};
                               }
     if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }      if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
     &Apache::lonnet::appenv({'request.role.adv'=>$tadv});      &Apache::lonnet::appenv({'request.role.adv'=>$tadv});
                             if (($ferr) && ($tadv)) {                              if (($ferr) && ($tadv)) {
Line 433  ENDENTERKEY Line 457  ENDENTERKEY
  &Apache::lonnet::appenv(   &Apache::lonnet::appenv(
       {"request.course.id"  => $cdom.'_'.$cnum});        {"request.course.id"  => $cdom.'_'.$cnum});
  $furl='/adm/roles?tryagain=1';   $furl='/adm/roles?tryagain=1';
  $msg=                  $msg='<p><span class="LC_error">'
     '<h1><span class="LC_error">'.                      .&mt('Could not initialize [_1] at this time.',
     &mt('Could not initialize [_1] at this time.',                           $env{'course.'.$cdom.'_'.$cnum.'.description'})
  $env{'course.'.$cdom.'_'.$cnum.'.description'}).                      .'</span></p>'
     '</span></h1><h3>'.&mt('Please try again.').'</h3>'.$ferr;                      .'<p>'.&mt('Please try again.').'</p>'
                       .'<p>'.$ferr.'</p>';
     }      }
     if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }      if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
     &Apache::lonnet::appenv({'request.role.adv'=>$tadv});      &Apache::lonnet::appenv({'request.role.adv'=>$tadv});
Line 452  ENDENTERKEY Line 477  ENDENTERKEY
     $courseid = substr($courseid, 1);      $courseid = substr($courseid, 1);
  }   }
  $courseid =~ s/\//_/;   $courseid =~ s/\//_/;
  if ($role eq 'cc' && $env{'course.' . $courseid .    if ((($role eq 'cc') || ($role eq 'co')) 
       '.course.helper.not.run'}) {                                      && ($env{'course.' . $courseid .'.course.helper.not.run'})) { 
     $furl = "/adm/helper/course.initialization.helper";      $furl = "/adm/helper/course.initialization.helper";
     # Send the user to the course they selected      # Send the user to the course they selected
  } elsif ($env{'request.course.id'}) {   } elsif ($env{'request.course.id'}) {
Line 463  ENDENTERKEY Line 488  ENDENTERKEY
                                             my $esc_symb = &HTML::Entities::encode($env{'form.destsymb'},'"<>&');                                              my $esc_symb = &HTML::Entities::encode($env{'form.destsymb'},'"<>&');
                                             $dest .= '?symb='.$esc_symb;                                              $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);
                                                $env{'environment.remotenavmap'});  
                                         return OK;                                          return OK;
                                     }                                      }
     if (&Apache::lonnet::allowed('whn',      if (&Apache::lonnet::allowed('whn',
Line 479  ENDENTERKEY Line 503  ENDENTERKEY
  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);
    $env{'environment.remotenavmap'});  
     return OK;      return OK;
  }   }
     }      }
Line 493  ENDENTERKEY Line 516  ENDENTERKEY
  }   }
                                 $msg = &mt('Entering [_1] ...',                                  $msg = &mt('Entering [_1] ...',
    $env{'course.'.$courseid.'.description'});     $env{'course.'.$courseid.'.description'});
  &redirect_user($r,&mt('Entering [_1]',   &redirect_user($r, &mt('Entering [_1]',
       $env{'course.'.$courseid.'.description'}),                                 $env{'course.'.$courseid.'.description'}),
        $furl,$msg,                                 $furl, $msg);
        $env{'environment.remotenavmap'});  
     }      }
     return OK;      return OK;
  }   }
Line 522  ENDENTERKEY Line 544  ENDENTERKEY
                                        $redirect_url);                                         $redirect_url);
                         return OK;                          return OK;
                     }                      }
                       if ($role eq 'sc') {
                           my $redirect_url = '/adm/grades?command=scantronupload';
                           &redirect_user($r,&mt('Loading Data Upload Page'),
                                          $redirect_url);
                           return OK;
                       }
  }   }
             }              }
         }          }
Line 535  ENDENTERKEY Line 563  ENDENTERKEY
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
   
     my $brcrum =[{href=>"/admm/roles",text=>"User Roles"}];      my $crumbtext = 'User Roles';
       my $pagetitle = 'My Roles';
       my $recent = &mt('Recent Roles');
       my $show_course=&Apache::loncommon::show_course();
       if ($show_course) {
           $crumbtext = 'Courses';
           $pagetitle = 'My Courses';
           $recent = &mt('Recent Courses');
       }
       my $brcrum =[{href=>"/adm/roles",text=>$crumbtext}];
     my $swinfo=&Apache::lonmenu::rawconfig();      my $swinfo=&Apache::lonmenu::rawconfig();
     my $start_page=&Apache::loncommon::start_page('User Roles',undef,{bread_crumbs=>$brcrum});      my $start_page=&Apache::loncommon::start_page($pagetitle,undef,{bread_crumbs=>$brcrum});
     my $standby=&mt('Role selected. Please stand by.');      my $standby=&mt('Role selected. Please stand by.');
     $standby=~s/\n/\\n/g;      $standby=~s/\n/\\n/g;
     my $noscript='<span class="LC_error">'.&mt('Use of LON-CAPA requires Javascript to be enabled in your web browser.').'<br />'.&mt('As this is not the case, most functionality in the system will be unavailable.').'</span><br />';      my $noscript='<span class="LC_error">'.&mt('Use of LON-CAPA requires Javascript to be enabled in your web browser.').'<br />'.&mt('As this is not the case, most functionality in the system will be unavailable.').'</span><br />';
Line 549  $start_page Line 586  $start_page
 $noscript  $noscript
 </noscript>  </noscript>
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 $swinfo  $swinfo
 window.focus();  window.focus();
   
Line 565  function enterrole (thisform,rolecode,bu Line 603  function enterrole (thisform,rolecode,bu
        alert('$standby');         alert('$standby');
     }         }   
 }  }
   // ]]>
 </script>  </script>
 ENDHEADER  ENDHEADER
   
Line 615  ENDHEADER Line 654  ENDHEADER
             if ($reinit) {              if ($reinit) {
                 $r->print(                  $r->print(
  '<h3><span class="LC_error">'.   '<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>');   &mt('As your session file for the course or community has expired, you will need to re-select it.').'</span></h3>');
             } else {              } else {
         $r->print(          $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 or community for this function.').
    '</span></h3>');
     }      }
         }          }
     }      }
Line 638  ENDHEADER Line 678  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="" />');
     }      }
     my (%roletext,%sortrole,%roleclass);  
     my $countactive=0;      my (%roletext,%sortrole,%roleclass,%futureroles,%timezones);
     my $countfuture=0;      my ($countactive,$countfuture,$inrole,$possiblerole) = 
     my $countwill=0;          &gather_roles($then,$refresh,$now,$reinit,$nochoose,\%roletext,\%sortrole,\%roleclass,
     my $inrole=0;                        \%futureroles,\%timezones);
     my $possiblerole='';  
     my %futureroles;      $refresh = $now;
     my %roles_nextlogin;      &Apache::lonnet::appenv({'user.refresh.time'  => $refresh});
     my %timezones;  
     foreach $envkey (sort keys %env) {  
         my $button = 1;  
         my $switchserver='';  
  my $roletext;  
  my $sortkey;  
         if ($envkey=~/^user\.role\./) {  
             my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend);  
             &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);  
             next if (!defined($role) || $role eq '' || $role =~ /^gr/);  
             my $timezone = &role_timezone($where,\%timezones);  
             $tremark='';  
             $tpstart='&nbsp;';  
             $tpend='&nbsp;';  
             if ($tstart) {  
                 $tpstart=&Apache::lonlocal::locallocaltime($tstart,$timezone);  
             }  
             if ($tend) {  
                 $tpend=&Apache::lonlocal::locallocaltime($tend,$timezone);  
             }  
             if ($env{'request.role'} eq $trolecode) {  
  $tstatus='selected';  
             }  
             my $tbg;  
             if (($tstatus eq 'is')   
  || ($tstatus eq 'selected')   
  || ($tstatus eq 'will')   
  || ($tstatus eq 'future')   
                 || ($env{'form.showall'})) {  
                 if ($tstatus eq 'is') {  
                     $tbg='LC_roles_is';  
     $possiblerole=$trolecode;  
     $countactive++;  
                 } elsif ($tstatus eq 'future') {  
                     $tbg='LC_roles_future';  
                     $button=0;  
                     $futureroles{$trolecode} = $tstart.':'.$tend;  
                     $countfuture ++;  
                 } elsif ($tstatus eq 'will') {  
                     $tbg='LC_roles_will';  
                     $tremark.=&mt('Active at next login.').' ';  
                     $roles_nextlogin{$trolecode} = $tstart.':'.$tend;  
                     $countwill ++;  
                 } elsif ($tstatus eq 'expired') {  
                     $tbg='LC_roles_expired';  
                     $button=0;  
                 } elsif ($tstatus eq 'will_not') {  
                     $tbg='LC_roles_will_not';  
                     $tremark.=&mt('Expired after logout.').' ';  
                 } elsif ($tstatus eq 'selected') {  
                     $tbg='LC_roles_selected';  
     $inrole=1;  
     $countactive++;  
                     $tremark.=&mt('Currently selected.').' ';  
                 }  
                 my $trole;  
                 if ($role =~ /^cr\//) {  
                     my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);  
     if ($tremark) { $tremark.='<br />'; }  
                     $tremark.=&mt('Defined by [_1] at [_2].',$rauthor,$rdomain);  
  }  
  $trole=Apache::lonnet::plaintext($role);  
                 my $ttype;  
                 my $twhere;  
                 my ($tdom,$trest,$tsection)=  
                     split(/\//,Apache::lonnet::declutter($where));  
                 # First, Co-Authorship roles  
                 if (($role eq 'ca') || ($role eq 'aa')) {  
                     my $home = &Apache::lonnet::homeserver($trest,$tdom);  
     my $allowed=0;  
     my @ids=&Apache::lonnet::current_machine_ids();  
     foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }  
                     if (!$allowed) {  
  $button=0;  
                         $switchserver='otherserver='.$home.'&role='.$trolecode;  
                     }  
                     #next if ($home eq 'no_host');  
                     $home = &Apache::lonnet::hostname($home);  
                     $ttype='Construction Space';  
                     $twhere=&mt('User').': '.$trest.'<br />'.&mt('Domain').  
  ': '.$tdom.'<br />'.  
                         ' '.&mt('Server').':&nbsp;'.$home;  
                     $env{'course.'.$tdom.'_'.$trest.'.description'}='ca';  
     $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$trest.'/');  
     $sortkey=$role."$trest:$tdom";  
                 } elsif ($role eq 'au') {  
                     # Authors  
                     my $home = &Apache::lonnet::homeserver  
                         ($env{'user.name'},$env{'user.domain'});  
     my $allowed=0;  
     my @ids=&Apache::lonnet::current_machine_ids();  
     foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }  
                     if (!$allowed) {  
  $button=0;  
                         $switchserver='otherserver='.$home.'&role='.$trolecode;  
                     }  
                     #next if ($home eq 'no_host');  
                     $home = &Apache::lonnet::hostname($home);  
                     $ttype='Construction Space';  
                     $twhere=&mt('Domain').': '.$tdom.'<br />'.&mt('Server').  
  ':&nbsp;'.$home;  
                     $env{'course.'.$tdom.'_'.$trest.'.description'}='ca';  
     $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$env{'user.name'}.'/');  
     $sortkey=$role;  
                 } elsif ($trest) {  
                     my $tcourseid=$tdom.'_'.$trest;  
                     $ttype = &Apache::loncommon::course_type($tcourseid);  
                     $trole = &Apache::lonnet::plaintext($role,$ttype);  
                     if ($env{'course.'.$tcourseid.'.description'}) {  
                         $twhere=$env{'course.'.$tcourseid.'.description'};  
  $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;  
                         unless ($twhere eq &mt('Currently not available')) {  
     $twhere.=' <span class="LC_fontsize_small">'.  
         &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom).  
                                     '</span>';  
  }  
                     } else {  
                         my %newhash=&Apache::lonnet::coursedescription($tcourseid);  
                         if (%newhash) {  
     $sortkey=$role."\0".$tdom."\0".$newhash{'description'}.  
  "\0".$envkey;  
                             $twhere=$newhash{'description'}.  
                               ' <span class="LC_fontsize_small">'.  
         &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom).  
                               '</span>';  
                             $ttype = $newhash{'type'};  
                             $trole = &Apache::lonnet::plaintext($role,$ttype);  
                         } else {  
                             $twhere=&mt('Currently not available');  
                             $env{'course.'.$tcourseid.'.description'}=$twhere;  
     $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;  
                             $ttype = 'Unavailable';  
                         }  
                     }  
                     if ($tsection) {  
                         $twhere.='<br />'.&mt('Section').': '.$tsection;  
     }  
     if ($role ne 'st') { $twhere.="<br />".&mt('Domain').":".$tdom; }  
                 } elsif ($tdom) {  
                     $ttype='Domain';  
                     $twhere=$tdom;  
     $sortkey=$role.$twhere;  
                 } else {  
                     $ttype='System';  
                     $twhere=&mt('system wide');  
     $sortkey=$role.$twhere;  
                 }  
                 $roletext.=&build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit);  
  $roletext{$envkey}=$roletext;  
  if (!$sortkey) {$sortkey=$twhere."\0".$envkey;}  
  $sortrole{$sortkey}=$envkey;  
  $roleclass{$envkey}=$ttype;  
     }  
         }  
     }  
     if ($env{'user.adv'}) {      if ($env{'user.adv'}) {
         $r->print(          $r->print('<p><label><input type="checkbox" name="showall"');
               '<p><label>'.&mt('Show all roles').': <input type="checkbox" name="showall"');  
         if ($env{'form.showall'}) { $r->print(' checked="checked" '); }          if ($env{'form.showall'}) { $r->print(' checked="checked" '); }
         $r->print(' /></label><input type="submit" value="'.&mt('Display').'" /></p>');          $r->print(' />'.&mt('Show all roles').'</label>'
                    .' <input type="submit" value="'.&mt('Update display').'" />'
                    .'</p>');
     } else {      } else {
         if ($countactive > 0) {          if ($countactive > 0) {
               $r->print(&Apache::loncoursequeueadmin::queued_selfenrollment());
             my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');              my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
             my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');               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>');              $r->print(
                   '<p>'
                  .&mt('[_1]Visit the [_2]Course/Community Catalog[_3]'
                      .' to view all [_4] LON-CAPA courses and communities.'
                      ,'<b>'
                      ,'<a href="/adm/coursecatalog?showdom='.$esc_dom.'">'
                      ,'</a></b>',$domdesc)
                  .'<br />'
                  .&mt('If a course or community is [_1]not[_2] in your list of current courses and communities 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) {
     $r->print('<h2>'.&mt('Currently no additional roles or courses').'</h2>');      $r->print('<h2>'.&mt('Currently no additional roles, courses or communities').'</h2>');
  } else {   } else {
     $r->print('<h2>'.&mt('Currently no active roles or courses').'</h2>');      $r->print('<h2>'.&mt('Currently no active roles, courses or communities').'</h2>');
  }   }
         &findcourse_advice($r);          &findcourse_advice($r);
           &requestcourse_advice($r); 
  $r->print('</form>');   $r->print('</form>');
         if ($countfuture) {          if ($countfuture) {
             $r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture));              $r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture));
Line 852  ENDHEADER Line 752  ENDHEADER
  return OK;   return OK;
     }      }
 # ----------------------------------------------------------------------- Table  # ----------------------------------------------------------------------- Table
     unless ((!&Apache::lonmenu::show_course()) || ($nochoose) || ($countactive==1)) {  
       if ($numdc > 0) {
           $r->print(&coursepick_jscript());
           $r->print(&Apache::loncommon::coursebrowser_javascript().
                     &Apache::loncommon::authorbrowser_javascript());
       }
   
       unless ((!&Apache::loncommon::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");
     }      }
       if ($env{'form.destinationurl'}) {
           $r->print('<input type="hidden" name="destinationurl" value="'.
                     $env{'form.destinationurl'}.'" />');
           if ($env{'form.destsymb'} ne '') {
               $r->print('<input type="hidden" name="destsymb" value="'.
                         $env{'form.destsymb'}.'" />');
           }
       }
   
     my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole,$nochoose);      my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole,$nochoose);
     if ($env{'environment.recentroles'}) {      if ($env{'environment.recentroles'}) {
         my %recent_roles =          my %recent_roles =
                &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'});                 &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'});
  my $output='';   my $output='';
  foreach (sort(keys(%recent_roles))) {   foreach my $role (sort(keys(%recent_roles))) {
     if (defined($roletext{'user.role.'.$_})) {      if (ref($roletext{'user.role.'.$role}) eq 'ARRAY') {
  $output.=$roletext{'user.role.'.$_};   $output.= &Apache::loncommon::start_data_table_row().
                 if ($_ =~ m-dc\./($match_domain)/-                             $roletext{'user.role.'.$role}->[0].
                             &Apache::loncommon::end_data_table_row().
                             &Apache::loncommon::continue_data_table_row().
                             $roletext{'user.role.'.$role}->[1].
                             &Apache::loncommon::end_data_table_row();
                   if ($role =~ m{dc\./($match_domain)/} 
     && $dcroles{$1}) {      && $dcroles{$1}) {
     $output .= &adhoc_roles_row($1,'recent');      $output .= &adhoc_roles_row($1,'recent');
                 }                  }
     } elsif ($numdc > 0) {      } elsif ($numdc > 0) {
                 unless ($_ =~/^error\:/) {                  unless ($role =~/^error\:/) {
                     $output.=&display_cc_role('user.role.'.$_);                      $output.=&display_cc_role('user.role.'.$_);
                 }                  }
             }               }
  }   }
  if ($output) {   if ($output) {
     $r->print(&Apache::loncommon::start_data_table_empty_row()      $r->print(&Apache::loncommon::start_data_table_empty_row()
                      .'<td align="center" colspan="5">'                       .'<td align="center" colspan="5">'
                      .&mt('Recent Roles')                       .$recent
                      .'</td>'                       .'</td>'
                      .&Apache::loncommon::end_data_table_empty_row()                       .&Apache::loncommon::end_data_table_empty_row()
             );              );
Line 884  ENDHEADER Line 805  ENDHEADER
             $doheaders ++;              $doheaders ++;
  }   }
     }      }
   
     if ($numdc > 0) {  
         $r->print(&coursepick_jscript());  
         $r->print(&Apache::loncommon::coursebrowser_javascript().  
                   &Apache::loncommon::authorbrowser_javascript());  
     }  
     &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext);      &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext);
     if ($countactive > 1) {      if ($countactive > 1) {
         my $tremark='';          my $tremark='';
Line 928  ENDHEADER Line 843  ENDHEADER
     $r->print(&Apache::lonnet::getannounce());      $r->print(&Apache::lonnet::getannounce());
     if ($advanced) {      if ($advanced) {
         my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');          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 LON-CAPA server is version [_1]',$r->dir_config('lonVersion'))
  .'</i><br />'                   .'</i><br />'
  .'<a href="/adm/logout">'.&mt('Logout').'</a>&nbsp;&nbsp;'                   .'<a href="/adm/logout">'.&mt('Logout').'</a>&nbsp;&nbsp;'
                  .'<a href="/adm/coursecatalog?showdom='.$esc_dom.'">'                   .'<a href="/adm/coursecatalog?showdom='.$esc_dom.'">'
                  .&mt('Course Catalog')                   .&mt('Course/Community Catalog')
                  .'</small></p>');                   .'</a></small></p>');
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return OK;      return OK;
 }  }
   
   sub gather_roles {
       my ($then,$refresh,$now,$reinit,$nochoose,$roletext,$sortrole,$roleclass,$futureroles,$timezones) = @_;
       my ($countactive,$countfuture,$inrole,$possiblerole) = (0,0,0,'');
       my $advanced = $env{'user.adv'};
       my $tryagain = $env{'form.tryagain'};
       foreach my $envkey (sort(keys(%env))) {
           my $button = 1;
           my $switchserver='';
           my ($role_text,$role_text_end,$sortkey);
           if ($envkey=~/^user\.role\./) {
               my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend);
               &Apache::lonnet::role_status($envkey,$then,$refresh,$now,\$role,\$where,
                                            \$trolecode,\$tstatus,\$tstart,\$tend);
               next if (!defined($role) || $role eq '' || $role =~ /^gr/);
               my $timezone = &role_timezone($where,$timezones);
               $tremark='';
               $tpstart='&nbsp;';
               $tpend='&nbsp;';
               if ($tstart) {
                   $tpstart=&Apache::lonlocal::locallocaltime($tstart,$timezone);
               }
               if ($tend) {
                   $tpend=&Apache::lonlocal::locallocaltime($tend,$timezone);
               }
               if ($env{'request.role'} eq $trolecode) {
                   $tstatus='selected';
               }
               my $tbg;
               if (($tstatus eq 'is')
                   || ($tstatus eq 'selected')
                   || ($tstatus eq 'future')
                   || ($env{'form.showall'})) {
                   if ($tstatus eq 'is') {
                       $tbg='LC_roles_is';
                       $possiblerole=$trolecode;
                       $countactive++;
                   } elsif ($tstatus eq 'future') {
                       $tbg='LC_roles_future';
                       $button=0;
                       $futureroles->{$trolecode} = $tstart.':'.$tend;
                       $countfuture ++;
                   } elsif ($tstatus eq 'expired') {
                       $tbg='LC_roles_expired';
                       $button=0;
                   } elsif ($tstatus eq 'will_not') {
                       $tbg='LC_roles_will_not';
                       $tremark.=&mt('Expired after logout.').' ';
                   } elsif ($tstatus eq 'selected') {
                       $tbg='LC_roles_selected';
                       $inrole=1;
                       $countactive++;
                       $tremark.=&mt('Currently selected.').' ';
                   }
                   my $trole;
                   if ($role =~ /^cr\//) {
                       my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);
                       if ($tremark) { $tremark.='<br />'; }
                       $tremark.=&mt('Defined by [_1] at [_2].',$rauthor,$rdomain);
                   }
                   $trole=Apache::lonnet::plaintext($role);
                   my $ttype;
                   my $twhere;
                   my ($tdom,$trest,$tsection)=
                       split(/\//,Apache::lonnet::declutter($where));
                   # First, Co-Authorship roles
                   if (($role eq 'ca') || ($role eq 'aa')) {
                       my $home = &Apache::lonnet::homeserver($trest,$tdom);
                       my $allowed=0;
                       my @ids=&Apache::lonnet::current_machine_ids();
                       foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
                       if (!$allowed) {
                           $button=0;
                           $switchserver='otherserver='.$home.'&amp;role='.$trolecode;
                       }
                       #next if ($home eq 'no_host');
                       $home = &Apache::lonnet::hostname($home);
                       $ttype='Construction Space';
                       $twhere=&mt('User').': '.$trest.'<br />'.&mt('Domain').
                           ': '.$tdom.'<br />'.
                           ' '.&mt('Server').':&nbsp;'.$home;
                       $env{'course.'.$tdom.'_'.$trest.'.description'}='ca';
                       $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$trest.'/');
                       $sortkey=$role."$trest:$tdom";
                   } elsif ($role eq 'au') {
                       # Authors
                       my $home = &Apache::lonnet::homeserver
                           ($env{'user.name'},$env{'user.domain'});
                       my $allowed=0;
                       my @ids=&Apache::lonnet::current_machine_ids();
                       foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
                       if (!$allowed) {
                           $button=0;
                           $switchserver='otherserver='.$home.'&amp;role='.$trolecode;
                       }
                       #next if ($home eq 'no_host');
                       $home = &Apache::lonnet::hostname($home);
                       $ttype='Construction Space';
                       $twhere=&mt('Domain').': '.$tdom.'<br />'.&mt('Server').
                           ':&nbsp;'.$home;
                       $env{'course.'.$tdom.'_'.$trest.'.description'}='ca';
                       $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$env{'user.name'}.'/');
                       $sortkey=$role;
                   } elsif ($trest) {
                       my $tcourseid=$tdom.'_'.$trest;
                       $ttype = &Apache::loncommon::course_type($tcourseid);
                       $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid);
                       if ($env{'course.'.$tcourseid.'.description'}) {
                           $twhere=$env{'course.'.$tcourseid.'.description'};
                           $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;
                           $twhere = &HTML::Entities::encode($twhere,'"<>&');
                           unless ($twhere eq &mt('Currently not available')) {
                               $twhere.=' <span class="LC_fontsize_small">'.
           &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom).
                                       '</span>';
                           }
                       } else {
                           my %newhash=&Apache::lonnet::coursedescription($tcourseid);
                           if (%newhash) {
                               $sortkey=$role."\0".$tdom."\0".$newhash{'description'}.
                                   "\0".$envkey;
                               $twhere=&HTML::Entities::encode($newhash{'description'},'"<>&').
                                       ' <span class="LC_fontsize_small">'.
                                        &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom).
                                       '</span>';
                               $ttype = $newhash{'type'};
                               $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid);
                           } else {
                               $twhere=&mt('Currently not available');
                               $env{'course.'.$tcourseid.'.description'}=$twhere;
                               $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;
                               $ttype = 'Unavailable';
                           }
                       }
                       if ($tsection) {
                           $twhere.='<br />'.&mt('Section').': '.$tsection;
                       }
                       if ($role ne 'st') { $twhere.="<br />".&mt('Domain').":".$tdom; }
                   } elsif ($tdom) {
                       $ttype='Domain';
                       $twhere=$tdom;
                       $sortkey=$role.$twhere;
                   } else {
                       $ttype='System';
                       $twhere=&mt('system wide');
                       $sortkey=$role.$twhere;
                   }
                   ($role_text,$role_text_end) =
                       &build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain,
                                       $advanced,$tremark,$tbg,$trole,$twhere,$tpstart,
                                       $tpend,$nochoose,$button,$switchserver,$reinit);
                   $roletext->{$envkey}=[$role_text,$role_text_end];
                   if (!$sortkey) {$sortkey=$twhere."\0".$envkey;}
                   $sortrole->{$sortkey}=$envkey;
                   $roleclass->{$envkey}=$ttype;
               }
           }
       }
       return ($countactive,$countfuture,$inrole,$possiblerole);
   }
   
 sub role_timezone {  sub role_timezone {
     my ($where,$timezones) = @_;      my ($where,$timezones) = @_;
     my $timezone;      my $timezone;
Line 1021  sub roletable_headers { Line 1096  sub roletable_headers {
 }  }
   
 sub roletypes {  sub roletypes {
     my @types = ('Domain','Construction Space','Course','Unavailable','System');      my @types = ('Domain','Construction Space','Course','Community','Unavailable','System');
     return @types;       return @types; 
 }  }
   
Line 1034  sub print_rolerows { Line 1109  sub print_rolerows {
             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/) {
                     if (ref($roletext) eq 'HASH') {                      if (ref($roletext) eq 'HASH') {
                         $output.=$roletext->{$sortrole->{$which}};                          if (ref($roletext->{$sortrole->{$which}}) eq 'ARRAY') {
                               $output.= &Apache::loncommon::start_data_table_row().
                                         $roletext->{$sortrole->{$which}}->[0].
                                         &Apache::loncommon::end_data_table_row().
                                         &Apache::loncommon::continue_data_table_row().
                                         $roletext->{$sortrole->{$which}}->[1].
                                         &Apache::loncommon::end_data_table_row();
                           }
                         if ($sortrole->{$which} =~ m-dc\./($match_domain)/-) {                          if ($sortrole->{$which} =~ m-dc\./($match_domain)/-) {
                             if (ref($dcroles) eq 'HASH') {                              if (ref($dcroles) eq 'HASH') {
                                 if ($dcroles->{$1}) {                                  if ($dcroles->{$1}) {
Line 1076  sub findcourse_advice { Line 1158  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?showdom='.$esc_dom.'">','</a>',$domdesc).'<br />');      $r->print('<h3>'.&mt('Self-Enrollment').'</h3>'.
     $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>');                '<p>'.&mt('The [_1]Course/Community Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created, as well as any communities in the domain.','<a href="/adm/coursecatalog?showdom='.$esc_dom.'">','</a>',$domdesc).'<br />');
       $r->print(&mt('You can search for courses and communities which permit self-enrollment, if you would like to enroll in one.').'</p>'.
                 &Apache::loncoursequeueadmin::queued_selfenrollment());
       return;
   }
   
   sub requestcourse_advice {
       my ($r) = @_;
       my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
       my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');
       my (%can_request,%request_doms);
       &Apache::lonnet::check_can_request($env{'user.domain'},\%can_request,\%request_doms);
       if (keys(%request_doms) > 0) {
           my ($types,$typename) = &Apache::loncommon::course_types();
           if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) { 
               $r->print('<h3>'.&mt('Request creation of a course or community').'</h3>'.
                         '<p>'.&mt('You have rights to request the creation of courses and/or communities in the following domain(s):').'<ul>');
               my (@reqdoms,@reqtypes);
               foreach my $type (sort(keys(%request_doms))) {
                   push(@reqtypes,$type); 
                   if (ref($request_doms{$type}) eq 'ARRAY') {
                       my $domstr = join(', ',map { &Apache::lonnet::domain($_) } sort(@{$request_doms{$type}}));
                       $r->print(
                           '<li>'
                          .&mt('[_1]'.$typename->{$type}.'[_2] in domain: [_3]',
                               '<i>',
                               '</i>',
                               '<b>'.$domstr.'</b>')
                          .'</li>'
                       );
                       foreach my $dom (@{$request_doms{$type}}) {
                           unless (grep(/^\Q$dom\E/,@reqdoms)) {
                               push(@reqdoms,$dom);
                           }
                       }
                   }
               }
               my @showtypes;
               foreach my $type (@{$types}) {
                   if (grep(/^\Q$type\E$/,@reqtypes)) {
                       push(@showtypes,$type);
                   }
               }
               my $requrl = '/adm/requestcourse';
               if (@reqdoms == 1) {
                   $requrl .= '?showdom='.$reqdoms[0];
               }
               if (@showtypes > 0) {
                   $requrl.=(($requrl=~/\?/)?'&':'?').'crstype='.$showtypes[0];
               }
               if (@reqdoms == 1 || @showtypes > 0) {
                   $requrl .= '&state=crstype&action=new';
               } 
               $r->print('</ul>'.&mt('Use the [_1]request form[_2] to submit a request for creation of a new course or community.','<a href="'.$requrl.'">','</a>').'</p>');
           }
       }
     return;      return;
 }  }
   
Line 1136  sub privileges_info { Line 1273  sub privileges_info {
     return $output;      return $output;
 }  }
   
 sub role_status {  
     my ($rolekey,$then,$now,$role,$where,$trolecode,$tstatus,$tstart,$tend) = @_;  
     my @pwhere = ();  
     if (exists($env{$rolekey}) && $env{$rolekey} ne '') {  
         (undef,undef,$$role,@pwhere)=split(/\./,$rolekey);  
         unless (!defined($$role) || $$role eq '') {  
             $$where=join('.',@pwhere);  
             $$trolecode=$$role.'.'.$$where;  
             ($$tstart,$$tend)=split(/\./,$env{$rolekey});  
             $$tstatus='is';  
             if ($$tstart && $$tstart>$then) {  
  $$tstatus='future';  
  if ($$tstart<$now) { $$tstatus='will'; }  
             }  
             if ($$tend) {  
                 if ($$tend<$then) {  
                     $$tstatus='expired';  
                 } elsif ($$tend<$now) {  
                     $$tstatus='will_not';  
                 }  
             }  
         }  
     }  
 }  
   
 sub build_roletext {  sub build_roletext {
     my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit) = @_;      my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit) = @_;
     my $roletext=&Apache::loncommon::start_data_table_row();      my ($roletext,$roletext_end);
     my $is_dc=($trolecode =~ m/^dc\./);      my $is_dc=($trolecode =~ m/^dc\./);
     my $rowspan=($is_dc) ? ''      my $rowspan=($is_dc) ? ''
                          : ' rowspan="2" ';                           : ' rowspan="2" ';
Line 1183  sub build_roletext { Line 1295  sub build_roletext {
         } elsif ($tstatus eq 'is') {          } elsif ($tstatus eq 'is') {
             $roletext.='<td'.$rowspan.' class="'.$tbg.'">'.              $roletext.='<td'.$rowspan.' class="'.$tbg.'">'.
                         '<input name="'.$buttonname.'" type="button" value="'.                          '<input name="'.$buttonname.'" type="button" value="'.
                         &mt('Select').'" onClick="javascript:enterrole(this.form,\''.                          &mt('Select').'" onclick="javascript:enterrole(this.form,\''.
                         $trolecode."','".$buttonname.'\');" /></td>';                          $trolecode."','".$buttonname.'\');" /></td>';
         } elsif ($tryagain) {          } elsif ($tryagain) {
             $roletext.=              $roletext.=
                 '<td'.$rowspan.' class="'.$tbg.'">'.                  '<td'.$rowspan.' class="'.$tbg.'">'.
                 '<input name="'.$buttonname.'" type="button" value="'.                  '<input name="'.$buttonname.'" type="button" value="'.
                 &mt('Try Selecting Again').'" onClick="javascript:enterrole(this.form,\''.                  &mt('Try Selecting Again').'" onclick="javascript:enterrole(this.form,\''.
                         $trolecode."','".$buttonname.'\');" /></td>';                          $trolecode."','".$buttonname.'\');" /></td>';
         } elsif ($advanced) {          } elsif ($advanced) {
             $roletext.=              $roletext.=
                 '<td'.$rowspan.' class="'.$tbg.'">'.                  '<td'.$rowspan.' class="'.$tbg.'">'.
                 '<input name="'.$buttonname.'" type="button" value="'.                  '<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) {          } elsif ($reinit) {
             $roletext.=               $roletext.= 
                 '<td'.$rowspan.' class="'.$tbg.'">'.                  '<td'.$rowspan.' class="'.$tbg.'">'.
                 '<input name="'.$buttonname.'" type="button" value="'.                  '<input name="'.$buttonname.'" type="button" value="'.
                 &mt('Re-Select').'" onClick="javascript:enterrole(this.form,\''.                  &mt('Re-Select').'" onclick="javascript:enterrole(this.form,\''.
                         $trolecode."','".$buttonname.'\');" /></td>';                          $trolecode."','".$buttonname.'\');" /></td>';
         } else {          } else {
             $roletext.=              $roletext.=
                 '<td'.$rowspan.' class="'.$tbg.'">'.                  '<td'.$rowspan.' class="'.$tbg.'">'.
                 '<input name="'.$buttonname.'" type="button" value="'.                  '<input name="'.$buttonname.'" type="button" value="'.
                 &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.                  &mt('Re-Select').'" onclick="javascript:enterrole(this.form,\''.
                         $trolecode."','".$buttonname.'\');" /></td>';                          $trolecode."','".$buttonname.'\');" /></td>';
         }          }
     }      }
Line 1218  sub build_roletext { Line 1330  sub build_roletext {
     $roletext.='<td>'.$trole.'</td>'      $roletext.='<td>'.$trole.'</td>'
               .'<td>'.$twhere.'</td>'                .'<td>'.$twhere.'</td>'
               .'<td>'.$tpstart.'</td>'                .'<td>'.$tpstart.'</td>'
               .'<td>'.$tpend.'</td>'                .'<td>'.$tpend.'</td>';
               .&Apache::loncommon::end_data_table_row();  
     if (!$is_dc) {      if (!$is_dc) {
         $roletext.=&Apache::loncommon::continue_data_table_row()          $roletext_end = '<td colspan="4">'.
                   .'<td colspan="4">'                          $tremark.'&nbsp;'.
                   .$tremark.'&nbsp;'                          '</td>';
                   .'</td>'  
                   .&Apache::loncommon::end_data_table_row();  
     }      }
     return $roletext;      return ($roletext,$roletext_end);
 }  }
   
 sub check_needs_switchserver {  sub check_needs_switchserver {
Line 1265  sub check_author_homeserver { Line 1374  sub check_author_homeserver {
     }      }
 }  }
   
 sub check_privs {  
     my ($cdom,$cnum,$then,$now,$checkrole) = @_;  
     my $cckey = 'user.role.'.$checkrole.'./'.$cdom.'/'.$cnum;   
     if ($env{$cckey}) {  
         my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend);  
         &role_status($cckey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);  
         unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) {  
             &set_privileges($cdom,$cnum,$checkrole);  
         }  
     } else {  
         &set_privileges($cdom,$cnum,$checkrole);  
     }  
 }  
   
 sub check_fordc {  sub check_fordc {
     my ($dcroles,$then) = @_;      my ($dcroles,$then) = @_;
     my $numdc = 0;      my $numdc = 0;
Line 1301  sub check_fordc { Line 1396  sub check_fordc {
 }  }
   
 sub adhoc_course_role {  sub adhoc_course_role {
     my ($then) = @_;       my ($refresh,$then) = @_;
     my ($cdom,$cnum);      my ($cdom,$cnum,$crstype);
     $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     if (&check_forcc($cdom,$cnum,$then)) {      $crstype = &Apache::loncommon::course_type();
       if (&check_forcc($cdom,$cnum,$refresh,$then,$crstype)) {
         my $setprivs;          my $setprivs;
         if (!defined($env{'user.role.'.$env{'form.switchrole'}})) {          if (!defined($env{'user.role.'.$env{'form.switchrole'}})) {
             $setprivs = 1;              $setprivs = 1;
         } else {          } else {
             my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.switchrole'}});              my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.switchrole'}});
             if (($start && ($start>$then || $start == -1)) ||              if (($start && ($start>$refresh || $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;
Line 1345  sub adhoc_course_role { Line 1441  sub adhoc_course_role {
                 }                  }
                 &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 = $refresh-1;
                 $userroles{'user.role.'.$spec} = $adhocstart.'.';                  $userroles{'user.role.'.$spec} = $adhocstart.'.';
                 &Apache::lonnet::appenv(\%userroles,[$role,'cm']);                  &Apache::lonnet::appenv(\%userroles,[$role,'cm']);
             }              }
Line 1355  sub adhoc_course_role { Line 1451  sub adhoc_course_role {
 }  }
   
 sub check_forcc {  sub check_forcc {
     my ($cdom,$cnum,$then) = @_;      my ($cdom,$cnum,$refresh,$then,$crstype) = @_;
     my $is_cc;      my ($is_cc,$ccrole);
       if ($crstype eq 'Community') {
           $ccrole = 'co';
       } else {
           $ccrole = 'cc';
       }
     if ($cdom ne '' && $cnum ne '') {      if ($cdom ne '' && $cnum ne '') {
         if (&Apache::lonnet::is_course($cdom,$cnum)) {          if (&Apache::lonnet::is_course($cdom,$cnum)) {
             my $envkey = 'user.role.cc./'.$cdom.'/'.$cnum;              my $envkey = 'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum;
             if (defined($env{$envkey})) {              if (defined($env{$envkey})) {
                 $is_cc = 1;                  $is_cc = 1;
                 my ($tstart,$tend)=split(/\./,$env{$envkey});                  my ($tstart,$tend)=split(/\./,$env{$envkey});
                 if ($tstart && $tstart>$then) { $is_cc = 0; }                  if ($tstart && $tstart>$refresh) { $is_cc = 0; }
                 if ($tend   && $tend  <$then) { $is_cc = 0; }                  if ($tend   && $tend  <$then) { $is_cc = 0; }
             }              }
         }          }
Line 1376  sub courselink { Line 1477  sub courselink {
     my $courseform=&Apache::loncommon::selectcourse_link      my $courseform=&Apache::loncommon::selectcourse_link
                    ('rolechoice','dccourse'.$rowtype.'_'.$dcdom,                     ('rolechoice','dccourse'.$rowtype.'_'.$dcdom,
                     'dcdomain'.$rowtype.'_'.$dcdom,'coursedesc'.$rowtype.'_'.                      'dcdomain'.$rowtype.'_'.$dcdom,'coursedesc'.$rowtype.'_'.
                     $dcdom,$dcdom,undef);                      $dcdom,$dcdom,undef,'Course/Community');
     my $hiddenitems = '<input type="hidden" name="dcdomain'.$rowtype.'_'.$dcdom.'" value="'.$dcdom.'" />'.      my $hiddenitems = '<input type="hidden" name="dcdomain'.$rowtype.'_'.$dcdom.'" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="origdom'.$rowtype.'_'.$dcdom.'" value="'.$dcdom.'" />'.                        '<input type="hidden" name="origdom'.$rowtype.'_'.$dcdom.'" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="dccourse'.$rowtype.'_'.$dcdom.'" value="" />'.                        '<input type="hidden" name="dccourse'.$rowtype.'_'.$dcdom.'" value="" />'.
Line 1386  sub courselink { Line 1487  sub courselink {
   
 sub coursepick_jscript {  sub coursepick_jscript {
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                   plsu => "Please use the 'Select Course' link to open a separate pick course window where you may select the course you wish to enter.",                    plsu => "Please use the 'Select Course/Community' link to open a separate pick course window where you may select the course or community you wish to enter.",
                   youc => 'You can only use this screen to select courses in the current domain.',                    youc => 'You can only use this screen to select courses and communities in the current domain.',
              );               );
     my $verify_script = <<"END";      my $verify_script = <<"END";
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function verifyCoursePick(caller) {  function verifyCoursePick(caller) {
     var numbutton = getIndex(caller)      var numbutton = getIndex(caller)
     var pickedCourse = document.rolechoice.elements[numbutton+4].value      var pickedCourse = document.rolechoice.elements[numbutton+4].value
Line 1419  function getIndex(caller) { Line 1521  function getIndex(caller) {
     }      }
     return -1;      return -1;
 }  }
   // ]]>
 </script>  </script>
 END  END
     return $verify_script;      return $verify_script;
Line 1433  sub coauthorlink { Line 1536  sub coauthorlink {
   
 sub display_cc_role {  sub display_cc_role {
     my $rolekey = shift;      my $rolekey = shift;
     my $roletext;      my ($roletext,$roletext_end);
     my $advanced = $env{'user.adv'};      my $advanced = $env{'user.adv'};
     my $tryagain = $env{'form.tryagain'};      my $tryagain = $env{'form.tryagain'};
     unless ($rolekey =~/^error\:/) {      unless ($rolekey =~/^error\:/) {
         if ($rolekey =~ m-^user\.role.cc\./($match_domain)/($match_courseid)$-) {          if ($rolekey =~ m{^user\.role\.(cc|co)\./($match_domain)/($match_courseid)$}) {
             my $tcourseid = $1.'_'.$2;              my $ccrole = $1;
             my $trolecode = 'cc./'.$1.'/'.$2;              my $tcourseid = $2.'_'.$3;
               my $trolecode = $1.'./'.$2.'/'.$3;
             my $twhere;              my $twhere;
             my $ttype;              my $ttype;
             my $tbg='LC_roles_is';              my $tbg='LC_roles_is';
Line 1454  sub display_cc_role { Line 1558  sub display_cc_role {
                 $twhere=&mt('Currently not available');                  $twhere=&mt('Currently not available');
                 $env{'course.'.$tcourseid.'.description'}=$twhere;                  $env{'course.'.$tcourseid.'.description'}=$twhere;
             }              }
             my $trole = &Apache::lonnet::plaintext('cc',$ttype);              my $trole = &Apache::lonnet::plaintext($ccrole,$ttype,$tcourseid);
             $twhere.="<br />".&mt('Domain').":".$1;              $twhere.="<br />".&mt('Domain').":".$1;
             $roletext = &build_roletext($trolecode,$1,$2,'is',$tryagain,$advanced,'',$tbg,$trole,$twhere,'','','',1,'');              ($roletext,$roletext_end) = &build_roletext($trolecode,$1,$2,'is',$tryagain,$advanced,'',$tbg,$trole,$twhere,'','','',1,'');
         }          }
     }      }
     return ($roletext);      return ($roletext,$roletext_end);
 }  }
   
 sub adhoc_roles_row {  sub adhoc_roles_row {
     my ($dcdom,$rowtype) = @_;      my ($dcdom,$rowtype) = @_;
     my $output = &Apache::loncommon::continue_data_table_row()      my $output = &Apache::loncommon::continue_data_table_row()
                  .' <td colspan="5">'                   .' <td colspan="5">'
                  .'<table><tr><td>'  
                  .&mt('[_1]Ad hoc[_2] roles in domain [_3] --'                   .&mt('[_1]Ad hoc[_2] roles in domain [_3] --'
                      ,'<span class="LC_cusr_emph">','</span>',$dcdom)                       ,'<span class="LC_cusr_emph">','</span>',$dcdom)
                  .'</td>'                   .' ';
                  .'<td>';  
     my $selectcclink = &courselink($dcdom,$rowtype);      my $selectcclink = &courselink($dcdom,$rowtype);
     my $ccrole = &Apache::lonnet::plaintext('cc');      my $ccrole = &Apache::lonnet::plaintext('co',undef,undef,1);
     my $carole = &Apache::lonnet::plaintext('ca');      my $carole = &Apache::lonnet::plaintext('ca');
     my $selectcalink = &coauthorlink($dcdom,$rowtype);      my $selectcalink = &coauthorlink($dcdom,$rowtype);
     $output.=&mt('[_1]: [_2]',$ccrole,$selectcclink)      $output.=$ccrole.': '.$selectcclink
             .'<br /></td>'              .' | '.$carole.': '.$selectcalink
             .'<td>&nbsp;&nbsp;</td>'  
             .'<td>'.&mt('[_1]: [_2]',$carole,$selectcalink).'<br /></td>'  
             .'</tr></table>'  
             .'</td>'  
             .&Apache::loncommon::end_data_table_row();              .&Apache::loncommon::end_data_table_row();
     return $output;      return $output;
 }  }
Line 1490  sub recent_filename { Line 1588  sub recent_filename {
     return 'nohist_recent_'.&escape($area);      return 'nohist_recent_'.&escape($area);
 }  }
   
 sub set_privileges {  
 # role can be cc or ca  
     my ($dcdom,$pickedcourse,$role) = @_;  
     my $area = '/'.$dcdom.'/'.$pickedcourse;  
     my $spec = $role.'.'.$area;  
     my %userroles = &Apache::lonnet::set_arearole($role,$area,'','',  
   $env{'user.domain'},  
   $env{'user.name'});  
     my %ccrole = ();  
     &Apache::lonnet::standard_roleprivs(\%ccrole,$role,$dcdom,$spec,$pickedcourse,$area);  
     my ($author,$adv)= &Apache::lonnet::set_userprivs(\%userroles,\%ccrole);  
     &Apache::lonnet::appenv(\%userroles,[$role,'cm']);  
   
     &Apache::lonnet::log($env{'user.domain'},  
                          $env{'user.name'},  
                          $env{'user.home'},  
                         "Role ".$role);  
     &Apache::lonnet::appenv(  
                           {'request.role'        => $spec,  
                           'request.role.domain' => $dcdom,  
                           'request.course.sec'  => ''});  
     my $tadv=0;  
     if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }  
     &Apache::lonnet::appenv({'request.role.adv'    => $tadv});  
 }  
   
 sub courseloadpage {  sub courseloadpage {
     my ($courseid) = @_;      my ($courseid) = @_;
     my $startpage;      my $startpage;
Line 1564  course they should act on, etc. Both in Line 1636  course they should act on, etc. Both in
 handler determines via C<lonnet>'s C<&allowed> function that a certain  handler determines via C<lonnet>'s C<&allowed> function that a certain
 action is not allowed, C<lonroles> is used as error handler. This  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  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  what they were trying to do.
 B<CRS> button in the Remote Control.   
   
 =begin latex  =begin latex
   

Removed from v.1.215  
changed lines
  Added in v.1.248


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