[LON-CAPA-cvs] cvs: loncom /interface lonbulletin.pm londocs.pm lonsimplepage.pm /lonnet/perl lonnet.pm

raeburn raeburn@source.lon-capa.org
Wed, 27 Oct 2010 01:00:44 -0000


This is a MIME encoded message

--raeburn1288141244
Content-Type: text/plain

raeburn		Wed Oct 27 01:00:44 2010 EDT

  Modified files:              
    /loncom/interface	lonbulletin.pm londocs.pm lonsimplepage.pm 
    /loncom/lonnet/perl	lonnet.pm 
  Log:
  - Second arg in lonnet::userfileupload() changed from boolean (coursedoc) to
    $context 
      (possible values: coursedoc, existingfile, overwrite, canceloverwrite, or '').
    - To facilitate overwriting of existing files when uploading to portfolio
  
  
--raeburn1288141244
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20101027010044.txt"

Index: loncom/interface/lonbulletin.pm
diff -u loncom/interface/lonbulletin.pm:1.61 loncom/interface/lonbulletin.pm:1.62
--- loncom/interface/lonbulletin.pm:1.61	Sat Aug  7 19:23:50 2010
+++ loncom/interface/lonbulletin.pm	Wed Oct 27 01:00:38 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Bulletin Board Handler
 #
-# $Id: lonbulletin.pm,v 1.61 2010/08/07 19:23:50 raeburn Exp $
+# $Id: lonbulletin.pm,v 1.62 2010/10/27 01:00:38 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -218,11 +218,11 @@
             }
             if ($group ne '') {
                 $syllabus{'uploaded.photourl'}=
-                    &Apache::lonnet::userfileupload('uploaddoc',1,
+                    &Apache::lonnet::userfileupload('uploaddoc','coursedoc',
                                                     'bulletin/'.$group.'/'.$marker);
             } else {
                 $syllabus{'uploaded.photourl'}=
-                    &Apache::lonnet::userfileupload('uploaddoc',1,
+                    &Apache::lonnet::userfileupload('uploaddoc','coursedoc',
                                                       'bulletin/'.$marker);
             }
         }
Index: loncom/interface/londocs.pm
diff -u loncom/interface/londocs.pm:1.438 loncom/interface/londocs.pm:1.439
--- loncom/interface/londocs.pm:1.438	Thu Sep 23 21:25:43 2010
+++ loncom/interface/londocs.pm	Wed Oct 27 01:00:38 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.438 2010/09/23 21:25:43 www Exp $
+# $Id: londocs.pm,v 1.439 2010/10/27 01:00:38 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1720,7 +1720,7 @@
 # probably the only place in the system where this should be "1"
         my $newidx=&LONCAPA::map::getresidx();
         $destination .= $newidx;
-        my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
+        my $url=&Apache::lonnet::userfileupload('uploaddoc','coursedoc',$destination,
 						$parseaction,$allfiles,
 						$codebase);
         my $ext='false';
@@ -1781,7 +1781,7 @@
     }
     $destination .= $newidx;
     my ($url,$filename);
-    $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
+    $url=&Apache::lonnet::userfileupload($formname.$num,'coursedoc',$destination);
     ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});
     return $filename;
 }
Index: loncom/interface/lonsimplepage.pm
diff -u loncom/interface/lonsimplepage.pm:1.96 loncom/interface/lonsimplepage.pm:1.97
--- loncom/interface/lonsimplepage.pm:1.96	Sat Aug  7 19:23:51 2010
+++ loncom/interface/lonsimplepage.pm	Wed Oct 27 01:00:38 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Simple Page Editor
 #
-# $Id: lonsimplepage.pm,v 1.96 2010/08/07 19:23:51 raeburn Exp $
+# $Id: lonsimplepage.pm,v 1.97 2010/10/27 01:00:38 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -225,10 +225,10 @@
             }
             if ($group ne '') {
                 $syllabus{'uploaded.photourl'}=&Apache::lonnet::userfileupload(
-                                              'uploaddoc',1,"grouppage/$group");
+                                              'uploaddoc','coursedoc',"grouppage/$group");
             } else {
                 $syllabus{'uploaded.photourl'}=
-                &Apache::lonnet::userfileupload('uploaddoc',1,'simplepage');
+                &Apache::lonnet::userfileupload('uploaddoc','coursedoc','simplepage');
             }
         }
         $syllabus{'uploaded.lastmodified'}=time;
Index: loncom/lonnet/perl/lonnet.pm
diff -u loncom/lonnet/perl/lonnet.pm:1.1089 loncom/lonnet/perl/lonnet.pm:1.1090
--- loncom/lonnet/perl/lonnet.pm:1.1089	Fri Oct  1 16:37:35 2010
+++ loncom/lonnet/perl/lonnet.pm	Wed Oct 27 01:00:44 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.1089 2010/10/01 16:37:35 raeburn Exp $
+# $Id: lonnet.pm,v 1.1090 2010/10/27 01:00:44 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -95,6 +95,7 @@
 use File::MMagic;
 use LONCAPA qw(:DEFAULT :match);
 use LONCAPA::Configuration;
+use File::Copy;
 
 my $readit;
 my $max_connection_retries = 10;     # Or some such value.
@@ -2352,8 +2353,12 @@
 # --------------- Take an uploaded file and put it into the userfiles directory
 # input: $formname - the contents of the file are in $env{"form.$formname"}
 #                    the desired filenam is in $env{"form.$formname.filename"}
-#        $coursedoc - if true up to the current course
-#                     if false
+#        $context - possible values: coursedoc, existingfile, overwrite, 
+#                                    canceloverwrite, or ''. 
+#                   if 'coursedoc': upload to the current course
+#                   if 'existingfile': write file to tmp/overwrites directory 
+#                   if 'canceloverwrite': delete file written to tmp/overwrites directory
+#                   $context is passed as argument to &finishuserfileupload
 #        $subdir - directory in userfile to store the file into
 #        $parser - instruction to parse file for objects ($parser = parse)    
 #        $allfiles - reference to hash for embedded objects
@@ -2369,32 +2374,54 @@
 #             or /adm/notfound.html if failure to upload occurse
 
 sub userfileupload {
-    my ($formname,$coursedoc,$subdir,$parser,$allfiles,$codebase,$destuname,
+    my ($formname,$context,$subdir,$parser,$allfiles,$codebase,$destuname,
         $destudom,$thumbwidth,$thumbheight,$resizewidth,$resizeheight)=@_;
     if (!defined($subdir)) { $subdir='unknown'; }
     my $fname=$env{'form.'.$formname.'.filename'};
     $fname=&clean_filename($fname);
-# See if there is anything left
+    # See if there is anything left
     unless ($fname) { return 'error: no uploaded file'; }
     chop($env{'form.'.$formname});
-    if (($formname eq 'screenshot') && ($subdir eq 'helprequests')) { #files uploaded to help request form are handled differently
+    # Files uploaded to help request form, or uploaded to "create course" page are handled differently
+    if ((($formname eq 'screenshot') && ($subdir eq 'helprequests')) ||
+        (($formname eq 'coursecreatorxml') && ($subdir eq 'batchupload')) ||
+         ($context eq 'existingfile') || ($context eq 'canceloverwrite')) {
         my $now = time;
-        my $filepath = 'tmp/helprequests/'.$now;
-        my @parts=split(/\//,$filepath);
-        my $fullpath = $perlvar{'lonDaemons'};
-        for (my $i=0;$i<@parts;$i++) {
-            $fullpath .= '/'.$parts[$i];
-            if ((-e $fullpath)!=1) {
-                mkdir($fullpath,0777);
+        my $filepath;
+        if (($formname eq 'screenshot') && ($subdir eq 'helprequests')) { 
+             $filepath = 'tmp/helprequests/'.$now;
+        } elsif (($formname eq 'coursecreatorxml') && ($subdir eq 'batchupload')) {
+             $filepath = 'tmp/addcourse/'.$destudom.'/web/'.$env{'user.name'}.
+                         '_'.$env{'user.domain'}.'/pending';
+        } elsif (($context eq 'existingfile') || ($context eq 'canceloverwrite')) {
+            my ($docuname,$docudom);
+            if ($destudom) {
+                $docudom = $destudom;
+            } else {
+                $docudom = $env{'user.domain'};
+            }
+            if ($destuname) {
+                $docuname = $destuname;
+            } else {
+                $docuname = $env{'user.name'};
+            }
+            if (exists($env{'form.group'})) {
+                $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
+                $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
+            }
+            $filepath = 'tmp/overwrites/'.$docudom.'/'.$docuname.'/'.$subdir;
+            if ($context eq 'canceloverwrite') {
+                my $tempfile =  $perlvar{'lonDaemons'}.'/'.$filepath.'/'.$fname;
+                if (-e  $tempfile) {
+                    my @info = stat($tempfile);
+                    if ($info[9] eq $env{'form.timestamp'}) {
+                        unlink($tempfile);
+                    }
+                }
+                return;
             }
         }
-        open(my $fh,'>'.$fullpath.'/'.$fname);
-        print $fh $env{'form.'.$formname};
-        close($fh);
-        return $fullpath.'/'.$fname;
-    } elsif (($formname eq 'coursecreatorxml') && ($subdir eq 'batchupload')) { #files uploaded to create course page are handled differently
-        my $filepath = 'tmp/addcourse/'.$destudom.'/web/'.$env{'user.name'}.
-                       '_'.$env{'user.domain'}.'/pending';
+        # Create the directory if not present
         my @parts=split(/\//,$filepath);
         my $fullpath = $perlvar{'lonDaemons'};
         for (my $i=0;$i<@parts;$i++) {
@@ -2406,22 +2433,26 @@
         open(my $fh,'>'.$fullpath.'/'.$fname);
         print $fh $env{'form.'.$formname};
         close($fh);
-        return $fullpath.'/'.$fname;
+        if ($context eq 'existingfile') {
+            my @info = stat($fullpath.'/'.$fname);
+            return ($fullpath.'/'.$fname,$info[9]);
+        } else {
+            return $fullpath.'/'.$fname;
+        }
     }
     if ($subdir eq 'scantron') {
         $fname = 'scantron_orig_'.$fname;
     } else {   
-# Create the directory if not present
         $fname="$subdir/$fname";
     }
-    if ($coursedoc) {
+    if ($context eq 'coursedoc') {
 	my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
 	my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
         if ($env{'form.folder'} =~ m/^(default|supplemental)/) {
             return &finishuserfileupload($docuname,$docudom,
 					 $formname,$fname,$parser,$allfiles,
 					 $codebase,$thumbwidth,$thumbheight,
-                                         $resizewidth,$resizeheight);
+                                         $resizewidth,$resizeheight,$context);
         } else {
             $fname=$env{'form.folder'}.'/'.$fname;
             return &process_coursefile('uploaddoc',$docuname,$docudom,
@@ -2434,8 +2465,7 @@
 	return &finishuserfileupload($docuname,$docudom,$formname,$fname,
 				     $parser,$allfiles,$codebase,
                                      $thumbwidth,$thumbheight,
-                                     $resizewidth,$resizeheight);
-        
+                                     $resizewidth,$resizeheight,$context);
     } else {
         my $docuname=$env{'user.name'};
         my $docudom=$env{'user.domain'};
@@ -2446,13 +2476,13 @@
 	return &finishuserfileupload($docuname,$docudom,$formname,$fname,
 				     $parser,$allfiles,$codebase,
                                      $thumbwidth,$thumbheight,
-                                     $resizewidth,$resizeheight);
+                                     $resizewidth,$resizeheight,$context);
     }
 }
 
 sub finishuserfileupload {
     my ($docuname,$docudom,$formname,$fname,$parser,$allfiles,$codebase,
-        $thumbwidth,$thumbheight,$resizewidth,$resizeheight) = @_;
+        $thumbwidth,$thumbheight,$resizewidth,$resizeheight,$context) = @_;
     my $path=$docudom.'/'.$docuname.'/';
     my $filepath=$perlvar{'lonDocRoot'};
   
@@ -2478,7 +2508,23 @@
 	    print STDERR ('Failed to create '.$filepath.'/'.$file."\n");
 	    return '/adm/notfound.html';
 	}
-	if (!print FH ($env{'form.'.$formname})) {
+        if ($context eq 'overwrite') {
+            my $source =  $perlvar{'lonDaemons'}.'/tmp/overwrites/'.$docudom.'/'.$docuname.'/'.$fname;
+            my $target = $filepath.'/'.$file;
+            if (-e $source) {
+                my @info = stat($source);
+                if ($info[9] eq $env{'form.timestamp'}) {   
+                    unless (&File::Copy::move($source,$target)) {
+                        &logthis('Failed to overwrite '.$filepath.'/'.$file);
+                        return "Moving from $source failed";
+                    }
+                } else {
+                    return "Temporary file: $source had unexpected date/time for last modification";
+                }
+            } else {
+                return "Temporary file: $source missing";
+            }
+        } elsif (!print FH ($env{'form.'.$formname})) {
 	    &logthis('Failed to write to '.$filepath.'/'.$file);
 	    print STDERR ('Failed to write to '.$filepath.'/'.$file."\n");
 	    return '/adm/notfound.html';
@@ -11350,8 +11396,10 @@
            filename, and the contents of the file to create/modifed exist
            the filename is in $env{'form.'.$formname.'.filename'} and the
            contents of the file is located in $env{'form.'.$formname}
- coursedoc - if true, store the file in the course of the active role
-             of the current user
+ context - if coursedoc, store the file in the course of the active role
+             of the current user; 
+           if 'existingfile': store in 'overwrites' in /home/httpd/perl/tmp
+           if 'canceloverwrite': delete file in tmp/overwrites directory
  subdir - required - subdirectory to put the file in under ../userfiles/
          if undefined, it will be placed in "unknown"
 
@@ -11373,16 +11421,27 @@
 
 =item *
 
-finishuserfileupload(): routine that creaes and sends the file to
+finishuserfileupload(): routine that creates and sends the file to
 userspace, probably shouldn't be called directly
 
   docuname: username or courseid of destination for the file
   docudom: domain of user/course of destination for the file
   formname: same as for userfileupload()
-  fname: filename (inculding subdirectories) for the file
+  fname: filename (including subdirectories) for the file
+  parser: if 'parse', will parse (html) file to extract references to objects, links etc.
+  allfiles: reference to hash used to store objects found by parser
+  codebase: reference to hash used for codebases of java objects found by parser
+  thumbwidth: width (pixels) of thumbnail to be created for uploaded image
+  thumbheight: height (pixels) of thumbnail to be created for uploaded image
+  resizewidth: width to be used to resize image using resizeImage from ImageMagick
+  resizeheight: height to be used to resize image using resizeImage from ImageMagick
+  context: if 'overwrite', will move the uploaded file from its temporary location to
+            userfiles to facilitate overwriting a previously uploaded file with same name.
 
  returns either the url of the uploaded file (/uploaded/....) if successful
- and /adm/notfound.html if unsuccessful
+ and /adm/notfound.html if unsuccessful (or an error message if context 
+ was 'overwrite').
+ 
 
 =item *
 

--raeburn1288141244--