--- loncom/publisher/lonpubdir.pm 2014/03/11 01:16:49 1.150
+++ loncom/publisher/lonpubdir.pm 2023/06/11 20:45:40 1.178
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Authoring Space Directory Lister
#
-# $Id: lonpubdir.pm,v 1.150 2014/03/11 01:16:49 musolffc Exp $
+# $Id: lonpubdir.pm,v 1.178 2023/06/11 20:45:40 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,166 +40,366 @@ use Apache::lonlocal;
use Apache::lonmsg;
use Apache::lonmenu;
use Apache::lonnet;
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
sub handler {
- my $r=shift;
+ my $r=shift;
- # Validate access to the construction space and get username:domain.
+ # Validate access to the construction space and get username:domain.
- my $uname;
- my $udom;
-
- ($uname,$udom)=&Apache::lonnet::constructaccess($r->uri);
- unless (($uname) && ($udom)) {
- return HTTP_NOT_ACCEPTABLE;
- }
+ my ($uname,$udom)=&Apache::lonnet::constructaccess($r->uri);
+ unless (($uname) && ($udom)) {
+ return HTTP_NOT_ACCEPTABLE;
+ }
# ----------------------------------------------------------- Start page output
- my $fn=$r->filename;
- $fn=~s/\/$//;
+ my $fn=$r->filename;
+ $fn=~s/\/$//;
+ my $thisdisfn=$fn;
+
+ my $docroot=$r->dir_config('lonDocRoot'); # Apache londocument root.
+ if ($thisdisfn eq "$docroot/priv/$udom") {
+ if ((-d "/home/$uname/public_html/") && (!-e "$docroot/priv/$udom/$uname")) {
+ my ($version) = ($r->dir_config('lonVersion') =~ /^\'?(\d+\.\d+)\./);
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ $r->print(&Apache::loncommon::start_page('Authoring Space').
+ '
'.
+ '
'.
+ &mt('Your Authoring Space is currently in the location used by LON-CAPA version 2.10 and older, but your domain is using a newer LON-CAPA version ([_1]).',$version).'
'.
+ '
'.
+ &mt('Please ask your Domain Coordinator to move your Authoring Space to the new location.').
+ '
'.
+ '
'.
+ &Apache::loncommon::end_page());
+ return OK;
+ }
+ }
+ $thisdisfn=~s/^\Q$docroot\E\/priv//;
- my $thisdisfn=$fn;
- my $docroot=$r->dir_config('lonDocRoot'); # Apache londocument root.
- $thisdisfn=~s/^\Q$docroot\E\/priv//;
-
- my $resdir=$docroot.'/res'.$thisdisfn; # Resource directory
- my $targetdir='/res'.$thisdisfn; # Publication target directory.
- my $linkdir='/priv'.$thisdisfn; # Full URL name of constr space.
-
- my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);
-
- &startpage($r, $uname, $udom, $thisdisfn); # Put out the start of page.
- &dircontrols($r,$uname,$udom,$thisdisfn); # Put out actions for directory,
- # browse/upload + new file page.
- &resourceactions($r,$uname,$udom,$thisdisfn); #Put out form used for printing/deletion etc.
+ my $resdir=$docroot.'/res'.$thisdisfn; # Resource directory
+ my $targetdir='/res'.$thisdisfn; # Publication target directory.
+ my $linkdir='/priv'.$thisdisfn; # Full URL name of constr space.
+
+ my $cstr = 'author';
+ my ($crsauthor,$crstype);
+ if ($env{'request.course.id'}) {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ if ($thisdisfn =~ m{^/\Q$cdom/$cnum\E}) {
+ $crsauthor = 1;
+ $cstr = 'course';
+ $crstype = &Apache::loncommon::course_type();
+ }
+ }
- my $numdir = 0;
- my $numres = 0;
-
- # Retrieving value for sortby from QUERY_STRING
- &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sortby']);
+ my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);
- # Default sort by 'Name'
- if (! exists($env{'form.sortby'})) {
- $env{'form.sortby'} = 'filename';
- }
-
- # Start off the directory table.
- $r->print(&Apache::loncommon::start_data_table()
- .&Apache::loncommon::start_data_table_header_row()
- .'
'
+ .&Apache::loncommon::start_data_table_header_row() . $output
+ .&Apache::loncommon::end_data_table_header_row()
+ );
+
+ my $dirptr=16384; # Mask indicating a directory in stat.cmode.
+ my $filehash = {};
+ foreach my $filename (@files) {
+ # Skip .DS_Store, .DAV and hidden files
+ my ($extension) = ($filename=~/\.(\w+)$/);
+ next if (($filename eq '.DS_Store')
+ || ($filename eq '.DAV')
+ || (&Apache::loncommon::fileembstyle($extension) eq 'hdn')
+ || ($filename =~ /^\._/));
+
+ my ($cmode,$csize,$cmtime)=(stat($fn.'/'.$filename))[2,7,9];
+ my $linkfilename = &HTML::Entities::encode('/priv'.$thisdisfn.'/'.$filename,'<>&"');
+ # Identify type of file according to icon used
+ my ($filetype) = (&Apache::loncommon::icon($filename) =~ m{/(\w+).gif$});
+ my $cstr_dir = $r->dir_config('lonDocRoot').'/priv'.$thisdisfn;
+ my $meta_same = &isMetaSame($cstr_dir, $resdir, $filename);
+
+ # Store size, title, and status for files but not directories
+ my $size = (!($cmode&$dirptr)) ? $csize/1024. : 0;
+ my ($status, $pubstatus, $title, $fulltitle);
+ if (!($cmode&$dirptr)) {
+ ($status, $pubstatus) = &getStatus($resdir, $targetdir, $cstr_dir,
+ $filename, $linkfilename, $cmtime, $meta_same);
+ ($fulltitle, $title) = &getTitle($resdir, $targetdir, $filename,
+ $linkfilename, $meta_same, \%bombs);
+ } else {
+ ($status, $pubstatus) = ('','');
+ ($fulltitle, $title) = ('','');
+ }
+
+ # This hash will allow sorting
+ $filehash->{ $filename } = {
+ "cmtime" => $cmtime,
+ "size" => $size,
+ "cmode" => $cmode,
+ "filetype" => $filetype,
+ "title" => $title,
+ "fulltitle" => $fulltitle,
+ "status" => $status,
+ "pubstatus" => $pubstatus,
+ "linkfilename" => $linkfilename,
+ }
+ }
+
+ my @sorted_files;
+ # Sorting by something other than "Name". Name is the secondary key.
+ if ($sortby =~ m{cmtime|size}) { # Numeric fields
+ # First check if order should be reversed
+ if ($sortorder eq "rev") {
+ @sorted_files = sort {
+ $filehash->{$a}->{$sortby} <=> $filehash->{$b}->{$sortby}
+ or
+ uc($a) cmp uc($b)
+ } (keys(%{$filehash}));
+ } else {
+ @sorted_files = sort {
+ $filehash->{$b}->{$sortby} <=> $filehash->{$a}->{$sortby}
+ or
+ uc($a) cmp uc($b)
+ } (keys(%{$filehash}));
+ }
+ } elsif ($sortby =~ m{filetype|title|status}) { # String fields
+ if ($sortorder eq "rev") {
+ @sorted_files = sort {
+ $filehash->{$b}->{$sortby} cmp $filehash->{$a}->{$sortby}
+ or
+ uc($a) cmp uc($b)
+ } (keys(%{$filehash}));
+ } else {
+ @sorted_files = sort {
+ $filehash->{$a}->{$sortby} cmp $filehash->{$b}->{$sortby}
+ or
+ uc($a) cmp uc($b)
+ } (keys(%{$filehash}));
+ }
+
+ # Sort by "Name" is the default
+ } else {
+ if ($sortorder eq "rev") {
+ @sorted_files = sort {uc($b) cmp uc($a)} (keys(%{$filehash}));
+ } else {
+ @sorted_files = sort {uc($a) cmp uc($b)} (keys(%{$filehash}));
+ }
+ }
+
+ # Print the sorted resources
+ foreach my $filename (@sorted_files) {
+ if ($filehash->{$filename}->{"cmode"}&$dirptr) { # Directories
+ &putdirectory($r, $thisdisfn, $linkdir, $filename,
+ $filehash->{$filename}->{"cmtime"},
+ $targetdir, \%bombs, \$numdir);
+ } else { # Files
+ &putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir,
+ $targetdir, $linkdir, $filehash->{$filename}->{"cmtime"},
+ $filehash->{$filename}->{"size"}, \$numres,
+ $filehash->{$filename}->{"linkfilename"},
+ $filehash->{$filename}->{"fulltitle"},
+ $filehash->{$filename}->{"status"},
+ $filehash->{$filename}->{"pubstatus"});
+ }
+ }
$r->print(&Apache::loncommon::end_data_table()
+ .'
'
+ .&Apache::loncommon::start_data_table()
+ .'
'.&mt('Results in other directories:').'
'
+ .'
'
+ .'
'.&mt('Type').'
'
+ .'
'.&mt('Directory').'
'
+ .'
'.&mt('Name').'
'
+ .'
'.&mt('Title').'
'
+ .'
'.&mt('Status').'
'
+ .'
'.&mt('Last Modified').'
'
+ .'
'
+ .&Apache::loncommon::end_data_table()
+ .'
'
.&Apache::loncommon::end_page()
);
return OK;
}
-#
+
+
# Output the header of the page. This includes:
# - The HTML header
# - The H1/H3 stuff which includes the directory.
#
-# startpage($r, $uame, $udom, $thisdisfn);
+# startpage($r, $uame, $udom, $thisdisfn, $current_disk_usage, $disk_quota);
# $r - The apache request object.
# $uname - User name.
# $udom - Domain name the user is logged in under.
# $thisdisfn - Displayable version of the filename.
+# $current_disk_usage - User's current disk usage (in kB).
+# $disk_quota - Disk quota for user's authoring space (in MB).
+# $crstype - Course type, if this is for "course author"
sub startpage {
- my ($r, $uname, $udom, $thisdisfn) = @_;
+ my ($r, $uname, $udom, $thisdisfn, $current_disk_usage, $disk_quota, $crsauthor) = @_;
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
my $formaction='/priv'.$thisdisfn.'/';
$formaction=~s|/+|/|g;
- &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction);
+
+ my $title;
+ if ($crsauthor) {
+ $title = 'Course Authoring';
+ } else {
+ $title = 'Authoring Space';
+ &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction);
+ }
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb({
- 'text' => 'Authoring Space',
+ 'text' => $title,
'href' => &Apache::loncommon::authorspace($formaction),
});
# breadcrumbs (and tools) will be created
# in start_page->bodytag->innerregister
$env{'request.noversionuri'}=$formaction;
- $r->print(&Apache::loncommon::start_page('Authoring Space',undef));
+ my $js = '';
+ $r->print(&Apache::loncommon::start_page($title, $js));
- my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
- my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,"$londocroot/priv/$udom/$uname");
- my $disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,'author'); #expressed in Mb
- $disk_quota = 1000 * $disk_quota; # convert from Mb to kb
+ $disk_quota = 1024 * $disk_quota; # convert from MB to kB
$r->print(&Apache::loncommon::head_subbox(
'