--- loncom/interface/portfolio.pm 2008/12/12 15:38:53 1.196.2.1
+++ loncom/interface/portfolio.pm 2010/03/26 23:08:41 1.222
@@ -1,7 +1,7 @@
# The LearningOnline Network
# portfolio browser
#
-# $Id: portfolio.pm,v 1.196.2.1 2008/12/12 15:38:53 raeburn Exp $
+# $Id: portfolio.pm,v 1.222 2010/03/26 23:08:41 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -38,7 +38,7 @@ use Apache::lonnet;
use Apache::longroup;
use Apache::lonhtmlcommon;
use HTML::Entities;
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
sub group_args {
my $output;
@@ -80,78 +80,76 @@ sub make_anchor {
my $dirptr=16384;
sub display_common {
- my ($r,$url,$current_path,$is_empty,$dir_list,$can_upload)=@_;
+ my ($r,$url,$current_path,$is_empty,$dir_list,$can_upload,$group)=@_;
my $namespace = &get_namespace();
my $port_path = &get_port_path();
if ($can_upload) {
my $groupitem = &group_form_data();
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:',
- 'parse' => 'If HTML file, upload embedded images/multimedia/css/linked files'
- );
+ my %lt=&Apache::lonlocal::texthash(
+ 'upload' => 'Upload',
+ 'upload_label' => 'Upload file to current directory',
+ 'createdir' => 'Create Subdirectory',
+ 'createdir_label' => 'Create subdirectory in current directory',
+ 'parse' => 'Upload embedded images/multimedia/css/linked files if HTML file',
+ );
my $escuri = &HTML::Entities::encode($r->uri,'&<>"');
my $help_fileupload = &Apache::loncommon::help_open_topic('Portfolio AddFiles');
my $help_createdir = &Apache::loncommon::help_open_topic('Portfolio CreateDirectory');
-
- # FIXME: This line should be deleted once Portfolio uses breadcrumbs
- $r->print(&Apache::loncommon::help_open_topic('Portfolio About', &mt('Help on the portfolio')));
-
+ my $help_portfolio = &Apache::loncommon::help_open_topic('Portfolio About', &mt('Help on the portfolio'));
+ $r->print(&display_usage($group));
my $parse_check;
if (!&suppress_embed_prompt()) {
$parse_check = <<"END";
- $text{'parse'}
-
+
+
+ $lt{'parse'}
END
}
- $r->print(<<"TABLE");
-
-
-
- $text{'upload_label'}
-
-
-
-
-
-
-
- $text{'createdir_label'}
-
-
-
-
-
-
-TABLE
- }
+
+ $r->print(''.$help_portfolio);
+ # Upload File
+ $r->print('
'
+ .''
+ .'
'
+ );
+ # Create Subdirectory
+ $r->print('
'
+ .''
+ .'
'
+ );
+ $r->print('
');
+ } # end "if can_upload"
+
my @tree = split (/\//,$current_path);
my %anchor_fields = (
'selectfile' => $port_path,
@@ -160,6 +158,7 @@ TABLE
'fieldname' => $env{"form.fieldname"},
'continue' => $env{"form.continue"}
);
+ $r->print(' ');
$r->print(''.&make_anchor($url,\%anchor_fields,$port_path).'/');
if (@tree > 1){
my $newCurrentPath = '/';
@@ -185,17 +184,59 @@ TABLE
$r->print("");
}
+sub display_usage {
+ my ($group) = @_;
+ my $disk_quota = &get_quota($group);
+ my $getpropath = 1;
+ my $portfolio_root = &get_portfolio_root();
+ my ($uname,$udom) = &get_name_dom($group);
+ my $current_disk_usage =
+ &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath);
+ my $usage = $current_disk_usage/1000;
+ my $quota = $disk_quota/1000;
+ my $percent;
+ if ($disk_quota == 0) {
+ $percent = 100.0;
+ } else {
+ $percent = 100*($current_disk_usage/$disk_quota);
+ }
+ $usage = sprintf("%.2f",$usage);
+ $quota = sprintf("%.2f",$quota);
+ $percent = sprintf("%.0f",$percent);
+ my ($color,$cssclass);
+ if ($percent <= 60) {
+ $color = '#00A000';
+ } elsif ($percent > 60 && $percent < 90) {
+ $color = '#FFD300';
+ $cssclass = 'class="LC_warning"';
+ } elsif( $percent >= 90) {
+ $color = '#FF0000';
+ $cssclass = 'class="LC_error"';
+ }
+ my $prog_width = $percent;
+ if ($prog_width > 100) {
+ $prog_width = 100;
+ }
+ my $disk_meter = '
+ '.&mt('Currently using [_1] of the [_2] available.',$usage.' MB
('.$percent.'%) ',$quota.' MB')."\n".
+'
'."\n".
+'
';
+ return &Apache::loncommon::head_subbox($disk_meter);
+}
+
sub display_directory_line {
my ($r,$select_mode, $filename, $mtime, $size, $css_class,
$line, $access_controls, $curr_access, $now, $version_flag,
$href_location, $url, $current_path, $access_admin_text, $versions)=@_;
my $fullpath = &prepend_group($current_path.$filename);
- $r->print('');
+ $r->print(&Apache::loncommon::start_data_table_row());
$r->print($line); # contains first two cells of table
my $lock_info;
if ($version_flag) { # versioned can't be versioned, so TRUE when root file
- $r->print(' ');
+ $r->print(' ');
$r->print(''.$version_flag.' ');
} else { # this is a graded or handed back file
my ($user,$domain) = &get_name_dom($env{'form.group'});
@@ -227,15 +268,19 @@ sub display_directory_line {
$r->print(''.$size.' ');
$r->print(''.&Apache::lonlocal::locallocaltime($mtime).' ');
if ($select_mode ne 'true') {
- $r->print(''.
- &mt($curr_access).' ');
+ $r->print(' '); # Display status
+ $r->print(''
+ .&mt($curr_access).' '
+ );
my %anchor_fields = (
'access' => $filename,
'currentpath' => $current_path
);
$r->print(&make_anchor($url, \%anchor_fields, $access_admin_text).' ');
+ } else {
+ $r->print(' '); # Display status
}
- $r->print(' '.$/);
+ $r->print(&Apache::loncommon::end_data_table_row().$/);
}
sub display_directory {
@@ -267,7 +312,9 @@ sub display_directory {
$display_out = '';
@@ -277,21 +324,30 @@ sub display_directory {
}
if ($select_mode eq 'true') {
$r->print(''
@@ -668,7 +734,7 @@ sub rename {
} else {
&open_form($r,$url);
$r->print(''.&mt('Rename [_1] to [_2]?', &display_file()
- , ' ').'
');
+ , ' ').'');
&close_form($r,$url);
}
}
@@ -814,7 +880,7 @@ sub display_access {
sub explain_conditionals {
return
&mt('Conditional files are accessible to logged-in users with accounts in the LON-CAPA network, who satisfy the conditions you set.').' '."\n".
- &mt('The conditions can include affiliation with a particular course, or a user account in a specific domain.').' '."\n".
+ &mt('The conditions can include affiliation with a particular course or community, or a user account in a specific domain.').' '."\n".
&mt('Alternatively access can be granted to people with specific LON-CAPA usernames and domains.');
}
@@ -855,7 +921,7 @@ sub build_access_summary {
guest => 'Passphrase-protected',
domains => 'Conditional: domain-based',
users => 'Conditional: user-based',
- course => 'Conditional: course-based',
+ course => 'Conditional: course/community-based',
);
my @allscopes = ('public','guest','domains','users','course');
foreach my $scope (@allscopes) {
@@ -880,11 +946,16 @@ sub build_access_summary {
}
}
$r->print(' '.&mt($scope_desc{$scope}));
+ my $crstype;
if ($scope eq 'course') {
if ($chg ne 'delete') {
my $cid = $content->{'domain'}.'_'.$content->{'number'};
my %course_description = &Apache::lonnet::coursedescription($cid);
$r->print(' ('.$course_description{'description'}.')');
+ $crstype = 'Course';
+ if ($course_description{'type'} ne '') {
+ $crstype = $course_description{'type'};
+ }
}
}
$r->print(' '.&mt('Start: ').$showstart.
@@ -904,8 +975,6 @@ sub build_access_summary {
foreach my $item ('role','access','section','group') {
$r->print(' ');
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') {
@@ -913,7 +982,7 @@ sub build_access_summary {
} elsif ($role =~ /^cr/) {
$role_output .= (split('/',$role))[3].',';
} else {
- $role_output .= &Apache::lonnet::plaintext($role,$ucscope).',';
+ $role_output .= &Apache::lonnet::plaintext($role,$crstype).',';
}
}
$role_output =~ s/,$//;
@@ -1039,16 +1108,22 @@ sub update_access {
my $totalnew = 0;
my $status = 'new';
my ($firstitem,$lastitem);
- foreach my $newitem ('course','domains','users') {
+ my @types = ('course','domains','users');
+ foreach my $newitem (@types) {
$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);
- foreach my $newitem ('course','domains','users') {
+ my %showtypes = &Apache::lonlocal::texthash (
+ course => 'course/community',
+ domains => 'domain',
+ users => 'user',
+ );
+ foreach my $newitem (@types) {
if ($env{'form.new'.$newitem} > 0) {
- $r->print(' '.&mt('Add new [_1]-based access control for portfolio file: [_2] ',&mt($newitem),$env{'form.currentpath'}.$env{'form.selectfile'}).' ');
+ $r->print(' '.&mt('Add new [_1]-based[_2] access control for portfolio file: [_3]',''.$showtypes{$newitem},' ',''.$env{'form.currentpath'}.$env{'form.selectfile'}.' ').' ');
$firstitem = $totalnew;
$lastitem = $totalnew + $env{'form.new'.$newitem};
$totalnew = $lastitem;
@@ -1291,7 +1366,7 @@ sub standard_settings {
&build_access_summary($r,$count,$chg,%conditionals);
$r->print(&Apache::loncommon::end_data_table());
} else {
- $r->print(&make_anchor($url,\%anchor_fields,&mt('Add conditional access')).' '.&mt('based on domain, username, or course affiliation.'));
+ $r->print(&make_anchor($url,\%anchor_fields,&mt('Add conditional access')).' '.&mt('based on domain, username, or course/community affiliation.'));
}
}
@@ -1325,10 +1400,12 @@ sub acl_status {
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: ',&mt($title)));
+ my %typetext = &Apache::lonlocal::texthash(
+ domains => 'Domain',
+ users => 'User',
+ course => 'Course/Community'
+ );
+ $r->print(''.&mt('[_1]-based conditional access: ',$typetext{$type}));
if ($$acl_count{$type}) {
$r->print($$acl_count{$type}.' ');
if ($$acl_count{$type} > 1) {
@@ -1346,17 +1423,24 @@ sub access_element {
sub display_access_row {
my ($r,$status,$type,$items,$access_controls,$now,$then) = @_;
+ my $showtype;
+ if ($type eq 'course') {
+ $showtype = &mt('Courses/Communities');
+ } elsif ($type eq 'domains') {
+ $showtype = &mt('Domains');
+ } elsif ($type eq 'users') {
+ $showtype = &mt('Users');
+ }
if (@{$items} > 0) {
my @all_doms;
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_header_row());
- $r->print(''.&mt('Action?').' '.&mt($uctype).' '.
+ $r->print(' '.&mt('Action?').' '.$showtype.' '.
&mt('Dates available').' ');
if ($type eq 'course' && $status eq 'old') {
- $r->print(''.&mt('Allowed [_1] member affiliations',$type).
+
+ $r->print(' '.&mt('Allowed course/community affiliations').
' ');
$colspan ++;
} elsif ($type eq 'domains') {
@@ -1383,8 +1467,8 @@ sub display_access_row {
}
$r->print(&Apache::loncommon::end_data_table());
} else {
- $r->print(&mt('No [_1]-based conditions defined.',&mt($type)).' '
- .&additional_item($type));
+ $r->print(&mt('No [_1]-based conditions defined.',$showtype).' '.
+ &additional_item($type));
}
return;
}
@@ -1445,17 +1529,20 @@ sub course_row {
}
my $js = &Apache::loncommon::coursebrowser_javascript($defdom)
.&course_js();
- my $uctype = $type;
- $uctype =~ s/^(\w)/uc($1)/e;
+ my $showtype = &mt('Course/Community');
+ my $crstype = 'Course';
my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
$type);
$r->print(''.$js.&actionbox($status,$num,$scope).' ');
if ($status eq 'old') {
my $cid = $content->{'domain'}.'_'.$content->{'number'};
my %course_description = &Apache::lonnet::coursedescription($cid);
+ if ($course_description{'type'} ne '') {
+ $crstype = $course_description{'type'};
+ }
$r->print(' '.$course_description{'description'}.' ');
} elsif ($status eq 'new') {
- $r->print(''.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,$num.'_1',undef,$uctype).' ');
+ $r->print(''.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,$num.'_1',undef,$showtype).' ');
}
$r->print(''.&dateboxes($num,$start,$end));
my $newrole_id = 1;
@@ -1473,19 +1560,19 @@ sub course_row {
$max_id = $role_id;
}
$max_id ++;
- my $role_selects = &role_selectors($num,$role_id,$type,$content,'display');
+ my $role_selects = &role_selectors($num,$role_id,$crstype,$content,'display');
$r->print(' '.&mt('Delete').' '.$role_selects.' ');
}
$r->print('');
}
$r->print(' '.&mt('Add a roles-based condition').
- ' {'domain'}','$content->{'number'}',
- '$uctype'".')" value="" />');
+ '$showtype'".')" value="" />');
$newrole_id = $max_id;
} else {
- $r->print(' ');
+ $r->print(' ');
}
$r->print(&add_course_role($num,$newrole_id));
$r->print(' ');
@@ -1506,14 +1593,14 @@ sub domains_row {
my ($r,$status,$item,$all_doms,$access_controls,$now,$then) = @_;
my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
'domains');
- my $dom_select = ''.
+ my $dom_select = ''.
' '.&mt('Please select').' ';
if ($status eq 'old') {
my $content = $$access_controls{$item};
foreach my $dom (@{$all_doms}) {
if ((@{$content->{'dom'}} > 0)
&& (grep(/^\Q$dom\E$/,@{$content->{'dom'}}))) {
- $dom_select .= ''.
+ $dom_select .= ' '.
$dom.' ';
} else {
$dom_select .= ''.$dom.' ';
@@ -1543,7 +1630,15 @@ sub users_row {
sub additional_item {
my ($type) = @_;
- my $output = &mt('Add new [_1] condition(s)?',&mt($type)).' '.&mt('Number to add: ').' ';
+ my $showtype;
+ if ($type eq 'course') {
+ $showtype = &mt('course/community');
+ } elsif ($type eq 'domains') {
+ $showtype = &mt('domains');
+ } elsif ($type eq 'users') {
+ $showtype = &mt('users');
+ }
+ my $output = &mt('Add new [_1] condition(s)?',$showtype).' '.&mt('Number to add: ').' ';
return $output;
}
@@ -1614,10 +1709,12 @@ sub role_selectors {
$cdom = $env{'form.cdom'};
$cnum = $env{'form.cnum'};
}
- my $uctype = $type;
- $uctype =~ s/^(\w)/uc($1)/e;
+ my $crstype = 'Course';
+ if ($cnum =~ /^$match_community$/) {
+ $crstype = 'Community'
+ }
my ($sections,$groups,$allroles,$rolehash,$accesshash) =
- &Apache::loncommon::get_secgrprole_info($cdom,$cnum,1,$uctype);
+ &Apache::loncommon::get_secgrprole_info($cdom,$cnum,1,$crstype);
if (!@{$sections}) {
@{$sections} = ('none');
} else {
@@ -1650,12 +1747,12 @@ sub role_selectors {
'group' => $groups,
);
foreach my $item ('role','access','section','group') {
- $output .= ''."\n";
+ $output .= ''."\n";
foreach my $entry (@{$allitems{$item}}) {
if ($caller eq 'display') {
if ((@{$$content{'roles'}{$role_id}{$item}} > 0) &&
(grep(/^\Q$entry\E$/,@{$$content{'roles'}{$role_id}{$item}}))) {
- $output .= ' '.
+ $output .= ' '.
$lookup{$item}{$entry}.' ';
next;
}
@@ -1712,8 +1809,23 @@ function getIndexByName(item) {
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('[_1] status',$type).' '.&mt('Sections').' '.&mt('Groups').' '.$role_selects.'
');
+ $r->print(
+ ''
+ .&mt('Select roles, '.lc($type).' status, section(s) and group(s) for users'
+ .' who will be able to access the portfolio file.')
+ .'
'
+ );
+ $r->print(
+ ''
+ .''
+ .''.&mt('Roles').' '
+ .''.&mt("$type status").' '
+ .''.&mt('Sections').' '
+ .''.&mt('Groups').' '
+ .' '.$role_selects.' '
+ .'
'
+ .' '
+ );
return;
}
@@ -1753,15 +1865,28 @@ ENDSMP
ENDSMP
$r->print($javascript);
- $r->print("".&mt('Select portfolio files')." ".
- &mt('Check as many as you wish in response to the problem.')." ");
+ $r->print("".&mt('Select portfolio files')." ");
my @otherfiles=&Apache::lonnet::files_not_in_path($env{'user.name'}, $env{'form.currentpath'});
if (@otherfiles) {
- $r->print("".&mt('Files selected from other directories:')." ");
+ $r->print(&Apache::loncommon::start_data_table()
+ .&Apache::loncommon::start_data_table_header_row()
+ .''.&mt('Files selected from other directories:')." "
+ .&Apache::loncommon::end_data_table_header_row()
+ );
foreach my $file (@otherfiles) {
- $r->print($file." ");
+ $r->print(&Apache::loncommon::start_data_table_row()
+ .''.$file." "
+ .&Apache::loncommon::end_data_table_row()
+ );
}
+ $r->print(&Apache::loncommon::end_data_table()
+ .' '
+ );
}
+ $r->print(''
+ .&mt('Check as many files as you wish in response to the problem:')
+ .'
'
+ );
}
@@ -2058,7 +2183,7 @@ sub missing_priv {
$r->print(&mt('You do not have sufficient privileges to [_1] ',
$longtext->{$priv}));
if (defined($env{'form.group'})) {
- $r->print(&mt("in the group's file repository."));
+ $r->print(&mt("in the group's group portfolio."));
$rtnlink .= &group_args()
} else {
$r->print(&mt('in this portfolio.'));
@@ -2166,7 +2291,7 @@ sub handler {
$r->print(&mt('Not a valid group for this course'));
$earlyout = 1;
}
- $title = &mt('Group files for [_1]', $group);
+ $title = &mt('Group portfolio for [_1]', $group);
} else {
$r->print(&mt('Invalid group'));
$earlyout = 1;
@@ -2194,7 +2319,7 @@ sub handler {
} else {
($uname,$udom) = &get_name_dom();
$portfolio_root = &get_portfolio_root();
- $title = &mt('Portfolio Manager');
+ $title = &mt('My Space');
$can_modify = 1;
$can_delete = 1;
$can_upload = 1;
@@ -2206,25 +2331,30 @@ sub handler {
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
# Give the LON-CAPA page header
+ my $brcrum = [{href=>"/adm/portfolio",text=>"Portfolio Manager"}];
+
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 {
+ } elsif ($caller eq 'coursegrp_portfolio') {
$r->print(&Apache::loncommon::start_page($title));
+ } else {
+ $r->print(&Apache::loncommon::start_page($title,undef,
+ {'bread_crumbs' => $brcrum}));
+ if (!&Apache::lonnet::usertools_access($uname,$udom,'portfolio')) {
+ $r->print(''.&mt('No user portfolio available') .' '.
+ &mt('This is a result of one of the following:').''.
+ ''.&mt('The administrator of this domain has disabled portfolio functionality for this specific user.').' '.
+ ''.&mt('The domain has been configured to disable, by default, portfolio functionality for all users in the domain.').' '.
+ ' ');
+ $r->print(&Apache::loncommon::end_page());
+ return OK;
+ }
}
$r->rflush();
- if (!&Apache::lonnet::usertools_access($uname,$udom,'portfolio')) {
- $r->print(''.&mt('No user portfolio available') .' '.
- &mt('This is a result of one of the following:').''.
- ''.&mt('The administrator of this domain has disabled portfolio functionality for this specific user.').' '.
- ''.&mt('The domain has been configured to disable, by default, portfolio functionality for all users in the domain.').' '.
- ' ');
- $r->print(&Apache::loncommon::end_page());
- return OK;
- }
my ($blocked,$blocktext) =
&Apache::loncommon::blocking_status('port',$uname,$udom);
if ($blocked) {
@@ -2360,7 +2490,7 @@ 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,
- $can_upload);
+ $can_upload,$group);
&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());