--- loncom/interface/lonaboutme.pm 2006/08/02 19:29:35 1.44
+++ loncom/interface/lonaboutme.pm 2008/12/02 23:35:21 1.76
@@ -1,7 +1,7 @@
# The LearningOnline Network
# "About Me" Personal Information
#
-# $Id: lonaboutme.pm,v 1.44 2006/08/02 19:29:35 albertel Exp $
+# $Id: lonaboutme.pm,v 1.76 2008/12/02 23:35:21 harmsja Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -26,6 +26,53 @@
# http://www.lon-capa.org/
#
+=pod
+
+=head1 NAME
+
+pache::lonaboutme
+
+=head1 SYNOPSIS
+
+(empty)
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 OVERVIEW
+
+(empty)
+
+
+=head1 SUBROUTINES
+
+=over
+
+=item handler()
+
+=item in_course()
+
+=item aboutme_info()
+
+=item print_portfiles_link()
+
+=item build_query_string()
+
+=item display_portfolio_header()
+
+=item display_portfolio_files()
+
+=item portfolio_files()
+
+=item build_hierarchy()
+
+=item parse_directory()
+
+=back
+
+=cut
+
+
package Apache::lonaboutme;
use strict;
@@ -37,6 +84,8 @@ use Apache::lonfeedback;
use Apache::lonrss();
use Apache::lonlocal;
use Apache::lonmsgdisplay();
+use Apache::lontemplate;
+use HTML::Entities();
sub handler {
my $r = shift;
@@ -48,13 +97,17 @@ sub handler {
if ($target eq 'tex') {
$r->print(&Apache::lonprintout::print_latex_header($env{'form.latex_type'}));
}
- my (undef,undef,$cdom,$cnum)=split(/\//,$r->uri);
+ my (undef,undef,$cdom,$cnum,undef,$action)=split(/\//,$r->uri);
+ my $is_course;
# Is this even a user?
if (&Apache::lonnet::homeserver($cnum,$cdom) eq 'no_host') {
&Apache::loncommon::simple_error_page($r,'No info',
'No user information available');
return OK;
+ } else {
+ $is_course = &Apache::lonnet::is_course($cdom,$cnum);
}
+
# --------------------------------------------------------- The syllabus fields
my %syllabusfields=&Apache::lonlocal::texthash(
'aaa_contactinfo' => 'Contact Information',
@@ -62,22 +115,41 @@ sub handler {
'ccc_webreferences' => 'Web References');
# ------------------------------------------------------------ Get Query String
- &Apache::loncommon::get_unprocessed_cgi
- ($ENV{'QUERY_STRING'},['forceedit','forcestudent','register','action']);
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['forceedit','forcestudent',
+ 'register','popup']);
# ----------------------------------------------- Available Portfolio file display
- if (($target ne 'tex') && ($env{'form.action'} eq 'portfolio')) {
- my %lt = &Apache::lonlocal::texthash (
- withoutpass => 'passphrase not required',
- withpass => 'passphrase protected',
- both => 'all access types ',
- );
- &display_portfolio_header($r);
- &display_portfolio_files($r,\%lt);
+ if (($target ne 'tex') && ($action eq 'portfolio')) {
+ &display_portfolio_header($r,$is_course);
+ my ($blocked,$blocktext) =
+ &Apache::loncommon::blocking_status('port',$cnum,$cdom);
+ if (!$blocked) {
+ &display_portfolio_files($r,$is_course);
+ } else {
+ $r->print($blocktext);
+ }
$r->print(&Apache::loncommon::end_page());
return OK;
}
+ if ($is_course) {
+ if ($target ne 'tex') {
+ my $start_page =
+ &Apache::loncommon::start_page(
+ "Course Information",
+ undef,
+ {'function' => $env{'forcestudent'},
+ 'domain' => $cdom,
+ 'force_register' => $env{'forceregister'},});
+ $r->print($start_page);
+ $r->print('
'.&mt('Group files').' ');
+ &print_portfiles_link($r,$is_course);
+ $r->print(&Apache::loncommon::end_page());
+ }
+ return OK;
+ }
+
# --------------------------------------------------------------- Force Student
my $forcestudent='';
if ($env{'form.forcestudent'}) { $forcestudent='student'; };
@@ -90,14 +162,17 @@ sub handler {
# --------------------------------------- There is such a user, get environment
my %courseenv=&Apache::lonnet::dump('environment',$cdom,$cnum);
if ($target ne 'tex') {
+ my $rss_link = &Apache::lonrss::rss_link($cnum,$cdom);
+ my $args = {'function' => $forcestudent,
+ 'domain' => $cdom,
+ 'force_register' => $forceregister};
+ if ($env{'form.popup'}) {
+ $args->{'no_nav_bar'} = 1;
+ }
my $start_page =
- &Apache::loncommon::start_page("Personal Information",undef,
- {'function' => $forcestudent,
- 'domain' => $cdom,
- 'force_register' =>
- $forceregister,});
+ &Apache::loncommon::start_page("Personal Information",$rss_link,$args);
$r->print($start_page);
- $r->print(''.&Apache::loncommon::plainname($cnum,$cdom).' ');
+ $r->print(''.&Apache::loncommon::plainname($cnum,$cdom).' ');
} else {
$r->print('\noindent{\large\textbf{'.&Apache::loncommon::plainname($cnum,$cdom).'}}\\\\\\\\');
}
@@ -107,10 +182,9 @@ sub handler {
'"');
}
if ($target ne 'tex') {
- $r->print(''.$Apache::lonnet::domaindescription{$cdom}.' '.
- ''.&Apache::loncommon::messagewrapper('Send me a message',$cnum,$cdom).'
'.&Apache::lonrss::advertisefeeds($cnum,$cdom));
+ $r->print(''.&Apache::lonnet::domain($cdom,'description').' ');#OLD SendMessage POS
} else {
- $r->print('\textbf{'.$Apache::lonnet::domaindescription{$cdom}.'}\\\\');
+ $r->print('\textbf{'.&Apache::lonnet::domain($cdom,'description').'}\\\\');
}
my %syllabus=&Apache::lonnet::dump('aboutme',$cdom,$cnum);
my $allowed=0;
@@ -122,16 +196,16 @@ sub handler {
if ($forcestudent or $target eq 'tex') { $allowed=0; }
if ($allowed) {
- my $query_string = &build_query_string({'forcestudent' => '1',});
+ my $query_string = &build_query_string({'forcestudent' => '1','popup' => $env{'form.popup'}});
$r->print(''.&mt('Privacy Note').': '.
&mt('The information you submit can be viewed by anybody who is logged into LON-CAPA. Do not provide information that you are not ready to share publicly.').
'
'.
- &Apache::loncommon::help_open_topic('Uploaded_Templates_TextBoxes','Help with filling in text boxes').'Show Public View '.
+ &Apache::loncommon::help_open_topic('Uploaded_Templates_TextBoxes',&mt('Help with filling in text boxes')).'
'.&mt('Show Public View').' '.
&Apache::loncommon::help_open_topic('Uploaded_Templates_PublicView').'
');
} elsif ($privleged && $target ne 'tex') {
- my $query_string = &build_query_string({'forceedit' => '1',});
- $r->print(''.
- &mt('Edit').'
');
+ my $query_string = &build_query_string({'forceedit' => '1','popup' => $env{'form.popup'}});
+ $r->print(''.
+ &mt('Edit').'
');
}
if (($env{'form.uploaddoc.filename'}) &&
($env{'form.storeupl'}) && ($allowed)) {
@@ -153,142 +227,204 @@ sub handler {
}
}
if (($allowed) && ($env{'form.storesyl'})) {
- foreach (keys %syllabusfields) {
- my $field=$env{'form.'.$_};
+ foreach my $syl_field (keys(%syllabusfields)) {
+ my $field=$env{'form.'.$syl_field};
$field=~s/\s+$//s;
$field=&Apache::lonfeedback::clear_out_html($field,
$env{'user.adv'});
- $syllabus{$_}=$field;
+ $syllabus{$syl_field}=$field;
}
$syllabus{'uploaded.lastmodified'}=time;
&Apache::lonnet::put('aboutme',\%syllabus,$cdom,$cnum);
}
+my $lastmod;
+my $image;
# ---------------------------------------------------------------- Get syllabus
if (($syllabus{'uploaded.lastmodified'}) || ($allowed)) {
- my $lastmod=$syllabus{'uploaded.lastmodified'};
+ $lastmod=$syllabus{'uploaded.lastmodified'};
$lastmod=($lastmod?&Apache::lonlocal::locallocaltime($lastmod):&mt('never'));
- $r->print(&mt('Last updated').': '.$lastmod);
+ # $r->print(&mt('Last updated').': '.$lastmod); #Old Last Modifi Pos
if ($syllabus{'uploaded.photourl'}) {
&Apache::lonnet::allowuploaded('/adm/aboutme',
$syllabus{'uploaded.photourl'});
- my $image=
- qq{ };
+ $image=
+ qq{ };
+
if ($target eq 'tex') {
$image=&Apache::lonxml::xmlparse($r,'tex',$image);
}
- $r->print($image);
+ # $r->print($image); #Print old Image
}
if ($allowed) {
$r->print(
''.
'');
}
- if ($target ne 'tex') {$r->print('');} else {$r->print('\\\\');}
+ if ($target ne 'tex') {$r->print(' ');} else {$r->print('\\\\');}
} else {
$r->print(''.&mt('No personal information provided').'.
');
}
if ($target ne 'tex') {
- &print_portfiles_link($r);
+ # &print_portfiles_link($r,$is_course); #old Print files
+
}
- if ($env{'request.course.id'}) {
- if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})) {
- if ($target ne 'tex') {
- $r->print(' ');
- $r->print(''.
- &mt('User Notes, Records of Face-To-Face Discussions, and Critical Messages in Course').' '.
- &mt('Shared by course faculty and staff').
- &Apache::loncommon::help_open_topic("Course_Face_To_Face_Records,Course_Critical_Message").
-' ');
- &Apache::lonmsgdisplay::disfacetoface($r,$cnum,$cdom);
- $r->print(' ');
- if (&Apache::lonnet::allowed('vsa',
- $env{'request.course.id'}) ||
- &Apache::lonnet::allowed('vsa',
- $env{'request.course.id'}.'/'.
- $env{'request.course.sec'})) {
- $r->print(&Apache::loncommon::track_student_link
- ('View recent activity by this student',
- $cnum,$cdom).(' 'x2));
- }
- $r->print(&Apache::loncommon::noteswrapper('Add Records',$cnum,$cdom));
- } else {
- $r->print('\\\\\textbf{'.&mt('User Notes, Records of Face-To-Face Discussions, and Critical Messages in Course').'}\\\\'.&mt('Shared by course faculty and staff').'\\\\\\\\');
- &Apache::lonmsgdisplay::disfacetoface($r,$cnum,$cdom);
+ if ($env{'request.course.id'}
+ && &Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ && &in_course($cdom,$cnum)) {
+ if ($target ne 'tex') {
+ $r->print(' ');
+ $r->print(''.
+ &mt('User Notes, Records of Face-To-Face Discussions, and Critical Messages in Course').' '.
+ &mt('Shared by course faculty and staff').
+ &Apache::loncommon::help_open_topic("Course_Face_To_Face_Records,Course_Critical_Message").
+ ' ');
+ &Apache::lonmsgdisplay::disfacetoface($r,$cnum,$cdom);
+ $r->print(' ');
+ if (&Apache::lonnet::allowed('vsa',
+ $env{'request.course.id'}) ||
+ &Apache::lonnet::allowed('vsa',
+ $env{'request.course.id'}.'/'.
+ $env{'request.course.sec'})) {
+ $r->print(&Apache::loncommon::track_student_link
+ ('View recent activity by this student',
+ $cnum,$cdom).(' 'x2));
}
- }
+ $r->print(&Apache::loncommon::noteswrapper('Add Records',$cnum,$cdom));
+ } else {
+ $r->print('\\\\\textbf{'.&mt('User Notes, Records of Face-To-Face Discussions, and Critical Messages in Course').'}\\\\'.&mt('Shared by course faculty and staff').'\\\\\\\\');
+ &Apache::lonmsgdisplay::disfacetoface($r,$cnum,$cdom);
+ }
}
if ($target ne 'tex') {
+ if ($env{'form.popup'}) {
+ $r->print(''.&mt('Close window').' ');
+ }
+ $r->print(' '.&mt('Last updated').': '.$lastmod);
+
$r->print(&Apache::loncommon::end_page());
} else {
$r->print('\end{document}');
}
+
+
+
return OK;
}
+sub in_course {
+ my ($udom,$uname,$cdom,$cnum,$type) = @_;
+ $type ||= 'any';
+ if (!defined($cdom) || !defined($cnum)) {
+ my $cid = $env{'request.course.id'};
+ $cdom = $env{'course.'.$cid.'.domain'};
+ $cnum = $env{'course.'.$cid.'.num'};
+ }
+ my %roles = &Apache::lonnet::dump('roles',$udom,$uname);
+ my @course_roles = grep(m{^/\Q$cdom\E/\Q$cnum\E[/_]}, keys(%roles));
+ return 0 if (!@course_roles);
+ return 1 if ($type eq 'any');
+ my $now = time();
+ foreach my $role (@course_roles) {
+ my (undef,$role_end,$role_start)=split(/\_/,$roles{$role});
+ my $status = 'active';
+ if ($role_start > 0 && $now < $role_start) {
+ $status = 'future';
+ }
+ if ($role_end > 0 && $now > $role_end) {
+ $status = 'previous';
+ }
+ return 1 if ($status eq $type);
+ }
+ return 0;
+}
+
sub aboutme_info {
- my ($r) = @_;
+ my ($r,$is_course) = @_;
my (undef,undef,$cdom,$cnum)=split(/\//,$r->uri);
- my $name = &Apache::loncommon::plainname($cnum,$cdom);
+ my $name;
+ if (!$is_course) {
+ $name = &Apache::loncommon::plainname($cnum,$cdom);
+ }
return ($cdom,$cnum,$name);
}
sub print_portfiles_link {
- my ($r) = @_;
- my ($cdom,$cnum,$name) = &aboutme_info($r);
- my $filecounts = &portfolio_files($r,'showlink');
- my $query_string = &build_query_string({'action' => 'portfolio',});
+ my ($r,$is_course) = @_;
+ my ($cdom,$cnum,$name) = &aboutme_info($r,$is_course);
+ my $filecounts = &portfolio_files($r,'showlink',undef,$is_course,
+ $cdom,$cnum,$name);
+ my $query_string = &build_query_string();
my $output;
+ my %lt = &Apache::lonlocal::texthash(
+ vpfi => 'Viewable portfolio files',
+ vgpf => 'Viewable group portfolio files',
+ difl => 'Display file listing',
+ );
if ($filecounts->{'both'} > 0) {
- $output = &mt('
Viewable portfolio files ');
- $output .= ''.&mt('Display file listing').
+ $output = '';
+ $output .= ($is_course?$lt{'vgpf'}:$lt{'vpfi'}).' ';
+
+ #$output = '
'.($is_course?$lt{'vgpf'}:$lt{'vpfi'}).' ';
+ $output .= '
'.$lt{'difl'}.
' ';
- $output .= &mt('A total of [_1] portfolio files owned by [_2] are available for viewing.',$filecounts->{'both'},$name).'
';
+ if ($filecounts->{'both'} == 1) {
+ if ($is_course) {
+ $output .= &mt('One group portfolio file is available.').'';
+ } else {
+ $output .= &mt('One portfolio file owned by [_1] is available.',$name).'';
+ }
+ } else {
+ if ($is_course) {
+ $output .= &mt('A total of [_1] group portfolio files are available.',$filecounts->{'both'}).'';
+ } else {
+ $output .= &mt('A total of [_1] portfolio files owned by [_2] are available.',$filecounts->{'both'},$name).'';
+ }
+ }
if ($filecounts->{'withoutpass'}) {
- $output .= ''.&mt('[_1] files are either publicly accessible, or directly available to you because of your current role, domain and/or username.',$filecounts->{'withoutpass'}).' ';
+ $output .= ''.&mt('[quant,_1,file is,files are] publicly accessible.',$filecounts->{'withoutpass'}).' ';
}
if ($filecounts->{'withpass'}) {
- $output .= ''.&mt('[_1] files will be available after you have entered a passphrase set for each specific file.',$filecounts->{'withpass'}).' ';
+ $output .= ''.&mt('[quant,_1,file requires,files require] a passphrase for access.',$filecounts->{'withpass'}).' ';
}
$output .= ' ';
+ $output .='';
}
$r->print($output);
return;
@@ -298,9 +434,9 @@ sub build_query_string {
my ($new_items) = @_;
my $query_string;
my @formelements = ('register');
- my $nonew = 1;
+ my $new = 0;
if (ref($new_items) eq 'HASH') {
- $nonew = 0;
+ $new = 1;
if (!defined($new_items->{'forceedit'}) &&
!defined($new_items->{'forcestudent'})) {
push(@formelements,('forceedit','forcestudent'));
@@ -310,12 +446,12 @@ sub build_query_string {
}
foreach my $element (@formelements) {
if (exists($env{'form.'.$element})) {
- if (($nonew) || (!defined($new_items->{$element}))) {
+ if ((!$new) || (!defined($new_items->{$element}))) {
$query_string .= '&'.$element.'='.$env{'form.'.$element};
}
}
}
- if (!$nonew) {
+ if ($new) {
foreach my $key (keys(%{$new_items})) {
$query_string .= '&'.$key.'='.$new_items->{$key};
}
@@ -325,64 +461,87 @@ sub build_query_string {
}
sub display_portfolio_header {
- my ($r) = @_;
- my ($cdom,$cnum,$name) = &aboutme_info($r);
+ my ($r,$is_course) = @_;
+ my ($cdom,$cnum,$name) = &aboutme_info($r,$is_course);
my $query_string = &build_query_string();
&Apache::lonhtmlcommon::clear_breadcrumbs();
my $forcestudent='';
if ($env{'form.forcestudent'}) { $forcestudent='student'; };
- my $output =
- &Apache::loncommon::start_page('Viewable portfolio files',undef,
- {'function' => $forcestudent,
+
+ my $output;
+ if ($is_course) {
+ $output =
+ &Apache::loncommon::start_page('Viewable group portfolio files',undef,
+ {'function' => $forcestudent,
+ 'domain' => $cdom,});
+ $output .= ''.&mt('Group Portfolio files').' ';
+ } else {
+ $output =
+ &Apache::loncommon::start_page('Viewable portfolio files',undef,
+ {'function' => $forcestudent,
'domain' => $cdom,});
- &Apache::lonhtmlcommon::add_breadcrumb
- ({href=>"/adm/$cdom/$cnum/aboutme".$query_string,
- text=>"Personal information - $name",
- title=>"Go to personal information page for $name"},
- {href=>"/adm/$cdom/$cnum/aboutme?action=portfolio",
- text=>"Viewable files - $name",
- title=>"Viewable portfolio files for $name"}
-);
- $output .= &Apache::lonhtmlcommon::breadcrumbs(&mt('Viewable portfolio files.'));
- $output .= ''.&mt('Portfolio files for [_1]',$name).' ';
+ if (!($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public')) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/$cdom/$cnum/aboutme".$query_string,
+ text=>"Personal information - $name",
+ title=>"Go to personal information page for $name"}, {href=>"/adm/$cdom/$cnum/aboutme/portfolio",
+ text=>"Viewable files - $name",
+ title=>"Viewable portfolio files for $name"}
+ );
+ $output .= &Apache::lonhtmlcommon::breadcrumbs(&mt('Viewable portfolio files.'));
+ }
+ $output .= ''.&mt('Portfolio files for [_1]',$name).' ';
+ }
$r->print($output);
return;
}
sub display_portfolio_files {
- my ($r,$lt) = @_;
- my ($cdom,$cnum,$name) = aboutme_info($r);
+ my ($r,$is_course) = @_;
+ my ($cdom,$cnum,$name) = &aboutme_info($r,$is_course);
+ my %lt = ( withoutpass => 'passphrase not required',
+ withpass => 'passphrase protected',
+ both => 'all access types ',);
+ %lt = &Apache::lonlocal::texthash(%lt);
+
my $portaccess = 'withoutpass';
if (exists($env{'form.portaccess'})) {
$portaccess = $env{'form.portaccess'};
}
- my $output = ' '.
- &mt('File access type: ').'';
+
+ my $output = ''.
+ &mt('File access type: ').'';
foreach my $type ('withoutpass','withpass','both') {
$output .= '{$type}.' ';
+ $output .= '>'.$lt{$type}.'';
}
$output .= ' '."\n".
' '.
- ' ';
+ &mt('Update display').'" />';
$output .= ' ';
$r->print($output);
- my $filecounts = &portfolio_files($r,'listfiles',$lt);
- my $query_string = &build_query_string();
- $r->print(''.
- &mt('Information about [_1]',$name).' ');
+ my $filecounts = &portfolio_files($r,'listfiles',\%lt,$is_course,
+ $cdom,$cnum,$name);
+ if (!($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public')) {
+ my $query_string = &build_query_string();
+ $r->print('');
+ if ($is_course) {
+ $r->print(&mt('Course Information page'));
+ } else {
+ $r->print(&mt('Information about [_1]',$name));
+ }
+ $r->print(' ');
+ }
return;
}
sub portfolio_files {
- my ($r,$mode,$lt) = @_;
- my ($cdom,$cnum,$name) = &aboutme_info($r);
+ my ($r,$mode,$lt,$is_course,$cdom,$cnum,$name) = @_;
my $filecounts = {
withpass => 0,
withoutpass => 0,
@@ -392,7 +551,6 @@ sub portfolio_files {
&Apache::lonnet::get_portfile_permissions($cdom,$cnum);
my %access_controls =
&Apache::lonnet::get_access_controls($current_permissions);
- my %allfileshash;
my $portaccess;
if ($mode eq 'showlink') {
$portaccess = 'both';
@@ -403,10 +561,63 @@ sub portfolio_files {
}
}
- foreach my $filename (keys(%access_controls)) {
- my $access_status =
- &Apache::lonnet::get_portfolio_access($cdom,$cnum,$filename,undef,
- $access_controls{$filename});
+ my $diroutput;
+ if ($is_course) {
+ my %files_by_group;
+ foreach my $filename (sort(keys(%access_controls))) {
+ my ($group,$path) = split('/',$filename,2);
+ $files_by_group{$group}{$path} = $access_controls{$filename};
+ }
+ foreach my $group (sort(keys(%files_by_group))) {
+ my %fileshash;
+ my $grpout .= &build_hierarchy($r,$cdom,$cnum,$portaccess,
+ $is_course,$filecounts,$mode,
+ $files_by_group{$group},
+ \%fileshash,$group);
+ if ($grpout) {
+ $diroutput .= ''.$group.' '.$grpout.' ';
+ }
+ }
+ } else {
+ my %allfileshash;
+ $diroutput = &build_hierarchy($r,$cdom,$cnum,$portaccess,$is_course,
+ $filecounts,$mode,\%access_controls,
+ \%allfileshash);
+ }
+ if ($mode eq 'listfiles') {
+ if ($filecounts->{'both'}) {
+ $r->print($diroutput);
+ } else {
+ my $access_text;
+ if (ref($lt) eq 'HASH') {
+ $access_text = $lt->{$portaccess};
+ }
+ $r->print(&mt('There are no available files of the specified access type: [_1]',$access_text));
+ }
+ }
+ return $filecounts;
+}
+
+{
+ my $count=0;
+ sub portfolio_table_start {
+ $count=0;
+ return '';
+ }
+ sub portfolio_row_start {
+ $count++;
+ my $class = ($count%2)?'LC_odd_row'
+ :'LC_even_row';
+ return '';
+ }
+}
+
+sub build_hierarchy {
+ my ($r,$cdom,$cnum,$portaccess,$is_course,$filecounts,$mode,$access_info,
+ $allfileshash,$group) = @_;
+ foreach my $filename (sort(keys(%{$access_info}))) {
+ my $access_status =
+ &Apache::lonnet::get_portfolio_access($cdom,$cnum,$filename,$group, $$access_info{$filename});
if ($portaccess eq 'both') {
if (($access_status ne 'ok') &&
($access_status !~ /^[^:]+:guest_/)) {
@@ -424,7 +635,7 @@ sub portfolio_files {
if ($mode eq 'listfiles') {
$filename =~ s/^\///;
my @pathitems = split('/',$filename);
- my $lasthash = \%allfileshash;
+ my $lasthash = $allfileshash;
while (@pathitems > 1) {
my $newlevel = shift(@pathitems);
if (!exists($lasthash->{$newlevel})) {
@@ -442,60 +653,79 @@ sub portfolio_files {
}
$filecounts->{'both'} = $filecounts->{'withoutpass'} +
$filecounts->{'withpass'};
+ my $output;
if ($mode eq 'listfiles') {
- my $output;
- if (keys(%allfileshash) > 0) {
- my $depth = 0;
- my $count = 0;
- $output = '';
- ($count,$output) = &parse_directory($r,$output,$depth,
- \%allfileshash,$count);
+ if ($filecounts->{'both'} > 0) {
+ $output = &portfolio_table_start();
+ $output .= &parse_directory($r,0,$allfileshash,'',$is_course,
+ $group);
$output .= '
';
- } else {
- my $access_text;
- if (ref($lt) eq 'HASH') {
- $access_text = $lt->{$portaccess};
- }
- $output .= &mt('There are no available files of the specified access type: [_1]',$access_text);
}
- $r->print($output);
}
- return $filecounts;
+ return $output;
}
sub parse_directory {
- my ($r,$output,$depth,$currhash,$count) = @_;
- my ($cdom,$cnum,$name) = &aboutme_info($r);
- $depth ++;
- my @backgroundColors = ("#FFFFFF", "#F6F6F6");
- my $indent = ' ';
- $output .= $indent;
+ my ($r,$depth,$currhash,$path,$is_course,$group) = @_;
+ my ($cdom,$cnum,$name) = &aboutme_info($r,$is_course);
+ $depth++;
+ my $output;
+
+ my $portfolio_root = &Apache::portfolio::get_portfolio_root($cdom,$cnum,
+ $group);
+ my $getpropath = 1;
+ my %dirlist = map {
+ ((split('&',$_,2))[0],1)
+ } &Apache::lonnet::dirlist($portfolio_root.$path,$cdom,$cnum,$getpropath);
foreach my $item (sort(keys(%{$currhash}))) {
- $count ++;
- my $backgroundcolor = $backgroundColors[$count%2];
- $output .= ' ';
- $output .= '';
- for (my $i=0; $i<$depth; $i++) {
- $output .= $indent;
- }
+ $output .= &portfolio_row_start();
+ $output .= ' ';
if (ref($currhash->{$item}) eq 'HASH') {
- my $title = $item;
- $title=~s/\"/\"/g;
- $output .= ' '.$title;
- ($count,$output) = &parse_directory($r,$output,$depth,
- $currhash->{$item},$count);
+ my $title=&HTML::Entities::encode($item,'<>&"');
+ $output .= ' '.$title;
+ $output .= ' ';
+ $output .= &parse_directory($r,$depth,$currhash->{$item},
+ $path.'/'.$item,$is_course,$group);
} else {
- my $showname;
- if ($currhash->{$item} =~ m|/([^/]+)$|) {
- $showname = $1;
- } else {
- $showname = $currhash->{$item};
+ my $file_name;
+ if ($currhash->{$item} =~ m|/([^/]+)$|) {
+ $file_name = $1;
+ } else {
+ $file_name = $currhash->{$item};
+ }
+ my $have_meta = exists($dirlist{$file_name.'.meta'});
+ my $url;
+ if ($is_course) {
+ $url = '/uploaded/'.$cdom.'/'.$cnum.'/groups/'.$group.
+ '/portfolio/'.$currhash->{$item};
+ } else {
+ $url = '/uploaded/'.$cdom.'/'.$cnum.'/portfolio/'.
+ $currhash->{$item};
}
- $output .= ' '.$showname.' ';
+ my $showname;
+ if ($have_meta) {
+ $showname = &Apache::lonnet::metadata($url,'title');
+ }
+ if ($showname eq '') {
+ $showname = $file_name;
+ } else {
+ $showname = $file_name.' ('.$showname.')';
+ }
+
+ $showname=&HTML::Entities::encode($showname,'<>&"');
+ $output .= ''.
+ ' '.
+ ' '.$showname.' ';
+ $output.='';
+ if ($have_meta) {
+ $output.= ' ';
+ }
+ $output .= ' ';
}
- $output .= '';
}
- return ($count,$output);
+ return $output;
}
1;