[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--