Diff for /loncom/interface/portfolio.pm between versions 1.137 and 1.175

version 1.137, 2006/07/19 14:57:18 version 1.175, 2006/12/11 03:43:15
Line 43  use LONCAPA; Line 43  use LONCAPA;
 sub group_args {  sub group_args {
     my $output;      my $output;
     if (defined($env{'form.group'})) {      if (defined($env{'form.group'})) {
         $ouput .= '&group='.$env{'form.group'};          $output .= '&group='.$env{'form.group'};
  if (defined($env{'form.ref'})) {   if (defined($env{'form.ref'})) {
     $output .= '&ref='.$env{'form.ref'};      $output .= '&ref='.$env{'form.ref'};
  }   }
Line 54  sub group_args { Line 54  sub group_args {
 sub group_form_data {  sub group_form_data {
     my $output;      my $output;
     if (defined($env{'form.group'})) {      if (defined($env{'form.group'})) {
  $ouput = '<input type="hidden" name="group" value="'.$env{'form.group'}.'" />';   $output = '<input type="hidden" name="group" value="'.$env{'form.group'}.'" />';
  if (exists($env{'form.ref'})) {   if (exists($env{'form.ref'})) {
     $output .= '<input type="hidden" name="ref" value="'.      $output .= '<input type="hidden" name="ref" value="'.
  $env{'form.ref'}.'" />';   $env{'form.ref'}.'" />';
  }   }
     }      }
       return $output;
 }   } 
   
 # receives a file name and path stub from username/userfiles/portfolio/  # receives a file name and path stub from username/userfiles/portfolio/
 # returns an anchor tag consisting encoding filename and currentpath  # returns an anchor tag consisting encoding filename and currentpath
 sub make_anchor {  sub make_anchor {
     my ($url, $filename, $current_path, $current_mode, $field_name,      my ($url, $anchor_fields, $inner_text) = @_;
         $continue_select) = @_;      if ($$anchor_fields{'continue'} ne 'true') {$$anchor_fields{'continue'} = 'false'};
     if ($continue_select ne 'true') {$continue_select = 'false'};      my $anchor = '<a href="'.$url.'?';
     my $anchor = '<a href="'.$url.'?selectfile='.$filename.'&amp;currentpath='.$current_path.'&amp;mode='.$current_mode.'&amp;continue='.$continue_select.'&amp;fieldname='.$field_name;      foreach my $field_name (keys(%$anchor_fields)) {
     $anchor .= &group_args()          $anchor .= $field_name.'='.$$anchor_fields{$field_name}.'&amp;';
     $anchor .= '">'.$filename.'</a>';      }
       $anchor =~ s/&amp;$//;
       $anchor .= &group_args();
       $anchor .= '">'.$inner_text.'</a>';
     return $anchor;      return $anchor;
 }  }
   
 my $dirptr=16384;  my $dirptr=16384;
 sub display_common {  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)=@_;
     my $namespace = &get_namespace($group);      my $namespace = &get_namespace();
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
     if ($can_upload) {      if ($can_upload) {
         my $groupitem = &group_form_data();          my $groupitem = &group_form_data();
   
Line 90  sub display_common { Line 95  sub display_common {
  'createdir_label' =>    'createdir_label' => 
  'Create subdirectory in current directory:');   'Create subdirectory in current directory:');
         my $escuri = &HTML::Entities::encode($r->uri,'&<>"');          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', 'Help on the portfolio'));
   
         $r->print(<<"TABLE");           $r->print(<<"TABLE"); 
 <table id="LC_portfolio_actions">  <table id="LC_portfolio_actions">
   <tr id="LC_portfolio_upload">    <tr id="LC_portfolio_upload">
Line 104  sub display_common { Line 115  sub display_common {
  <input type="hidden" name="action" value="$env{"form.action"}" />   <input type="hidden" name="action" value="$env{"form.action"}" />
  <input type="hidden" name="fieldname" value="$env{"form.fieldname"}" />   <input type="hidden" name="fieldname" value="$env{"form.fieldname"}" />
  <input type="hidden" name="mode" value="$env{"form.mode"}" />   <input type="hidden" name="mode" value="$env{"form.mode"}" />
  <input type="submit" name="storeupl" value="$text{'upload'}" />   <input type="submit" name="storeupl" value="$text{'upload'}" />$help_fileupload
       </form>        </form>
     </td>      </td>
   </tr>    </tr>
Line 119  sub display_common { Line 130  sub display_common {
         <input type="hidden" name="action" value="$env{"form.action"}" />          <input type="hidden" name="action" value="$env{"form.action"}" />
         <input type="hidden" name="fieldname" value="$env{"form.fieldname"}" />          <input type="hidden" name="fieldname" value="$env{"form.fieldname"}" />
         <input type="hidden" name="mode" value="$env{"form.mode"}" />          <input type="hidden" name="mode" value="$env{"form.mode"}" />
         <input type="submit" name="createdir" value="$text{'createdir'}" />          <input type="submit" name="createdir" value="$text{'createdir'}" />$help_createdir
       </form>        </form>
     </td>      </td>
   </tr>    </tr>
Line 127  sub display_common { Line 138  sub display_common {
 TABLE  TABLE
     }      }
     my @tree = split (/\//,$current_path);      my @tree = split (/\//,$current_path);
     $r->print('<span class="LC_current_location">'.&make_anchor($url,$port_path,'/',$env{"form.mode"},$env{"form.fieldname"},$env{"form.continue"}).'/');      my %anchor_fields = (
           'selectfile'    => $port_path,
           'currentpath'   => '/',
           'mode'          => $env{"form.mode"},
           'fieldname'     => $env{"form.fieldname"},
           'continue'      => $env{"form.continue"}
       );
       $r->print('<span class="LC_current_location">'.&make_anchor($url,\%anchor_fields,$port_path).'/');
     if (@tree > 1){      if (@tree > 1){
         my $newCurrentPath = '';          my $newCurrentPath = '';
         for (my $i = 1; $i< @tree; $i++){          for (my $i = 1; $i< @tree; $i++){
             $newCurrentPath .= $tree[$i].'/';              $newCurrentPath .= $tree[$i].'/';
             $r->print(&make_anchor($url,$tree[$i],'/'.$newCurrentPath, $env{"form.mode"},$env{"form.fieldname"}, $env{"form.continue"}).'/');              my %anchor_fields = (
                   'selectfile' => $tree[$i],
                   'currentpath' => '/',
                   'mode' => $env{"form.mode"},
                   'fieldname' => $env{"form.fieldname"},
                   'continue' => $env{"form.continue"}
               );
               $r->print(&make_anchor($url,\%anchor_fields,$tree[$i]).'/');
         }          }
     }      }
     $r->print('</span>');      $r->print('</span>');
       $r->print(&Apache::loncommon::help_open_topic('Portfolio ChangeDirectory'));
     &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path);      &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path);
     $r->print('<br /><form method="post" action="'.$url.'?mode='.$env{"form.mode"}.'&amp;fieldname='.$env{"form.fieldname"}.&group_args());      $r->print('<br /><form method="post" action="'.$url.'?mode='.$env{"form.mode"}.'&amp;fieldname='.$env{"form.fieldname"}.&group_args());
     $r->print('">'.      $r->print('">'.
Line 145  TABLE Line 171  TABLE
 }  }
   
 sub display_directory_line {  sub display_directory_line {
     my ($r,$select_mode,$fullpath, $filename, $mtime, $size, $css_class,      my ($r,$select_mode, $filename, $mtime, $size, $css_class,
  $line, $access_controls, $curr_access, $now, $version_flag,   $line, $access_controls, $curr_access, $now, $version_flag,
  $href_location, $url, $current_path, $access_admin_text)=@_;   $href_location, $url, $current_path, $access_admin_text, $versions)=@_;
     # my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);   
       my $fullpath =  &prepend_group($current_path.$filename);
     $r->print('<tr class="'.$css_class.'">');      $r->print('<tr class="'.$css_class.'">');
     $r->print($line);      $r->print($line); # contains first two cells of table
     $r->print('<td><img alt="" src="'.&Apache::loncommon::icon($filename).'" /></td>');      my $lock_info;
     $r->print('<td>'.$$version_flag{$filename}.'<a href="'.$href_location.$filename.'">'.      if ($version_flag) { # versioned can't be versioned, so TRUE when root file
       $filename.'</a></td>');           $r->print('<td><img alt="" src="'.&Apache::loncommon::icon($filename).'" /></td>');
           $r->print('<td>'.$version_flag.'</td>');
       } else { # this is a graded or handed back file
           my ($user,$domain) = &get_name_dom();
           my $permissions_hash = &Apache::lonnet::get_portfile_permissions($domain,$user);
           if (defined($$permissions_hash{$fullpath})) {
               foreach my $array_item (@{$$permissions_hash{$fullpath}}) {
                   if (ref($array_item) eq 'ARRAY') {
                       if ($$array_item[-1] eq 'handback') {
                           $lock_info = 'Handback';
                       } elsif ($$array_item[-1] eq 'graded') {
                           $lock_info = 'Graded';
                       }
                    }
               }
           }
    if ($lock_info) {
       my %anchor_fields = ('lockinfo' => $fullpath);
       if ($versions) { # hold the folder open
           my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($fullpath);
           $fname =~ s|^/||;
           $anchor_fields{'showversions'} = $fname.'.'.$extension;
       }
       $lock_info = &make_anchor(undef,\%anchor_fields,$lock_info);
    }
    $r->print('<td colspan="2">'.$lock_info.'</td>');
       }
       # $r->print('<td>'.$$version_flag{$filename}.'</td><td>');
       $r->print('<td>'.&make_anchor($href_location.$filename,undef,$filename).'</td>'); 
     $r->print('<td>'.$size.'</td>');      $r->print('<td>'.$size.'</td>');
     $r->print('<td>'.&Apache::lonlocal::locallocaltime($mtime).'</td>');      $r->print('<td>'.&Apache::lonlocal::locallocaltime($mtime).'</td>');
     if ($select_mode ne 'true') {      if ($select_mode ne 'true') {
  $r->print('<td><span style="white-space: nowrap">'.   $r->print('<td><span style="white-space: nowrap">'.
   &mt($curr_access).'&nbsp;&nbsp;&nbsp;');    &mt($curr_access).'&nbsp;&nbsp;&nbsp;');
  $r->print('<a href="'.$url.'?access='.$filename.          my %anchor_fields = (
   '&amp;currentpath='.$current_path.&group_args().              'access' => $filename,
   '">'.$access_admin_text.'</a></span></td>');              'currentpath' => $current_path
           );
    $r->print(&make_anchor($url, \%anchor_fields, $access_admin_text).'</span></td>');
     }      }
     $r->print('</tr>'.$/);      $r->print('</tr>'.$/);
 }  }
   
 sub display_directory {  sub display_directory {
     my ($r,$url,$current_path,$is_empty,$dir_list,$can_upload,      my ($r,$url,$current_path,$is_empty,$dir_list,$group,$can_upload,
         $can_modify,$can_delete,$can_setacl)=@_;          $can_modify,$can_delete,$can_setacl)=@_;
     my $iconpath= $r->dir_config('lonIconsURL') . "/";      my $iconpath= $r->dir_config('lonIconsURL') . "/";
     my $display_out;      my $display_out;
     my $select_mode;      my $select_mode;
     my $checked_files;      my $checked_files;
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     my $access_admin_text = &mt('View Status');      my $access_admin_text = &mt('View Status');
     if ($can_setacl) {      if ($can_setacl) {
         $access_admin_text = &mt('View/Change Status');          $access_admin_text = &mt('View/Change Status');
Line 186  sub display_directory { Line 243  sub display_directory {
                                                   $current_permissions,$group);                                                    $current_permissions,$group);
     my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group);      my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group);
     my $now = time;      my $now = time;
     if ($env{"form.mode"} eq 'selectfile'){      if ($env{"form.mode"} eq 'selectfile') {
  &select_files($r);   &select_files($r);
  $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'});   $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'});
  $select_mode = 'true';   $select_mode = 'true';
Line 206  sub display_directory { Line 263  sub display_directory {
     if ($select_mode eq 'true') {      if ($select_mode eq 'true') {
         $r->print('<form method="post" name="checkselect" action="'.$url.'">');          $r->print('<form method="post" name="checkselect" action="'.$url.'">');
         $r->print('<table id="LC_browser">'.          $r->print('<table id="LC_browser">'.
             '<tr><th>Select</th><th>&nbsp;</th><th>Name</th><th>Size</th><th>Last Modified</th></tr>');              '<tr><th>Select</th><th>&nbsp;</th><th>&nbsp;</th><th>Name</th><th>Size</th><th>Last Modified</th></tr>');
     } else {      } else {
         $r->print('<form method="post" action="'.$url.'">');          $r->print('<form method="post" action="'.$url.'">');
    $r->print(&Apache::loncommon::help_open_topic('Portfolio FileList',
         'Using the portfolio file list'));
         $r->print('<table id="LC_browser">'.          $r->print('<table id="LC_browser">'.
             '<tr><th colspan="2">Actions</th><th>&nbsp;</th><th>Name</th><th>Size</th><th>Last Modified</th><th>Current Access Status</th></tr>');    '<tr><th colspan="2">Actions'.
     &Apache::loncommon::help_open_topic('Portfolio FileAction').
     '</th><th>&nbsp;</th><th>&nbsp;</th><th>Name'.
     &Apache::loncommon::help_open_topic('Portfolio OpenFile').
     '</th><th>Size</th><th>Last Modified</th><th>Current Access Status'.
     &Apache::loncommon::help_open_topic('Portfolio ShareFile').
     '</th></tr>');
     }      }
     $r->print("\n".&group_form_data()."\n");      $r->print("\n".&group_form_data()."\n");
   
     my $href_location="/uploaded/$udom/$uname/$port_path".$current_path;      my $href_location="/uploaded/$udom/$uname/$port_path".$current_path;
     my $href_edit_location="/editupload/$udom/$uname/$port_path".$current_path;      my $href_edit_location="/editupload/$udom/$uname/$port_path".$current_path;
     my @dir_lines;      my @dir_lines;
     my @version_lines;  
     my %versioned;      my %versioned;
     foreach my $line (sort       foreach my $dir_line (sort 
       {         { 
   my ($afile)=split('&',$a,2);    my ($afile)=split('&',$a,2);
   my ($bfile)=split('&',$b,2);    my ($bfile)=split('&',$b,2);
Line 227  sub display_directory { Line 291  sub display_directory {
       } (@$dir_list)) {        } (@$dir_list)) {
     #$strip holds directory/file name      #$strip holds directory/file name
     #$dom       #$dom 
     my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);       my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$dir_line,16); 
     $filename =~ s/\s+$//;      $filename =~ s/\s+$//;
     my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);      my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);
     if ($version) {      if ($version) {
        push(@version_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]);      my $fullpath = &prepend_group($current_path.$fname.'.'.$extension);
        $versioned{$fname.'.'.$extension} .= $version.",";         push(@{ $versioned{$fullpath} },
    [$filename,$dom,$testdir,$size,$mtime,$obs,]);
     } else {      } else {
        push(@dir_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]);         push(@dir_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]);
     }      }
     }      }
     foreach my $line (@dir_lines) {      foreach my $dir_line (@dir_lines) {
         my ($filename,$dom,$testdir,$size,$mtime,$obs) = @$line;          my ($filename,$dom,$testdir,$size,$mtime,$obs) = @$dir_line;
         my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);          my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename);
     if (($filename ne '.') && ($filename ne '..') && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/)) {      if (($filename ne '.') && ($filename ne '..') && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/)) {
        my %version_flag;         my $version_flag;
        my $show_versions;         my $show_versions;
        if ($env{'form.showversions'} eq $filename) {      my $fullpath =  &prepend_group($current_path.$filename);
          if ($env{'form.showversions'} =~ /$filename/) {
            $show_versions = 'true';             $show_versions = 'true';
        }         }
        if (exists($versioned{$filename})) {         if (exists($versioned{$fullpath})) {
              my %anchor_fields = (
                  'selectfile' => $fullpath,
                  'continue' => 'false',
                  'currentpath' => $current_path,
              );
            if ($show_versions) {             if ($show_versions) {
                     $version_flag{$filename} = '<a href="portfolio"><img alt="'.&mt('opened folder').'" src="'.$iconpath.'folder_pointer_opened.gif" /></a>';                 # Must preserve other possible showversion files
                  my $version_remainder = $env{'form.showversions'};
                  $version_remainder =~ s/$filename//g;                
                  $anchor_fields{'showversions'} = $version_remainder;
                       $version_flag = &make_anchor('portfolio',\%anchor_fields,
                           '<img class="LC_icon" alt="'.&mt('opened folder').'" src="'.$iconpath.'folder_pointer_opened.gif" />');
            } else {             } else {
                     $version_flag{$filename} = '<a href="portfolio?showversions='.$filename.'"><img alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_pointer_closed.gif" /></a>';                 # allow multiple files to show versioned
                  $anchor_fields{'showversions'} = $env{'form.showversions'}.','.$filename;
                       $version_flag = &make_anchor('portfolio',\%anchor_fields,
                           '<img class="LC_icon" alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_pointer_closed.gif" />');
                 }                  }
        } else {         } else {
            $version_flag{$filename} = '';             $version_flag = '&nbsp;';
        }         }
             if ($dirptr&$testdir) {              if ($dirptr&$testdir) {
  my $colspan='colspan="2"';   my $colspan='colspan="2"';
Line 262  sub display_directory { Line 341  sub display_directory {
                 }                  }
  $r->print('<tr class="LC_browser_folder"><td '.$colspan.'><img alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_closed.gif" /></td>');   $r->print('<tr class="LC_browser_folder"><td '.$colspan.'><img alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_closed.gif" /></td>');
                 $r->print('<td>Go to ...</td>');                  $r->print('<td>Go to ...</td>');
                 $r->print('<td>'.$version_flag{$filename}.&make_anchor($url,$filename.'/',$current_path.$filename.'/',$env{'form.mode'},$env{"form.fieldname"},$env{'form.continue'}).'/</td>');                   my %anchor_fields = (
                       'selectfile'    => $filename.'/',
                       'currentpath'   => $current_path.$filename.'/',
                       'mode'          => $env{"form.mode"},
                       'fieldname'     => $env{"form.fieldname"},
                       'continue'      => $env{"form.continue"}
                   );  
                   $r->print('<td>'.$version_flag.'</td><td>'.&make_anchor($url,\%anchor_fields,$filename.'/').'</td>'); 
                 $r->print('</tr>');                   $r->print('</tr>'); 
             } else {              } else {
  my $css_class = 'LC_browser_file';   my $css_class = 'LC_browser_file';
  my $line;   my $line;
                 my $fullpath = $current_path.$filename;  
                 $fullpath = &prepend_group($fullpath,$group);  
                 if ($select_mode eq 'true') {                  if ($select_mode eq 'true') {
                     $line='<td><input type="checkbox" name="checkfile" value="'.$filename.'"';                      $line='<td><input type="checkbox" name="checkfile" value="'.$filename.'"';
     if ($$checked_files{$filename} eq 'selected') {      if ($$checked_files{$filename} eq 'selected') {
Line 277  sub display_directory { Line 361  sub display_directory {
     $line.=' /></td>';      $line.=' /></td>';
                 } else {                  } else {
                     if (exists $locked_files{$fullpath}) {                      if (exists $locked_files{$fullpath}) {
                         $line.='<td colspan="2"><a href="'.$url.'?lockinfo='.$current_path.$filename.&group_args().'">Locked</a></td>';                          my %anchor_fields = (
                               'lockinfo' => $fullpath
                           );
                           $line.='<td colspan="2">'.&make_anchor($url,\%anchor_fields,'Locked').'</td>';
  $css_class= 'LC_browser_file_locked';   $css_class= 'LC_browser_file_locked';
                     } else {                      } else {
                         if (!$can_modify) {                          if (!$can_modify) {
Line 289  sub display_directory { Line 376  sub display_directory {
                             $line .= '<input type="checkbox" name="selectfile" value="'.$filename.'" />';                              $line .= '<input type="checkbox" name="selectfile" value="'.$filename.'" />';
                         }                          }
                         if ($can_modify) {                          if ($can_modify) {
                             my $cat='<img alt="'.&mt('Catalog Information').                              my $cat='<img class="LC_icon" alt="'.&mt('Catalog Information').
                             '" src="'.&Apache::loncommon::lonhttpdurl('/res/adm/pages/catalog.gif').'" />';                              '" src="'.&Apache::loncommon::lonhttpdurl('/res/adm/pages/catalog.gif').'" />';
                             $line .= '<a href="'.$url.'?rename='.$filename.'&amp;currentpath='.$current_path.&group_args().'">Rename</a>';                              my %anchor_fields = (
                             $line .= '</td><td>'.$version_flag{$filename}.'<a href="'.$href_edit_location.$filename.'.meta">'.$cat.'</a>';                                  'rename' => $filename,
                                   currentpath => $current_path
                               );
                               $line .= &make_anchor($url,\%anchor_fields,'Rename');
                               $line .= '</td><td>'.&make_anchor($href_edit_location.$filename.'.meta',\%anchor_fields,$cat);
                               # '<a href="'.$href_edit_location.$filename.'.meta">'.$cat.'</a>';
                         }                          }
                         $line .= '</td>';                          $line .= '</td>';
                     }                      }
Line 330  sub display_directory { Line 422  sub display_directory {
  $curr_access = join('+ ',@allaccesses);   $curr_access = join('+ ',@allaccesses);
     }      }
  }   }
                 &display_directory_line($r,$select_mode,$fullpath, $filename, $mtime, $size, $css_class, $line, \%access_controls, $curr_access,                  &display_directory_line($r,$select_mode, $filename, $mtime, $size, $css_class, $line, 
                         $now, \%version_flag, $href_location, $url, $current_path, $access_admin_text);                                          \%access_controls, $curr_access,$now, $version_flag, $href_location, 
 # $r->print('<tr class="'.$css_class.'">');                                          $url, $current_path, $access_admin_text);
 # $r->print($line);  
 # $r->print('<td><img alt="" src="'.&Apache::loncommon::icon($filename).'" /></td>');  
 # $r->print('<td>'.$version_flag{$filename}.'<a href="'.$href_location.$filename.'">'.  
 #  $filename.'</a></td>');   
 # $r->print('<td>'.$size.'</td>');  
 # $r->print('<td>'.&Apache::lonlocal::locallocaltime($mtime).'</td>');  
 # if ($select_mode ne 'true') {  
 #    $r->print('<td><span style="white-space: nowrap">'.  
 #      &mt($curr_access).'&nbsp;&nbsp;&nbsp;');  
 #    $r->print('<a href="'.$url.'?access='.$filename.  
 #      '&amp;currentpath='.$current_path.&group_args().  
 #      '">'.$access_admin_text.'</a></span></td>');  
 # }  
 # $r->print('</tr>'.$/);  
  if ($show_versions) {   if ($show_versions) {
     &display_directory_line($r,$select_mode,$fullpath, $css_class, $line, \%access_controls,       foreach my $dir_line (@{ $versioned{$fullpath} }) {
                         $now, \%version_flag, $href_location, $url, $current_path, $access_admin_text);          my ($v_filename,$dom,$testdir,$size,$mtime,$obs) =
       @$dir_line;
                           $line = '<td colspan="2">&nbsp;</td>';
    &display_directory_line($r,$select_mode, $v_filename, $mtime, $size, 
    $css_class, $line, \%access_controls, $curr_access, $now,
    undef, $href_location, $url, $current_path, $access_admin_text, 1);
       }
  }   }
             }              }
         }          }
Line 368  sub display_directory { Line 451  sub display_directory {
         $r->print('</table>');          $r->print('</table>');
         if ($can_delete) {          if ($can_delete) {
             $r->print('              $r->print('
         <input type="submit" name="doit" value="Delete Checked Files" />          <input type="submit" name="doit" value="Delete Checked Files" />'.
    &Apache::loncommon::help_open_topic('Portfolio DeleteFile').'
         <input type="hidden" name="action" value="delete" />          <input type="hidden" name="action" value="delete" />
         <input type="hidden" name="currentpath" value="'.$current_path.'" />          <input type="hidden" name="currentpath" value="'.$current_path.'" />
         </form>'          </form>'
Line 400  sub close_form { Line 484  sub close_form {
                          'cancel'   => &mt('Cancel'),                           'cancel'   => &mt('Cancel'),
                        };                         };
     }      }
     $r->print('<p><input type="submit" value="'.$button_text->{'continue'}.'" />')      $r->print('<p><input type="submit" value="'.$button_text->{'continue'}.'" />');
     $r->print(&group_form_data().'</p></form>');      $r->print(&group_form_data().'</p></form>');
     $r->print('<form action="'.$url.'" method="post">      $r->print('<form action="'.$url.'" method="post">
                <p>                 <p>
Line 437  sub done { Line 521  sub done {
     unless (defined $message) {      unless (defined $message) {
         $message='Done';          $message='Done';
     }      }
     my $result = '<h3><a href="'.$url.'?currentpath='.      my %anchor_fields = (
          $env{'form.currentpath'}.          'showversions' => $env{'form.showversions'},
          '&fieldname='.$env{'form.fieldname'}.          'currentpath' => $env{'form.currentpath'},
          '&mode='.$env{'form.mode'}.          'fieldname' => $env{'form.fieldname'},
  &group_args();          'mode'      => $env{'form.mode'}
     $result .= '">'.&mt($message).'</a></h3>';      );
       my $result = '<h3>'.&make_anchor($url,\%anchor_fields,&mt($message)).'</h3>';
     return $result;      return $result;
 }  }
   
 sub delete {  sub delete {
     my ($r,$url,$group)=@_;      my ($r,$url)=@_;
     my @check;      my @check;
     my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'};      my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'};
     $file_name = &prepend_group($file_name,$group);      $file_name = &prepend_group($file_name);
     my @files=&Apache::loncommon::get_env_multiple('form.selectfile');      my @files=&Apache::loncommon::get_env_multiple('form.selectfile');
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {      if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
         $r->print ("The file is locked and cannot be deleted.<br />");          $r->print("The file is locked and cannot be deleted.<br />");
         $r->print(&done('Back',$url));          $r->print(&done('Back',$url));
     } else {      } else {
         if (scalar(@files)) {          if (scalar(@files)) {
Line 472  sub delete_confirmed { Line 557  sub delete_confirmed {
     my ($r,$url,$group)=@_;      my ($r,$url,$group)=@_;
     my @files=&Apache::loncommon::get_env_multiple('form.selectfile');      my @files=&Apache::loncommon::get_env_multiple('form.selectfile');
     my $result;      my $result;
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
       my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                           $uname);
     foreach my $delete_file (@files) {      foreach my $delete_file (@files) {
         $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path.          $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path.
        $env{'form.currentpath'}.         $env{'form.currentpath'}.
        $delete_file);         $delete_file);
         if ($result ne 'ok') {          if ($result ne 'ok') {
  $r->print('<span class="LC_error"> An error occured ('.$result.      $r->print('<span class="LC_error">'.
   ') while trying to delete '.&display_file(undef, $delete_file).'</span><br />');                       &mt('An error occured ([_1]) while trying to delete 
                            [_2].',$result,&display_file(undef, $delete_file)).
                         '</span><br /><br />');
           } else {
               $r->print(&mt('File: [_1] deleted.',
                             &display_file(undef,$delete_file)));
               my $file_name = $env{'form.currentpath'}.$delete_file;
               $file_name = &prepend_group($file_name);
               my %access_controls = 
                       &Apache::lonnet::get_access_controls($current_permissions,
                                                            $group,$file_name);
               if (keys(%access_controls) > 0) {
                   my %changes; 
                   foreach my $key (keys(%{$access_controls{$file_name}})) {
                       $changes{'delete'}{$key} = 1;
                   }
                   if (keys(%changes) > 0) {
                       my ($outcome,$deloutcome,$new_values,$translation) =
                       &Apache::lonnet::modify_access_controls($file_name,\%changes,
                                                               $udom,$uname);
                       if ($outcome ne 'ok') {
                              $r->print('<br />'.&mt("An error occured ([_1]) while ".
                                  "trying to delete access controls for the file.",$outcome).
                                  '</span><br /><br />');
                       } else {
                           if ($deloutcome eq 'ok') {
                               $r->print('<br />'.&mt('Access controls also deleted for the file.').'<br /><br />');
                           } else {
                               $r->print('<span class="LC_error">'.'<br />'.
                                  &mt("An error occured ([_1]) while ".
                                      "trying to delete access controls for the file.",$deloutcome).
                                      '</span><br /><br />');
                           }
                       }
                   }
               }
         }          }
     }      }
     $r->print(&done(undef,$url));      $r->print(&done(undef,$url));
Line 494  sub delete_dir { Line 616  sub delete_dir {
 }   } 
   
 sub delete_dir_confirmed {  sub delete_dir_confirmed {
     my ($r,$url,$group)=@_;      my ($r,$url)=@_;
     my $directory_name = $env{'form.currentpath'};      my $directory_name = $env{'form.currentpath'};
     $directory_name =~ s|/$||; # remove any trailing slash      $directory_name =~ s|/$||; # remove any trailing slash
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     my $namespace = &get_namespace($group);      my $namespace = &get_namespace();
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
     my $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path.      my $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path.
        $directory_name);         $directory_name);
                 
Line 523  sub delete_dir_confirmed { Line 645  sub delete_dir_confirmed {
 }  }
   
 sub rename {  sub rename {
     my ($r,$url,$group)=@_;      my ($r,$url)=@_;
     my $file_name = $env{'form.currentpath'}.$env{'form.rename'};      my $file_name = $env{'form.currentpath'}.$env{'form.rename'};
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     $file_name = &prepend_group($file_name,$group);      $file_name = &prepend_group($file_name);
     if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {      if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
         $r->print ("The file is locked and cannot be renamed.<br />");          $r->print("The file is locked and cannot be renamed.<br />");
         $r->print(&done(undef,$url));          $r->print(&done(undef,$url));
     } else {      } else {
         &open_form($r,$url);          &open_form($r,$url);
Line 541  sub rename { Line 663  sub rename {
 sub rename_confirmed {  sub rename_confirmed {
     my ($r,$url,$group)=@_;      my ($r,$url,$group)=@_;
     my $filenewname=&Apache::lonnet::clean_filename($env{'form.filenewname'});      my $filenewname=&Apache::lonnet::clean_filename($env{'form.filenewname'});
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
     if ($filenewname eq '') {      if ($filenewname eq '') {
  $r->print('<span class="LC_error">'.   $r->print('<span class="LC_error">'.
   &mt("Error: no valid filename was provided to rename to.").    &mt("Error: no valid filename was provided to rename to.").
Line 550  sub rename_confirmed { Line 672  sub rename_confirmed {
  $r->print(&done(undef,$url));   $r->print(&done(undef,$url));
  return;   return;
     }       } 
       my $chg_access;
     my $result=      my $result=
  &Apache::lonnet::renameuserfile($uname,$udom,   &Apache::lonnet::renameuserfile($uname,$udom,
             $port_path.$env{'form.currentpath'}.$env{'form.selectfile'},              $port_path.$env{'form.currentpath'}.$env{'form.selectfile'},
             $port_path.$env{'form.currentpath'}.$filenewname);              $port_path.$env{'form.currentpath'}.$filenewname);
     if ($result ne 'ok') {      if ($result eq 'ok') {
           $chg_access = &access_for_renamed($filenewname,$group,$udom,$uname);
       } else {      
  $r->print('<span class="LC_error">'.   $r->print('<span class="LC_error">'.
   &mt('An errror occured ([_1]) while trying to rename [_2]'    &mt('An error occured ([_1]) while trying to rename [_2]'
       .' to [_3]',$result,&display_file(),        .' to [_3]',$result,&display_file(),
       &display_file('',$filenewname)).'</span><br />');        &display_file('',$filenewname)).'</span><br />');
           return;
     }      }
     if ($filenewname ne $env{'form.filenewname'}) {      if ($filenewname ne $env{'form.filenewname'}) {
         $r->print(&mt("The new file name was changed from:<br />[_1] to [_2]",          $r->print(&mt("The new file name was changed from:<br />[_1] to [_2]",
       '<strong>'.&display_file('',$env{'form.filenewname'}).'</strong>',        '<strong>'.&display_file('',$env{'form.filenewname'}).'</strong>',
       '<strong>'.&display_file('',$filenewname).'</strong>'));        '<strong>'.&display_file('',$filenewname).'</strong>'));
     }      }
       $r->print($chg_access);
     $r->print(&done(undef,$url));      $r->print(&done(undef,$url));
 }  }
   
   sub access_for_renamed {
       my ($filenewname,$group,$udom,$uname) = @_;
       my $oldfile = $env{'form.currentpath'}.$env{'form.selectfile'};
       $oldfile = &prepend_group($oldfile);
       my $newfile = $env{'form.currentpath'}.$filenewname;
       $newfile = &prepend_group($newfile);
       my $current_permissions =
    &Apache::lonnet::get_portfile_permissions($udom,$uname);
       my %access_controls =
    &Apache::lonnet::get_access_controls($current_permissions,
        $group,$oldfile);
       my $chg_text;
       if (keys(%access_controls) > 0) {
           my %change_old;
           my %change_new;
           foreach my $key (keys(%{$access_controls{$oldfile}})) {
               $change_old{'delete'}{$key} = 1;
               $change_new{'activate'}{$key} = $access_controls{$oldfile}{$key};
           }
           my ($outcome,$deloutcome,$new_values,$translation) =
               &Apache::lonnet::modify_access_controls($oldfile,\%change_old,
       $udom,$uname);
           if ($outcome ne 'ok') {
               $chg_text ='<br /><br />'.&mt("An error occured ([_1]) while ".
                   "trying to delete access control records for the old name.",$outcome).
                   '</span><br />';
           } else {
               if ($deloutcome ne 'ok') {
                   $chg_text = '<br /><br /><span class="LC_error"><br />'.
       &mt("An error occured ([_1]) while ".
    "trying to delete access control records for the old name.",$deloutcome).
    '</span><br />';
               }
           }
           ($outcome,$deloutcome,$new_values,$translation) =
               &Apache::lonnet::modify_access_controls($newfile,\%change_new,
                                                       $udom,$uname);
           if ($outcome ne 'ok') {
               $chg_text .= '<br /><br />'.
    &mt("An error occured ([_1]) while ".
                   "trying to update access control records for the new name.",$outcome).
                   '</span><br />';
           }
           if ($chg_text eq '') {
               $chg_text = '<br /><br />'.&mt('Access controls updated to reflect the name change.');
           }
       }
       return $chg_text;
   }
   
 sub display_access {  sub display_access {
     my ($r,$url,$group,$can_setacl,$port_path) = @_;      my ($r,$url,$group,$can_setacl,$port_path,$action) = @_;
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     my $file_name = $env{'form.currentpath'}.$env{'form.access'};      my $file_name = $env{'form.currentpath'}.$env{'form.access'};
     $file_name = &prepend_group($file_name,$group);      $file_name = &prepend_group($file_name);
     my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,      my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                         $uname);                                                                          $uname);
     my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group,$file_name);      my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group,$file_name);
     my $aclcount = keys(%access_controls);      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,$info);
     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 ($action eq 'chgaccess') {
           $header = '<h3>'.&mt('Allowing others to retrieve file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'</h3>';
           $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.');
           $info .= '<br /><ul><li>'.&mt('Public files are available to anyone without the need for login.');
           $info .= '</li><li>'.&mt('Passphrase-protected files do not require log-in, but will require the viewer to enter the passphrase you set.');
           $info .= '</li><li>'.&explain_conditionals();
           $info .= '</li></ul>'.
                     &mt('A listing of files viewable without log-in is available at: ')."<a href=\"/adm/$udom/$uname/aboutme/portfolio\">http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme/portfolio</a>.<br />";
           if ($group eq '') {
               $info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on your personal information page:");
           } else {
               $info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on the course information page:");
           }
           $info .= "<br /><a href=\"/adm/$udom/$uname/aboutme\">http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme</a><br />";
           if ($group ne '') {
               $info .= &mt("Users with privileges to edit course contents may add a course information page to a course using the 'Course Info' button in DOCS").'<br />';
           }
       } else {
           $header = '<h3>'.&mt('Conditional access controls for file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'</h3>'.
                     &explain_conditionals().'<br />';
       }
     if ($can_setacl) {      if ($can_setacl) {
         &open_form($r,$url);          &open_form($r,$url);
         $r->print($header.$info);          $r->print($header.$info);
         &access_setting_table($r,$access_controls{$file_name});   $r->print('<br />'.&Apache::loncommon::help_open_topic('Portfolio ShareFile SetAccess', 'Help on setting up share access'));
    $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile ChangeSetting', 'Help on changing settings'));
    $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile StopAccess', 'Help on removing share access'));
           &access_setting_table($r,$url,$file_name,$access_controls{$file_name},
                                 $action);
         my $button_text = {          my $button_text = {
                         'continue' => &mt('Proceed'),                          'continue' => &mt('Proceed'),
                         'cancel' => &mt('Back to directory listing'),                          'cancel' => &mt('Back to directory listing'),
Line 597  sub display_access { Line 798  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.').'<br />'."\n".
           &mt('The conditions can include affiliation with a particular course, or a user account in a specific domain.').'<br />'."\n".
           &mt('Alternatively access can be granted to people with specific LON-CAPA usernames and domains.');
   }
   
 sub view_access_settings {  sub view_access_settings {
     my ($r,$url,$access_controls,$aclcount) = @_;      my ($r,$url,$access_controls,$aclcount) = @_;
     my ($showstart,$showend);      my ($showstart,$showend);
Line 619  sub view_access_settings { Line 827  sub view_access_settings {
     } else {      } else {
         $r->print(&mt('No access control settings currently exist for this file.<br />' ));          $r->print(&mt('No access control settings currently exist for this file.<br />' ));
     }      }
     $r->print('<br /><a href="'.$url.'?currentpath='.$env{'form.currentpath'}.      my %anchor_fields = (
               &group_args().'">'.&mt('Return to directory listing').'</a>');          'currentpath' => $env{'form.currentpath'}
       );
       $r->print('<br />'.&make_anchor($url, \%anchor_fields, &mt('Return to directory listing')));
     return;      return;
 }  }
   
Line 633  sub build_access_summary { Line 843  sub build_access_summary {
                       domains => 'Conditional: domain-based',                        domains => 'Conditional: domain-based',
                       users => 'Conditional: user-based',                        users => 'Conditional: user-based',
                       course => 'Conditional: course-based',                        course => 'Conditional: course-based',
                       group => 'Conditional: group-based',  
                      );                       );
     my @allscopes = ('public','guest','domains','users','course','group');      my @allscopes = ('public','guest','domains','users','course');
     foreach my $scope (@allscopes) {      foreach my $scope (@allscopes) {
         if ((!(exists($todisplay{$scope}))) || (ref($todisplay{$scope}) ne 'HASH')) {          if ((!(exists($todisplay{$scope}))) || (ref($todisplay{$scope}) ne 'HASH')) {
             next;              next;
Line 658  sub build_access_summary { Line 867  sub build_access_summary {
                 }                  }
             }              }
             $r->print('<td>'.&mt($scope_desc{$scope}));              $r->print('<td>'.&mt($scope_desc{$scope}));
             if (($scope eq 'course') || ($scope eq 'group')) {              if ($scope eq 'course') {
                 if ($chg ne 'delete') {                  if ($chg ne 'delete') {
                     my $cid = $content->{'domain'}.'_'.$content->{'number'};                      my $cid = $content->{'domain'}.'_'.$content->{'number'};
                     my %course_description = &Apache::lonnet::coursedescription($cid);                      my %course_description = &Apache::lonnet::coursedescription($cid);
Line 670  sub build_access_summary { Line 879  sub build_access_summary {
             if ($chg ne 'delete') {              if ($chg ne 'delete') {
                 if ($scope eq 'guest') {                  if ($scope eq 'guest') {
                     $r->print(&mt('Passphrase').': '.$content->{'password'});                      $r->print(&mt('Passphrase').': '.$content->{'password'});
                 } elsif ($scope eq 'course' || $scope eq 'group') {                  } elsif ($scope eq 'course') {
                     $r->print('<table><tr>');                      $r->print('<table width="100%"><tr>');
                     $r->print('<th>'.&mt('Roles').'</th><th>'.                      $r->print('<th>'.&mt('Roles').'</th><th>'.
                           &mt('Access').'</th><th>'.                            &mt('Access').'</th><th>'.
                                           &mt('Sections').'</th>');                                            &mt('Sections').'</th>');
                     if ($scope eq 'course') {                      $r->print('<th>'.&mt('Groups').'</th>');
                         $r->print('<th>'.&mt('Groups').'</th>');  
                     } else {  
                         $r->print('<th>'.&mt('Teams').'</th>');  
                     }  
                     $r->print('</tr>');                      $r->print('</tr>');
                     foreach my $id (sort(keys(%{$content->{'roles'}}))) {                      foreach my $id (sort(keys(%{$content->{'roles'}}))) {
                         $r->print('<tr>');                          $r->print('<tr>');
Line 703  sub build_access_summary { Line 908  sub build_access_summary {
                             } else {                              } else {
                                 $r->print(join(',',@{$content->{'roles'}{$id}{$item}}));                                  $r->print(join(',',@{$content->{'roles'}{$id}{$item}}));
                             }                              }
                             $r->print('</tr>');                              $r->print('</td>');
                         }                          }
  $r->print("</table>");   $r->print('</tr>');
                     }                      }
     $r->print("</tr></table>");      $r->print('</table>');
                 } elsif ($scope eq 'domains') {                  } elsif ($scope eq 'domains') {
                     $r->print(&mt('Domains: ').join(',',@{$content->{'dom'}}));                      $r->print(&mt('Domains: ').join(',',@{$content->{'dom'}}));
                 } elsif ($scope eq 'users') {                  } elsif ($scope eq 'users') {
Line 753  sub update_access { Line 958  sub update_access {
         }          }
     }      }
     my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'};      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");                $port_path.$file_name).'</h3>'."\n");
     $file_name = &prepend_group($file_name,$group);      $file_name = &prepend_group($file_name);
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     my ($errors,$outcome,$deloutcome,$new_values,$translation);      my ($errors,$outcome,$deloutcome,$new_values,$translation);
     if ($totalprocessed) {      if ($totalprocessed) {
         ($outcome,$deloutcome,$new_values,$translation) =          ($outcome,$deloutcome,$new_values,$translation) =
Line 821  sub update_access { Line 1026  sub update_access {
     my $totalnew = 0;      my $totalnew = 0;
     my $status = 'new';      my $status = 'new';
     my ($firstitem,$lastitem);      my ($firstitem,$lastitem);
     foreach my $newitem ('course','group','domains','users') {      foreach my $newitem ('course','domains','users') {
         $allnew += $env{'form.new'.$newitem};          $allnew += $env{'form.new'.$newitem};
     }      }
     if ($allnew > 0) {      if ($allnew > 0) {
         my $now = time;          my $now = time;
         my $then = $now + (60*60*24*180); # six months approx.          my $then = $now + (60*60*24*180); # six months approx.
         &open_form($r,$url,$group);          &open_form($r,$url);
         foreach my $newitem ('course','group','domains','users') {          foreach my $newitem ('course','domains','users') {
             if ($env{'form.new'.$newitem} > 0) {              if ($env{'form.new'.$newitem} > 0) {
                 $r->print('<br />'.&mt('Add new <b>[_1]-based</b> access control for portfolio file: <b>[_2]</b>',$newitem,$env{'form.currentpath'}.$env{'form.selectfile'}).'<br /><br />');                  $r->print('<br />'.&mt('Add new <b>[_1]-based</b> access control for portfolio file: <b>[_2]</b>',$newitem,$env{'form.currentpath'}.$env{'form.selectfile'}).'<br /><br />');
                 $firstitem = $totalnew;                  $firstitem = $totalnew;
Line 844  sub update_access { Line 1049  sub update_access {
         }          }
         &close_form($r,$url);          &close_form($r,$url);
     } else {      } else {
         $r->print('<br /><a href="'.$url.'?access='.$env{'form.selectfile'}.          my %anchor_fields = (
                   '&amp;currentpath='.$env{'form.currentpath'}.$group_arg.'">'.              'currentpath' => $env{'form.currentpath'},
                    &mt('Display all access settings for this file').'</a>'.              'access' => $env{'form.selectfile'}
                   '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.          );
                   '<a href="'.$url.'?currentpath='.$env{'form.currentpath'}.          $r->print('<br />'.&make_anchor($url, \%anchor_fields, &mt('Display all access settings for this file')));
                   &group_args().'">'.&mt('Return to directory listing').'</a>');          delete $anchor_fields{'access'};
           $r->print('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&make_anchor($url,\%anchor_fields,&mt('Return to directory listing')));
     }      }
     return;      return;
 }  }
Line 866  sub build_access_record { Line 1072  sub build_access_record {
   
     if ($scope eq 'guest') {      if ($scope eq 'guest') {
         $record->{'password'} = $env{'form.password'};          $record->{'password'} = $env{'form.password'};
     } elsif (($scope eq 'course') || ($scope eq 'group')) {      } elsif ($scope eq 'course') {
         $record->{'domain'} = $env{'form.crsdom_'.$num};          $record->{'domain'} = $env{'form.crsdom_'.$num};
  $record->{'number'} = $env{'form.crsnum_'.$num};   $record->{'number'} = $env{'form.crsnum_'.$num};
         my @role_ids;          my @role_ids;
Line 948  sub sort_users { Line 1154  sub sort_users {
 }  }
   
 sub access_setting_table {  sub access_setting_table {
     my ($r,$access_controls) = @_;      my ($r,$url,$filename,$access_controls,$action) = @_;
     my ($public,$publictext);      my ($public,$publictext);
     $publictext = &mt('Off');      $publictext ='Off';
     my ($guest,$guesttext);      my ($guest,$guesttext);
     $guesttext = &mt('Off');      $guesttext = 'Off';
     my @courses = ();      my @courses = ();
     my @groups = ();  
     my @domains = ();      my @domains = ();
     my @users = ();      my @users = ();
     my $now = time;      my $now = time;
     my $then = $now + (60*60*24*180); # six months approx.      my $then = $now + (60*60*24*180); # six months approx.
     my ($num,$scope,$publicnum,$guestnum);      my ($num,$scope,$publicnum,$guestnum);
     my (%acl_count,%end,%start);      my (%acl_count,%end,%start,%conditionals);
     foreach my $key (sort(keys(%{$access_controls}))) {      foreach my $key (sort(keys(%{$access_controls}))) {
         ($num,$scope,$end{$key},$start{$key}) = &unpack_acc_key($key);          ($num,$scope,$end{$key},$start{$key}) = &unpack_acc_key($key);
         if ($scope eq 'public') {          if ($scope eq 'public') {
Line 971  sub access_setting_table { Line 1176  sub access_setting_table {
             $guest=$key;              $guest=$key;
             $guestnum = $num;                $guestnum = $num;  
             $guesttext = &acl_status($start{$key},$end{$key},$now);              $guesttext = &acl_status($start{$key},$end{$key},$now);
         } elsif ($scope eq 'course') {          } else {
             push(@courses,$key);              $conditionals{$scope}{$key} = $$access_controls{$key};
         } elsif ($scope eq 'group') {              if ($scope eq 'course') {
             push(@groups,$key);                  push(@courses,$key);
         } elsif ($scope eq 'domains') {              } elsif ($scope eq 'domains') {
             push(@domains,$key);                  push(@domains,$key);
         } elsif ($scope eq 'users') {              } elsif ($scope eq 'users') {
             push(@users,$key);                  push(@users,$key);
               }
         }          }
         $acl_count{$scope} ++;          $acl_count{$scope} ++;
     }      }
     $r->print('<table border="0"><tr><td valign="top">');      $r->print('<table border="0"><tr><td valign="top">');
     $r->print('<h3>'.&mt('Public access:').' '.$publictext.'</h3>');      if ($action eq 'chgaccess') {
           &standard_settings($r,$now,$then,$url,$filename,\%acl_count,\%start,
                              \%end,$public,$publicnum,$publictext,$guest,$guestnum,
                              $guesttext,$access_controls,%conditionals);
       } else {
           &condition_setting($r,$access_controls,$now,$then,\%acl_count,
                              \@domains,\@users,\@courses);
       }
       $r->print('</td></tr></table>');
   }
   
   sub standard_settings {
       my ($r,$now,$then,$url,$filename,$acl_count,$start,$end,$public,$publicnum,
         $publictext,$guest,$guestnum,$guesttext,$access_controls,%conditionals)=@_;
       $r->print('<h3>'.&mt('Public access: [_1]',$publictext).'</h3>');
     $r->print(&Apache::loncommon::start_data_table());      $r->print(&Apache::loncommon::start_data_table());
     $r->print(&Apache::loncommon::start_data_table_header_row());      $r->print(&Apache::loncommon::start_data_table_header_row());
     $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').'</th>');      $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').'</th>');
Line 991  sub access_setting_table { Line 1211  sub access_setting_table {
     $r->print(&Apache::loncommon::start_data_table_row());      $r->print(&Apache::loncommon::start_data_table_row());
     if ($public) {      if ($public) {
         $r->print('<td>'.&actionbox('old',$publicnum,'public').'</td><td>'.          $r->print('<td>'.&actionbox('old',$publicnum,'public').'</td><td>'.
                   &dateboxes($publicnum,$start{$public},$end{$public}).'</td>');               &dateboxes($publicnum,$start->{$public},$end->{$public}).'</td>');
     } else {      } else {
         $r->print('<td>'.&actionbox('new','0','public').'</td><td>'.          $r->print('<td>'.&actionbox('new','0','public').'</td><td>'.
                   &dateboxes('0',$now,$then).'</td>');                    &dateboxes('0',$now,$then).'</td>');
Line 999  sub access_setting_table { Line 1219  sub access_setting_table {
     $r->print(&Apache::loncommon::end_data_table_row());      $r->print(&Apache::loncommon::end_data_table_row());
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table());
     $r->print('</td><td width="40">&nbsp;</td><td valign="top">');      $r->print('</td><td width="40">&nbsp;</td><td valign="top">');
     $r->print('<h3>'.&mt('Passphrase-protected access:').' '.$guesttext.'</h3>');      $r->print('<h3>'.&mt('Passphrase-protected access: [_1]',$guesttext).'</h3>');
     $r->print(&Apache::loncommon::start_data_table());      $r->print(&Apache::loncommon::start_data_table());
     $r->print(&Apache::loncommon::start_data_table_header_row());      $r->print(&Apache::loncommon::start_data_table_header_row());
     $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').      $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').
Line 1010  sub access_setting_table { Line 1230  sub access_setting_table {
     if ($guest) {      if ($guest) {
         $passwd = $$access_controls{$guest}{'password'};          $passwd = $$access_controls{$guest}{'password'};
         $r->print('<td>'.&actionbox('old',$guestnum,'guest').'</td><td>'.          $r->print('<td>'.&actionbox('old',$guestnum,'guest').'</td><td>'.
                   &dateboxes($guestnum,$start{$guest},$end{$guest}).'</td>');                &dateboxes($guestnum,$start->{$guest},$end->{$guest}).'</td>');
     } else {      } else {
         $r->print('<td>'.&actionbox('new','1','guest').'</td><td>'.          $r->print('<td>'.&actionbox('new','1','guest').'</td><td>'.
                   &dateboxes('1',$now,$then).'</td>');                    &dateboxes('1',$now,$then).'</td>');
Line 1019  sub access_setting_table { Line 1239  sub access_setting_table {
               $passwd.'" /></td>');                $passwd.'" /></td>');
     $r->print(&Apache::loncommon::end_data_table_row());      $r->print(&Apache::loncommon::end_data_table_row());
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table());
     $r->print('</td></tr><tr><td colspan="3">&nbsp;</td></tr><tr><td valign="top">');      $r->print('</td></tr><tr><td colspan="3">&nbsp;</td></tr>'.
     &access_element($r,'domains',\%acl_count,\@domains,$access_controls,$now,$then);                '<tr><td colspan="3">');
       my $numconditionals = 0;
       my $conditionstext;
       my %cond_status;
       foreach my $scope ('domains','users','course') {
           $numconditionals += $acl_count->{$scope}; 
           if ($acl_count->{$scope} > 0) {
               if ($conditionstext ne 'Active') { 
                   foreach my $key (keys(%{$conditionals{$scope}})) {
                       $conditionstext = &acl_status($start->{$key},$end->{$key},$now);
                       if ($conditionstext eq 'Active') {
                          last;
                       }
                   }
               }
           }
       }
       if ($conditionstext eq '') {
           $conditionstext = 'Off';
       }
       my %anchor_fields = (
               'access' => $env{'form.selectfile'},
               'action' => 'chgconditions',
               'currentpath' => $env{'form.currentpath'},
           );
       $r->print('<h3>'.&mt('Conditional access: [_1]',$conditionstext).'</h3>');
       if ($numconditionals > 0) {
           my $count = 1;
           my $chg = 'none';
           $r->print(&mt('You have previously set [_1] conditional access controls.',$numconditionals).' '.&make_anchor($url,\%anchor_fields,&mt('Change Conditions')).'<br /><br />');
           $r->print(&Apache::loncommon::start_data_table());
           $r->print(&Apache::loncommon::start_data_table_header_row());
           $r->print('<th>'.&mt('Access control').'</th><th>'.&mt('Dates available').
                     '</th><th>'.&mt('Additional information').'</th>');
           $r->print(&Apache::loncommon::end_data_table_header_row());
           &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.'));
       }
   }
   
   sub condition_setting {
       my ($r,$access_controls,$now,$then,$acl_count,$domains,$users,$courses) = @_;
       $r->print('<tr><td valign="top">');
       &access_element($r,'domains',$acl_count,$domains,$access_controls,$now,$then);
     $r->print('</td><td>&nbsp;</td><td valign="top">');      $r->print('</td><td>&nbsp;</td><td valign="top">');
     &access_element($r,'users',\%acl_count,\@users,$access_controls,$now,$then);      &access_element($r,'users',$acl_count,$users,$access_controls,$now,$then);
     $r->print('</td></tr><tr><td colspan="3"></td></tr><tr>');      $r->print('</td></tr><tr><td colspan="3"></td></tr><tr>');
     if (@courses > 0 || @groups > 0) {      if ($acl_count->{course} > 0) {
         $r->print('<td colspan="3" valign="top">');          $r->print('<td colspan="3" valign="top">');
     } else {      } else {
         $r->print('<td valign="top">');          $r->print('<td valign="top">');
     }      }
     &access_element($r,'course',\%acl_count,\@courses,$access_controls,$now,$then);      &access_element($r,'course',$acl_count,$courses,$access_controls,$now,$then);
     $r->print('</td>');      $r->print('</td>');
     if (@courses > 0 || @groups > 0) {  
         $r->print('</tr><tr><td colspan="3">&nbsp;</td></tr><tr><td colspan="3" valign="top">');  
     } else {  
         $r->print('<td>&nbsp;</td><td valign="top">');  
     }  
     &access_element($r,'group',\%acl_count,\@groups,$access_controls,$now,$then);  
     $r->print('</td></tr></table>');      $r->print('</td></tr></table>');
 }  }
   
 sub acl_status {  sub acl_status {
     my ($start,$end,$now) = @_;      my ($start,$end,$now) = @_;
     if ($start > $now) {      if ($start > $now) {
         return &mt('Inactive');          return 'Inactive';
     }      }
     if ($end && $end<$now) {      if ($end && $end<$now) {
         return &mt('Inactive');          return 'Inactive';
     }      }
     return &mt('Active');      return 'Active';
 }  }
   
 sub access_element {  sub access_element {
Line 1083  sub display_access_row { Line 1342  sub display_access_row {
         $r->print(&Apache::loncommon::start_data_table_header_row());          $r->print(&Apache::loncommon::start_data_table_header_row());
         $r->print('<th>'.&mt('Action?').'</th><th>'.&mt($uctype).'</th><th>'.          $r->print('<th>'.&mt('Action?').'</th><th>'.&mt($uctype).'</th><th>'.
               &mt('Dates available').'</th>');                &mt('Dates available').'</th>');
         if (($type eq 'course') || ($type eq 'group')) {          if ($type eq 'course' && $status eq 'old') {
             $r->print('<th>'.&mt('Allowed [_1] member affiliations',$type).              $r->print('<th>'.&mt('Allowed [_1] member affiliations',$type).
                       '</th>');                        '</th>');
             $colspan ++;              $colspan ++;
Line 1093  sub display_access_row { Line 1352  sub display_access_row {
         $r->print(&Apache::loncommon::end_data_table_header_row());          $r->print(&Apache::loncommon::end_data_table_header_row());
         foreach my $key (@{$items}) {          foreach my $key (@{$items}) {
     $r->print(&Apache::loncommon::start_data_table_row());      $r->print(&Apache::loncommon::start_data_table_row());
             if (($type eq 'course') || ($type eq 'group')) {              if ($type eq 'course') {
                 &course_row($r,$status,$type,$key,$access_controls,$now,$then);                  &course_row($r,$status,$type,$key,$access_controls,$now,$then);
             } elsif ($type eq 'domains') {              } elsif ($type eq 'domains') {
                 &domains_row($r,$status,$key,\@all_doms,$access_controls,$now,                  &domains_row($r,$status,$key,\@all_doms,$access_controls,$now,
Line 1120  sub display_access_row { Line 1379  sub display_access_row {
 sub course_js {  sub course_js {
     return qq|      return qq|
 <script type="text/javascript">  <script type="text/javascript">
 function setRoleOptions(caller,num,cdom,cnum,type) {  function setRoleOptions(num,roleid,cdom,cnum,type) {
     addIndexnum = getCallerIndex(caller);      updateIndexNum = getIndexByValue('update',num);
     updateIndexnum = getIndex('update',num);      var addItem = 'add_role_'+num;
     if (caller.checked) {      var addIndexNum = getIndexByName(addItem);
         document.portform.elements[updateIndexnum].checked = true;      if (document.portform.elements[addItem].checked) {
         var url = '/adm/portfolio?action=rolepicker&setroles='+addIndexnum+'&cnum='+cnum+'&cdom='+cdom+'&type='+type;          document.portform.elements[updateIndexNum].checked = true;
           var url = '/adm/portfolio?action=rolepicker&setroles='+num+'_'+roleid+'&cnum='+cnum+'&cdom='+cdom+'&type='+type;
         var title = 'Roles_Chooser';          var title = 'Roles_Chooser';
         var options = 'scrollbars=1,resizable=1,menubar=0';          var options = 'scrollbars=1,resizable=1,menubar=0';
         options += ',width=700,height=600';          options += ',width=700,height=600';
         rolebrowser = open(url,title,options,'1');          rolebrowser = open(url,title,options,'1');
         rolebrowser.focus();          rolebrowser.focus();
     } else {      } else {
         for (var j=0;j<5;j++) {          addArray = new Array ('role','access','section','group');
             document.portform.elements[addIndexnum+j].value = '';          for (var j=0;j<addArray.length;j++) {
               var itemIndex = getIndexByName(addArray[j]+'_'+num+'_'+roleid);
               document.portform.elements[itemIndex].value = '';
         }          }
     }      }
 }  }
   
 function getCallerIndex(caller) {  function getIndexByName(item) {
     for (var i=0;i<document.portform.elements.length;i++) {      for (var i=0;i<document.portform.elements.length;i++) {
         if (document.portform.elements[i] == caller) {          if (document.portform.elements[i].name == item) {
             return i;              return i;
         }          }
     }      }
     return -1;      return -1;
 }  }
   
 function getIndex(name,value) {  function getIndexByValue(name,value) {
     for (var i=0;i<document.portform.elements.length;i++) {      for (var i=0;i<document.portform.elements.length;i++) {
         if (document.portform.elements[i].name == name && document.portform.elements[i].value == value) {          if (document.portform.elements[i].name == name && document.portform.elements[i].value == value) {
             return i;              return i;
Line 1170  sub course_row { Line 1432  sub course_row {
     }      }
     my $js = &Apache::loncommon::coursebrowser_javascript($defdom)      my $js = &Apache::loncommon::coursebrowser_javascript($defdom)
  .&course_js();   .&course_js();
     my $crsgrptext = 'Groups';  
     if ($type eq 'group') {  
         $crsgrptext = 'Teams';  
     }  
     my $uctype = $type;      my $uctype = $type;
     $uctype =~ s/^(\w)/uc($1)/e;      $uctype =~ s/^(\w)/uc($1)/e;
     my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,      my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
Line 1184  sub course_row { Line 1442  sub course_row {
         my %course_description = &Apache::lonnet::coursedescription($cid);          my %course_description = &Apache::lonnet::coursedescription($cid);
         $r->print('<td><input type="hidden" name="crsdom_'.$num.'" value="'.$content->{'domain'}.'" /><input type="hidden" name="crsnum_'.$num.'" value="'.$content->{'number'}.'" />'.$course_description{'description'}.'</td>');          $r->print('<td><input type="hidden" name="crsdom_'.$num.'" value="'.$content->{'domain'}.'" /><input type="hidden" name="crsnum_'.$num.'" value="'.$content->{'number'}.'" />'.$course_description{'description'}.'</td>');
     } elsif ($status eq 'new') {      } elsif ($status eq 'new') {
         $r->print('<td>'.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,undef,undef,$uctype).'&nbsp;&nbsp;<input type="text" name="description_'.$num.'" size="30" /><input type="hidden" name="crsdom_'.$num.'" /><input type="hidden" name="crsnum_'.$num.'" /></td>');          $r->print('<td>'.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,$num.'_1',undef,$uctype).'&nbsp;&nbsp;<input type="text" name="description_'.$num.'" size="30" /><input type="hidden" name="crsdom_'.$num.'" /><input type="hidden" name="crsnum_'.$num.'" /></td>');
     }      }
     $r->print('<td>'.&dateboxes($num,$start,$end).'</td>');      $r->print('<td>'.&dateboxes($num,$start,$end));
     $r->print('<td><table><tr>');      my $newrole_id = 1;
     $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Roles').'</th><th>'.  
               &mt('Access').'</th><th>'.&mt('Sections').'</th><th>'.  
               &mt($crsgrptext).'</th></tr>');  
     if ($status eq 'old') {      if ($status eq 'old') {
           $r->print('</td><td>');
         my $max_id = 0;          my $max_id = 0;
         foreach my $role_id (sort(keys(%{$content->{'roles'}}))) {          if (keys(%{$content->{'roles'}}) > 0) {
             if ($role_id > $max_id) {              $r->print('<table><tr><th>'.&mt('Action').'</th>'.
                 $max_id = $role_id;                        '<th>'.&mt('Roles').'</th>'.
             }                        '<th>'.&mt('Access').'</th>'.
             $max_id ++;                        '<th>'.&mt('Sections').'</th>'.
             my $role_selects = &role_selectors($num,$role_id,$status,$type,$content,'display');                        '<th>'.&mt('Groups').'</th></tr>');
             $r->print('<tr><td><span style="white-space: nowrap"><label><input type="checkbox" name="delete_role_'.$num.'" value="'.$role_id.'" />'.&mt('Delete').'</label></span><br /><input type="hidden" name="preserve_role_'.$num.'" value="'.$role_id.'" /></td>'.$role_selects.'</tr>');              foreach my $role_id (sort(keys(%{$content->{'roles'}}))) {
         }                  if ($role_id > $max_id) {
         $r->print('</table><br />'.&mt('Add a roles-based condition').'&nbsp;<input type="checkbox" name ="add_role_'.$num.'" onClick="javascript:setRoleOptions(this,'."'$num','$content->{'domain'}','$content->{'number'}','$uctype'".')" value="'.$max_id.'" /><input type="hidden" name="role_'.$num.'_'.$max_id.'" /><input type="hidden" name="access_'.$num.'_'.$max_id.'" /><input type="hidden" name="section_'.$num.'_'.$max_id.'" /><input type="hidden" name="group_'.$num.'_'.$max_id.'" /></td>');                      $max_id = $role_id;
     } elsif ($status eq 'new') {                  }
         my $role_id = 1;                  $max_id ++;
         my $role_selects = &role_selectors($num,$role_id,$status,$type,undef,'display');                  my $role_selects = &role_selectors($num,$role_id,$type,$content,'display');
         $r->print('<tr><td><input type="checkbox" name="add_role_'.$num.'" value="'.$role_id.'" checked="checked" />'.&mt('Add').'<input type="hidden" name="grplist_'.$num.'_'.$role_id.'" /></td>'.$role_selects);                  $r->print('<tr><td><span style="white-space: nowrap"><label><input type="checkbox" name="delete_role_'.$num.'" value="'.$role_id.'" />'.&mt('Delete').'</label></span><br /><input type="hidden" name="preserve_role_'.$num.'" value="'.$role_id.'" /></td>'.$role_selects.'</tr>');
         $r->print('</tr></table></td>');              }
               $r->print('</table>');
           }
           $r->print('<br />'.&mt('Add a roles-based condition').
                     '&nbsp;<input type="checkbox" name ="add_role_'.
                     $num.'" onClick="javascript:setRoleOptions('."'$num',
                     '$max_id','$content->{'domain'}','$content->{'number'}',
                     '$uctype'".')" value="" />');
           $newrole_id = $max_id;
       } else {
           $r->print('<input type="hidden" name ="add_role_'.$num.'" value="" />');
     }      }
       $r->print(&add_course_role($num,$newrole_id));
       $r->print('</td>');
     return;      return;
 }  }
   
   sub add_course_role {
       my ($num,$max_id) = @_;
       my $output;
       $output .='<input type="hidden" name="role_'.$num.'_'.$max_id.'" />'.
                 '<input type="hidden" name="access_'.$num.'_'.$max_id.'" />'.
                 '<input type="hidden" name="section_'.$num.'_'.$max_id.'" />'.
                 '<input type="hidden" name="group_'.$num.'_'.$max_id.'" />';
       return $output;
   }
   
 sub domains_row {  sub domains_row {
     my ($r,$status,$item,$all_doms,$access_controls,$now,$then) = @_;      my ($r,$status,$item,$all_doms,$access_controls,$now,$then) = @_;
     my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,      my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
Line 1260  sub actionbox { Line 1538  sub actionbox {
     my ($status,$num,$scope) = @_;      my ($status,$num,$scope) = @_;
     my $output = '<span style="white-space: nowrap"><label>';      my $output = '<span style="white-space: nowrap"><label>';
     if ($status eq 'new') {      if ($status eq 'new') {
         $output .= '<input type="checkbox" name="activate" value="'.$num.'" />'.          my $checkstate;
           if ($scope eq 'domains' || $scope eq 'users' || $scope eq 'course') {
               $checkstate = 'checked="checked"';
           }
           $output .= '<input type="checkbox" name="activate" value="'.$num.'" '.
                      $checkstate.'  />'.
         &mt('Activate');          &mt('Activate');
     } else {      } else {
         $output .= '<input type="checkbox" name="delete" value="'.$num.          $output .= '<input type="checkbox" name="delete" value="'.$num.
Line 1308  sub set_identifiers { Line 1591  sub set_identifiers {
 }   } 
   
 sub role_selectors {  sub role_selectors {
     my ($num,$role_id,$status,$type,$content,$caller) = @_;      my ($num,$role_id,$type,$content,$caller) = @_;
     my ($output,$cdom,$cnum,$longid);      my ($output,$cdom,$cnum,$longid);
     if ($caller eq 'display') {      if ($caller eq 'display') {
         $longid = '_'.$num.'_'.$role_id;          $longid = '_'.$num.'_'.$role_id;
         if ($status eq 'new') {          $cdom = $$content{'domain'};
             foreach my $item ('role','access','section','group') {          $cnum = $$content{'number'};
                 $output .= '<td><select name="'.$item.$longid.'">'.  
                            '<option value="">'.&mt('Pick [_1] first',$type).  
                            '</option></select></td>';  
             }  
             return $output;  
         } else {  
             $cdom = $$content{'domain'};  
             $cnum = $$content{'number'};  
         }  
     } elsif ($caller eq 'rolepicker') {      } elsif ($caller eq 'rolepicker') {
          $cdom = $env{'form.cdom'};           $cdom = $env{'form.cdom'};
          $cnum = $env{'form.cnum'};           $cnum = $env{'form.cnum'};
Line 1360  sub role_selectors { Line 1634  sub role_selectors {
                     'role' => $allroles,                      'role' => $allroles,
                     'access' => \@allaccesses,                      'access' => \@allaccesses,
                     'section' => $sections,                      'section' => $sections,
                     'group' => $groups,                       'group' => $groups,
                    );                     );
     foreach my $item ('role','access','section','group') {      foreach my $item ('role','access','section','group') {
         $output .= '<td><select name="'.$item.$longid.'" multiple="true" size="4">'."\n";          $output .= '<td><select name="'.$item.$longid.'" multiple="true" size="4">'."\n";
Line 1384  sub role_selectors { Line 1658  sub role_selectors {
   
 sub role_options_window {  sub role_options_window {
     my ($r) = @_;      my ($r) = @_;
     my $cdom = $env{'form.cdom'};  
     my $cnum = $env{'form.cnum'};  
     my $type = $env{'form.type'};      my $type = $env{'form.type'};
     my $addindex = $env{'form.setroles'};      my $rolenum = $env{'form.setroles'};
     my $grouptitle = 'Groups';      my ($num,$role_id) = ($rolenum =~ /^([\d_]+)_(\d+)$/);
     if ($type eq 'Group') {      my $role_elements;
          $grouptitle = 'Teams';      foreach my $item ('role','access','section','group') {
     }           $role_elements .= "'".$item.'_'.$rolenum."',";
     my $role_selects = &role_selectors(1,1,'new',$type,undef,'rolepicker');      }
       $role_elements =~ s/,$//; 
       my $role_selects = &role_selectors($num,$role_id,$type,undef,
                                          'rolepicker');
     $r->print(<<"END_SCRIPT");      $r->print(<<"END_SCRIPT");
 <script type="text/javascript">  <script type="text/javascript">
 function setRoles() {  function setRoles() {
     var addidx = $addindex+1;      var role_elements = new Array($role_elements);
     for (var i=0; i<4; i++) {      for (var i=0; i<role_elements.length; i++) {
         var copylist = '';          var copylist = '';
         for (var j=0; j<document.rolepicker.elements[i].length; j++) {          for (var j=0; j<document.rolepicker.elements[i].length; j++) {
             if (document.rolepicker.elements[i].options[j].selected) {              if (document.rolepicker.elements[i].options[j].selected) {
Line 1405  function setRoles() { Line 1680  function setRoles() {
             }              }
         }          }
         copylist = copylist.substr(0,copylist.length-1);          copylist = copylist.substr(0,copylist.length-1);
         opener.document.portform.elements[addidx+i].value = copylist;          var openerItem = getIndexByName(role_elements[i]);
           opener.document.portform.elements[openerItem].value = copylist; 
     }      }
       var roleAdder = getIndexByName('add_role_$num');
       opener.document.portform.elements[roleAdder].value = '$role_id';
     self.close();      self.close();
 }  }
   
   function getIndexByName(item) {
       for (var i=0;i<opener.document.portform.elements.length;i++) {
           if (opener.document.portform.elements[i].name == item) {
               return i;
           }
       }
       return -1;
   }
   
 </script>  </script>
 END_SCRIPT  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('Select roles, course status, section(s) and group(s) for users who will be able to access the portfolio file.'));
     $r->print('<form name="rolepicker" action="/adm/portfolio" method="post"><table><tr><th>'.&mt('Roles').'</th><th>'.&mt('[_1] status',$type).'</th><th>'.&mt('Sections').'</th><th>'.&mt($grouptitle).'</th></tr><tr>'.$role_selects.'</tr></table><br /><input type="button" name="rolepickbutton" value="Save selections" onclick="setRoles()" />');      $r->print('<form name="rolepicker" action="/adm/portfolio" method="post"><table><tr><th>'.&mt('Roles').'</th><th>'.&mt('[_1] status',$type).'</th><th>'.&mt('Sections').'</th><th>'.&mt('Groups').'</th></tr><tr>'.$role_selects.'</tr></table><br /><input type="button" name="rolepickbutton" value="Save selections" onclick="setRoles()" />');
     return;      return;
 }  }
   
 sub select_files {  sub select_files {
     my ($r,$group) = @_;      my ($r) = @_;
     if ($env{'form.continue'} eq 'true') {      if ($env{'form.continue'} eq 'true') {
         # here we update the selections for the currentpath          # here we update the selections for the currentpath
         # eventually, have to handle removing those not checked, but . . .           # eventually, have to handle removing those not checked, but . . . 
Line 1461  ENDSMP Line 1749  ENDSMP
  }   }
     }      }
 }  }
   
 sub upload {  sub upload {
     my ($r,$url,$group)=@_;      my ($r,$url,$group)=@_;
     my $fname=$env{'form.uploaddoc.filename'};      my $fname=$env{'form.uploaddoc.filename'};
     my $filesize = (length($env{'form.uploaddoc'})) / 1000; #express in k (1024?)      my $filesize = (length($env{'form.uploaddoc'})) / 1000; #express in k (1024?)
     my $disk_quota = 20000; # expressed in k      my $disk_quota = &get_quota($group);
     if (defined($group)) {  
         my $grp_quota = &get_group_quota($group); # quota expressed in k   
         if ($grp_quota ne '') {  
             $disk_quota = $grp_quota;  
         } else {  
             $disk_quota = 0;  
         }  
     }  
     $fname=&Apache::lonnet::clean_filename($fname);      $fname=&Apache::lonnet::clean_filename($fname);
   
     my $portfolio_root=&get_portfolio_root($group);      my $portfolio_root=&get_portfolio_root();
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
     # Fixme --- Move the checking for existing file to LOND error return      # Fixme --- Move the checking for existing file to LOND error return
     my @dir_list=&get_dir_list($portfolio_root,$group);      my @dir_list=&get_dir_list($portfolio_root);
     my $found_file = 0;      my $found_file = 0;
     my $locked_file = 0;      my $locked_file = 0;
     foreach my $line (@dir_list) {      foreach my $line (@dir_list) {
         my ($file_name)=split(/\&/,$line,2);          my ($file_name)=split(/\&/,$line,2);
         if ($file_name eq $fname){          if ($file_name eq $fname){
             $file_name = $env{'form.currentpath'}.$file_name;              $file_name = $env{'form.currentpath'}.$file_name;
             $file_name = &prepend_group($file_name,$group);              $file_name = &prepend_group($file_name);
             $found_file = 1;              $found_file = 1;
             if (defined($group)) {  
                 $file_name = $group.'/'.$file_name;  
             }  
             if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {              if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
                 $locked_file = 1;                  $locked_file = 1;
             }               } 
Line 1528  sub upload { Line 1806  sub upload {
   
 sub lock_info {  sub lock_info {
     my ($r,$url,$group) = @_;      my ($r,$url,$group) = @_;
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,      my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom,
                                                                        $uname);                                                                         $uname);
     my $file_name = $env{'form.lockinfo'};      my $file_name = $env{'form.lockinfo'};
     $file_name = &prepend_group($file_name,$group);      $file_name = &prepend_group($file_name);
     if (defined($file_name) && defined($$current_permissions{$file_name})) {      if (defined($file_name) && defined($$current_permissions{$file_name})) {
         foreach my $array_item (@{$$current_permissions{$file_name}}) {          foreach my $array_item (@{$$current_permissions{$file_name}}) {
             if (ref($array_item) eq 'ARRAY') {              next if (ref($array_item) ne 'ARRAY');
                 my $filetext;  
                 if (defined($group)) {      my $filetext;
                     $filetext = '<strong>'.$env{'form.lockinfo'}.      if (defined($group)) {
                                     '</strong> (group: '.$group.')';    $filetext = '<strong>'.$env{'form.lockinfo'}.
                 } else {      '</strong> (group: '.$group.')'; 
                     $filetext = '<strong>'.$file_name.'</strong>';      } else {
                 }    $filetext = '<strong>'.$file_name.'</strong>';
                 $r->print(&mt('[_1] was submitted in response to problem: ',      } 
                               $filetext).      
                           '<strong>'.&Apache::lonnet::gettitle($$array_item[0]).      my $title ='<strong>'.&Apache::lonnet::gettitle($$array_item[0]).
                           '</strong><br />');   '</strong><br />';
                 my %course_description = &Apache::lonnet::coursedescription($$array_item[1]);      if ($$array_item[-1] eq 'graded') {
                 $r->print(&mt('In the course: <strong>[_1]</strong><br />',   $r->print(&mt('[_1] was submitted in response to problem: [_2]',
                               $course_description{'description'}));                                $filetext,$title));
                 # $r->print('the third is '.$$array_item[2].'<br>');      } elsif ($$array_item[-1] eq 'handback') {
                 # $r->print("item is $$array_item[0]<br> and $$array_item[0]");   $r->print(&mt('[_1] was handed back in response to problem: [_2]',
             }                                $filetext,$title));
       } else {
    # submission style lock
    $r->print(&mt('[_1] was submitted in response to problem: [_2]',
                                 $filetext,$title));
       }
       my %course_description = 
    &Apache::lonnet::coursedescription($$array_item[1]);
       if ( $course_description{'description'} ne '') {
    $r->print(&mt('In the course: <strong>[_1]</strong><br />',
         $course_description{'description'}));
       }
         }          }
     }      }
     $r->print(&done('Back',$url));      $r->print(&done('Back',$url));
     return 'ok';      return 'ok';
 }  }
   
 sub createdir {  sub createdir {
     my ($r,$url,$group)=@_;      my ($r,$url)=@_;
     my $newdir=&Apache::lonnet::clean_filename($env{'form.newdir'});      my $newdir=&Apache::lonnet::clean_filename($env{'form.newdir'});
     if ($newdir eq '') {      if ($newdir eq '') {
     $r->print('<span class="LC_error">'.      $r->print('<span class="LC_error">'.
       &mt("Error: no directory name was provided.").        &mt("Error: no directory name was provided.").
       '</span><br />');        '</span><br />');
     $r->print(&done(undef,$url,$group));      $r->print(&done(undef,$url));
     return;      return;
     }      }
     my $portfolio_root = &get_portfolio_root($group);       my $portfolio_root = &get_portfolio_root(); 
     my @dir_list=&get_dir_list($portfolio_root,$group);      my @dir_list=&get_dir_list($portfolio_root);
     my $found_file = 0;      my $found_file = 0;
     foreach my $line (@dir_list) {      foreach my $line (@dir_list) {
         my ($filename)=split(/\&/,$line,2);          my ($filename)=split(/\&/,$line,2);
Line 1581  sub createdir { Line 1871  sub createdir {
        $r->print('<span class="LC_error">'.'Unable to create a directory named <strong>'.$newdir.         $r->print('<span class="LC_error">'.'Unable to create a directory named <strong>'.$newdir.
                ' </strong>a file or directory by that name already exists.</span><br />');                 ' </strong>a file or directory by that name already exists.</span><br />');
     } else {      } else {
         my ($uname,$udom) = &get_name_dom($group);          my ($uname,$udom) = &get_name_dom();
         my $port_path = &get_port_path($group);          my $port_path = &get_port_path();
         my $result=&Apache::lonnet::mkdiruserfile($uname,$udom,          my $result=&Apache::lonnet::mkdiruserfile($uname,$udom,
          $port_path.$env{'form.currentpath'}.$newdir);           $port_path.$env{'form.currentpath'}.$newdir);
         if ($result ne 'ok') {          if ($result ne 'ok') {
Line 1597  sub createdir { Line 1887  sub createdir {
 }  }
   
 sub get_portfolio_root {  sub get_portfolio_root {
     my ($group) = @_;      my ($udom,$uname,$group) = @_;
     my ($uname,$udom) = &get_name_dom($group);      if (!(defined($udom)) || !(defined($uname))) {
     my $path;          ($uname,$udom) = &get_name_dom();
       }
       my $path = '/userfiles/portfolio';
       if (!defined($group)) { 
           if (defined($env{'form.group'})) {
               $group = $env{'form.group'};      
           }
       }
     if (defined($group)) {      if (defined($group)) {
         $path = '/userfiles/groups/'.$group.'/portfolio';          $path = '/userfiles/groups/'.$group.'/portfolio';
     } else {      } 
         $path = '/userfiles/portfolio';  
     }  
     return (&Apache::loncommon::propath($udom,$uname).$path);      return (&Apache::loncommon::propath($udom,$uname).$path);
 }  }
   
Line 1626  sub get_group_quota { Line 1921  sub get_group_quota {
 }   } 
   
 sub get_dir_list {  sub get_dir_list {
     my ($portfolio_root,$group) = @_;      my ($portfolio_root) = @_;
     my ($uname,$udom) = &get_name_dom($group);      my ($uname,$udom) = &get_name_dom();
     return &Apache::lonnet::dirlist($env{'form.currentpath'},      return &Apache::lonnet::dirlist($env{'form.currentpath'},
                                           $udom,$uname,$portfolio_root);                                            $udom,$uname,$portfolio_root);
 }  }
   
 sub get_name_dom {  sub get_name_dom {
     my ($group) = @_;  
     my ($uname,$udom);      my ($uname,$udom);
     if (defined($group)) {      if (defined($env{'form.group'})) {
         $udom = $env{'course.'.$env{'request.course.id'}.'.domain'};          $udom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         $uname = $env{'course.'.$env{'request.course.id'}.'.num'};          $uname = $env{'course.'.$env{'request.course.id'}.'.num'};
     } else {      } else {
Line 1646  sub get_name_dom { Line 1940  sub get_name_dom {
 }  }
   
 sub prepend_group {  sub prepend_group {
     my ($filename,$group) = @_;      my ($filename) = @_;
     if (defined($group)) {      if (defined($env{'form.group'})) {
         $filename = $group.$filename;          $filename = $env{'form.group'}.$filename;
     }      }
     return $filename;      return $filename;
 }  }
   
 sub get_namespace {  sub get_namespace {
     my ($group) = @_;  
     my $namespace = 'portfolio';      my $namespace = 'portfolio';
     if (defined($group)) {      if (defined($env{'form.group'})) {
         my ($uname,$udom) = &get_name_dom($group);          my ($uname,$udom) = &get_name_dom();
         $namespace .= '_'.$udom.'_'.$uname.'_'.$group;          $namespace .= '_'.$udom.'_'.$uname.'_'.$env{'form.group'};
     }      }
     return $namespace;      return $namespace;
 }  }
   
 sub get_port_path {  sub get_port_path {
     my ($group) = @_;  
     my $port_path;      my $port_path;
     if (defined($group)) {      if (defined($env{'form.group'})) {
        $port_path = "groups/$group/portfolio";         $port_path = "groups/$env{'form.group'}/portfolio";
     } else {      } else {
        $port_path = 'portfolio';         $port_path = 'portfolio';
     }      }
Line 1675  sub get_port_path { Line 1967  sub get_port_path {
 }  }
   
 sub missing_priv {  sub missing_priv {
     my ($r,$url,$priv,$group) = @_;      my ($r,$url,$priv) = @_;
     my $longtext = {      my $longtext = {
                       upload => 'upload files',                        upload => 'upload files',
                       delete => 'delete files',                        delete => 'delete files',
Line 1693  sub missing_priv { Line 1985  sub missing_priv {
     $r->print(&mt('<h3>Action disallowed</h3>'));      $r->print(&mt('<h3>Action disallowed</h3>'));
     $r->print(&mt('You do not have sufficient privileges to [_1] ',      $r->print(&mt('You do not have sufficient privileges to [_1] ',
                   $longtext->{$priv}));                    $longtext->{$priv}));
     if ($group) {      if (defined($env{'form.group'})) {
         $r->print(&mt("in the group's file repository."));          $r->print(&mt("in the group's file repository."));
         $rtnlink .= &group_args()          $rtnlink .= &group_args()
     } else {      } else {
Line 1717  sub coursegrp_portfolio_header { Line 2009  sub coursegrp_portfolio_header {
               title=>"Course Groups"});                title=>"Course Groups"});
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/$cdom/$cnum/$group/smppg?ref=$env{'form.ref'}",          ({href=>"/adm/$cdom/$cnum/$env{'form.group'}/smppg?ref=$env{'form.ref'}",
           text=>"$ucgpterm: $grp_desc",            text=>"$ucgpterm: $grp_desc",
           title=>"Go to group's home page"},            title=>"Go to group's home page"},
          {href=>"/adm/coursegrp_portfolio?".&group_args(),           {href=>"/adm/coursegrp_portfolio?".&group_args(),
Line 1728  sub coursegrp_portfolio_header { Line 2020  sub coursegrp_portfolio_header {
     return $output;      return $output;
 }  }
   
   sub get_quota {
       my ($group) = @_;
       my $disk_quota;
       if (defined($group)) {
           my $grp_quota = &get_group_quota($group); # quota expressed in k
           if ($grp_quota ne '') {
               $disk_quota = $grp_quota;
           } else {
               $disk_quota = 0;
           }
       } else {
           $disk_quota = &Apache::loncommon::get_user_quota($env{'user.name'},
                                       $env{'user.domain'}); #expressed in Mb
           $disk_quota = 1000 * $disk_quota; # convert from Mb to kb
       }
       return $disk_quota;
   }
   
 sub handler {  sub handler {
     # this handles file management      # this handles file management
Line 1736  sub handler { Line 2045  sub handler {
          ['selectfile','currentpath','meta','lockinfo','currentfile','action',           ['selectfile','currentpath','meta','lockinfo','currentfile','action',
   'fieldname','mode','rename','continue','group','access','setnum',    'fieldname','mode','rename','continue','group','access','setnum',
           'cnum','cdom','type','setroles','showversions','ref']);            'cnum','cdom','type','setroles','showversions','ref']);
     my ($uname,$udom,$portfolio_root,$url,$group,$caller,$title,$grp_desc);      my ($uname,$udom,$portfolio_root,$url,$caller,$title,$group,$grp_desc);
     if ($r->uri =~ m|^(/adm/)([^/]+)|) {      if ($r->uri =~ m|^(/adm/)([^/]+)|) {
         $url = $1.$2;          $url = $1.$2;
         $caller = $2;          $caller = $2;
Line 1754  sub handler { Line 2063  sub handler {
         my $view_permission =           my $view_permission = 
            &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));             &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
         $env{'form.group'} =~ s/\W//g;          $env{'form.group'} =~ s/\W//g;
  my $group = $env{'form.group'};   $group = $env{'form.group'};
         if ($group) {          if ($group) {
             ($uname,$udom) = &get_name_dom($group);              ($uname,$udom) = &get_name_dom();
             my %curr_groups = &Apache::longroup::coursegroups($udom,$uname,              my %curr_groups = &Apache::longroup::coursegroups($udom,$uname,
        $group);          $group); 
             if (%curr_groups) {              if (%curr_groups) {
Line 1765  sub handler { Line 2074  sub handler {
                 $grp_desc = &unescape($grp_content{'description'});                  $grp_desc = &unescape($grp_content{'description'});
                 if (($view_permission) || (&Apache::lonnet::allowed('rgf',                  if (($view_permission) || (&Apache::lonnet::allowed('rgf',
                                       $env{'request.course.id'}.'/'.$group))) {                                        $env{'request.course.id'}.'/'.$group))) {
                     $portfolio_root = &get_portfolio_root($group);                      $portfolio_root = &get_portfolio_root();
                 } else {                  } else {
                     $r->print('You do not have the privileges required to access the shared files space for this group.');                      $r->print('You do not have the privileges required to access the shared files space for this group.');
                     $earlyout = 1;                      $earlyout = 1;
Line 1809  sub handler { Line 2118  sub handler {
         $can_setacl = 1;          $can_setacl = 1;
     }      }
   
     my $port_path = &get_port_path($group);      my $port_path = &get_port_path();
     &Apache::loncommon::no_cache($r);      &Apache::loncommon::no_cache($r);
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
Line 1824  sub handler { Line 2133  sub handler {
         $r->print(&Apache::loncommon::start_page($title));          $r->print(&Apache::loncommon::start_page($title));
     }      }
     $r->rflush();      $r->rflush();
       my ($blocked,$blocktext) = 
           &Apache::loncommon::blocking_status('port',$uname,$udom);
       if ($blocked) {
            $r->print($blocktext);
            $r->print(&Apache::loncommon::end_page());
            return OK;
       }
  if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){   if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){
        $r->print('<span class="LC_error">'.         $r->print('<span class="LC_error">'.
       'No file was selected to upload.'.        'No file was selected to upload.'.
Line 1844  sub handler { Line 2160  sub handler {
         if ($can_upload) {          if ($can_upload) {
     &upload($r,$url,$group);      &upload($r,$url,$group);
         } else {          } else {
             &missing_priv($r,$url,'upload',$group,$refarg),              &missing_priv($r,$url,'upload');
         }          }
     } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) {      } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) {
         if ($can_delete) {          if ($can_delete) {
     &delete_confirmed($r,$url,$group);      &delete_confirmed($r,$url,$group);
         } else {          } else {
             &missing_priv($r,$url,'delete',$group);              &missing_priv($r,$url,'delete');
         }          }
     } elsif ($env{'form.action'} eq 'delete') {      } elsif ($env{'form.action'} eq 'delete') {
         if ($can_delete) {          if ($can_delete) {
     &delete($r,$url,$group,$refarg);      &delete($r,$url);
         } else {          } else {
             &missing_priv($r,$url,'delete',$group);              &missing_priv($r,$url,'delete');
         }          }
     } elsif ($env{'form.action'} eq 'deletedir' && $env{'form.confirmed'}) {      } elsif ($env{'form.action'} eq 'deletedir' && $env{'form.confirmed'}) {
         if ($can_delete) {          if ($can_delete) {
     &delete_dir_confirmed($r,$url,$group);      &delete_dir_confirmed($r,$url);
         } else {          } else {
             &missing_priv($r,$url,'delete',$group);              &missing_priv($r,$url,'delete');
         }          }
     } elsif ($env{'form.action'} eq 'deletedir') {      } elsif ($env{'form.action'} eq 'deletedir') {
         if ($can_delete) {          if ($can_delete) {
     &delete_dir($r,$url);      &delete_dir($r,$url);
         } else {          } else {
             &missing_priv($r,$url,'delete',$group);              &missing_priv($r,$url,'delete');
         }          }
     } elsif ($env{'form.action'} eq 'rename' && $env{'form.confirmed'}) {      } elsif ($env{'form.action'} eq 'rename' && $env{'form.confirmed'}) {
         if ($can_modify) {          if ($can_modify) {
     &rename_confirmed($r,$url,$group);      &rename_confirmed($r,$url,$group);
         } else {          } else {
             &missing_priv($r,$url,'rename',$group);              &missing_priv($r,$url,'rename');
         }          }
     } elsif ($env{'form.rename'}) {      } elsif ($env{'form.rename'}) {
         $env{'form.selectfile'} = $env{'form.rename'};          $env{'form.selectfile'} = $env{'form.rename'};
         $env{'form.action'} = 'rename';          $env{'form.action'} = 'rename';
         if ($can_modify) {          if ($can_modify) {
     &rename($r,$url,$group);      &rename($r,$url);
         } else {          } else {
             &missing_priv($r,$url,'rename',$group);              &missing_priv($r,$url,'rename');
         }          }
     } elsif ($env{'form.access'}) {      } elsif ($env{'form.access'}) {
         $env{'form.selectfile'} = $env{'form.access'};          $env{'form.selectfile'} = $env{'form.access'};
         $env{'form.action'} = 'chgaccess';          if (!defined($env{'form.action'})) { 
         &display_access($r,$url,$group,$can_setacl,$port_path);              $env{'form.action'} = 'chgaccess';
     } elsif ($env{'form.action'} eq 'chgaccess') {          }
           &display_access($r,$url,$group,$can_setacl,$port_path,$env{'form.action'});
       } elsif (($env{'form.action'} eq 'chgaccess') || 
                ($env{'form.action'} eq 'chgconditions')) {
         if ($can_setacl) {          if ($can_setacl) {
             &update_access($r,$url,$group,$port_path);              &update_access($r,$url,$group,$port_path);
         } else {          } else {
             &missing_priv($r,$url,'setacl',$group);              &missing_priv($r,$url,'setacl');
         }          }
     } elsif ($env{'form.action'} eq 'rolepicker') {      } elsif ($env{'form.action'} eq 'rolepicker') {
         if ($can_setacl) {           if ($can_setacl) { 
             &role_options_window($r);              &role_options_window($r);
         } else {          } else {
             &missing_priv($r,$url,'setacl',$group);              &missing_priv($r,$url,'setacl');
         }          }
     } elsif ($env{'form.createdir'}) {      } elsif ($env{'form.createdir'}) {
         if ($can_upload) {          if ($can_upload) {
     &createdir($r,$url,$group);      &createdir($r,$url);
         } else {          } else {
             &missing_priv($r,$url,'upload',$group);              &missing_priv($r,$url,'upload');
         }          }
     } elsif ($env{'form.lockinfo'}) {      } elsif ($env{'form.lockinfo'}) {
         &lock_info($r,$url,$group);          &lock_info($r,$url,$group);
Line 1917  sub handler { Line 2236  sub handler {
             &Apache::lonhtmlcommon::clear_breadcrumbs();              &Apache::lonhtmlcommon::clear_breadcrumbs();
             $r->print(&coursegrp_portfolio_header($udom,$uname,$grp_desc));              $r->print(&coursegrp_portfolio_header($udom,$uname,$grp_desc));
         }          }
         my @dir_list=&get_dir_list($portfolio_root,$group);          my @dir_list=&get_dir_list($portfolio_root);
  if ($dir_list[0] eq 'no_such_dir'){   if ($dir_list[0] eq 'no_such_dir'){
     # two main reasons for this:      # two main reasons for this:
             #    1) never been here, so directory structure not created              #    1) never been here, so directory structure not created
     #    2) back-button navigation after deleting a directory      #    2) back-button navigation after deleting a directory
     if ($current_path eq '/'){      if ($current_path eq '/'){
         &Apache::lonnet::mkdiruserfile($uname,$udom,          &Apache::lonnet::mkdiruserfile($uname,$udom,
        &get_port_path($group));         &get_port_path());
     } else {      } else {
                 # some directory that snuck in get rid of the directory                  # some directory that snuck in get rid of the directory
                 # from the recent pulldown, just in case                  # from the recent pulldown, just in case
Line 1940  sub handler { Line 2259  sub handler {
  my $is_empty=(@dir_list == 2);   my $is_empty=(@dir_list == 2);
  &display_common($r,$url,$current_path,$is_empty,\@dir_list,   &display_common($r,$url,$current_path,$is_empty,\@dir_list,
  $can_upload);   $can_upload);
         &display_directory($r,$url,$current_path,$is_empty,\@dir_list,          &display_directory($r,$url,$current_path,$is_empty,\@dir_list,$group,
                            $can_upload,$can_modify,$can_delete,$can_setacl);                             $can_upload,$can_modify,$can_delete,$can_setacl);
  $r->print(&Apache::loncommon::end_page());   $r->print(&Apache::loncommon::end_page());
     }      }

Removed from v.1.137  
changed lines
  Added in v.1.175


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
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.