--- loncom/interface/portfolio.pm 2006/10/19 20:36:12 1.165 +++ loncom/interface/portfolio.pm 2007/05/02 01:33:50 1.179 @@ -1,7 +1,7 @@ # The LearningOnline Network # portfolio browser # -# $Id: portfolio.pm,v 1.165 2006/10/19 20:36:12 albertel Exp $ +# $Id: portfolio.pm,v 1.179 2007/05/02 01:33:50 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -95,6 +95,12 @@ sub display_common { 'createdir_label' => 'Create subdirectory in current directory:'); 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')); + $r->print(<<"TABLE"); @@ -109,7 +115,7 @@ sub display_common { - + $help_fileupload @@ -124,7 +130,7 @@ sub display_common { - + $help_createdir @@ -141,12 +147,12 @@ TABLE ); $r->print(''.&make_anchor($url,\%anchor_fields,$port_path).'/'); if (@tree > 1){ - my $newCurrentPath = ''; + my $newCurrentPath = '/'; for (my $i = 1; $i< @tree; $i++){ $newCurrentPath .= $tree[$i].'/'; my %anchor_fields = ( 'selectfile' => $tree[$i], - 'currentpath' => '/', + 'currentpath' => $newCurrentPath, 'mode' => $env{"form.mode"}, 'fieldname' => $env{"form.fieldname"}, 'continue' => $env{"form.continue"} @@ -155,6 +161,7 @@ TABLE } } $r->print(''); + $r->print(&Apache::loncommon::help_open_topic('Portfolio ChangeDirectory')); &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path); $r->print('
'. @@ -236,7 +243,7 @@ sub display_directory { $current_permissions,$group); my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group); my $now = time; - if ($env{"form.mode"} eq 'selectfile'){ + if ($env{"form.mode"} eq 'selectfile') { &select_files($r); $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'}); $select_mode = 'true'; @@ -259,8 +266,16 @@ sub display_directory { ''); } else { $r->print(''); + $r->print(&Apache::loncommon::help_open_topic('Portfolio FileList', + 'Using the portfolio file list')); $r->print('
Select  NameSizeLast Modified
'. - ''); + ''); } $r->print("\n".&group_form_data()."\n"); @@ -436,7 +451,8 @@ sub display_directory { $r->print('
Actions  NameSizeLast ModifiedCurrent Access Status
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'). + '
'); if ($can_delete) { $r->print(' - + '. + &Apache::loncommon::help_open_topic('Portfolio DeleteFile').' ' @@ -523,7 +539,7 @@ sub delete { my @files=&Apache::loncommon::get_env_multiple('form.selectfile'); my ($uname,$udom) = &get_name_dom(); if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { - $r->print ("The file is locked and cannot be deleted.
"); + $r->print("The file is locked and cannot be deleted.
"); $r->print(&done('Back',$url)); } else { if (scalar(@files)) { @@ -550,9 +566,10 @@ sub delete_confirmed { $env{'form.currentpath'}. $delete_file); if ($result ne 'ok') { - $r->print(' An error occured ('.$result. - ') while trying to delete '. - &display_file(undef, $delete_file).'
'); + $r->print(''. + &mt('An error occured ([_1]) while trying to delete + [_2].',$result,&display_file(undef, $delete_file)). + '

'); } else { $r->print(&mt('File: [_1] deleted.', &display_file(undef,$delete_file))); @@ -563,7 +580,7 @@ sub delete_confirmed { $group,$file_name); if (keys(%access_controls) > 0) { my %changes; - foreach my $key (%{$access_controls{$file_name}}) { + foreach my $key (keys(%{$access_controls{$file_name}})) { $changes{'delete'}{$key} = 1; } if (keys(%changes) > 0) { @@ -573,15 +590,15 @@ sub delete_confirmed { if ($outcome ne 'ok') { $r->print('
'.&mt("An error occured ([_1]) while ". "trying to delete access controls for the file.",$outcome). - '
'); + '

'); } else { if ($deloutcome eq 'ok') { - $r->print('
'.&mt('Access controls also deleted for the file.')); + $r->print('
'.&mt('Access controls also deleted for the file.').'

'); } else { $r->print(''.'
'. &mt("An error occured ([_1]) while ". "trying to delete access controls for the file.",$deloutcome). - '

'); + '

'); } } } @@ -633,7 +650,7 @@ sub rename { my ($uname,$udom) = &get_name_dom(); $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("The file is locked and cannot be renamed.
"); $r->print(&done(undef,$url)); } else { &open_form($r,$url); @@ -729,7 +746,7 @@ sub access_for_renamed { } sub display_access { - my ($r,$url,$group,$can_setacl,$port_path) = @_; + my ($r,$url,$group,$can_setacl,$port_path,$action) = @_; my ($uname,$udom) = &get_name_dom(); my $file_name = $env{'form.currentpath'}.$env{'form.access'}; $file_name = &prepend_group($file_name); @@ -737,21 +754,36 @@ sub display_access { $uname); my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group,$file_name); my $aclcount = keys(%access_controls); - my $header = '

'.&mt('Allowing others to retrieve file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'

'; - my $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 .= '
'; - if ($group eq '') { - $info .= (&mt("A listing of files viewable without log-in is available at: http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme/portfolio.
For logged in users a 'Display file listing' link will also appear (when there are viewable files) on your personal information page:
http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme
")); + 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('A listing of files viewable without log-in is available at: ')."http://$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
"; + 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").'
'; + } + } else { + $header = '

'.&mt('Conditional access controls for file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'

'. + &explain_conditionals().'
'; } - if ($can_setacl) { &open_form($r,$url); $r->print($header.$info); - &access_setting_table($r,$access_controls{$file_name}); + $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')); + &access_setting_table($r,$url,$file_name,$access_controls{$file_name}, + $action); my $button_text = { 'continue' => &mt('Proceed'), 'cancel' => &mt('Back to directory listing'), @@ -766,6 +798,13 @@ 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('Alternatively access can be granted to people with specific LON-CAPA usernames and domains.'); +} + sub view_access_settings { my ($r,$url,$access_controls,$aclcount) = @_; my ($showstart,$showend); @@ -804,9 +843,8 @@ sub build_access_summary { domains => 'Conditional: domain-based', users => 'Conditional: user-based', course => 'Conditional: course-based', - group => 'Conditional: group-based', ); - my @allscopes = ('public','guest','domains','users','course','group'); + my @allscopes = ('public','guest','domains','users','course'); foreach my $scope (@allscopes) { if ((!(exists($todisplay{$scope}))) || (ref($todisplay{$scope}) ne 'HASH')) { next; @@ -829,7 +867,7 @@ sub build_access_summary { } } $r->print(''.&mt($scope_desc{$scope})); - if (($scope eq 'course') || ($scope eq 'group')) { + if ($scope eq 'course') { if ($chg ne 'delete') { my $cid = $content->{'domain'}.'_'.$content->{'number'}; my %course_description = &Apache::lonnet::coursedescription($cid); @@ -841,16 +879,12 @@ sub build_access_summary { if ($chg ne 'delete') { if ($scope eq 'guest') { $r->print(&mt('Passphrase').': '.$content->{'password'}); - } elsif ($scope eq 'course' || $scope eq 'group') { - $r->print(''); + } elsif ($scope eq 'course') { + $r->print('
'); $r->print(''); - if ($scope eq 'course') { - $r->print(''); - } else { - $r->print(''); - } + $r->print(''); $r->print(''); foreach my $id (sort(keys(%{$content->{'roles'}}))) { $r->print(''); @@ -874,11 +908,11 @@ sub build_access_summary { } else { $r->print(join(',',@{$content->{'roles'}{$id}{$item}})); } - $r->print(''); + $r->print(''); } - $r->print("
'.&mt('Roles').''. &mt('Access').''. &mt('Sections').''.&mt('Groups').''.&mt('Teams').''.&mt('Groups').'
"); + $r->print(''); } - $r->print(""); + $r->print(''); } elsif ($scope eq 'domains') { $r->print(&mt('Domains: ').join(',',@{$content->{'dom'}})); } elsif ($scope eq 'users') { @@ -980,7 +1014,7 @@ sub update_access { } else { if ((@{$processing{'activate'}} > 0) || (@{$processing{'update'}} > 0)) { $errors .= ''. - &mt('A problem occurred storing access control settings: [_1]',$outcome). + &mt('A problem occurred saving access control settings: [_1]',$outcome). ''; } } @@ -992,14 +1026,14 @@ sub update_access { my $totalnew = 0; my $status = 'new'; my ($firstitem,$lastitem); - foreach my $newitem ('course','group','domains','users') { + foreach my $newitem ('course','domains','users') { $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','group','domains','users') { + foreach my $newitem ('course','domains','users') { 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'}).'

'); $firstitem = $totalnew; @@ -1038,7 +1072,7 @@ sub build_access_record { if ($scope eq 'guest') { $record->{'password'} = $env{'form.password'}; - } elsif (($scope eq 'course') || ($scope eq 'group')) { + } elsif ($scope eq 'course') { $record->{'domain'} = $env{'form.crsdom_'.$num}; $record->{'number'} = $env{'form.crsnum_'.$num}; my @role_ids; @@ -1120,19 +1154,18 @@ sub sort_users { } sub access_setting_table { - my ($r,$access_controls) = @_; + my ($r,$url,$filename,$access_controls,$action) = @_; my ($public,$publictext); - $publictext = &mt('Off'); + $publictext ='Off'; my ($guest,$guesttext); - $guesttext = &mt('Off'); + $guesttext = 'Off'; my @courses = (); - my @groups = (); my @domains = (); my @users = (); my $now = time; my $then = $now + (60*60*24*180); # six months approx. my ($num,$scope,$publicnum,$guestnum); - my (%acl_count,%end,%start); + my (%acl_count,%end,%start,%conditionals); foreach my $key (sort(keys(%{$access_controls}))) { ($num,$scope,$end{$key},$start{$key}) = &unpack_acc_key($key); if ($scope eq 'public') { @@ -1143,19 +1176,34 @@ sub access_setting_table { $guest=$key; $guestnum = $num; $guesttext = &acl_status($start{$key},$end{$key},$now); - } elsif ($scope eq 'course') { - push(@courses,$key); - } elsif ($scope eq 'group') { - push(@groups,$key); - } elsif ($scope eq 'domains') { - push(@domains,$key); - } elsif ($scope eq 'users') { - push(@users,$key); + } else { + $conditionals{$scope}{$key} = $$access_controls{$key}; + if ($scope eq 'course') { + push(@courses,$key); + } elsif ($scope eq 'domains') { + push(@domains,$key); + } elsif ($scope eq 'users') { + push(@users,$key); + } } $acl_count{$scope} ++; } $r->print('
'); - $r->print('

'.&mt('Public access:').' '.$publictext.'

'); + if ($action eq 'chgaccess') { + &standard_settings($r,$now,$then,$url,$filename,\%acl_count,\%start, + \%end,$public,$publicnum,$publictext,$guest,$guestnum, + $guesttext,$access_controls,%conditionals); + } else { + &condition_setting($r,$access_controls,$now,$then,\%acl_count, + \@domains,\@users,\@courses); + } + $r->print('
'); +} + +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(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print(''.&mt('Action').''.&mt('Dates available').''); @@ -1163,7 +1211,7 @@ sub access_setting_table { $r->print(&Apache::loncommon::start_data_table_row()); if ($public) { $r->print(''.&actionbox('old',$publicnum,'public').''. - &dateboxes($publicnum,$start{$public},$end{$public}).''); + &dateboxes($publicnum,$start->{$public},$end->{$public}).''); } else { $r->print(''.&actionbox('new','0','public').''. &dateboxes('0',$now,$then).''); @@ -1171,7 +1219,7 @@ sub access_setting_table { $r->print(&Apache::loncommon::end_data_table_row()); $r->print(&Apache::loncommon::end_data_table()); $r->print(' '); - $r->print('

'.&mt('Passphrase-protected access:').' '.$guesttext.'

'); + $r->print('

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

'); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print(''.&mt('Action').''.&mt('Dates available'). @@ -1182,7 +1230,7 @@ sub access_setting_table { if ($guest) { $passwd = $$access_controls{$guest}{'password'}; $r->print(''.&actionbox('old',$guestnum,'guest').''. - &dateboxes($guestnum,$start{$guest},$end{$guest}).''); + &dateboxes($guestnum,$start->{$guest},$end->{$guest}).''); } else { $r->print(''.&actionbox('new','1','guest').''. &dateboxes('1',$now,$then).''); @@ -1191,36 +1239,75 @@ sub access_setting_table { $passwd.'" />'); $r->print(&Apache::loncommon::end_data_table_row()); $r->print(&Apache::loncommon::end_data_table()); - $r->print(' '); - &access_element($r,'domains',\%acl_count,\@domains,$access_controls,$now,$then); + $r->print(' '. + ''); + my $numconditionals = 0; + my $conditionstext; + my %cond_status; + foreach my $scope ('domains','users','course') { + $numconditionals += $acl_count->{$scope}; + if ($acl_count->{$scope} > 0) { + if ($conditionstext ne 'Active') { + foreach my $key (keys(%{$conditionals{$scope}})) { + $conditionstext = &acl_status($start->{$key},$end->{$key},$now); + if ($conditionstext eq 'Active') { + last; + } + } + } + } + } + if ($conditionstext eq '') { + $conditionstext = 'Off'; + } + my %anchor_fields = ( + 'access' => $env{'form.selectfile'}, + 'action' => 'chgconditions', + 'currentpath' => $env{'form.currentpath'}, + ); + $r->print('

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

'); + if ($numconditionals > 0) { + my $count = 1; + my $chg = 'none'; + $r->print(&mt('You have previously set [_1] conditional access controls.',$numconditionals).' '.&make_anchor($url,\%anchor_fields,&mt('Change Conditions')).'

'); + $r->print(&Apache::loncommon::start_data_table()); + $r->print(&Apache::loncommon::start_data_table_header_row()); + $r->print(''.&mt('Access control').''.&mt('Dates available'). + ''.&mt('Additional information').''); + $r->print(&Apache::loncommon::end_data_table_header_row()); + &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.')); + } +} + +sub condition_setting { + my ($r,$access_controls,$now,$then,$acl_count,$domains,$users,$courses) = @_; + $r->print(''); + &access_element($r,'domains',$acl_count,$domains,$access_controls,$now,$then); $r->print(' '); - &access_element($r,'users',\%acl_count,\@users,$access_controls,$now,$then); + &access_element($r,'users',$acl_count,$users,$access_controls,$now,$then); $r->print(''); - if (@courses > 0 || @groups > 0) { + if ($acl_count->{course} > 0) { $r->print(''); } else { $r->print(''); } - &access_element($r,'course',\%acl_count,\@courses,$access_controls,$now,$then); + &access_element($r,'course',$acl_count,$courses,$access_controls,$now,$then); $r->print(''); - if (@courses > 0 || @groups > 0) { - $r->print(' '); - } else { - $r->print(' '); - } - &access_element($r,'group',\%acl_count,\@groups,$access_controls,$now,$then); $r->print(''); } sub acl_status { my ($start,$end,$now) = @_; if ($start > $now) { - return &mt('Inactive'); + return 'Inactive'; } if ($end && $end<$now) { - return &mt('Inactive'); + return 'Inactive'; } - return &mt('Active'); + return 'Active'; } sub access_element { @@ -1255,17 +1342,17 @@ sub display_access_row { $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print(''.&mt('Action?').''.&mt($uctype).''. &mt('Dates available').''); - if (($type eq 'course') || ($type eq 'group')) { + if ($type eq 'course' && $status eq 'old') { $r->print(''.&mt('Allowed [_1] member affiliations',$type). ''); $colspan ++; } elsif ($type eq 'domains') { - @all_doms = &Apache::loncommon::get_domains(); + @all_doms = sort(&Apache::lonnet::all_domains()); } $r->print(&Apache::loncommon::end_data_table_header_row()); foreach my $key (@{$items}) { $r->print(&Apache::loncommon::start_data_table_row()); - if (($type eq 'course') || ($type eq 'group')) { + if ($type eq 'course') { &course_row($r,$status,$type,$key,$access_controls,$now,$then); } elsif ($type eq 'domains') { &domains_row($r,$status,$key,\@all_doms,$access_controls,$now, @@ -1292,34 +1379,37 @@ sub display_access_row { sub course_js { return qq| END_SCRIPT $r->print(&mt('Select roles, course status, section(s) and group(s) for users who will be able to access the portfolio file.')); - $r->print('
'.$role_selects.'
'.&mt('Roles').''.&mt('[_1] status',$type).''.&mt('Sections').''.&mt($grouptitle).'

'); + $r->print(''.$role_selects.'
'.&mt('Roles').''.&mt('[_1] status',$type).''.&mt('Sections').''.&mt('Groups').'

'); return; } @@ -1634,32 +1750,23 @@ ENDSMP } } -sub upload { - my ($r,$url,$group)=@_; - my $fname=$env{'form.uploaddoc.filename'}; - my $filesize = (length($env{'form.uploaddoc'})) / 1000; #express in k (1024?) - my $disk_quota = 20000; # expressed in k - if (defined($group)) { - my $grp_quota = &get_group_quota($group); # quota expressed in k - if ($grp_quota ne '') { - $disk_quota = $grp_quota; - } else { - $disk_quota = 0; - } - } - $fname=&Apache::lonnet::clean_filename($fname); - my $portfolio_root=&get_portfolio_root(); - my ($uname,$udom) = &get_name_dom(); +sub check_for_upload { + my ($path,$fname,$group,$element) = @_; + my $disk_quota = &get_quota($group); + my $filesize = (length($env{'form.'.$element})) / 1000; #express in k (1024?) + + my $portfolio_root = &get_portfolio_root(); my $port_path = &get_port_path(); + my ($uname,$udom) = &get_name_dom(); # Fixme --- Move the checking for existing file to LOND error return - my @dir_list=&get_dir_list($portfolio_root); + my @dir_list=&get_dir_list($portfolio_root,$path); my $found_file = 0; my $locked_file = 0; foreach my $line (@dir_list) { my ($file_name)=split(/\&/,$line,2); if ($file_name eq $fname){ - $file_name = $env{'form.currentpath'}.$file_name; + $file_name = $path.$file_name; $file_name = &prepend_group($file_name); $found_file = 1; if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { @@ -1668,34 +1775,110 @@ sub upload { } } my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root); + if (($current_disk_usage + $filesize) > $disk_quota){ - $r->print('Unable to upload '.$fname.' (size = '.$filesize.' kilobytes). Disk quota will be exceeded.'. - '
Disk quota is '.$disk_quota.' kilobytes. Your current disk usage is '.$current_disk_usage.' kilobytes.'); - $r->print(&done('Back',$url)); - } - elsif ($found_file){ - if ($locked_file){ - $r->print(''.'Unable to upload '.$fname.', a locked file by that name was found in '.$port_path.$env{'form.currentpath'}.''. - '
You will be able to rename or delete existing '.$fname.' after a grade has been assigned.'); - $r->print(&done('Back',$url)); - } else { - $r->print(''.'Unable to upload '.$fname.', a file by that name was found in '.$port_path.$env{'form.currentpath'}.''. - '
To upload, rename or delete existing '.$fname.' in '.$port_path.$env{'form.currentpath'}); - $r->print(&done('Back',$url)); - } - } else { - my $result=&Apache::lonnet::userfileupload('uploaddoc','', - $port_path.$env{'form.currentpath'}); - if ($result !~ m|^/uploaded/|) { - $r->print(''.'An errror occured ('.$result. - ') while trying to upload '.&display_file().'
'); - $r->print(&done('Back',$url)); - } else { - $r->print(&done(undef,$url)); - } + my $msg = 'Unable to upload '.$fname.' (size = '.$filesize.' kilobytes). Disk quota will be exceeded.'. + '
Disk quota is '.$disk_quota.' kilobytes. Your current disk usage is '.$current_disk_usage.' kilobytes.'; + return ('will_exceed_quota',$msg); + } elsif ($found_file) { + if ($locked_file) { + my $msg = ''.'Unable to upload '.$fname.', a locked file by that name was found in '.$port_path.$path.''. + '
You will be able to rename or delete existing '.$fname.' after a grade has been assigned.'; + return ('file_locked',$msg); + } else { + my $msg = ''.'Unable to upload '.$fname.', a file by that name was found in '.$port_path.$path.''. + '
To upload, rename or delete existing '.$fname.' in '.$port_path.$path; + return ('file_exists',$msg); + } } } +sub upload { + my ($r,$url,$group)=@_; + my $fname=&Apache::lonnet::clean_filename($env{'form.uploaddoc.filename'}); + + my ($state,$msg) = &check_for_upload($env{'form.currentpath'}, + $fname,$group,'uploaddoc'); + + if ($state eq 'will_exceed_quota' + || $state eq 'file_locked' + || $state eq 'file_exists' ) { + $r->print($msg.&done('Back',$url)); + return; + } + + my $port_path = &get_port_path(); + my (%allfiles,%codebase,$mode); + if ($env{'form.uploaddoc.filename'} =~ m/(\.htm|\.html|\.shtml)$/i) { + $mode = 'parse'; + + } + my $result= + &Apache::lonnet::userfileupload('uploaddoc','', + $port_path.$env{'form.currentpath'}, + $mode,\%allfiles,\%codebase); + if ($result !~ m|^/uploaded/|) { + $r->print(''.'An errror occured ('.$result. + ') while trying to upload '.&display_file().'
'); + $r->print(&done('Back',$url)); + } else { + if (%allfiles) { + my $state = < + + + +STATE + $r->print("

Completed upload of the file. This file contained references to other files. You can upload these now:

"); + $r->print(&Apache::londocs::ask_for_embedded_content('/adm/portfolio',$state,\%allfiles,\%codebase,{'error_on_invalid_names' => 1})); + $r->print('

Or '.&done('Return to directory listing',$url).'

'); + } else { + $r->print(&done(undef,$url)); + } + } +} + +sub upload_embedded { + my ($r,$url,$group)=@_; + for (my $i=0; $i<$env{'form.number_embedded_items'}; $i++) { + next if (!exists($env{'form.embedded_item_'.$i.'.filename'})); + + $env{'form.embedded_orig_'.$i} = + &unescape($env{'form.embedded_orig_'.$i}); + my ($path,$fname) = + ($env{'form.embedded_orig_'.$i} =~ m{(.*/)([^/]*)}); + $path = $env{'form.currentpath'}.$path; + $fname = &Apache::lonnet::clean_filename($fname); + + my ($state,$msg) = &check_for_upload($path,$fname,$group, + 'embedded_item_'.$i); + + if ($state eq 'will_exceed_quota' + || $state eq 'file_locked' + || $state eq 'file_exists' ) { + $r->print($msg); + next; + } + + my $port_path = &get_port_path(); + my $src_path = $env{'form.embedded_orig_'.$i}; + $env{'form.embedded_item_'.$i.'.filename'}=$fname; + + my $result= + &Apache::lonnet::userfileupload('embedded_item_'.$i,'', + $port_path.$path); + if ($result !~ m|^/uploaded/|) { + $r->print(''.'An errror occured ('.$result. + ') while trying to upload '.&display_file($path,$fname).'
'); + next; + } else { + $r->print("

Uploaded ". + &display_file($port_path.$path,$fname).'

'); + } + } + $r->print(&done(undef,$url)); +} + sub lock_info { my ($r,$url,$group) = @_; my ($uname,$udom) = &get_name_dom(); @@ -1813,10 +1996,10 @@ sub get_group_quota { } sub get_dir_list { - my ($portfolio_root) = @_; + my ($portfolio_root,$path) = @_; + $path ||= $env{'form.currentpath'}; my ($uname,$udom) = &get_name_dom(); - return &Apache::lonnet::dirlist($env{'form.currentpath'}, - $udom,$uname,$portfolio_root); + return &Apache::lonnet::dirlist($path,$udom,$uname,$portfolio_root); } sub get_name_dom { @@ -1912,6 +2095,23 @@ sub coursegrp_portfolio_header { return $output; } +sub get_quota { + my ($group) = @_; + my $disk_quota; + if (defined($group)) { + my $grp_quota = &get_group_quota($group); # quota expressed in k + if ($grp_quota ne '') { + $disk_quota = $grp_quota; + } else { + $disk_quota = 0; + } + } else { + $disk_quota = &Apache::loncommon::get_user_quota($env{'user.name'}, + $env{'user.domain'}); #expressed in Mb + $disk_quota = 1000 * $disk_quota; # convert from Mb to kb + } + return $disk_quota; +} sub handler { # this handles file management @@ -2008,6 +2208,13 @@ sub handler { $r->print(&Apache::loncommon::start_page($title)); } $r->rflush(); + 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(''. 'No file was selected to upload.'. @@ -2030,6 +2237,12 @@ sub handler { } else { &missing_priv($r,$url,'upload'); } + } elsif ($env{'form.action'} eq 'upload_embedded') { + if ($can_upload) { + &upload_embedded($r,$url,$group); + } else { + &missing_priv($r,$url,'upload'); + } } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) { if ($can_delete) { &delete_confirmed($r,$url,$group); @@ -2070,9 +2283,12 @@ sub handler { } } elsif ($env{'form.access'}) { $env{'form.selectfile'} = $env{'form.access'}; - $env{'form.action'} = 'chgaccess'; - &display_access($r,$url,$group,$can_setacl,$port_path); - } elsif ($env{'form.action'} eq 'chgaccess') { + if (!defined($env{'form.action'})) { + $env{'form.action'} = 'chgaccess'; + } + &display_access($r,$url,$group,$can_setacl,$port_path,$env{'form.action'}); + } elsif (($env{'form.action'} eq 'chgaccess') || + ($env{'form.action'} eq 'chgconditions')) { if ($can_setacl) { &update_access($r,$url,$group,$port_path); } else { 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.