--- loncom/interface/lonindexer.pm 2008/09/19 08:50:42 1.182 +++ loncom/interface/lonindexer.pm 2018/08/09 13:52:07 1.229 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Directory Indexer # -# $Id: lonindexer.pm,v 1.182 2008/09/19 08:50:42 bisitz Exp $ +# $Id: lonindexer.pm,v 1.229 2018/08/09 13:52:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,9 +34,8 @@ ## 1. Description of functions ## ## 2. Modules used by this module ## ## 3. Choices for different output views (detailed, summary, xml, etc) ## -## 4. BEGIN block (to be run once after compilation) ## -## 5. Handling routine called via Apache and mod_perl ## -## 6. Other subroutines ## +## 4. Handling routine called via Apache and mod_perl ## +## 5. Other subroutines ## ## ## ############################################################################### @@ -60,7 +59,6 @@ use LONCAPA qw(:match); # ---------------------------------------- variables used throughout the module my %hash; # global user-specific gdbm file my %dirs; # keys are directories, values are the open/close status -my %language; # has the reference information present in language.tab my %dynhash; # hash of hashes for dynamic metadata my %dynread; # hash of directories already read for dynamic metadata my %fieldnames; # Metadata fieldnames @@ -94,15 +92,9 @@ sub handler { undef (@Omit); %fieldnames=&Apache::lonmeta::fieldnames(); -# ------------------------------------- read in machine configuration variables +# --------------------------------------------------------------- get icon path my $iconpath= $r->dir_config('lonIconsURL') . "/"; - my $domain = $r->dir_config('lonDefDomain'); - my $role = $r->dir_config('lonRole'); - my $loadlim = $r->dir_config('lonLoadLim'); - my $servadm = $r->dir_config('lonAdmEMail'); - my $sysadm = $r->dir_config('lonSysEMail'); - my $lonhost = $r->dir_config('lonHostID'); - my $tabdir = $r->dir_config('lonTabDir'); + my $defdom = &Apache::lonnet::default_login_domain(); #SB my $fileclr='#ffffe6'; my $line; @@ -120,8 +112,8 @@ sub handler { my $colspan=''; $extrafield=''; - my $diropendb = - "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_sel_res.db"; + my $diropendb = LONCAPA::tempdir() . + "$env{'user.domain'}_$env{'user.name'}_sel_res.db"; %hash = (); { my %dbfile; @@ -165,6 +157,8 @@ sub handler { ENDSUBM $r->print(&Apache::loncommon::start_page(undef,$js, {'only_body' =>1, + 'add_modal' => 1, + 'add_wishlist' => 1, 'add_entries' => {'onload' => "load();"},} ). @@ -178,29 +172,29 @@ ENDSUBM # --------------------- define extra fields and buttons in case of special mode if ($env{'form.catalogmode'} eq 'interactive') { #SB $extrafield='
- | - | - | - | |||||||||||||||||||||
- | - | - | - | ".&mt('Name')." | \n"); + $r->print("\n"); $r->print(" | ".&mt('Title')." | \n") if ($hash{'display_attrs_0'} == 1); - $r->print(''.&mt("Size")." (".&mt("bytes").") ". + $r->print(' | '.&mt("Size")." (".&mt("bytes").") ". " | \n") if ($hash{'display_attrs_1'} == 1); $r->print("".&mt("Last accessed")." | \n") if ($hash{'display_attrs_2'} == 1); @@ -565,10 +608,23 @@ END if ($hash{'display_attrs_11'} == 1); $r->print("".&mt("Resource")." | \n") if ($hash{'display_attrs_7'} == 1); - $r->print(&Apache::loncommon::end_data_table_header_row()); + $r->print("".&mt("Subject")." | \n") + if ($hash{'display_attrs_12'} == 1); + $r->print("".&mt("Notes")." | \n") + if ($hash{'display_attrs_13'} == 1); + $r->print("".&mt("Abstract")." | \n") + if ($hash{'display_attrs_14'} == 1); + $r->print("".&mt("Grade Level")." | \n") + if ($hash{'display_attrs_15'} == 1); + $r->print("".&mt("Standards")." | \n") + if ($hash{'display_attrs_16'} == 1); + + $r->print(&Apache::loncommon::end_data_table_header_row()); + + # ----------------- read in what directories have previously been set to "open" - foreach (keys %hash) { + foreach (keys(%hash)) { if ($_ =~ /^diropen_status_/) { my $key = $_; $key =~ s/^diropen_status_//; @@ -609,12 +665,12 @@ END pop @uri_com; my $upone = join('/',@uri_com); my @list = qw (0); - &display_line ($r,'opened',$upone.'&viewOneUp',0,$upone,@list); + &display_line ($r,$defdom,'opened',$upone.'&viewOneUp',0,$upone,@list); $indent = 1; } # -------- recursively go through all the directories and output as appropriate - &scanDir ($r,$toplevel,$indent,\%hash); + &scanDir ($r,$toplevel,$indent,\%hash,$defdom); # -------------------------------------------------------------- end the tables $r->print(&Apache::loncommon::end_data_table()); @@ -642,7 +698,7 @@ END # ----------------------------------------------- recursive scan of a directory sub scanDir { - my ($r,$startdir,$indent,$hashref)=@_; + my ($r,$startdir,$indent,$hashref,$defdom)=@_; my $c = $r->connection(); my ($compuri,$curdir); my $dirptr=16384; @@ -654,7 +710,20 @@ sub scanDir { return if ($c->aborted()); #This is a kludge, sorry aboot this my ($strip,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); - next if($strip =~ /.*\.meta$/ | $obs eq '1'); + next if (($strip =~ /\.meta$/) || ($obs)); + if ($dom ne 'domain') { + my ($udom,$uname); + if ($dom eq 'user') { + ($udom) = ($startdir =~ m{^/res/($match_domain)}); + $uname = $strip; + } else { + ($udom,$uname) = ($startdir =~ m{^/res/($match_domain)/($match_courseid)}); + } + if ($udom ne '' && $uname ne '') { + # Don't display "course author" directory. + next if (&Apache::lonnet::is_course($udom,$uname)); + } + } my (@fileparts) = split(/\./,$strip); if ($hash{'display_attrs_9'} != 1) { # if not all versions to be shown @@ -685,8 +754,8 @@ sub scanDir { } } } - &display_line($r,$diropen,$line,$indent,$curdir,$hashref,@list); - &scanDir ($r,$compuri,$indent) if $diropen eq 'opened'; + &display_line($r,$defdom,$diropen,$line,$indent,$curdir,$hashref,@list); + &scanDir ($r,$compuri,$indent,undef,$defdom) if $diropen eq 'opened'; } $indent--; } @@ -695,9 +764,11 @@ sub scanDir { sub get_list { my ($r,$uri)=@_; my @list=(); + my $listerror; + (my $luri = $uri) =~ s/\//_/g; if ($env{'form.updatedisplay'}) { - foreach (keys %hash) { + foreach (keys(%hash)) { delete $hash{$_} if ($_ =~ /^dirlist_files_/); delete $hash{$_} if ($_ =~ /^dirlist_timestamp_files_/); } @@ -718,10 +789,20 @@ sub get_list { $hash{'dirlist_files_'.$luri} = join("\n",@list); } else { # is really a directory - @list = &Apache::lonnet::dirlist($uri); + (my $listref,$listerror) = &Apache::lonnet::dirlist($uri); + if (ref($listref) eq 'ARRAY') { + @list = @{$listref}; + } $hash{'dirlist_files_'.$luri} = join("\n",@list); $hash{'dirlist_timestamp_files_'.$luri} = time; } +#Checking for error messages associated with empty directories or inaccessible servers (See Bug 4984) + if (($listerror eq 'no_such_dir') || ($listerror eq 'no_such_host') || ($listerror eq 'no_host')) { + $r->print("") if ($i != 9 && $hash{'display_attrs_'.$i} == 1); @@ -851,24 +933,32 @@ sub display_line { $r->print(" | \n"); $r->print ('$tabtag"); + $r->print(&mt("Up")." | $tabtag");
$r->print(&Apache::loncommon::end_data_table_row());
return OK;
}
# Do we have permission to look at this?
+ if($filecom[15] ne '1') { return OK if ((!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])) && (!&Apache::lonnet::allowed('bro',$pathprefix.$filecom[0]))); }
- if($filecom[15] ne '1') { return OK if (!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])); }
+ if (($filecom[1] eq 'domain') && ($defdom ne $listname)) {
+ unless (&Apache::lonnet::will_trust('shared',$listname,$defdom)) {
+ return OK;
+ }
+ unless (&Apache::lonnet::will_trust('content',$defdom,$listname)) {
+ return OK;
+ }
+ }
# make absolute links appear on different background
#SB if ($absolute) { $fileclr='#ccdd99'; }
@@ -885,77 +975,96 @@ sub display_line {
my $anchor = $filecom[0];
$anchor =~ s/\W//g;
$r->print ('');
- $r->print ('');
- $r->print ('print (' name="'.$msg.'" type="image" class="LC_indexer_icon" />'.
+$r->print ('');
+ $r->print ('print (' alt="'.$msg.'" class="LC_fileicon" />'.
"\n");
my $quotable_filecom = &Apache::loncommon::escape_single($filecom[0]);
$r->print ('print (' class="LC_icon" />'."\n");
- $r->print (&mt("Domain")." - $listname ");
+ $r->print (' class="LC_fileicon" />'."\n");
+ $r->print (&mt("Domain")." - $listname ");
if (&Apache::lonnet::domain($listname,'description')) {
- $r->print("(".&Apache::lonnet::domain($listname,'description').
+ $r->print(" (".&Apache::lonnet::domain($listname,'description'). ")"); } - $r->print("$tabtag"); + $r->print(" | $tabtag"); $r->print(&Apache::loncommon::end_data_table_row()); return OK; # display user directory } + if ($filecom[1] eq 'user') { + my $domain=(split(m|/|,$startdir))[2]; + if ($defdom ne $domain) { + unless (&Apache::lonnet::will_trust('shared',$domain,$defdom)) { + return OK; + } + unless (&Apache::lonnet::will_trust('content',$defdom,$domain)) { + return OK; + } + } # $r->print(" | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
"); $r->print(&Apache::loncommon::start_data_table_row() - .$extrafield.' | '); + .$extrafield.' | '); &begin_form ($r,$curdir); $r->print (''."\n"); + 'whitespace_21.gif" class="LC_icon" />'."\n"); $r->print (''); - $r->print ('print (' name="'.$msg.'" type="image" class="LC_indexer_icon" />'. + $r->print (''); + $r->print ('print (' alt="'.$msg.'"/>'. "\n"); my $quotable_curdir = &Apache::loncommon::escape_single($curdir); + my $quotable_startdir = &Apache::loncommon::escape_single($startdir); + my $quotable_listname = &Apache::loncommon::escape_single($listname); + $r->print (''); + $iconpath.'quill.gif" class="LC_fileicon" />'); my $domain=(split(m|/|,$startdir))[2]; my $plainname=&Apache::loncommon::plainname($listname,$domain); - $r->print ($listname); - if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); } - $r->print(''.$tabtag); + $r->print ($listname.''); + + if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); } +# Wishlistlink + $r->print(' | '. + ''.$tabtag); $r->print(&Apache::loncommon::end_data_table_row()); - return OK; + return OK; } # display file - if (($fnptr == 0 and $filecom[3] ne '') or $absolute) { - my $title; - my $filelink = $pathprefix.$filecom[0]; - if ($hash{'display_attrs_0'} == 1) { - $title = &Apache::lonnet::gettitle($filelink); - } - my @file_ext = split (/\./,$listname); - my $curfext = $file_ext[-1]; - if (@Omit) { - foreach (@Omit) { return OK if (lc($curfext) eq $_); } - } - if (@Only) { - my $skip = 1; - foreach (@Only) { $skip = 0 if (lc($curfext) eq $_); } - return OK if ($skip > 0); - } - # Set the icon for the file - my $iconname = &Apache::loncommon::icon($listname); -#SB $r->print(" | |||||||||||||||||||||
"); - $r->print(&Apache::loncommon::start_data_table_row()); # valign="$valign" ?!?" - $r->print(' | '); + if (($fnptr == 0 and $filecom[3] ne '') or $absolute) { + my $title; + my $filelink = $pathprefix.$filecom[0]; + if ($hash{'display_attrs_0'} == 1) { + $title = &Apache::lonnet::gettitle($filelink); + } + my @file_ext = split (/\./,$listname); + my $curfext = $file_ext[-1]; + if (@Omit) { + foreach (@Omit) { return OK if (lc($curfext) eq $_); } + } + if (@Only) { + my $skip = 1; + foreach (@Only) { $skip = 0 if (lc($curfext) eq $_); } + return OK if ($skip > 0); + } + # Set the icon for the file + my $iconname = &Apache::loncommon::icon($listname); +#SB $r->print(" | |||||||||||||||||||||||
'); if ($env{'form.catalogmode'} eq 'interactive') { my $quotable_filelink = &Apache::loncommon::escape_single($filelink); @@ -963,17 +1072,17 @@ sub display_line { $quotable_filelink,"')\">"); $r->print("". "\n"); - $r->print(" | "); + $r->print(' | '); } elsif ($env{'form.catalogmode'} eq 'import') { $r->print(" | "); + $r->print(' | '); $hash{"pre_${fnum}_link"}=$filelink; $hash{"pre_${fnum}_title"}=$title; if (!$hash{"pre_${fnum}_title"}) { @@ -988,66 +1097,63 @@ sub display_line { $indent--; } # General indentation - if ($indent > 0 and $indent < 11) { - $r->print("\n"); - } elsif ($indent >0) { - my $ten = int($indent/10.); - my $rem = $indent%10.0; my $count = 0; - while ($count < $ten) { - $r->print("\n"); - $count++; + while ($count < $indent) { + $r->print(''); + $count++; } - $r->print("\n") if $rem > 0; - } # Sequence open/close icon if ($filelink=~/\.(page|sequence)$/) { my $curdir = $startdir.$filecom[0].'/'; my $anchor = $curdir; $anchor =~ s/\W//g; $r->print (''); - $r->print ('print (' name="'.$msg.'" type="image" class="LC_indexer_icon" />'. + $r->print (''); + $r->print (''); + $r->print ('print (' alt="'.$msg.'" />'. "\n"); } # Filetype icons - $r->print("\n"); + $r->print("\n"); my $quotable_filelink = &Apache::loncommon::escape_single($filelink); + my $quotable_startdir = Apache::loncommon::escape_single($startdir); + my $quotable_listname = &Apache::loncommon::escape_single($listname); - $r->print (" $listname "); + $r->print (" $listname "); $quotable_filelink = &Apache::loncommon::escape_single($filelink.'.meta'); &Apache::loncommon::inhibit_menu_check(\$quotable_filelink); - $r->print (" (".&mt('metadata').") "); + $r->print (" (".&mt('metadata').") "); # Close form to open/close sequence if ($filelink=~/\.(page|sequence)$/) { $r->print(''); } $r->print(" | \n"); +# Wishlistlink + $r->print(''. + ' | '); if ($hash{'display_attrs_0'} == 1) { $r->print(''.($title eq '' ? ' ' : $title). ' | '."\n"); } - $r->print('', + $r->print(' | ', $filecom[8]," | \n") if $hash{'display_attrs_1'} == 1; - $r->print(''. + $r->print(' | '. (&Apache::lonlocal::locallocaltime($filecom[9]))." | \n") if $hash{'display_attrs_2'} == 1; - $r->print(''. + $r->print(' | '. (&Apache::lonlocal::locallocaltime($filecom[10]))." | \n") if $hash{'display_attrs_3'} == 1; if ($hash{'display_attrs_4'} == 1) { my $author = &Apache::lonnet::metadata($filelink,'author'); - $r->print(''.($author eq '' ? ' ' : $author). + $r->print(' | '.($author eq '' ? ' ' : $author). " | \n"); } if ($hash{'display_attrs_5'} == 1) { @@ -1056,7 +1162,6 @@ sub display_line { $r->print(''.($keywords eq '' ? ' ' : $keywords). " | \n"); } -#' if ($hash{'display_attrs_6'} == 1) { my $lang = &Apache::lonnet::metadata($filelink,'language'); @@ -1068,17 +1173,13 @@ sub display_line { # statistics &dynmetaread($filelink); $r->print(""); - &dynmetaprint($r,$filelink,'count'); - &dynmetaprint($r,$filelink,'course'); - &dynmetaprint($r,$filelink,'stdno'); - &dynmetaprint($r,$filelink,'avetries'); - &dynmetaprint($r,$filelink,'difficulty'); - &dynmetaprint($r,$filelink,'disc'); - &dynmetaprint($r,$filelink,'clear'); - &dynmetaprint($r,$filelink,'technical'); - &dynmetaprint($r,$filelink,'correct'); - &dynmetaprint($r,$filelink,'helpful'); - &dynmetaprint($r,$filelink,'depth'); + + for (qw(count course stdno avetries difficulty disc clear technical + correct helpful depth)) { + + dynmetaprint($r,$filelink,$_); + } + $r->print(" | \n"); } @@ -1101,21 +1202,55 @@ sub display_line { &dynmetaread($filelink); $r->print(''); &coursecontext($r,$filelink); - &dynmetaprint($r,$filelink,'goto_list'); - &dynmetaprint($r,$filelink,'comefrom_list'); - &dynmetaprint($r,$filelink,'sequsage_list'); - &dynmetaprint($r,$filelink,'dependencies'); - &dynmetaprint($r,$filelink,'course_list'); + for (qw(goto_list comefrom_list sequsage_list dependencies course_list)) { + dynmetaprint($r,$filelink,$_); + } $r->print(' | '); } - if ($hash{'display_attrs_7'} == 1) { + + + + if ($hash{'display_attrs_7'} == 1) { # Show resource my $output=&showpreview($filelink); - $r->print(''.($output eq '' ? ' ':$output). + $r->print(' | '.($output eq '' ? ' ':$output). " | \n"); - } - $r->print(&Apache::loncommon::end_data_table_row()); } + + if ($hash{'display_attrs_12'} == 1) { + my $subject = &Apache::lonnet::metadata($filelink,'subject'); + $r->print(''.($subject eq '' ? ' ' : $subject). + " | \n"); + } + + if ($hash{'display_attrs_13'} == 1) { + my $notes = &Apache::lonnet::metadata($filelink,'notes'); + $r->print(''.($notes eq '' ? ' ' : $notes). + " | \n"); + } + + if ($hash{'display_attrs_14'} == 1) { + my $abstract = &Apache::lonnet::metadata($filelink,'abstract'); + $r->print(''.($abstract eq '' ? ' ' : $abstract). + " | \n"); + } + + if ($hash{'display_attrs_15'} == 1) { + my $gradelevel = &Apache::lonnet::metadata($filelink,'gradelevel'); + $r->print(''.($gradelevel eq '' ? ' ' : $gradelevel). + " | \n"); + } + + if ($hash{'display_attrs_16'} == 1) { + my $standards = &Apache::lonnet::metadata($filelink,'standards'); + $r->print(''.($standards eq '' ? ' ' : $standards). + " | \n"); + } + + $r->print(&Apache::loncommon::end_data_table_row()); +} + + # -- display directory if ($fnptr == $dirptr) { @@ -1125,36 +1260,39 @@ sub display_line { #SB $r->print("
"); $r->print(&Apache::loncommon::start_data_table_row()); # SB: bgcolor suggestion: darkgrey ("LC_info_row"?!?) # $r->print(' | ||||||||||||||||||||||||
'); + $r->print($extrafield.' | '); &begin_form ($r,$curdir); my $indentm1 = $indent-1; - if ($indentm1 < 11 and $indentm1 > 0) { - $r->print("\n"); - } else { - my $ten = int($indentm1/10.); - my $rem = $indentm1%10.0; - my $count = 0; - while ($count < $ten) { - $r->print ("\n"); - $count++; - } - $r->print ("\n") if $rem > 0; + my $count = 0; + while ($count < $indentm1) { + $r->print (''); + $count++; } $r->print (''); - $r->print ('print (' name="'.$msg.'" type="image" class="LC_indexer_icon" />'. + $r->print (''); + $r->print ('print (' alt="'.$msg.'" class="LC_fileicon" />'. "\n"); my $quotable_curdir = &Apache::loncommon::escape_single($curdir); - $r->print ('' - .''. - "\n"); - $r->print ("$listname | \n"); + my $quotable_startdir = &Apache::loncommon::escape_single($startdir); + my $quotable_listname = &Apache::loncommon::escape_single($listname); + + my $location = &Apache::loncommon::lonhttpdurl("/adm/lonIcons"); + my $icon = "navmap.folder.".($nowOpen ? "open":"closed").'.gif'; + $r->print ('' + .'' + ."\n"); + $r->print ("$listname"); +# Wishlistlink + $r->print(''. + ' | '); # Attributes my $filelink = $startdir.$filecom[0].'/default'; @@ -1163,13 +1301,13 @@ sub display_line { $r->print(''.($title eq '' ? ' ' : $title). ' | '."\n"); } - $r->print('', + $r->print(' | ', $filecom[8]," | \n") if $hash{'display_attrs_1'} == 1; - $r->print(''. + $r->print(' | '. (&Apache::lonlocal::locallocaltime($filecom[9]))." | \n") if $hash{'display_attrs_2'} == 1; - $r->print(''. + $r->print(' | '. (&Apache::lonlocal::locallocaltime($filecom[10]))." | \n") if $hash{'display_attrs_3'} == 1; @@ -1190,19 +1328,50 @@ sub display_line { $r->print(''.($lang eq '' ? ' ' : $lang). " | \n"); } + if ($hash{'display_attrs_8'} == 1) { $r->print(''); } if ($hash{'display_attrs_10'} == 1) { $r->print(' | '); } - if ($hash{'display_attrs_11'} == 1) { - $r->print(' | '); - } if ($hash{'display_attrs_7'} == 1) { $r->print(' | '); } - $r->print(&Apache::loncommon::end_data_table_row()); + if ($hash{'display_attrs_11'} == 1) { + $r->print(' | '); + } + if ($hash{'display_attrs_12'} == 1) { + my $subject = &Apache::lonnet::metadata($filelink,'subject'); + $r->print(' | '.($subject eq '' ? ' ' : $subject). + " | \n"); + } + if ($hash{'display_attrs_13'} == 1) { + my $notes = &Apache::lonnet::metadata($filelink,'notes'); + $r->print(''.($notes eq '' ? ' ' : $notes). + " | \n"); + } + + if ($hash{'display_attrs_14'} == 1) { + my $abstract = &Apache::lonnet::metadata($filelink,'abstract'); + $r->print(''.($abstract eq '' ? ' ' : $abstract). + " | \n"); + } + + if ($hash{'display_attrs_15'} == 1) { + my $gradelevel = &Apache::lonnet::metadata($filelink,'gradelevel'); + $r->print(''.($gradelevel eq '' ? ' ' : $gradelevel). + " | \n"); + } + + if ($hash{'display_attrs_16'} == 1) { + my $standards = &Apache::lonnet::metadata($filelink,'standards'); + $r->print(''.($standards eq '' ? ' ' : $standards). + " | \n"); + } + + + $r->print(&Apache::loncommon::end_data_table_row()); } } @@ -1212,15 +1381,18 @@ sub coursecontext { my $filesymb=&Apache::lonnet::symbread($filelink); if ($filesymb) { my ($map,$index,$resource)=&Apache::lonnet::decode_symb($filesymb); - $r->print(&mt('Already in this course: