--- loncom/interface/lonindexer.pm 2004/03/29 21:18:00 1.96 +++ loncom/interface/lonindexer.pm 2006/04/10 21:40:08 1.142 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Directory Indexer # -# $Id: lonindexer.pm,v 1.96 2004/03/29 21:18:00 www Exp $ +# $Id: lonindexer.pm,v 1.142 2006/04/10 21:40:08 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -44,7 +44,7 @@ package Apache::lonindexer; # ------------------------------------------------- modules used by this module use strict; -use Apache::lonnet(); +use Apache::lonnet; use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::lonsequence(); @@ -52,13 +52,16 @@ use Apache::Constants qw(:common); use Apache::lonmeta; use Apache::File; use Apache::lonlocal; +use Apache::lonsource(); use GDBM_File; # ---------------------------------------- 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 # ----- Values which are set by the handler subroutine and are accessible to # ----- other methods. my $extrafield; # default extra table cell @@ -70,6 +73,8 @@ my @Only = (); my @Omit = (); + + # ----------------------------- Handling routine called via Apache and mod_perl sub handler { my $r = shift; @@ -85,6 +90,7 @@ sub handler { # these global to this package? It is just so wrong....) undef (@Only); undef (@Omit); + %fieldnames=&Apache::lonmeta::fieldnames(); # ------------------------------------- read in machine configuration variables my $iconpath= $r->dir_config('lonIconsURL') . "/"; @@ -110,10 +116,10 @@ sub handler { my $closebutton=''; my $groupimportbutton=''; my $colspan=''; - + $extrafield=''; my $diropendb = - "/home/httpd/perl/tmp/$ENV{'user.domain'}_$ENV{'user.name'}_indexer.db"; + "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_indexer.db"; %hash = (); { my %dbfile; @@ -125,36 +131,67 @@ sub handler { } } { - if ($ENV{'form.launch'} eq '1') { + if ($env{'form.launch'} eq '1') { &start_fresh_session(); - } + } + #Hijack lonindexer to verify a title and be close down. + if ($env{'form.launch'} eq '2') { + &Apache::loncommon::content_type($r,'text/html'); + my $extra=''; + if (defined($env{'form.titleelement'}) && + $env{'form.titleelement'} ne '') { + my $verify_title = &Apache::lonnet::gettitle($env{'form.acts'}); +# &Apache::lonnet::logthis("Hrrm $env{'form.acts'} -- $verify_title"); + $verify_title=~s/'/\\'/g; + $extra='window.opener.document.forms["'.$env{'form.form'}.'"].elements["'.$env{'form.titleelement'}.'"].value=\''.$verify_title.'\';'; + } + my $js = < + function load() { + window.opener.document.forms["$env{'form.form'}"] + .elements["$env{'form.element'}"] + .value='$env{'form.acts'}'; + $extra + window.close(); + } + +ENDSUBM + $r->print(&Apache::loncommon::start_page(undef,$js, + {'only_body' =>1, + 'add_entries' => + {'onload' => "load();"},} + ). + &Apache::loncommon::end_page()); + return OK; + } + # -------------------- refresh environment with user database values (in %hash) - &setvalues(\%hash,'form.catalogmode',\%ENV,'form.catalogmode' ); + &setvalues(\%hash,'form.catalogmode',\%env,'form.catalogmode' ); # --------------------- define extra fields and buttons in case of special mode - if ($ENV{'form.catalogmode'} eq 'interactive') { + if ($env{'form.catalogmode'} eq 'interactive') { $extrafield=''. ''; $colspan=" colspan='2' "; my $cl=&mt('Close'); $closebutton=< + END } - elsif ($ENV{'form.catalogmode'} eq 'groupimport') { + elsif ($env{'form.catalogmode'} eq 'groupimport') { $extrafield=''. ''; $colspan=" colspan='2' "; my $cl=&mt('Close'); - my $gi=&mt('Group Import'); + my $gi=&mt('Import'); $closebutton=< + END $groupimportbutton=< +onClick="javascript:select_group()" /> END } # Additions made by Matthew to make the browser a little easier to deal @@ -166,33 +203,33 @@ END # $element is the name of the element in $formname which receives # the URL. #&Apache::lonxml::debug('Checking mode, form, element'); - &setvalues(\%hash,'form.mode' ,\%ENV,'form.mode' ); - &setvalues(\%hash,'form.form' ,\%ENV,'form.form' ); - &setvalues(\%hash,'form.element' ,\%ENV,'form.element'); - &setvalues(\%hash,'form.titleelement',\%ENV,'form.titleelement'); - &setvalues(\%hash,'form.only' ,\%ENV,'form.only' ); - &setvalues(\%hash,'form.omit' ,\%ENV,'form.omit' ); + &setvalues(\%hash,'form.mode' ,\%env,'form.mode' ); + &setvalues(\%hash,'form.form' ,\%env,'form.form' ); + &setvalues(\%hash,'form.element' ,\%env,'form.element'); + &setvalues(\%hash,'form.titleelement',\%env,'form.titleelement'); + &setvalues(\%hash,'form.only' ,\%env,'form.only' ); + &setvalues(\%hash,'form.omit' ,\%env,'form.omit' ); # Deal with 'omit' and 'only' - if (exists $ENV{'form.omit'}) { - @Omit = split(',',$ENV{'form.omit'}); + if (exists $env{'form.omit'}) { + @Omit = split(',',$env{'form.omit'}); } - if (exists $ENV{'form.only'}) { - @Only = split(',',$ENV{'form.only'}); + if (exists $env{'form.only'}) { + @Only = split(',',$env{'form.only'}); } - my $mode = $ENV{'form.mode'}; + my $mode = $env{'form.mode'}; my ($form,$element,$titleelement); if ($mode eq 'edit' || $mode eq 'parmset') { - $form = $ENV{'form.form'}; - $element = $ENV{'form.element'}; - $titleelement = $ENV{'form.titleelement'}; + $form = $env{'form.form'}; + $element = $env{'form.element'}; + $titleelement = $env{'form.titleelement'}; } #&Apache::lonxml::debug("mode=$mode form=$form element=$element titleelement=$titleelement"); # ------ set catalogmodefunctions to have extra needed javascript functionality my $catalogmodefunctions=''; - if ($ENV{'form.catalogmode'} eq 'interactive' or - $ENV{'form.catalogmode'} eq 'groupimport') { + if ($env{'form.catalogmode'} eq 'interactive' or + $env{'form.catalogmode'} eq 'groupimport') { # The if statement below sets us up to use the old version # by default (ie. if $mode is undefined). This is the easy # way out. Hopefully in the future I'll find a way to get @@ -207,21 +244,13 @@ END $location .= "mode=".$mode."&"; $location .= "acts="; $catalogmodefunctions=<<"END"; -function select_data(title,url) { - changeTitle(title); +function select_data(url) { changeURL(url); self.close(); } function select_group() { window.location="$location"+document.forms.fileattr.acts.value; } -function changeTitle(val) { - if (opener.inf) { - if (opener.inf.document.forms.resinfo.elements.t) { - opener.inf.document.forms.resinfo.elements.t.value=val; - } - } -} function changeURL(val) { if (opener.inf) { if (opener.inf.document.forms.resinfo.elements.u) { @@ -235,12 +264,10 @@ END $location .= "form=$form&element=$element&mode=edit&acts="; $catalogmodefunctions=<print(< - -The LearningOnline Network With CAPA Directory Browser - + my $js = <<"ENDHEADER"; - - ENDHEADER -my ($headerdom)=($uri=~/^\/res\/(\w+)\//); -$r->print(&Apache::loncommon::bodytag('Browse Resources',undef,undef,undef, - $headerdom)); + + my ($headerdom)=($uri=~/^\/res\/(\w+)\//); + $r->print(&Apache::loncommon::start_page('Browse Resources',$js, + {'domain' => $headerdom,})); # - Evaluate actions from previous page (both cumulatively and chronologically) - if ($ENV{'form.catalogmode'} eq 'groupimport') { - my $acts=$ENV{'form.acts'}; + if ($env{'form.catalogmode'} eq 'groupimport') { + my $acts=$env{'form.acts'}; my @Acts=split(/b/,$acts); my %ahash; my %achash; @@ -389,16 +411,16 @@ $r->print(&Apache::loncommon::bodytag('B } # ---------------------------------- get state of file attributes to be showing - if ($ENV{'form.attrs'}) { - for (my $i=0; $i<=9; $i++) { + if ($env{'form.attrs'}) { + for (my $i=0; $i<=11; $i++) { delete $hash{'display_attrs_'.$i}; - if ($ENV{'form.attr'.$i} == 1) { + if ($env{'form.attr'.$i} == 1) { $attrchk[$i] = 'checked'; $hash{'display_attrs_'.$i} = 1; } } } else { - for (my $i=0; $i<=9; $i++) { + for (my $i=0; $i<=11; $i++) { $attrchk[$i] = 'checked' if $hash{'display_attrs_'.$i} == 1; } } @@ -415,51 +437,73 @@ $r->print(&Apache::loncommon::bodytag('B 'au' => 'Author', 'kw' => 'Keywords', 'ln' => 'Language', + 'sa' => 'Source Available', 'sr' => 'Show resource', + 'li' => 'Linked/Related Resources', 'av' => 'All versions', 'ud' => 'Update Display' ); - my $Displayfileattributes=&mt('Display file attributes'); $r->print(< -$Displayfileattributes
- - - - - - - - - - - - + +
$lt{'ti'} $lt{'si'} $lt{'la'} $lt{'lm'} $lt{'st'}
$lt{'au'} $lt{'kw'} $lt{'ln'} $lt{'sr'} $lt{'av'}
+ + + + + + + + + + + + + + + + -
 
+ + $closebutton $groupimportbutton END +# -------------- Filter out sequence containment in crumbs and "recent folders" + my $storeuri=$uri; + $storeuri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1]; + $storeuri=~s/\/+/\//g; # ---------------------------------------------------------------- Bread crumbs - $r->print(&Apache::lonhtmlcommon::crumbs($uri,'','', - (($ENV{'form.catalogmode'} eq 'groupimport')? + $r->print(&Apache::lonhtmlcommon::crumbs($storeuri,'','', + (($env{'form.catalogmode'} eq 'groupimport')? 'document.forms.fileattr':'')). &Apache::lonhtmlcommon::select_recent('residx','resrecent', -'this.form.action=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.submit();'). - ''); +'window.status=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.action=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.submit();')); +# -------------------------------------------------------- Resource Home Button + my $reshome=$env{'course.'.$env{'request.course.id'}.'.reshome'}; + if ($reshome) { + $r->print("
print('javascript:document.forms.fileattr.action="'.$reshome.'";document.forms.fileattr.submit();'); + } else { + $r->print($reshome); + } + $r->print("'>".&mt('Home').''); + } + $r->print(''); # ------------------------------------------------------ Remember where we were - &Apache::loncommon::storeresurl($uri); - &Apache::lonhtmlcommon::store_recent('residx',$uri,$uri); + &Apache::loncommon::storeresurl($storeuri); + &Apache::lonhtmlcommon::store_recent('residx',$storeuri,$storeuri); # ----------------- output starting row to the indexed file/directory hierarchy my $titleclr="#ddffff"; -# $r->print(&initdebug()); -# $r->print(&writedebug("Omit:@Omit")) if (@Omit); -# $r->print(&writedebug("Only:@Only")) if (@Only); - $r->print("'; my $i=0; - while ($i<=8) { + while ($i<=11) { $tabtag=join('',$tabtag,"") if $hash{'display_attrs_'.$i} == 1; $i++; } - my $valign = ($hash{'display_attrs_7'} == 1 ? 'top' : 'bottom'); # display uplink arrow if ($filecom[1] eq 'viewOneUp') { + my $updir=$startdir; +# -------------- Filter out sequence containment in crumbs and "recent folders" + $updir='/'.(split(/\.(page|sequence)\/\//,$startdir))[-1]; + $updir=~s/\/+/\//g; + $r->print("$extrafield"); $r->print("\n"); + $r->print(&mt("Up")."$tabtag\n"); return OK; } -# Do we have permission to look at this? - if($filecom[15] ne '1') { return OK if (!&Apache::lonnet::allowed('bre',$startdir.$filecom[0])); } +# Do we have permission to look at this? + + if($filecom[15] ne '1') { return OK if (!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])); } + +# make absolute links appear on different background + if ($absolute) { $fileclr='#ccdd99'; } # display domain if ($filecom[1] eq 'domain') { - $r->print (''."\n") - if ($ENV{'form.dirPointer'} eq "on"); + $r->print (''."\n") + if ($env{'form.dirPointer'} eq "on"); $r->print("$extrafield"); $r->print("\n"); + $r->print ("$tabtag\n"); return OK; # display user directory @@ -768,25 +870,27 @@ sub display_line { &begin_form ($r,$curdir); $r->print (''."\n"); - $r->print (''); + $r->print (''); $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'. "\n"); - $r->print (''); 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.''."\n"); + $r->print (''.$tabtag.''."\n"); return OK; } # display file - if ($fnptr == 0 and $filecom[3] ne '') { - my $filelink = $startdir.$filecom[0]; + if (($fnptr == 0 and $filecom[3] ne '') or $absolute) { + my $filelink = $pathprefix.$filecom[0]; my @file_ext = split (/\./,$listname); my $curfext = $file_ext[-1]; if (@Omit) { @@ -799,27 +903,16 @@ sub display_line { } # Set the icon for the file my $iconname = &Apache::loncommon::icon($listname); - $r->print("\n"); if ($hash{'display_attrs_0'} == 1) { - my $title = &Apache::lonnet::gettitle($filelink,'title') - if ($metafile == 1); + my $title = &Apache::lonnet::gettitle($filelink,'title'); $r->print(''."\n"); } @@ -903,62 +993,72 @@ sub display_line { if $hash{'display_attrs_3'} == 1; if ($hash{'display_attrs_4'} == 1) { - my $author = &Apache::lonnet::metadata($filelink,'author') - if ($metafile == 1); + my $author = &Apache::lonnet::metadata($filelink,'author'); $r->print('\n"); } if ($hash{'display_attrs_5'} == 1) { - my $keywords = &Apache::lonnet::metadata($filelink,'keywords') - if ($metafile == 1); + my $keywords = &Apache::lonnet::metadata($filelink,'keywords'); # $keywords = ' ' if (!$keywords); $r->print('\n"); } +#' + if ($hash{'display_attrs_6'} == 1) { - my $lang = &Apache::lonnet::metadata($filelink,'language') - if ($metafile == 1); + my $lang = &Apache::lonnet::metadata($filelink,'language'); $lang = &Apache::loncommon::languagedescription($lang); $r->print('\n"); } + if ($hash{'display_attrs_8'} == 1) { +# statistics + &dynmetaread($filelink); + $r->print("\n"); + + } + if ($hash{'display_attrs_10'} == 1) { + my $source = &Apache::lonnet::metadata($filelink,'sourceavail'); + if($source eq 'open') { + my $sourcelink = &Apache::lonsource::make_link($filelink,$listname); + my $quotable_sourcelink = &Apache::loncommon::escape_single($sourcelink); + $r->print('\n"); + } else { #A cuddled else. :P + $r->print("\n"); + } + } + if ($hash{'display_attrs_11'} == 1) { +# links + &dynmetaread($filelink); + $r->print(''); + } if ($hash{'display_attrs_7'} == 1) { - my $output=''; - my $embstyle=&Apache::loncommon::fileembstyle($curfext); - if ($embstyle eq 'ssi') { - my $cache=$Apache::lonnet::perlvar{'lonDocRoot'}.$filelink. - '.tmp'; - if ((!$ENV{'form.updatedisplay'}) && - (-e $cache)) { - open(FH,$cache); - $output=join("\n",); - close(FH); - } else { - $output=&Apache::lonnet::ssi_body($filelink); - open(FH,">$cache"); - print FH $output; - close(FH); - } - $output=''.$output.''; - } elsif ($embstyle eq 'img') { - $output=''; - } elsif ($filelink=~/^\/res\/(\w+)\/(\w+)\//) { - $output=''; - } - $r->print('\n"); } - if ($hash{'display_attrs_8'} == 1) { - my (%stat) = &Apache::lonmeta::dynamicmeta($filelink) if ($metafile == 1); - my $stat = (exists($stat{'course'}) ? $stat{'course'} : ''). - ((exists($stat{'course'}) || exists($stat{'count'})) ? '/' : ''). - (exists($stat{'count'}) ? $stat{'count'} : ''); - $r->print(''."\n"); - } - $r->print("\n"); } @@ -985,12 +1085,14 @@ sub display_line { $r->print ("\n") if $rem > 0; } - $r->print (''); + $r->print (''); $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'. "\n"); - $r->print (''. "\n"); $r->print ("$listname\n"); @@ -1029,17 +1131,69 @@ sub display_line { $r->print('\n"); } - if ($hash{'display_attrs_7'} == 1) { - $r->print(''); - } 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(''); } } +sub showpreview { + my ($filelink)=@_; + my ($curfext)=($filelink=~/\.(\w+)$/); + my $output=''; + my $embstyle=&Apache::loncommon::fileembstyle($curfext); + if ($embstyle eq 'ssi') { + my $cache=$Apache::lonnet::perlvar{'lonDocRoot'}.$filelink. + '.tmp'; + if ((!$env{'form.updatedisplay'}) && + (-e $cache)) { + open(FH,$cache); + $output=join("\n",); + close(FH); + } else { + $output=&Apache::lonnet::ssi_body($filelink); + if ($output=~/LONCAPAACCESSCONTROLERRORSCREEN/s) { + $output=''; + } else { + open(FH,">$cache"); + print FH $output; + close(FH); + } + } + $output=''.$output.''; + } elsif ($embstyle eq 'img') { + $output=''; + } elsif ($filelink=~/^\/res\/(\w+)\/(\w+)\//) { + $output=''; + } + return $output; +} + +sub dynmetaprint { + my ($r,$filelink,$item)=@_; + if ($dynhash{$filelink}->{$item}) { + $r->print("\n
".$fieldnames{$item}.': '. + &Apache::lonmeta::prettyprint($item, + $dynhash{$filelink}->{$item}, + (($env{'form.catalogmode'} ne 'groupimport')?'preview':''), + '', + (($env{'form.catalogmode'} eq 'groupimport')?'document.forms.fileattr':''),1)); + } +} + # ------------------- prints the beginning of a form for directory or file link sub begin_form { my ($r,$uri) = @_; @@ -1050,9 +1204,9 @@ sub begin_form { '" onSubmit="return rep_dirpath(\''.$dnum.'\''. ',document.forms.fileattr.acts.value)" '. 'enctype="application/x-www-form-urlencoded">'."\n"); - $r->print (''. + $r->print (''. "\n"); - $r->print (''."\n"); + $r->print (''."\n"); $dnum++; } @@ -1088,8 +1242,13 @@ sub cleanup { if (tied(%hash)){ &Apache::lonnet::logthis('Cleanup indexer: hash'); } + return OK; } + + + + =head1 NAME Apache::lonindexer - mod_perl module for cross server filesystem browsing 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.

\n"); - $r->print("\n"); + #$r->print(&initdebug()); + #$r->print(&writedebug("Omit:@Omit")) if (@Omit); + #$r->print(&writedebug("Only:@Only")) if (@Only); + $r->print('
'."\n"); + $r->print(''."\n"); $r->print("\n"); $r->print("\n") if ($hash{'display_attrs_0'} == 1); @@ -475,11 +519,15 @@ END if ($hash{'display_attrs_5'} == 1); $r->print("\n") if ($hash{'display_attrs_6'} == 1); - $r->print("\n") - if ($hash{'display_attrs_7'} == 1); $r->print("\n") + &mt("Courses/Network Hits").") ".&mt('updated periodically')."\n") if ($hash{'display_attrs_8'} == 1); + $r->print("\n") + if ($hash{'display_attrs_10'} == 1); + $r->print("\n") + if ($hash{'display_attrs_11'} == 1); + $r->print("\n") + if ($hash{'display_attrs_7'} == 1); $r->print(''); # ----------------- read in what directories have previously been set to "open" @@ -491,8 +539,8 @@ END } } - if ($ENV{'form.openuri'}) { # take care of review and refresh options - my $uri=$ENV{'form.openuri'}; + if ($env{'form.openuri'}) { # take care of review and refresh options + my $uri=$env{'form.openuri'}; if (exists($hash{'diropen_status_'.$uri})) { my $cursta = $hash{'diropen_status_'.$uri}; $dirs{$uri} = 'open'; @@ -511,7 +559,7 @@ END my $indent = 0; $uri = $uri.'/' if $uri !~ /.*\/$/; - if ($ENV{'form.dirPointer'} ne 'on') { + if ($env{'form.dirPointer'} ne 'on') { $hash{'top.level'} = $uri; $toplevel = $uri; } else { @@ -533,14 +581,14 @@ END # ---------------------------- embed hidden information useful for group import $r->print(""); - $r->print(""); + $r->print(""); # -------------------------------------------------------------- end the tables $r->print('
".&mt('Name')."".&mt('Title')."".&mt("Language")."".&mt("Resource")."".&mt("Usage Statistics")."
(". - &mt("Courses/Network Hits").")
".&mt("Source Available")."".&mt("Linked/Related Resources")."".&mt("Resource")."
'); $r->print('
'); # --------------------------------------------------- end the output and return - $r->print(''."\n"); + $r->print(&Apache::loncommon::end_page()."\n"); } if(! $c->aborted()) { # write back into the temporary file @@ -610,31 +658,65 @@ sub scanDir { # --------------- get complete matched list based on the uri (returns an array) sub get_list { my ($r,$uri)=@_; - my @list; + my @list=(); (my $luri = $uri) =~ s/\//_/g; - if ($ENV{'form.updatedisplay'}) { + if ($env{'form.updatedisplay'}) { foreach (keys %hash) { delete $hash{$_} if ($_ =~ /^dirlist_files_/); + delete $hash{$_} if ($_ =~ /^dirlist_timestamp_files_/); } } - if ($hash{'dirlist_files_'.$luri}) { + if (defined($hash{'dirlist_files_'.$luri}) && + $hash{'dirlist_timestamp_files_'.$luri}+600 > (time)) { @list = split(/\n/,$hash{'dirlist_files_'.$luri}); - } elsif ($uri=~/\.(page|sequence)$/) { + } elsif ($uri=~/\.(page|sequence)\/$/) { # is a page or a sequence - @list= &Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$uri)); + $uri=~s/\/$//; + $uri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1]; + $uri=~s/\/+/\//g; + foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$uri))) { + my @ratpart=split(/\:/,$_); + push @list,$ratpart[1]; + } $hash{'dirlist_files_'.$luri} = join("\n",@list); } else { # is really a directory @list = &Apache::lonnet::dirlist($uri); $hash{'dirlist_files_'.$luri} = join("\n",@list); + $hash{'dirlist_timestamp_files_'.$luri} = time; } return @list=&match_ext($r,@list); } +sub dynmetaread { + my $uri=shift; + if (($hash{'display_attrs_8'}==1) || ($hash{'display_attrs_11'}==1)) { +# We don't want the filename + $uri=~s/\/[^\/]+$//; +# Did we already see this? + my $builddir=$uri; + while ($builddir) { + if ($dynread{$builddir}) { + return 0; + } + $builddir=~s/\/[^\/]+$//; + } +# Actually get the data + %dynhash= + (%dynhash,&Apache::lonmeta::get_dynamic_metadata_from_sql($uri)); +# Remember that we got it + $dynread{$uri}=1; + } +} + sub initdebug { + my $start_page= + &Apache::loncommon::start_page('Debug',undef, + {'only_body' => 1,}); + $start_page =~ s/\n/ /g; return < + ENDJS } sub writedebug { - my $text = shift; - return ""; + my ($text) = @_; + return ""; } # -------------------- filters out files based on extensions (returns an array) @@ -688,6 +770,17 @@ sub match_ext { sub display_line { my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_; my (@pathfn, $fndir); +# there could be relative paths (files actually belonging into this directory) +# or absolute paths (for example, from sequences) + my $absolute; + my $pathprefix; + if ($line=~m|^/res/| && $startdir ne '') { + $absolute=1; + $pathprefix=''; + } else { + $absolute=0; + $pathprefix=$startdir; + } my $dirptr=16384; my $fileclr="#ffffe6"; my $iconpath= $r->dir_config('lonIconsURL') . '/'; @@ -701,52 +794,61 @@ sub display_line { my $tabtag='
 
\n"); - $r->print ('
'."\n"); $r->print (''."\n"); - $r->print (''."\n"); + $startdir.'" />'."\n"); + $r->print (''."\n"); $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'. "\n"); - $r->print(&mt("Up")." $tabtag
"); &begin_form ($r,$filecom[0]); my $anchor = $filecom[0]; $anchor =~ s/\///g; $r->print (''); - $r->print (''); + $r->print (''); $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'. "\n"); - $r->print ('print (' border="0" />'."\n"); $r->print (&mt("Domain")." - $listname "); @@ -754,7 +856,7 @@ sub display_line { $r->print("(".$Apache::lonnet::domaindescription{$listname}. ")"); } - $r->print (" $tabtag
"); - my $metafile = grep /^\Q$filecom[0]\E\.meta\&/, @list; - my $title; - if ($ENV{'form.catalogmode'} eq 'interactive') { - $title=$listname; - $title = &Apache::lonnet::metadata($filelink,'title') - if ($metafile == 1); - $title=$listname unless $title; - my $titleesc=HTML::Entities::encode($title); - $titleesc=~s/\'/\\'/; #' (clean up this spare quote) + $r->print("
"); + + if ($env{'form.catalogmode'} eq 'interactive') { + my $quotable_filelink = &Apache::loncommon::escape_single($filelink); $r->print(""); + $quotable_filelink,"')\">"); $r->print("". "\n"); $r->print(""); - } elsif ($ENV{'form.catalogmode'} eq 'groupimport') { - $title=$listname; - #$title = &Apache::lonnet::metadata($filelink,'title') - #if ($metafile == 1); - $title=$listname unless $title; - my $titleesc=&HTML::Entities::encode($title); + } elsif ($env{'form.catalogmode'} eq 'groupimport') { $r->print("
\n"); $r->print("print("checked"); } - $r->print(">\n"); - $r->print("\n"); - $r->print("
\n"); - $r->print("
"); + $r->print(" />\n"); + $r->print(""); $hash{"pre_${fnum}_link"}=$filelink; - $hash{"pre_${fnum}_title"}=$titleesc; $fnum++; } # Form to open or close sequences @@ -865,30 +954,31 @@ sub display_line { my $curdir = $startdir.$filecom[0].'/'; my $anchor = $curdir; $anchor =~ s/\///g; - $r->print (''); + $r->print (''); $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + $r->print (' name="'.$msg.'" height="22" type="image" border="0" />'. "\n"); } # Filetype icons $r->print("\n"); -# Close form to open/close sequence - if ($filelink=~/\.(page|sequence)$/) { - $r->print(''); - } - $r->print (" print (" $listname "); - $r->print (" (print (" (metadata) ") if ($metafile == 1); - + "TARGET=_self>metadata) "); +# Close form to open/close sequence + if ($filelink=~/\.(page|sequence)$/) { + $r->print(''); + } $r->print(" '.($title eq '' ? ' ' : $title). ' '.($author eq '' ? ' ' : $author). " '.($keywords eq '' ? ' ' : $keywords). " '.($lang eq '' ? ' ' : $lang). " "); + &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'); + $r->print(" '."Yes "." '); + &dynmetaprint($r,$filelink,'goto_list'); + &dynmetaprint($r,$filelink,'comefrom_list'); + &dynmetaprint($r,$filelink,'sequsage_list'); + &dynmetaprint($r,$filelink,'dependencies'); + &dynmetaprint($r,$filelink,'course_list'); + $r->print(' '.($output eq '' ? ' ':$output). +# Show resource + my $output=&showpreview($filelink); + $r->print(' '.($output eq '' ? ' ':$output). " '.($stat eq '' ? ' ' : $stat). - '
'.($lang eq '' ? ' ' : $lang). "