[LON-CAPA-cvs] cvs: loncom /interface lonaboutme.pm portfolio.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Wed, 02 Aug 2006 03:05:11 -0000


This is a MIME encoded message

--raeburn1154487911
Content-Type: text/plain

raeburn		Tue Aug  1 23:05:11 2006 EDT

  Modified files:              
    /loncom/interface	portfolio.pm lonaboutme.pm 
  Log:
  Advertising a user's viewable portfolio files on the user's aboutme page. Currently not implemented for group portfolio files.  The aboutme page returns 'Forbidden' if the url is viewed without login - modification or alternative mechanism required for advertisement of viewable files for users without accounts.
  
  
--raeburn1154487911
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20060801230511.txt"

Index: loncom/interface/portfolio.pm
diff -u loncom/interface/portfolio.pm:1.141 loncom/interface/portfolio.pm:1.142
--- loncom/interface/portfolio.pm:1.141	Tue Aug  1 22:34:54 2006
+++ loncom/interface/portfolio.pm	Tue Aug  1 23:05:10 2006
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # portfolio browser
 #
-# $Id: portfolio.pm,v 1.141 2006/08/02 02:34:54 raeburn Exp $
+# $Id: portfolio.pm,v 1.142 2006/08/02 03:05:10 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -571,8 +571,13 @@
                                                                         $uname);
     my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group,$file_name);
     my $aclcount = keys(%access_controls);
-    my $header = '<h3>'.&mt('Allowing others to retrieve portfolio file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'</h3>';
+    my $header = '<h3>'.&mt('Allowing others to retrieve file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'</h3>';
     my $info .= &mt('Access to this file by others can be set to be one or more of the following types: public, passphrase-protected or conditional.').'<br /><ul><li>'.&mt('Public files are available to anyone without the need for login.').'</li><li>'.&mt('Passphrase-protected files do not require log-in, but will require the viewer to enter the passphrase you set.').'</li><li>'.&mt('Conditional files are accessible to logged-in users with accounts in the LON-CAPA network, who satisfy the conditions you set.').'<br />'.&mt('The conditions can include affiliation with a particular course or group, or a user account in a specific domain.').'<br />'.&mt('Alternatively access can be granted to people with specific LON-CAPA usernames and domains.').'</li></ul>';
+
+    if ($group eq '') {
+        $info .= (&mt("Direct others to the 'Display file listing' link (shown when there are viewable files) on your personal information page:<br /><a href='/adm/$udom/$uname/aboutme'>http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme</a>"));
+    }
+    
     if ($can_setacl) {
         &open_form($r,$url);
         $r->print($header.$info);
@@ -747,7 +752,7 @@
         }
     }
     my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'};
-    $r->print('<h3>'.&mt('Allowing others to retrieve portfolio file: [_1]',
+    $r->print('<h3>'.&mt('Allowing others to retrieve file: [_1]',
               $port_path.$file_name).'</h3>'."\n");
     $file_name = &prepend_group($file_name);
     my ($uname,$udom) = &get_name_dom();
Index: loncom/interface/lonaboutme.pm
diff -u loncom/interface/lonaboutme.pm:1.42 loncom/interface/lonaboutme.pm:1.43
--- loncom/interface/lonaboutme.pm:1.42	Mon Apr 10 15:59:53 2006
+++ loncom/interface/lonaboutme.pm	Tue Aug  1 23:05:10 2006
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # "About Me" Personal Information
 #
-# $Id: lonaboutme.pm,v 1.42 2006/04/10 19:59:53 albertel Exp $
+# $Id: lonaboutme.pm,v 1.43 2006/08/02 03:05:10 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -63,10 +63,29 @@
 
 # ------------------------------------------------------------ Get Query String
     &Apache::loncommon::get_unprocessed_cgi
-                            ($ENV{'QUERY_STRING'},['forcestudent','register']);
+        ($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'; };
+
+    my $forceregister = '';
+    if ($forcestudent eq '') {
+        $forceregister = $env{'form.register'};
+    }
        
 # --------------------------------------- There is such a user, get environment
     my %courseenv=&Apache::lonnet::dump('environment',$cdom,$cnum);
@@ -76,7 +95,7 @@
 					   {'function'       => $forcestudent,
 					    'domain'         => $cdom,
 					    'force_register' =>
-						$env{'form.register'},});
+						            $forceregister,});
 	$r->print($start_page);
 	$r->print('<h1>'.&Apache::loncommon::plainname($cnum,$cdom).'</h1>');
     } else {
@@ -103,13 +122,15 @@
        if ($forcestudent or $target eq 'tex') { $allowed=0; }
  
        if ($allowed) {
+           my $query_string = &build_query_string({'forcestudent' => '1',});
 	   $r->print('<p><b>'.&mt('Privacy Note').':</b> '.
 		     &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.').
 		     '</p>'.
-		     &Apache::loncommon::help_open_topic('Uploaded_Templates_TextBoxes','Help with filling in text boxes').'</p><p><a href="'.$r->uri.'?forcestudent=1">Show Public View</a>'.
+		     &Apache::loncommon::help_open_topic('Uploaded_Templates_TextBoxes','Help with filling in text boxes').'</p><p><a href="'.$r->uri.$query_string.'">Show Public View</a>'.
 		     &Apache::loncommon::help_open_topic('Uploaded_Templates_PublicView').'</p>');
        } elsif ($privleged && $target ne 'tex') {
-	   $r->print('<p><a href="'.$r->uri.'?forceedit=1"><font size="+1">'.
+           my $query_string = &build_query_string({'forceedit' => '1',});
+	   $r->print('<p><a href="'.$r->uri.$query_string.'"><font size="+1">'.
 		     &mt('Edit').'</font></a></p>');
        }
       if (($env{'form.uploaddoc.filename'}) &&
@@ -202,6 +223,11 @@
     } else {
        $r->print('<p>'.&mt('No personal information provided').'.</p>');
     }
+
+    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') {
@@ -235,7 +261,241 @@
 	$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('<h3>Viewable portfolio files</h3>');
+        $output .= '<a href="/adm/'.$cdom.'/'.$cnum.'/aboutme'.
+                   $query_string.'">'.&mt('Display file listing').
+                   '</a><br /><br />';
+        $output .= &mt('A total of [_1] portfolio files owned by [_2] are available for viewing.',$filecounts->{'both'},$name).'<ul>';
+        if ($filecounts->{'withoutpass'}) {
+            $output .= '<li>'.&mt('[_1] files are either publicly accessible, or directly available to you because of your current role, domain and/or username.',$filecounts->{'withoutpass'}).'</li>';   
+        }
+        if ($filecounts->{'withpass'}) {
+            $output .= '<li>'.&mt('[_1] files will be available after you have entered a passphrase set for each specific file.',$filecounts->{'withpass'}).'</li>';
+        }
+        $output .= '</ul>';
+    }
+    $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 .= '&amp;'.$element.'='.$env{'form.'.$element};
+            }
+        }
+    }
+    if (!$nonew) {
+        foreach my $key (keys(%{$new_items})) {
+            $query_string .= '&amp;'.$key.'='.$new_items->{$key};
+        }
+    }
+    $query_string =~ s/^\&amp;/\?/;
+    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 .= '<h3>'.&mt('Portfolio files for [_1]',$name).'</h3>';
+    $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 = '<form name="displaystatus" method="post">'.
+                 &mt('File access type: ').'<select name="portaccess">';
+    foreach my $type ('withoutpass','withpass','both') {
+        $output .= '<option value="'.$type.'" ';
+        if ($portaccess eq $type) {
+            $output .= 'selected="selected"';
+        }
+        $output .= '>'.$lt->{$type}.'</option>';
+    }
+    $output .= '</select>'."\n".
+               '<input type="submit" name="portaccessbutton" value="'.
+               &mt('Update display').'">'.
+               '<input type="hidden" name="action" value="'.
+               $env{'form.action'}.'"/>';
+    $output .= '</form><br /><br />';
+    $r->print($output);
+    my $filecounts = &portfolio_files($r,'listfiles',$lt);
+    my $query_string = &build_query_string();
+    $r->print('<br /><br /><a href="/adm/'.$cdom.'/'.$cnum.
+               '/aboutme'.$query_string.'">'.
+               &mt('Information about [_1]',$name).'</a>');
+    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 = '<table border="0" cellpadding="2" cellspacing="0">';
+            ($count,$output) = &parse_directory($r,$output,$depth,
+                                               \%allfileshash,$count);
+            $output .= '</table>';
+        } 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 = '<img src="'.&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace1.gif").'" width="25" height="1" alt="&nbsp;&nbsp;" border="0" />';
+    $output .= $indent;
+    foreach my $item (sort(keys(%{$currhash}))) {
+        $count ++;
+        my $backgroundcolor = $backgroundColors[$count%2]; 
+        $output .= '<tr bgcolor="'.$backgroundcolor.'">';
+        $output .= '<td>';
+        for (my $i=0; $i<$depth; $i++) {
+            $output .= $indent;
+        }
+        if (ref($currhash->{$item}) eq 'HASH') {
+            my $title = $item;
+            $title=~s/\"/\&quot;/g;
+            $output .= '<img src="'.&Apache::loncommon::lonhttpdurl("/adm/lonIcons/navmap.folder.open.gif").'" alt="'.&mt('Folder').' '.$title.' border="0" />&nbsp;'.$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 .= '<img alt="" src="'.&Apache::loncommon::icon($currhash->{$item}).'" />&nbsp;<a href="/uploaded/'.$cdom.'/'.$cnum.'/portfolio/'.$currhash->{$item}.'">'.$showname.'</a>';
+        }
+        $output .= '</td></tr>';
+    }
+    return ($count,$output);
+}
 
 1;
 __END__

--raeburn1154487911--