--- loncom/interface/lonaboutme.pm 2004/05/12 19:25:15 1.27 +++ loncom/interface/lonaboutme.pm 2006/08/02 03:05:10 1.43 @@ -1,7 +1,7 @@ # The LearningOnline Network # "About Me" Personal Information # -# $Id: lonaboutme.pm,v 1.27 2004/05/12 19:25:15 albertel Exp $ +# $Id: lonaboutme.pm,v 1.43 2006/08/02 03:05:10 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,29 +34,25 @@ use Apache::loncommon; use Apache::lonnet; use Apache::lontexconvert; use Apache::lonfeedback; +use Apache::lonrss(); use Apache::lonlocal; +use Apache::lonmsgdisplay(); 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); # 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; } # --------------------------------------------------------- The syllabus fields @@ -67,24 +63,40 @@ ENDDOCUMENT # ------------------------------------------------------------ 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)); + ($ENV{'QUERY_STRING'},['forceedit','forcestudent','register','action']); + +# ----------------------------------------------- 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); + $r->print(&Apache::loncommon::end_page()); + return OK; } + # --------------------------------------------------------------- Force Student my $forcestudent=''; - if ($ENV{'form.forcestudent'}) { $forcestudent='student'; }; + if ($env{'form.forcestudent'}) { $forcestudent='student'; }; + + my $forceregister = ''; + if ($forcestudent eq '') { + $forceregister = $env{'form.register'}; + } # --------------------------------------- There is such a user, get environment my %courseenv=&Apache::lonnet::dump('environment',$cdom,$cnum); if ($target ne 'tex') { - $r->print(''.&Apache::loncommon::bodytag - ("Personal Information",$forcestudent,$addentries,'',$cdom, - $ENV{'form.register'})); + my $start_page = + &Apache::loncommon::start_page("Personal Information",undef, + {'function' => $forcestudent, + 'domain' => $cdom, + 'force_register' => + $forceregister,}); + $r->print($start_page); $r->print('

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

'); } else { $r->print('\noindent{\large\textbf{'.&Apache::loncommon::plainname($cnum,$cdom).'}}\\\\\\\\'); @@ -96,7 +108,7 @@ ENDDOCUMENT } if ($target ne 'tex') { $r->print('

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

'. - '

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

'); + '

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

'.&Apache::lonrss::advertisefeeds($cnum,$cdom)); } else { $r->print('\textbf{'.$Apache::lonnet::domaindescription{$cdom}.'}\\\\'); } @@ -105,25 +117,25 @@ ENDDOCUMENT # does this user have privileges to post, etc? - $allowed=(($ENV{'user.name'} eq $cnum) && - ($ENV{'user.domain'} eq $cdom)); + my $privleged=$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) { + my $query_string = &build_query_string({'forcestudent' => '1',}); + $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').'

'); + } elsif ($privleged && $target ne 'tex') { + my $query_string = &build_query_string({'forceedit' => '1',}); + $r->print('

'. + &mt('Edit').'

'); + } + 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'}); } @@ -133,12 +145,19 @@ ENDDOCUMENT $syllabus{'uploaded.lastmodified'}=time; &Apache::lonnet::put('aboutme',\%syllabus,$cdom,$cnum); } - if (($allowed) && ($ENV{'form.storesyl'})) { + 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 (keys %syllabusfields) { - my $field=$ENV{'form.'.$_}; + my $field=$env{'form.'.$_}; $field=~s/\s+$//s; $field=&Apache::lonfeedback::clear_out_html($field, - $ENV{'user.adv'}); + $env{'user.adv'}); $syllabus{$_}=$field; } $syllabus{'uploaded.lastmodified'}=time; @@ -153,8 +172,8 @@ ENDDOCUMENT if ($syllabus{'uploaded.photourl'}) { &Apache::lonnet::allowuploaded('/adm/aboutme', $syllabus{'uploaded.photourl'}); - my $image=''; + my $image= + qq{}; if ($target eq 'tex') { $image=&Apache::lonxml::xmlparse($r,'tex',$image); } @@ -162,18 +181,25 @@ ENDDOCUMENT } if ($allowed) { $r->print( + '
+ +
'. '
'. '

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

'. ''. ''. '
'); + } foreach (sort keys %syllabusfields) { if (($syllabus{$_}) || ($allowed)) { my $message=$syllabus{$_}; - $message=~s/\n/\
/g; + &Apache::lonfeedback::newline_to_br(\$message); $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{$_}.'

'. @@ -197,25 +223,279 @@ ENDDOCUMENT } 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') { + &print_portfiles_link($r); + } + + 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)); + &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::lonmsg::disfacetoface($r,$cnum,$cdom); + &Apache::lonmsgdisplay::disfacetoface($r,$cnum,$cdom); } } } - if ($target ne 'tex') {$r->print('');} else {$r->print('\end{document}');} + if ($target ne 'tex') { + $r->print(&Apache::loncommon::end_page()); + } else { + $r->print('\end{document}'); + } return OK; -} +} + +sub aboutme_info { + my ($r) = @_; + my (undef,undef,$cdom,$cnum)=split(/\//,$r->uri); + my $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 $output; + if ($filecounts->{'both'} > 0) { + $output = &mt('

Viewable portfolio files

'); + $output .= '
'.&mt('Display file listing'). + '

'; + $output .= &mt('A total of [_1] portfolio files owned by [_2] are available for viewing.',$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'}).'
  • '; + } + if ($filecounts->{'withpass'}) { + $output .= '
  • '.&mt('[_1] files will be available after you have entered a passphrase set for each specific file.',$filecounts->{'withpass'}).'
  • '; + } + $output .= '
'; + } + $r->print($output); + return; +} + +sub build_query_string { + my ($new_items) = @_; + my $query_string; + my @formelements = ('register'); + my $nonew = 1; + if (ref($new_items) eq 'HASH') { + $nonew = 0; + 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 (($nonew) || (!defined($new_items->{$element}))) { + $query_string .= '&'.$element.'='.$env{'form.'.$element}; + } + } + } + if (!$nonew) { + foreach my $key (keys(%{$new_items})) { + $query_string .= '&'.$key.'='.$new_items->{$key}; + } + } + $query_string =~ s/^\&/\?/; + return $query_string; +} + +sub display_portfolio_header { + my ($r) = @_; + my ($cdom,$cnum,$name) = &aboutme_info($r); + 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, + '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).'

'; + $r->print($output); + return; +} + +sub display_portfolio_files { + my ($r,$lt) = @_; + my ($cdom,$cnum,$name) = aboutme_info($r); + 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); + my $query_string = &build_query_string(); + $r->print('

'. + &mt('Information about [_1]',$name).''); + return; +} + +sub portfolio_files { + my ($r,$mode,$lt) = @_; + my ($cdom,$cnum,$name) = &aboutme_info($r); + 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 %allfileshash; + my $portaccess; + if ($mode eq 'showlink') { + $portaccess = 'both'; + } else { + $portaccess = 'withoutpass'; + if (exists($env{'form.portaccess'})) { + $portaccess = $env{'form.portaccess'}; + } + } + + foreach my $filename (keys(%access_controls)) { + my $access_status = + &Apache::lonnet::get_portfolio_access($access_controls{$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'}; + 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); + $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; +} + +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; + foreach my $item (sort(keys(%{$currhash}))) { + $count ++; + my $backgroundcolor = $backgroundColors[$count%2]; + $output .= ''; + $output .= ''; + for (my $i=0; $i<$depth; $i++) { + $output .= $indent; + } + if (ref($currhash->{$item}) eq 'HASH') { + my $title = $item; + $title=~s/\"/\"/g; + $output .= ''.&mt('Folder').' '.$title.' border= '.$title; + ($count,$output) = &parse_directory($r,$output,$depth, + $currhash->{$item},$count); + } else { + my $showname; + if ($currhash->{$item} =~ m|/([^/]+)$|) { + $showname = $1; + } else { + $showname = $currhash->{$item}; + } + $output .= ' '.$showname.''; + } + $output .= ''; + } + return ($count,$output); +} 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.