--- loncom/auth/lonroles.pm 2016/11/08 23:15:34 1.322 +++ loncom/auth/lonroles.pm 2017/03/08 02:51:13 1.327 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.322 2016/11/08 23:15:34 raeburn Exp $ +# $Id: lonroles.pm,v 1.327 2017/03/08 02:51:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -255,8 +255,9 @@ sub handler { my $envkey; my %dcroles = (); - my %dhroles = (); - my ($numdc,$numdh,$numadhoc) = &check_for_adhoc(\%dcroles,\%dhroles,$update,$then); + my %helpdeskroles = (); + my ($numdc,$numhelpdesk,$numadhoc) = + &check_for_adhoc(\%dcroles,\%helpdeskroles,$update,$then); my $loncaparev = $r->dir_config('lonVersion'); # ================================================================== Roles Init @@ -268,9 +269,9 @@ sub handler { 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 +# Check if this is a Domain Helpdesk or Domain Helpdesk Assistant role trying to enter a course if ($env{'form.newrole'} =~ m{^cr/($match_domain)/\1\-domainconfig/\w+\./\1/$match_courseid$}) { - if ($dhroles{$1}) { + if ($helpdeskroles{$1}) { $custom_adhoc = 1; } } @@ -311,11 +312,9 @@ sub handler { my $cnum = $3; my $sec = $4; 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)) { + my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($cdom.'_'.$cnum,1); + if (ref($possroles) eq 'ARRAY') { + if (grep(/^\Q$rolename\E$/,@{$possroles})) { if (&Apache::lonnet::check_adhoc_privs($cdom,$cnum,$update,$refresh,$now, "cr/$cdom/$cdom".'-domainconfig/'.$rolename,undef,$sec)) { &Apache::lonnet::appenv({"environment.internal.$cdom.$cnum.cr/$cdom/$cdom".'-domainconfig/'."$rolename.adhoc" => time}); @@ -323,9 +322,9 @@ sub handler { } } } - } elsif (($numdc > 0) || ($numdh > 0)) { + } elsif (($numdc > 0) || ($numhelpdesk > 0)) { # 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 DH trying to enter a course and needs privs to be created +# Check if user is a DH or DA trying to enter a course and needs privs to be created foreach my $envkey (keys(%env)) { # Is this an ad-hoc Coordinator role? if ($numdc) { @@ -395,22 +394,13 @@ sub handler { last; } } - if ($numdh) { + if ($numhelpdesk) { # Is this an ad hoc custom role in a course/community? if (my ($domain,$rolename,$coursenum,$sec) = ($envkey =~ m{^form\.cr/($match_domain)/\1\-domainconfig/(\w+)\./\1/($match_courseid)(?:/(\w+)|$)})) { - if ($dhroles{$domain}) { - my @adhoc; - if ($env{'environment.adhocroles.'.$domain}) { - @adhoc = split(',',$env{'environment.adhocroles.'.$domain}); - } else { - my %adhocroles = &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'}, - 'adhocroles.'.$domain); - if (keys(%adhocroles)) { - @adhoc = split(',',$adhocroles{'adhocroles.'.$domain}); - } - } - if ((@adhoc > 0) && ($rolename ne '')) { - if (grep(/^\Q$rolename\E$/,@adhoc)) { + if ($helpdeskroles{$domain}) { + my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($domain.'_'.$coursenum,1); + if (ref($possroles) eq 'ARRAY') { + if (grep(/^\Q$rolename\E$/,@{$possroles})) { if (&Apache::lonnet::check_adhoc_privs($domain,$coursenum,$update,$refresh,$now, "cr/$domain/$domain".'-domainconfig/'.$rolename, undef,$sec)) { @@ -566,7 +556,7 @@ ENDENTERKEY $env{'user.name'}, $env{'user.home'}, "Role ".$trolecode); - + &Apache::lonnet::appenv( {'request.role' => $trolecode, 'request.role.domain' => $cdom, @@ -575,6 +565,15 @@ ENDENTERKEY my $tadv=0; if (($cnum) && ($role ne 'ca') && ($role ne 'aa')) { + if ($role =~ m{^\Qcr/$cdom/$cdom\E\-domainconfig/(\w+)$}) { + my $rolename = $1; + my %domdef = &Apache::lonnet::get_domain_defaults($cdom); + if (ref($domdef{'adhocroles'}) eq 'HASH') { + if (ref($domdef{'adhocroles'}{$rolename}) eq 'HASH') { + &Apache::lonnet::appenv({'request.role.desc' => $domdef{'adhocroles'}{$rolename}{'desc'}}); + } + } + } my $msg; my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum); @@ -675,6 +674,15 @@ ENDENTERKEY } } } + if (($dest =~ m{^\Q/public/$cdom/$cnum/syllabus\E.*(\?|\&)usehttp=1}) || + ($dest =~ m{^\Q/adm/wrapper/ext/\E(?!https:)})) { + if ($ENV{'SERVER_PORT'} == 443) { + my $hostname = $r->hostname(); + if ($hostname ne '') { + $dest = 'http://'.$hostname.$dest; + } + } + } if ($dest =~ m{^/enc/}) { if ($env{'request.role.adv'}) { $dest = &Apache::lonenc::unencrypted($dest); @@ -707,7 +715,7 @@ ENDENTERKEY unless (($dest =~ m{^/enc/}) || ($dest =~ /(\?|\&)symb=.+___\d+___.+/)) { if (($destsymb ne '') && ($destsymb !~ m{^/enc/})) { my $esc_symb = &escape($destsymb); - $dest .= '?symb='.$esc_symb; + $dest .= (($dest =~/\?/)? '&':'?').'symb='.$esc_symb; } } &redirect_user($r, &mt('Entering [_1]', @@ -785,6 +793,12 @@ ENDENTERKEY $redirect_url); return OK; } + if ($role eq 'da') { + my $redirect_url = '/adm/menu/'; + &redirect_user($r,&mt('Loading Domain Helpdesk Assistant Menu'), + $redirect_url); + return OK; + } if ($role eq 'sc') { my $redirect_url = '/adm/grades?command=scantronupload'; &redirect_user($r,&mt('Loading Data Upload Page'), @@ -1047,7 +1061,7 @@ ENDHEADER my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole, $nochoose); &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles, - \%roletext); + \%roletext,$update,$then); my $tremark=''; my $tbg; if ($env{'request.role'} eq 'cm') { @@ -1082,7 +1096,7 @@ ENDHEADER } # ----------------------------------------------------------------------- Table - if (($numdc > 0) || (($numdh > 0) && ($numadhoc > 0))) { + if (($numdc > 0) || (($numhelpdesk > 0) && ($numadhoc > 0))) { $r->print(&coursepick_jscript()); $r->print(&Apache::loncommon::coursebrowser_javascript(). &Apache::loncommon::authorbrowser_javascript()); @@ -1118,9 +1132,8 @@ ENDHEADER 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 ($role =~ m{^(dh|da)\./($match_domain)/$}) { + $output .= &adhoc_customroles_row($1,$2,'recent',$update,$then); } } elsif ($numdc > 0) { unless ($role =~/^error\:/) { @@ -1149,7 +1162,7 @@ ENDHEADER $doheaders ++; } } - &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext); + &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext,$update,$then); if ($countactive > 1) { my $tremark=''; my $tbg; @@ -1226,6 +1239,7 @@ sub gather_roles { my $tryagain = $env{'form.tryagain'}; my @ids = &Apache::lonnet::current_machine_ids(); if (ref($roles_in_env) eq 'HASH') { + my %adhocdesc; foreach my $envkey (sort(keys(%{$roles_in_env}))) { my $button = 1; my $switchserver=''; @@ -1329,8 +1343,27 @@ sub gather_roles { $ttype = &Apache::loncommon::course_type($tcourseid); if ($role !~ /^cr/) { $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid); - } elsif ($role =~ m{^cr/($match_domain)/\1-domainconfig/(\w+)$}) { - $trole = &mt('Helpdesk[_1]',' '.$2); + } elsif ($role =~ m{^\Qcr/$tdom/$tdom\E\-domainconfig/(\w+)$}) { + my $rolename = $1; + my $desc; + if (ref($adhocdesc{$tdom}) eq 'HASH') { + $desc = $adhocdesc{$tdom}{$rolename}; + } else { + my %domdef = &Apache::lonnet::get_domain_defaults($tdom); + if (ref($domdef{'adhocroles'}) eq 'HASH') { + foreach my $rolename (sort(keys(%{$domdef{'adhocroles'}}))) { + if (ref($domdef{'adhocroles'}{$rolename}) eq 'HASH') { + $adhocdesc{$tdom}{$rolename} = $domdef{'adhocroles'}{$rolename}{'desc'}; + $desc = $adhocdesc{$tdom}{$rolename}; + } + } + } + } + if ($desc ne '') { + $trole = $desc; + } else { + $trole = &mt('Helpdesk[_1]',' '.$rolename); + } } else { $trole = (split(/\//,$role,4))[-1]; } @@ -1507,7 +1540,7 @@ sub roletypes { } sub print_rolerows { - my ($r,$doheaders,$roleclass,$sortrole,$dcroles,$roletext) = @_; + my ($r,$doheaders,$roleclass,$sortrole,$dcroles,$roletext,$update,$then) = @_; if ((ref($roleclass) eq 'HASH') && (ref($sortrole) eq 'HASH')) { my @types = &roletypes(); foreach my $type (@types) { @@ -1531,9 +1564,8 @@ sub print_rolerows { $output .= &adhoc_roles_row($1,''); } } - } elsif (($sortrole->{$which} =~ m{^user\.role\.dh\./($match_domain)/}) && - ($env{'environment.adhocroles.'.$1} ne '')) { - $output .= &adhoc_customroles_row($1,''); + } elsif ($sortrole->{$which} =~ m{^user\.role\.(dh|da)\./($match_domain)/}) { + $output .= &adhoc_customroles_row($1,$2,'',$update,$then); } } } @@ -1792,21 +1824,20 @@ sub check_author_homeserver { } sub check_for_adhoc { - my ($dcroles,$dhroles,$update,$then) = @_; + my ($dcroles,$helpdeskroles,$update,$then) = @_; my $numdc = 0; - my $numdh = 0; + my $numhelpdesk = 0; my $numadhoc = 0; my $num_custom_adhoc = 0; if ($env{'user.adv'}) { foreach my $envkey (sort(keys(%env))) { - if ($envkey=~/^user\.role\.(dc|dh)\.\/($match_domain)\/$/) { + if ($envkey=~/^user\.role\.(dc|dh|da)\.\/($match_domain)\/$/) { my $role = $1; my $roledom = $2; my $liverole = 1; my ($tstart,$tend)=split(/\./,$env{$envkey}); my $limit = $update; - if ((($role eq 'dc') && ($env{'request.role'} eq 'dc./'.$roledom.'/')) || - (($role eq 'dh') && ($env{'request.role'} eq 'dh./'.$roledom.'/'))) { + if ($env{'request.role'} eq "$role./$roledom/") { $limit = $then; } if ($tstart && $tstart>$limit) { $liverole = 0; } @@ -1816,17 +1847,20 @@ sub check_for_adhoc { $dcroles->{$roledom} = $envkey; $numdc++; } else { - $dhroles->{$roledom} = $envkey; - if ($env{'environment.adhocroles.'.$roledom} ne '') { - $numadhoc ++; + $helpdeskroles->{$roledom} = $envkey; + my %domdefaults = &Apache::lonnet::get_domain_defaults($roledom); + if (ref($domdefaults{'adhocroles'}) eq 'HASH') { + if (keys(%{$domdefaults{'adhocroles'}})) { + $numadhoc ++; + } } - $numdh++; + $numhelpdesk++; } } } } } - return ($numdc,$numdh,$numadhoc); + return ($numdc,$numhelpdesk,$numadhoc); } sub adhoc_course_role { @@ -2042,20 +2076,25 @@ sub adhoc_roles_row { } sub adhoc_customroles_row { - my ($dhdom,$rowtype) = @_; - my $output = &Apache::loncommon::continue_data_table_row() - .'