--- loncom/auth/lonroles.pm 2016/08/13 21:17:38 1.269.2.26 +++ loncom/auth/lonroles.pm 2016/10/23 18:30:32 1.269.2.27 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.269.2.26 2016/08/13 21:17:38 raeburn Exp $ +# $Id: lonroles.pm,v 1.269.2.27 2016/10/23 18:30:32 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -260,7 +260,8 @@ sub handler { my $envkey; my %dcroles = (); - my $numdc = &check_fordc(\%dcroles,$update,$then); + my %dhroles = (); + my ($numdc,$numdh,$numadhoc) = &check_for_adhoc(\%dcroles,\%dhroles,$update,$then); my $loncaparev = $r->dir_config('lonVersion'); # ================================================================== Roles Init @@ -269,8 +270,15 @@ sub handler { my $locknum=&Apache::lonnet::get_locks(); if ($locknum) { return 409; } + my $custom_adhoc; if ($env{'form.newrole'}) { $env{'form.'.$env{'form.newrole'}}=1; +# Check if this is a Domain Helpdesk role trying to enter a course + if ($env{'form.newrole'} =~ m{^cr/($match_domain)/\1\-domainconfig/\w+\./\1/$match_courseid$}) { + if ($dhroles{$1}) { + $custom_adhoc = 1; + } + } } if ($env{'request.course.id'}) { # Check if user is CC trying to select a course role @@ -301,8 +309,26 @@ sub handler { "request.role" => 'cm', "request.role.adv" => $env{'user.adv'}, "request.role.domain" => $env{'user.domain'}}); +# Check if Domain Helpdesk role trying to enter a course needs privs to be created + if ($env{'form.newrole'} =~ m{^cr/($match_domain)/\1\-domainconfig/(\w+)\./\1/($match_courseid)$}) { + my $cdom = $1; + my $rolename = $2; + my $cnum = $3; + if ($custom_adhoc) { + my %adhocroles = &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'}, + 'adhocroles.'.$cdom); + if (keys(%adhocroles)) { + my @adhoc = split(',',$adhocroles{'adhocroles.'.$cdom}); + if (grep(/^\Q$rolename\E$/,@adhoc)) { + if (&Apache::lonnet::check_adhoc_privs($cdom,$cnum,$update,$refresh,$now, + "cr/$cdom/$cdom".'-domainconfig/'.$rolename)) { + &Apache::lonnet::appenv({"environment.internal.$cdom.$cnum.cr/$cdom/$cdom".'-domainconfig/'."$rolename.adhoc" => time}); + } + } + } + } + } elsif ($numdc > 0) { # Check if user is a DC trying to enter a course or author space and needs privs to be created - if ($numdc > 0) { foreach my $envkey (keys(%env)) { # Is this an ad-hoc Coordinator role? if (my ($ccrole,$domain,$coursenum) = @@ -710,6 +736,12 @@ ENDENTERKEY $redirect_url); return OK; } + if ($role eq 'dh') { + my $redirect_url = '/adm/menu/'; + &redirect_user($r,&mt('Loading Domain Helpdesk Menu'), + $redirect_url); + return OK; + } if ($role eq 'sc') { my $redirect_url = '/adm/grades?command=scantronupload'; &redirect_user($r,&mt('Loading Data Upload Page'), @@ -957,7 +989,7 @@ ENDHEADER } # ----------------------------------------------------------------------- Table - if ($numdc > 0) { + if (($numdc > 0) || (($numdh > 0) && ($numadhoc > 0))) { $r->print(&coursepick_jscript()); $r->print(&Apache::loncommon::coursebrowser_javascript(). &Apache::loncommon::authorbrowser_javascript()); @@ -990,9 +1022,12 @@ ENDHEADER $roletext{'user.role.'.$role}->[1]. &Apache::loncommon::end_data_table_row(); } - if ($role =~ m{dc\./($match_domain)/} + if ($role =~ m{^dc\./($match_domain)/$} && $dcroles{$1}) { $output .= &adhoc_roles_row($1,'recent'); + } elsif ($role =~ m{^dh\./($match_domain)/$} + && ($env{'environment.adhocroles.'.$1} ne '')) { + $output .= &adhoc_customroles_row($1,'recent'); } } elsif ($numdc > 0) { unless ($role =~/^error\:/) { @@ -1383,12 +1418,15 @@ sub print_rolerows { &Apache::loncommon::end_data_table_row(); } } - if ($sortrole->{$which} =~ m-dc\./($match_domain)/-) { + if ($sortrole->{$which} =~ m{^user\.role\.dc\./($match_domain)/}) { if (ref($dcroles) eq 'HASH') { if ($dcroles->{$1}) { $output .= &adhoc_roles_row($1,''); } } + } elsif (($sortrole->{$which} =~ m{^user\.role\.dh\./($match_domain)/}) && + ($env{'environment.adhocroles.'.$1} ne '')) { + $output .= &adhoc_customroles_row($1,''); } } } @@ -1645,29 +1683,42 @@ sub check_author_homeserver { } } -sub check_fordc { - my ($dcroles,$update,$then) = @_; +sub check_for_adhoc { + my ($dcroles,$dhroles,$update,$then) = @_; my $numdc = 0; + my $numdh = 0; + my $numadhoc = 0; + my $num_custom_adhoc = 0; if ($env{'user.adv'}) { foreach my $envkey (sort(keys(%env))) { - if ($envkey=~/^user\.role\.dc\.\/($match_domain)\/$/) { - my $dcdom = $1; - my $livedc = 1; + if ($envkey=~/^user\.role\.(dc|dh)\.\/($match_domain)\/$/) { + my $role = $1; + my $roledom = $2; + my $liverole = 1; my ($tstart,$tend)=split(/\./,$env{$envkey}); my $limit = $update; - if ($env{'request.role'} eq 'dc./'.$dcdom.'/') { + if ((($role eq 'dc') && ($env{'request.role'} eq 'dc./'.$roledom.'/')) || + (($role eq 'dh') && ($env{'request.role'} eq 'dh./'.$roledom.'/'))) { $limit = $then; } - if ($tstart && $tstart>$limit) { $livedc = 0; } - if ($tend && $tend <$limit) { $livedc = 0; } - if ($livedc) { - $$dcroles{$dcdom} = $envkey; - $numdc++; + if ($tstart && $tstart>$limit) { $liverole = 0; } + if ($tend && $tend <$limit) { $liverole = 0; } + if ($liverole) { + if ($role eq 'dc') { + $dcroles->{$roledom} = $envkey; + $numdc++; + } else { + $dhroles->{$roledom} = $envkey; + if ($env{'environment.adhocroles.'.$roledom} ne '') { + $numadhoc ++; + } + $numdh++; + } } } } } - return $numdc; + return ($numdc,$numdh,$numadhoc); } sub adhoc_course_role { @@ -1759,15 +1810,16 @@ sub check_forcc { } sub courselink { - my ($dcdom,$rowtype) = @_; + my ($roledom,$rowtype,$role) = @_; my $courseform=&Apache::loncommon::selectcourse_link - ('rolechoice','dccourse'.$rowtype.'_'.$dcdom, - 'dcdomain'.$rowtype.'_'.$dcdom,'coursedesc'.$rowtype.'_'. - $dcdom,$dcdom,undef,'Course/Community'); - my $hiddenitems = ''. - ''. - ''. - ''; + ('rolechoice','course'.$rowtype.'_'.$roledom.'_'.$role, + 'domain'.$rowtype.'_'.$roledom.'_'.$role, + 'coursedesc'.$rowtype.'_'.$roledom.'_'.$role, + $roledom.':'.$role,undef,'Course/Community'); + my $hiddenitems = ''. + ''. + ''. + ''; return $courseform.$hiddenitems; } @@ -1862,7 +1914,8 @@ sub adhoc_roles_row { .&mt('[_1]Ad hoc[_2] roles in domain [_3] --' ,'','',$dcdom) .' '; - my $selectcclink = &courselink($dcdom,$rowtype); + my $role = 'cc'; + my $selectcclink = &courselink($dcdom,$rowtype,$role); my $ccrole = &Apache::lonnet::plaintext('co',undef,undef,1); my $carole = &Apache::lonnet::plaintext('ca'); my $selectcalink = &coauthorlink($dcdom,$rowtype); @@ -1872,6 +1925,25 @@ sub adhoc_roles_row { return $output; } +sub adhoc_customroles_row { + my ($dhdom,$rowtype) = @_; + my $output = &Apache::loncommon::continue_data_table_row() + .' ' + .&mt('[_1]Ad hoc[_2] course/community roles in domain [_3] --', + '','',$dhdom); + my @customroles = split(/,/,$env{'environment.adhocroles.'.$dhdom}); + my $count = 0; + foreach my $role (@customroles) { + next if (($role eq '') || ($role =~ /\W/)); + $output .= ' '.$role.': '.&courselink($dhdom,$rowtype,$role).' |'; + $count ++; + } + if ($count) { + return $output; + } + return; +} + sub recent_filename { my $area=shift; return 'nohist_recent_'.&escape($area);