--- 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('<td><img src="'.&Apache::loncommon::icon($filename).'"></td>'); @@ -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('<h3>'.&mt('Allowing others to retrieve portfolio file: [_1]',$env{'form.currentpath'}.$env{'form.access'}).'</h3>'."\n"); + $r->print(&mt('Access to this file by others can be set to be one the following types: public.').'<br /><ul><li>'.&mt('Public files are available to anyone without the need for login.').'</li></ul><br />'); + &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('<h3>'.&mt('Allowing others to retrieve portfolio file: [_1]',$file_name).'</h3>'."\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('<th>'.&mt('Type of change').'</th><th>'.&mt('Access control').'</th><th>'.&mt('Start date').'</th><th>'.&mt('End date').'</th>'); + $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('<td rowspan="'.$numchgs.'">'.&mt($title{$chg}).'.</td>'); + 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('<td>'.&mt($scope).'</td><td>'.$showstart. + '</td><td>'. $showend.'</td>'); + $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('<br /><a href="'.$url.'?access='.$env{'form.selectfile'}.'¤tpath='.$env{'form.currentpath'}.'">'.&mt('Display all access settings for this file').'</a>'); + return; +} + +sub build_access_record { + my ($num,$scope,$start,$end) = @_; + my $record = '<scope type="'.$scope.'"><start>'.$start.'</start><end>'.$end. + '</end></scope>'; + 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 = '<b>'.&mt('Off').'</b>'; + my ($guest,$guesttext); + $guesttext = '<b>'.&mt('Off').'</b>'; + 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 = '<b>'.&mt('On').'</b>'; + } + } + $r->print(&Apache::loncommon::start_data_table()); + $r->print(&Apache::loncommon::start_data_table_row()); + $r->print('<th>'.&mt('Access Type').'</th><th colspan="3">'. + &mt('Settings').'</th>'."\n"); + $r->print(&Apache::loncommon::end_data_table_row()); + $r->print(&Apache::loncommon::start_data_table_row()); + $r->print('<td><b>Public</b><br />'.$publictext.'</td><td colspan="3">'); + $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 = '<td><input type="checkbox" name="delete" value="'.$num. + '" />'.&mt('Delete').'<br /><input type="checkbox" '. + 'name="update" value="'.$num.'" />'.&mt('Update'). + '<input type="hidden" name="scope_'.$num.'"'. + ' value="public" /></td>'; + $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). + ' <nobr><input type="checkbox" name="noend_'. + $num.'" '.$pub_noend.' />'.&mt('No end date').'</nobr>'; + } else { + $pub_action = '<input type="checkbox" name="activate" value="0" />'. + &mt('Activate'). + '<input type="hidden" name="scope_0" value="public" />'; + $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). + '  <nobr><input type="checkbox" '. + 'name="noend_0" />'.&mt('No end date'). + '</nobr>'; + + } + $r->print('<td>'.$pub_action.'</td><td>'.&mt('Start: ').$pub_startdate. + '<br />'.&mt('End: ').$pub_enddate.'</td>'); + $r->print(&Apache::loncommon::end_data_table_row()); + $r->print(&Apache::loncommon::end_data_table()); + $r->print('</td>'); + $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'}) {