[LON-CAPA-cvs] cvs: loncom(version_2_10_X) /interface loncommon.pm

raeburn raeburn@source.lon-capa.org
Tue, 09 Nov 2010 21:18:16 -0000


This is a MIME encoded message

--raeburn1289337496
Content-Type: text/plain

raeburn		Tue Nov  9 21:18:16 2010 EDT

  Modified files:              (Branch: version_2_10_X)
    /loncom/interface	loncommon.pm 
  Log:
  - Backport 1.983, 1.984, 1.985.
  
  
--raeburn1289337496
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20101109211816.txt"

Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.948.2.11 loncom/interface/loncommon.pm:1.948.2.12
--- loncom/interface/loncommon.pm:1.948.2.11	Mon Sep 27 01:16:22 2010
+++ loncom/interface/loncommon.pm	Tue Nov  9 21:18:16 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.948.2.11 2010/09/27 01:16:22 raeburn Exp $
+# $Id: loncommon.pm,v 1.948.2.12 2010/11/09 21:18:16 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -6809,7 +6809,7 @@
                                     should it have jsmath forced on by the
                                     current page
              bread_crumbs ->             Array containing breadcrumbs
-             bread_crumbs_components ->  if exists show it as headline else show only the breadcrumbs
+             bread_crumbs_component ->  if exists show it as headline else show only the breadcrumbs
 
 =back
 
@@ -8437,14 +8437,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'}
@@ -8471,14 +8540,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;
 }
 
@@ -8514,8 +8590,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;
             }
@@ -8542,18 +8617,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
@@ -8619,14 +8701,24 @@
 sub check_for_upload {
     my ($path,$fname,$group,$element,$portfolio_root,$port_path,
         $disk_quota,$current_disk_usage,$uname,$udom) = @_;
-    my $filesize = (length($env{'form.'.$element})) / 1000; #express in k (1024?)
+    my $filesize = length($env{'form.'.$element});
+    if (!$filesize) {
+        my $msg = '<span class="LC_error">'.
+                  &mt('Unable to upload [_1]. (size = [_2] bytes)',
+                      '<span class="LC_filename">'.$fname.'</span>',
+                      $filesize).'<br />'.
+                  &mt('Either the file you uploaded was empty, or your web browser was unable to read its contents.').'<br />';
+                  '</span>';
+        return ('zero_bytes',$msg);
+    }
+    $filesize =  $filesize/1000; #express in k (1024?)
     my $getpropath = 1;
     my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname,
                                             $getpropath);
     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 '') {
@@ -8635,6 +8727,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);
+                    }
+                }
             }
         }
     }
@@ -8652,11 +8758,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);
         }
     }
 }

--raeburn1289337496--