--- loncom/interface/lonmenu.pm 2012/08/07 01:35:47 1.369.2.20 +++ loncom/interface/lonmenu.pm 2012/12/13 06:33:31 1.369.2.26 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.369.2.20 2012/08/07 01:35:47 raeburn Exp $ +# $Id: lonmenu.pm,v 1.369.2.26 2012/12/13 06:33:31 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -443,8 +443,10 @@ sub secondary_menu { } $menu =~ s/\[uname\]/$$author{user}/g; $menu =~ s/\[udom\]/$$author{dom}/g; - - return "
"; + if ($menu) { + $menu = " "; + } + return $menu; } sub create_submenu { @@ -486,7 +488,7 @@ sub registerurl { if ($env{'request.state'} eq 'construct') { $force_title=&Apache::lonxml::display_title(); } - if (($env{'environment.remote'} eq 'off') || + if (($env{'environment.remote'} ne 'on') || ((($env{'request.publicaccess'}) || (!&Apache::lonnet::is_on_map( &unescape($env{'request.noversionuri'})))) && @@ -507,7 +509,7 @@ sub registerurl { } sub innerregister { - my ($forcereg,$bread_crumbs) = @_; + my ($forcereg,$bread_crumbs,$group) = @_; my $const_space = ($env{'request.state'} eq 'construct'); my $is_const_dir = 0; @@ -515,7 +517,7 @@ sub innerregister { $env{'request.registered'} = 1; - my $noremote = ($env{'environment.remote'} eq 'off'); + my $noremote = ($env{'environment.remote'} ne 'on'); undef(@inlineremote); @@ -528,7 +530,12 @@ sub innerregister { $newmail= 'swmenu.setstatus("you have","messages");'; } - my $resurl; + my $resurl; + + if ($env{'request.course.id'} && $env{'request.symb'} eq '') { + $resurl = $env{'request.noversionuri'}; + } + if ( $env{'request.symb'} && $env{'request.course.id'} ) { (my $mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread()); @@ -560,205 +567,93 @@ sub innerregister { &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb(@crumbs); - }elsif (! $const_space){ + } elsif (! $const_space){ #a situation when we're looking at a resource outside of context of a #course or construction space (e.g. with cumulative rights) &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'}); + unless ($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) { + &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'}); + } } my $timesync = ( $noremote ? '' : 'swmenu.syncclock(1000*'.time.');' ); # ============================================================================= # ============================ This is for URLs that actually can be registered if ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/}) || ($forcereg)) { -# -- This applies to homework problems for users with grading privileges - my $crs='/'.$env{'request.course.id'}; - if ($env{'request.course.sec'}) { - $crs.='_'.$env{'request.course.sec'}; - } - $crs=~s/\_/\//g; - - my %swtext; - if ($noremote) { - %swtext = &get_inline_text(); - } else { - %swtext = &get_rc_text(); - } - my $hwkadd=''; - if ($env{'request.symb'} ne '' && - $env{'request.filename'}=~/$LONCAPA::assess_re/) { - if (&Apache::lonnet::allowed('mgr',$crs)) { - $hwkadd.=&switch('','',7,2,'pgrd.png',$swtext{'pgrd'},'grades[_4]', - "gocmd('/adm/grades','gradingmenu')", - 'Content Grades'); - } elsif (&Apache::lonnet::allowed('vgr',$crs)) { - $hwkadd.=&switch('','',7,2,'subm.png',$swtext{'subm'},'missions[_1]', - "gocmd('/adm/grades','submission')", - 'Content Submissions'); - } - } - if ($env{'request.symb'} ne '' && - &Apache::lonnet::allowed('opa',$crs)) { - $hwkadd.=&switch('','',7,3,'pparm.png',$swtext{'pparm'},'parms[_2]', - "gocmd('/adm/parmset','set')", - 'Content Settings'); - } - if ($noremote) { - if ($env{'request.symb'}=~/^uploaded/ && - &Apache::lonnet::allowed('mdc',$crs)) { - $hwkadd.=&switch('','',7,4,'docs.png',$swtext{'docs'},'parms[_2]', - "gocmd('/adm/coursedocs','direct')", - 'Folder/Page Content'); - } - } -# -- End Homework - ### - ### Determine whether or not to display the 'cstr' button for this - ### resource - ### - my $editbutton = ''; - my $noeditbutton = 1; - my ($cnum,$cdom); - if ($env{'request.course.id'}) { - $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - } - if ($env{'user.author'}) { - if ($env{'request.role'}=~/^(aa|ca|au)/) { -# -# We have the role of an author -# - # Set defaults for authors - my ($top,$bottom) = ('con-','struct'); - my $action = "go('/priv/".$env{'user.domain'}.'/'.$env{'user.name'}."');"; - my $cadom = $env{'request.role.domain'}; - my $caname = $env{'user.name'}; - my $desc = "Enter my construction space"; - # Set defaults for co-authors - if ($env{'request.role'} =~ /^ca/) { - ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/); - ($top,$bottom) = ('co con-','struct'); - $action = "go('/priv/".$cadom.'/'.$caname."');"; - $desc = "Enter construction space as co-author"; - } elsif ($env{'request.role'} =~ /^aa/) { - ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/); - ($top,$bottom) = ('co con-','struct'); - $action = "go('/priv/".$cadom.'/'.$caname."');"; - $desc = "Enter construction space as assistant co-author"; - } - # Check that we are on the correct machine - my $home = &Apache::lonnet::homeserver($caname,$cadom); - my $allowed=0; - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } - if (!$allowed) { - $editbutton=&switch('','',6,1,,$top,$bottom,$action,$desc); - $noeditbutton = 0; - } - } -# -# We are an author for some stuff, but currently do not have the role of author. -# Figure out if we have authoring privileges for the resource we are looking at. -# This should maybe become a privilege check in lonnet -# - ## - ## Determine if user can edit url. - ## - my $cfile=''; - my $cfuname=''; - my $cfudom=''; - my $uploaded; - my $switchserver=''; - my $home; - if ($env{'request.filename'}) { - my $file=&Apache::lonnet::declutter($env{'request.filename'}); - if (defined($cnum) && defined($cdom)) { - $uploaded = &is_course_upload($file,$cnum,$cdom); - } - if (!$uploaded) { - - $file=~s{^(priv/$match_domain/$match_username)}{/$1}; - $file=~s{^($match_domain/$match_username)}{/priv/$1}; - - # Check that the user has permission to edit this resource - my $setpriv = 1; - ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$setpriv); - if (defined($cfudom)) { - $home=&Apache::lonnet::homeserver($cfuname,$cfudom); - my $allowed=0; - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } - if ($allowed) { - $cfile=$file; - } else { - $switchserver=$file; - } - } - } - } - # Finally, turn the button on or off - if (($cfile || $switchserver) && !$const_space) { - my $nocrsedit; - # Suppress display where CC has switched to student role. - if ($env{'request.course.id'}) { - unless(&Apache::lonnet::allowed('mdc', - $env{'request.course.id'})) { - $nocrsedit = 1; - } - } - if ($nocrsedit) { - $editbutton=&clear(6,1); - } else { - my $bot = "go('$cfile')"; - if ($switchserver) { - if ( $env{'request.symb'} && $env{'request.course.id'} ) { - $cfile = '/adm/switchserver?otherserver='.$home.'&role='. - &HTML::Entities::encode($env{'request.role'},'"<>&').'&symb='. - &HTML::Entities::encode($env{'request.symb'},'"<>&'); - $bot = "need_switchserver('$cfile');"; - } - } - $editbutton=&switch - ('','',6,1,'pcstr.png',$swtext{'pcstr'},'resource[_2]', - $bot,"Edit this resource"); - $noeditbutton = 0; - } - } elsif ($editbutton eq '') { - $editbutton=&clear(6,1); - } + my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit, + $forceview,$editbutton); + if ($env{'request.noversionuri'} =~ m{^/adm/($match_domain)/($match_username)/aboutme$}) { + ($cfile,$home,$switchserver,$forceedit,$forceview) = + &Apache::lonnet::can_edit_resource($env{'request.noversionuri'},$cnum,$cdom, + &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group); + if (($cfile) && ($home ne '') && ($home ne 'no_host')) { + $editbutton = &get_editbutton($cfile,$home,$switchserver, + $forceedit,$forceview,$forcereg); } - if (($noeditbutton) && ($env{'request.filename'})) { - if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { - my $file=&Apache::lonnet::declutter($env{'request.filename'}); - if (defined($cnum) && defined($cdom)) { - if (&is_course_upload($file,$cnum,$cdom)) { - my $cfile = &edit_course_upload($file,$cnum,$cdom); - if ($cfile) { - $editbutton=&switch - ('','',6,1,'pcstr.png',$swtext{'pcstr'}, - 'resource[_2]',"go('".$cfile."');", - 'Edit this resource'); - } - } - } + } elsif ($env{'request.role'} !~/^(aa|ca|au)/) { + $editbutton = &prepare_functions($resurl,$forcereg,$group); + } + if ($editbutton eq '') { + &clear(6,1); + } + +# +# This applies in course context +# + if ($env{'request.course.id'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'}); + my @privs; + if ($env{'request.symb'} ne '') { + if ($env{'request.filename'}=~/$LONCAPA::assess_re/) { + push(@privs,('mgr','vgr')); + } + push(@privs,'opa'); + } + foreach my $priv (@privs) { + $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'}); + if (!$perms{$priv} && $env{'request.course.sec'} ne '') { + $perms{$priv} = + &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}"); } } - if ($env{'request.course.id'}) { - if ($resurl eq "public/$cdom/$cnum/syllabus") { - if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ /\w/) { - if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { - $editbutton=&switch('','',6,1,'pcstr.png',$swtext{'pcstr'}, - 'resource[_2]', - "go('/adm/courseprefs?phase=display&actions=courseinfo')", - 'Edit this resource'); - } - } - } +# +# Determine whether or not to show Grades and Submissions buttons +# + if ($env{'request.symb'} ne '' && + $env{'request.filename'}=~/$LONCAPA::assess_re/) { + if ($perms{'mgr'}) { + &switch('','',7,2,'pgrd.png','Content Grades','grades[_4]', + "gocmd('/adm/grades','gradingmenu')", + 'Content Grades'); + } elsif ($perms{'vgr'}) { + &switch('','',7,2,'subm.png','Content Submissions','missions[_1]', + "gocmd('/adm/grades','submission')", + 'Content Submissions'); + } + } + if (($env{'request.symb'} ne '') && ($perms{'opa'})) { + &switch('','',7,3,'pparm.png','Content Settings','parms[_2]', + "gocmd('/adm/parmset','set')", + 'Content Settings'); + } +# End grades/submissions check + +# +# This applies to items inside a folder/page modifiable in the course. +# + if (($env{'request.symb'}=~/^uploaded/) && ($perms{'mdc'})) { + &switch('','',7,4,'docs-22x22.png','Folder/Page Content','parms[_2]', + "gocmd('/adm/coursedocs','direct')", + 'Folder/Page Content'); } - ### - ### +# End modifiable folder/page container check + } +# End course context + # Prepare the rest of the buttons - my ($menuitems,$got_prt,$got_wishlist); + my ($menuitems,$got_prt,$got_wishlist,$cstritems); if ($const_space) { # # We are in construction space @@ -778,12 +673,16 @@ sub innerregister { # Probably should be in mydesk.tab # $menuitems=(<