Diff for /loncom/interface/portfolio.pm between versions 1.5 and 1.16

version 1.5, 2004/06/21 14:10:05 version 1.16, 2004/07/23 01:25:56
Line 18 Line 18
 #  #
 # /home/httpd/html/adm/gpl.txt  # /home/httpd/html/adm/gpl.txt
 #  #
   
   
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
   
   
 package Apache::portfolio;  package Apache::portfolio;
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
Line 33  use Apache::lontexconvert; Line 30  use Apache::lontexconvert;
 use Apache::lonfeedback;  use Apache::lonfeedback;
 use Apache::lonlocal;  use Apache::lonlocal;
   
 sub handler {  # receives a file name and path stub from username/userfiles/portfolio/
  my ($r)=@_;  # returns an anchor tag consisting encoding filename and currentpath
  $r->content_type('text/html');  sub makeAnchor{
  $r->send_http_header;      my ($fileName, $currentPath) = @_;
  return OK if $r->header_only;      my $anchor = '<a href="/adm/portfolio?selectfile='.$fileName.'&currentpath='.$currentPath.'">'.$fileName.'</a>';
 # my $file=&Apache::lonnet::filelocation("",$r->uri);      return $anchor;
 # my $contents=&Apache::lonnet::getfile($file);  }
 # upload a file if we enter with a filename set  
  $r->print ('<body bgcolor="dogfood">  
  <blockquote>');  
   
  if ($ENV{'form.uploaddoc.filename'}){  
  $r->print (&Apache::lonnet::userfileupload('uploaddoc',undef,'portfolio').'<br />');  
  }  
  $r->print ('<br />Current contents of your portfolio directory: <br /><hr />');  
  $r->print (&Apache::lonnet::portfoliolist($r->uri, $ENV{'user.domain'}, $ENV{'user.name'}, undef ));  
  $r->print ('<hr />');  
 # $r->print ($ENV{'form.uploaddoc.filename'}.'<br />');  
 # $r->print ($ENV{'form.storeupl'}.'<br />');  
 # $r->print ($ENV{'form.saywhat'}.'<br />');  
   
  $r->print("Upload files to your portfolio<br />");  
  # file upload form   
  $r->print('<form method="post" enctype="multipart/form-data">');  
  $r->print('<input name="uploaddoc" type="file">'.  
   
  '<input type="submit" name="storeupl" value="Upload">'  
  );  
  $r->print('</form>  
  </blockquote>  
  </body>');  
   
  return OK;  
   
   # returns html with <br /> separated contents of the directory
   # returns a <strong>currentFile</strong> (bolds the selected file/dir)
   sub displayDirectory {
       my ($currentPath, $currentFile, @dirList,) = @_;
       my $displayOut='';  
       my $fileName;
       my $upPath;
       if ($currentPath ne '/'){
           $displayOut = 'Listing of '.$currentPath.'<br /><hr />'.
           # provides the "up one directory level" function
           # it means shortening the currentpath to the parent directory
           $currentPath =~ m:(^/.*)(/.*/$):;
           if ($1 ne '/'){
               $upPath = $1.'/';
           }else{
               $upPath = $1;
           }
           
           $displayOut = $displayOut.'<a href="/adm/portfolio?selectfile='.$upPath.'&currentpath='.$upPath.'">..</a><br />';
       } else {
           $displayOut = $displayOut.'at root '.$currentPath.'<br />';
       }
       foreach my $line (@dirList) {
       #$strip holds directory/file name
       #$dom 
       my ($fileName,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef,$path)=split(/\&/,$line,17); 
       $path =~ m:/:;
       my $dirDepth = @-;
           if (($fileName ne '.') && ($fileName ne '..')){
             for (my $i = 0; $i <= $dirDepth; $i += 1){
              $displayOut.='<blockquote>';
          }
               if ($testdir =~ m:^1:){
                   # handle directories different from files
                   if ($fileName eq $currentFile){ #checks to bold the selected file
                       $displayOut.= '<strong>'.(makeAnchor($fileName.'/', $path.$fileName.'/').'</strong><br />'."\n");
                   }else{
                       $displayOut.= (makeAnchor($fileName.'/', $path.$fileName.'/').'<br />'."\n");
                   }
               }else{
                   if ($fileName eq $currentFile){ #checks to bold the selected file
                       $displayOut.='<strong>'.(makeAnchor($fileName, $currentPath).'</strong><br />'."\n");
                   }else{
                       $displayOut.=(makeAnchor($fileName, $currentPath).'<br />'."\n");
                   }
               }
           for (my $i = 0; $i <= $dirDepth; $i += 1){
              $displayOut.='</blockquote>';
          }
               
           }
      
       }
       return $displayOut;
   }
   sub displayActions {
       # returns html to offer user appropriate actions depending on selected file/directory
       my $displayOut;
       my ($currentPath, $currentFile, $isEmpty) = @_;
   #   $displayOut = 'here are actions for '.$currentFile;
       if ($currentFile =~ m:/$:){
           # if the selected file is a directory, these are the options
           # offer the chance to delete the directory only if it is empty
           if ($isEmpty && ($currentPath ne '/')) {
               $displayOut =   $displayOut.'<form method="POST">
               <input type="hidden" name="selectfile" 
               value="'.$currentFile.'" />
               <input type="hidden" name="fileaction" value="delete" /> 
               <input type="hidden" name="currentpath" value="'.$currentPath.'" /> 
               <center>
               <input type="submit" 
               value="Delete '.$currentFile.'" />
               </center>
               </form>';
           } 
           if ($currentPath ne '/') {
               $displayOut = $displayOut.'<hr />
               <form method="POST">
               <input type="hidden" name="selectfile" 
               value="'.$currentFile.'" />
               <input type="hidden" name="fileaction" value="rename" /> 
               <input type="hidden" name="currentpath" value="'.$currentPath.'" /> 
               <input type="input" name="filenewname" value="Type new name here" /> 
               <input type="submit" 
               value="Rename '.$currentFile.'" />
               </form>';
           }
       }else{  #action options offered for files
           $displayOut = $displayOut.'<form method="POST">';
           $displayOut = $displayOut.'<input type="hidden" name="selectfile"';
           $displayOut = $displayOut.'value="'.$currentFile;
           $displayOut = $displayOut.'" /><input type="hidden" name="fileaction" value="delete" /> 
           <input type="hidden" name="currentpath" value="'.$currentPath.'" /> 
           <center>
           <input type="submit"
           value="Delete '.$currentFile.'" />
           </center>
           </form>';
       
           $displayOut = $displayOut.'<hr />
           <form method="POST">
           <input type="hidden" name="selectfile" 
           value="'.$currentFile.'" />
           <input type="hidden" name="fileaction" value="rename" /> 
           <input type="hidden" name="currentpath" value="'.$currentPath.'" /> 
           <input type="input" name="filenewname" value="Type new name here" /> 
           <input type="submit" 
           value="Rename '.$currentFile.'" />
           </form>
           <hr />';
       }
       $displayOut = $displayOut.'<hr />Add a file to '.$currentPath;
       # file upload form 
       $displayOut = $displayOut.'<form method="post" enctype="multipart/form-data">';
       $displayOut = $displayOut.'<input name="uploaddoc" type="file" />'.
           '<input type="hidden" name="currentpath" value="'.$currentPath.'" />'.
           '<input type="submit" name="storeupl" value="Upload" />'.
           '</form><hr />';
       $displayOut = $displayOut.'<form method="POST">
           <input name="subdir" type="text" />
           <input type="submit" value="Create Subdirectory" />
           </form>
               ';
       return $displayOut;
   }
   sub handler {
       # this handles file management
       my $r = shift;
       my @dirList; # will hold directory listing as array
       my $udir; # returned from home server
       my $currentPath; # path assuming /userfiles/portfolio/ as root
       my $currentFile; # directory or file contained in $pathToRoot.$currentPath
       my $action; # delete, rename, makedirectory, removedirectory,
       my $filenewname; # for rename action (guess what we do with it!)
       my $isFile;
       my $isEmpty;
       &Apache::loncommon::no_cache($r);
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
       # Give the LON-CAPA page header
       $r->print('<html><head><title>'.
                 &mt('Portfolio Manager').
                 "</title></head>\n".
                 &Apache::loncommon::bodytag('Portfolio Manager'));
       $r->rflush();
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['selectfile','currentpath', 'currentfile']);
       # currentPath and currentFile need to be set for the rest of things to happen
       # sometimes, currentFile will be passed by a form field, selectedfile
       # if there is no 'form.selectedfile' then the current directory is 
       # considered as selected 
       if ($ENV{'form.currentpath'}) {
           $currentPath = $ENV{'form.currentpath'};
       } else {
           $currentPath = '/';
       }
       if ($ENV{'form.selectfile'}) {
           # have to check if the selected file is a subdirectory
           if ($ENV{'form.selectfile'} =~ /-\(Dir\)/){
               # $currentPath =~ /\-\(Dir\)/;
               $currentPath = $`.'/';
               $r->print('<br />'.$currentPath.'<br />');
           }
           $currentFile = $ENV{'form.selectfile'};
       } else {
           $currentFile = '';
       }
       # if we're uploading a file, we need to do it early so it will show in the directory list
       if ($ENV{'form.uploaddoc.filename'}) {
           $r->print($ENV{'form.storeupl'}.'<br />');
           $r->print(&Apache::lonnet::userfileupload('uploaddoc','','portfolio'.$currentPath).'<br />');  
       }
       # similarly, we need to delete or rename files before getting directory list
       if ($ENV{'form.selectfile'}){
           if ($ENV{'form.fileaction'} eq 'delete') {
               $r->print('<br />trying to delete '.$currentPath.$ENV{'form.selectfile'}.'<br />');
               $r->print(&Apache::lonnet::removeuserfile($ENV{'user.name'}, $ENV{'user.domain'},'portfolio'.$currentPath.$ENV{'form.selectfile'}));
               $currentFile = '';
           } elsif ($ENV{'form.fileaction'} eq 'rename') {
               &Apache::lonnet::portfoliomanage($currentPath.$ENV{'form.selectfile'}, 'rename', $currentPath.$ENV{'form.filenewname'} );
           }
       }
       # we always need $dirList, plus this will return information about the current file
       # as well as information about he home server directory structure, specifically
       # the path to the users userfiles directory.    
       # 
       my $portfolio_root = &Apache::loncommon::propath($ENV{'user.domain'},
        $ENV{'user.name'}).
          '/userfiles/portfolio';
       my $done = 0;
       my $subdir = '';
       my @workinglist; # intermediate array, holds directory listing lines (dirlist), and path information
       my $readDirectory = 1; # flag for directory
       my $loopCounter = 0; # needed only for development to prevent run away program (or maybe more?)
       while (!$done){
           # Needed while developing. Later, too?
           $loopCounter += 1;
           if ($loopCounter > 50) {
               $r->print('<br />stop runaway');
               return OK;
           }
           # ---
           if ($readDirectory){ # is true the first time through, then true if dirlist line is a subdir
               # $r->print('<br />reading '.$portfolio_root.$subdir);
               my @list = &Apache::lonnet::dirlist($currentPath,  $ENV{'user.domain'}, $ENV{'user.name'}, $portfolio_root.$subdir);
               foreach my $line(@list){
                   $line = $line.'&'.$subdir; # append the subdirectory information
                   my ($fileName,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef,$subpath)=split(/\&/,$line,17); 
                   if (($fileName ne '.') && ($fileName ne '..')){ # we throw away the current and parent directories
                       $r->print('<br />'.$line);
                       # should this be shift?
                       push @workinglist, $line; # add the line to the working list array
                   }
               }
           }
           my $line = shift @workinglist; #take one off the working list
           if ($line eq '') { # if the working list is empty
               $done = 1;
           }else{
               push @dirList, $line; # and put it in the display list
               my ($fileName,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef,$subpath)=split(/\&/,$line,17); 
               if ($testdir =~ m:^1:) { # true if this is a directory
                   # $r->print('<br />added subdir '.$fileName);
                   $subdir = $subpath.'/'.$fileName; 
                   $readDirectory = 1;
               }else{
                   $readDirectory = 0;
               }
           }
       }
       # if item is directory {  get the next level down
       # my @list = &Apache::lonnet::dirlist($currentPath,  $ENV{'user.domain'}, $ENV{'user.name'}, $portfolio_root.$);
       
       if (@dirList == 2) { # need to know if directory is empty so it can be removed if desired
           $isEmpty = 1;
       } else {
           $isEmpty = 0;
       }
      
       if ($ENV{'form.selectfile'}) {
           if ($ENV{'form.fileaction'} eq 'delete') {
               &Apache::lonnet::portfoliomanage($ENV{'form.selectfile'}, 'delete', undef );
               $ENV{'portfolio.file'} = 'Selected File Deleted';
           } elsif ($ENV{'form.fileaction'} eq 'rename') {
               &Apache::lonnet::portfoliomanage($ENV{'form.selectfile'}, 'rename', $ENV{'form.filenewname'});
           } else {
           # Remember user's file selection for later
           $ENV{'portfolio.file'} = $ENV{'form.selectfile'};
           # offer things user can do with selected file
           }
       }else{
           unless ($ENV{'portfolio.file'}){
               $ENV{'portfolio.file'} = 'No File Selected';
           }
       }
       ##############################
       #
       # Display begins here
       #
       ##############################
       $r->print('<table border=1><tr><td>');
       $r->print(displayDirectory($currentPath, $currentFile, @dirList));
       $r->print('</td>><td>');
       $r->print(displayActions($currentPath, $currentFile, $isEmpty));
       $r->print('</td>></tr></table>');
       $r->print('</blockquote>');
       $r->print("</body>\n</html>\n");
       $r->rflush();
       return OK;
 }  }
   
 1;  1;

Removed from v.1.5  
changed lines
  Added in v.1.16


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