--- loncom/interface/londocs.pm 2003/09/17 21:20:15 1.80
+++ loncom/interface/londocs.pm 2004/12/10 19:22:29 1.151
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Documents
#
-# $Id: londocs.pm,v 1.80 2003/09/17 21:20:15 albertel Exp $
+# $Id: londocs.pm,v 1.151 2004/12/10 19:22:29 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,8 +36,11 @@ use Apache::lonratedt;
use Apache::lonratsrv;
use Apache::lonxml;
use Apache::loncreatecourse;
+use Apache::lonnavmaps;
use HTML::Entities;
use GDBM_File;
+use Apache::lonlocal;
+use Cwd;
my $iconpath;
@@ -67,10 +70,13 @@ sub mapread {
sub storemap {
my ($coursenum,$coursedom,$map)=@_;
- $hadchanges=1;
- return
+ my ($outtext,$errtext)=
&Apache::lonratedt::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
$map,1);
+ if ($errtext) { return ($errtext,2); }
+
+ $hadchanges=1;
+ return ($errtext,0);
}
# ----------------------------------------- Return hash with valid author names
@@ -93,13 +99,15 @@ sub authorhosts {
} else {
($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);
}
- if (&Apache::lonnet::homeserver($ca,$cd) eq
- $Apache::lonnet::perlvar{'lonHostID'}) {
+ my $allowed=0;
+ my $myhome=&Apache::lonnet::homeserver($ca,$cd);
+ my @ids=&Apache::lonnet::current_machine_ids();
+ foreach my $id (@ids) { if ($id eq $myhome) { $allowed=1; } }
+ if ($allowed) {
$home++;
$outhash{'home_'.$ca.'@'.$cd}=1;
} else {
- $outhash{'otherhome_'.$ca.'@'.$cd}=
- &Apache::lonnet::homeserver($ca,$cd);
+ $outhash{'otherhome_'.$ca.'@'.$cd}=$myhome;
$other++;
}
}
@@ -114,10 +122,12 @@ sub dumpbutton {
my $output='
';
if ($home) {
return ' '.
- ' ';
+ ' '.
+ &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs');
} else {
return' '.
- 'Dump Course DOCS to Construction Space: available on other servers';
+ &mt('Dump Course DOCS to Construction Space: available on other servers');
}
}
@@ -136,7 +146,7 @@ sub dumpcourse {
# Do the dumping
unless ($outhash{'home_'.$ENV{'form.authorspace'}}) { return ''; }
my ($ca,$cd)=split(/\@/,$ENV{'form.authorspace'});
- $r->print('Copying Files ');
+ $r->print(''.&mt('Copying Files').' ');
my $title=$ENV{'form.authorfolder'};
$title=~s/[^\w\/]+/\_/g;
my %replacehash=();
@@ -149,7 +159,7 @@ sub dumpcourse {
$crs=~s/\_/\//g;
foreach (keys %replacehash) {
my $newfilename=$title.'/'.$replacehash{$_};
- $newfilename=~s/[^\w\/\.]+/\_/g;
+ $newfilename=~s/[^\w\/\.\/]+/\_/g;
my @dirs=split(/\//,$newfilename);
my $path='/home/'.$ca.'/public_html';
my $makepath=$path;
@@ -185,7 +195,7 @@ sub dumpcourse {
# Input form
unless ($home==1) {
$r->print(
- 'Select the Construction Space ');
+ ''.&mt('Select the Construction Space').' ');
}
foreach (sort keys %outhash) {
if ($_=~/^home_(.+)$/) {
@@ -193,7 +203,8 @@ sub dumpcourse {
$r->print(
' ');
} else {
- $r->print(''.$_.' ');
+ $r->print(''.$1.' - '.
+ &Apache::loncommon::plainname(split(/\@/,$1)).' ');
}
}
}
@@ -203,9 +214,9 @@ sub dumpcourse {
my $title=$origcrsdata{'description'};
$title=~s/\s+/\_/gs;
$title=~s/\W//gs;
- $r->print('Folder in Construction Space ');
+ $r->print(''.&mt('Folder in Construction Space').' ');
&tiehash();
- $r->print('Filenames in Construction Space Internal Filename Title Save as ... ');
+ $r->print(''.&mt('Filenames in Construction Space').' \n");
&untiehash();
$r->print(
- '
');
+ '
');
+ }
+}
+
+# ------------------------------------------------------ Generate "export" button
+
+sub exportbutton {
+ return ''.
+ ' '.
+ &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs');
+}
+
+sub exportcourse {
+ my $r=shift;
+ my %discussiontime = &Apache::lonnet::dump('discussiontimes',
+ $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ my $numdisc = keys %discussiontime;
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
+ my $curRes;
+ my $outcome;
+
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['finishexport']);
+ if ($ENV{'form.finishexport'}) {
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['archive','discussion']);
+
+ my @exportitems = ();
+ if (defined($ENV{'form.archive'})) {
+ if (ref($ENV{'form.archive'}) eq 'ARRAY') {
+ @exportitems = @{$ENV{'form.archive'}};
+ } else {
+ $exportitems[0] = $ENV{'form.archive'};
+ }
+ }
+ my @discussions = ();
+ if (defined($ENV{'form.discussion'})) {
+ if (ref($ENV{'form.discussion'}) eq 'ARRAY') {
+ @discussions = $ENV{'form.discussion'};
+ } else {
+ $discussions[0] = $ENV{'form.discussion'};
+ }
+ }
+ if (@exportitems == 0 && @discussions == 0) {
+ $outcome = ' As you did not select any content items or discussions for export, an IMS package has not been created. Please go back to select either content items or discussions for export';
+ } else {
+ my $now = time;
+ my $count = 0;
+ my %symbs;
+ my $manifestok = 0;
+ my $imsresources;
+ my $tempexport;
+ my $copyresult;
+ my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);
+ if ($manifestok) {
+ &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,\$tempexport,\$copyresult,$ims_manifest);
+ close($ims_manifest);
+
+#Create zip file in prtspool
+ my $imszipfile = '/prtspool/'.
+ $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
+ time.'_'.rand(1000000000).'.zip';
+# zip can cause an sh launch which can pass along all of %ENV
+# which can be too large for /bin/sh to handle
+ my %oldENV=%ENV;
+ undef(%ENV);
+ my $cwd = &Cwd::getcwd();
+ my $imszip = '/home/httpd/'.$imszipfile;
+ chdir $tempexport;
+ open(OUTPUT, "zip -r $imszip * 2> /dev/null |");
+ close(OUTPUT);
+ chdir $cwd;
+ %ENV=%oldENV;
+ undef(%oldENV);
+ $outcome .= 'Download the zip file from IMS course archive ';
+ if ($copyresult) {
+ $outcome .= 'The following errors occurred during export - '.$copyresult;
+ }
+ } else {
+ $outcome = ' Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file. ';
+ }
+ }
+
+ $r->print('Export Course '.
+ &Apache::loncommon::bodytag('Export course to IMS or SCORM content package'));
+ $r->print($outcome);
+ $r->print('