# Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # package Apache::portfolio; use strict; use Apache::Constants qw(:common :http); use Apache::loncommon; use Apache::lonnet; use Apache::lontexconvert; use Apache::lonfeedback; use Apache::lonlocal; use Apache::lonnet; use Apache::longroup; use lib '/home/httpd/lib/perl'; use LONCAPA; # receives a file name and path stub from username/userfiles/portfolio/ # returns an anchor tag consisting encoding filename and currentpath sub make_anchor { my ($url, $filename, $current_path, $current_mode, $field_name, $continue_select,$group) = @_; if ($continue_select ne 'true') {$continue_select = 'false'}; my $anchor = ''.$filename.''; return $anchor; } my $dirptr=16384; sub display_common { my ($r,$url,$current_path,$is_empty,$dir_list,$group)=@_; my $groupitem; 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', 'upload_label' => 'Upload file to current directory:', 'createdir' => 'Create Subdirectory', 'createdir_label' => 'Create subdirectory in current directory:'); $r->print(<<"TABLE");
$text{'upload_label'} $groupitem
$text{'createdir_label'} $groupitem
TABLE my @tree = split (/\//,$current_path); $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++){ $newCurrentPath .= $tree[$i].'/'; $r->print(&make_anchor($url,$tree[$i],'/'.$newCurrentPath, $env{"form.mode"},$env{"form.fieldname"}, $env{"form.continue"},$group).'/'); } } $r->print(''); &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path); $r->print('
'. &Apache::lonhtmlcommon::select_recent($namespace,'currentpath', 'this.form.submit();')); $r->print("
"); } sub display_directory { my ($r,$url,$current_path,$is_empty,$dir_list,$group)=@_; my $iconpath= $r->dir_config('lonIconsURL') . "/"; my ($groupitem,$groupecho); my $display_out; my $select_mode; my $checked_files; my $port_path = &get_port_path($group); my ($uname,$udom) = &get_name_dom($group); if (defined($group)) { $groupitem = ''; $groupecho = '&group='.$group; } my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, $uname); my %locked_files = &Apache::lonnet::get_marked_as_readonly_hash( $current_permissions,$group); my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group); my $now = time; if ($env{"form.mode"} eq 'selectfile'){ &select_files($r); $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'}); $select_mode = 'true'; } if ($is_empty && ($current_path ne '/')) { $display_out = '
'.$groupitem. ''. ''. ''. ''. '
'; $r->print($display_out); return; } if ($select_mode eq 'true') { $r->print(''. ''); $r->print(''); } else { $r->print('
Select NameSizeLast Modified
'. ''); $r->print(''); } if (defined($group)) { $r->print("\n".$groupitem."\n"); } my $href_location="/uploaded/$udom/$uname/$port_path".$current_path; my $href_edit_location="/editupload/$udom/$uname/$port_path".$current_path; my @dir_lines; my %versioned; foreach my $line (sort { my ($afile)=split('&',$a,2); my ($bfile)=split('&',$b,2); return (lc($afile) cmp lc($bfile)); } (@$dir_list)) { #$strip holds directory/file name #$dom my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); $filename =~ s/\s+$//; my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename); if ($version) { $versioned{$fname} .= $version.","; } push(@dir_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]); } foreach my $line (@dir_lines) { my ($filename,$dom,$testdir,$size,$mtime,$obs) = @$line; my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename); if (($filename ne '.') && ($filename ne '..') && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/)) { if ($dirptr&$testdir) { if ($select_mode eq 'true'){ $r->print(''); } else { $r->print(''); } $r->print(''); $r->print(''); $r->print(''); } else { $r->print(''); my $version_flag; if (exists($versioned{$fname})) { $version_flag = "*"; } else { $version_flag = ""; } my $fullpath = $current_path.$filename; $fullpath = &prepend_group($fullpath,$group); if ($select_mode eq 'true'){ $r->print(''); } else { if (exists $locked_files{$fullpath}) { $r->print(''); } 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; } 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('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(''); } } } if ($select_mode eq 'true') { $r->print('
Actions NameSizeLast ModifiedCurrent Access Status
Go to ...'.&make_anchor($url,$filename.'/',$current_path.$filename.'/',$env{'form.mode'},$env{"form.fieldname"},$env{'form.continue'},$group).'
print("CHECKED"); } $r->print('>Locked Rename '.$cat.' '. $filename.''.$size.''.&Apache::lonlocal::locallocaltime($mtime).''.&mt($curr_access).'   '. ''.&mt('View/Change').'

'); } else { $r->print(' '); } } sub open_form { my ($r,$url)=@_; my @files=&Apache::loncommon::get_env_multiple('form.selectfile'); $r->print('
'); $r->print(''); $r->print(''); foreach (@files) { $r->print(''); } $r->print(''); } sub close_form { my ($r,$url,$group,$button_text)=@_; if (!defined($button_text)) { $button_text = { 'continue' => &mt('Continue'), 'cancel' => &mt('Cancel'), }; } $r->print('

'); if (defined($group)) { $r->print("\n".''); } $r->print('

'); $r->print('

'); if (defined($group)) { $r->print("\n".''); } $r->print("\n".'

'); } sub display_file { my ($path,$filename)=@_; my $display_file_text; if (!defined($path)) { $path=$env{'form.currentpath'}; } if (!defined($filename)) { $filename=$env{'form.selectfile'}; $display_file_text = ''.$path.$filename.''; } elsif (ref($filename) eq "ARRAY") { foreach (@$filename) { $display_file_text .= ''.$path.$_.'
'; } } elsif (ref($filename) eq "SCALAR") { $display_file_text = ''.$path.$filename.''; } return $display_file_text; } sub done { my ($message,$url,$group)=@_; unless (defined $message) { $message='Done'; } my $result = '

'.&mt($message).'

'; return $result; } sub delete { my ($r,$url,$group)=@_; my @check; my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'}; $file_name = &prepend_group($file_name,$group); my @files=&Apache::loncommon::get_env_multiple('form.selectfile'); my ($uname,$udom) = &get_name_dom($group); if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { $r->print ("The file is locked and cannot be deleted.
"); $r->print(&done('Back',$url,$group)); } else { if (scalar(@files)) { &open_form($r,$url); $r->print('

'.&mt('Delete').' '.&display_file(undef,\@files).'?

'); &close_form($r,$url,$group); } else { $r->print("No file was checked to delete.
"); $r->print(&done(undef,$url,$group)); } } } sub delete_confirmed { my ($r,$url,$group)=@_; my @files=&Apache::loncommon::get_env_multiple('form.selectfile'); my $result; my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path($group); foreach my $delete_file (@files) { $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path. $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(&done(undef,$url,$group)); } sub delete_dir { my ($r,$url,$group)=@_; &open_form($r,$url); $r->print('

'.&mt('Delete').' '.&display_file().'?

'); &close_form($r,$url,$group); } sub delete_dir_confirmed { my ($r,$url,$group)=@_; my $directory_name = $env{'form.currentpath'}; $directory_name =~ s|/$||; # remove any trailing slash my ($uname,$udom) = &get_name_dom($group); my $namespace = &get_namespace($group); my $port_path = &get_port_path($group); my $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path. $directory_name); if ($result ne 'ok') { $r->print(' An error occured (dir) ('.$result. ') while trying to delete '.$directory_name.'
'); } else { # now remove from recent # $r->print('
removing '.$directory_name.'
print(&done(undef,$url,$group)); } sub rename { my ($r,$url,$group)=@_; my $file_name = $env{'form.currentpath'}.$env{'form.rename'}; my ($uname,$udom) = &get_name_dom($group); $file_name = &prepend_group($file_name,$group); if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { $r->print ("The file is locked and cannot be renamed.
"); $r->print(&done(undef,$url,$group)); } else { &open_form($r,$url); $r->print('

'.&mt('Rename').' '.&display_file().' to ?

'); &close_form($r,$url,$group); } } sub rename_confirmed { my ($r,$url,$group)=@_; my $filenewname=&Apache::lonnet::clean_filename($env{'form.filenewname'}); my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path($group); if ($filenewname eq '') { $r->print(''. &mt("Error: no valid filename was provided to rename to."). '
'); $r->print(&done(undef,$url,$group)); return; } my $result= &Apache::lonnet::renameuserfile($uname,$udom, $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).'
'); } if ($filenewname ne $env{'form.filenewname'}) { $r->print("The new file name was changed from:
".$env{'form.filenewname'}." to $filenewname "); } $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 or more of the following types: public, password-protected or conditional.').'
'); &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); } 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 = ( 'activate' => 'New control(s) added', 'delete' => 'Existing control(s) deleted', 'update' => 'Existing control(s) 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,$chg); } } } 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('Dates available'). ''.&mt('Additional information').''); $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) = &unpack_acc_key($key); 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)); 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 ++; } } } $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); } } my $allnew = 0; my $totalnew = 0; my $status = 'new'; my ($firstitem,$lastitem); foreach my $newitem ('course','group','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,$group); foreach my $newitem ('course','group','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; $lastitem = $totalnew + $env{'form.new'.$newitem}; $totalnew = $lastitem; my @numbers; for (my $i=$firstitem; $i<$lastitem; $i++) { push (@numbers,$i); } &display_access_row($r,$status,$newitem,\@numbers, $access_controls{$file_name},$now,$then); } } &close_form($r,$url,$group); } else { $r->print('
'. &mt('Display all access settings for this file').''); } return; } sub build_access_record { my ($num,$scope,$start,$end,$chg) = @_; my $record = ''.$start.''. $end.''; if ($scope eq 'guest') { $record .= ''.$env{'form.password'}.''; } elsif (($scope eq 'course') || ($scope eq 'group')) { $record .= ''.$env{'form.crsdom_'.$num}.''. $env{'form.crsnum_'.$num}.''; my @role_ids; my @delete_role_ids; if (exists($env{'form.delete_role_'.$num})) { @delete_role_ids = &Apache::loncommon::get_env_multiple('form.delete_role_'.$num); } if (exists($env{'form.preserve_role_'.$num})) { my @preserves = &Apache::loncommon::get_env_multiple('form.preserve_role_'.$num); if (@delete_role_ids > 0) { foreach my $id (@preserves) { if (grep/^\Q$id\E$/,@delete_role_ids) { next; } push(@role_ids,$id); } } else { push(@role_ids,@preserves); } } my $next_id = ''; if (exists($env{'form.add_role_'.$num})) { $next_id = $env{'form.add_role_'.$num}; if ($next_id) { push(@role_ids,$next_id); } } foreach my $id (@role_ids) { my (@roles,@accesses,@sections,@groups); if (($id == $next_id) && ($chg eq 'update')) { @roles = split(/,/,$env{'form.role_'.$num.'_'.$next_id}); @accesses = split(/,/,$env{'form.access_'.$num.'_'.$next_id}); @sections = split(/,/,$env{'form.section_'.$num.'_'.$next_id}); @groups = split(/,/,$env{'form.group_'.$num.'_'.$next_id}); } else { @roles = &Apache::loncommon::get_env_multiple('form.role_'.$num.'_'.$id); @accesses = &Apache::loncommon::get_env_multiple('form.access_'.$num.'_'.$id); @sections = &Apache::loncommon::get_env_multiple('form.section_'.$num.'_'.$id); @groups = &Apache::loncommon::get_env_multiple('form.group_'.$num.'_'.$id); } $record .= ''; foreach my $role (@roles) { $record .= ''.$role.''; } foreach my $access (@accesses) { $record .= ''.$access.''; } foreach my $section (@sections) { $record .= '
'.$section.'
'; } foreach my $group (@groups) { $record .= ''.$group.''; } $record .= '
'; } } elsif ($scope eq 'domains') { my @doms = &Apache::loncommon::get_env_multiple('form.dom_'.$num); foreach my $dom (@doms) { if ($dom ne '') { $record .= ''.$dom.''; } } } elsif ($scope eq 'users') { my $userlist = $env{'form.users_'.$num}; $userlist =~ s/[\r\n\f]+//g; $userlist =~ s/\s+//g; my @users = split/,/,$userlist; my %userhash; my @unique_users; foreach my $user (@users) { if (!exists($userhash{$user})) { $userhash{$user} = 1; push(@unique_users,$user); } } $record .= ''; foreach my $user (@unique_users) { my ($uname,$udom) = split(/:/,$user); $record .= ''.$uname.''.$udom. ''; } $record .= ''; } $record .= '
'; 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 sort_users { my ($users_hash) = @_; my @curr_users; foreach my $user (keys(%{$users_hash})) { $curr_users[$$users_hash{$user}] = $user; } my $curr_user_list = join(",\n",@curr_users); return $curr_user_list; } 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. my ($num,$scope,$publicnum,$guestnum); my (%acl_count,%end,%start); foreach my $key (sort(keys(%{$access_controls}))) { ($num,$scope,$end{$key},$start{$key}) = &unpack_acc_key($key); if ($scope eq 'public') { $public = $key; $publicnum = $num; $publictext = &acl_status($start{$key},$end{$key},$now); } elsif ($scope eq 'guest') { $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); } $acl_count{$scope} ++; } $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(&Apache::loncommon::end_data_table_row()); $r->print(&Apache::loncommon::start_data_table_row()); if ($public) { $r->print(''); } else { $r->print(''); } $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::start_data_table_row()); my $passwd; if ($guest) { my %content = &Apache::lonnet::parse_access_controls( $$access_controls{$guest}); $passwd = $content{'password'}; $r->print(''); } else { $r->print(''); } $r->print(''); $r->print(&Apache::loncommon::end_data_table_row()); $r->print(&Apache::loncommon::end_data_table()); $r->print(''); if (@courses > 0 || @groups > 0) { $r->print(''); if (@courses > 0 || @groups > 0) { $r->print('
'); $r->print('

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

'); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_row()); $r->print('
'.&mt('Action').''.&mt('Dates available').''.&actionbox('old',$publicnum,'public').''. &dateboxes($publicnum,$start{$public},$end{$public}).''.&actionbox('new','0','public').''. &dateboxes('0',$now,$then).' '); $r->print('

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

'); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_row()); $r->print('
'.&mt('Action').''.&mt('Dates available'). ''. &mt('Password').''.&actionbox('old',$guestnum,'guest').''. &dateboxes($guestnum,$start{$guest},$end{$guest}).''.&actionbox('new','1','guest').''. &dateboxes('1',$now,$then).'
 
'); &access_element($r,'domains',\%acl_count,\@domains,$access_controls,$now,$then); $r->print(' '); &access_element($r,'users',\%acl_count,\@users,$access_controls,$now,$then); $r->print('
'); } else { $r->print(''); } &access_element($r,'course',\%acl_count,\@courses,$access_controls,$now,$then); $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'); } if ($end && $end<$now) { return &mt('Inactive'); } return &mt('Active'); } sub access_element { my ($r,$type,$acl_count,$items,$access_controls,$now,$then) = @_; my $title = $type; $title =~ s/s$//; $title =~ s/^(\w)/uc($1)/e; $r->print('

'.&mt('[_1]-based conditional access: ',$title)); if ($$acl_count{$type}) { $r->print($$acl_count{$type}.' '); if ($$acl_count{$type} > 1) { $r->print(&mt('conditions')); } else { $r->print(&mt('condition')); } } else { $r->print(&mt('Off')); } $r->print('

'); &display_access_row($r,'old',$type,$items,$access_controls,$now,$then); return; } 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; $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_row()); $r->print(''.&mt('Action?').''.&mt($uctype).''. &mt('Dates available').''); if (($type eq 'course') || ($type eq 'group')) { $r->print(''.&mt('Allowed [_1] member affiliations',$type). ''); $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_row()); foreach my $key (@{$items}) { if (($type eq 'course') || ($type eq 'group')) { &course_row($r,$status,$type,$key,$access_controls, $tablecolor,$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::start_data_table_row()); if ($status eq 'old') { $r->print(''.&additional_item($type). ''); } $r->print(&Apache::loncommon::end_data_table()); } else { $r->print(&mt('No [_1]-based conditions defined.
',$type). &additional_item($type)); } return; } sub course_row { my ($r,$status,$type,$item,$access_controls,$tablecolor,$now,$then) = @_; my %content; my $defdom = $env{'user.domain'}; if ($status eq 'old') { %content = &Apache::lonnet::parse_access_controls( $$access_controls{$item}); $defdom = $content{'domain'}; } $r->print(&Apache::loncommon::coursebrowser_javascript($defdom)); $r->print(qq| |); $r->print(&Apache::loncommon::start_data_table_row()); my $crsgrptext = 'Groups'; if ($type eq 'group') { $crsgrptext = 'Teams'; } my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then, $type); $r->print(''.&actionbox($status,$num,$scope).''); if ($status eq 'old') { my $cid = $content{'domain'}.'_'.$content{'number'}; my %course_description = &Apache::lonnet::coursedescription($cid); $r->print(''.$course_description{'description'}.''); } elsif ($status eq 'new') { my $uctype = $type; $uctype =~ s/^(\w)/uc($1)/e; $r->print(''.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,undef,undef,$uctype).'  '); } $r->print(''.&dateboxes($num,$start,$end).''); $r->print(''); $r->print(''); if ($status eq 'old') { my $max_id = 0; foreach my $role_id (sort(keys(%{$content{'roles'}}))) { if ($role_id > $max_id) { $max_id = $role_id; } $max_id ++; 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').' '); } elsif ($status eq 'new') { my $role_id = 1; my $role_selects = &role_selectors($num,$role_id,$status,$type,undef,'display'); $r->print(''.&mt('Add').''.$role_selects); $r->print(''); } $r->print(&Apache::loncommon::end_data_table_row()); return; } sub domains_row { my ($r,$status,$item,$all_doms,$access_controls,$now,$then) = @_; $r->print(&Apache::loncommon::start_data_table_row()); my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then, 'domains'); my $dom_select = ''.&dateboxes($num,$start,$end).''); $r->print(&Apache::loncommon::end_data_table_row()); } sub additional_item { my ($type) = @_; my $output = &mt('Add new [_1] condition(s)?',$type).' '.&mt('Number to add: ').''; return $output; } sub actionbox { my ($status,$num,$scope) = @_; my $output = '
'. ''; return $output; } sub dateboxes { my ($num,$start,$end) = @_; my $noend; if ($end == 0) { $noend = 'checked="checked"'; } my $startdate = &Apache::lonhtmlcommon::date_setter('portform', 'startdate_'.$num,$start,undef,undef,undef,1,undef, undef,undef,1); my $enddate = &Apache::lonhtmlcommon::date_setter('portform', 'enddate_'.$num,$end,undef,undef,undef,1,undef, undef,undef,1). '  '; my $output = &mt('Start: ').$startdate.'
'.&mt('End: ').$enddate; return $output; } sub unpack_acc_key { my ($acc_key) = @_; my ($num,$scope,$end,$start) = ($acc_key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/); return ($num,$scope,$end,$start); } sub set_identifiers { my ($status,$item,$now,$then,$scope) = @_; if ($status eq 'old') { return(&unpack_acc_key($item)); } else { return($item,$scope,$then,$now); } } sub role_selectors { my ($num,$role_id,$status,$type,$content,$caller) = @_; my ($output,$cdom,$cnum,$longid); if ($caller eq 'display') { $longid = '_'.$num.'_'.$role_id; if ($status eq 'new') { foreach my $item ('role','access','section','group') { $output .= ''; } return $output; } else { $cdom = $$content{'domain'}; $cnum = $$content{'number'}; } } elsif ($caller eq 'rolepicker') { $cdom = $env{'form.cdom'}; $cnum = $env{'form.cnum'}; } my ($sections,$groups,$allroles,$rolehash,$accesshash) = &Apache::loncommon::get_secgrprole_info($cdom,$cnum,1,$type); if (!@{$sections}) { @{$sections} = ('none'); } else { unshift(@{$sections},('all','none')); } if (!@{$groups}) { @{$groups} = ('none'); } else { unshift(@{$groups},('all','none')); } my @allacesses = sort(keys(%{$accesshash})); my (%sectionhash,%grouphash); foreach my $sec (@{$sections}) { $sectionhash{$sec} = $sec; } foreach my $grp (@{$groups}) { $grouphash{$grp} = $grp; } my %lookup = ( 'role' => $rolehash, 'access' => $accesshash, 'section' => \%sectionhash, 'group' => \%grouphash, ); my @allaccesses = sort(keys(%{$accesshash})); my %allitems = ( 'role' => $allroles, 'access' => \@allaccesses, 'section' => $sections, 'group' => $groups, ); foreach my $item ('role','access','section','group') { $output .= ''; } $output .= ''; return $output; } sub role_options_window { my ($r) = @_; my $cdom = $env{'form.cdom'}; my $cnum = $env{'form.cnum'}; my $type = $env{'form.type'}; my $addindex = $env{'form.setroles'}; 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('
'.$role_selects.'
'.&mt('Roles').''.&mt('[_1] status',$type).''.&mt('Sections').''.&mt('Groups').'

'); return; } sub select_files { 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 . . . my @items=&Apache::loncommon::get_env_multiple('form.checkfile'); if (scalar(@items)){ &Apache::lonnet::save_selected_files($env{'user.name'}, $env{'form.currentpath'}, @items); } } else { #empty the file for a fresh start &Apache::lonnet::clear_selected_files($env{'user.name'}); } my @files = &Apache::lonnet::files_not_in_path($env{'user.name'}, $env{'form.currentpath'}); my $java_files = join ",", @files; if ($java_files) { $java_files.=','; } my $javascript =(< function finishSelect() { ENDSMP $javascript .= 'fileList = "'.$java_files.'";'; $javascript .= (< ENDSMP $r->print($javascript); $r->print("

Select portfolio files

Check as many as you wish in response to the problem.
"); my @otherfiles=&Apache::lonnet::files_not_in_path($env{'user.name'}, $env{'form.currentpath'}); if (@otherfiles) { $r->print("Files selected from other directories:
"); foreach my $file (@otherfiles) { $r->print($file."
"); } } } 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 $fname=&Apache::lonnet::clean_filename($fname); my $portfolio_root=&get_portfolio_root($group); my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path($group); # Fixme --- Move the checking for existing file to LOND error return my @dir_list=&get_dir_list($portfolio_root,$group); 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 = &prepend_group($file_name,$group); $found_file = 1; if (defined($group)) { $file_name = $group.'/'.$file_name; } if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { $locked_file = 1; } } } 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,$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'}.''. '
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'}.''. '
To upload, rename or delete existing '.$fname.' in '.$port_path.$env{'form.currentpath'}); $r->print(&done('Back',$url,$group)); } } 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,$group)); } else { $r->print(&done(undef,$url,$group)); } } } sub lock_info { my ($r,$url,$group) = @_; my ($uname,$udom) = &get_name_dom($group); my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, $uname); my $file_name = $env{'form.lockinfo'}; $file_name = &prepend_group($file_name,$group); if (defined($file_name) && defined($$current_permissions{$file_name})) { foreach my $array_item (@{$$current_permissions{$file_name}}) { if (ref($array_item) eq 'ARRAY') { my $filetext; if (defined($group)) { $filetext = ''.$env{'form.lockinfo'}. ' (group: '.$group.')'; } else { $filetext = ''.$file_name.''; } $r->print(&mt('[_1] was submitted in response to problem: ', $filetext). ''.&Apache::lonnet::gettitle($$array_item[0]). '
'); my %course_description = &Apache::lonnet::coursedescription($$array_item[1]); $r->print(&mt('In the course: [_1]
', $course_description{'description'})); # $r->print('the third is '.$$array_item[2].'
'); # $r->print("item is $$array_item[0]
and $$array_item[0]"); } } } $r->print(&done('Back',$url,$group)); return 'ok'; } sub createdir { my ($r,$url,$group)=@_; my $newdir=&Apache::lonnet::clean_filename($env{'form.newdir'}); if ($newdir eq '') { $r->print(''. &mt("Error: no directory name was provided."). '
'); $r->print(&done(undef,$url,$group)); return; } my $portfolio_root = &get_portfolio_root($group); my @dir_list=&get_dir_list($portfolio_root,$group); my $found_file = 0; foreach my $line (@dir_list) { my ($filename)=split(/\&/,$line,2); if ($filename eq $newdir){ $found_file = 1; } } if ($found_file){ $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().'
'); } } if ($newdir ne $env{'form.newdir'}) { $r->print("The new directory name was changed from:
".$env{'form.newdir'}." to $newdir "); } $r->print(&done(undef,$url,$group)); } sub get_portfolio_root { my ($group) = @_; my ($portfolio_root,$udom,$uname,$path); ($uname,$udom) = &get_name_dom($group); if (defined($group)) { $path = '/userfiles/groups/'.$group.'/portfolio'; } else { $path = '/userfiles/portfolio'; } return (&Apache::loncommon::propath($udom,$uname).$path); } sub get_dir_list { my ($portfolio_root,$group) = @_; my ($uname,$udom) = &get_name_dom($group); return &Apache::lonnet::dirlist($env{'form.currentpath'}, $udom,$uname,$portfolio_root); } sub get_name_dom { my ($group) = @_; my ($uname,$udom); if (defined($group)) { $udom = $env{'course.'.$env{'request.course.id'}.'.domain'}; $uname = $env{'course.'.$env{'request.course.id'}.'.num'}; } else { $udom = $env{'user.domain'}; $uname = $env{'user.name'}; } return ($uname,$udom); } sub prepend_group { my ($filename,$group) = @_; if (defined($group)) { $filename = $group.'/'.$filename; } return $filename; } sub get_namespace { my ($group) = @_; my $namespace = 'portfolio'; if (defined($group)) { my ($uname,$udom) = &get_name_dom($group); $namespace .= '_'.$udom.'_'.$uname.'_'.$group; } return $namespace; } sub get_port_path { my ($group) = @_; my $port_path; if (defined($group)) { $port_path = "groups/$group/portfolio"; } else { $port_path = 'portfolio'; } return $port_path; } sub handler { # this handles file management my $r = shift; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['selectfile','currentpath','meta','lockinfo','currentfile','action', 'fieldname','mode','rename','continue','group','access','setnum', 'cnum','cdom','type','setroles']); my ($uname,$udom,$portfolio_root,$url,$group,$caller,$title); if ($r->uri =~ m|^(/adm/)([^/]+)|) { $url = $1.$2; $caller = $2; } if ($caller eq 'coursegrp_portfolio') { # Needs to be in a course if (! ($env{'request.course.fn'})) { # Not in a course $env{'user.error.msg'}= "/adm/coursegrp_portfolio:rgf:0:0:Cannot view group portfolio"; return HTTP_NOT_ACCEPTABLE; } my $earlyout = 0; my $view_permission = &Apache::lonnet::allowed('vcg', $env{'request.course.id'}); $group = $env{'form.group'}; $group =~ s/\W//g; if ($group) { ($uname,$udom) = &get_name_dom($group); my %curr_groups = &Apache::longroup::coursegroups($udom,$uname, $group); if (%curr_groups) { if (($view_permission) || (&Apache::lonnet::allowed('rgf', $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'); $earlyout = 1; } } else { $r->print('Not a valid group for this course'); $earlyout = 1; } $title = &mt('Group files').' for '.$group; } else { $r->print('Invalid group'); $earlyout = 1; } if ($earlyout) { return OK; } } else { ($uname,$udom) = &get_name_dom(); $portfolio_root = &get_portfolio_root(); $title = &mt('Portfolio Manager'); } &Apache::loncommon::no_cache($r); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; # Give the LON-CAPA page header if ($env{"form.mode"} eq 'selectfile'){ $r->print(&Apache::loncommon::start_page($title,undef, {'only_body' => 1})); } elsif ($env{'form.action'} eq 'rolepicker') { $r->print(&Apache::loncommon::start_page('New role-based condition',undef, {'no_nav_bar' => 1, })); } else { $r->print(&Apache::loncommon::start_page($title)); } $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,'); } if ($env{'form.meta'}) { &open_form($r,$url); # $r->print(&edit_meta_data($r, $env{'form.currentpath'}.$env{'form.selectfile'})); $r->print('Edit the meta data
'); &close_form($r,$url,$group); } if ($env{'form.store'}) { } if ($env{'form.uploaddoc.filename'}) { &upload($r,$url,$group); } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) { &delete_confirmed($r,$url,$group); } elsif ($env{'form.action'} eq 'delete') { &delete($r,$url,$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); } elsif ($env{'form.action'} eq 'rename' && $env{'form.confirmed'}) { &rename_confirmed($r,$url,$group); } elsif ($env{'form.rename'}) { $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.action'} eq 'rolepicker') { &role_options_window($r); } elsif ($env{'form.createdir'}) { &createdir($r,$url,$group); } elsif ($env{'form.lockinfo'}) { &lock_info($r,$url,$group); } else { my $current_path='/'; if ($env{'form.currentpath'}) { $current_path = $env{'form.currentpath'}; } my @dir_list=&get_dir_list($portfolio_root,$group); if ($dir_list[0] eq 'no_such_dir'){ # two main reasons for this: # 1) never been here, so directory structure not created # 2) back-button navigation after deleting a directory if ($current_path eq '/'){ &Apache::lonnet::mkdiruserfile($uname,$udom, &get_port_path($group)); } else { # some directory that snuck in get rid of the directory # from the recent pulldown, just in case &Apache::lonhtmlcommon::remove_recent('portfolio', [$current_path]); $current_path = '/'; # force it back to the root } # now grab the directory list again, for the first time @dir_list=&Apache::lonnet::dirlist($current_path, $udom,$uname,$portfolio_root); } # 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); $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.