Diff for /loncom/publisher/lonpubdir.pm between versions 1.151 and 1.152

version 1.151, 2014/04/06 19:39:04 version 1.152, 2014/04/21 21:26:41
Line 44  use LONCAPA; Line 44  use LONCAPA;
   
 sub handler {  sub handler {
   
   my $r=shift;      my $r=shift;
   
   # Validate access to the construction space and get username:domain.      # Validate access to the construction space and get username:domain.
   
   my $uname;      my $uname;
   my $udom;      my $udom;
   
   ($uname,$udom)=&Apache::lonnet::constructaccess($r->uri);       ($uname,$udom)=&Apache::lonnet::constructaccess($r->uri); 
   unless (($uname) && ($udom)) {      unless (($uname) && ($udom)) {
      return HTTP_NOT_ACCEPTABLE;          return HTTP_NOT_ACCEPTABLE;
   }      }
   
 # ----------------------------------------------------------- Start page output  # ----------------------------------------------------------- Start page output
   
   my $fn=$r->filename;      my $fn=$r->filename;
   $fn=~s/\/$//;      $fn=~s/\/$//;
       my $thisdisfn=$fn;
   
   my $thisdisfn=$fn;      my $docroot=$r->dir_config('lonDocRoot');     # Apache  londocument root.
   my $docroot=$r->dir_config('lonDocRoot');     # Apache  londocument root.      $thisdisfn=~s/^\Q$docroot\E\/priv//;
   $thisdisfn=~s/^\Q$docroot\E\/priv//;      
       my $resdir=$docroot.'/res'.$thisdisfn; # Resource directory
   my $resdir=$docroot.'/res'.$thisdisfn; # Resource directory      my $targetdir='/res'.$thisdisfn; # Publication target directory.
   my $targetdir='/res'.$thisdisfn; # Publication target directory.      my $linkdir='/priv'.$thisdisfn;      # Full URL name of constr space.
   my $linkdir='/priv'.$thisdisfn;      # Full URL name of constr space.  
       my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);
   my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);  
       &startpage($r, $uname, $udom, $thisdisfn);  # Put out the start of page.
   &startpage($r, $uname, $udom, $thisdisfn);   # Put out the start of page.      &dircontrols($r,$uname,$udom,$thisdisfn);   # Put out actions for directory, 
   &dircontrols($r,$uname,$udom,$thisdisfn);    # Put out actions for directory,                                                   # browse/upload + new file page.
                                                # browse/upload + new file page.      &resourceactions($r,$uname,$udom,$thisdisfn); # Put out form used for printing/deletion etc.
   &resourceactions($r,$uname,$udom,$thisdisfn); #Put out form used for printing/deletion etc.  
   
   my $numdir = 0;      my $numdir = 0;
   my $numres = 0;      my $numres = 0;
       
   # Retrieving value for sortby from QUERY_STRING      # Retrieving value for "sortby" and "sortorder" from QUERY_STRING
   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sortby']);      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
           ['sortby','sortorder']);
   
       # Sort by name as default, not reversed
       if (! exists($env{'form.sortby'})) { $env{'form.sortby'} = 'filename' }
       if (! exists($env{'form.sortorder'})) { $env{'form.sortorder'} = '' }
   
       my $sortby = $env{'form.sortby'};
       my $sortorder = $env{'form.sortorder'};
   
       # Start off the directory table.
       $r->print(&Apache::loncommon::start_data_table()
           .&Apache::loncommon::start_data_table_header_row()
           .'<th><a href="'.$linkdir.'/?sortby=filetype&sortorder='
               .((($sortby eq "filetype") && ($sortorder ne 'rev')) ? 'rev' : '') 
               .'">'.&mt('Type')
               .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'
           .'<th>'.&mt('Actions').'</th>'
           .'<th><a href="'.$linkdir.'/?sortby=filename&sortorder='
               .((($sortby eq "filename") && ($sortorder ne 'rev')) ? 'rev' : '') 
               .'">'.&mt('Name')
               .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'
           .'<th><a href="'.$linkdir.'/?sortby=title&sortorder='
               .((($sortby eq "title") && ($sortorder ne 'rev')) ? 'rev' : '') 
               .'">'.&mt('Title')
               .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'
           .'<th colspan="2"><a href="'.$linkdir.'/?sortby=pubstatus&sortorder='
               .((($sortby eq "pubstatus") && ($sortorder ne 'rev')) ? 'rev' : '') 
               .'">'.&mt('Status')
               .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'
           .'<th><a href="'.$linkdir.'/?sortby=cmtime&sortorder='
               .((($sortby eq "cmtime") && ($sortorder ne 'rev')) ? 'rev' : '') 
               .'">'.&mt('Last Modified')
               .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'
           .'<th><a href="'.$linkdir.'/?sortby=size&sortorder='
               .((($sortby eq "size") && ($sortorder ne 'rev')) ? 'rev' : '') 
               .'">'.&mt('Size').' (kB)'
               .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'
           .&Apache::loncommon::end_data_table_header_row()
       );
   
   # Default sort by 'Name'      my $dirptr=16384; # Mask indicating a directory in stat.cmode.
   if (! exists($env{'form.sortby'})) {  
     $env{'form.sortby'} = 'filename';      opendir(DIR,$fn);
   }      my $filehash = {};
       my @files= readdir(DIR);
   # Start off the directory table.      foreach my $filename (@files) {
   $r->print(&Apache::loncommon::start_data_table()          # Skip .DS_Store and hidden files
            .&Apache::loncommon::start_data_table_header_row()          my ($extension) = ($filename=~/\.(\w+)$/);
            .'<th>'.&mt('Type').'</th>'          next if (($filename eq '.DS_Store') 
            .'<th>'.&mt('Actions').'</th>'                  || &Apache::loncommon::fileembstyle($extension) eq 'hdn');
            .'<th><a href="'.$linkdir.'/?sortby=filename">'.&mt('Name').'<span class="LC_fontsize_small"> &#9660;</span></a></th>'  
            .'<th>'.&mt('Title').'</th>'          my ($cmode,$csize,$cmtime)=(stat($fn.'/'.$filename))[2,7,9];
            .'<th colspan="2">'.&mt('Status').'</th>'          my $linkfilename = &HTML::Entities::encode('/priv'.$thisdisfn.'/'.$filename,'<>&"');
            .'<th><a href="'.$linkdir.'/?sortby=cmtime">'.&mt('Last Modified').'<span class="LC_fontsize_small"> &#9660;</span></a></th>'          # Identify type of file according to icon used
            .&Apache::loncommon::end_data_table_header_row()          my ($filetype) = (&Apache::loncommon::icon($filename) =~ m{/(\w+).gif$}); 
   );          my $cstr_dir = $r->dir_config('lonDocRoot').'/priv'.$thisdisfn;
           my $meta_same = &isMetaSame($cstr_dir, $resdir, $filename);
   my $filename;          
   my $dirptr=16384; # Mask indicating a directory in stat.cmode.          # Store size, title, and status for files but not directories
           my $size = (!($cmode&$dirptr)) ? $csize/1024. : 0;
   opendir(DIR,$fn);          my ($status, $pubstatus, $title, $fulltitle);
   my $filehash = {};          if (!($cmode&$dirptr)) {
   my $sortby = $env{'form.sortby'};              ($status, $pubstatus) = &getStatus($resdir, $targetdir, $cstr_dir, 
   my @files=sort {uc($a) cmp uc($b)} (readdir(DIR));                  $filename, $linkfilename, $cmtime, $meta_same);
   foreach my $filename (@files) {              ($fulltitle, $title) = &getTitle($resdir, $targetdir, $filename, 
      next if ($filename eq '.DS_Store');                                          $linkfilename, $meta_same, \%bombs);
      my ($cmode,$cmtime)=(stat($fn.'/'.$filename))[2,9];          } else {
      # If you want to sort by "last modified", we need to make this hash.              ($status, $pubstatus) = ('','');
      if ($sortby eq 'cmtime') {              ($fulltitle, $title) = ('','');
        $filehash->{ $filename } = {"cmtime" => $cmtime,};          }
      }  
      # Otherwise sort by name.  Don't bother with filehash.  Continue printing contents.          # This hash will allow sorting
      else {          $filehash->{ $filename } = {
          my $extension='';              "cmtime"            => $cmtime,
          if ($filename=~/\.(\w+)$/) { $extension=$1; }              "size"              => $size,
          if ($cmode&$dirptr) {              "cmode"             => $cmode,
              &putdirectory($r, $thisdisfn, $linkdir, $filename, $cmtime,$targetdir,\%bombs,\$numdir);              "filetype"          => $filetype,
          } elsif (&Apache::loncommon::fileembstyle($extension) ne 'hdn') {              "title"             => $title,
              &putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir,               "fulltitle"         => $fulltitle,
                          $targetdir, $linkdir, $cmtime,\%bombs,\$numres);              "status"            => $status,
          } else {              "pubstatus"         => $pubstatus,
             # "hidden" extension and not a directory, so hide it away.              "linkfilename"      => $linkfilename,
          }          }
      }      }
   };     
       my @sorted_files;
   # Sorting files by "last modified" if that's what you selected         # Sorting by something other than "Name".  Name is the secondary key.
   if ($sortby eq 'cmtime') {      if ($sortby =~ m{cmtime|size}) {    # Numeric fields
       my @sorted_files = sort {          # First check if order should be reversed
         $filehash->{$b}->{$sortby} <=> $filehash->{$a}->{$sortby}          if ($sortorder eq "rev") {
         } (keys(%{$filehash}));              @sorted_files = sort {
       foreach my $filename (@sorted_files) {                  $filehash->{$a}->{$sortby} <=> $filehash->{$b}->{$sortby}
          my ($cmode,$cmtime)=(stat($fn.'/'.$filename))[2,9];                      or
          my $extension='';                  uc($a) cmp uc($b)
          if ($filename=~/\.(\w+)$/) { $extension=$1; }              } (keys(%{$filehash}));
          if ($cmode&$dirptr) {          } else {
              &putdirectory($r, $thisdisfn, $linkdir, $filename, $cmtime,$targetdir,\%bombs,\$numdir);              @sorted_files = sort {
          } elsif (&Apache::loncommon::fileembstyle($extension) ne 'hdn') {                  $filehash->{$b}->{$sortby} <=> $filehash->{$a}->{$sortby}
              &putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir,                       or
                          $targetdir, $linkdir, $cmtime,\%bombs,\$numres);                  uc($a) cmp uc($b)
          } else {              } (keys(%{$filehash}));
             # "hidden" extension and not a directory, so hide it away.          }
          };      } elsif ($sortby =~ m{filetype|title|status}) {     # String fields
       };          if ($sortorder eq "rev") {
   };              @sorted_files = sort {
                     $filehash->{$b}->{$sortby} cmp $filehash->{$a}->{$sortby}
   closedir(DIR);                      or
                   uc($a) cmp uc($b)
               } (keys(%{$filehash}));
           } else {
               @sorted_files = sort {
                   $filehash->{$a}->{$sortby} cmp $filehash->{$b}->{$sortby}
                       or
                   uc($a) cmp uc($b)
               } (keys(%{$filehash}));
           }
   
       # Sort by "Name" is the default
       } else { 
           if ($sortorder eq "rev") {
               @sorted_files = sort {uc($b) cmp uc($a)} (keys(%{$filehash}));
           } else {
               @sorted_files = sort {uc($a) cmp uc($b)} (keys(%{$filehash}));
           }
       }
   
       # Print the sorted resources
       foreach my $filename (@sorted_files) {
           if ($filehash->{$filename}->{"cmode"}&$dirptr) {        # Directories
               &putdirectory($r, $thisdisfn, $linkdir, $filename, 
                   $filehash->{$filename}->{"cmtime"}, 
                   $targetdir, \%bombs, \$numdir);
           } else {                                                # Files
               &putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir,
                   $targetdir, $linkdir, $filehash->{$filename}->{"cmtime"}, 
                   $filehash->{$filename}->{"size"}, \$numres, 
                   $filehash->{$filename}->{"linkfilename"},
                   $filehash->{$filename}->{"fulltitle"},
                   $filehash->{$filename}->{"status"},
                   $filehash->{$filename}->{"pubstatus"});
           }
       }
   
       closedir(DIR);
   
       $r->print( &Apache::loncommon::end_data_table()
           .&Apache::loncommon::end_page() );
   
   $r->print(&Apache::loncommon::end_data_table()      return OK;  
            .&Apache::loncommon::end_page()  
   );  
   return OK;    
 }  }
   
 #  
   
 #   Output the header of the page.  This includes:  #   Output the header of the page.  This includes:
 #   - The HTML header   #   - The HTML header 
 #   - The H1/H3  stuff which includes the directory.  #   - The H1/H3  stuff which includes the directory.
Line 550  sub putdirectory { Line 627  sub putdirectory {
  }   }
  $r->print($Apache::lonpublisher::metadatafields{'keywords'}.'</td>'.   $r->print($Apache::lonpublisher::metadatafields{'keywords'}.'</td>'.
   '<td>'.&Apache::lonlocal::locallocaltime($modtime).'</td>'.    '<td>'.&Apache::lonlocal::locallocaltime($modtime).'</td>'.
             '<td></td>'.
   "</tr>\n");    "</tr>\n");
     }      }
     return OK;      return OK;
 }  }
 #  
 #   Put a table row for a file resource.  sub getTitle {
 #      my ($resdir, $targetdir, $filename, $linkfilename, $meta_same, $bombs) = @_;
 sub putresource {  
     my ($r, $udom, $uname, $filename, $thisdisfn,   
  $resdir, $targetdir, $linkdir,  
  $cmtime,$bombs,$numres) = @_;  
     &Apache::lonnet::devalidate_cache_new('meta',$targetdir.'/'.$filename);  
     my $pubstatus = 'unpublished';  
     my $status=&mt('Unpublished');  
     my $css_class='LC_browser_file';  
     my $title='';      my $title='';
     my $publish_button=&mt('Publish');      my $titleString = &getTitleString($targetdir.'/'.$filename);
     my $cstr_dir = $r->dir_config('lonDocRoot').'/priv'.$thisdisfn;      if (-e $resdir.'/'.$filename) {
     my $linkfilename=&HTML::Entities::encode('/priv'.$thisdisfn.'/'.$filename,'<>&"');   $title = '<a href="'.$targetdir.'/'.$filename.
       '.meta" target="cat">'.$titleString.'</a>';
           if (!$meta_same) {
       $title = &mt('Metadata Modified').'<br />'.$title.
    '<br />'.
                   &Apache::loncommon::modal_link(
                       '/adm/diff?filename='.$linkfilename.'.meta'.'&amp;versiontwo=priv',
                       &mt('Metadata Diffs'),600,500);
       $title.="\n".'<br />'.
                   &Apache::loncommon::modal_link(
                       '/adm/retrieve?filename='.$linkfilename.'.meta&amp;inhibitmenu=yes&amp;add_modal=yes',
                       &mt('Retrieve Metadata'),600,500);
           } 
       }
       # Allow editing metadata of published and unpublished resources
       $title .= "\n".'<br />' if ($title);
       $title .= '<a href="'.$linkfilename.'.meta">'.
                 ($$bombs{&Apache::lonnet::declutter($targetdir.'/'.$filename)}?
                     '<img src="/adm/lonMisc/bomb.gif" border="0" alt="'.&mt('bomb').'" />':
                     &mt('Edit Metadata')).
                 '</a>';
   
       return ($title, $titleString);
   }
   
   
   sub isMetaSame {
       my ($cstr_dir, $resdir, $filename) = @_;
       my $meta_cmtime = (stat($cstr_dir.'/'.$filename.'.meta'))[9];
       my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9];
       return (&Apache::londiff::are_different_files($resdir.'/'.$filename.'.meta',
               $cstr_dir.'/'.$filename.'.meta') && $meta_rmtime < $meta_cmtime) 
           ? 0 : 1;
   }
       
   
   sub getStatus {    
       my ($resdir, $targetdir, $cstr_dir, $filename,  
               $linkfilename, $cmtime, $meta_same) = @_;
       my $pubstatus = 'unpublished';
       my $status = &mt('Unpublished');
   
     if (-e $resdir.'/'.$filename) {      if (-e $resdir.'/'.$filename) {
         my $same=0;          my $same = 0;
  my ($rdev,$rino,$rmode,$rnlink,          if ((stat($resdir.'/'.$filename))[9] >= $cmtime) {
     $ruid,$rgid,$rrdev,$rsize,              $same = 1;
     $ratime,$rmtime,$rctime,  
     $rblksize,$rblocks)=stat($resdir.'/'.$filename);  
         if ($rmtime>=$cmtime) {  
            $same=1;  
         } else {          } else {
            if (&Apache::londiff::are_different_files($resdir.'/'.$filename,             if (&Apache::londiff::are_different_files($resdir.'/'.$filename,
      $cstr_dir.'/'.$filename)) {       $cstr_dir.'/'.$filename)) {
               $same=0;                $same = 0;
            } else {             } else {
               $same=1;                $same = 1;
            }             }
         }          }
  my $meta_cmtime = (stat($cstr_dir.'/'.$filename.'.meta'))[9];  
  my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9];  
  my $meta_same = 1;  
  if ($meta_rmtime < $meta_cmtime  
     && &Apache::londiff::are_different_files($resdir.'/'.$filename.'.meta',  
      $cstr_dir.'/'.$filename.'.meta')) {  
     $meta_same = 0;  
  }  
  $publish_button=&mt('Re-publish');  
   
         my $rights_status =          my $rights_status =
             &mt(&getCopyRightString($targetdir.'/'.$filename)).', ';              &mt(&getCopyRightString($targetdir.'/'.$filename)).', ';
Line 606  sub putresource { Line 703  sub putresource {
         $rights_status .=          $rights_status .=
             $lt_SourceRight{&getSourceRightString($targetdir.'/'.$filename)};              $lt_SourceRight{&getSourceRightString($targetdir.'/'.$filename)};
   
  $title = '<a href="'.$targetdir.'/'.$filename.  
     '.meta" target="cat">'.  
     &getTitleString($targetdir.'/'.$filename).'</a>';  
  if ($same) {   if ($same) {
     if (&Apache::lonnet::metadata($targetdir.'/'.$filename,'obsolete')) {      if (&Apache::lonnet::metadata($targetdir.'/'.$filename,'obsolete')) {
                 $pubstatus = 'obsolete';                  $pubstatus = 'obsolete';
Line 633  sub putresource { Line 727  sub putresource {
                              &mt('Diffs'),600,500);                               &mt('Diffs'),600,500);
     }      }
  }    } 
  if (!$meta_same) {  
     $title = &mt('Metadata Modified').'<br />'.$title.  
  '<br />'.  
                 &Apache::loncommon::modal_link(  
                     '/adm/diff?filename='.$linkfilename.'.meta'.'&amp;versiontwo=priv',  
                     &mt('Metadata Diffs'),600,500);  
     $title.="\n".'<br />'.  
                 &Apache::loncommon::modal_link(  
                     '/adm/retrieve?filename='.$linkfilename.'.meta&amp;inhibitmenu=yes&amp;add_modal=yes',  
                     &mt('Retrieve Metadata'),600,500);  
  }  
  $status.="\n".'<br />'.   $status.="\n".'<br />'.
              &Apache::loncommon::modal_link(               &Apache::loncommon::modal_link(
                  '/adm/retrieve?filename='.$linkfilename.'&amp;inhibitmenu=yes&amp;add_modal=yes',&mt('Retrieve'),600,500);                   '/adm/retrieve?filename='.$linkfilename.'&amp;inhibitmenu=yes&amp;add_modal=yes',&mt('Retrieve'),600,500);
     }      }
     # Allow editing metadata of published and unpublished resources  
     $title .= "\n".'<br />' if ($title);      return ($status, $pubstatus);
     $title .= '<a href="'.$linkfilename.'.meta">'.  }
               ($$bombs{&Apache::lonnet::declutter($targetdir.'/'.$filename)}?  
                   '<img src="/adm/lonMisc/bomb.gif" border="0" alt="'.&mt('bomb').'" />':  
                   &mt('Edit Metadata')).  #
               '</a>';  #   Put a table row for a file resource.
   #
   sub putresource {
       my ($r, $udom, $uname, $filename, $thisdisfn, $resdir, $targetdir, 
               $linkdir, $cmtime, $size, $numres, $linkfilename, $title, 
               $status, $pubstatus) = @_;
       &Apache::lonnet::devalidate_cache_new('meta',$targetdir.'/'.$filename);
   
     my $editlink='';      my $editlink='';
     my $editlink2='';      my $editlink2='';
Line 671  sub putresource { Line 761  sub putresource {
     if ($filename=~/\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) {      if ($filename=~/\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) {
  $editlink=' (<a target="_parent" href="/adm/cfile?decompress='.$linkfilename.'">'.&mt('Decompress').'</a>)';   $editlink=' (<a target="_parent" href="/adm/cfile?decompress='.$linkfilename.'">'.&mt('Decompress').'</a>)';
     }      }
       my $publish_button = (-e $resdir.'/'.$filename) ? &mt('Re-publish') : &mt('Publish');
     my $pub_select = '';      my $pub_select = '';
     &create_pubselect($r,\$pub_select,$udom,$uname,$thisdisfn,$filename,$resdir,$pubstatus,$publish_button,$numres);      &create_pubselect($r,\$pub_select,$udom,$uname,$thisdisfn,$filename,$resdir,$pubstatus,$publish_button,$numres);
     $r->print(&Apache::loncommon::start_data_table_row().      $r->print(&Apache::loncommon::start_data_table_row().
Line 685  sub putresource { Line 776  sub putresource {
               '<td class="LC_browser_file_'.$pubstatus.'">&nbsp;&nbsp;</td>'. # Display publication status                '<td class="LC_browser_file_'.$pubstatus.'">&nbsp;&nbsp;</td>'. # Display publication status
               '<td>'.$status.'</td>'.                '<td>'.$status.'</td>'.
       '<td>'.&Apache::lonlocal::locallocaltime($cmtime).'</td>'.        '<td>'.&Apache::lonlocal::locallocaltime($cmtime).'</td>'.
         '<td>'.sprintf "%.1f", $size.'</td>'.
       &Apache::loncommon::end_data_table_row()        &Apache::loncommon::end_data_table_row()
     );      );
     return OK;      return OK;
Line 846  Output the header of the page.  This inc Line 938  Output the header of the page.  This inc
 =back  =back
   
 =cut  =cut
   

Removed from v.1.151  
changed lines
  Added in v.1.152


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>