version 1.315.2.12, 2011/06/16 22:55:17
|
version 1.315.2.15, 2011/11/30 18:34:25
|
Line 1891 sub roles_selector {
|
Line 1891 sub roles_selector {
|
my ($cdom,$cnum) = @_; |
my ($cdom,$cnum) = @_; |
my $crstype = &Apache::loncommon::course_type(); |
my $crstype = &Apache::loncommon::course_type(); |
my $now = time; |
my $now = time; |
my (%courseroles,%seccount); |
my (%courseroles,%seccount,%courseprivs); |
my $is_cc; |
my $is_cc; |
my $role_selector; |
my $role_selector; |
my $ccrole; |
my $ccrole; |
Line 1899 sub roles_selector {
|
Line 1899 sub roles_selector {
|
$ccrole = 'co'; |
$ccrole = 'co'; |
} else { |
} else { |
$ccrole = 'cc'; |
$ccrole = 'cc'; |
} |
} |
|
my $priv; |
|
my $destinationurl = $ENV{'REQUEST_URI'}; |
|
my $reqprivs = &required_privs(); |
|
if (ref($reqprivs) eq 'HASH') { |
|
my $destination = $destinationurl; |
|
$destination =~ s/(\?.*)$//; |
|
if (exists($reqprivs->{$destination})) { |
|
$priv = $reqprivs->{$destination}; |
|
} |
|
} |
if ($env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}) { |
if ($env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}) { |
my ($start,$end) = split(/\./,$env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}); |
my ($start,$end) = split(/\./,$env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}); |
|
|
Line 1912 sub roles_selector {
|
Line 1922 sub roles_selector {
|
} |
} |
} |
} |
if ($is_cc) { |
if ($is_cc) { |
&get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount); |
&get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount,\%courseprivs,$priv); |
} else { |
} else { |
my %gotnosection; |
my %gotnosection; |
foreach my $item (keys(%env)) { |
foreach my $item (keys(%env)) { |
Line 1928 sub roles_selector {
|
Line 1938 sub roles_selector {
|
$gotnosection{$role} = 1; |
$gotnosection{$role} = 1; |
} |
} |
} |
} |
|
if ($priv ne '') { |
|
my $cnumsec = $cnum; |
|
if ($sec ne '') { |
|
$cnumsec .= "/$sec"; |
|
} |
|
$courseprivs{"$role./$cdom/$cnumsec./"} = |
|
$env{"user.priv.$role./$cdom/$cnumsec./"}; |
|
$courseprivs{"$role./$cdom/$cnumsec./$cdom/"} = |
|
$env{"user.priv.$role./$cdom/$cnumsec./$cdom/"}; |
|
$courseprivs{"$role./$cdom/$cnumsec./$cdom/$cnumsec"} = |
|
$env{"user.priv.$role./$cdom/$cnumsec./$cdom/$cnumsec"}; |
|
} |
if (ref($courseroles{$role}) eq 'ARRAY') { |
if (ref($courseroles{$role}) eq 'ARRAY') { |
if ($sec ne '') { |
if ($sec ne '') { |
if (!grep(/^\Q$sec\E$/,@{$courseroles{$role}})) { |
if (!grep(/^\Q$sec\E$/,@{$courseroles{$role}})) { |
Line 1953 sub roles_selector {
|
Line 1975 sub roles_selector {
|
} |
} |
my @roles_order = ($ccrole,'in','ta','ep','ad','st'); |
my @roles_order = ($ccrole,'in','ta','ep','ad','st'); |
if (keys(%courseroles) > 1) { |
if (keys(%courseroles) > 1) { |
$role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles); |
$role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,$priv); |
$role_selector .= '<form name="rolechooser" method="post" action="/adm/roles"> |
$role_selector .= '<form name="rolechooser" method="post" action="/adm/roles"> |
<select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">'; |
<select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">'; |
$role_selector .= '<option value="">'.$switchtext.'</option>'; |
$role_selector .= '<option value="">'.$switchtext.'</option>'; |
Line 1969 sub roles_selector {
|
Line 1991 sub roles_selector {
|
} |
} |
$role_selector .= '</select>'."\n". |
$role_selector .= '</select>'."\n". |
'<input type="hidden" name="destinationurl" value="'. |
'<input type="hidden" name="destinationurl" value="'. |
&HTML::Entities::encode($ENV{'REQUEST_URI'}).'" />'."\n". |
&HTML::Entities::encode($destinationurl).'" />'."\n". |
'<input type="hidden" name="gotorole" value="1" />'."\n". |
'<input type="hidden" name="gotorole" value="1" />'."\n". |
'<input type="hidden" name="selectrole" value="" />'."\n". |
'<input type="hidden" name="selectrole" value="" />'."\n". |
'<input type="hidden" name="switch" value="1" />'."\n". |
'<input type="hidden" name="switch" value="1" />'."\n". |
Line 1979 sub roles_selector {
|
Line 2001 sub roles_selector {
|
} |
} |
|
|
sub get_all_courseroles { |
sub get_all_courseroles { |
my ($cdom,$cnum,$courseroles,$seccount) = @_; |
my ($cdom,$cnum,$courseroles,$seccount,$courseprivs) = @_; |
unless ((ref($courseroles) eq 'HASH') && (ref($seccount) eq 'HASH')) { |
unless ((ref($courseroles) eq 'HASH') && (ref($seccount) eq 'HASH') && |
|
(ref($courseprivs) eq 'HASH')) { |
return; |
return; |
} |
} |
my ($result,$cached) = |
my ($result,$cached) = |
&Apache::lonnet::is_cached_new('getcourseroles',$cdom.'_'.$cnum); |
&Apache::lonnet::is_cached_new('getcourseroles',$cdom.'_'.$cnum); |
if (defined($cached)) { |
if (defined($cached)) { |
if (ref($result) eq 'HASH') { |
if (ref($result) eq 'HASH') { |
if ((ref($result->{'roles'}) eq 'HASH') && |
if ((ref($result->{'roles'}) eq 'HASH') && |
(ref($result->{'seccount'}) eq 'HASH')) { |
(ref($result->{'seccount'}) eq 'HASH') && |
|
(ref($result->{'privs'}) eq 'HASH')) { |
%{$courseroles} = %{$result->{'roles'}}; |
%{$courseroles} = %{$result->{'roles'}}; |
%{$seccount} = %{$result->{'seccount'}}; |
%{$seccount} = %{$result->{'seccount'}}; |
|
%{$courseprivs} = %{$result->{'privs'}}; |
return; |
return; |
} |
} |
} |
} |
Line 2018 sub get_all_courseroles {
|
Line 2043 sub get_all_courseroles {
|
push(@{$courseroles->{$urole}},$usec); |
push(@{$courseroles->{$urole}},$usec); |
} |
} |
} |
} |
|
my $area = '/'.$cdom.'/'.$cnum; |
|
if ($usec ne '') { |
|
$area .= '/'.$usec; |
|
} |
|
if ($role =~ /^cr\//) { |
|
&Apache::lonnet::custom_roleprivs($courseprivs,$urole,$cdom,$cnum,$urole.'.'.$area,$area); |
|
} else { |
|
&Apache::lonnet::standard_roleprivs($courseprivs,$urole,$cdom,$urole.'.'.$area,$cnum,$area); |
|
} |
} |
} |
my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum,['st']); |
my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum,['st']); |
@{$courseroles->{'st'}} = (); |
@{$courseroles->{'st'}} = (); |
|
&Apache::lonnet::standard_roleprivs($courseprivs,'st',$cdom,"st./$cdom/$cnum",$cnum,"/$cdom/$cnum"); |
if (keys(%sections_count) > 0) { |
if (keys(%sections_count) > 0) { |
push(@{$courseroles->{'st'}},keys(%sections_count)); |
push(@{$courseroles->{'st'}},keys(%sections_count)); |
$seccount->{'st'} = scalar(keys(%sections_count)); |
$seccount->{'st'} = scalar(keys(%sections_count)); |
} |
} |
my $rolehash = { |
my $rolehash = { |
'roles' => $courseroles, |
'roles' => $courseroles, |
'seccount' => $seccount, |
'seccount' => $seccount, |
|
'privs' => $courseprivs, |
}; |
}; |
&Apache::lonnet::do_cache_new('getcourseroles',$cdom.'_'.$cnum,$rolehash); |
&Apache::lonnet::do_cache_new('getcourseroles',$cdom.'_'.$cnum,$rolehash); |
return; |
return; |
} |
} |
|
|
sub jump_to_role { |
sub jump_to_role { |
my ($cdom,$cnum,$seccount,$courseroles) = @_; |
my ($cdom,$cnum,$seccount,$courseroles,$courseprivs,$priv) = @_; |
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
this => 'This role has section(s) associated with it.', |
this => 'This role has section(s) associated with it.', |
ente => 'Enter a specific section.', |
ente => 'Enter a specific section.', |
orlb => 'Enter a specific section, or leave blank for no section.', |
orlb => 'Enter a specific section, or leave blank for no section.', |
avai => 'Available sections are:', |
avai => 'Available sections are:', |
youe => 'You entered an invalid section choice:', |
youe => 'You entered an invalid section choice:', |
plst => 'Please try again', |
plst => 'Please try again.', |
|
role => 'The role you selected is not permitted to view the current page.', |
|
swit => 'Switch role, but display Main Menu page instead?', |
); |
); |
my $js; |
my $js; |
if (ref($courseroles) eq 'HASH') { |
if (ref($courseroles) eq 'HASH') { |
Line 2064 sub jump_to_role {
|
Line 2102 sub jump_to_role {
|
' numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n"; |
' numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n"; |
} |
} |
} |
} |
|
my $checkroles = 0; |
|
if ($priv && ref($courseprivs) eq 'HASH') { |
|
my (%disallowed,%allowed,@disallow); |
|
foreach my $role (sort(keys(%{$courseprivs}))) { |
|
my $trole; |
|
if ($role =~ m{^(.+?)\Q./$cdom/$cnum\E}) { |
|
$trole = $1; |
|
} |
|
if (($trole ne '') && ($trole ne 'cm')) { |
|
if ($courseprivs->{$role} =~ /\Q:$priv\E($|:|\&\w+)/) { |
|
$allowed{$trole} = 1; |
|
} else { |
|
$disallowed{$trole} = 1; |
|
} |
|
} |
|
} |
|
foreach my $trole (keys(%disallowed)) { |
|
unless ($allowed{$trole}) { |
|
push(@disallow,$trole); |
|
} |
|
} |
|
if (@disallow > 0) { |
|
$checkroles = 1; |
|
$js .= " var disallow = new Array('".join("','",@disallow)."');\n". |
|
" var rolecheck = 1;\n"; |
|
} |
|
} |
|
if (!$checkroles) { |
|
$js .= " var disallow = new Array();\n". |
|
" rolecheck = 0;\n"; |
|
} |
return <<"END"; |
return <<"END"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
//<![CDATA[ |
//<![CDATA[ |
Line 2071 function adhocRole(roleitem) {
|
Line 2140 function adhocRole(roleitem) {
|
$js |
$js |
var newrole = document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value; |
var newrole = document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value; |
if (newrole == '') { |
if (newrole == '') { |
return; |
return; |
} |
} |
var fullrole = newrole+'./$cdom/$cnum'; |
var fullrole = newrole+'./$cdom/$cnum'; |
var selidx = ''; |
var selidx = ''; |
Line 2080 function adhocRole(roleitem) {
|
Line 2149 function adhocRole(roleitem) {
|
selidx = i; |
selidx = i; |
} |
} |
} |
} |
|
if (rolecheck > 0) { |
|
for (var i=0; i<disallow.length; i++) { |
|
if (disallow[i] == newrole) { |
|
if (confirm("$lt{'role'}\\n$lt{'swit'}")) { |
|
document.rolechooser.destinationurl.value = '/adm/menu'; |
|
} else { |
|
document.rolechooser.elements[roleitem].selectedIndex = 0; |
|
return; |
|
} |
|
} |
|
} |
|
} |
var secok = 1; |
var secok = 1; |
var secchoice = ''; |
var secchoice = ''; |
if (selidx >= 0) { |
if (selidx >= 0) { |
Line 2117 function adhocRole(roleitem) {
|
Line 2198 function adhocRole(roleitem) {
|
return; |
return; |
} |
} |
if (fullrole == "$env{'request.role'}") { |
if (fullrole == "$env{'request.role'}") { |
|
document.rolechooser.elements[roleitem].selectedIndex = 0; |
return; |
return; |
} |
} |
itemid = retrieveIndex('gotorole'); |
itemid = retrieveIndex('gotorole'); |
Line 2142 function retrieveIndex(item) {
|
Line 2224 function retrieveIndex(item) {
|
END |
END |
} |
} |
|
|
|
sub required_privs { |
|
my $privs = { |
|
'/adm/parmset' => 'opa', |
|
'/adm/courseprefs' => 'opa', |
|
'/adm/whatsnew' => 'whn', |
|
'/adm/populate' => 'cst', |
|
'/adm/trackstudent' => 'vsa', |
|
'/adm/statistics' => 'vgr', |
|
}; |
|
unless ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'spreadsheet') { |
|
$privs->{'/adm/classcalc'} = 'vgr', |
|
$privs->{'/adm/assesscalc'} = 'vgr', |
|
$privs->{'/adm/studentcalc'} = 'vgr'; |
|
} |
|
return $privs; |
|
} |
|
|
# ================================================================ Main Program |
# ================================================================ Main Program |
|
|