[LON-CAPA-cvs] cvs: loncom /interface londocs.pm
raeburn
lon-capa-cvs@mail.lon-capa.org
Wed, 15 Dec 2004 15:21:43 -0000
This is a MIME encoded message
--raeburn1103124103
Content-Type: text/plain
raeburn Wed Dec 15 10:21:43 2004 EDT
Modified files:
/loncom/interface londocs.pm
Log:
Modification to IMS export code. Now build imsmanifest.xml correctly, and copies files. Some work required for simple problems in pages, and storage of templated documents.
--raeburn1103124103
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20041215102143.txt"
Index: loncom/interface/londocs.pm
diff -u loncom/interface/londocs.pm:1.156 loncom/interface/londocs.pm:1.157
--- loncom/interface/londocs.pm:1.156 Tue Dec 14 16:10:58 2004
+++ loncom/interface/londocs.pm Wed Dec 15 10:21:43 2004
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Documents
#
-# $Id: londocs.pm,v 1.156 2004/12/14 21:10:58 albertel Exp $
+# $Id: londocs.pm,v 1.157 2004/12/15 15:21:43 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -283,7 +283,6 @@
$outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created. Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';
} else {
my $now = time;
- my $count = 0;
my %symbs;
my $manifestok = 0;
my $imsresources;
@@ -291,7 +290,7 @@
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);
+ &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest);
close($ims_manifest);
#Create zip file in prtspool
@@ -504,8 +503,8 @@
my $lastcontainer = 0;
my %parent = ();
my @dependencies = ();
- my $cnum = $ENV{'request.'.$ENV{'request.course.id'}.'.num'};
- my $cdom = $ENV{'request.'.$ENV{'request.course.id'}.'.domain'};
+ my $cnum = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
+ my $cdom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
while ($curRes = $it->next()) {
if (ref($curRes)) {
$count ++;
@@ -534,57 +533,64 @@
$count = 0;
my $imsresources;
my $pkgdepth;
- if ($curRes == $it->BEGIN_MAP()) {
- $prevdepth = $depth;
- $depth++;
- }
- if ($curRes == $it->END_MAP()) {
- $prevdepth = $depth;
- $depth--;
- }
-
- if (ref($curRes)) {
- if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {
- my $symb = $curRes->symb();
- my $isvisible = 'true';
- my $resourceref;
- if ($curRes->randomout()) {
- $isvisible = 'false';
- }
- unless ($curRes->is_sequence()) {
- $resourceref = 'identifierref="RES-'.$ENV{'request.course.id'}.'-'.$count.'"';
- }
- if (($depth <= $prevdepth) && ($count > 1)) {
- print $ims_manifest ' </item>'."\n";
- }
+ my $included = 0;
+ while ($curRes = $it->next()) {
+ if ($curRes == $it->BEGIN_MAP()) {
$prevdepth = $depth;
+ $depth++;
+ }
+ if ($curRes == $it->END_MAP()) {
+ $prevdepth = $depth;
+ $depth--;
+ }
+
+ if (ref($curRes)) {
+ $count ++;
+ if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {
+ my $symb = $curRes->symb();
+ my $isvisible = 'true';
+ my $resourceref;
+ if ($curRes->randomout()) {
+ $isvisible = 'false';
+ }
+ unless ($curRes->is_sequence()) {
+ $resourceref = 'identifierref="RES-'.$ENV{'request.course.id'}.'-'.$count.'"';
+ }
+ if (($depth <= $prevdepth) && ($count > 1) && ($included)) {
+ print $ims_manifest "\n".' </item>'."\n";
+ }
+ $included = 1;
+ $prevdepth = $depth;
- my $itementry =
+ my $itementry =
'<item identifier="ITEM-'.$ENV{'request.course.id'}.'-'.$count.
'" isvisible="'.$isvisible.'" '.$resourceref.'>'.
'<title>'.$curRes->title().'</title>';
- print $ims_manifest "\n".$itementry;
+ print $ims_manifest "\n".$itementry;
- unless ($curRes->is_sequence()) {
- my $content_file;
- my @hrefs = ();
- &process_content($count,$curRes,$cdom,$cnum,$symb,$content_file,\@hrefs,$copyresult,$tempexport);
- if ($content_file) {
- $imsresources .= "\n".
+ unless ($curRes->is_sequence()) {
+ my $content_file;
+ my @hrefs = ();
+ &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport);
+ if ($content_file) {
+ $imsresources .= "\n".
' <resource identifier="RES-'.$ENV{'request.course.id'}.'-'.$count.
'" type="webcontent" href="'.$content_file.'">'."\n".
' <file href="'.$content_file.'" />'."\n";
- foreach (@hrefs) {
- $imsresources .=
+ foreach (@hrefs) {
+ $imsresources .=
' <file href="'.$_.'" />'."\n";
+ }
+ $imsresources .= ' </resource>'."\n";
}
- $imsresources .= ' </resource>'."\n";
}
+ $pkgdepth = $depth;
+ } else {
+ $included = 0;
}
- $pkgdepth = $depth;
}
}
- while ($pkgdepth > -1) {
+ while ($pkgdepth > 0) {
print $ims_manifest " </item>\n";
$pkgdepth --;
}
@@ -602,7 +608,7 @@
sub get_dependencies {
my ($exportitems,$parent,$depth,$dependencies) = @_;
if ($depth > 1) {
- unless (grep/^$$parent{$depth}$/,@$exportitems || grep/^$$parent{$depth}$/,@$dependencies) {
+ if ((!grep/^$$parent{$depth}$/,@$exportitems) && (!grep/^$$parent{$depth}$/,@$dependencies)) {
push @$dependencies, $$parent{$depth};
if ($depth > 2) {
&get_dependencies($exportitems,$parent,$depth-1,$dependencies);
@@ -616,29 +622,33 @@
my $content_type;
my $message;
# find where user is author or co-author
- my %roleshash = &Appache::lonnet::get_my_roles();
- if ($curRes->is_page()) {
- $content_type = 'page';
+ my %roleshash = &Apache::lonnet::get_my_roles();
+ if ($curRes->is_sequence()) {
+ $content_type = 'sequence';
+ } elsif ($curRes->is_page()) {
+ $content_type = 'page'; # need to handle individual items in pages.
} elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) {
$content_type = 'syllabus';
- } elsif ($symb =~ m-\.sequence____\d+____ext-) {
+ } elsif ($symb =~ m-\.sequence___\d+___ext-) {
$content_type = 'external';
} elsif ($symb =~ m-adm/navmaps$-) {
$content_type = 'navmap';
} elsif ($symb =~ m-adm/$cdom/$cnum/\d+/smppg$-) {
$content_type = 'simplepage';
- } elsif ($symb =~ m-$-) {
+ } elsif ($symb =~ m-/lib/templates/simpleproblem\.problem$-) {
$content_type = 'simpleproblem';
} elsif ($symb =~ m-adm/$cdom/$cnum/\d+/bulletinboard$-) {
$content_type = 'bulletinboard';
} elsif ($symb =~ m-adm/$cdom/$cnum/\d+/aboutme$-) {
$content_type = 'aboutme';
} elsif ($symb =~ m-uploaded/$cdom/$cnum-) {
- &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'uploaded');
- } elsif ($symb =~ m-\.sequence____\d+____([^/])/([^/])-) {
- my $coauth = $2.':'.$1.':ca';
+ $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
+ } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) {
+ $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
+ } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/])/([^/])-) {
+ my $coauth = $3.':'.$2.':ca';
my $canedit = 0;
- if ($1 eq $ENV{'user.domain'} && $2 eq $ENV{'user.name'}) {
+ if ($2 eq $ENV{'user.domain'} && $3 eq $ENV{'user.name'}) {
$canedit= 1;
} elsif (defined($roleshash{$coauth})) {
if ($roleshash{$coauth} =~ /(\d+):(\d+)/) {
@@ -650,45 +660,53 @@
}
}
if ($canedit) {
- &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'resource');
+ $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');
} else {
- &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'noedit');
+ $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit');
}
}
- $$copyresult .= $message."\n";
+ if ($message) {
+ $$copyresult .= $message."\n";
+ }
}
sub replicate_content {
- my ($cdom,$cnum,$tempexport,$symb,$count,$message,$caller) = @_;
+ my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_;
my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
my $feedurl = &Apache::lonnet::clutter($url);
my $content;
my $filename;
my $repstatus;
- if ($url =~ m-[^/]/(.+)$-) {
+ my $content_name;
+ if ($url =~ m-/([^/]+)$-) {
$filename = $1;
if (!-e $tempexport.'/resources') {
mkdir($tempexport.'/resources',0700);
}
- if (!-e $tempexport.'/resources') {
+ if (!-e $tempexport.'/resources/'.$count) {
mkdir($tempexport.'/resources/'.$count,0700);
}
- my $destination = $$tempexport.'/resources/'.$count.'/'.$filename;
+ my $destination = $tempexport.'/resources/'.$count.'/'.$filename;
my $copiedfile;
if ($copiedfile = Apache::File->new('>'.$destination)) {
my $content;
- if ($caller eq 'uploaded' || $caller eq 'resource') {
+ if ($caller eq 'resource') {
$content = &Apache::lonnet::getfile($url);
if ($content eq -1) {
$$message = 'Could not copy file '.$filename;
} else {
+ &extract_media($content,$count,$tempexport,$href,'resource');
$repstatus = 'ok';
}
- } elsif ($caller eq 'noedit') {
+ } elsif ($caller eq 'noedit' || $caller eq 'uploaded') {
my $rtncode;
- $repstatus = &getuploaded('GET',$url,$cdom,$cnum,$content,$rtncode);
- unless ($repstatus eq 'ok') {
+ $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);
+ if ($repstatus eq 'ok') {
+ if ($url =~ /\.html?$/i) {
+ &extract_media(\$content,$count,$tempexport,$href,'uploaded');
+ }
+ } else {
$$message = 'Could not render '.$url.' server message - '.$rtncode;
}
}
@@ -700,9 +718,21 @@
$$message = 'Could not open destination file for '.$filename."\n";
}
} else {
- $$message = 'Could not determine name of file for ';
+ $$message = 'Could not determine name of file for '.$url."\n";
}
- return $repstatus;
+ if ($repstatus eq 'ok') {
+ $content_name = $count.'/'.$filename;
+ }
+ return $content_name;
+}
+
+sub extract_media {
+ my ($content,$count,$tempexport,$href,$caller) = @_;
+# @$href will contain path to any embedded resources in the content.
+# For LON-CAPA problems this would be images. applets etc.
+# For uploaded HTML files this would be images etc.
+# paths will be in the form $count/res/$file, and urls in the $content will be rewritten with the new paths.
+ return;
}
# Imports the given (name, url) resources into the course
--raeburn1103124103--