--- loncom/interface/portfolio.pm 2007/07/10 20:51:46 1.186 +++ loncom/interface/portfolio.pm 2012/10/04 13:41:10 1.237 @@ -1,7 +1,7 @@ # The LearningOnline Network # portfolio browser # -# $Id: portfolio.pm,v 1.186 2007/07/10 20:51:46 albertel Exp $ +# $Id: portfolio.pm,v 1.237 2012/10/04 13:41:10 bisitz 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; @@ -80,71 +80,88 @@ 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) { my $groupitem = &group_form_data(); my $iconpath= $r->dir_config('lonIconsURL') . "/"; - my %text=&Apache::lonlocal::texthash( - 'upload' => 'Upload', - 'upload_label' => - 'Upload file to current directory:', - 'createdir' => 'Create Subdirectory', - 'createdir_label' => - 'Create subdirectory in current directory:'); + 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' => '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', 'Help on the portfolio')); + my $help_portfolio = &Apache::loncommon::help_open_topic('Portfolio About', &mt('Help on the portfolio')); + $r->print(&display_usage($group)); + my $parse_check; + if (!&suppress_embed_prompt()) { + $parse_check = <<"END"; +
+ + + +END + } + + $r->print('
'.$help_portfolio); + # Upload File + $r->print('
' + .'
' + .'
' + .''.$lt{'upload_label'}.'' + .$groupitem + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .$help_fileupload + .$parse_check + .'
' + .'
' + .'
' + ); + # Create Subdirectory + $r->print('
' + .'
' + .'
' + .''.$lt{'createdir_label'}.'' + .''.$groupitem + .'' + .'' + .'' + .'' + .'' + .'' + .$help_createdir + .'
' + .'
' + .'
' + ); + $r->print('
'); + } # end "if can_upload" - $r->print(<<"TABLE"); - - - - - - - - - -
- $text{'upload_label'} - -
- $groupitem - - - - - - $help_fileupload -
-
- $text{'createdir_label'} - -
- $groupitem - - - - - $help_createdir -
-
-TABLE - } my @tree = split (/\//,$current_path); my %anchor_fields = ( '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 = '/'; @@ -154,6 +171,7 @@ TABLE 'selectfile' => $tree[$i], 'currentpath' => $newCurrentPath, 'mode' => $env{"form.mode"}, + 'symb' => $env{"form.symb"}, 'fieldname' => $env{"form.fieldname"}, 'continue' => $env{"form.continue"} ); @@ -163,27 +181,69 @@ TABLE $r->print(''); $r->print(&Apache::loncommon::help_open_topic('Portfolio ChangeDirectory')); &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path); - $r->print('
print('">'. &Apache::lonhtmlcommon::select_recent($namespace,'currentpath', 'this.form.submit();')); $r->print("
"); } +sub display_usage { + my ($group) = @_; + 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); + my $usage = $current_disk_usage/1000; + my $quota = $disk_quota/1000; + my $percent; + if ($disk_quota == 0) { + $percent = 100.0; + } else { + $percent = 100*($current_disk_usage/$disk_quota); + } + $usage = sprintf("%.2f",$usage); + $quota = sprintf("%.2f",$quota); + $percent = sprintf("%.0f",$percent); + my ($color,$cssclass); + if ($percent <= 60) { + $color = '#00A000'; + } elsif ($percent > 60 && $percent < 90) { + $color = '#FFD300'; + $cssclass = 'class="LC_warning"'; + } elsif( $percent >= 90) { + $color = '#FF0000'; + $cssclass = 'class="LC_error"'; + } + my $prog_width = $percent; + if ($prog_width > 100) { + $prog_width = 100; + } + my $disk_meter = ' +
'.&mt('Currently using [_1] of the [_2] available.',$usage.' MB ('.$percent.'%)',$quota.' MB')."\n". +'
'."\n". +'
'."\n". +'
'."\n". +'
'; + return &Apache::loncommon::head_subbox($disk_meter); +} + sub display_directory_line { my ($r,$select_mode, $filename, $mtime, $size, $css_class, $line, $access_controls, $curr_access, $now, $version_flag, $href_location, $url, $current_path, $access_admin_text, $versions)=@_; my $fullpath = &prepend_group($current_path.$filename); - $r->print(''); + $r->print(&Apache::loncommon::start_data_table_row()); $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(); + my ($user,$domain) = &get_name_dom($env{'form.group'}); my $permissions_hash = &Apache::lonnet::get_portfile_permissions($domain,$user); if (defined($$permissions_hash{$fullpath})) { foreach my $array_item (@{$$permissions_hash{$fullpath}}) { @@ -212,26 +272,29 @@ sub display_directory_line { $r->print(''.$size.''); $r->print(''.&Apache::lonlocal::locallocaltime($mtime).''); if ($select_mode ne 'true') { - $r->print(''. - &mt($curr_access).'   '); + $r->print('  '); # Display status + $r->print('' + .&mt($curr_access).'   ' + ); my %anchor_fields = ( 'access' => $filename, 'currentpath' => $current_path ); $r->print(&make_anchor($url, \%anchor_fields, $access_admin_text).''); + } else { + $r->print('  '); # Display status } - $r->print(''.$/); + $r->print(&Apache::loncommon::end_data_table_row().$/); } 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(); - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $access_admin_text = &mt('View Status'); if ($can_setacl) { $access_admin_text = &mt('View/Change Status'); @@ -244,62 +307,102 @@ 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 = '
'. - &group_form_data(). - ''. - ''. - ''. - ''. - '
'; - - $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('
'); - $r->print(''. - ''); + $r->print(&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .&Apache::loncommon::end_data_table_header_row() + ); } else { $r->print(''); - $r->print(&Apache::loncommon::help_open_topic('Portfolio FileList', - 'Using the portfolio file list')); - $r->print('
Select  NameSizeLast Modified
'.&mt('Select').'  '.&mt('Name').''.&mt('Size').''.&mt('Last Modified').' 
'. - ''); + $r->print( + '

' + .&Apache::loncommon::help_open_topic( + 'Portfolio FileList', + &mt('Using the portfolio file list')) + .'

' + ); + $r->print(&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .&Apache::loncommon::end_data_table_header_row()); } + + # Empty directory? + if ($is_empty && ($current_path ne '/') && $can_delete) { + my $cols = ($select_mode eq 'true') ? 7 : 9; + # Empty message + $r->print( + &Apache::loncommon::start_data_table_row() + .'' + .&Apache::loncommon::end_data_table_row() + .&Apache::loncommon::end_data_table() + .'' + ); + # Delete button + $r->print( + ''. + &group_form_data(). + ''. + '

'. + ''. + '

'. + ''. + ''. + '' + ); + # 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); @@ -333,36 +436,49 @@ sub display_directory { $version_flag = ' '; } if ($dirptr&$testdir) { - my $colspan='colspan="2"'; + my $colspan_folder=''; + my $colspan_fill=''; if ($select_mode eq 'true'){ - undef($colspan); + $colspan_fill=' colspan="3"'; + } else { + $colspan_folder=' colspan="2"'; + $colspan_fill=' colspan="4"'; } - $r->print(''); - $r->print(''); + $r->print(''); + $r->print(''.&mt('closed folder').'' + .''); 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"} ); - $r->print(''); + $r->print('' + .''); + $r->print(' '); $r->print(''); } else { my $css_class = 'LC_browser_file'; my $line; if ($select_mode eq 'true') { - $line=''; + $line.=''; $css_class= 'LC_browser_file_locked'; } else { if (!$can_modify) { @@ -374,13 +490,12 @@ sub display_directory { $line .= ''; } if ($can_modify) { - my $cat=''.&mt('Catalog Information').
-                            ''; + my $cat=''.&mt('Metadata').''; my %anchor_fields = ( 'rename' => $filename, currentpath => $current_path ); - $line .= &make_anchor($url,\%anchor_fields,'Rename'); + $line .= &make_anchor($url,\%anchor_fields,&mt('Rename')); $line .= '
Actions'. - &Apache::loncommon::help_open_topic('Portfolio FileAction'). - '  Name'. - &Apache::loncommon::help_open_topic('Portfolio OpenFile'). - 'SizeLast ModifiedCurrent Access Status'. - &Apache::loncommon::help_open_topic('Portfolio ShareFile'). - '
'.&mt('Actions'). &Apache::loncommon::help_open_topic('Portfolio FileAction').'  '.&mt('Name').&Apache::loncommon::help_open_topic('Portfolio OpenFile').''.&mt('Size').''.&mt('Last Modified').' '.&mt('Current Access Status').&Apache::loncommon::help_open_topic('Portfolio ShareFile').'' + .'

' + .&mt('This directory is empty.') + .'

' + .'
'.&mt('closed folder').'Go to ...
'.&mt('Go to ...').''.$version_flag.''.&make_anchor($url,\%anchor_fields,$filename.'/').''.$version_flag.''.&make_anchor($url,\%anchor_fields,$filename.'/').'
0) { + $line=' $fullpath ); - $line.=''.&make_anchor($url,\%anchor_fields,'Locked').''.&make_anchor($url,\%anchor_fields,&mt('Locked')).''.&make_anchor($href_edit_location.$filename.'.meta',\%anchor_fields,$cat); # ''.$cat.''; } @@ -437,20 +552,29 @@ sub display_directory { } } if ($select_mode eq 'true') { - $r->print('
+ $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(' + -
- +

+
+ +

'); } else { - $r->print(''); + $r->print(&Apache::loncommon::end_data_table()); if ($can_delete) { $r->print(' - '. +

+ '. &Apache::loncommon::help_open_topic('Portfolio DeleteFile').' +

' @@ -523,29 +647,30 @@ sub done { 'showversions' => $env{'form.showversions'}, 'currentpath' => $env{'form.currentpath'}, 'fieldname' => $env{'form.fieldname'}, + 'symb' => $env{'form.symb'}, 'mode' => $env{'form.mode'} ); - my $result = '

'.&make_anchor($url,\%anchor_fields,&mt($message)).'

'; + my $result = '

'.&make_anchor($url,\%anchor_fields,&mt($message)).'

'; return $result; } sub delete { - my ($r,$url)=@_; + my ($r,$url,$group)=@_; my @check; my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'}; $file_name = &prepend_group($file_name); my @files=&Apache::loncommon::get_env_multiple('form.selectfile'); - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { - $r->print("The file is locked and cannot be deleted.
"); + $r->print(&mt('The file is locked and cannot be deleted.').'
'); $r->print(&done('Back',$url)); } else { if (scalar(@files)) { &open_form($r,$url); - $r->print('

'.&mt('Delete').' '.&display_file(undef,\@files).'?

'); + $r->print('

'.&mt('Delete [_1]?',&display_file(undef,\@files)).'

'); &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)); } } @@ -555,7 +680,7 @@ sub delete_confirmed { my ($r,$url,$group)=@_; my @files=&Apache::loncommon::get_env_multiple('form.selectfile'); my $result; - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path(); my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, $uname); @@ -564,10 +689,10 @@ sub delete_confirmed { $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)). - '

'); + $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))); @@ -609,23 +734,25 @@ sub delete_confirmed { sub delete_dir { my ($r,$url)=@_; &open_form($r,$url); - $r->print('

'.&mt('Delete').' '.&display_file().'?

'); + $r->print('

'.&mt('Delete [_1]?',&display_file()).'

'); &close_form($r,$url); } sub delete_dir_confirmed { - my ($r,$url)=@_; + my ($r,$url,$group)=@_; my $directory_name = $env{'form.currentpath'}; $directory_name =~ s|/$||; # remove any trailing slash - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $namespace = &get_namespace(); my $port_path = &get_port_path(); my $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path. $directory_name); if ($result ne 'ok') { - $r->print(' An error occurred (dir) ('.$result. - ') while trying to delete '.$directory_name.'
'); + $r->print('' + .&mt('An error occurred (dir) ([_1]) while trying to delete [_2].' + ,$result,$directory_name) + .'
'); } else { # now remove from recent &Apache::lonhtmlcommon::remove_recent($namespace,[$directory_name.'/']); @@ -640,17 +767,17 @@ sub delete_dir_confirmed { } sub rename { - my ($r,$url)=@_; + my ($r,$url,$group)=@_; my $file_name = $env{'form.currentpath'}.$env{'form.rename'}; - my ($uname,$udom) = &get_name_dom(); + 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(&done(undef,$url)); } else { &open_form($r,$url); - $r->print('

'.&mt('Rename').' '.&display_file().' to - ?

'); + $r->print('

'.&mt('Rename [_1] to [_2]?', &display_file() + , '').'

'); &close_form($r,$url); } } @@ -658,7 +785,7 @@ sub rename { sub rename_confirmed { my ($r,$url,$group)=@_; my $filenewname=&Apache::lonnet::clean_filename($env{'form.filenewname'}); - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path(); if ($filenewname eq '') { $r->print(''. @@ -676,9 +803,9 @@ sub rename_confirmed { $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)).'
'); + &mt('An error occurred ([_1]) while trying to rename [_2] to [_3].' + ,$result,&display_file(),&display_file('',$filenewname)) + .'

'); return; } if ($filenewname ne $env{'form.filenewname'}) { @@ -742,7 +869,7 @@ sub access_for_renamed { sub display_access { my ($r,$url,$group,$can_setacl,$port_path,$action) = @_; - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $file_name = $env{'form.currentpath'}.$env{'form.access'}; $file_name = &prepend_group($file_name); my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, @@ -757,13 +884,13 @@ sub display_access { $info .= '
  • '.&mt('Passphrase-protected files do not require log-in, but will require the viewer to enter the passphrase you set.'); $info .= '
  • '.&explain_conditionals(); $info .= '
  • '. - &mt('A listing of files viewable without log-in is available at: ')."http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme/portfolio.
    "; + &mt('A listing of files viewable without log-in is available at: ')."".&Apache::lonnet::absolute_url($ENV{'SERVER_NAME'})."/adm/$udom/$uname/aboutme/portfolio.
    "; if ($group eq '') { $info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on your personal information page:"); } else { $info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on the course information page:"); } - $info .= "
    http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme
    "; + $info .= "
    ".&Apache::lonnet::absolute_url($ENV{'SERVER_NAME'})."/adm/$udom/$uname/aboutme
    "; if ($group ne '') { $info .= &mt("Users with privileges to edit course contents may add a course information page to a course using the 'Course Info' button in DOCS").'
    '; } @@ -774,14 +901,14 @@ sub display_access { if ($can_setacl) { &open_form($r,$url); $r->print($header.$info); - $r->print('
    '.&Apache::loncommon::help_open_topic('Portfolio ShareFile SetAccess', 'Help on setting up share access')); - $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile ChangeSetting', 'Help on changing settings')); - $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile StopAccess', 'Help on removing share access')); + $r->print('
    '.&Apache::loncommon::help_open_topic('Portfolio ShareFile SetAccess', &mt('Help on setting up share access'))); + $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile ChangeSetting', &mt('Help on changing settings'))); + $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile StopAccess', &mt('Help on removing share access'))); &access_setting_table($r,$url,$file_name,$access_controls{$file_name}, $action); my $button_text = { 'continue' => &mt('Proceed'), - 'cancel' => &mt('Back to directory listing'), + 'cancel' => &mt('Return to directory'), }; &close_form($r,$url,$button_text); } else { @@ -796,7 +923,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.'); } @@ -809,7 +936,7 @@ sub view_access_settings { $todisplay{$scope}{$key} = $$access_controls{$key}; } if ($aclcount) { - $r->print(&mt('

    Current access controls defined for this file:

    ')); + $r->print('

    '.&mt('Current access controls defined for this file:').'

    '); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print(''.&mt('Access control').''.&mt('Dates available'). @@ -820,12 +947,12 @@ sub view_access_settings { &build_access_summary($r,$count,$chg,%todisplay); $r->print(&Apache::loncommon::end_data_table()); } else { - $r->print(&mt('No access control settings currently exist for this file.
    ' )); + $r->print(&mt('No access control settings currently exist for this file.').'
    '); } my %anchor_fields = ( 'currentpath' => $env{'form.currentpath'} ); - $r->print('
    '.&make_anchor($url, \%anchor_fields, &mt('Return to directory listing'))); + $r->print('
    '.&make_anchor($url, \%anchor_fields, &mt('Return to directory'))); return; } @@ -837,7 +964,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) { @@ -854,19 +981,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. @@ -886,8 +1018,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') { @@ -895,7 +1025,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/,$//; @@ -956,7 +1086,7 @@ sub update_access { $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(); + my ($uname,$udom) = &get_name_dom($group); my ($errors,$outcome,$deloutcome,$new_values,$translation); if ($totalprocessed) { ($outcome,$deloutcome,$new_values,$translation) = @@ -1021,16 +1151,22 @@ 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]',$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; @@ -1050,7 +1186,7 @@ sub update_access { ); $r->print('
    '.&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 listing'))); + $r->print('     '.&make_anchor($url,\%anchor_fields,&mt('Return to directory'))); } return; } @@ -1198,7 +1334,7 @@ sub access_setting_table { sub standard_settings { my ($r,$now,$then,$url,$filename,$acl_count,$start,$end,$public,$publicnum, $publictext,$guest,$guestnum,$guesttext,$access_controls,%conditionals)=@_; - $r->print('

    '.&mt('Public access: [_1]',$publictext).'

    '); + $r->print('

    '.&mt('Public access: [_1]',&mt($publictext)).'

    '); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print(''.&mt('Action').''.&mt('Dates available').''); @@ -1214,7 +1350,7 @@ sub standard_settings { $r->print(&Apache::loncommon::end_data_table_row()); $r->print(&Apache::loncommon::end_data_table()); $r->print(' '); - $r->print('

    '.&mt('Passphrase-protected access: [_1]',$guesttext).'

    '); + $r->print('

    '.&mt('Passphrase-protected access: [_1]',&mt($guesttext)).'

    '); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print(''.&mt('Action').''.&mt('Dates available'). @@ -1260,7 +1396,7 @@ sub standard_settings { 'action' => 'chgconditions', 'currentpath' => $env{'form.currentpath'}, ); - $r->print('

    '.&mt('Conditional access: [_1]',$conditionstext).'

    '); + $r->print('

    '.&mt('Conditional access: [_1]',&mt($conditionstext)).'

    '); if ($numconditionals > 0) { my $count = 1; my $chg = 'none'; @@ -1273,7 +1409,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.')); } } @@ -1307,10 +1443,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('

    '.&mt('[_1]-based conditional access: ',$title)); + my %typetext = &Apache::lonlocal::texthash( + domains => 'Domain', + users => 'User', + course => 'Course/Community' + ); + $r->print('

    '.&mt('[_1]-based conditional access: ',$typetext{$type})); if ($$acl_count{$type}) { $r->print($$acl_count{$type}.' '); if ($$acl_count{$type} > 1) { @@ -1328,17 +1466,24 @@ sub access_element { sub display_access_row { my ($r,$status,$type,$items,$access_controls,$now,$then) = @_; + my $showtype; + if ($type eq 'course') { + $showtype = &mt('Courses/Communities'); + } elsif ($type eq 'domains') { + $showtype = &mt('Domains'); + } elsif ($type eq 'users') { + $showtype = &mt('Users'); + } if (@{$items} > 0) { my @all_doms; my $colspan = 3; - my $uctype = $type; - $uctype =~ s/^(\w)/uc($1)/e; $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); - $r->print(''.&mt('Action?').''.&mt($uctype).''. + $r->print(''.&mt('Action?').''.$showtype.''. &mt('Dates available').''); if ($type eq 'course' && $status eq 'old') { - $r->print(''.&mt('Allowed [_1] member affiliations',$type). + + $r->print(''.&mt('Allowed course/community affiliations'). ''); $colspan ++; } elsif ($type eq 'domains') { @@ -1365,7 +1510,7 @@ sub display_access_row { } $r->print(&Apache::loncommon::end_data_table()); } else { - $r->print(&mt('No [_1]-based conditions defined.
    ',$type). + $r->print(&mt('No [_1]-based conditions defined.',$showtype).'
    '. &additional_item($type)); } return; @@ -1427,17 +1572,20 @@ sub course_row { } my $js = &Apache::loncommon::coursebrowser_javascript($defdom) .&course_js(); - my $uctype = $type; - $uctype =~ s/^(\w)/uc($1)/e; + my $showtype = &mt('Course/Community'); + my $crstype = 'Course'; my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then, $type); $r->print(''.$js.&actionbox($status,$num,$scope).''); if ($status eq 'old') { my $cid = $content->{'domain'}.'_'.$content->{'number'}; my %course_description = &Apache::lonnet::coursedescription($cid); + if ($course_description{'type'} ne '') { + $crstype = $course_description{'type'}; + } $r->print(''.$course_description{'description'}.''); } elsif ($status eq 'new') { - $r->print(''.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,$num.'_1',undef,$uctype).'  '); + $r->print(''.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,$num.'_1',undef,$showtype).'  '); } $r->print(''.&dateboxes($num,$start,$end)); my $newrole_id = 1; @@ -1455,19 +1603,19 @@ sub course_row { $max_id = $role_id; } $max_id ++; - my $role_selects = &role_selectors($num,$role_id,$type,$content,'display'); - $r->print('
    '.$role_selects.''); + my $role_selects = &role_selectors($num,$role_id,$crstype,$content,'display'); + $r->print('
    '.$role_selects.''); } $r->print(''); } $r->print('
    '.&mt('Add a roles-based condition'). - ' {'domain'}','$content->{'number'}', - '$uctype'".')" value="" />'); + '$showtype'".')" value="" />'); $newrole_id = $max_id; } else { - $r->print(''); + $r->print(''); } $r->print(&add_course_role($num,$newrole_id)); $r->print(''); @@ -1488,14 +1636,14 @@ sub domains_row { my ($r,$status,$item,$all_doms,$access_controls,$now,$then) = @_; my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then, 'domains'); - my $dom_select = ''. ' '; if ($status eq 'old') { my $content = $$access_controls{$item}; foreach my $dom (@{$all_doms}) { if ((@{$content->{'dom'}} > 0) && (grep(/^\Q$dom\E$/,@{$content->{'dom'}}))) { - $dom_select .= ''; } else { $dom_select .= ''; @@ -1525,13 +1673,21 @@ sub users_row { sub additional_item { my ($type) = @_; - my $output = &mt('Add new [_1] condition(s)?',$type).' '.&mt('Number to add: ').''; + my $showtype; + if ($type eq 'course') { + $showtype = &mt('course/community'); + } elsif ($type eq 'domains') { + $showtype = &mt('domains'); + } elsif ($type eq 'users') { + $showtype = &mt('users'); + } + my $output = &mt('Add new [_1] condition(s)?',$showtype).' '.&mt('Number to add: ').''; return $output; } sub actionbox { my ($status,$num,$scope) = @_; - my $output = '
    '. '

    +
    +$hidden +$group_elem +
    +END } sub lock_info { my ($r,$url,$group) = @_; - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, $uname); my $file_name = $env{'form.lockinfo'}; @@ -1925,8 +2240,7 @@ sub lock_info { my %course_description = &Apache::lonnet::coursedescription($$array_item[1]); if ( $course_description{'description'} ne '') { - $r->print(&mt('In the course: [_1]
    ', - $course_description{'description'})); + $r->print(&mt('In the course:').' '.$course_description{'description'}.'
    '); } } } @@ -1935,7 +2249,7 @@ sub lock_info { } sub createdir { - my ($r,$url)=@_; + my ($r,$url,$group)=@_; my $newdir=&Apache::lonnet::clean_filename($env{'form.newdir'}); if ($newdir eq '') { $r->print(''. @@ -1945,29 +2259,35 @@ sub createdir { return; } my $portfolio_root = &get_portfolio_root(); - my @dir_list=&get_dir_list($portfolio_root); + my ($dirlistref,$listerror) = &get_dir_list($portfolio_root,undef,$group); my $found_file = 0; - foreach my $line (@dir_list) { - my ($filename)=split(/\&/,$line,2); - if ($filename eq $newdir){ - $found_file = 1; + if (ref($dirlistref) eq 'ARRAY') { + foreach my $line (@{$dirlistref}) { + my ($filename)=split(/\&/,$line,2); + if ($filename eq $newdir){ + $found_file = 1; + } } } if ($found_file){ - $r->print(''.&mt('Unable to create a directory named').' '.$newdir. - ' '.&mt('a file or directory by that name already exists.').'
    '); + $r->print('' + .&mt('Unable to create a directory named [_1].',''.$newdir.'') + .' '.&mt('A file or directory by that name already exists.').'
    '); } else { - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path(); my $result=&Apache::lonnet::mkdiruserfile($uname,$udom, $port_path.$env{'form.currentpath'}.$newdir); if ($result ne 'ok') { - $r->print(''.'An error occurred ('.$result. - ') while trying to create a new directory '.&display_file().'
    '); + $r->print('' + .&mt('An error occurred ([_1]) while trying to create a new directory [_2].' + ,$result,&display_file()) + .'
    '); } } if ($newdir ne $env{'form.newdir'}) { - $r->print(&mt("The new directory name was changed from:
    ").$env{'form.newdir'}." ".&mt('to')." $newdir "); + $r->print(&mt('The new directory name was changed from [_1] to [_2].' + ,''.$env{'form.newdir'}.'',''.$newdir.'')); } $r->print(&done(undef,$url)); } @@ -1975,7 +2295,7 @@ sub createdir { sub get_portfolio_root { my ($udom,$uname,$group) = @_; if (!(defined($udom)) || !(defined($uname))) { - ($uname,$udom) = &get_name_dom(); + ($uname,$udom) = &get_name_dom($group); } my $path = '/userfiles/portfolio'; if (!defined($group)) { @@ -1986,7 +2306,7 @@ sub get_portfolio_root { if (defined($group)) { $path = '/userfiles/groups/'.$group.'/portfolio'; } - return (&Apache::loncommon::propath($udom,$uname).$path); + return $path; } sub get_group_quota { @@ -2001,21 +2321,23 @@ sub get_group_quota { $group_quota = $group_info{'quota'}; #expressed in Mb if ($group_quota) { $group_quota = 1000 * $group_quota; #expressed in k - } + } } return $group_quota; -} +} sub get_dir_list { - my ($portfolio_root,$path) = @_; + my ($portfolio_root,$path,$group) = @_; $path ||= $env{'form.currentpath'}; - my ($uname,$udom) = &get_name_dom(); - return &Apache::lonnet::dirlist($path,$udom,$uname,$portfolio_root); + my ($uname,$udom) = &get_name_dom($group); + my $getpropath = 1; + return &Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname,$getpropath); } sub get_name_dom { + my ($group) = @_; my ($uname,$udom); - if (defined($env{'form.group'})) { + if (defined($group)) { $udom = $env{'course.'.$env{'request.course.id'}.'.domain'}; $uname = $env{'course.'.$env{'request.course.id'}.'.num'}; } else { @@ -2036,7 +2358,7 @@ sub prepend_group { sub get_namespace { my $namespace = 'portfolio'; if (defined($env{'form.group'})) { - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($env{'form.group'}); $namespace .= '_'.$udom.'_'.$uname.'_'.$env{'form.group'}; } return $namespace; @@ -2068,18 +2390,17 @@ sub missing_priv { $rtnlink .= '?'; } $rtnlink .= 'currentpath='.$escpath; - $r->print(&mt('

    Action disallowed

    ')); + $r->print('

    '.&mt('Action disallowed').'

    '); $r->print(&mt('You do not have sufficient privileges to [_1] ', $longtext->{$priv})); if (defined($env{'form.group'})) { - $r->print(&mt("in the group's file repository.")); + $r->print(&mt("in the group's group portfolio.")); $rtnlink .= &group_args() } else { $r->print(&mt('in this portfolio.')); } - $rtnlink .= '">'.&mt('Return to directory listing page').''; + $rtnlink .= '">'.&mt('Return to directory').''; $r->print('
    '.$rtnlink); - $r->print(&Apache::loncommon::end_page()); return; } @@ -2124,13 +2445,38 @@ sub get_quota { return $disk_quota; } +sub suppress_embed_prompt { + my $suppress_prompt = 0; + if (($env{'request.role'} =~ /^st/) && ($env{'request.course.id'} ne '')) { + if ($env{'course.'.$env{'request.course.id'}.'.suppress_embed_prompt'} eq 'yes') { + $suppress_prompt = 1; + } + } + return $suppress_prompt; +} + +sub embedded_form_elems { + my ($container) = @_; + my $state = < + + + + +STATE + if ($env{'form.group'} ne '') { + $state .= ''."\n"; + } + return $state; +} + sub handler { # this handles file management my $r = shift; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['selectfile','currentpath','meta','lockinfo','currentfile','action', 'fieldname','mode','rename','continue','group','access','setnum', - 'cnum','cdom','type','setroles','showversions','ref']); + 'cnum','cdom','type','setroles','showversions','ref','symb']); my ($uname,$udom,$portfolio_root,$url,$caller,$title,$group,$grp_desc); if ($r->uri =~ m|^(/adm/)([^/]+)|) { $url = $1.$2; @@ -2150,8 +2496,8 @@ sub handler { &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); $env{'form.group'} =~ s/\W//g; $group = $env{'form.group'}; - if ($group) { - ($uname,$udom) = &get_name_dom(); + if ($group ne '') { + ($uname,$udom) = &get_name_dom($group); my %curr_groups = &Apache::longroup::coursegroups($udom,$uname, $group); if (%curr_groups) { @@ -2169,7 +2515,7 @@ sub handler { $r->print(&mt('Not a valid group for this course')); $earlyout = 1; } - $title = &mt('Group files').' for '.$group; + $title = &mt('Group portfolio for [_1]', $group); } else { $r->print(&mt('Invalid group')); $earlyout = 1; @@ -2197,7 +2543,7 @@ sub handler { } else { ($uname,$udom) = &get_name_dom(); $portfolio_root = &get_portfolio_root(); - $title = &mt('Portfolio Manager'); + $title = &mt('My Space'); $can_modify = 1; $can_delete = 1; $can_upload = 1; @@ -2209,46 +2555,113 @@ sub handler { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; # Give the LON-CAPA page header + my $brcrum = [{href=>"/adm/portfolio",text=>"Portfolio Manager"}]; + if ($env{"form.mode"} eq 'selectfile'){ $r->print(&Apache::loncommon::start_page($title,undef, {'only_body' => 1})); } elsif ($env{'form.action'} eq 'rolepicker') { $r->print(&Apache::loncommon::start_page('New role-based condition',undef, {'no_nav_bar' => 1, })); - } else { + } elsif ($caller eq 'coursegrp_portfolio') { $r->print(&Apache::loncommon::start_page($title)); + } else { + $r->print(&Apache::loncommon::start_page($title,undef, + {'bread_crumbs' => $brcrum})); + if (!&Apache::lonnet::usertools_access($uname,$udom,'portfolio')) { + $r->print('

    '.&mt('No user portfolio available') .'

    '. + &mt('This is a result of one of the following:').'
      '. + '
    • '.&mt('The administrator of this domain has disabled portfolio functionality for this specific user.').'
    • '. + '
    • '.&mt('The domain has been configured to disable, by default, portfolio functionality for all users in the domain.').'
    • '. + '
    '); + $r->print(&Apache::loncommon::end_page()); + return OK; + } } $r->rflush(); + # Check if access to portfolio is blocked by one or more blocking events in courses. my ($blocked,$blocktext) = &Apache::loncommon::blocking_status('port',$uname,$udom); if ($blocked) { - $r->print($blocktext); - $r->print(&Apache::loncommon::end_page()); - return OK; - } - if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){ - $r->print(''); - $r->print(&mt('No file was selected to upload. ')); - $r->print(&mt('To upload a file, click Browse... select a file, then click Upload.')); - $r->print(''); - } + my $evade_block; + # If portfolio display is in a window popped up from a "Select Portfolio Files" + # link in a .task resource, check if access to the task included proctor validation + # of check-in to a slot limited by IP. + # If so, and the slot is between its open and close dates, override the block. + if ($env{'request.course.id'} && $env{'form.symb'}) { + (undef,undef,my $res) = &Apache::lonnet::decode_symb($env{'form.symb'}); + if ($res =~ /\.task$/i) { + my %history = + &Apache::lonnet::restore($env{'form.symb'},$env{'request.course.id'}, + $env{'user.domain'},$env{'user.name'}); + my $version = $history{'resource.0.version'}; + if ($history{'resource.'.$version.'.0.checkedin'}) { + if ($history{'resource.'.$version.'.0.checkedin.slot'}) { + my %slot = &Apache::lonnet::get_slot($history{'resource.'.$version.'.0.checkedin.slot'}); + if ($slot{'ip'}) { + if (&Apache::loncommon::check_ip_acc($slot{'ip'})) { + my $now = time; + if (($slot{'slottime'} < $now) && ($slot{'endtime'} > $now)) { + $evade_block = 1; + } + } + } + } + } + } + } + unless ($evade_block) { + $r->print($blocktext); + $r->print(&Apache::loncommon::end_page()); + return OK; + } + } + if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){ + $r->print(''); + $r->print(&mt('No file was selected to upload.').' '); + $r->print(&mt('To upload a file, click Browse... and select a file, then click Upload.')); + $r->print(''); + } if ($env{'form.meta'}) { &open_form($r,$url); $r->print(&mt('Edit the meta data').'
    '); &close_form($r,$url); } - if ($env{'form.store'}) { - } - if ($env{'form.uploaddoc.filename'}) { if ($can_upload) { &upload($r,$url,$group); } else { &missing_priv($r,$url,'upload'); } + } elsif ($env{'form.action'} eq 'process_overwrite') { + if ($can_upload) { + &overwrite($r,$url,$group); + } else { + &missing_priv($r,$url,'existingfile'); + } } elsif ($env{'form.action'} eq 'upload_embedded') { if ($can_upload) { - &upload_embedded($r,$url,$group); + my $disk_quota = &get_quota($group); + my $getpropath = 1; + my $current_disk_usage = + &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath); + my $container = &HTML::Entities::encode($env{'form.container'},'<>&"'); + my $state = &embedded_form_elems($container). + ''; + my ($result,$flag) = + &Apache::loncommon::upload_embedded('portfolio',$port_path,$uname,$udom, + $group,$portfolio_root,$group,$disk_quota,$current_disk_usage,$state,$url); + $r->print($result.&done('Return to directory',$url)); + } else { + &missing_priv($r,$url,'upload'); + } + } elsif ($env{'form.action'} eq 'modify_orightml') { + if ($can_upload) { + my $result = + &Apache::loncommon::modify_html_refs('portfolio',$port_path,$uname,$udom,$group, + $portfolio_root,$group); + $r->print($result. + &done('Return to directory',$url)); } else { &missing_priv($r,$url,'upload'); } @@ -2260,13 +2673,13 @@ sub handler { } } elsif ($env{'form.action'} eq 'delete') { if ($can_delete) { - &delete($r,$url); + &delete($r,$url,$group); } else { &missing_priv($r,$url,'delete'); } } elsif ($env{'form.action'} eq 'deletedir' && $env{'form.confirmed'}) { if ($can_delete) { - &delete_dir_confirmed($r,$url); + &delete_dir_confirmed($r,$url,$group); } else { &missing_priv($r,$url,'delete'); } @@ -2286,7 +2699,7 @@ sub handler { $env{'form.selectfile'} = $env{'form.rename'}; $env{'form.action'} = 'rename'; if ($can_modify) { - &rename($r,$url); + &rename($r,$url,$group); } else { &missing_priv($r,$url,'rename'); } @@ -2311,13 +2724,23 @@ sub handler { } } elsif ($env{'form.createdir'}) { if ($can_upload) { - &createdir($r,$url); + &createdir($r,$url,$group); } else { &missing_priv($r,$url,'upload'); } } elsif ($env{'form.lockinfo'}) { &lock_info($r,$url,$group); } else { + if ($env{'form.action'} eq 'cancel_overwrite') { + if ($can_upload) { + my $formname = 'existingfile'; + my $fname = &Apache::lonnet::clean_filename($env{'form.filename'}); + $env{'form.'.$formname.'.filename'} = $fname; + my $subdir = $port_path.$env{'form.currentpath'}; + $subdir =~ s{(/)$}{}; + &Apache::lonnet::userfileupload($formname,'canceloverwrite',$subdir); + } + } my $current_path='/'; if ($env{'form.currentpath'}) { $current_path = $env{'form.currentpath'}; @@ -2326,8 +2749,9 @@ sub handler { &Apache::lonhtmlcommon::clear_breadcrumbs(); $r->print(&coursegrp_portfolio_header($udom,$uname,$grp_desc)); } - my @dir_list=&get_dir_list($portfolio_root); - if ($dir_list[0] eq 'no_such_dir'){ + my ($dirlistref,$listerror) = + &get_dir_list($portfolio_root,$current_path,$group); + if ($listerror eq 'no_such_dir'){ # two main reasons for this: # 1) never been here, so directory structure not created # 2) back-button navigation after deleting a directory @@ -2342,17 +2766,25 @@ sub handler { $current_path = '/'; # force it back to the root } # now grab the directory list again, for the first time - @dir_list=&Apache::lonnet::dirlist($current_path, - $udom,$uname,$portfolio_root); + ($dirlistref,$listerror) = + &get_dir_list($portfolio_root,$current_path,$group); } # need to know if directory is empty so it can be removed if desired - my $is_empty=(@dir_list == 2); - &display_common($r,$url,$current_path,$is_empty,\@dir_list, - $can_upload); - &display_directory($r,$url,$current_path,$is_empty,\@dir_list,$group, + my $is_empty; + if ($listerror eq 'empty') { + $is_empty = 1; + } elsif (ref($dirlistref) eq 'ARRAY') { + if ((scalar(@{$dirlistref}) == 2) && ($dirlistref->[0] =~ /^\.+\&/) + && ($dirlistref->[1] =~ /^\.+\&/)) { + $is_empty = 1; + } + } + &display_common($r,$url,$current_path,$is_empty,$dirlistref, + $can_upload,$group); + &display_directory($r,$url,$current_path,$is_empty,$dirlistref,$group, $can_upload,$can_modify,$can_delete,$can_setacl); - $r->print(&Apache::loncommon::end_page()); } + $r->print(&Apache::loncommon::end_page()); return OK; }