--- rat/lonuserstate.pm 2022/10/05 22:54:00 1.149.2.5.2.3 +++ rat/lonuserstate.pm 2021/08/10 15:28:14 1.166 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construct and maintain state and binary representation of course for user # -# $Id: lonuserstate.pm,v 1.149.2.5.2.3 2022/10/05 22:54:00 raeburn Exp $ +# $Id: lonuserstate.pm,v 1.166 2021/08/10 15:28:14 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,7 +42,7 @@ use Safe::Hole; use Opcode; use Apache::lonenc; use Fcntl qw(:flock); -use LONCAPA qw(:DEFAULT :match); +use LONCAPA qw(:DEFAULT :match); use File::Basename; @@ -199,10 +199,6 @@ sub loadmap { $errtext.= '
' .&mt('Map not loaded: The file [_1] does not exist.', "$fn"); - $hash{'map_type_'.$lpc}='none'; - if (&is_advanced($courseid)) { - $errtext .= &error_detail($parent_rid,$courseid,$ispage,$uri); - } return; } @@ -260,9 +256,9 @@ sub loadmap { push(@map_ids, $resource_id); if ($hash{'src_'.$lpc.'.'.$resource_id}) { $rescount{$lpc} ++; - if (($hash{'src_'.$lpc.'.'.$resource_id}=~/\.sequence$/) || + if (($hash{'src_'.$lpc.'.'.$resource_id}=~/\.sequence$/) || ($hash{'src_'.$lpc.'.'.$resource_id}=~/\.page$/)) { - $mapcount{$lpc} ++; + $mapcount{$lpc} ++; } } unless ($codechecked) { @@ -393,220 +389,6 @@ sub is_advanced { return $advanced; } -sub error_detail { - my ($parent_rid,$courseid,$ispage,$uri) = @_; - my $errinfo; - if ($courseid) { - my $courseurl = &Apache::lonnet::courseid_to_courseurl($courseid); - if ($parent_rid =~ /^(\d+)\.(\d+)$/) { - my ($parent_pc,$parent_id) = ($1,$2); - my ($parent_type,$published,$uploaded,$canedit,$role,$switchserver,$audom,$auname, - $editfile,$filerole,$fileswitch,$audomfile,$aunamefile); - if (($parent_pc eq '0') && ($hash{'map_id_1'} =~ m{^/res/($match_domain)/($match_username)/.+\.(sequence|page)$})) { - ($audomfile,$aunamefile) = ($1,$2); - ($editfile,$filerole,$fileswitch) = &canedit_published($audomfile,$aunamefile); - $errinfo = &mt('Top level published sequence file is missing.'); - } else { - if ($parent_pc eq '1') { - if ($hash{'map_id_1'} eq "/uploaded$courseurl/default.sequence") { - $uploaded = 1; - if (&Apache::lonnet::allowed('mdc',$courseid)) { - $canedit = 1; - } - $errinfo = &mt('Map is referenced in the top level ([_1]Main Content[_2]) folder.', - '',''); - } elsif ($hash{'map_id_1'} =~ m{^/res/($match_domain)/($match_username)/.+\.(sequence|page)$}) { - ($audom,$auname) = ($1,$2); - ($canedit,$role,$switchserver) = &canedit_published($audom,$auname); - $published = 1; - $errinfo = &mt('Map is referenced in the top level published sequence file.'); - } - } else { - if ($hash{'map_id_'.$parent_pc} =~ m{^\Q/uploaded$courseurl/default_\E\d+\.(sequence|page)$}) { - $uploaded = 1; - if (&Apache::lonnet::allowed('mdc',$courseid)) { - $canedit = 1; - } - } elsif ($hash{'map_id_'.$parent_pc} =~ m{^/res/($match_domain)/($match_username)/.+\.(sequence|page)$}) { - ($audom,$auname) = ($1,$2); - ($canedit,$role,$switchserver) = &canedit_published($audom,$auname); - $published = 1; - } - if (exists($hash{'ids_'.$hash{'map_id_'.$parent_pc}})) { - $parent_type = $hash{'map_type_'.$parent_pc}; - if ($published) { - $errinfo = &mt("Map is referenced in the published $parent_type file: [_1].", - ''.$hash{'map_id_'.$parent_pc}.''); - } else { - my $title = $hash{'title_'.$hash{'ids_'.$hash{'map_id_'.$parent_pc}}}; - if ($title ne '') { - my $mapdesc; - if ($parent_type eq 'sequence') { - $mapdesc = 'folder'; - } else { - $mapdesc = 'composite page'; - } - $errinfo = &mt("Map is referenced in the $mapdesc named: [_1].", - ''.$title.''); - } - my @containers = split(/,/,$hash{'map_hierarchy_'.$parent_pc}); - shift(@containers); - my $folderpath; - foreach my $id (@containers) { - my $name; - if ($id == 1) { - $name = &mt('Main Content'); - } elsif ($hash{'title_'.$hash{'ids_'.$hash{'map_id_'.$id}}} ne '') { - $name = $hash{'title_'.$hash{'ids_'.$hash{'map_id_'.$id}}}; - } - if ($name ne '') { - $folderpath .= $name.' » '; - } - } - if ($title eq '') { - $folderpath =~ s/\Q » \E$//; - } else { - $folderpath .= $title; - } - if ($folderpath) { - $errinfo .= '
'.&mt('Hierarchy is: [_1]', - ''.$folderpath.''); - } - } - } - } - if ($uri =~ m{^/res/($match_domain)/($match_username)/.+\.(sequence|page)$}) { - ($audomfile,$aunamefile) = ($1,$2); - ($editfile,$filerole,$fileswitch) = &canedit_published($audomfile,$aunamefile); - } - } - if ($errinfo) { - $errinfo = '
'.$errinfo.'
'; - } - if ($editfile) { - if ($errinfo ne '') { - $errinfo .= '
'; - } - if ($canedit) { - $errinfo .= &mt('One way to rectify this problem is to create and publish the missing file'); - } else { - $errinfo .= &mt('To rectify this problem, create and publish the missing file'); - } - my $fileurl = $uri; - $fileurl =~s{^/res/}{/priv/}; - if ($fileswitch) { - my $rolename = &Apache::lonnet::plaintext($filerole); - my $rolecode; - if ($filerole eq 'au') { - $rolecode = 'au./'.$audomfile.'/'; - } else { - $rolecode = $filerole.'./'.$audomfile.'/'.$aunamefile; - } - $errinfo .= '.
'.&mt('You will need to [_1]switch server[_2].', - '',''); - } else { - &js_escape(\$fileurl); - $errinfo .= ': '.&mt('Create the missing file').''; - } - } - if ($canedit) { - if ($errinfo ne '') { - $errinfo .= '
'; - } - if ($published) { - my $rolename = &Apache::lonnet::plaintext($role); - my $rolecode; - if ($role eq 'au') { - $rolecode = 'au./'.$audom.'/'; - } else { - $rolecode = $role.'./'.$audom.'/'.$auname; - } - if ($editfile) { - $errinfo .= &mt('Another way is to edit the parent map to remove the reference to the missing file'); - } else { - $errinfo .= &mt('To rectify this problem edit the parent map to remove the reference to the missing file'); - } - my $mapurl = $hash{'map_id_'.$parent_pc}; - $mapurl =~s{^/res/}{/priv/}; - if ($switchserver) { - $errinfo .= '.
'. - &mt('You will need to [_1]switch server[_2].', - '',''); - } else { - &js_escape(\$mapurl); - $errinfo .= ': '.&mt('Edit the map').''; - } - } elsif ($uploaded && $courseid) { - my ($dest,$linktext); - my $crstype = &Apache::loncommon::course_type($courseid); - if ($parent_pc eq '1') { - $dest = '/adm/coursedocs?folderpath='.&escape('default&Main%20Content:::::'); - $linktext = &mt('Edit Folder'); - } elsif ($hash{'ids_'.$hash{'map_id_'.$parent_pc}} =~ /^(\d+)\.(\d+)$/) { - my ($editmap,$editidx) = ($1,$2); - my $symb = &Apache::lonnet::encode_symb($hash{'map_id_'.$editmap}, - $editidx,$hash{'map_id_'.$parent_pc}); - $dest = '/adm/coursedocs?command=directnav&symb='.&escape($symb); - if ($parent_type eq 'sequence') { - $linktext = &mt('Edit Folder'); - } else { - $linktext = &mt('Edit Composite Page'); - } - } else { - $dest = '/adm/coursedocs?folderpath='.&escape('default&Main%20Content:::::'); - $linktext = &mt("Edit $crstype"); - } - if ($editfile) { - $errinfo .= &mt("Another way is to use the $crstype Editor to delete the reference to the missing file"); - } else { - $errinfo .= &mt("To rectify this problem use the $crstype Editor to delete the reference to the missing file"); - } - $errinfo .= ': '.$linktext.''; - } - $errinfo .= '
'; - } - } - } - return $errinfo; -} - -sub canedit_published { - my ($audom,$auname) = @_; - my ($canedit,$role,$switchserver); - my $now = time; - if (($auname eq $env{'user.name'}) && ($audom eq $env{'user.domain'})) { - if (exists($env{"user.role.au./$audom/"})) { - my ($start,$end) = split(/\./,$env{"user.role.au./$audom/"}); - unless (($end && $end < $now) || ($start && $start > $now)) { - $canedit = 1; - $role = 'au'; - } - } - } - unless ($canedit) { - foreach my $possrole ('ca','aa') { - if (exists($env{"user.role.$possrole./$audom/$auname"})) { - my ($end,$start) = split(/\./,$env{"user.role.$possrole./$audom/$auname"}); - unless (($end && $end < time) || ($start && $start > time)) { - $canedit = 1; - $role = $possrole; - last; - } - } - } - } - if ($canedit) { - my $auhome = &Apache::lonnet::homeserver($auname,$audom); - my @ids=&Apache::lonnet::current_machine_ids(); - if (($auhome ne 'no_host') && (!grep(/^\Q$auhome\E$/,@ids))) { - $switchserver = $auhome; - } - } - return ($canedit,$role,$switchserver); -} - # -------------------------------------------------------------------- Resource # # Parses a resource tag to produce the value to push into the @@ -1168,7 +950,7 @@ sub traceroute { @deeplink = &Apache::lonnet::EXT('resource.0.deeplink',$symb,'','','','',$cid,\@recurseup); } unless (@deeplink < 2) { - $hash{'deeplinkonly_'.$rid}=join(':',map { &escape($_); } @deeplink); + $hash{'deeplinkonly_'.$rid}=join(':',@deeplink); } if (defined($hash{'conditions_'.$rid})) { @@ -1713,7 +1495,7 @@ sub readmap { if ($redirect) { $retfurl = $url; } - } + } return ($retfurl,$errtext); } @@ -1831,10 +1613,7 @@ sub build_tmp_hashes { } my $deeplink; if ($hash{'deeplinkonly_'.$loginrid} ne '') { - my @deeplinkinfo = map { &unescape($_); } split(/:/,$hash{'deeplinkonly_'.$loginrid}); - unless (@deeplinkinfo < 2) { - $deeplink = $deeplinkinfo[0]; - } + $deeplink = $hash{'deeplinkonly_'.$loginrid}; } if ($deeplink) { my $disallow; @@ -1853,9 +1632,6 @@ sub build_tmp_hashes { } if ($disallow) { &Apache::lonnet::delenv('request.deeplink.login'); - if ($env{'request.deeplink.target'} ne '') { - &Apache::lonnet::delenv('request.deeplink.target'); - } } else { if ($others eq 'hide') { my @recfolders; @@ -2030,6 +1806,10 @@ sub get_mapparam { last; } } + my $recursechk=$usercourseprefix.'.'.$item.'___(rec).'.$what; + if (defined($$useropt{$recursechk})) { + return $$useropt{$recursechk}; + } } } @@ -2051,6 +1831,10 @@ sub get_mapparam { last; } } + my $recursechk=$usercourseprefix.'.['.$cgroup.'].'.$item.'___(rec).'.$what; + if (defined($$courseopt{$recursechk})) { + return $$courseopt{$recursechk}; + } } } @@ -2072,6 +1856,10 @@ sub get_mapparam { last; } } + my $recursechk=$usercourseprefix.'.['.$csec.'].'.$item.'___(rec).'.$what; + if (defined($$courseopt{$recursechk})) { + return $$courseopt{$recursechk}; + } } } @@ -2115,6 +1903,10 @@ sub get_mapparam { last; } } + my $recursechk=$usercourseprefix.'.'.$item.'___(rec).'.$what; + if (defined($$courseopt{$recursechk})) { + return $$courseopt{$recursechk}; + } } } }