--- loncom/interface/portfolio.pm 2006/06/07 21:15:01 1.103 +++ loncom/interface/portfolio.pm 2006/06/16 22:37:10 1.104 @@ -211,17 +211,16 @@ sub display_directory { my $curr_access; my $pub_access = 0; foreach my $key (sort(keys(%{$access_controls{$fullpath}}))) { - my ($scope,$end,$start) = ($key =~ /^\d+:(\w+)_(\d*)_?(\d*)$/); + my ($scope,$end,$start) = ($key =~ /^[^:]+:([a-z]+)_(\d*)_?(\d*)$/); if (($now > $start) && (!$end || $end > $now)) { if ($scope eq 'public') { $pub_access = 1; - last; } } } if (!$pub_access) { $curr_access = 'Private' - } elsif ($pub_access) { + } else { $curr_access = 'Public'; } $r->print(''); @@ -442,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 . . . @@ -771,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'}) {