--- loncom/interface/portfolio.pm 2006/06/22 18:33:58 1.115 +++ loncom/interface/portfolio.pm 2006/07/02 23:15:47 1.127 @@ -1,3 +1,8 @@ +# The LearningOnline Network +# portfolio browser +# +# $Id: portfolio.pm,v 1.127 2006/07/02 23:15:47 albertel Exp $ +# # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). @@ -49,29 +54,32 @@ sub make_anchor { } my $dirptr=16384; sub display_common { - my ($r,$url,$current_path,$is_empty,$dir_list,$group)=@_; - my $groupitem; + my ($r,$url,$current_path,$is_empty,$dir_list,$group,$can_upload)=@_; my $namespace = &get_namespace($group); my $port_path = &get_port_path($group); - if (defined($group)) { - $groupitem = ''; - } - my $iconpath= $r->dir_config('lonIconsURL') . "/"; - my %text=&Apache::lonlocal::texthash('upload' => 'Upload', + if ($can_upload) { + my $groupitem; + if (defined($group)) { + $groupitem = ''; + } + 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 $escuri = &HTML::Entities::encode($r->uri,'&<>"'); - $r->print(<<"TABLE"); + my $escuri = &HTML::Entities::encode($r->uri,'&<>"'); + $r->print(<<"TABLE"); -
$text{'upload_label'} $groupitem +
+ $groupitem @@ -98,8 +106,9 @@ sub display_common {
TABLE + } my @tree = split (/\//,$current_path); - $r->print(''.&make_anchor($url,$port_path,'/',$env{"form.mode"},$env{"form.fieldname"},$env{"form.continue"},$group).'/'); + $r->print(''.&make_anchor($url,$port_path,'/',$env{"form.mode"},$env{"form.fieldname"},$env{"form.continue"},$group).'/'); if (@tree > 1){ my $newCurrentPath = ''; for (my $i = 1; $i< @tree; $i++){ @@ -107,7 +116,7 @@ TABLE $r->print(&make_anchor($url,$tree[$i],'/'.$newCurrentPath, $env{"form.mode"},$env{"form.fieldname"}, $env{"form.continue"},$group).'/'); } } - $r->print(''); + $r->print(''); &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path); $r->print('
'; $groupecho = '&group='.$group; } + my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, $uname); my %locked_files = &Apache::lonnet::get_marked_as_readonly_hash( @@ -142,7 +157,7 @@ sub display_directory { $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'}); $select_mode = 'true'; } - if ($is_empty && ($current_path ne '/')) { + if ($is_empty && ($current_path ne '/') && $can_delete) { $display_out = ''.$groupitem. ''. ''. @@ -155,11 +170,11 @@ sub display_directory { } if ($select_mode eq 'true') { $r->print(''); - $r->print(''. + $r->print('
'. ''); } else { $r->print(''); - $r->print('
Select NameSizeLast Modified
'. + $r->print('
'. ''); } if (defined($group)) { @@ -190,16 +205,17 @@ sub display_directory { my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename); if (($filename ne '.') && ($filename ne '..') && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/)) { if ($dirptr&$testdir) { + my $colspan='colspan="2"'; if ($select_mode eq 'true'){ - $r->print(''); - } else { - $r->print(''); + undef($colspan); } + $r->print(''); $r->print(''); $r->print(''); $r->print(''); } else { - $r->print(''); + my $css_class = 'LC_browser_file'; + my $line; my $version_flag; if (exists($versioned{$fname})) { $version_flag = "*"; @@ -208,83 +224,104 @@ sub display_directory { } my $fullpath = $current_path.$filename; $fullpath = &prepend_group($fullpath,$group); - if ($select_mode eq 'true'){ - $r->print(''); + $line.=' />'; } else { if (exists $locked_files{$fullpath}) { - $r->print(''); + $line.=''; + $css_class= 'LC_browser_file_locked'; } else { - my $cat=''.&mt('Catalog Information').
-			    ''; - $r->print(' - '); - } - } - my $curr_access; - my $pub_access = 0; - my $guest_access = 0; - my $cond_access = 0; - foreach my $key (sort(keys(%{$access_controls{$fullpath}}))) { - my ($num,$scope,$end,$start) = &unpack_acc_key($key); - if (($now > $start) && (!$end || $end > $now)) { - if ($scope eq 'public') { - $pub_access = 1; - } elsif ($scope eq 'guest') { - $guest_access = 1; + if (!$can_modify) { + $line .= ''; } } - if (!$pub_access && !$guest_access && !$cond_access) { - $curr_access = &mt('Private'); - } else { - my @allaccesses; - if ($pub_access) { - push(@allaccesses,&mt('Public')); - } - if ($guest_access) { - push(@allaccesses,&mt('Password-protected')); - } - if ($cond_access) { - push(@allaccesses,&mt('Conditional')); - } - $curr_access = join('+ ',@allaccesses); - } - $r->print(''); - $r->print(''); - $r->print(''); - $r->print(''); - $r->print(''); - $r->print(''); + $r->print(''); + $r->print($line); + my $curr_access; + if ($select_mode ne 'true') { + my $pub_access = 0; + my $guest_access = 0; + my $cond_access = 0; + foreach my $key (sort(keys(%{$access_controls{$fullpath}}))) { + my ($num,$scope,$end,$start) = &unpack_acc_key($key); + if (($now > $start) && (!$end || $end > $now)) { + if ($scope eq 'public') { + $pub_access = 1; + } elsif ($scope eq 'guest') { + $guest_access = 1; + } else { + $cond_access = 1; + } + } + } + if (!$pub_access && !$guest_access && !$cond_access) { + $curr_access = &mt('Private'); + } else { + my @allaccesses; + if ($pub_access) { + push(@allaccesses,&mt('Public')); + } + if ($guest_access) { + push(@allaccesses,&mt('Passphrase-protected')); + } + if ($cond_access) { + push(@allaccesses,&mt('Conditional')); + } + $curr_access = join('+ ',@allaccesses); + } + } + $r->print(''); + $r->print(''); + $r->print(''); + $r->print(''); + if ($select_mode ne 'true') { + $r->print(''); + } + $r->print(''.$/); } } } if ($select_mode eq 'true') { $r->print('
Actions NameSizeLast ModifiedCurrent Access Status
'.&mt('open folder').'
'.&mt('closed folder').'
'.&mt('closed folder').'Go to ...'.&make_anchor($url,$filename.'/',$current_path.$filename.'/',$env{'form.mode'},$env{"form.fieldname"},$env{'form.continue'},$group).'
print("CHECKED"); + if ($select_mode eq 'true') { + $line='print('>LockedLocked - Rename'.$cat.' - '; } else { - $cond_access = 1; + $line .= ''; } + if ($can_delete) { + $line .= ''; + } + if ($can_modify) { + my $cat=''.&mt('Catalog Information').
+                            ''; + $line .= 'Rename'; + $line .= ''.$cat.''; + } + $line .= ''. - $filename.''.$size.''.&Apache::lonlocal::locallocaltime($mtime).''.&mt($curr_access).'   '. - ''.&mt('View/Change').'
'. + $filename.''.$size.''.&Apache::lonlocal::locallocaltime($mtime).''. + &mt($curr_access).'   '); + $r->print(''.$access_admin_text.'
- - - + + +
'); } else { - $r->print(' + $r->print(''); + if ($can_delete) { + $r->print(' - '); + ' + ); + } } } @@ -332,16 +369,20 @@ sub close_form { sub display_file { my ($path,$filename)=@_; my $display_file_text; + my $file_start=''; + my $file_end=''; if (!defined($path)) { $path=$env{'form.currentpath'}; } if (!defined($filename)) { $filename=$env{'form.selectfile'}; - $display_file_text = ''.$path.$filename.''; + $display_file_text = $file_start.$path.$filename.$file_end; } elsif (ref($filename) eq "ARRAY") { - foreach (@$filename) { - $display_file_text .= ''.$path.$_.'
'; + foreach my $file (@$filename) { + $display_file_text .= $file_start.$path.$file.$file_end.'
'; } } elsif (ref($filename) eq "SCALAR") { - $display_file_text = ''.$path.$filename.''; + $display_file_text = $file_start.$path.$$filename.$file_end; + } else { + $display_file_text = $file_start.$path.$filename.$file_end; } return $display_file_text; } @@ -395,8 +436,8 @@ 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(' An error occured ('.$result. + ') while trying to delete '.&display_file(undef, $delete_file).'
'); } } $r->print(&done(undef,$url,$group)); @@ -420,8 +461,8 @@ sub delete_dir_confirmed { $directory_name); if ($result ne 'ok') { - $r->print(' An error occured (dir) ('.$result. - ') while trying to delete '.$directory_name.'
'); + $r->print(' An error occured (dir) ('.$result. + ') while trying to delete '.$directory_name.'
'); } else { # now remove from recent # $r->print('
removing '.$directory_name.'
print(''. + $r->print(''. &mt("Error: no valid filename was provided to rename to."). - '
'); + '
'); $r->print(&done(undef,$url,$group)); return; } @@ -471,39 +512,185 @@ sub rename_confirmed { $port_path.$env{'form.currentpath'}.$env{'form.selectfile'}, $port_path.$env{'form.currentpath'}.$filenewname); if ($result ne 'ok') { - $r->print(' An errror occured ('.$result. - ') while trying to rename '.&display_file().' to '. - &display_file(undef,$filenewname).'
'); + $r->print(''. + &mt('An errror occured ([_1]) while trying to rename [_2]' + .' to [_3]',$result,&display_file(), + &display_file('',$filenewname)).'
'); } if ($filenewname ne $env{'form.filenewname'}) { - $r->print("The new file name was changed from:
".$env{'form.filenewname'}." to $filenewname "); + $r->print(&mt("The new file name was changed from:
[_1] to [_2]", + ''.&display_file('',$env{'form.filenewname'}).'', + ''.&display_file('',$filenewname).'')); } $r->print(&done(undef,$url,$group)); } sub display_access { - my ($r,$url,$group) = @_; + my ($r,$url,$group,$can_setacl) = @_; 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 or more of the following types: public, password-protected or conditional.').'
'); - &access_setting_table($r,$access_controls{$file_name}); - my $button_text = { + my $aclcount = keys(%access_controls); + my $header = '

'.&mt('Allowing others to retrieve portfolio file: [_1]',$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.').'
'; + if ($can_setacl) { + &open_form($r,$url); + $r->print($header.$info); + &access_setting_table($r,$access_controls{$file_name}); + my $button_text = { 'continue' => &mt('Proceed'), 'cancel' => &mt('Back to directory listing'), }; - &close_form($r,$url,$group,$button_text); + &close_form($r,$url,$group,$button_text); + } else { + $r->print($header); + if ($aclcount) { + $r->print($info); + } + &view_access_settings($r,$url,$group,$access_controls{$file_name}, + $aclcount); + } +} + +sub view_access_settings { + my ($r,$url,$group,$access_controls,$aclcount) = @_; + my ($showstart,$showend); + my %todisplay; + foreach my $key (sort(keys(%{$access_controls}))) { + my ($num,$scope,$end,$start) = &unpack_acc_key($key); + $todisplay{$scope}{$key} = $$access_controls{$key}; + } + if ($aclcount) { + $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'). + ''.&mt('Additional information').''); + $r->print(&Apache::loncommon::end_data_table_header_row()); + my $count = 1; + my $chg = 'none'; + &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.
' )); + } + my $group_arg; + if ($group) { + $group_arg = '&group='.$group; + } + $r->print('
'.&mt('Return to directory listing').''); + return; +} + +sub build_access_summary { + my ($r,$count,$chg,%todisplay) = @_; + my ($showstart,$showend); + my %scope_desc = ( + public => 'Public', + guest => 'Passphrase-protected', + domains => 'Conditional: domain-based', + users => 'Conditional: user-based', + course => 'Conditional: course-based', + group => 'Conditional: group-based', + ); + my @allscopes = ('public','guest','domains','users','course','group'); + foreach my $scope (@allscopes) { + if ((!(exists($todisplay{$scope}))) || (ref($todisplay{$scope}) ne 'HASH')) { + next; + } + foreach my $key (sort(keys(%{$todisplay{$scope}}))) { + if ($count) { + $r->print(&Apache::loncommon::start_data_table_row()); + } + my ($num,$scope,$end,$start) = &unpack_acc_key($key); + my $content = $todisplay{$scope}{$key}; + 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_desc{$scope})); + if (($scope eq 'course') || ($scope eq 'group')) { + if ($chg ne 'delete') { + my $cid = $content->{'domain'}.'_'.$content->{'number'}; + my %course_description = &Apache::lonnet::coursedescription($cid); + $r->print('
('.$course_description{'description'}.')'); + } + } + $r->print(''.&mt('Start: ').$showstart. + '
'.&mt('End: ').$showend.''); + if ($chg ne 'delete') { + if ($scope eq 'guest') { + $r->print(&mt('Passphrase').': '.$content->{'password'}); + } elsif ($scope eq 'course' || $scope eq 'group') { + $r->print(''); + $r->print(''); + if ($scope eq 'course') { + $r->print(''); + } else { + $r->print(''); + } + $r->print(''); + foreach my $id (sort(keys(%{$content->{'roles'}}))) { + $r->print(''); + foreach my $item ('role','access','section','group') { + $r->print(''); + } + $r->print("
'.&mt('Roles').''. + &mt('Access').''. + &mt('Sections').''.&mt('Groups').''.&mt('Teams').'
'); + 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') { + $role_output .= $role.','; + } elsif ($role =~ /^cr/) { + $role_output .= (split('/',$role))[3].','; + } else { + $role_output .= &Apache::lonnet::plaintext($role,$ucscope).','; + } + } + $role_output =~ s/,$//; + $r->print($role_output); + } else { + $r->print(join(',',@{$content->{'roles'}{$id}{$item}})); + } + $r->print('
"); + } + $r->print(""); + } elsif ($scope eq 'domains') { + $r->print(&mt('Domains: ').join(',',@{$content->{'dom'}})); + } elsif ($scope eq 'users') { + my $curr_user_list = &sort_users($content->{'users'}); + $r->print(&mt('Users: ').$curr_user_list); + } else { + $r->print(' '); + } + } else { + $r->print(' '); + } + $r->print(''); + $r->print(&Apache::loncommon::end_data_table_row()); + $count ++; + } + } } + sub update_access { my ($r,$url,$group) = @_; - my $function = &Apache::loncommon::get_users_function(); - my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); my $totalprocessed = 0; my %processing; my %title = ( @@ -557,7 +744,9 @@ sub update_access { if (@{$processing{$chg}} > 0) { if ($chg eq 'delete') { if (!($deloutcome eq 'ok')) { - $errors .= &mt('A problem occurred deleting access controls: [_1]',$deloutcome); + $errors .=''. + &mt('A problem occurred deleting access controls: [_1]',$deloutcome). + ''; next; } } @@ -566,100 +755,24 @@ sub update_access { $r->print(''.&mt($title{$chg}). '.'); my $count = 0; + my %todisplay; foreach my $key (sort(keys(%{$$changes{$chg}}))) { - if ($count) { - $r->print(&Apache::loncommon::start_data_table_row()); - } - my ($num,$scope,$end,$start) = &unpack_acc_key($key); + my ($num,$scope,$end,$start) = &unpack_acc_key($key); my $newkey = $key; if ($chg eq 'activate') { $newkey =~ s/^(\d+)/$$translation{$1}/; } - my $content = $$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)); - if (($scope eq 'course') || ($scope eq 'group')) { - if ($chg ne 'delete') { - my $cid = $content->{'domain'}.'_'.$content->{'number'}; - my %course_description = &Apache::lonnet::coursedescription($cid); - $r->print('
('.$course_description{'description'}.')'); - } - } - $r->print(''.&mt('Start: ').$showstart. - '
'.&mt('End: ').$showend.''); - if ($chg ne 'delete') { - if ($scope eq 'guest') { - $r->print(&mt('Password').': '.$content->{'password'}); - } elsif ($scope eq 'course' || $scope eq 'group') { - $r->print(''); - $r->print(''); - if ($scope eq 'course') { - $r->print(''); - } else { - $r->print(''); - } - $r->print(''); - foreach my $id (sort(keys(%{$content->{'roles'}}))) { - $r->print(''); - foreach my $item ('role','access','section','group') { - $r->print(''); - } - } - $r->print(&Apache::loncommon::end_data_table_row()); - $r->print(&Apache::loncommon::end_data_table()); - } elsif ($scope eq 'domains') { - $r->print(&mt('Domains: ').join(',',@{$content->{'dom'}})); - } elsif ($scope eq 'users') { - my $curr_user_list = &sort_users($content->{'users'}); - $r->print(&mt('Users: ').$curr_user_list); - } else { - $r->print(' '); - } - } else { - $r->print(' '); - } - $r->print(''); - $r->print(&Apache::loncommon::end_data_table_row()); - $count ++; + $todisplay{$scope}{$newkey} = $$updated_controls{$newkey}; } + &build_access_summary($r,$count,$chg,%todisplay); } } $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); + $errors .= ''. + &mt('A problem occurred storing access control settings: [_1]',$outcome). + ''; } } if ($errors) { @@ -693,8 +806,12 @@ sub update_access { } &close_form($r,$url,$group); } else { + my $group_arg; + if ($group) { + $group_arg = '&group='.$group; + } $r->print('
'. + '&currentpath='.$env{'form.currentpath'}.$group_arg.'">'. &mt('Display all access settings for this file').''); } return; @@ -845,11 +962,11 @@ sub access_setting_table { $r->print(&Apache::loncommon::end_data_table_row()); $r->print(&Apache::loncommon::end_data_table()); $r->print(''); + ''); $r->print(&Apache::loncommon::end_data_table_header_row()); $r->print(&Apache::loncommon::start_data_table_row()); my $passwd; @@ -922,7 +1039,6 @@ sub display_access_row { my ($r,$status,$type,$items,$access_controls,$now,$then) = @_; if (@{$items} > 0) { my @all_doms; - my $tablecolor; my $colspan = 3; my $uctype = $type; $uctype =~ s/^(\w)/uc($1)/e; @@ -934,25 +1050,22 @@ sub display_access_row { $r->print(''); $colspan ++; - my $function = &Apache::loncommon::get_users_function(); - $tablecolor=&Apache::loncommon::designparm($function.'.tabbg'); } elsif ($type eq 'domains') { @all_doms = &Apache::loncommon::get_domains(); } $r->print(&Apache::loncommon::end_data_table_header_row()); - $r->print(&Apache::loncommon::start_data_table_row()); foreach my $key (@{$items}) { + $r->print(&Apache::loncommon::start_data_table_row()); if (($type eq 'course') || ($type eq 'group')) { - &course_row($r,$status,$type,$key,$access_controls, - $tablecolor,$now,$then); + &course_row($r,$status,$type,$key,$access_controls,$now,$then); } elsif ($type eq 'domains') { &domains_row($r,$status,$key,\@all_doms,$access_controls,$now, $then); } elsif ($type eq 'users') { &users_row($r,$status,$key,$access_controls,$now,$then); } + $r->print(&Apache::loncommon::end_data_table_row()); } - $r->print(&Apache::loncommon::end_data_table_row()); if ($status eq 'old') { $r->print(&Apache::loncommon::start_data_table_row()); $r->print(''); @@ -1032,12 +1147,10 @@ sub course_row { my %course_description = &Apache::lonnet::coursedescription($cid); $r->print(''); } elsif ($status eq 'new') { - my $uctype = $type; - $uctype =~ s/^(\w)/uc($1)/e; $r->print(''); } $r->print(''); - $r->print(''); } elsif ($status eq 'new') { my $role_id = 1; my $role_selects = &role_selectors($num,$role_id,$status,$type,undef,'display'); @@ -1177,8 +1290,10 @@ sub role_selectors { $cdom = $env{'form.cdom'}; $cnum = $env{'form.cnum'}; } + my $uctype = $type; + $uctype =~ s/^(\w)/uc($1)/e; my ($sections,$groups,$allroles,$rolehash,$accesshash) = - &Apache::loncommon::get_secgrprole_info($cdom,$cnum,1,$type); + &Apache::loncommon::get_secgrprole_info($cdom,$cnum,1,$uctype); if (!@{$sections}) { @{$sections} = ('none'); } else { @@ -1236,6 +1351,10 @@ sub role_options_window { my $cnum = $env{'form.cnum'}; my $type = $env{'form.type'}; my $addindex = $env{'form.setroles'}; + my $grouptitle = 'Groups'; + if ($type eq 'Group') { + $grouptitle = 'Teams'; + } my $role_selects = &role_selectors(1,1,'new',$type,undef,'rolepicker'); $r->print(<<"END_SCRIPT"); 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('
'.&mt('Roles').''. - &mt('Access').''. - &mt('Sections').''.&mt('Groups').''.&mt('Teams').'
'); - if ($item eq 'role') { - my $ucscope = $scope; - $ucscope =~ s/^(\w)/uc($1)/; - my $role_output; - foreach my $role (@{$content->{'roles'}{$id}{$item}}) { - if ($role eq 'all') { - $role_output .= $role.','; - } elsif ($role =~ /^cr/) { - $role_output .= (split('/',$role))[3].','; - } else { - $role_output .= &Apache::lonnet::plaintext($role,$ucscope).','; - } - } - $role_output =~ s/,$//; - $r->print($role_output); - } else { - $r->print(join(',',@{$content->{'roles'}{$id}{$item}})); - } - $r->print(' '); - $r->print('

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

'); + $r->print('

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

'); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print('
'.&mt('Action').''.&mt('Dates available'). - ''. &mt('Password').''. &mt('Passphrase').''.&mt('Allowed [_1] member affiliations',$type). ''.&additional_item($type). @@ -1011,7 +1124,7 @@ function getIndex(name,value) { } sub course_row { - my ($r,$status,$type,$item,$access_controls,$tablecolor,$now,$then) = @_; + my ($r,$status,$type,$item,$access_controls,$now,$then) = @_; my $content; my $defdom = $env{'user.domain'}; if ($status eq 'old') { @@ -1024,6 +1137,8 @@ sub course_row { if ($type eq 'group') { $crsgrptext = 'Teams'; } + my $uctype = $type; + $uctype =~ s/^(\w)/uc($1)/e; my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then, $type); $r->print(''.$js.&actionbox($status,$num,$scope).''.$course_description{'description'}.''.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,undef,undef,$uctype).'  '.&dateboxes($num,$start,$end).''); + $r->print(''); + $r->print('
'); $r->print(''); @@ -1051,7 +1164,7 @@ sub course_row { my $role_selects = &role_selectors($num,$role_id,$status,$type,$content,'display'); $r->print(''.$role_selects.''); } - $r->print('
'.&mt('Action').''.&mt('Roles').''. &mt('Access').''.&mt('Sections').''. &mt($crsgrptext).'


'.&mt('Add a roles-based condition').' {'domain'}','$content->{'number'}','Course'".')" value="'.$max_id.'" />

'.&mt('Add a roles-based condition').' {'domain'}','$content->{'number'}','$uctype'".')" value="'.$max_id.'" />
'.$role_selects.'
'.&mt('Roles').''.&mt('[_1] status',$type).''.&mt('Sections').''.&mt('Groups').'

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

'); return; } @@ -1314,6 +1433,14 @@ sub upload { 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($group); @@ -1339,17 +1466,17 @@ 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.'. + $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,$group)); } 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'}.''. + $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,$group)); } else { - $r->print('Unable to upload '.$fname.', a file by that name was found in '.$port_path.$env{'form.currentpath'}.''. + $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,$group)); } @@ -1357,14 +1484,15 @@ sub upload { 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(''.'An errror occured ('.$result. + ') while trying to upload '.&display_file().'
'); $r->print(&done('Back',$url,$group)); } else { $r->print(&done(undef,$url,$group)); } } } + sub lock_info { my ($r,$url,$group) = @_; my ($uname,$udom) = &get_name_dom($group); @@ -1401,9 +1529,9 @@ sub createdir { my ($r,$url,$group)=@_; my $newdir=&Apache::lonnet::clean_filename($env{'form.newdir'}); if ($newdir eq '') { - $r->print(''. + $r->print(''. &mt("Error: no directory name was provided."). - '
'); + '
'); $r->print(&done(undef,$url,$group)); return; } @@ -1417,16 +1545,16 @@ sub createdir { } } if ($found_file){ - $r->print(' Unable to create a directory named '.$newdir. - ' a file or directory by that name already exists.
'); + $r->print(''.'Unable to create a directory named '.$newdir. + ' a file or directory by that name already exists.
'); } else { my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path($group); my $result=&Apache::lonnet::mkdiruserfile($uname,$udom, $port_path.$env{'form.currentpath'}.$newdir); if ($result ne 'ok') { - $r->print(' An errror occured ('.$result. - ') while trying to create a new directory '.&display_file().'
'); + $r->print(''.'An errror occured ('.$result. + ') while trying to create a new directory '.&display_file().'
'); } } if ($newdir ne $env{'form.newdir'}) { @@ -1447,6 +1575,23 @@ sub get_portfolio_root { return (&Apache::loncommon::propath($udom,$uname).$path); } +sub get_group_quota { + my ($group) = @_; + my $group_quota; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$group); + if (%curr_groups) { + my %group_info = &Apache::longroup::get_group_settings( + $curr_groups{$group}); + $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,$group) = @_; my ($uname,$udom) = &get_name_dom($group); @@ -1470,7 +1615,7 @@ sub get_name_dom { sub prepend_group { my ($filename,$group) = @_; if (defined($group)) { - $filename = $group.'/'.$filename; + $filename = $group.$filename; } return $filename; } @@ -1496,6 +1641,37 @@ sub get_port_path { return $port_path; } +sub missing_priv { + my ($r,$url,$priv,$group) = @_; + my $longtext = { + upload => 'upload files', + delete => 'delete files', + rename => 'rename files', + setacl => 'set access controls for files', + }; + my $escpath = &HTML::Entities::encode($env{'form.currentpath'},'&<>"'); + my $rtnlink = 'print(&mt('in this portfolio.')); + } + $rtnlink .= '">'.&mt('Return to directory listing page').''; + $r->print('
'.$rtnlink); + $r->print(&Apache::loncommon::end_page()); + return; +} + sub handler { # this handles file management my $r = shift; @@ -1508,6 +1684,7 @@ sub handler { $url = $1.$2; $caller = $2; } + my ($can_modify,$can_delete,$can_upload,$can_setacl); if ($caller eq 'coursegrp_portfolio') { # Needs to be in a course if (! ($env{'request.course.fn'})) { @@ -1530,7 +1707,7 @@ sub handler { $env{'request.course.id'}.'/'.$group))) { $portfolio_root = &get_portfolio_root($group); } else { - $r->print('You do not have the privileges required to access the shared files space for this group'); + $r->print('You do not have the privileges required to access the shared files space for this group.'); $earlyout = 1; } } else { @@ -1543,10 +1720,33 @@ sub handler { $earlyout = 1; } if ($earlyout) { return OK; } + if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) { + $can_modify = 1; + $can_delete = 1; + $can_upload = 1; + $can_setacl = 1; + } else { + if (&Apache::lonnet::allowed('agf',$env{'request.course.id'}.'/'.$group)) { + $can_setacl = 1; + } + if (&Apache::lonnet::allowed('ugf',$env{'request.course.id'}.'/'.$group)) { + $can_upload = 1; + } + if (&Apache::lonnet::allowed('mgf',$env{'request.course.id'}.'/'.$group)) { + $can_modify = 1; + } + if (&Apache::lonnet::allowed('dgf',$env{'request.course.id'}.'/'.$group)) { + $can_delete = 1; + } + } } else { ($uname,$udom) = &get_name_dom(); $portfolio_root = &get_portfolio_root(); $title = &mt('Portfolio Manager'); + $can_modify = 1; + $can_delete = 1; + $can_upload = 1; + $can_setacl = 1; } &Apache::loncommon::no_cache($r); @@ -1564,9 +1764,11 @@ sub handler { } $r->rflush(); if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){ - $r->print(' No file was selected to upload.'. - 'To upload a file, click Browse...'. - ', select a file, then click Upload,'); + $r->print(''. + 'No file was selected to upload.'. + 'To upload a file, click Browse...'. + ', select a file, then click Upload.'. + ''); } if ($env{'form.meta'}) { &open_form($r,$url); @@ -1578,31 +1780,71 @@ sub handler { } if ($env{'form.uploaddoc.filename'}) { - &upload($r,$url,$group); + if ($can_upload) { + &upload($r,$url,$group); + } else { + &missing_priv($r,$url,'upload',$group), + } } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) { - &delete_confirmed($r,$url,$group); + if ($can_delete) { + &delete_confirmed($r,$url,$group); + } else { + &missing_priv($r,$url,'delete',$group); + } } elsif ($env{'form.action'} eq 'delete') { - &delete($r,$url,$group); + if ($can_delete) { + &delete($r,$url,$group); + } else { + &missing_priv($r,$url,'delete',$group); + } } elsif ($env{'form.action'} eq 'deletedir' && $env{'form.confirmed'}) { - &delete_dir_confirmed($r,$url,$group); - } elsif ($env{'form.action'} eq 'deletedir'){ - &delete_dir($r,$url,$group); + if ($can_delete) { + &delete_dir_confirmed($r,$url,$group); + } else { + &missing_priv($r,$url,'delete',$group); + } + } elsif ($env{'form.action'} eq 'deletedir') { + if ($can_delete) { + &delete_dir($r,$url,$group); + } else { + &missing_priv($r,$url,'delete',$group); + } } elsif ($env{'form.action'} eq 'rename' && $env{'form.confirmed'}) { - &rename_confirmed($r,$url,$group); + if ($can_modify) { + &rename_confirmed($r,$url,$group); + } else { + &missing_priv($r,$url,'rename',$group); + } } elsif ($env{'form.rename'}) { $env{'form.selectfile'} = $env{'form.rename'}; $env{'form.action'} = 'rename'; - &rename($r,$url,$group); + if ($can_modify) { + &rename($r,$url,$group); + } else { + &missing_priv($r,$url,'rename',$group); + } } elsif ($env{'form.access'}) { $env{'form.selectfile'} = $env{'form.access'}; $env{'form.action'} = 'chgaccess'; - &display_access($r,$url,$group); + &display_access($r,$url,$group,$can_setacl); } elsif ($env{'form.action'} eq 'chgaccess') { - &update_access($r,$url,$group); + if ($can_setacl) { + &update_access($r,$url,$group); + } else { + &missing_priv($r,$url,'setacl',$group); + } } elsif ($env{'form.action'} eq 'rolepicker') { - &role_options_window($r); + if ($can_setacl) { + &role_options_window($r); + } else { + &missing_priv($r,$url,'setacl',$group); + } } elsif ($env{'form.createdir'}) { - &createdir($r,$url,$group); + if ($can_upload) { + &createdir($r,$url,$group); + } else { + &missing_priv($r,$url,'upload',$group); + } } elsif ($env{'form.lockinfo'}) { &lock_info($r,$url,$group); } else { @@ -1631,11 +1873,14 @@ sub handler { } # 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,$group); - &display_directory($r,$url,$current_path,$is_empty,\@dir_list,$group); + &display_common($r,$url,$current_path,$is_empty,\@dir_list,$group, + $can_upload); + &display_directory($r,$url,$current_path,$is_empty,\@dir_list,$group, + $can_upload,$can_modify,$can_delete,$can_setacl); $r->print(&Apache::loncommon::end_page()); } return OK; } + 1; __END__ 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.