Diff for /loncom/auth/lonroles.pm between versions 1.269.2.17 and 1.276

version 1.269.2.17, 2014/04/05 12:25:19 version 1.276, 2012/09/04 20:47:46
Line 138  use Apache::lonlocal; Line 138  use Apache::lonlocal;
 use Apache::lonpageflip();  use Apache::lonpageflip();
 use Apache::lonnavdisplay();  use Apache::lonnavdisplay();
 use Apache::loncoursequeueadmin;  use Apache::loncoursequeueadmin;
 use Apache::longroup;  
 use Apache::lonrss;  
 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) = @_;      my ($r,$title,$url,$msg) = @_;
Line 151  sub redirect_user { Line 149  sub redirect_user {
     &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();  
   
     # Breadcrumbs      # Breadcrumbs
     my $brcrum = [{'href' => $url,      my $brcrum = [{'href' => $url,
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">  
 // <![CDATA[  
 $swinfo  
 // ]]>  
 </script>  
 <p>$msg</p>  <p>$msg</p>
 $end_page  $end_page
 ENDREDIR  ENDREDIR
Line 221  sub handler { Line 213  sub handler {
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
   
 # -------------------------------------------------- Check if setting hot list  # -------------------------------------------------- Check if setting hot list 
     my $hotlist;      my $hotlist;
     if ($env{'form.action'} eq 'verify_and_change_rolespref') {      if ($env{'form.action'} eq 'verify_and_change_rolespref') {
         $hotlist = &Apache::lonpreferences::verify_and_change_rolespref($r);          $hotlist = &Apache::lonpreferences::verify_and_change_rolespref($r);
Line 294  sub handler { Line 286  sub handler {
  "request.role.domain" => $env{'user.domain'}});   "request.role.domain" => $env{'user.domain'}});
 # 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 Coordinator role?  # Is this an ad-hoc Coordinator role?
                 if (my ($ccrole,$domain,$coursenum) =                  if (my ($ccrole,$domain,$coursenum) =
     ($envkey =~ m-^form\.(cc|co)\./($match_domain)/($match_courseid)$-)) {      ($envkey =~ m-^form\.(cc|co)\./($match_domain)/($match_courseid)$-)) {
Line 317  sub handler { Line 309  sub handler {
                             my $trolecode = 'au./'.$domain.'/';                              my $trolecode = 'au./'.$domain.'/';
                             my $switchserver = '/adm/switchserver?otherserver='.$home.'&amp;role='.$trolecode;                              my $switchserver = '/adm/switchserver?otherserver='.$home.'&amp;role='.$trolecode;
                             $r->internal_redirect($switchserver);                              $r->internal_redirect($switchserver);
                             return OK;  
                         }                          }
                         last;                          last;
                     }                      }
Line 329  sub handler { Line 320  sub handler {
                                 my $trolecode = 'ca./'.$domain.'/'.$user;                                  my $trolecode = 'ca./'.$domain.'/'.$user;
                                 my $switchserver = '/adm/switchserver?otherserver='.$home.'&amp;role='.$trolecode;                                  my $switchserver = '/adm/switchserver?otherserver='.$home.'&amp;role='.$trolecode;
                                 $r->internal_redirect($switchserver);                                  $r->internal_redirect($switchserver);
                                 return OK;  
                             }                              }
                             last;                              last;
                         }                          }
Line 351  sub handler { Line 341  sub handler {
                                 my $switchserver = '/adm/switchserver?'                                  my $switchserver = '/adm/switchserver?'
                                                   .'otherserver='.$home.'&amp;role='.$trolecode;                                                    .'otherserver='.$home.'&amp;role='.$trolecode;
                                 $r->internal_redirect($switchserver);                                  $r->internal_redirect($switchserver);
                                 return OK;  
                             }                              }
                         } else {                          } else {
                             delete($env{$envkey});                              delete($env{$envkey});
Line 364  sub handler { Line 353  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);
             &Apache::lonnet::role_status($envkey,$update,$refresh,$now,\$role,\$where,              &Apache::lonnet::role_status($envkey,$update,$refresh,$now,\$role,\$where,
Line 526  ENDENTERKEY Line 515  ENDENTERKEY
   
     if (($cnum) && ($role ne 'ca') && ($role ne 'aa')) {      if (($cnum) && ($role ne 'ca') && ($role ne 'aa')) {
                         my $msg;                          my $msg;
                         my ($furl,$ferr)=   my ($furl,$ferr)=
                             &Apache::lonuserstate::readmap($cdom.'/'.$cnum);      &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
                         unless ($ferr) {                          unless (($ferr) || ($env{'form.switchrole'}) ||
                             unless (($env{'form.switchrole'}) ||                                  ($env{"environment.internal.$cdom.$cnum.$role.adhoc"})) {
                                     ($env{"environment.internal.$cdom.$cnum.$role.adhoc"})) {                              &Apache::lonnet::put('nohist_crslastlogin',
                                 &Apache::lonnet::put('nohist_crslastlogin',                                  {$env{'user.name'}.':'.$env{'user.domain'}.
                                     {$env{'user.name'}.':'.$env{'user.domain'}.                                  ':'.$csec.':'.$role => $now},$cdom,$cnum);
                                      ':'.$csec.':'.$role => $now},$cdom,$cnum);  
                             }  
                             my ($feeds,$syllabus_time);  
                             &Apache::lonrss::advertisefeeds($cnum,$cdom,undef,\$feeds);  
                             &Apache::lonnet::appenv({'request.course.feeds' => $feeds});  
                             &Apache::lonnet::get_numsuppfiles($cnum,$cdom,1);  
                             unless ($env{'course.'.$cdom.'_'.$cnum.'.updatedsyllabus'}) {  
                                 unless (($env{'course.'.$cdom.'_'.$cnum.'.externalsyllabus'}) ||  
                                         ($env{'course.'.$cdom.'_'.$cnum.'.uploadedsyllabus'})) {  
                                     my %syllabus=&Apache::lonnet::dump('syllabus',$cdom,$cnum);  
                                     $syllabus_time = $syllabus{'uploaded.lastmodified'};  
                                     if ($syllabus_time) {  
                                         &Apache::lonnet::appenv({'request.course.syllabustime' => $syllabus_time});  
                                     }  
                                 }  
                             }  
                         }                          }
  if (($env{'form.orgurl'}) &&    if (($env{'form.orgurl'}) && 
     ($env{'form.orgurl'}!~/^\/adm\/flip/) &&      ($env{'form.orgurl'}!~/^\/adm\/flip/)) {
                             ($env{'form.orgurl'} ne '/adm/roles')) {  
     my $dest=$env{'form.orgurl'};      my $dest=$env{'form.orgurl'};
                             if ($env{'form.symb'}) {                              if ($env{'form.symb'}) {
                                 if ($dest =~ /\?/) {                                  if ($dest =~ /\?/) {
                                     $dest .= '&';                                      $dest .= '&';
                                 } else {                                  } else {
                                     $dest .= '?';                                      $dest .= '?'
                                 }                                  }
                                 $dest .= 'symb='.$env{'form.symb'};                                  $dest .= 'symb='.$env{'form.symb'};
                             }                              }
Line 597  ENDENTERKEY Line 569  ENDENTERKEY
     } else {      } else {
  # Check to see if the user is a CC entering a course    # Check to see if the user is a CC entering a course 
  # for the first time   # for the first time
    my (undef, undef, $role, $courseid) = split(/\./, $envkey);
    if (substr($courseid, 0, 1) eq '/') {
       $courseid = substr($courseid, 1);
    }
    $courseid =~ s/\//_/;
  if ((($role eq 'cc') || ($role eq 'co'))    if ((($role eq 'cc') || ($role eq 'co')) 
                                     && ($env{'course.' .$cdom.'_'.$cnum.'.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 618  ENDENTERKEY Line 595  ENDENTERKEY
                                                 if ($env{'request.role.adv'}) {                                                  if ($env{'request.role.adv'}) {
                                                     $dest = &Apache::lonenc::unencrypted($dest);                                                      $dest = &Apache::lonenc::unencrypted($dest);
                                                     if ($destsymb eq '') {                                                      if ($destsymb eq '') {
                                                         ($destsymb) = ($dest =~ /(?:\?|\&)symb=([^\&]*)/);                                                           ($destsymb) = ($dest =~ /\?symb=([^\&]*)/);
                                                         $destsymb = &unescape($destsymb);                                                          $destsymb = &unescape($destsymb);
                                                     }                                                      }
                                                 }                                                  }
                                             } else {                                              } else {
                                                 if ($destsymb eq '') {                                                  if ($destsymb eq '') {
                                                     ($destsymb) = ($dest =~ /(?:\?|\&)symb=([^\&]+)/);                                                      ($destsymb) = ($dest =~ /\?symb=([^\&]+)/);
                                                     $destsymb = &unescape($destsymb);                                                      $destsymb = &unescape($destsymb);
                                                 }                                                  }
                                                 unless ($env{'request.role.adv'}) {                                                  unless ($env{'request.role.adv'}) {
Line 633  ENDENTERKEY Line 610  ENDENTERKEY
                                             }                                              }
                                             if (($checkenc) && ($destsymb ne '')) {                                              if (($checkenc) && ($destsymb ne '')) {
                                                 my ($encstate,$unencsymb,$res);                                                  my ($encstate,$unencsymb,$res);
                                                 $unencsymb = &Apache::lonnet::symbclean($destsymb);                                                  my $unencsymb = &Apache::lonnet::symbclean($destsymb);
                                                 (undef,undef,$res) = &Apache::lonnet::decode_symb($unencsymb);                                                  (undef,undef,$res) = &Apache::lonnet::decode_symb($unencsymb);
                                                 &Apache::lonnet::symbverify($unencsymb,$res,\$encstate);                                                  &Apache::lonnet::symbverify($unencsymb,$res,\$encstate);
                                                 if ($encstate) {                                                  if ($encstate) {
Line 643  ENDENTERKEY Line 620  ENDENTERKEY
                                                 }                                                  }
                                             }                                              }
                                         }                                          }
                                         unless (($dest =~ m{^/enc/}) || ($dest =~ /(\?|\&)symb=.+___\d+___.+/)) {                                           unless (($dest =~ m{^/enc/}) || ($dest =~ /\?symb=.+___\d+___.+/)) {
                                             if (($destsymb ne '') && ($destsymb !~ m{^/enc/})) {                                              if (($destsymb ne '') && ($destsymb !~ m{^/enc/})) {
                                                 my $esc_symb = &escape($destsymb);                                                  my $esc_symb = &escape($destsymb);
                                                 $dest .= '?symb='.$esc_symb;                                                  $dest .= '?symb='.$esc_symb;
                                             }                                              }
                                         }                                          }
                                         &redirect_user($r, &mt('Entering [_1]',                                          &redirect_user($r, &mt('Entering [_1]',
                                                        $env{'course.'.$env{'request.course.id'}.'.description'}),                                                         $env{'course.'.$courseid.'.description'}),
                                                        $dest, $msg);                                                         $dest, $msg);
                                         return OK;                                          return OK;
                                     }                                      }
Line 660  ENDENTERKEY Line 637  ENDENTERKEY
     $env{'request.course.id'}.'/'      $env{'request.course.id'}.'/'
     .$env{'request.course.sec'})      .$env{'request.course.sec'})
  ) {   ) {
  my $startpage = &courseloadpage($env{'request.course.id'});   my $startpage = &courseloadpage($courseid);
  unless ($startpage eq 'firstres') {            unless ($startpage eq 'firstres') {         
     $msg = &mt('Entering [_1] ...',      $msg = &mt('Entering [_1] ...',
        $env{'course.'.$env{'request.course.id'}.'.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);
     return OK;      return OK;
  }   }
     }      }
  }   }
                                 # Are we allowed to look at the first resource?  # Are we allowed to look at the first resource?
                                 if ($furl =~ m{^(/adm/wrapper|)/ext/}) {   if ($furl !~ m|^/adm/|) {
                                     # If it's an external resource,  # Guess not ...
                                     # strip off the symb argument and possible query      $furl=&Apache::lonpageflip::first_accessible_resource();
                                     my ($exturl,$symb) = ($furl =~ m{^(.+)(?:\?|\&)symb=(.+)$});   }
                                     # Unencode $symb  
                                     $symb = &unescape($symb);  
                                     # Then check for permission  
                                     if (!&Apache::lonnet::allowed('bre',$exturl,$symb)) {  
                                         $furl = &Apache::lonpageflip::first_accessible_resource();  
                                     }  
                                 # For other resources just check for permission  
                                 } elsif (!&Apache::lonnet::allowed('bre',$furl)) {  
                                     $furl = &Apache::lonpageflip::first_accessible_resource();  
                                 }  
   
                                 $msg = &mt('Entering [_1] ...',                                  $msg = &mt('Entering [_1] ...',
    $env{'course.'.$cdom.'_'.$cnum.'.description'});     $env{'course.'.$courseid.'.description'});
  &redirect_user($r, &mt('Entering [_1]',   &redirect_user($r, &mt('Entering [_1]',
                                $env{'course.'.$cdom.'_'.$cnum.'.description'}),                                 $env{'course.'.$courseid.'.description'}),
                                $furl, $msg);                                 $furl, $msg);
     }      }
     return OK;      return OK;
Line 705  ENDENTERKEY Line 671  ENDENTERKEY
                             $redirect_url .= $where;                              $redirect_url .= $where;
                         }                          }
                         $redirect_url .= '/';                          $redirect_url .= '/';
                         &redirect_user($r,&mt('Entering Authoring Space'),                          &redirect_user($r,&mt('Entering Construction Space'),
                                        $redirect_url);                                         $redirect_url);
                         return OK;                          return OK;
                     }                      }
Line 737  ENDENTERKEY Line 703  ENDENTERKEY
     my $crumbtext = 'User Roles';      my $crumbtext = 'User Roles';
     my $pagetitle = 'My Roles';      my $pagetitle = 'My Roles';
     my $recent = &mt('Recent Roles');      my $recent = &mt('Recent Roles');
     my $standby = &mt('Role selected. Please stand by.');  
     my $show_course=&Apache::loncommon::show_course();      my $show_course=&Apache::loncommon::show_course();
     if ($show_course) {      if ($show_course) {
         $crumbtext = 'Courses';          $crumbtext = 'Courses';
         $pagetitle = 'My Courses';          $pagetitle = 'My Courses';
         $recent = &mt('Recent Courses');          $recent = &mt('Recent Courses');
         $standby = &mt('Course selected. Please stand by.');  
     }      }
     my $brcrum =[{href=>"/adm/roles",text=>$crumbtext}];      my $brcrum =[{href=>"/adm/roles",text=>$crumbtext}];
   
Line 753  ENDENTERKEY Line 717  ENDENTERKEY
     my $swinfo=&Apache::lonmenu::rawconfig();      my $swinfo=&Apache::lonmenu::rawconfig();
     my $start_page=&Apache::loncommon::start_page($pagetitle,undef,{bread_crumbs=>$brcrum});      my $start_page=&Apache::loncommon::start_page($pagetitle,undef,{bread_crumbs=>$brcrum});
     my $funcs = &get_roles_functions($showcount);      my $funcs = &get_roles_functions($showcount);
       my $standby=&mt('Role selected. Please stand by.');
     $standby=~s/\n/\\n/g;      $standby=~s/\n/\\n/g;
     my $noscript='<br /><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='<br /><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 786  function rolesView (caller) { Line 751  function rolesView (caller) {
         document.rolechoice.display.value = caller;          document.rolechoice.display.value = caller;
     } else {      } else {
         if ((caller == 'doupdate') || (caller == 'requestauthor') ||          if ((caller == 'doupdate') || (caller == 'requestauthor') ||
             (caller == 'queued')) {              (caller == 'queued')) { 
             document.rolechoice.state.value = caller;              document.rolechoice.state.value = caller;
         }          }
     }      }
Line 870  ENDHEADER Line 835  ENDHEADER
             }              }
             if ($hotlist) {              if ($hotlist) {
                 $showresult .= $hotlist;                  $showresult .= $hotlist;
             }              } 
             $showresult .= '</div>';              $showresult .= '</div>';
             $r->print($showresult);              $r->print($showresult);
         } elsif ($env{'form.state'} eq 'queued') {          } elsif ($env{'form.state'} eq 'queued') {
Line 895  ENDHEADER Line 860  ENDHEADER
                       \%sortrole,\%roleclass,\%futureroles,\%timezones,$loncaparev);                        \%sortrole,\%roleclass,\%futureroles,\%timezones,$loncaparev);
     $refresh = $now;      $refresh = $now;
     &Apache::lonnet::appenv({'user.refresh.time'  => $refresh});      &Apache::lonnet::appenv({'user.refresh.time'  => $refresh});
     unless ($env{'user.adv'}) {      unless ($env{'user.adv'}) { 
         if ($countactive > 0) {          if ($countactive > 0) {
             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(              $r->print(
                 '<p>'                  '<p>'
                .&mt('[_1]Visit the [_2]Course/Community Catalog[_3][_4]'                 .&mt('[_1]Visit the [_2]Course/Community Catalog[_3]'
                    .' to view all [_5] LON-CAPA courses and communities.'                     .' to view all [_4] LON-CAPA courses and communities.'
                    ,'<b>'                     ,'<b>'
                    ,'<a href="/adm/coursecatalog?showdom='.$esc_dom.'">'                     ,'<a href="/adm/coursecatalog?showdom='.$esc_dom.'">'
                    ,'</a>'                     ,'</a></b>',$domdesc)
                    ,'</b>'  
                    ,'"'. $domdesc.'"')  
                .'<br />'                 .'<br />'
                .&mt('If a course or community is [_1]not[_2] in your list of current courses and communities below,'                 .&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.'                     .' you may be able to enroll if self-enrollment is permitted.'
Line 1154  sub gather_roles { Line 1117  sub gather_roles {
                 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('Custom role defined by [_1].',$rauthor.':'.$rdomain);                      $tremark.=&mt('Customrole defined by [_1].',$rauthor.':'.$rdomain);
                 }                  }
                 $trole=Apache::lonnet::plaintext($role);                  $trole=Apache::lonnet::plaintext($role);
                 my $ttype;                  my $ttype;
Line 1172  sub gather_roles { Line 1135  sub gather_roles {
                     }                      }
                     #next if ($home eq 'no_host');                      #next if ($home eq 'no_host');
                     $home = &Apache::lonnet::hostname($home);                      $home = &Apache::lonnet::hostname($home);
                     $ttype='Authoring Space';                      $ttype='Construction Space';
                     $twhere=&mt('User').': '.$trest.'<br />'.&mt('Domain').                      $twhere=&mt('User').': '.$trest.'<br />'.&mt('Domain').
                         ': '.$tdom.'<br />'.                          ': '.$tdom.'<br />'.
                         ' '.&mt('Server').':&nbsp;'.$home;                          ' '.&mt('Server').':&nbsp;'.$home;
Line 1191  sub gather_roles { Line 1154  sub gather_roles {
                     }                      }
                     #next if ($home eq 'no_host');                      #next if ($home eq 'no_host');
                     $home = &Apache::lonnet::hostname($home);                      $home = &Apache::lonnet::hostname($home);
                     $ttype='Authoring Space';                      $ttype='Construction Space';
                     $twhere=&mt('Domain').': '.$tdom.'<br />'.&mt('Server').                      $twhere=&mt('Domain').': '.$tdom.'<br />'.&mt('Server').
                         ':&nbsp;'.$home;                          ':&nbsp;'.$home;
                     $env{'course.'.$tdom.'_'.$trest.'.description'}='ca';                      $env{'course.'.$tdom.'_'.$trest.'.description'}='ca';
Line 1364  sub roletable_headers { Line 1327  sub roletable_headers {
 }  }
   
 sub roletypes {  sub roletypes {
     my @types = ('Domain','Authoring Space','Course','Community','Unavailable','System');      my @types = ('Domain','Construction Space','Course','Community','Unavailable','System');
     return @types;       return @types; 
 }  }
   
Line 1503  sub privileges_info { Line 1466  sub privileges_info {
  my (undef,$tdom,$trest,$tsec)=split(m{/},$where);   my (undef,$tdom,$trest,$tsec)=split(m{/},$where);
  if ($trest) {   if ($trest) {
     if ($env{'course.'.$tdom.'_'.$trest.'.description'} eq 'ca') {      if ($env{'course.'.$tdom.'_'.$trest.'.description'} eq 'ca') {
  $ttype='Authoring Space';   $ttype='Construction Space';
  $twhere='User: '.$trest.', Domain: '.$tdom;   $twhere='User: '.$trest.', Domain: '.$tdom;
     } else {      } else {
  $ttype= &Apache::loncommon::course_type($tdom.'_'.$trest);   $ttype= &Apache::loncommon::course_type($tdom.'_'.$trest);
Line 1616  sub build_roletext { Line 1579  sub build_roletext {
     return ($roletext,$roletext_end);      return ($roletext,$roletext_end);
 }  }
   
   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 1675  sub adhoc_course_role { Line 1656  sub adhoc_course_role {
                 $setprivs = 1;                  $setprivs = 1;
             }              }
         }          }
         unless ($setprivs) {  
             if (!exists($env{'user.priv.'.$env{'form.switchrole'}.'./'})) {  
                 $setprivs = 1;  
             }  
         }  
         if ($setprivs) {          if ($setprivs) {
             if ($env{'form.switchrole'} =~ m-^(in|ta|ep|ad|st|cr)(.*?)\./\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;
Line 1707  sub adhoc_course_role { Line 1683  sub adhoc_course_role {
                     $spec .= '/'.$usec;                      $spec .= '/'.$usec;
                     $area .= '/'.$usec;                      $area .= '/'.$usec;
                 }                  }
                 if ($role =~ /^cr/) {                  &Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,$area);
                     &Apache::lonnet::custom_roleprivs(\%newrole,$role,$cdom,$cnum,$spec,$area);  
                 } else {  
                     &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 = $refresh-1;                  my $adhocstart = $refresh-1;
                 $userroles{'user.role.'.$spec} = $adhocstart.'.';                  $userroles{'user.role.'.$spec} = $adhocstart.'.';
Line 1756  sub check_release_required { Line 1728  sub check_release_required {
             my $otherserver;              my $otherserver;
             if (($major eq '' && $minor eq '') ||               if (($major eq '' && $minor eq '') || 
                 (($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor)))) {                  (($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor)))) {
                 my ($userdomserver) = &Apache::lonnet::choose_server($env{'user.domain'},undef,$required);                  my ($userdomserver) = &Apache::lonnet::choose_server($env{'user.domain'});
                 my $switchlcrev =                   my $switchlcrev = 
                     &Apache::lonnet::get_server_loncaparev($env{'user.domain'},                      &Apache::lonnet::get_server_loncaparev($env{'user.domain'},
                                                            $userdomserver);                                                             $userdomserver);
Line 2170  sub update_session_roles { Line 2142  sub update_session_roles {
                     my $status_in_db =                      my $status_in_db =
                         &curr_role_status($tstart,$tend,$refresh,$now);                          &curr_role_status($tstart,$tend,$refresh,$now);
                     my ($rdummy,$rest) = split(/\//,$role,2);                      my ($rdummy,$rest) = split(/\//,$role,2);
                       my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);
                     my %currpriv;                      my %currpriv;
                     unless (exists($crprivs{$rest})) {                      unless (exists($crprivs{$rest})) {
                         my ($rdomain,$rauthor,$rrole)=split(/\//,$rest);                          my ($rdomain,$rauthor,$rrole)=split(/\//,$rest);
Line 2194  sub update_session_roles { Line 2167  sub update_session_roles {
                             }                              }
                         }                          }
                     }                      }
                     my $status_in_env =                      $currpriv{sys} = $env{"user.priv.$rolekey./"};
                         &curr_role_status($currstart,$currend,$refresh,$update);                      $currpriv{dom} = $env{"user.priv.$rolekey./$udom/"};
                     if ($status_in_env eq 'active') {                      $currpriv{crs} = $env{"user.priv.$rolekey.$where"};
                         $currpriv{sys} = $env{"user.priv.$rolekey./"};                      if (keys(%crprivs)) {
                         $currpriv{dom} = $env{"user.priv.$rolekey./$udom/"};                          if (($crprivs{$rest}{sys} ne $currpriv{sys}) ||
                         $currpriv{crs} = $env{"user.priv.$rolekey.$where"};                              ($crprivs{$rest}{dom} ne $currpriv{dom})
                         if (keys(%crprivs)) {  
                             if (($crprivs{$rest}{sys} ne $currpriv{sys}) ||  
                                 ($crprivs{$rest}{dom} ne $currpriv{dom})  
  ||   ||
                                 ($crprivs{$rest}{crs} ne $currpriv{crs})) {                              ($crprivs{$rest}{crs} ne $currpriv{crs})) {
                                 &gather_roleprivs(\%allroles,\%allgroups,                              &gather_roleprivs(\%allroles,\%allgroups,\%userroles,$where,$role,$tstart,$tend,$status_in_db);
                                                   \%userroles,$where,$role,                              unless (grep(/^\Q$role\E$/,@changed_roles)) {
                                                   $tstart,$tend,$status_in_db);                                  push(@changed_roles,$role);
                                 unless (grep(/^\Q$role\E$/,@changed_roles)) {                              }
                                     push(@changed_roles,$role);                              my $status_in_env =
                                 }                                  &curr_role_status($currstart,$currend,$refresh,$update);
                               if ($status_in_env eq 'active') {
                                 $customprivchg{$rolekey} = $status_in_env;                                  $customprivchg{$rolekey} = $status_in_env;
                             }                              }
                         }                          }
Line 2227  sub update_session_roles { Line 2198  sub update_session_roles {
         my $status_in_env =          my $status_in_env =
             &curr_role_status($currstart,$currend,$refresh,$update);              &curr_role_status($currstart,$currend,$refresh,$update);
         my ($rolekey) = ($envkey =~ /^user\.role\.(.+)$/);          my ($rolekey) = ($envkey =~ /^user\.role\.(.+)$/);
         my ($role,$rest)=split(m{\./},$rolekey,2);          my ($role,$rest)=split(/\./,$rolekey,2);
         $rest = '/'.$rest;   
         if (&Apache::lonnet::delenv($envkey,undef,[$role])) {          if (&Apache::lonnet::delenv($envkey,undef,[$role])) {
             if ($status_in_env eq 'active') {              if ($status_in_env eq 'active') {
                 if ($role eq 'gr') {                  if ($role eq 'gr') {
Line 2293  sub update_session_roles { Line 2263  sub update_session_roles {
         }          }
         $msg .= '<br />'.&mt('However you can continue to use this role until you logout, click the "Re-Select" button, or your session has been idle for more than 24 hours.').'</p>';          $msg .= '<br />'.&mt('However you can continue to use this role until you logout, click the "Re-Select" button, or your session has been idle for more than 24 hours.').'</p>';
     }      }
     &Apache::lonnet::set_userprivs(\%userroles,\%allroles,\%allgroups,\%groups_roles);  
     my ($curr_is_adv,$curr_role_adv,$curr_author,$curr_role_author);  
     $curr_author = $env{'user.author'};  
     if (($env{'request.role'} =~/^au/) || ($env{'request.role'} =~/^ca/) ||  
         ($env{'request.role'} =~/^aa/)) {  
         $curr_role_author=1;  
     }  
     $curr_is_adv = $env{'user.adv'};  
     $curr_role_adv = $env{'request.role.adv'};  
     if (keys(%userroles) > 0) {  
         foreach my $role (@changed_roles) {  
             unless(grep(/^\Q$role\E$/,@rolecodes)) {  
                 push(@rolecodes,$role);  
             }  
         }  
         unless(grep(/^\Qcm\E$/,@rolecodes)) {  
             push(@rolecodes,'cm');  
         }  
         &Apache::lonnet::appenv(\%userroles,\@rolecodes);  
     }  
     my %newenv;  
     if (&Apache::lonnet::is_advanced_user($env{'user.domain'},$env{'user.name'})) {  
         unless ($curr_is_adv) {  
             $newenv{'user.adv'} = 1;  
         }  
     } elsif ($curr_is_adv && !$curr_role_adv) {  
         &Apache::lonnet::delenv('user.adv');  
     }  
     my %authorroleshash =  
         &Apache::lonnet::get_my_roles('','','userroles',['active'],['au','ca','aa']);  
     if (keys(%authorroleshash)) {  
         unless ($curr_author) {  
             $newenv{'user.author'} = 1;  
         }  
     } elsif ($curr_author && !$curr_role_author) {  
         &Apache::lonnet::delenv('user.author');  
     }  
     if ($env{'request.course.id'}) {  
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
         my (@activecrsgroups,$crsgroupschanged);  
         if ($env{'request.course.groups'}) {  
             @activecrsgroups = split(/:/,$env{'request.course.groups'});  
             foreach my $item (keys(%deletedroles)) {  
                 if ($item =~ m{^gr\./\Q$cdom\E/\Q$cnum\E/(\w+)$}) {  
                     if (grep(/^\Q$1\E$/,@activecrsgroups)) {  
                         $crsgroupschanged = 1;  
                         last;  
                     }  
                 }  
             }  
         }  
         unless ($crsgroupschanged) {  
             foreach my $item (keys(%newgroup)) {  
                 if ($item =~ m{^gr\./\Q$cdom\E/\Q$cnum\E/(\w+)$}) {  
                     if ($newgroup{$item} eq 'active') {  
                         $crsgroupschanged = 1;  
                         last;  
                     }  
                 }  
             }  
         }  
         if ((ref($changed_groups{$env{'request.course.id'}}) eq 'HASH') ||  
             (ref($groupchange{"/$cdom/$cnum"}) eq 'HASH') ||  
             ($crsgroupschanged)) {  
             my %grouproles =  &Apache::lonnet::get_my_roles('','','userroles',  
                                                             ['active'],['gr'],[$cdom],1);  
             my @activegroups;  
             foreach my $item (keys(%grouproles)) {  
                 next unless($item =~ /^\Q$cnum\E:\Q$cdom\E/);  
                 my $group;  
                 my ($crsn,$crsd,$role,$remainder) = split(/:/,$item,4);  
                 if ($remainder =~ /:/) {  
                     (my $other,$group) = ($remainder =~ /^([\w:]+):([^:]+)$/);  
                 } else {  
                     $group = $remainder;  
                 }  
                 if ($group ne '') {  
                     push(@activegroups,$group);  
                 }  
             }  
             $newenv{'request.course.groups'} = join(':',@activegroups);  
         }  
     }  
     if (keys(%newenv)) {  
         &Apache::lonnet::appenv(\%newenv);  
     }  
     if (!@changed_roles || !(keys(%changed_groups))) {      if (!@changed_roles || !(keys(%changed_groups))) {
         my ($rolesmsg,$groupsmsg);          my ($rolesmsg,$groupsmsg);
         if (!@changed_roles) {          if (!@changed_roles) {
Line 2412  sub update_session_roles { Line 2295  sub update_session_roles {
     if (@changed_roles > 0) {      if (@changed_roles > 0) {
         if (keys(%newgroup) > 0) {          if (keys(%newgroup) > 0) {
             my $groupmsg;              my $groupmsg;
             my (%curr_groups,%groupdescs,$currcrs);  
             foreach my $item (sort(keys(%newgroup))) {              foreach my $item (sort(keys(%newgroup))) {
                 if (&is_active_course($item,$refresh,$update,\%roleshash)) {                  if (&is_active_course($item,$refresh,$update,\%roleshash)) {
                     if ($item =~ m{^gr\./($match_domain/$match_courseid)/(\w+)$}) {                      $groupmsg .= '<li>'.
                         my ($cdom,$cnum) = split(/\//,$1);                                   &mt('[_1] with status: [_2].',
                         my $group = $2;                                   $item,$newgroup{$item}).'</li>';
                         if ($currcrs ne $cdom.'_'.$cnum) {  
                             if ($currcrs) {  
                                 $groupmsg .= '</ul><li>';  
                             }  
                             $groupmsg .= '<li><b>'.  
                                          $env{'course.'.$cdom.'_'.$cnum.'.description'}.'</b><ul>';  
                             $currcrs = $cdom.'_'.$cnum;  
                         }  
                         my $groupdesc;  
                         unless (ref($curr_groups{$cdom.'_'.$cnum}) eq 'HASH') {  
                             %{$curr_groups{$cdom.'_'.$cnum}} =  
                                 &Apache::longroup::coursegroups($cdom,$cnum);  
                         }  
                         unless ((ref($groupdescs{$cdom.'_'.$cnum}) eq 'HASH') &&  
                             ($groupdescs{$cdom.'_'.$cnum}{$group})) {  
   
                             my %groupinfo =  
                                 &Apache::longroup::get_group_settings($curr_groups{$cdom.'_'.$cnum}{$group});  
                             $groupdescs{$cdom.'_'.$cnum}{$group} =  
                                 &unescape($groupinfo{'description'});  
                         }  
                         $groupdesc = $groupdescs{$cdom.'_'.$cnum}{$group};  
                         if ($groupdesc) {  
                             $groupmsg .= '<li>'.  
                                          &mt('[_1] with status: [_2].',  
                                          '<b>'.$groupdesc.'</b>',$newgroup{$item}).'</li>';  
                         }  
                     }  
                 }  
                 if ($groupmsg) {  
                     $groupmsg .= '</ul></li>';  
                 }                  }
             }              }
             if ($groupmsg) {              if ($groupmsg) {
Line 2458  sub update_session_roles { Line 2309  sub update_session_roles {
             }              }
         }          }
         if (keys(%newrole) > 0) {          if (keys(%newrole) > 0) {
             my $newmsg;              $changemsg .= '<li>'.&mt('New roles').
                             '<ul>';
             foreach my $item (sort(keys(%newrole))) {              foreach my $item (sort(keys(%newrole))) {
                 my $desc = &role_desc($item,$update,$refresh,$now);                  $changemsg .= '<li>'.
                 if ($desc) {                                &mt('[_1] with status: [_2].',
                     $newmsg .= '<li>'.                                $item,$newrole{$item}).'</li>';
                                &mt('[_1] with status: [_2].',  
                                $desc,$newrole{$item}).'</li>';  
                 }  
             }  
             if ($newmsg) {  
                 $changemsg .= '<li>'.&mt('New roles').  
                               '<ul>'.$newmsg.'</ul>'.  
                               '</li>';  
             }              }
               $changemsg .= '</ul></li>';
         }          }
         if (keys(%customprivchg) > 0) {          if (keys(%customprivchg) > 0) {
             my $privmsg;              $changemsg .= '<li>'.
                             &mt('Custom roles with privilege changes').
                             '<ul>';
             foreach my $item (sort(keys(%customprivchg))) {              foreach my $item (sort(keys(%customprivchg))) {
                 my $desc = &role_desc($item,$update,$refresh,$now);                  $changemsg .= '<li>'.$item.'</li>';
                 if ($desc) {  
                     $privmsg .= '<li>'.$desc.'</li>';  
                 }  
             }              }
             if ($privmsg) {              $changemsg .= '</ul></li>';
                 $changemsg .= '<li>'.  
                               &mt('Custom roles with privilege changes').  
                               '<ul>'.$privmsg.'</ul>'.  
                               '</li>';  
              }  
         }          }
         if (keys(%rolechange) > 0) {          if (keys(%rolechange) > 0) {
             my $rolemsg;              $changemsg .= '<li>'.
                             &mt('Existing roles with status changes').'</li>'.
                             '<ul>';
             foreach my $item (sort(keys(%rolechange))) {              foreach my $item (sort(keys(%rolechange))) {
                 my $desc = &role_desc($item,$update,$refresh,$now);    
                 if ($desc) {  
                     $rolemsg .= '<li>'.  
                                 &mt('[_1] status now: [_2].',$desc,  
                                 $rolechange{$item}).'</li>';  
                 }  
             }  
             if ($rolemsg) {  
                 $changemsg .= '<li>'.                  $changemsg .= '<li>'.
                               &mt('Existing roles with status changes').'</li>'.                                &mt('[_1] status now: [_2].',$item,
                               '<ul>'.$rolemsg.'</ul>'.                                $rolechange{$item}).'</li>';
                               '</li>';  
             }              }
               $changemsg .= '</ul></li>';
         }          }
         if (keys(%deletedroles) > 0) {          if (keys(%deletedroles) > 0) {
             my $delmsg;              $changemsg .= '<li>'.
                             &mt('Existing roles now expired').'</li>'.
                             '<ul>';
             foreach my $item (sort(keys(%deletedroles))) {              foreach my $item (sort(keys(%deletedroles))) {
                 my $desc = &role_desc($item,$update,$refresh,$now);                  $changemsg .= '<li>'.$item.'</li>';
                 if ($desc) {  
                     $delmsg .= '<li>'.$desc.'</li>';  
                 }  
             }  
             if ($delmsg) {  
                 $changemsg .= '<li>'.  
                               &mt('Existing roles now expired').'</li>'.  
                               '<ul>'.$delmsg.'</ul>'.  
                               '</li>';  
             }              }
               $changemsg .= '</ul></li>';
         }          }
     }      }
     if ((keys(%changed_groups) > 0) || (keys(%groupchange) > 0)) {      if ((keys(%changed_groups) > 0) || (keys(%groupchange) > 0)) {
Line 2548  sub update_session_roles { Line 2375  sub update_session_roles {
                           &mt('Existing course/community groups with status changes').'</li>'.                            &mt('Existing course/community groups with status changes').'</li>'.
                           '<ul>';                            '<ul>';
             foreach my $crs (sort(keys(%groupchange))) {              foreach my $crs (sort(keys(%groupchange))) {
                 my $cid = $crs;  
                 $cid=~s{^/}{};  
                 $cid=~s{/}{_};  
                 my $crsdesc = $env{'course.'.$cid.'.description'};  
                 my $cdom = $env{'course.'.$cid.'.domain'};  
                 my $cnum = $env{'course.'.$cid.'.num'};  
                 my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);  
                 my %groupdesc;  
                 if (ref($groupchange{$crs}) eq 'HASH') {                  if (ref($groupchange{$crs}) eq 'HASH') {
                     $groupchgmsg .= '<li>'.&mt('Course/Community: [_1]','<b>'.$crsdesc.'</b><ul>');                      $groupchgmsg .= '<li>'.&mt('Course/Community: [_1]','<b>'.$crs.'</b><ul>');
                     foreach my $group (sort(keys(%{$groupchange{$crs}}))) {                      foreach my $group (sort(keys(%{$groupchange{$crs}}))) {
                         unless ($groupdesc{$group}) {                          $groupchgmsg .= '<li>'.&mt('Group: [_1] status now: [_2].','<b>'.$group.'</b>',$groupchange{$crs}{$group}).'</li>';
                             my %groupinfo = &Apache::longroup::get_group_settings($curr_groups{$group});  
                             $groupdesc{$group} =  &unescape($groupinfo{'description'});  
                         }  
                         $groupchgmsg .= '<li>'.&mt('Group: [_1] status now: [_2].','<b>'.$groupdesc{$group}.'</b>',$groupchange{$crs}{$group}).'</li>';  
                     }                      }
                     $groupchgmsg .= '</ul></li>';                      $groupchgmsg .= '</ul></li>';
                 }                  }
Line 2578  sub update_session_roles { Line 2393  sub update_session_roles {
     }      }
     if ($changemsg) {      if ($changemsg) {
         $msg .= '<ul>'.$changemsg.'</ul>';          $msg .= '<ul>'.$changemsg.'</ul>';
     } else {  
         if (&Apache::loncommon::show_course()) {  
             $msg = &mt('No new courses or communities');  
         } else {  
             $msg = &mt('No role changes');  
         }  
     }      }
     return $msg;      &Apache::lonnet::set_userprivs(\%userroles,\%allroles,\%allgroups,\%groups_roles);
 }      my ($curr_is_adv,$curr_role_adv,$curr_author,$curr_role_author);
       $curr_author = $env{'user.author'};
 sub role_desc {      if (($env{'request.role'} =~/^au/) || ($env{'request.role'} =~/^ca/) ||
     my ($item,$update,$refresh,$now) = @_;          ($env{'request.role'} =~/^aa/)) {
     my ($where,$trolecode,$role,$tstatus,$tend,$tstart,$twhere,          $curr_role_author=1;
         $trole,$tremark);      }
     &Apache::lonnet::role_status('user.role.'.$item,$update,$refresh,      $curr_is_adv = $env{'user.adv'};
                                  $now,\$role,\$where,\$trolecode,      $curr_role_adv = $env{'request.role.adv'};
                                  \$tstatus,\$tstart,\$tend);      if (keys(%userroles) > 0) {
     return unless ($role);          foreach my $role (@changed_roles) {
     if ($role =~ /^cr\//) {              unless(grep(/^\Q$role\E$/,@rolecodes)) {
         my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);                  push(@rolecodes,$role);
         $tremark = &mt('Custom role defined by [_1].',$rauthor.':'.$rdomain);  
     }  
     $trole=Apache::lonnet::plaintext($role);  
     my ($tdom,$trest,$tsection)=  
         split(/\//,Apache::lonnet::declutter($where));  
     if (($role eq 'ca') || ($role eq 'aa')) {  
         my $home = &Apache::lonnet::homeserver($trest,$tdom);  
         $home = &Apache::lonnet::hostname($home);  
         $twhere=&mt('User').':&nbsp;'.$trest.'&nbsp; '.&mt('Domain').  
                 ':&nbsp;'.$tdom.'&nbsp; '.&mt('Server').':&nbsp;'.$home;  
     } elsif ($role eq 'au') {  
         my $home = &Apache::lonnet::homeserver  
                        ($env{'user.name'},$env{'user.domain'});  
         $home = &Apache::lonnet::hostname($home);  
         $twhere=&mt('Domain').':&nbsp;'.$tdom.'&nbsp; '.&mt('Server').  
                         ':&nbsp;'.$home;  
     } elsif ($trest) {  
         my $tcourseid=$tdom.'_'.$trest;  
         my $crstype = &Apache::loncommon::course_type($tcourseid);  
         $trole = &Apache::lonnet::plaintext($role,$crstype,$tcourseid);  
         if ($env{'course.'.$tcourseid.'.description'}) {  
             $twhere=$env{'course.'.$tcourseid.'.description'};  
         } else {  
             my %newhash=&Apache::lonnet::coursedescription($tcourseid);  
             if (%newhash) {  
                 $twhere=$newhash{'description'};  
             } else {  
                 $twhere=&mt('Currently not available');  
             }              }
         }          }
         if ($tsection) {          unless(grep(/^\Qcm\E$/,@rolecodes)) {
             $twhere.= '&nbsp; '.&mt('Section').':&nbsp;'.$tsection;              push(@rolecodes,'cm');
         }          }
         if ($role ne 'st') {          &Apache::lonnet::appenv(\%userroles,\@rolecodes);
             $twhere.= '&nbsp; '.&mt('Domain').':&nbsp;'.$tdom;      }
       my %newenv;
       if (&Apache::lonnet::is_advanced_user($env{'user.domain'},$env{'user.name'})) {
           unless ($curr_is_adv) {
               $newenv{'user.adv'} = 1;
         }          }
     } elsif ($tdom) {      } elsif ($curr_is_adv && !$curr_role_adv) {
         $twhere = &mt('Domain').':&nbsp;'.$tdom;          &Apache::lonnet::delenv('user.adv');
     }      }
     my $output;      my %authorroleshash =
     if ($trole) {          &Apache::lonnet::get_my_roles('','','userroles',['active'],['au','ca','aa']);
         $output = $trole;      if (keys(%authorroleshash)) {
         if ($twhere) {          unless ($curr_author) {
             $output .= " -- $twhere";              $newenv{'user.author'} = 1;
         }          }
         if ($tremark) {      } elsif ($curr_author && !$curr_role_author) {
             $output .= '<br />'.$tremark;          &Apache::lonnet::delenv('user.author');
       }
       if ($env{'request.course.id'}) {
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my (@activecrsgroups,$crsgroupschanged);
           if ($env{'request.course.groups'}) {
               @activecrsgroups = split(/:/,$env{'request.course.groups'});
               foreach my $item (keys(%deletedroles)) {
                   if ($item =~ m{^gr\./\Q$cdom\E/\Q$cnum\E/(\w+)$}) {
                       if (grep(/^\Q$1\E$/,@activecrsgroups)) {
                           $crsgroupschanged = 1;
                           last;
                       }
                   }
               }
           }
           unless ($crsgroupschanged) {
               foreach my $item (keys(%newgroup)) {
                   if ($item =~ m{^gr\./\Q$cdom\E/\Q$cnum\E/(\w+)$}) {
                       if ($newgroup{$item} eq 'active') {
                           $crsgroupschanged = 1;
                           last;
                       }
                   }
               }
           }
           if ((ref($changed_groups{$env{'request.course.id'}}) eq 'HASH') ||
               (ref($groupchange{"/$cdom/$cnum"}) eq 'HASH') ||
               ($crsgroupschanged)) {
               my %grouproles =  &Apache::lonnet::get_my_roles('','','userroles',
                                                               ['active'],['gr'],[$cdom],1);
               my @activegroups;
               foreach my $item (keys(%grouproles)) {
                   next unless($item =~ /^\Q$cnum\E:\Q$cdom\E/);
                   my $group;
                   my ($crsn,$crsd,$role,$remainder) = split(/:/,$item,4);
                   if ($remainder =~ /:/) {
                       (my $other,$group) = ($remainder =~ /^([\w:]+):([^:]+)$/);
                   } else {
                       $group = $remainder;
                   }
                   if ($group ne '') {
                       push(@activegroups,$group);
                   }
               }
               $newenv{'request.course.groups'} = join(':',@activegroups);
         }          }
     }      }
     return $output;      if (keys(%newenv)) {
           &Apache::lonnet::appenv(\%newenv);
       }
       return $msg;
 }  }
   
 sub curr_role_status {  sub curr_role_status {
Line 2712  sub is_active_course { Line 2546  sub is_active_course {
 sub get_roles_functions {  sub get_roles_functions {
     my ($rolescount) = @_;      my ($rolescount) = @_;
     my @links;      my @links;
       if ($env{'user.adv'}) {
           if ($env{'form.display'} eq 'showall') {
               push(@links,["javascript:rolesView('noshowall');",'edit-redo-22x22',&mt('Exclude expired roles')]);
           } else {
               push(@links,["javascript:rolesView('showall');",'edit-undo-22x22',&mt('Include expired roles')]);
           }
       }
     push(@links,["javascript:rolesView('doupdate');",'start-here-22x22',&mt('Check for changes')]);      push(@links,["javascript:rolesView('doupdate');",'start-here-22x22',&mt('Check for changes')]);
     if ($env{'environment.canrequest.author'}) {      if ($env{'environment.canrequest.author'}) {
         unless (&Apache::loncoursequeueadmin::is_active_author()) {          unless (&Apache::loncoursequeueadmin::is_active_author()) {
             push(@links,["javascript:rolesView('requestauthor');",'list-add-22x22',&mt('Request author role')]);              push(@links,["javascript:rolesView('requestauthor');",'list-add-22x22',&mt('Request author role')]);
         }          }
     }      }
     if (($rolescount > 3) || ($env{'environment.recentroles'})) {  
         push(@links,['/adm/preferences?action=changerolespref&amp;returnurl=/adm/roles','role_hotlist-22x22',&mt('Hotlist')]);  
     }  
     if (&Apache::lonmenu::check_for_rcrs()) {      if (&Apache::lonmenu::check_for_rcrs()) {
         push(@links,['/adm/requestcourse','rcrs-22x22',&mt('Request course')]);          push(@links,['/adm/requestcourse','rcrs-22x22',&mt('Request course')]);
     }      }
Line 2729  sub get_roles_functions { Line 2567  sub get_roles_functions {
     } else {      } else {
         push(@links,["javascript:rolesView('queued');",'selfenrl-queue-22x22',&mt('Show queued')]);          push(@links,["javascript:rolesView('queued');",'selfenrl-queue-22x22',&mt('Show queued')]);
     }      }
     if ($env{'user.adv'}) {      if (($rolescount > 3) || ($env{'environment.recentroles'})) {
         if ($env{'form.display'} eq 'showall') {          push(@links,['/adm/preferences?action=changerolespref&amp;returnurl=/adm/roles','role_hotlist-22x22',&mt('Hotlist')]);
             push(@links,["javascript:rolesView('noshowall');",'edit-redo-22x22',&mt('Exclude expired')]);  
         } else {  
             push(@links,["javascript:rolesView('showall');",'edit-undo-22x22',&mt('Include expired')]);  
         }  
     }  
     if (&Apache::loncommon::designparm('login.coursecatalog',$env{'user.domain'})) {  
         push(@links,['/adm/coursecatalog','ccat-22x22',&mt('Course catalog')]);  
     }      }
       
     my $funcs = &Apache::lonhtmlcommon::start_funclist();      my $funcs = &Apache::lonhtmlcommon::start_funclist();
     foreach my $link (@links) {      foreach my $link (@links) {
         $funcs .= &Apache::lonhtmlcommon::add_item_funclist(          $funcs .= &Apache::lonhtmlcommon::add_item_funclist(
Line 2757  sub get_queued { Line 2589  sub get_queued {
                                            $env{'user.name'},'^status:');                                             $env{'user.name'},'^status:');
     foreach my $key (keys(%statusinfo)) {      foreach my $key (keys(%statusinfo)) {
         next unless (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending'));          next unless (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending'));
         (undef,my($cdom,$cnum)) = split(/:/,$key);          (undef,my($cdom,$cnum)) = split(':',$key);
         my $requestkey = $cdom.'_'.$cnum;          my $requestkey = $cdom.'_'.$cnum;
         if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {          if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {
             my %history = &Apache::lonnet::restore($requestkey,'courserequests',              my %history = &Apache::lonnet::restore($requestkey,'courserequests',
Line 2773  sub get_queued { Line 2605  sub get_queued {
             if (ref($history{'details'}) eq 'HASH') {              if (ref($history{'details'}) eq 'HASH') {
                 $description = $history{details}{'cdescr'};                  $description = $history{details}{'cdescr'};
             }              }
             @{$reqcrs{$reqtime}} = ($description,$showtype);              @{$reqcrs{$reqtime}} = ($description,$showtype); 
         }          }
     }      }
     my @sortedtimes = sort {$a <=> $b} (keys(%reqcrs));      my @sortedtimes = sort {$a <=> $b} (keys(%reqcrs));

Removed from v.1.269.2.17  
changed lines
  Added in v.1.276


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

Internal Server Error

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

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

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