[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--