--- loncom/interface/portfolio.pm 2006/06/07 18:41:48 1.102 +++ loncom/interface/portfolio.pm 2006/06/16 22:37:10 1.104 @@ -136,21 +136,6 @@ sub display_directory { $current_permissions,$group); my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group); my $now = time; - my $curr_access; - my $pub_access = 0; - foreach my $key (sort(keys(%access_controls))) { - my ($scope,$end,$start) = ($key =~ /^\d+:(\w+)_(\d*)_?(\d*)$/); - if (($now > $start) && (!$end || $end > $now)) { - if ($scope eq 'public') { - $pub_access = 1; - } - } - } - if (!$pub_access) { - $curr_access = 'Private' - } elsif ($pub_access) { - $curr_access = 'Public'; - } if ($env{"form.mode"} eq 'selectfile'){ &select_files($r); $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'}); @@ -203,6 +188,8 @@ sub display_directory { $r->print(''); } else { $r->print(''); + my $fullpath = $current_path.$filename; + $fullpath = &prepend_group($fullpath,$group); if ($select_mode eq 'true'){ $r->print('print('>'); } else { - if (exists $locked_files{$current_path.$filename}){ + if (exists $locked_files{$fullpath}) { $r->print('Locked'); } else { my $cat=''.&mt('Catalog Information').
@@ -221,6 +208,21 @@ sub display_directory {
                             </td>');
                     }
                 }
+                my $curr_access;
+                my $pub_access = 0;
+                foreach my $key (sort(keys(%{$access_controls{$fullpath}}))) {
+                    my ($scope,$end,$start) = ($key =~ /^[^:]+:([a-z]+)_(\d*)_?(\d*)$/);
+                    if (($now > $start) && (!$end || $end > $now)) {
+                        if ($scope eq 'public')  {
+                            $pub_access = 1;
+                        }
+                    }
+                }
+                if (!$pub_access) {
+                    $curr_access = 'Private'
+                } else {
+                    $curr_access = 'Public';
+                }
                 $r->print('<td><img src='); $r->print(''. $filename.''); @@ -439,8 +441,213 @@ sub rename_confirmed { $r->print(&done(undef,$url,$group)); } +sub display_access { + my ($r,$url,$group) = @_; + my ($uname,$udom) = &get_name_dom($group); + my $file_name = $env{'form.currentpath'}.$env{'form.access'}; + $file_name = &prepend_group($file_name,$group); + my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, + $uname); + my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group,$file_name); + &open_form($r,$url); + $r->print('

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

'."\n"); + $r->print(&mt('Access to this file by others can be set to be one the following types: public.').'

'); + &access_setting_table($r,$access_controls{$file_name}); + &close_form($r,$url,$group); +} + +sub update_access { + my ($r,$url,$group) = @_; + my $totalprocessed = 0; + my %processing; + my %title = ( + 'activate' => 'New controls added', + 'delete' => 'Existing controls deleted', + 'update' => 'Existing controls modified', + ); + my $changes; + foreach my $chg (sort(keys(%title))) { + @{$processing{$chg}} = &Apache::loncommon::get_env_multiple('form.'.$chg); + $totalprocessed += @{$processing{$chg}}; + foreach my $num (@{$processing{$chg}}) { + my $scope = $env{'form.scope_'.$num}; + my ($start,$end) = &get_dates_from_form($num); + my $newkey = $num.':'.$scope.'_'.$end.'_'.$start; + if ($chg eq 'delete') { + $$changes{$chg}{$newkey} = 1; + } else { + $$changes{$chg}{$newkey} = + &build_access_record($num,$scope,$start,$end); + } + } + } + my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'}; + $r->print('

'.&mt('Allowing others to retrieve portfolio file: [_1]',$file_name).'

'."\n"); + $file_name = &prepend_group($file_name,$group); + my ($uname,$udom) = &get_name_dom($group); + my ($errors,$outcome,$deloutcome,$new_values,$translation); + if ($totalprocessed) { + ($outcome,$deloutcome,$new_values,$translation) = + &Apache::lonnet::modify_access_controls($file_name,$changes,$udom,$uname); + } + my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, $uname); + my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group,$file_name); + if ($totalprocessed) { + if ($outcome eq 'ok') { + my $updated_controls = $access_controls{$file_name}; + my ($showstart,$showend); + $r->print(&Apache::loncommon::start_data_table()); + $r->print(&Apache::loncommon::start_data_table_row()); + $r->print(''.&mt('Type of change').''.&mt('Access control').''.&mt('Start date').''.&mt('End date').''); + $r->print(&Apache::loncommon::end_data_table_row()); + foreach my $chg (sort(keys(%processing))) { + if (@{$processing{$chg}} > 0) { + if ($chg eq 'delete') { + if (!($deloutcome eq 'ok')) { + $errors .= &mt('A problem occurred deleting access controls: [_1]',$deloutcome); + next; + } + } + my $numchgs = @{$processing{$chg}}; + $r->print(&Apache::loncommon::start_data_table_row()); + $r->print(''.&mt($title{$chg}).'.'); + my $count = 0; + foreach my $key (sort(keys(%{$$changes{$chg}}))) { + if ($count) { + $r->print(&Apache::loncommon::start_data_table_row()); + } + my ($num,$scope,$end,$start) = + ($key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/); + my $newkey = $key; + if ($chg eq 'activate') { + $newkey =~ s/^(\d+)/$$translation{$1}/; + } + my %content = &Apache::lonnet::parse_access_controls( + $$updated_controls{$newkey}); + if ($chg eq 'delete') { + $showstart = &mt('Deleted'); + $showend = $showstart; + } else { + $showstart = localtime($start); + if ($end == 0) { + $showend = &mt('No end date'); + } else { + $showend = localtime($end); + } + } + $r->print(''.&mt($scope).''.$showstart. + ''. $showend.''); + $r->print(&Apache::loncommon::end_data_table_row()); + $count ++; + } + } + } + $r->print(&Apache::loncommon::end_data_table()); + } else { + if ((@{$processing{'activate'}} > 0) || (@{$processing{'update'}} > 0)) { + $errors .= &mt('A problem occurred storing access control settings: [_1]',$outcome); + } + } + if ($errors) { + $r->print($errors); + } + } + $r->print('
'.&mt('Display all access settings for this file').''); + return; +} + +sub build_access_record { + my ($num,$scope,$start,$end) = @_; + my $record = ''.$start.''.$end. + ''; + return $record; +} + +sub get_dates_from_form { + my ($id) = @_; + my $startdate; + my $enddate; + $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate_'.$id); + $enddate = &Apache::lonhtmlcommon::get_date_from_form('enddate_'.$id); + if ( exists ($env{'form.noend_'.$id}) ) { + $enddate = 0; + } + return ($startdate,$enddate); +} + +sub access_setting_table { + my ($r,$access_controls) = @_; + my ($public,$publictext); + $publictext = ''.&mt('Off').''; + my ($guest,$guesttext); + $guesttext = ''.&mt('Off').''; + my @courses = (); + my @groups = (); + my @domains = (); + my @users = (); + my $now = time; + my $then = $now + (60*60*24*180); # six months approx. + foreach my $key (sort(keys(%{$access_controls}))) { + my ($scope) = ($key =~ /^[^:]+:([a-z]+)_\d*_?\d*$/); + if ($scope eq 'public') { + $public = $key; + $publictext = ''.&mt('On').''; + } + } + $r->print(&Apache::loncommon::start_data_table()); + $r->print(&Apache::loncommon::start_data_table_row()); + $r->print(''.&mt('Access Type').''. + &mt('Settings').''."\n"); + $r->print(&Apache::loncommon::end_data_table_row()); + $r->print(&Apache::loncommon::start_data_table_row()); + $r->print('Public
'.$publictext.''); + $r->print(&Apache::loncommon::start_data_table()); + $r->print(&Apache::loncommon::start_data_table_row()); + my ($pub_startdate,$pub_enddate,$pub_action,$pub_noend); + if ($public) { + my ($num,$end,$start) = ($public =~ /^([^:]+):[a-z]+_(\d*)_?(\d*)$/); + if ($end == 0) { + $pub_noend = 'checked="checked"'; + } + $pub_action = ''.&mt('Delete').'
'.&mt('Update'). + ''; + $pub_startdate = &Apache::lonhtmlcommon::date_setter('portform', + 'startdate_'.$num,$start,undef,undef,undef,1,undef, + undef,undef,1); + $pub_enddate = &Apache::lonhtmlcommon::date_setter('portform', + 'enddate_'.$num,$end,undef,undef,undef,1,undef, + undef,undef,1). + '  '.&mt('No end date').''; + } else { + $pub_action = ''. + &mt('Activate'). + ''; + $pub_startdate = &Apache::lonhtmlcommon::date_setter('portform', + 'startdate_0',$now,undef,undef,undef,1,undef, + undef,undef,1); + $pub_enddate = &Apache::lonhtmlcommon::date_setter('portform', + 'enddate_0',$then,,undef,undef,undef,1,undef, + undef,undef,1). + '  '.&mt('No end date'). + ''; + + } + $r->print(''.$pub_action.''.&mt('Start: ').$pub_startdate. + '
'.&mt('End: ').$pub_enddate.''); + $r->print(&Apache::loncommon::end_data_table_row()); + $r->print(&Apache::loncommon::end_data_table()); + $r->print(''); + $r->print(&Apache::loncommon::end_data_table_row()); + $r->print(&Apache::loncommon::end_data_table()); +} + sub select_files { - my ($r,$group)=@_; + my ($r,$group) = @_; if ($env{'form.continue'} eq 'true') { # here we update the selections for the currentpath # eventually, have to handle removing those not checked, but . . . @@ -554,10 +761,6 @@ sub lock_info { if (defined($file_name) && defined($$current_permissions{$file_name})) { foreach my $array_item (@{$$current_permissions{$file_name}}) { if (ref($array_item) eq 'ARRAY') { - if ($$array_item[0] eq 'access' || - $$array_item[0] eq 'accesscount' ) { - next; - } my $filetext; if (defined($group)) { $filetext = ''.$env{'form.lockinfo'}. @@ -772,6 +975,12 @@ sub handler { $env{'form.selectfile'} = $env{'form.rename'}; $env{'form.action'} = 'rename'; &rename($r,$url,$group); + } elsif ($env{'form.access'}) { + $env{'form.selectfile'} = $env{'form.access'}; + $env{'form.action'} = 'chgaccess'; + &display_access($r,$url,$group); + } elsif ($env{'form.action'} eq 'chgaccess') { + &update_access($r,$url,$group); } elsif ($env{'form.createdir'}) { &createdir($r,$url,$group); } elsif ($env{'form.lockinfo'}) {