--- loncom/interface/lonaboutme.pm 2004/08/25 18:08:11 1.30 +++ loncom/interface/lonaboutme.pm 2010/01/30 18:02:27 1.142 @@ -1,7 +1,7 @@ # The LearningOnline Network -# "About Me" Personal Information +# Personal Information Page # -# $Id: lonaboutme.pm,v 1.30 2004/08/25 18:08:11 sakharuk Exp $ +# $Id: lonaboutme.pm,v 1.142 2010/01/30 18:02:27 raeburn 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; @@ -34,192 +81,768 @@ use Apache::loncommon; use Apache::lonnet; use Apache::lontexconvert; use Apache::lonfeedback; +use Apache::lonrss(); use Apache::lonlocal; +use Apache::lonmsgdisplay(); +use Apache::lontemplate; +use HTML::Entities(); +use Image::Magick; sub handler { my $r = shift; &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; - my $target=$ENV{'form.grade_target'}; + my $target=$env{'form.grade_target'}; # ------------------------------------------------------------ Print the screen - if ($target ne 'tex') { - $r->print(< - -The LearningOnline Network with CAPA -ENDDOCUMENT - } else { - $r->print(&Apache::lonprintout::print_latex_header($ENV{'form.latex_type'})); + 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') { - $r->print(''. - &mt('No user information available').''); + &Apache::loncommon::simple_error_page($r,'No info', + 'No user information available'); return OK; + } else { + $is_course = &Apache::lonnet::is_course($cdom,$cnum); } + + my $candisplay = 1; + if (!$is_course) { + if ($action ne 'portfolio') { + $candisplay = &Apache::lonnet::usertools_access($cnum,$cdom,'aboutme'); + if ((!$candisplay) && ($env{'request.course.id'})) { + $candisplay = &aboutme_access($cnum,$cdom); + } + if (!$candisplay) { + if ($target eq 'tex') { + $r->print('\noindent{\large\textbf{'.&mt('No user personal information page available').'}}\\\\\\\\'); + } else { + $r->print(&Apache::loncommon::start_page("Personal Information Page")); + $r->print('

'.&mt('No user personal information page available') .'

'. + &mt('This is a result of one of the following:').''); + $r->print(&Apache::loncommon::end_page()); + } + return OK; + } + } + } + # --------------------------------------------------------- The syllabus fields my %syllabusfields=&Apache::lonlocal::texthash( 'aaa_contactinfo' => 'Contact Information', - 'bbb_aboutme' => 'About Me', + 'bbb_aboutme' => 'Personal Information', 'ccc_webreferences' => 'Web References'); # ------------------------------------------------------------ Get Query String - &Apache::loncommon::get_unprocessed_cgi - ($ENV{'QUERY_STRING'},['forcestudent','register']); -# ----------------------------------------------------- Force menu registration - my $addentries=''; - if ($ENV{'form.register'}) { - $addentries=' onLoad="'.&Apache::lonmenu::loadevents(). - '" onUnload="'.&Apache::lonmenu::unloadevents().'"'; - $r->print(&Apache::lonmenu::registerurl(1)); + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['forceedit','forcestudent', + 'register','popup']); + +# ----------------------------------------------- Available Portfolio file display + if (($target ne 'tex') && ($action eq 'portfolio')) { + &display_portfolio_header($r,$is_course); + if ((!$is_course) && (!&Apache::lonnet::usertools_access($cnum,$cdom,'portfolio'))) { + $r->print('

'.&mt('No user portfolio available') .'

'. + &mt('This is a result of one of the following:').''); + } else { + 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 $brcrum = [{href=>"/adm/navmaps",text=>"Course Contents"}, + {href=>"/adm/aboutme",text=>"Course Information"}]; + my $start_page = + &Apache::loncommon::start_page( + "Course Information", + undef, + {'function' => $env{'forcestudent'}, + 'domain' => $cdom, + 'force_register' => $env{'forceregister'}, + 'bread_crumbs' => $brcrum}); + $r->print($start_page); + $r->print('

'.&mt('Group Portfolio').'

'); + &print_portfiles_link($r,$is_course); + $r->print(&Apache::loncommon::end_page()); + } + return OK; } + # --------------------------------------------------------------- Force Student my $forcestudent=''; - if ($ENV{'form.forcestudent'}) { $forcestudent='student'; }; - -# --------------------------------------- There is such a user, get environment + if ($env{'form.forcestudent'}) { $forcestudent='student'; }; + + my $forceregister = ''; + if ($forcestudent eq '') { + $forceregister = $env{'form.register'}; + } + +#------------Get rights my %courseenv=&Apache::lonnet::dump('environment',$cdom,$cnum); + my %syllabus=&Apache::lonnet::dump('aboutme',$cdom,$cnum); + my $allowed=0; + my $privleged=$allowed=(($env{'user.name'} eq $cnum) && + ($env{'user.domain'} eq $cdom)); + if ($forcestudent or $target eq 'tex') { $allowed=0; } + +# --------------------------------------- There is such a user, get environment + if ($target ne 'tex') { - $r->print(''.&Apache::loncommon::bodytag - ("Personal Information",$forcestudent,$addentries,'',$cdom, - $ENV{'form.register'})); - $r->print('

'.&Apache::loncommon::plainname($cnum,$cdom).'

'); - } else { - $r->print('\noindent{\large\textbf{'.&Apache::loncommon::plainname($cnum,$cdom).'}}\\\\\\\\'); + my $rss_link = &Apache::lonrss::rss_link($cnum,$cdom); + my $args = {'function' => undef, + 'domain' => $cdom, +# if this page is part of course content it looses the menu line when switching from Edit Mode to Public Mode. To avoid +#this, I take take the value of the environment Variable $env{form.register} +# 'force_register' => $forceregister}; + 'force_register' => $env{'form.register'}}; + + if ($env{'form.popup'}) { + $args->{'no_nav_bar'} = 1; + #Don't show breadcrumbs twice, when this page is part of course content and you call it + } elsif ($env{'form.register'}) { + #do nothing + } else { # Don't show breadcrumbs in popup window + $args->{'bread_crumbs'} = [{href=>"/adm/$cdom/$cnum/aboutme",text=>"Personal Information Page"}]; + } + my $start_page = &Apache::loncommon::start_page('Personal Information Page',$rss_link,$args); + $r->print($start_page); + } + +#----------------Print Functions + if ($target ne 'tex') { + my $functions=&Apache::lonhtmlcommon::start_funclist(); + if ($allowed) { + my $query_string = &build_query_string( + {'forcestudent' => '1', + 'popup' => $env{'form.popup'}}); + $functions.=&Apache::lonhtmlcommon::add_item_funclist( + '' + .&mt('Show Public View').'' + .&Apache::loncommon::help_open_topic( + 'Uploaded_Templates_PublicView')); + } elsif ($privleged) { + my $query_string = &build_query_string( + {'forceedit' => '1', + 'popup' => $env{'form.popup'}}); + $functions.=&Apache::lonhtmlcommon::add_item_funclist( + '' + .&mt('Edit').''); + } + $functions.=&Apache::lonhtmlcommon::add_item_funclist( + &Apache::lontemplate::send_message($r,$cnum,$cdom)); + + if ($env{'request.course.id'} && + &Apache::lonnet::allowed('srm',$env{'request.course.id'}) && + &in_course($cdom,$cnum)) { + if (&Apache::lonnet::allowed('vsa', $env{'request.course.id'}) || + &Apache::lonnet::allowed('vsa', $env{'request.course.id'}.'/'.$env{'request.course.sec'})) { + $functions.=&Apache::lonhtmlcommon::add_item_funclist( + &Apache::loncommon::track_student_link( + 'View recent activity by this student',$cnum,$cdom)); + } + if (&Apache::lonnet::allowed('vgr', $env{'request.course.id'}) || + &Apache::lonnet::allowed('vgr', $env{'request.course.id'}.'/'.$env{'request.course.sec'})) { + $functions.=&Apache::lonhtmlcommon::add_item_funclist( + &Apache::loncommon::slot_reservations_link( + 'Slot reservation history',$cnum,$cdom)); + } + $functions.=&Apache::lonhtmlcommon::add_item_funclist( + &Apache::loncommon::noteswrapper( + &mt('Add Records'),$cnum,$cdom)); + } + $functions.=&Apache::lonhtmlcommon::end_funclist(); + $r->print(&Apache::loncommon::head_subbox($functions)); } - if ($courseenv{'nickname'}) { - $r->print( - '

"'.$courseenv{'nickname'}. - '"

'); + +# Print Privacy Note + if ($target ne 'tex') { + #Print Privacy Note + if ($allowed) { + $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.') + .'
' + ); + } } + +#Print last modified + if ($target ne 'tex') { - $r->print('

'.$Apache::lonnet::domaindescription{$cdom}.'

'. - '

'.&Apache::loncommon::messagewrapper('Send me a message',$cnum,$cdom).'

'); - } else { - $r->print('\textbf{'.$Apache::lonnet::domaindescription{$cdom}.'}\\\\'); + my $lastmod; + if (($syllabus{'uploaded.lastmodified'}) || ($allowed)) { + $lastmod=$syllabus{'uploaded.lastmodified'}; + $lastmod=($lastmod?&Apache::lonlocal::locallocaltime($lastmod):&mt('never')); + $r->print('
'); + $r->print(&mt('Last updated').': '.$lastmod . ''); + $r->print('
'); + } + } +#Print Help Text + if ($target ne 'tex') { + if($allowed){ + $r->print(&Apache::loncommon::help_open_topic('Uploaded_Templates_TextBoxes',&mt('Help with filling in text boxes'))); + } } - my %syllabus=&Apache::lonnet::dump('aboutme',$cdom,$cnum); - my $allowed=0; +#------Print Headtitle + if ($target ne 'tex') { + $r->print('
'); + $r->print('

'.&Apache::loncommon::plainname($cnum,$cdom).'

'); + if ($courseenv{'nickname'}) { + $r->print('

"'.$courseenv{'nickname'}.'"

'); + } + $r->print('

'.&Apache::lonnet::domain($cdom,'description').'

'); + } else { + $r->print('\noindent{\large\textbf{'.&Apache::loncommon::plainname($cnum,$cdom).'}}\\\\\\\\'); + $r->print('\textbf{'.&Apache::lonnet::domain($cdom,'description').'}\\\\'); + } # does this user have privileges to post, etc? - $allowed=(($ENV{'user.name'} eq $cnum) && - ($ENV{'user.domain'} eq $cdom)); - if ($forcestudent or $target eq 'tex') { $allowed=0; } - - if ($allowed) { - if ($target ne 'tex') { - $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_PublicView').'

'); - } else { - $r->print(' \textbf{'.&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.').'\\\\\\\\'); - } - } - if (($ENV{'form.uploaddoc.filename'}) && - ($ENV{'form.storeupl'}) && ($allowed)) { - if ($ENV{'form.uploaddoc.filename'}=~/\.(gif|jpg|png|jpeg)$/i) { - if ($syllabus{'uploaded.photourl'}) { - &Apache::lonnet::removeuploadedurl($syllabus{'uploaded.photourl'}); - } - $syllabus{'uploaded.photourl'}= - &Apache::lonnet::userfileupload('uploaddoc',undef,'aboutme'); - } - $syllabus{'uploaded.lastmodified'}=time; - &Apache::lonnet::put('aboutme',\%syllabus,$cdom,$cnum); - } - if (($allowed) && ($ENV{'form.storesyl'})) { - foreach (keys %syllabusfields) { - my $field=$ENV{'form.'.$_}; - $field=~s/\s+$//s; - $field=&Apache::lonfeedback::clear_out_html($field, - $ENV{'user.adv'}); - $syllabus{$_}=$field; - } - $syllabus{'uploaded.lastmodified'}=time; - &Apache::lonnet::put('aboutme',\%syllabus,$cdom,$cnum); - } + my $query_string; + + if (($env{'form.uploaddoc.filename'}) && + ($env{'form.storeupl'}) && ($allowed)) { + if ($env{'form.uploaddoc.filename'}=~/\.(gif|jpg|png|jpeg)$/i) { + if ($syllabus{'uploaded.photourl'}) { + &Apache::lonnet::removeuploadedurl($syllabus{'uploaded.photourl'}); + } + $syllabus{'uploaded.photourl'}= + &Apache::lonnet::userphotoupload('uploaddoc','aboutme'); + } + $syllabus{'uploaded.lastmodified'}=time; + &Apache::lonnet::put('aboutme',\%syllabus,$cdom,$cnum); + } + if ($allowed && $env{'form.delupl'}) { + if ($syllabus{'uploaded.photourl'}) { + &Apache::lonnet::removeuploadedurl($syllabus{'uploaded.photourl'}); + delete($syllabus{'uploaded.photourl'}); + &Apache::lonnet::del('aboutme',['uploaded.photourl'],$cdom,$cnum); + } + } + if (($allowed) && ($env{'form.storesyl'})) { + 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{$syl_field}=$field; + } + $syllabus{'uploaded.lastmodified'}=time; + &Apache::lonnet::put('aboutme',\%syllabus,$cdom,$cnum); + } + + my $image; # ---------------------------------------------------------------- Get syllabus if (($syllabus{'uploaded.lastmodified'}) || ($allowed)) { - my $lastmod=$syllabus{'uploaded.lastmodified'}; - $lastmod=($lastmod?&Apache::lonlocal::locallocaltime($lastmod):&mt('never')); - $r->print(&mt('Last updated').': '.$lastmod); - if ($syllabus{'uploaded.photourl'}) { - &Apache::lonnet::allowuploaded('/adm/aboutme', - $syllabus{'uploaded.photourl'}); - my $image=''; - if ($target eq 'tex') { - $image=&Apache::lonxml::xmlparse($r,'tex',$image); - } - $r->print($image); - } - if ($allowed) { - $r->print( - '
'. - '

'.&mt('Upload a Photo').'

'. - ''. - ''. - '
'); - } - foreach (sort keys %syllabusfields) { - if (($syllabus{$_}) || ($allowed)) { - my $message=$syllabus{$_}; - $message=~s/\n/\
/g; - $message - =~s/(http\:\/\/[^\s]+)/\\$1\<\/tt\>\<\/a\>/g; - if ($allowed) { - $message=&Apache::lonspeller::markeduptext($message); - } - $message=&Apache::lontexconvert::msgtexconverted($message); - if ($target ne 'tex') { - $r->print('

'.$syllabusfields{$_}.'

'. - $message.'
'); - } else { - $r->print('\\\\\textbf{'.$syllabusfields{$_}.'}\\\\'. - &Apache::lonxml::xmlparse($r,'tex',$message).'\\\\'); - } - if ($allowed) { - $r->print('
'); - } - } - } - if ($allowed) { - $r->print(''); - } - if ($target ne 'tex') {$r->print('

');} else {$r->print('\\\\');} - } else { - $r->print('

'.&mt('No personal information provided').'.

'); - } - 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::lonmsg::disfacetoface($r,$cnum,$cdom); - $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::lonmsg::disfacetoface($r,$cnum,$cdom); - } + if ($syllabus{'uploaded.photourl'}) { + &Apache::lonnet::allowuploaded('/adm/aboutme',$syllabus{'uploaded.photourl'}); + + #This call is to resize all "Personal Information" images in the LonCapa System. When its done, you can remove this line. + &Apache::lonnet::resizeImage(&Apache::lonnet::filelocation('',$syllabus{'uploaded.photourl'})); + #---End Resize--- + + $image=qq|Photo of the user|; + + if ($target eq 'tex') { + $image=&Apache::lonxml::xmlparse($r,'tex',$image); + } + + } + + if ($allowed) { + $r->print( + '
'. + '

'.&mt('Upload a Photo').'

'. + ''. + ''. + ''. + '
'); + if ($syllabus{'uploaded.photourl'}) { + $r->print('
') + } + $r->print('

'); + } + + if($allowed) { + $r->print('
'); } + + if ($target ne 'tex') { #print Image + $r->print($image); + + } #End Print Image + + #Print Content eg. Contactinfo aboutme,... + &Apache::lontemplate::print_aboutme_content_template($r,$allowed,$target,\%syllabusfields,\%syllabus); + #End Print Content + + if ($target ne 'tex') { #Begin Print RSS and portfiles + &print_portfiles_link($r,$is_course); + if (&Apache::lonrss::advertisefeeds($cnum,$cdom) ne '') { + &Apache::lontemplate::print_start_template($r,'RSS Feeds and Blogs','LC_Box'); + $r->print(&Apache::lonrss::advertisefeeds($cnum,$cdom)); + &Apache::lontemplate::print_end_template($r); + } + + } #End Print RSS and portfiles + + + if ($allowed) { + if ($env{'form.popup'}) { + $r->print(''); + } + $r->print('
'); + } + if ($target ne 'tex') {$r->print('
');} else {$r->print('\\\\');} + } else { + $r->print('

'.&mt('No personal information provided').'.

'); } - if ($target ne 'tex') {$r->print('');} else {$r->print('\end{document}');} + + if ($env{'request.course.id'} + && &Apache::lonnet::allowed('srm',$env{'request.course.id'}) + && &in_course($cdom,$cnum)) { + if ($target ne 'tex') { + $r->print('
'); + &Apache::lontemplate::print_start_template($r,&mt('User Notes, Records of Face-To-Face Discussions, and Critical Messages in Course'),'LC_Box'); + $r->print(''); + $r->print(&mt('Shared by course faculty and staff').&Apache::loncommon::help_open_topic("Course_Face_To_Face_Records,Course_Critical_Message")); + $r->print(''); + &Apache::lonmsgdisplay::disfacetoface($r,$cnum,$cdom); + &Apache::lontemplate::print_end_template($r); + + } 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, 'tex'); + } + } + if ($target ne 'tex') { + $r->print('
'); + if ($env{'form.popup'}) { + $r->print('

'.&mt('Close window').''); + } + $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,$is_course) = @_; + my (undef,undef,$cdom,$cnum)=split(/\//,$r->uri); + my $name; + if (!$is_course) { + $name = &Apache::loncommon::plainname($cnum,$cdom); + } + return ($cdom,$cnum,$name); +} + +sub print_portfiles_link { + 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 = '

'; + $output .= ($is_course?$lt{'vgpf'}:$lt{'vpfi'}).'

'; + + #$output = '

'.($is_course?$lt{'vgpf'}:$lt{'vpfi'}).'

'; + $output .= ''.$lt{'difl'}. + '

'; + if ($filecounts->{'both'} == 1) { + if ($is_course) { + $output .= &mt('One group portfolio file is available.').'
'; + } + $r->print($output); + return; +} + +sub build_query_string { + my ($new_items) = @_; + my $query_string; + my @formelements = ('register'); + my $new = 0; + if (ref($new_items) eq 'HASH') { + $new = 1; + if (!defined($new_items->{'forceedit'}) && + !defined($new_items->{'forcestudent'})) { + push(@formelements,('forceedit','forcestudent')); + } + } else { + push(@formelements,('forceedit','forcestudent')); + } + foreach my $element (@formelements) { + if (exists($env{'form.'.$element})) { + if ((!$new) || (!defined($new_items->{$element}))) { + $query_string .= '&'.$element.'='.$env{'form.'.$element}; + } + } + } + if ($new) { + foreach my $key (keys(%{$new_items})) { + $query_string .= '&'.$key.'='.$new_items->{$key}; + } + } + $query_string =~ s/^\&/\?/; + return $query_string; +} + +sub display_portfolio_header { + 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; + 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,}); + if (!($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public')) { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/$cdom/$cnum/aboutme".$query_string, + text=>&mt('Personal Information Page - [_1]',$name), + title=>&mt('Go to personal information page for [_1]', $name)}, + {href=>"/adm/$cdom/$cnum/aboutme/portfolio", + text=>&mt('Viewable files - [_1]', $name), + title=>&mt('Viewable portfolio files for [_1]', $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,$is_course) = @_; + my ($cdom,$cnum,$name) = &aboutme_info($r,$is_course); + my %lt = &Apache::lonlocal::texthash( + 'withoutpass' => 'passphrase not required', + 'withpass' => 'passphrase protected', + 'both' => 'all access types ', + ); + + my $portaccess = 'withoutpass'; + if (exists($env{'form.portaccess'})) { + $portaccess = $env{'form.portaccess'}; + } + + my $output = '
'. + &mt('File access type: ').''."\n". + ''; + $output .= '


'; + $r->print($output); + 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,$is_course,$cdom,$cnum,$name) = @_; + my $filecounts = { + withpass => 0, + withoutpass => 0, + both => 0, + }; + my $current_permissions = + &Apache::lonnet::get_portfile_permissions($cdom,$cnum); + my %access_controls = + &Apache::lonnet::get_access_controls($current_permissions); + my $portaccess; + if ($mode eq 'showlink') { + $portaccess = 'both'; + } else { + $portaccess = 'withoutpass'; + if (exists($env{'form.portaccess'})) { + $portaccess = $env{'form.portaccess'}; + } + } + + 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; +} + +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_/)) { + next; + } + } elsif ($portaccess eq 'withoutpass') { + if ($access_status ne 'ok') { + next; + } + } elsif ($portaccess eq 'withpass') { + if ($access_status !~ /^[^:]+:guest_/) { + next; + } + } + if ($mode eq 'listfiles') { + $filename =~ s/^\///; + my @pathitems = split('/',$filename); + my $lasthash = $allfileshash; + while (@pathitems > 1) { + my $newlevel = shift(@pathitems); + if (!exists($lasthash->{$newlevel})) { + $lasthash->{$newlevel} = {}; + } + $lasthash = $lasthash->{$newlevel}; + } + $lasthash->{$pathitems[0]} = $filename; + } + if ($access_status eq 'ok') { + $filecounts->{'withoutpass'} ++; + } elsif ($access_status =~ /^[^:]+:guest_/) { + $filecounts->{'withpass'} ++; + } + } + $filecounts->{'both'} = $filecounts->{'withoutpass'} + + $filecounts->{'withpass'}; + my $output; + if ($mode eq 'listfiles') { + if ($filecounts->{'both'} > 0) { + $output = &Apache::loncommon::start_data_table(); + $output .= &parse_directory($r,0,$allfileshash,'',$is_course, + $group); + $output .= &Apache::loncommon::end_data_table(); + } + } + return $output; +} + +sub parse_directory { + 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}))) { + $output .= &Apache::loncommon::start_data_table_row(); + $output .= ''; + if (ref($currhash->{$item}) eq 'HASH') { + my $title=&HTML::Entities::encode($item,'<>&"'); + $output .= ''.&mt('Folder').' '.$title.' '.$title; + $output .= ' ' + .&Apache::loncommon::end_data_table_row(); + $output .= &parse_directory($r,$depth,$currhash->{$item}, + $path.'/'.$item,$is_course,$group); + } else { + 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}; + } + 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.= ''.&mt('Metadata').''; + } + $output .= '' + .&Apache::loncommon::end_data_table_row(); + } + } + return $output; +} + +sub aboutme_access { + my ($uname,$udom) = @_; + my $privcheck = $env{'request.course.id'}; + my $sec; + if ($env{'request.course.sec'} ne '') { + $sec = $env{'request.course.sec'}; + $privcheck .= '/'.$sec; + } + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if (($cdom eq '') || ($cnum eq '')) { + my %coursehash = &Apache::lonnet::coursedescription($env{'request.course.id'}); + $cdom = $coursehash{'domain'}; + $cnum = $coursehash{'cnum'}; + } + if ((&Apache::lonnet::allowed('srm',$privcheck)) || + (&Apache::lonnet::allowed('dff',$privcheck))) { + if (&in_course($uname,$udom,$cnum,$cdom)) { + return 1; + } + } + return; +} 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.