[LON-CAPA-cvs] cvs: rat(version_2_11_X) / lonuserstate.pm

raeburn raeburn at source.lon-capa.org
Tue Jul 2 22:16:44 EDT 2024


raeburn		Wed Jul  3 02:16:44 2024 EDT

  Modified files:              (Branch: version_2_11_X)
    /rat	lonuserstate.pm 
  Log:
  - For 2.11
    Backport 1.150 (part), 1.169 (part), 1.170
  
  
-------------- next part --------------
Index: rat/lonuserstate.pm
diff -u rat/lonuserstate.pm:1.149.2.5 rat/lonuserstate.pm:1.149.2.6
--- rat/lonuserstate.pm:1.149.2.5	Tue Dec 14 22:52:33 2021
+++ rat/lonuserstate.pm	Wed Jul  3 02:16:44 2024
@@ -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 2021/12/14 22:52:33 raeburn Exp $
+# $Id: lonuserstate.pm,v 1.149.2.6 2024/07/03 02:16:44 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -42,7 +42,7 @@
 use Opcode;
 use Apache::lonenc;
 use Fcntl qw(:flock);
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
 use File::Basename;
 
  
@@ -198,6 +198,10 @@
         $errtext.= '<br />'
                   .&mt('Map not loaded: The file [_1] does not exist.',
                        "<tt>$fn</tt>");
+        $hash{'map_type_'.$lpc}='none';
+        if (&is_advanced($courseid)) {
+            $errtext .= &error_detail($parent_rid,$courseid,$ispage,$uri);
+        }
 	return;
     }
 
@@ -388,6 +392,220 @@
     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.',
+                                       '<span class="LC_cusr_emph">','</span>');
+                    } 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].",
+                                           '<span class="LC_cusr_emph">'.$hash{'map_id_'.$parent_pc}.'</span>');
+                        } 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].",
+                                               '<span class="LC_cusr_emph">'.$title.'</span>');
+                            }
+                            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 .= '<br />'.&mt('Hierarchy is: [_1]',
+                                                    '<span class="LC_cusr_emph">'.$folderpath.'</span>');
+                            }
+                        }
+                    }
+                }
+                if ($uri =~ m{^/res/($match_domain)/($match_username)/.+\.(sequence|page)$}) {
+                    ($audomfile,$aunamefile) = ($1,$2);
+                    ($editfile,$filerole,$fileswitch) = &canedit_published($audomfile,$aunamefile);
+                }
+            }
+            if ($errinfo) {
+                $errinfo = '<br />'.$errinfo.'<br />';
+            }
+            if ($editfile) {
+                if ($errinfo ne '') {
+                    $errinfo .= '<br />';
+                }
+                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 .= '.<br />'.&mt('You will need to [_1]switch server[_2].',
+                                             '<a href="/adm/switchserver?otherserver='.$switchserver.'&role='.$rolecode.
+                                             '&origurl='.&escape($fileurl).'">','</a>');
+                } else {
+                    &js_escape(\$fileurl);
+                    $errinfo .= ': <a href="javascript:go('."'$fileurl'".');">'.&mt('Create the missing file').'</a>';
+                }
+            }
+            if ($canedit) {
+                if ($errinfo ne '') {
+                    $errinfo .= '<br />';
+                }
+                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 .= '.<br />'.
+                                    &mt('You will need to [_1]switch server[_2].',
+                                        '<a href="/adm/switchserver?otherserver='.$switchserver.'&role='.$rolecode.
+                                        '&origurl='.&escape($mapurl).'">','</a>');
+                    } else {
+                        &js_escape(\$mapurl);
+                        $errinfo .= ': <a href="javascript:go('."'$mapurl'".');">'.&mt('Edit the map').'</a>';
+                    }
+                } 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 .= ': <a href="javascript:go('."'$dest'".');">'.$linktext.'</a>';
+                }
+                $errinfo .= '<br />';
+            }
+        }
+    }
+    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$/, at ids))) {
+            $switchserver = $auhome;
+        }
+    }
+    return ($canedit,$role,$switchserver);
+}
+
 # -------------------------------------------------------------------- Resource
 #
 #  Parses a resource tag to produce the value to push into the


More information about the LON-CAPA-cvs mailing list