--- loncom/auth/lonroles.pm 2011/10/21 16:28:49 1.262 +++ loncom/auth/lonroles.pm 2012/08/14 15:45:25 1.270 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.262 2011/10/21 16:28:49 www Exp $ +# $Id: lonroles.pm,v 1.270 2012/08/14 15:45:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -221,10 +221,99 @@ sub handler { } else { $checkingtxt = &mt('Checking for new roles ...'); } - $updateresult = '
'.$checkingtxt.'
'; + $updateresult = ''.$checkingtxt.''; $updateresult .= &update_session_roles(); &Apache::lonnet::appenv({'user.update.time' => $now}); $update = $now; + &reqauthor_check(); + } + +# -------------------------------------------------- Check for author requests + + my $reqauthor; + if ($env{'form.requestauthor'}) { + if ($env{'environment.canrequest.author'}) { + unless (&is_active_author()) { + my $queued = &reqauthor_check(); + my $skipreq; + if ($queued =~ /^approval:\d+$/) { + my ($status,$timestamp) = split(/:/,$env{'environment.requestauthorqueued'}); + if ($status eq 'approval') { + $reqauthor = ''. + &mt('A request for authoring space submitted on [_1] is awaiting approval', + &Apache::lonlocal::locallocaltime($timestamp)). + ''; + } + $skipreq = 1; + } elsif ($queued =~ /^approved:\d+$/) { + my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles', + ['active'],['au'],[$env{'user.domain'}]); + if (keys(%roleshash) > 0) { + $skipreq = 1; + } + } + unless ($skipreq) { + my (@inststatuses,%domconfig); + %domconfig = + &Apache::lonnet::get_dom('configuration', + ['requestauthor'],$env{'user.domain'}); + my $val = &Apache::loncoursequeueadmin::get_processtype('requestauthor',$env{'user.name'}, + $env{'user.domain'},$env{'user.adv'}, + $env{'user.domain'},undef, + \@inststatuses,\%domconfig); + if ($val eq 'automatic') { + if (&Apache::lonnet::assignrole($env{'user.domain'},$env{'user.name'},'/'.$env{'user.domain'}.'/', + 'au',undef,$now,undef,undef,'requestauthor') eq 'ok') { + $reqauthor = ''. + &mt('Access to authoring space has been activated').'
'; + &update_session_roles(); + &Apache::lonnet::appenv({'user.update.time' => $now}); + $update = $now; + } else { + $reqauthor = ''. + &mt('An error occurred while activating your access to authoring space'); + } + } elsif ($val eq 'approval') { + my $domconfiguser = &Apache::lonnet::get_domainconfiguser($env{'user.domain'}); + if (&Apache::lonnet::put('requestauthorqueue',{ $env{'user.name'}.'_'.$val => $now }, + $env{'user.domain'},$domconfiguser) eq 'ok') { + my %userrequest = ( + author => { + timestamp => $now, + status => $val, + }, + author_status => $val, + ); + my $req_notifylist; + if (ref($domconfig{'requestauthor'}) eq 'HASH') { + if (ref($domconfig{'requestauthor'}{'notify'}) eq 'HASH') { + my $req_notifylist = $domconfig{'requestauthor'}{'notify'}{'approval'}; + if ($req_notifylist) { + my $fullname = &Apache::loncommon::plainname($env{'user.name'}, + $env{'user.domain'}); + my $sender = $env{'user.name'}.':'.$env{'user.domain'}; + my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); + &Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist, + "$fullname ($env{'user.name'}:$env{'user.domain'})",undef,$domdesc, + $now,'authorreq',$sender); + } + } + } + my $userresult = + &Apache::lonnet::put('requestauthor',\%userrequest,$env{'user.domain'},$env{'user.name'}); + $reqauthor = ''. + &mt('Your request for authoring space has been submitted for approval.'). + ''; + &Apache::lonnet::appenv({'environment.requestauthorqueued' => $val.':'.$now}); + } else { + $reqauthor = ''. + &mt('An error occurred saving your request for authoring space.'). + ''; + } + } + } + } + } } my $envkey; @@ -266,6 +355,7 @@ sub handler { "request.course.fn" => '', "request.course.uri" => '', "request.course.sec" => '', + "request.course.tied" => '', "request.role" => 'cm', "request.role.adv" => $env{'user.adv'}, "request.role.domain" => $env{'user.domain'}}); @@ -519,7 +609,8 @@ ENDENTERKEY if ($dest =~ m{^/adm/coursedocs\?folderpath}) { if ($env{'request.course.id'} eq $cdom.'_'.$cnum) { my $chome = &Apache::lonnet::homeserver($cnum,$cdom); - &update_content_constraints($cdom,$cnum,$chome,$cdom.'_'.$cnum); + &Apache::loncommon::update_content_constraints($cdom,$cnum,$chome, + $cdom.'_'.$cnum); } } $r->internal_redirect($dest); @@ -603,8 +694,7 @@ ENDENTERKEY if ($role eq 'au') { $redirect_url.=$env{'user.domain'}.'/'.$env{'user.name'}; } else { - $where =~ /\/(.*)$/; - $redirect_url .= $1; + $redirect_url .= $where; } $redirect_url .= '/'; &redirect_user($r,&mt('Entering Construction Space'), @@ -683,6 +773,12 @@ function setToUpdate(thisform) { thisform.submit(); } +function setToRequestAuthor(thisform) { + thisform.requestauthor.value='1'; + thisform.selectrole.value=''; + thisform.submit(); +} + // ]]> ENDHEADER @@ -749,7 +845,12 @@ ENDHEADER &Apache::loncommon::end_page()); return OK; } else { - $r->print($updateresult); + if ($updateresult || $reqauthor) { + $r->print('
'. + $updateresult. + $reqauthor. + '
'); + } if (($ENV{'REDIRECT_QUERY_STRING'}) && ($fn)) { $fn.='?'.$ENV{'REDIRECT_QUERY_STRING'}; } @@ -777,25 +878,80 @@ ENDHEADER ''; } + my ($requestauthor,$requestcrs); + unless ($reqauthor) { + if ($env{'environment.canrequest.author'}) { + unless (&is_active_author()) { + my ($status,$timestamp) = split(/:/,$env{'environment.requestauthorqueued'}); + if ($status eq 'approval') { + $requestauthor = &mt('A request for authoring space submitted on [_1] is awaiting approval',&Apache::lonlocal::locallocaltime($timestamp)); + } elsif (($status eq 'approved') && ($do_update)) { + my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles', + ['active'],['au'],[$env{'user.domain'}]); + if (keys(%roleshash)) { + $requestauthor = &mt('Your request for an author role has been approved.').'
'; + if ($show_course) { + $requestauthor .= &mt('Use the "Check for new courses" button to update your list of roles.'); + } else { + $requestauthor .= &mt('Use the "Check for new roles" button to update your list of roles.'); + } + $requestauthor = ''.$requestauthor.''; + } + } + unless ($requestauthor) { + $requestauthor = + ''. + ''; + } + } + } + } + my $do_update; + unless (($env{'form.source'} eq 'login') || ($env{'form.doupdate'})) { + $do_update = ''. + ''; + } if ($env{'user.adv'}) { my $showall = ' '. ''; - if ($do_update) { + if ($do_update || $requestauthor) { $r->print('
'. ''. &mt('Display').''. - $showall.'
'. - '
'. - &mt('Changes?').''. - $do_update.'

'); + $showall.''); + if ($do_update) { + $r->print('
'. + '
'.&mt('Changes?').''. + $do_update.'
'); + } + if ($requestauthor) { + $r->print('
'. + '
'.&mt('Add author role').''. + $requestauthor.'
'); + } + $r->print('

'); } else { $r->print($showall); } } else { - $r->print('

'.$do_update.'

'); + if ($do_update && $requestauthor) { + $r->print('
'. + '
'.&mt('Changes?').''. + $do_update.'
'. + '
'. + '
'.&mt('Add author role').''. + $requestauthor.'

'); + } elsif ($do_update) { + $r->print('

'.$do_update.'

'); + } elsif ($requestauthor) { + $r->print('

'.$requestauthor.'

'); + } if ($countactive > 0) { $r->print(&Apache::loncoursequeueadmin::queued_selfenrollment()); my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); @@ -955,7 +1111,12 @@ ENDHEADER $r->print('

'.&mt('Current Privileges').'

'); $r->print(&privileges_info()); } - $r->print(&Apache::lonnet::getannounce()); + my $announcements = &Apache::lonnet::getannounce(); + $r->print( + '
'. + '

'.&mt('Announcements').'

'. + $announcements + ) unless (!$announcements); if ($advanced) { my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); $r->print('

' @@ -970,6 +1131,33 @@ ENDHEADER return OK; } +sub is_active_author { + if ($env{'user.role.au./'.$env{'user.domain'}.'/'} =~ /^(\d*)\.(\d*)$/) { + if ((!$1 || $1 < time) && + (!$2 || $2 > time)) { + return 1; + } + } + return; +} + +sub reqauthor_check { + my $queued = $env{'environment.requestauthorqueued'}; + my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'], + $env{'user.domain'},$env{'user.name'}); + my $reqstatus = $reqauthor{'author_status'}; + if (($reqstatus eq '' && $queued ne '') || + ($env{'environment.requestauthorqueued'} !~ /^\Q$reqstatus\E/)) { + if (ref($reqauthor{'author'}) eq 'HASH') { + $queued = $reqstatus.':'.$reqauthor{'author'}{'timestamp'}; + } else { + undef($queued); + } + &Apache::lonnet::appenv({'environment.requestauthorqueued' => $queued}); + } + return $queued; +} + sub gather_roles { my ($update,$refresh,$now,$reinit,$nochoose,$roletext,$sortrole,$roleclass,$futureroles,$timezones,$loncaparev) = @_; my ($countactive,$countfuture,$inrole,$possiblerole) = (0,0,0,''); @@ -1614,19 +1802,17 @@ sub check_forcc { } else { $ccrole = 'cc'; } - if ($cdom ne '' && $cnum ne '') { - if (&Apache::lonnet::is_course($cdom,$cnum)) { - my $envkey = 'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum; - if (defined($env{$envkey})) { - $is_cc = 1; - my ($tstart,$tend)=split(/\./,$env{$envkey}); - my $limit = $update; - if ($env{'request.role'} eq $ccrole.'./'.$cdom.'/'.$cnum) { - $limit = $then; - } - if ($tstart && $tstart>$refresh) { $is_cc = 0; } - if ($tend && $tend <$limit) { $is_cc = 0; } + if (&Apache::lonnet::is_course($cdom,$cnum)) { + my $envkey = 'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum; + if (defined($env{$envkey})) { + $is_cc = 1; + my ($tstart,$tend)=split(/\./,$env{$envkey}); + my $limit = $update; + if ($env{'request.role'} eq $ccrole.'./'.$cdom.'/'.$cnum) { + $limit = $then; } + if ($tstart && $tstart>$refresh) { $is_cc = 0; } + if ($tend && $tend <$limit) { $is_cc = 0; } } } return $is_cc; @@ -1684,43 +1870,6 @@ sub check_release_required { return ($switchserver,$warning); } -sub update_content_constraints { - my ($cdom,$cnum,$chome,$cid) = @_; - my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired'); - my ($reqdmajor,$reqdminor) = split(/\./,$curr_reqd_hash{'internal.releaserequired'}); - my %checkresponsetypes; - foreach my $key (keys(%Apache::lonnet::needsrelease)) { - my ($item,$name,$value) = split(/:/,$key); - if ($item eq 'resourcetag') { - if ($name eq 'responsetype') { - $checkresponsetypes{$value} = $Apache::lonnet::needsrelease{$key} - } - } - } - my $navmap = Apache::lonnavmaps::navmap->new(); - if (defined($navmap)) { - my %allresponses; - foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) { - my %responses = $res->responseTypes(); - foreach my $key (keys(%responses)) { - next unless(exists($checkresponsetypes{$key})); - $allresponses{$key} += $responses{$key}; - } - } - foreach my $key (keys(%allresponses)) { - my ($major,$minor) = split(/\./,$checkresponsetypes{$key}); - if (($major > $reqdmajor) || ($major == $reqdmajor && $minor > $reqdminor)) { - ($reqdmajor,$reqdminor) = ($major,$minor); - } - } - undef($navmap); - } - unless (($reqdmajor eq '') && ($reqdminor eq '')) { - &Apache::lonnet::update_released_required($reqdmajor.'.'.$reqdminor,$cdom,$cnum,$chome,$cid); - } - return; -} - sub courselink { my ($dcdom,$rowtype) = @_; my $courseform=&Apache::loncommon::selectcourse_link @@ -1872,7 +2021,7 @@ sub update_session_roles { ['active','future','previous'], undef,undef,1); my ($msg,@newsec,$oldsec,$currrole_expired,@changed_roles, - %changed_groups,%dbroles, %deletedroles,%allroles,%allgroups, + %changed_groups,%dbroles,%deletedroles,%allroles,%allgroups, %userroles,%checkedgroup,%crprivs,$hasgroups,%rolechange, %groupchange,%newrole,%newgroup,%customprivchg,%groups_roles, @rolecodes); @@ -2109,7 +2258,9 @@ sub update_session_roles { foreach my $priv (@privs) { my ($blank,@prv) = split(/:/,$priv); @prv = map { $_ .= (/\&\w+$/ ? '':'&F') } @prv; - $priv = ':'.join(':',sort(@prv)); + if (@prv) { + $priv = ':'.join(':',sort(@prv)); + } $crprivs{$rest}{$scopes[$i]} = $priv; $i++; } @@ -2213,21 +2364,30 @@ sub update_session_roles { $msg .= '
'.&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.').''; } if (!@changed_roles || !(keys(%changed_groups))) { - $msg .= '

'; if (!@changed_roles && !(keys(%changed_groups))) { + if (($msg ne '') || ($groupsmsg ne '')) { + $msg .= '
    '; + if ($rolesmsg) { + $msg .= '
  • '.$rolesmsg.'
  • '; + } + if ($groupsmsg) { + $msg .= '
  • '.$groupsmsg.'
  • '; + } + $msg .= '
'; + } else { + $msg = ' '.$rolesmsg.'
'; + } return $msg; } } @@ -2280,7 +2440,7 @@ sub update_session_roles { } if (keys(%deletedroles) > 0) { $changemsg .= '
  • '. - &mt('Existing roles deleted').'
  • '. + &mt('Existing roles now expired').''. '
      '; foreach my $item (sort(keys(%deletedroles))) { $changemsg .= '
    • '.$item.'
    • ';