[LON-CAPA-cvs] cvs: loncom /interface loncommon.pm /publisher lonupload.pm

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


This is a MIME encoded message

--raeburn1288141455
Content-Type: text/plain

raeburn		Wed Oct 27 01:04:15 2010 EDT

  Modified files:              
    /loncom/interface	loncommon.pm 
    /loncom/publisher	lonupload.pm 
  Log:
  - Bug 5462. No reference warning or prompt for upload of files, if 
     referenced files are already available at the specified paths.
     - work in progress (change still needed for londocs.pm).
  
  
--raeburn1288141455
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20101027010415.txt"

Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.983 loncom/interface/loncommon.pm:1.984
--- loncom/interface/loncommon.pm:1.983	Sat Oct 23 19:29:50 2010
+++ loncom/interface/loncommon.pm	Wed Oct 27 01:04:10 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.983 2010/10/23 19:29:50 raeburn Exp $
+# $Id: loncommon.pm,v 1.984 2010/10/27 01:04:10 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -8296,14 +8296,83 @@
 
 sub ask_for_embedded_content {
     my ($actionurl,$state,$allfiles,$codebase,$args)=@_;
-    my $upload_output = '
-   <form name="upload_embedded" action="'.$actionurl.'"
-                  method="post" enctype="multipart/form-data">';
-    $upload_output .= $state;
-    $upload_output .= '<b>Upload embedded files</b>:<br />'.&start_data_table();
-
+    my (%subdependencies,%dependencies,%newfiles);
     my $num = 0;
-    foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) {
+    my $upload_output;
+    foreach my $embed_file (keys(%{$allfiles})) {
+        unless ($embed_file =~ m{^\w+://} || $embed_file =~ m{^/}) {
+            my ($relpath,$fname);
+            if ($embed_file =~ m{/}) {
+                my ($path,$fname) = ($embed_file =~ m{^(.+)/([^/]*)$});
+                $subdependencies{$path}{$fname} = 1;
+            } else {
+                $dependencies{$embed_file} = 1;
+            }
+        }
+    }
+    my ($url,$udom,$uname,$getpropath);
+    if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) {
+        my $current_path='/';
+        if ($env{'form.currentpath'}) {
+            $current_path = $env{'form.currentpath'};
+        }
+        if ($actionurl eq '/adm/coursegrp_portfolio') {
+            $udom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+            $uname = $env{'course.'.$env{'request.course.id'}.'.num'};
+            $url = '/userfiles/groups/'.$env{'form.group'}.'/portfolio';
+        } else {
+            $udom = $env{'user.domain'};
+            $uname = $env{'user.name'};
+            $url = '/userfiles/portfolio';
+        }
+        $url .= $current_path;
+        $getpropath = 1;
+    } elsif ($actionurl eq '/adm/upload') {
+        ($uname,my $rest) = ($args->{'current_path'} =~ m{/priv/($match_username)/?(.*)$});
+        $url = '/home/'.$uname.'/public_html';
+        if ($rest ne '') {
+            $url .= '/'.$rest;
+        }
+    }
+    foreach my $path (keys(%subdependencies)) {
+        my %currsubfile;
+        if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { 
+            my @subdir_list = &Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath);
+            foreach my $line (@subdir_list) {
+                my ($file_name,$rest) = split(/\&/,$line,2);
+                $currsubfile{$file_name} = 1;
+            }
+        } elsif ($actionurl eq '/adm/upload') {
+            if (opendir(my $dir,$url.'/'.$path)) {
+                my @subdir_list = grep(!/^\./,readdir($dir));
+                map {$currsubfile{$_} = 1;} @subdir_list;
+            }
+        }
+        foreach my $file (keys(%{$subdependencies{$path}})) {
+            unless ($currsubfile{$file}) {
+                 $newfiles{$path.'/'.$file} = 1; 
+            }
+        }
+    }
+    my (@dir_list,%currfile);
+    if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) {
+        my @dir_list = &Apache::lonnet::dirlist($url,$udom,$uname,$getpropath);
+        foreach my $line (@dir_list) {
+            my ($file_name,$rest) = split(/\&/,$line,2);
+            $currfile{$file_name} = 1;
+        }
+    } elsif ($actionurl eq '/adm/upload') {
+        if (opendir(my $dir,$url)) {
+            @dir_list = grep(!/^\./,readdir($dir));
+            map {$currfile{$_} = 1;} @dir_list;
+        }
+    }
+    foreach my $file (keys(%dependencies)) {
+        unless ($currfile{$file}) {
+            $newfiles{$file} = 1;
+        }
+    }
+    foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%newfiles)) {
         $upload_output .= &start_data_table_row().
             '<td>'.$embed_file.'</td><td>';
         if ($args->{'ignore_remote_references'}
@@ -8330,14 +8399,21 @@
                     &escape($$codebase{$embed_file}).'" />';
             }
         }
-        $upload_output .= '</td>'.&Apache::loncommon::end_data_table_row();
+        $upload_output .= '</td>'.&Apache::loncommon::end_data_table_row()."\n";
         $num++;
     }
-    $upload_output .= &Apache::loncommon::end_data_table().'<br />
-   <input type ="hidden" name="number_embedded_items" value="'.$num.'" />
-   <input type ="submit" value="'.&mt('Upload Listed Files').'" />
-   '.&mt('(only files for which a location has been provided will be uploaded)').'
-   </form>';
+    if ($num) {
+        $upload_output = '<form name="upload_embedded" action="'.$actionurl.'"'.
+                         ' method="post" enctype="multipart/form-data">'."\n".
+                         $state.
+                         '<b>Upload embedded files</b>:<br />'.&start_data_table().
+                         $upload_output.
+                         &Apache::loncommon::end_data_table().'<br />'."\n".
+                         '<input type ="hidden" name="number_embedded_items" value="'.$num.'" />'."\n".
+                         '<input type ="submit" value="'.&mt('Upload Listed Files').'" />'."\n".
+                         &mt('(only files for which a location has been provided will be uploaded)')."\n".
+                         '</form>';
+    }
     return $upload_output;
 }
 
@@ -8373,8 +8449,7 @@
                                               $dir_root,$port_path,$disk_quota,
                                               $current_disk_usage,$uname,$udom);
             if ($state eq 'will_exceed_quota'
-                || $state eq 'file_locked'
-                || $state eq 'file_exists' ) {
+                || $state eq 'file_locked') {
                 $output .= $msg;
                 next;
             }
@@ -8401,18 +8476,25 @@
 
         $env{'form.embedded_item_'.$i.'.filename'}=$fname;
         if ($context eq 'portfolio') {
-            my $result=
-                &Apache::lonnet::userfileupload('embedded_item_'.$i,'',
-                                                $dirpath.$path);
-            if ($result !~ m|^/uploaded/|) {
-                $output .= '<span class="LC_error">'
-                      .&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].'
-                           ,$result,$orig_uploaded_filename,$env{'form.embedded_orig_'.$i})
-                      .'</span><br />';
-                next;
+            my $result;
+            if ($state eq 'existingfile') {
+                $result=
+                    &Apache::lonnet::userfileupload('embedded_item_'.$i,'existingfile',
+                                                    $dirpath.$path,);
             } else {
-                $output .= '<p>'.&mt('Uploaded [_1]','<span class="LC_filename">'.
-                           $path.$fname.'</span>').'</p>';     
+                $result=
+                    &Apache::lonnet::userfileupload('embedded_item_'.$i,'',
+                                                    $dirpath.$path);
+                if ($result !~ m|^/uploaded/|) {
+                    $output .= '<span class="LC_error">'
+                               .&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].'
+                               ,$result,$orig_uploaded_filename,$env{'form.embedded_orig_'.$i})
+                               .'</span><br />';
+                    next;
+                } else {
+                    $output .= '<p>'.&mt('Uploaded [_1]','<span class="LC_filename">'.
+                               $path.$fname.'</span>').'</p>';     
+                }
             }
         } else {
 # Save the file
@@ -8485,7 +8567,7 @@
     my $found_file = 0;
     my $locked_file = 0;
     foreach my $line (@dir_list) {
-        my ($file_name)=split(/\&/,$line,2);
+        my ($file_name,$rest)=split(/\&/,$line,2);
         if ($file_name eq $fname){
             $file_name = $path.$file_name;
             if ($group ne '') {
@@ -8494,6 +8576,20 @@
             $found_file = 1;
             if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
                 $locked_file = 1;
+            } else {
+                my @info = split(/\&/,$rest);
+                my $currsize = $info[6]/1000;
+                if ($currsize < $filesize) {
+                    my $extra = $filesize - $currsize;
+                    if (($current_disk_usage + $extra) > $disk_quota) {
+                        my $msg = '<span class="LC_error">'.
+                                  &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded if existing (smaller) file with same name (size = [_3] kilobytes) is replaced.',
+                                      '<span class="LC_filename">'.$fname.'</span>',$filesize,$currsize).'</span>'.
+                                  '<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',
+                                               $disk_quota,$current_disk_usage);
+                        return ('will_exceed_quota',$msg);
+                    }
+                }
             }
         }
     }
@@ -8511,11 +8607,9 @@
             return ('file_locked',$msg);
         } else {
             my $msg = '<span class="LC_error">';
-            $msg .= &mt('Unable to upload [_1]. A file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$port_path.$env{'form.currentpath'});
+            $msg .= &mt(' A file by that name: [_1] was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$port_path.$env{'form.currentpath'});
             $msg .= '</span>';
-            $msg .= '<br />';
-            $msg .= &mt('To upload, rename or delete existing [_1] in [_2].','<span class="LC_filename">'.$fname.'</span>', $port_path.$env{'form.currentpath'});
-            return ('file_exists',$msg);
+            return ('existingfile',$msg);
         }
     }
 }
Index: loncom/publisher/lonupload.pm
diff -u loncom/publisher/lonupload.pm:1.49 loncom/publisher/lonupload.pm:1.50
--- loncom/publisher/lonupload.pm:1.49	Tue Feb 16 10:26:17 2010
+++ loncom/publisher/lonupload.pm	Wed Oct 27 01:04:15 2010
@@ -2,7 +2,7 @@
 # The LearningOnline Network with CAPA
 # Handler to upload files into construction space
 #
-# $Id: lonupload.pm,v 1.49 2010/02/16 10:26:17 bisitz Exp $
+# $Id: lonupload.pm,v 1.50 2010/10/27 01:04:15 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -350,19 +350,23 @@
             my (%allfiles,%codebase);
             &Apache::lonnet::extract_embedded_items($target,\%allfiles,\%codebase);
             if (keys(%allfiles) > 0) {
+                my ($currentpath) = ($url =~ m{^(.+)/[^/]+$});
                 my $state = <<STATE;
     <input type="hidden" name="action"      value="upload_embedded" />
-    <input type="hidden" name="currentpath" value="$env{'form.currentpath'}" />
     <input type="hidden" name="mode"        value="$mode" />
     <input type="hidden" name="phase"       value="three" />
     <input type="hidden" name="filename" value="$url" />
 STATE
-                $result .= "<h3>".&mt("Reference Warning")."</h3>".
-                           "<p>".&mt("Completed upload of the file. This file contained references to other files.")."</p>".
-                          "<p>".&mt("Please select the locations from which the referenced files are to be uploaded.")."</p>".
-                          &Apache::loncommon::ask_for_embedded_content($action,$state,\%allfiles,\%codebase,
+                my $embedded = &Apache::loncommon::ask_for_embedded_content($action,$state,\%allfiles,\%codebase,
                                       {'error_on_invalid_names'   => 1,
-                                       'ignore_remote_references' => 1,});
+                                       'ignore_remote_references' => 1,
+                                       'current_path'             => $currentpath});
+                if ($embedded) {
+                    $result .= '<h3>'.&mt('Reference Warning').'</h3>'.
+                               '<p>'.&mt('Completed upload of the file. This file contained references to other files.').'</p>'.
+                               '<p>'.&mt('Please select the locations from which the referenced files are to be uploaded.').'</p>'.
+                               $embedded;
+                }
                 if ($mode eq 'testbank') {
                     $returnflag = 'embedded';
                     $result .=  '<p>'.&mt('Or [_1]continue[_2] the testbank import without these files','<a href="javascript:document.testbankForm.submit();">','</a>').'</p>';

--raeburn1288141455--