--- loncom/interface/lonmenu.pm 2017/01/22 17:10:28 1.369.2.68
+++ loncom/interface/lonmenu.pm 2024/07/03 04:09:36 1.369.2.85
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines to control the menu
#
-# $Id: lonmenu.pm,v 1.369.2.68 2017/01/22 17:10:28 raeburn Exp $
+# $Id: lonmenu.pm,v 1.369.2.85 2024/07/03 04:09:36 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -240,7 +240,7 @@ use vars qw(@desklines %category_names %
my @inlineremote;
sub prep_menuitem {
- my ($menuitem) = @_;
+ my ($menuitem,$listclass,$linkattr) = @_;
return '' unless(ref($menuitem) eq 'ARRAY');
my $link;
if ($$menuitem[1]) { # graphical Link
@@ -250,10 +250,10 @@ sub prep_menuitem {
} else { # textual Link
$link = &mt($$menuitem[3]);
}
- return '
':'').'$link |;
+ . qq| href="$$menuitem[0]" target="_top" $linkattr>$link |;
}
# primary_menu() evaluates @primary_menu and returns a two item array,
@@ -263,6 +263,7 @@ sub prep_menuitem {
# @primary_menu is filled within the BEGIN block of this module with
# entries from mydesk.tab
sub primary_menu {
+ my ($links_disabled) = @_;
my %menu;
# each element of @primary contains following array:
# (link url, icon path, alt text, link text, condition, position)
@@ -294,6 +295,11 @@ sub primary_menu {
if ($position eq '') {
$position = 'right';
}
+ my ($listclass,$linkattr);
+ if ($links_disabled) {
+ $listclass = 'LCisDisabled';
+ $linkattr = 'aria-disabled="true"';
+ }
if (defined($primary_submenu{$title})) {
my ($link,$target);
if ($menuitem->[0] ne '') {
@@ -318,9 +324,10 @@ sub primary_menu {
} else {
$title = &mt($title);
}
- $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1);
+ $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1,undef,$listclass,$linkattr);
} elsif ($link) {
- $menu{$position} .= ''.&mt($title).' ';
+ $menu{$position} .= ($listclass?'':' ').
+ ''.&mt($title).' ';
}
}
} elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink
@@ -331,13 +338,22 @@ sub primary_menu {
'helpdeskmail',
$defdom,$origmail);
if ($to ne '') {
- $menu{$position} .= &prep_menuitem($menuitem);
+ $menu{$position} .= &prep_menuitem($menuitem,$listclass,$linkattr);
}
} else {
- $menu{$position} .= ''.&Apache::loncommon::top_nav_help('Help').' ';
+ $menu{$position} .= ($listclass?'':' ').
+ &Apache::loncommon::top_nav_help('Help',$linkattr).
+ ' ';
+ }
+ } elsif ($$menuitem[3] eq 'Log In') {
+ if ($public) {
+ if (&Apache::lonnet::get_saml_landing()) {
+ $$menuitem[0] = '/adm/login';
+ }
}
+ $menu{$position} .= prep_menuitem($menuitem,$listclass,$linkattr);
} else {
- $menu{$position} .= prep_menuitem($menuitem);
+ $menu{$position} .= prep_menuitem($menuitem,$listclass,$linkattr);
}
}
my @output = ('','');
@@ -376,7 +392,7 @@ sub getauthor{
}
sub secondary_menu {
- my ($httphost) = @_;
+ my ($httphost,$links_disabled) = @_;
my $menu;
my $crstype = &Apache::loncommon::course_type();
@@ -399,7 +415,8 @@ sub secondary_menu {
my $canmgr = &Apache::lonnet::allowed('mgr', $crs_sec);
my $author = &getauthor();
- my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv);
+ my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv,$grouptools);
+ $grouptools = 0;
if ($env{'request.course.id'}) {
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
@@ -422,6 +439,22 @@ sub secondary_menu {
$showresv = 1;
}
}
+ if ($env{'request.course.groups'} ne '') {
+ foreach my $group (split(/:/,$env{'request.course.groups'})) {
+ next unless ($group =~ /^\w+$/);
+ my @privs = split(/:/,$env{"user.priv.$env{'request.role'}./$cdom/$cnum/$group"});
+ shift(@privs);
+ if (@privs) {
+ $grouptools ++;
+ }
+ }
+ }
+ }
+
+ my ($listclass,$linkattr);
+ if ($links_disabled) {
+ $listclass = 'LCisDisabled';
+ $linkattr = 'aria-disabled="true"';
}
my ($canmodifycoauthor);
@@ -433,11 +466,6 @@ sub secondary_menu {
}
}
- my %groups = &Apache::lonnet::get_active_groups(
- $env{'user.domain'}, $env{'user.name'},
- $env{'course.' . $env{'request.course.id'} . '.domain'},
- $env{'course.' . $env{'request.course.id'} . '.num'});
-
my ($roleswitcher_js,$roleswitcher_form);
foreach my $menuitem (@secondary_menu) {
@@ -469,7 +497,7 @@ sub secondary_menu {
next if $$menuitem[4] eq 'params'
&& (!$canmodpara && !$canviewpara);
next if $$menuitem[4] eq 'nvcg'
- && ($canviewgrps || !%groups);
+ && ($canviewgrps || !$grouptools);
next if $$menuitem[4] eq 'showsyllabus'
&& !$showsyllabus;
next if $$menuitem[4] eq 'showfeeds'
@@ -499,13 +527,19 @@ sub secondary_menu {
next if ($item->[2] eq 'mgr' && !$canmgr);
next if ($item->[2] eq 'vcg' && !$canviewgrps);
next if ($item->[2] eq 'crsedit' && !$canedit && !$canvieweditor);
+ next if ($item->[2] eq 'params' && !$canmodpara && !$canviewpara);
+ next if ($item->[2] eq 'author' && !$author);
+ next if ($item->[2] eq 'cca' && !$canmodifycoauthor);
push(@scndsub,$item);
}
}
if (@scndsub > 0) {
- $menu .= &create_submenu($link,$target,$title,\@scndsub,1);
+ $menu .= &create_submenu($link,$target,&mt($title),\@scndsub,1,undef,
+ $listclass,$linkattr);
} elsif ($link ne '#') {
- $menu .= ''.&mt($title).' ';
+ $menu .= ($listclass?'':' ').
+ ''.
+ &mt($title).' ';
}
}
} elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
@@ -522,14 +556,27 @@ sub secondary_menu {
my $url = $$menuitem[0];
$url =~ s{\[cdom\]/\[cnum\]}{$cdom/$cnum};
if (&Apache::lonnet::is_on_map($url)) {
- unless ($$menuitem[0] =~ /\?register=1/) {
- $$menuitem[0] .= '?register=1';
+ unless ($$menuitem[0] =~ /(\?|\&)register=1/) {
+ $$menuitem[0] .= (($$menuitem[0]=~/\?/)? '&' : '?').'register=1';
}
} else {
- $$menuitem[0] =~ s{\?register=1}{};
+ $$menuitem[0] =~ s{\&?register=1}{};
+ }
+ if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://}) {
+ if (($ENV{'SERVER_PORT'} == 443) || ($env{'request.use_absolute'} =~ m{^https://})) {
+ unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl())) {
+ unless ($$menuitem[0] =~ m{^https?://}) {
+ $$menuitem[0] = 'http://'.$ENV{'SERVER_NAME'}.$$menuitem[0];
+ }
+ unless ($$menuitem[0] =~ /(\&|\?)usehttp=1/) {
+ $$menuitem[0] .= (($$menuitem[0]=~/\?/) ? '&' : '?').'usehttp=1';
+ }
+ }
+ }
}
+ $$menuitem[0] = &HTML::Entities::encode($$menuitem[0],'&<>"');
}
- $menu .= &prep_menuitem(\@$menuitem);
+ $menu .= &prep_menuitem(\@$menuitem,$listclass,$linkattr);
}
}
if ($menu =~ /\[url\].*\[symb\]/) {
@@ -546,7 +593,7 @@ sub secondary_menu {
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
($escurl = $env{'request.filename'}) =~ s{^\Q$londocroot\E}{};
$escurl = &escape($escurl);
- }
+ }
$menu =~ s/\[url\]/$escurl/g;
$menu =~ s/\[symb\]/$escsymb/g;
}
@@ -566,7 +613,7 @@ sub secondary_menu {
}
sub create_submenu {
- my ($link,$target,$title,$submenu,$translate,$addclass) = @_;
+ my ($link,$target,$title,$submenu,$translate,$addclass,$listclass,$linkattr) = @_;
return unless (ref($submenu) eq 'ARRAY');
my $disptarget;
if ($target ne '') {
@@ -581,7 +628,7 @@ sub create_submenu {
# $link and $title are only used in the initial string written in $menu
# as seen above, not needed for nested submenus
- $menu .= &build_submenu($target, $submenu, $translate, '1');
+ $menu .= &build_submenu($target, $submenu, $translate, '1', $listclass, $linkattr);
$menu .= '';
return $menu;
@@ -591,7 +638,7 @@ sub create_submenu {
# build the dropdown (and nested submenus) recursively
# see perldoc create_submenu documentation for further information
sub build_submenu {
- my ($target, $submenu, $translate, $first_level) = @_;
+ my ($target, $submenu, $translate, $first_level, $listclass, $linkattr) = @_;
unless (@{$submenu}) {
return '';
}
@@ -635,13 +682,29 @@ sub build_submenu {
next unless (($env{'user.name'} ne '') && ($env{'user.domain'} ne ''));
$href =~ s/\[domain\]/$env{'user.domain'}/g;
$href =~ s/\[user\]/$env{'user.name'}/g;
+ } elsif (($href =~ m{^/adm/preferences\?}) && ($href =~ /\[returnurl\]/)) {
+ my $returnurl = $ENV{'REQUEST_URI'};
+ if ($ENV{'REQUEST_URI'} =~ m{/adm/preferences\?action=(?:changedomcoord|authorsettings)\&returnurl=([^\&]+)$}) {
+ $returnurl = $1;
+ }
+ if (($returnurl =~ m{^/adm/createuser($|\?action=)}) ||
+ ($returnurl =~ m{^/priv/$match_domain/$match_username}) ||
+ ($returnurl =~ m{^/res(/?$|/$match_domain/$match_username)})) {
+ $returnurl =~ s{\?.*$}{};
+ $returnurl = '&returnurl='.&HTML::Entities::encode($returnurl,'"<>&\'');
+ } else {
+ undef($returnurl);
+ }
+ $href =~ s/\[returnurl\]/$returnurl/;
}
unless (($href eq '') || ($href =~ /^\#/)) {
$target = ' target="_top"';
}
- $menu .= '';
- $menu .= '' . $title . ' ';
+ $menu .= ' ';
+ $menu .= '' . $title . ' ';
$menu .= ' ';
}
}
@@ -678,7 +741,7 @@ sub registerurl {
}
sub innerregister {
- my ($forcereg,$bread_crumbs,$group,$pagebuttonshide) = @_;
+ my ($forcereg,$bread_crumbs,$group,$pagebuttonshide,$hostname) = @_;
my $const_space = ($env{'request.state'} eq 'construct');
my $is_const_dir = 0;
@@ -699,38 +762,52 @@ sub innerregister {
$newmail= 'swmenu.setstatus("you have","messages");';
}
- my ($mapurl,$resurl);
+ my ($mapurl,$resurl,$crstype,$navmap);
if ($env{'request.course.id'}) {
+#
+#course_type: Course or Community
+#
+ $crstype = &Apache::loncommon::course_type();
if ($env{'request.symb'}) {
- ($mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
+ my $ignorenull;
+ unless ($env{'request.noversionuri'} eq '/adm/navmaps') {
+ $ignorenull = 1;
+ }
+ my $symb = &Apache::lonnet::symbread('','',$ignorenull);
+ ($mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb($symb);
my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};
my $maptitle = &Apache::lonnet::gettitle($mapurl);
- my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());
-
+ my $restitle = &Apache::lonnet::gettitle($symb);
-#SD
-#course_type only Course and Community?
-#
- my @crumbs;
- unless (($forcereg) &&
- ($env{'request.noversionuri'} eq '/adm/navmaps') &&
- ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) {
- @crumbs = ({text => Apache::loncommon::course_type()
- . ' Contents',
- href => "Javascript:gopost('/adm/navmaps','')"});
+ my (@crumbs,@mapcrumbs);
+ if (($env{'request.noversionuri'} ne '/adm/navmaps') && ($mapurl ne '') &&
+ ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'})) {
+ $navmap = Apache::lonnavmaps::navmap->new();
+ if (ref($navmap)) {
+ @mapcrumbs = $navmap->recursed_crumbs($mapurl,$restitle);
+ }
}
+ @crumbs = ({text => $crstype.' Contents',
+ href => "Javascript:gopost('/adm/navmaps','')"});
if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) {
- push(@crumbs, {text => '...',
- no_mt => 1});
+ if (@mapcrumbs) {
+ push(@crumbs,@mapcrumbs);
+ } else {
+ push(@crumbs, {text => '...',
+ no_mt => 1});
+ }
}
- push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle
- && $maptitle ne 'default.sequence'
- && $maptitle ne $coursetitle);
-
- push @crumbs, {text => $restitle, no_mt => 1} if $restitle;
+ unless ((@mapcrumbs) || (!$maptitle) || ($maptitle eq 'default.sequence') ||
+ ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) {
+ push @crumbs, {text => $maptitle, no_mt => 1,
+ href => &Apache::lonnet::clutter($mapurl).'?navmap=1'};
+ }
+ if ($restitle && !@mapcrumbs) {
+ push(@crumbs,{text => $restitle, no_mt => 1});
+ }
my @tools;
if ($env{'request.filename'} =~ /\.page$/) {
my %breadcrumb_tools = &Apache::lonhtmlcommon::current_breadcrumb_tools();
@@ -746,7 +823,6 @@ sub innerregister {
} else {
$resurl = $env{'request.noversionuri'};
my $courseurl = &Apache::lonnet::courseid_to_courseurl($env{'request.course.id'});
- my $crstype = &Apache::loncommon::course_type();
my $title = &mt('View Resource');
if ($resurl =~ m{^\Q/uploaded$courseurl/supplemental/\E(default|\d+)/}) {
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folderpath','title']);
@@ -756,7 +832,7 @@ sub innerregister {
}
my $trail;
if ($env{'form.folderpath'}) {
- &prepare_functions($resurl,$forcereg,$group,undef,undef,1);
+ &prepare_functions($resurl,$forcereg,$group,undef,undef,1,$hostname);
($trail) =
&Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
} else {
@@ -771,10 +847,10 @@ sub innerregister {
} elsif ($resurl =~ m{^\Q/uploaded$courseurl/portfolio/syllabus/}) {
&Apache::lonhtmlcommon::clear_breadcrumbs();
&prepare_functions('/public'.$courseurl."/syllabus",
- $forcereg,$group,undef,undef,1);
+ $forcereg,$group,undef,undef,1,$hostname);
$title = &mt('Syllabus File');
my ($trail) =
- &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1,$hostname);
return $trail;
}
unless ($env{'request.state'} eq 'construct') {
@@ -811,7 +887,7 @@ sub innerregister {
if (($env{'environment.remote'} eq 'on') && ($env{'request.symb'})) {
&Apache::lonhtmlcommon::clear_breadcrumbs();
}
- $editbutton = &prepare_functions($resurl,$forcereg,$group);
+ $editbutton = &prepare_functions($resurl,$forcereg,$group,'','','',$hostname);
}
if ($editbutton eq '') {
$editbutton = &clear(6,1);
@@ -909,13 +985,31 @@ s&6&1&list.png&Directory&dir[_1]&golist(
s&6&2&rtrv.png&Retrieve&version[_1]&gocstr('/adm/retrieve','/priv/$udom/$uname/$cleandisfn')&Retrieve old version
s&6&3&pub.png&Publish&resource[_3]&gocstr('/adm/publish','/priv/$udom/$uname/$cleandisfn')&Publish this resource
s&7&1&del.png&Delete&resource[_2]&gocstr('/adm/cfile?action=delete','/priv/$udom/$uname/$cleandisfn')&Delete this resource
+ENDMENUITEMS
+#
+# Print only makes sense for certain mime types
+#
+ if ($thisdisfn=~/\.(xml|html|htm|xhtml|xhtm|tex)$/ || $thisdisfn=~/$LONCAPA::assess_re/) {
+ $menuitems .= (<&"'));
+ my $link = '/adm/coursedocs?command=direct&forcesupplement=1&supppath='.
+ "$esc_path&anchor=$suppanchor";
+ if ($env{'request.use_absolute'} ne '') {
+ $link = $env{'request.use_absolute'}.$link;
+ }
&switch('','',7,4,'docs-22x22.png','Edit Folder','parms[_2]',
- "location.href='/adm/coursedocs?command=direct&forcesupplement=1&supppath=$esc_path&anchor=$suppanchor'",
- 'Folder/Page Content','','',1);
+ "location.href='$link'",'Folder/Page Content');
}
}
}
@@ -1612,7 +1774,7 @@ sub prepare_functions {
&advtools_crumbs(@inlineremote);
return $editbutton;
} elsif (($env{'request.registered'}) && (!ref($forbodytag))) {
- return $editbutton;
+ return $editbutton || $viewsrcbutton;
} else {
if (ref($bread_crumbs) eq 'ARRAY') {
if (@inlineremote > 0) {
@@ -2097,14 +2259,18 @@ END
sub utilityfunctions {
my ($httphost) = @_;
my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
- if ($currenturl =~ m{^/adm/wrapper/ext/}
- && $env{'request.external.querystring'} ) {
+ my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
+ if ($currenturl =~ m{^/adm/wrapper/ext/}) {
+ if ($env{'request.external.querystring'}) {
$currenturl .= ($currenturl=~/\?/)?'&':'?'.$env{'request.external.querystring'};
+ }
+ my ($anchor) = ($env{'request.symb'} =~ /(\#[^\#]+)$/);
+ if (($anchor) && ($currenturl !~ /\Q$anchor\E$/)) {
+ $currenturl .= $1;
+ }
}
$currenturl=&Apache::lonenc::check_encrypt(&unescape($currenturl));
- my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
-
my $dc_popup_cid;
if ($env{'user.adv'} && exists($env{'user.role.dc./'.
$env{'course.'.$env{'request.course.id'}.
@@ -2130,6 +2296,10 @@ sub utilityfunctions {
my $countdown = &countdown_toggle_js();
+ my $annotateurl = '/adm/annotation';
+ if ($httphost) {
+ $annotateurl = '/adm/annotations';
+ }
my $hostvar = '
function setLCHost() {
var lcHostname="";
@@ -2156,15 +2326,6 @@ return (<"
+ +"action='$annotateurl'>"
+" "
+"<\\/form>"
+'$end_page_annotate');
@@ -2288,6 +2453,11 @@ function open_StoredLinks_Import(rat) {
newWin.focus();
}
+function open_source() {
+ sourcewin=window.open('/adm/source?inhibitmenu=yes&viewonly=1&filename='+currentURL,'LONsource',
+ 'height=500,width=600,resizable=yes,location=no,menubar=no,toolbar=no,scrollbars=yes');
+}
+
(function (\$) {
\$(document).ready(function () {
\$.single=function(a){return function(b){a[0]=b;return a}}(\$([1]));
@@ -2371,11 +2541,11 @@ sub roles_selector {
}
my ($privref,$gotsymb,$destsymb);
my $destinationurl = $ENV{'REQUEST_URI'};
- if ($destinationurl =~ /\?symb=/) {
+ if ($destinationurl =~ /(\?|\&)symb=/) {
$gotsymb = 1;
} elsif ($destinationurl =~ m{^/enc/}) {
my $plainurl = &Apache::lonenc::unencrypted($destinationurl);
- if ($plainurl =~ /\?symb=/) {
+ if ($plainurl =~ /(\?|\&)symb=/) {
$gotsymb = 1;
}
}
@@ -2519,7 +2689,7 @@ sub roles_selector {
}
}
if (@submenu > 0) {
- $switcher = &create_submenu('','',&mt('Switch role'),\@submenu);
+ $switcher = &create_submenu('#','',&mt('Switch role'),\@submenu);
}
}
return ($js,$form,$switcher);
@@ -2601,78 +2771,85 @@ sub get_customadhoc_roles {
(ref($courseprivs) eq 'HASH') && (ref($roledesc) eq 'HASH')) {
return;
}
- if ($env{"user.role.dh./$cdom/"}) {
- my ($start,$end)=split(/\./,$env{"user.role.dh./$cdom/"});
- my $now = time;
- if (!($start && ($now<$start)) && !($end && ($now>$end))) {
- my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($cdom.'_'.$cnum);
- my %available;
- if (ref($possroles) eq 'ARRAY') {
- map { $available{$_} = 1; } @{$possroles};
- }
- my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
- if (ref($domdefaults{'adhocroles'}) eq 'HASH') {
- if (keys(%{$domdefaults{'adhocroles'}})) {
- my $numsec = 1;
- my @sections;
- my ($allseclist,$cached) =
- &Apache::lonnet::is_cached_new('courseseclist',$cdom.'_'.$cnum);
- if (defined($cached)) {
- if ($allseclist ne '') {
- @sections = split(/,/,$allseclist);
- $numsec += scalar(@sections);
- }
- } else {
- my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
- @sections = sort(keys(%sections_count));
+ my $is_helpdesk = 0;
+ my $now = time;
+ foreach my $role ('dh','da') {
+ if ($env{"user.role.$role./$cdom/"}) {
+ my ($start,$end)=split(/\./,$env{"user.role.$role./$cdom/"});
+ if (!($start && ($now<$start)) && !($end && ($now>$end))) {
+ $is_helpdesk = 1;
+ last;
+ }
+ }
+ }
+ if ($is_helpdesk) {
+ my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($cdom.'_'.$cnum);
+ my %available;
+ if (ref($possroles) eq 'ARRAY') {
+ map { $available{$_} = 1; } @{$possroles};
+ }
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
+ if (ref($domdefaults{'adhocroles'}) eq 'HASH') {
+ if (keys(%{$domdefaults{'adhocroles'}})) {
+ my $numsec = 1;
+ my @sections;
+ my ($allseclist,$cached) =
+ &Apache::lonnet::is_cached_new('courseseclist',$cdom.'_'.$cnum);
+ if (defined($cached)) {
+ if ($allseclist ne '') {
+ @sections = split(/,/,$allseclist);
$numsec += scalar(@sections);
- $allseclist = join(',',@sections);
- &Apache::lonnet::do_cache_new('courseseclist',$cdom.'_'.$cnum,$allseclist);
}
- my (%adhoc,$gotprivs);
- my $prefix = "cr/$cdom/$cdom".'-domainconfig';
- foreach my $role (keys(%{$domdefaults{'adhocroles'}})) {
- next if (($role eq '') || ($role =~ /\W/));
- $seccount->{"$prefix/$role"} = $numsec;
- $roledesc->{"$prefix/$role"} = $description->{$role};
- if ((ref($privref) eq 'ARRAY') && (@{$privref} > 0)) {
- if (exists($env{"user.priv.$prefix/$role./$cdom/$cnum./"})) {
- $courseprivs->{"$prefix/$role./$cdom/$cnum./"} =
- $env{"user.priv.$prefix/$role./$cdom/$cnum./"};
- $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"} =
- $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/"};
- $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"} =
- $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/$cnum"};
- } else {
- unless ($gotprivs) {
- my ($adhocroles,$privscached) =
- &Apache::lonnet::is_cached_new('adhocroles',$cdom);
- if ((defined($privscached)) && (ref($adhocroles) eq 'HASH')) {
- %adhoc = %{$adhocroles};
- } else {
- my $confname = &Apache::lonnet::get_domainconfiguser($cdom);
- my %roledefs = &Apache::lonnet::dump('roles',$cdom,$confname,'rolesdef_');
- foreach my $key (keys(%roledefs)) {
- (undef,my $rolename) = split(/_/,$key);
- if ($rolename ne '') {
- my ($systempriv,$domainpriv,$coursepriv) = split(/\_/,$roledefs{$key});
- $coursepriv = &Apache::lonnet::course_adhocrole_privs($rolename,$cdom,$cnum,$coursepriv);
- $adhoc{$rolename} = join('_',($systempriv,$domainpriv,$coursepriv));
- }
+ } else {
+ my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
+ @sections = sort(keys(%sections_count));
+ $numsec += scalar(@sections);
+ $allseclist = join(',',@sections);
+ &Apache::lonnet::do_cache_new('courseseclist',$cdom.'_'.$cnum,$allseclist);
+ }
+ my (%adhoc,$gotprivs);
+ my $prefix = "cr/$cdom/$cdom".'-domainconfig';
+ foreach my $role (keys(%{$domdefaults{'adhocroles'}})) {
+ next if (($role eq '') || ($role =~ /\W/));
+ $seccount->{"$prefix/$role"} = $numsec;
+ $roledesc->{"$prefix/$role"} = $description->{$role};
+ if ((ref($privref) eq 'ARRAY') && (@{$privref} > 0)) {
+ if (exists($env{"user.priv.$prefix/$role./$cdom/$cnum./"})) {
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./"} =
+ $env{"user.priv.$prefix/$role./$cdom/$cnum./"};
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"} =
+ $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/"};
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"} =
+ $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/$cnum"};
+ } else {
+ unless ($gotprivs) {
+ my ($adhocroles,$privscached) =
+ &Apache::lonnet::is_cached_new('adhocroles',$cdom);
+ if ((defined($privscached)) && (ref($adhocroles) eq 'HASH')) {
+ %adhoc = %{$adhocroles};
+ } else {
+ my $confname = &Apache::lonnet::get_domainconfiguser($cdom);
+ my %roledefs = &Apache::lonnet::dump('roles',$cdom,$confname,'rolesdef_');
+ foreach my $key (keys(%roledefs)) {
+ (undef,my $rolename) = split(/_/,$key);
+ if ($rolename ne '') {
+ my ($systempriv,$domainpriv,$coursepriv) = split(/\_/,$roledefs{$key});
+ $coursepriv = &Apache::lonnet::course_adhocrole_privs($rolename,$cdom,$cnum,$coursepriv);
+ $adhoc{$rolename} = join('_',($systempriv,$domainpriv,$coursepriv));
}
- &Apache::lonnet::do_cache_new('adhocroles',$cdom,\%adhoc);
}
- $gotprivs = 1;
+ &Apache::lonnet::do_cache_new('adhocroles',$cdom,\%adhoc);
}
- ($courseprivs->{"$prefix/$role./$cdom/$cnum./"},
- $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"},
- $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"}) =
- split(/\_/,$adhoc{$role});
+ $gotprivs = 1;
}
+ ($courseprivs->{"$prefix/$role./$cdom/$cnum./"},
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"},
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"}) =
+ split(/\_/,$adhoc{$role});
}
- if ($available{$role}) {
- $courseroles->{"$prefix/$role"} = \@sections;
- }
+ }
+ if ($available{$role}) {
+ $courseroles->{"$prefix/$role"} = \@sections;
}
}
}