'.&mt('Internal Filename').' | '.&mt('Title').' | '.&mt('Save as ...').' |
');
@@ -221,12 +232,13 @@ sub dumpcourse {
my ($ext)=($_=~/\.(\w+)$/);
my $title=$hash{'title_'.$hash{
'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
+ $title=~s/:/:/g;
$r->print(''.($title?$title:' ').' | ');
unless ($title) {
$title=$_;
}
$title=~s/\.(\w+)$//;
- $title=~s/[^\w\/]+/\_/gs;
+ $title=&clean($title);
$title.='.'.$ext;
$r->print("\n | \n");
}
@@ -243,63 +255,63 @@ sub exportbutton {
return ''.
''.
- &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs');
+ &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'});
+ $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'}) {
+ 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'};
- }
- }
- my $curRes;
- my $count;
- my %symbs;
- my $display;
- while ($curRes = $it->next()) {
- if (ref($curRes)) {
- $count ++;
- $symbs{$count} = $curRes->symb();
- if (grep/^$count$/,@exportitems) {
- $display.= 'Export content item '.$curRes->title()." \n";
+ my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');
+ my @discussions = &Apache::loncommon::get_env_multiple('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 %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';
+ my $cwd = &Cwd::getcwd();
+ my $imszip = '/home/httpd/'.$imszipfile;
+ chdir $tempexport;
+ open(OUTPUT, "zip -r $imszip * 2> /dev/null |");
+ close(OUTPUT);
+ chdir $cwd;
+ $outcome .= 'Download the zip file from IMS course archive ';
+ if ($copyresult) {
+ $outcome .= 'The following errors occurred during export - '.$copyresult;
}
- if (grep/^$count$/,@discussions) {
- $display.= 'Export discussion posts '.$curRes->title()." \n";
- }
+ } 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'
-));
-
- my $exportfile;
- $r->print($display);
+ my $html=&Apache::lonxml::xmlbegin();
+ $r->print($html.'Export Course'.
+ &Apache::loncommon::bodytag('Export course to IMS content package'));
+ $r->print($outcome);
$r->print('');
} else {
my $display;
@@ -347,6 +359,12 @@ sub exportcourse {
}
if (ref($curRes)) {
my $symb = $curRes->symb();
+ my $ressymb = $symb;
+ if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
+ unless ($ressymb =~ m|adm/wrapper/adm|) {
+ $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
+ }
+ }
my $color = $count%2;
$display .=' | '."\n".
'title().' | ';
- if ($discussiontime{$symb} > 0) {
+ if ($discussiontime{$ressymb} > 0) {
$boards ++;
$currelem = $count+$boards+$startcount;
$display .= ' | | '."\n";
@@ -381,13 +399,23 @@ sub exportcourse {
|;
- $r->print('Export Course'.$scripttag.''.
- &Apache::loncommon::bodytag('Export course to IMS or SCORM content package'
+ my $html=&Apache::lonxml::xmlbegin();
+ $r->print($html.'Export Course'.$scripttag.''.
+ &Apache::loncommon::bodytag('Export course to IMS content package'
));
$r->print($display.'
'.
@@ -433,6 +462,440 @@ function containerCheck(item) {
}
}
+sub create_ims_store {
+ my ($now,$manifestok,$outcome,$tempexport) = @_;
+ $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
+ my $ims_manifest;
+ if (!-e $$tempexport) {
+ mkdir($$tempexport,0700);
+ }
+ $$tempexport .= '/'.$now;
+ if (!-e $$tempexport) {
+ mkdir($$tempexport,0700);
+ }
+ $$tempexport .= '/'.$env{'user.domain'}.'_'.$env{'user.name'};
+ if (!-e $$tempexport) {
+ mkdir($$tempexport,0700);
+ }
+ if (!-e "$$tempexport/resources") {
+ mkdir("$$tempexport/resources",0700);
+ }
+# open manifest file
+ my $manifest = '/imsmanifest.xml';
+ my $manifestfilename = $$tempexport.$manifest;
+ if ($ims_manifest = Apache::File->new('>'.$manifestfilename)) {
+ $$manifestok=1;
+ print $ims_manifest
+''."\n".
+'