--- loncom/interface/portfolio.pm 2009/01/03 19:14:19 1.204
+++ loncom/interface/portfolio.pm 2013/07/03 16:00:03 1.247
@@ -1,7 +1,7 @@
# The LearningOnline Network
# portfolio browser
#
-# $Id: portfolio.pm,v 1.204 2009/01/03 19:14:19 raeburn Exp $
+# $Id: portfolio.pm,v 1.247 2013/07/03 16:00:03 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -38,7 +38,7 @@ use Apache::lonnet;
use Apache::longroup;
use Apache::lonhtmlcommon;
use HTML::Entities;
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
sub group_args {
my $output;
@@ -63,7 +63,7 @@ sub group_form_data {
return $output;
}
-# receives a file name and path stub from username/userfiles/portfolio/
+# receives a filename and path stub from username/userfiles/portfolio/
# returns an anchor tag consisting encoding filename and currentpath
sub make_anchor {
my ($url, $anchor_fields, $inner_text) = @_;
@@ -80,7 +80,7 @@ sub make_anchor {
my $dirptr=16384;
sub display_common {
- my ($r,$url,$current_path,$is_empty,$dir_list,$can_upload)=@_;
+ my ($r,$url,$current_path,$is_empty,$dir_list,$can_upload,$group)=@_;
my $namespace = &get_namespace();
my $port_path = &get_port_path();
if ($can_upload) {
@@ -88,33 +88,30 @@ sub display_common {
my $iconpath= $r->dir_config('lonIconsURL') . "/";
my %lt=&Apache::lonlocal::texthash(
- 'upload' => 'Upload',
- 'upload_label' => 'Upload file to current directory',
- 'createdir' => 'Create Subdirectory',
- 'createdir_label' =>
- 'Create subdirectory in current directory',
- 'parse' => 'If HTML file, upload embedded images/multimedia/css/linked files'
- );
+ 'upload' => 'Upload',
+ 'upload_label' => 'Upload file to current directory',
+ 'createdir' => 'Create Subdirectory',
+ 'createdir_label' => 'Create subdirectory in current directory',
+ 'parse' => 'Upload embedded images/multimedia/css/linked files if HTML file',
+ );
my $escuri = &HTML::Entities::encode($r->uri,'&<>"');
my $help_fileupload = &Apache::loncommon::help_open_topic('Portfolio AddFiles');
my $help_createdir = &Apache::loncommon::help_open_topic('Portfolio CreateDirectory');
-
- # FIXME: This line should be deleted once Portfolio uses breadcrumbs
- $r->print(&Apache::loncommon::help_open_topic('Portfolio About', &mt('Help on the portfolio')));
-
+ my $help_portfolio = &Apache::loncommon::help_open_topic('Portfolio About', &mt('Help on the portfolio'));
+ $r->print(&display_portfolio_usage($group,$help_portfolio));
my $parse_check;
if (!&suppress_embed_prompt()) {
$parse_check = <<"END";
-
END
}
- $r->print('
');
# Upload File
$r->print('
'
.''
.'
'
);
- $r->print('
');
} # end "if can_upload"
my @tree = split (/\//,$current_path);
@@ -157,9 +155,11 @@ END
'selectfile' => $port_path,
'currentpath' => '/',
'mode' => $env{"form.mode"},
+ 'symb' => $env{"form.symb"},
'fieldname' => $env{"form.fieldname"},
'continue' => $env{"form.continue"}
);
+ $r->print(' ');
$r->print(''.&make_anchor($url,\%anchor_fields,$port_path).'/');
if (@tree > 1){
my $newCurrentPath = '/';
@@ -169,6 +169,7 @@ END
'selectfile' => $tree[$i],
'currentpath' => $newCurrentPath,
'mode' => $env{"form.mode"},
+ 'symb' => $env{"form.symb"},
'fieldname' => $env{"form.fieldname"},
'continue' => $env{"form.continue"}
);
@@ -178,13 +179,30 @@ END
$r->print('');
$r->print(&Apache::loncommon::help_open_topic('Portfolio ChangeDirectory'));
&Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path);
- $r->print(' ");
}
+sub display_portfolio_usage {
+ my ($group,$helpitem) = @_;
+ my $disk_quota = &get_quota($group);
+ my $getpropath = 1;
+ my $portfolio_root = &get_portfolio_root();
+ my ($uname,$udom) = &get_name_dom($group);
+ my $current_disk_usage =
+ &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath);
+ return &Apache::loncommon::head_subbox(
+ '
');
+}
+
sub display_directory_line {
my ($r,$select_mode, $filename, $mtime, $size, $css_class,
$line, $access_controls, $curr_access, $now, $version_flag,
@@ -195,7 +213,7 @@ sub display_directory_line {
$r->print($line); # contains first two cells of table
my $lock_info;
if ($version_flag) { # versioned can't be versioned, so TRUE when root file
- $r->print('
');
+ $r->print('
');
$r->print('
'.$version_flag.'
');
} else { # this is a graded or handed back file
my ($user,$domain) = &get_name_dom($env{'form.group'});
@@ -246,7 +264,6 @@ sub display_directory {
my ($r,$url,$current_path,$is_empty,$dir_list,$group,$can_upload,
$can_modify,$can_delete,$can_setacl)=@_;
my $iconpath= $r->dir_config('lonIconsURL') . "/";
- my $display_out;
my $select_mode;
my $checked_files;
my $port_path = &get_port_path();
@@ -263,30 +280,17 @@ sub display_directory {
my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group);
my $now = time;
if ($env{"form.mode"} eq 'selectfile') {
- &select_files($r);
- $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'});
- $select_mode = 'true';
- }
- if ($is_empty && ($current_path ne '/') && $can_delete) {
- $display_out = '';
-
- $r->print($display_out);
- return;
+ &select_files($r,$dir_list);
+ $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'});
+ $select_mode = 'true';
}
if ($select_mode eq 'true') {
$r->print(''
+ );
+ # Delete button
+ $r->print(
+ ''
+ );
+ # Directory is empty, so nothing else to display
+ return;
+ }
+
$r->print("\n".&group_form_data()."\n");
my $href_location="/uploaded/$udom/$uname/$port_path".$current_path;
my $href_edit_location="/editupload/$udom/$uname/$port_path".$current_path;
my @dir_lines;
my %versioned;
- foreach my $dir_line (sort
- {
- my ($afile)=split('&',$a,2);
- my ($bfile)=split('&',$b,2);
- return (lc($afile) cmp lc($bfile));
- } (@$dir_list)) {
- my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$dir_line,16);
- $filename =~ s/\s+$//;
- my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);
- if ($version) {
- my $fullpath = &prepend_group($current_path.$fname.'.'.$extension);
- push(@{ $versioned{$fullpath} },
- [$filename,$dom,$testdir,$size,$mtime,$obs,]);
- } else {
- push(@dir_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]);
- }
+ if (ref($dir_list) eq 'ARRAY') {
+ foreach my $dir_line (sort
+ {
+ my ($afile)=split('&',$a,2);
+ my ($bfile)=split('&',$b,2);
+ return (lc($afile) cmp lc($bfile));
+ } (@{$dir_list})) {
+ my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$dir_line,16);
+ $filename =~ s/\s+$//;
+ my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);
+ if ($version) {
+ my $fullpath = &prepend_group($current_path.$fname.'.'.$extension);
+ push(@{ $versioned{$fullpath} },
+ [$filename,$dom,$testdir,$size,$mtime,$obs,]);
+ } else {
+ push(@dir_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]);
+ }
+ }
}
+ my $zerobyte;
foreach my $dir_line (@dir_lines) {
my ($filename,$dom,$testdir,$size,$mtime,$obs) = @$dir_line;
my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);
@@ -373,12 +418,13 @@ sub display_directory {
$colspan_fill=' colspan="4"';
}
$r->print('
');
- $r->print('
'
+ $r->print('
'
.'
'.&mt('Go to ...').'
');
my %anchor_fields = (
'selectfile' => $filename.'/',
'currentpath' => $current_path.$filename.'/',
'mode' => $env{"form.mode"},
+ 'symb' => $env{"form.symb"},
'fieldname' => $env{"form.fieldname"},
'continue' => $env{"form.continue"}
);
@@ -390,11 +436,16 @@ sub display_directory {
my $css_class = 'LC_browser_file';
my $line;
if ($select_mode eq 'true') {
- $line='
0) {
+ $line='
';
+ } else {
+ $line = '
';
+ $zerobyte ++;
}
- $line.=' />';
} else {
if (exists $locked_files{$fullpath}) {
my %anchor_fields = (
@@ -412,8 +463,7 @@ sub display_directory {
$line .= '';
}
if ($can_modify) {
- my $cat='';
+ my $cat='';
my %anchor_fields = (
'rename' => $filename,
currentpath => $current_path
@@ -475,13 +525,18 @@ sub display_directory {
}
}
if ($select_mode eq 'true') {
- $r->print(&Apache::loncommon::end_data_table().'
+ $r->print(&Apache::loncommon::end_data_table());
+ if ($zerobyte) {
+ $r->print('
'.&mt('[quant,_1,file] in list not selectable as file size is 0 bytes.',$zerobyte).'
');
+ }
+ $r->print('
+
-
+
');
@@ -557,17 +612,19 @@ sub display_file {
}
sub done {
- my ($message,$url)=@_;
- unless (defined $message) {
- $message='Done';
+ my ($linktext,$url)=@_;
+ unless (defined($linktext)) {
+ $linktext='Return to directory';
}
my %anchor_fields = (
'showversions' => $env{'form.showversions'},
'currentpath' => $env{'form.currentpath'},
'fieldname' => $env{'form.fieldname'},
+ 'symb' => $env{'form.symb'},
'mode' => $env{'form.mode'}
);
- my $result = '
');
&close_form($r,$url);
} else {
- $r->print("No file was checked to delete. ");
+ $r->print('
'.&mt('No file was checked to delete.').'
');
$r->print(&done(undef,$url));
}
}
@@ -601,18 +662,21 @@ sub delete_confirmed {
my $port_path = &get_port_path();
my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
$uname);
+ my @msg;
foreach my $delete_file (@files) {
- $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path.
- $env{'form.currentpath'}.
- $delete_file);
+ $result =
+ &Apache::lonnet::removeuserfile(
+ $uname,$udom,$port_path.
+ $env{'form.currentpath'}.
+ $delete_file);
if ($result ne 'ok') {
- $r->print(''
- .&mt('An error occurred ([_1]) while trying to delete [_2].'
- ,$result,&display_file(undef, $delete_file))
- .'
');
- } else {
- $r->print(&mt('File: [_1] deleted.',
- &display_file(undef,$delete_file)));
+ push(@msg, &Apache::lonhtmlcommon::confirm_success(
+ &mt('An error occurred ([_1]) while trying to delete [_2].'
+ ,$result,&display_file(undef, $delete_file)),1));
+ } else {
+ push(@msg, &Apache::lonhtmlcommon::confirm_success(
+ &mt('File: [_1] deleted.'
+ ,&display_file(undef,$delete_file))));
my $file_name = $env{'form.currentpath'}.$delete_file;
$file_name = &prepend_group($file_name);
my %access_controls =
@@ -628,23 +692,24 @@ sub delete_confirmed {
&Apache::lonnet::modify_access_controls($file_name,\%changes,
$udom,$uname);
if ($outcome ne 'ok') {
- $r->print(' '.&mt("An error occurred ([_1]) while ".
- "trying to delete access controls for the file.",$outcome).
- '
');
+ push(@msg, &Apache::lonhtmlcommon::confirm_success(
+ &mt('An error occurred ([_1]) while '.
+ 'trying to delete access controls for the file.',$outcome),1));
} else {
if ($deloutcome eq 'ok') {
- $r->print(' '.&mt('Access controls also deleted for the file.').'
');
+ push(@msg, &mt('Access controls also deleted for the file.')); # FIXME: Does the user really need this message?
} else {
- $r->print(''.' '.
- &mt("An error occurred ([_1]) while ".
- "trying to delete access controls for the file.",$deloutcome).
- '
');
+ push(@msg, &Apache::lonhtmlcommon::confirm_success(
+ &mt('An error occurred ([_1]) while '.
+ 'trying to delete access controls for the file.'
+ ,$deloutcome),1));
}
}
}
}
}
}
+ $r->print(&Apache::loncommon::confirmwrapper(join(' ',@msg)));
$r->print(&done(undef,$url));
}
@@ -664,12 +729,15 @@ sub delete_dir_confirmed {
my $port_path = &get_port_path();
my $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path.
$directory_name);
-
+
if ($result ne 'ok') {
- $r->print(''
- .&mt('An error occurred (dir) ([_1]) while trying to delete [_2].'
- ,$result,$directory_name)
- .' ');
+ $r->print(
+ &Apache::loncommon::confirmwrapper(
+ &Apache::lonhtmlcommon::confirm_success(
+ &mt('An error occurred (dir) ([_1]) while trying to delete [_2].'
+ ,$result,$directory_name),1)));
+ $r->print(&done(undef,$url));
+ return;
} else {
# now remove from recent
&Apache::lonhtmlcommon::remove_recent($namespace,[$directory_name.'/']);
@@ -680,6 +748,10 @@ sub delete_dir_confirmed {
}
$env{'form.currentpath'} = $directory_name;
}
+ $r->print(
+ &Apache::loncommon::confirmwrapper(
+ &Apache::lonhtmlcommon::confirm_success(
+ &mt('Directory successfully deleted'))));
$r->print(&done(undef,$url));
}
@@ -689,7 +761,11 @@ sub rename {
my ($uname,$udom) = &get_name_dom($group);
$file_name = &prepend_group($file_name);
if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
- $r->print("The file is locked and cannot be renamed. ");
+ $r->print(
+ '
'
+ .&mt('The file is locked and cannot be renamed.')
+ .'
'
+ );
$r->print(&done(undef,$url));
} else {
&open_form($r,$url);
@@ -704,13 +780,32 @@ sub rename_confirmed {
my $filenewname=&Apache::lonnet::clean_filename($env{'form.filenewname'});
my ($uname,$udom) = &get_name_dom($group);
my $port_path = &get_port_path();
+
+ # Display warning in case of filename cleaning has changed the filename
+ if ($filenewname ne $env{'form.filenewname'}) {
+ $r->print(
+ '
'
+ .&mt('Invalid characters')
+ .' '
+ .&mt('The new filename was changed from [_1] to [_2].'
+ ,''.&display_file('',$env{'form.filenewname'}).''
+ ,''.&display_file('',$filenewname).'')
+ .'
'
+ );
+
+ }
+
+ # Filename empty?
if ($filenewname eq '') {
- $r->print(''.
- &mt("Error: no valid filename was provided to rename to.").
- ' ');
- $r->print(&done(undef,$url));
- return;
+ $r->print(
+ &Apache::loncommon::confirmwrapper(
+ &Apache::lonhtmlcommon::confirm_success(
+ &mt('Error: no valid filename was provided to rename to.'),1)));
+ $r->print(&done(undef,$url));
+ return;
}
+
+ # Rename the file
my $chg_access;
my $result=
&Apache::lonnet::renameuserfile($uname,$udom,
@@ -719,18 +814,20 @@ sub rename_confirmed {
if ($result eq 'ok') {
$chg_access = &access_for_renamed($filenewname,$group,$udom,$uname);
} else {
- $r->print(''.
- &mt('An error occurred ([_1]) while trying to rename [_2] to [_3].'
- ,$result,&display_file(),&display_file('',$filenewname))
- .' ');
+ $r->print(
+ &Apache::loncommon::confirmwrapper(
+ &Apache::lonhtmlcommon::confirm_success(
+ &mt('An error occurred ([_1]) while trying to rename [_2] to [_3].'
+ ,$result,&display_file(),&display_file('',$filenewname))
+ ,1)));
+ $r->print(&done(undef,$url));
return;
}
- if ($filenewname ne $env{'form.filenewname'}) {
- $r->print(&mt("The new file name was changed from: [_1] to [_2]",
- ''.&display_file('',$env{'form.filenewname'}).'',
- ''.&display_file('',$filenewname).''));
- }
$r->print($chg_access);
+ $r->print(
+ &Apache::loncommon::confirmwrapper(
+ &Apache::lonhtmlcommon::confirm_success(
+ &mt('File successfully renamed'))));
$r->print(&done(undef,$url));
}
@@ -795,7 +892,13 @@ sub display_access {
my $aclcount = keys(%access_controls);
my ($header,$info);
if ($action eq 'chgaccess') {
- $header = '
'.&mt('Allowing others to retrieve file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'
';
$info .= &mt('Access to this file by others can be set to be one or more of the following types: public, passphrase-protected or conditional.');
$info .= '
'.&mt('Public files are available to anyone without the need for login.');
$info .= '
'.&mt('Passphrase-protected files do not require log-in, but will require the viewer to enter the passphrase you set.');
@@ -840,7 +943,7 @@ sub display_access {
sub explain_conditionals {
return
&mt('Conditional files are accessible to logged-in users with accounts in the LON-CAPA network, who satisfy the conditions you set.').' '."\n".
- &mt('The conditions can include affiliation with a particular course, or a user account in a specific domain.').' '."\n".
+ &mt('The conditions can include affiliation with a particular course or community, or a user account in a specific domain.').' '."\n".
&mt('Alternatively access can be granted to people with specific LON-CAPA usernames and domains.');
}
@@ -881,7 +984,7 @@ sub build_access_summary {
guest => 'Passphrase-protected',
domains => 'Conditional: domain-based',
users => 'Conditional: user-based',
- course => 'Conditional: course-based',
+ course => 'Conditional: course/community-based',
);
my @allscopes = ('public','guest','domains','users','course');
foreach my $scope (@allscopes) {
@@ -898,19 +1001,24 @@ sub build_access_summary {
$showstart = &mt('Deleted');
$showend = $showstart;
} else {
- $showstart = localtime($start);
+ $showstart = &Apache::lonlocal::locallocaltime($start);
if ($end == 0) {
$showend = &mt('No end date');
} else {
- $showend = localtime($end);
+ $showend = &Apache::lonlocal::locallocaltime($end);
}
}
$r->print('
'.&mt($scope_desc{$scope}));
+ my $crstype;
if ($scope eq 'course') {
if ($chg ne 'delete') {
my $cid = $content->{'domain'}.'_'.$content->{'number'};
my %course_description = &Apache::lonnet::coursedescription($cid);
$r->print(' ('.$course_description{'description'}.')');
+ $crstype = 'Course';
+ if ($course_description{'type'} ne '') {
+ $crstype = $course_description{'type'};
+ }
}
}
$r->print('
'.&mt('Start: ').$showstart.
@@ -930,8 +1038,6 @@ sub build_access_summary {
foreach my $item ('role','access','section','group') {
$r->print('
');
if ($item eq 'role') {
- my $ucscope = $scope;
- $ucscope =~ s/^(\w)/uc($1)/e;
my $role_output;
foreach my $role (@{$content->{'roles'}{$id}{$item}}) {
if ($role eq 'all') {
@@ -939,7 +1045,7 @@ sub build_access_summary {
} elsif ($role =~ /^cr/) {
$role_output .= (split('/',$role))[3].',';
} else {
- $role_output .= &Apache::lonnet::plaintext($role,$ucscope).',';
+ $role_output .= &Apache::lonnet::plaintext($role,$crstype).',';
}
}
$role_output =~ s/,$//;
@@ -997,8 +1103,8 @@ sub update_access {
}
}
my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'};
- $r->print('
'.&mt('Allowing others to retrieve file: [_1]',
- $port_path.$file_name).'
'."\n");
+ $r->print('
'.&mt('Allowing others to retrieve file: [_1]',
+ ''.$port_path.$file_name.'').'
'."\n");
$file_name = &prepend_group($file_name);
my ($uname,$udom) = &get_name_dom($group);
my ($errors,$outcome,$deloutcome,$new_values,$translation);
@@ -1065,22 +1171,28 @@ sub update_access {
my $totalnew = 0;
my $status = 'new';
my ($firstitem,$lastitem);
- foreach my $newitem ('course','domains','users') {
+ my @types = ('course','domains','users');
+ foreach my $newitem (@types) {
$allnew += $env{'form.new'.$newitem};
}
if ($allnew > 0) {
my $now = time;
my $then = $now + (60*60*24*180); # six months approx.
&open_form($r,$url);
- foreach my $newitem ('course','domains','users') {
+ my %showtypes = &Apache::lonlocal::texthash (
+ course => 'course/community',
+ domains => 'domain',
+ users => 'user',
+ );
+ foreach my $newitem (@types) {
if ($env{'form.new'.$newitem} > 0) {
- $r->print(' '.&mt('Add new [_1]-based access control for portfolio file: [_2]',&mt($newitem),$env{'form.currentpath'}.$env{'form.selectfile'}).'
');
+ $r->print(' '.&mt('Add new [_1]-based[_2] access control for portfolio file: [_3]',''.$showtypes{$newitem},'',''.$env{'form.currentpath'}.$env{'form.selectfile'}.'').'
');
$firstitem = $totalnew;
$lastitem = $totalnew + $env{'form.new'.$newitem};
$totalnew = $lastitem;
my @numbers;
for (my $i=$firstitem; $i<$lastitem; $i++) {
- push (@numbers,$i);
+ push(@numbers,$i);
}
&display_access_row($r,$status,$newitem,\@numbers,
$access_controls{$file_name},$now,$then);
@@ -1092,9 +1204,11 @@ sub update_access {
'currentpath' => $env{'form.currentpath'},
'access' => $env{'form.selectfile'}
);
- $r->print(' '.&make_anchor($url, \%anchor_fields, &mt('Display all access settings for this file')));
+ my @actions;
+ push(@actions, &make_anchor($url, \%anchor_fields, &mt('Display all access settings for this file')));
delete $anchor_fields{'access'};
- $r->print(' '.&make_anchor($url,\%anchor_fields,&mt('Return to directory')));
+ push(@actions, &make_anchor($url,\%anchor_fields,&mt('Return to directory')));
+ $r->print(' '.&Apache::lonhtmlcommon::actionbox(\@actions));
}
return;
}
@@ -1317,7 +1431,7 @@ sub standard_settings {
&build_access_summary($r,$count,$chg,%conditionals);
$r->print(&Apache::loncommon::end_data_table());
} else {
- $r->print(&make_anchor($url,\%anchor_fields,&mt('Add conditional access')).' '.&mt('based on domain, username, or course affiliation.'));
+ $r->print(&make_anchor($url,\%anchor_fields,&mt('Add conditional access')).' '.&mt('based on domain, username, or course/community affiliation.'));
}
}
@@ -1351,10 +1465,12 @@ sub acl_status {
sub access_element {
my ($r,$type,$acl_count,$items,$access_controls,$now,$then) = @_;
- my $title = $type;
- $title =~ s/s$//;
- $title =~ s/^(\w)/uc($1)/e;
- $r->print('