[LON-CAPA-cvs] cvs: loncom /interface loncommon.pm londocs.pm

raeburn raeburn at source.lon-capa.org
Mon Feb 27 21:02:16 EST 2012


raeburn		Tue Feb 28 02:02:16 2012 EDT

  Modified files:              
    /loncom/interface	londocs.pm loncommon.pm 
  Log:
  - Work in progress.
  - Upload archive files (.zip, .tar, .tar.gz etc.) into a course, and offer the
    option to extract contents, and decide how extracted items should be deployed.
  - additional javascript functions in &loncommon::archive_javascript():
      dependencyCheck(), and propagateSelect()
    - allow user to display/populate dropdown list used to specify which file/folder 
      displayed in course (i.e., to be added to a .sequence file) is the reason why
      other items extracted from archive need to be preserved as dependencies.  
  
  
-------------- next part --------------
Index: loncom/interface/londocs.pm
diff -u loncom/interface/londocs.pm:1.476 loncom/interface/londocs.pm:1.477
--- loncom/interface/londocs.pm:1.476	Tue Jan 31 23:47:15 2012
+++ loncom/interface/londocs.pm	Tue Feb 28 02:02:16 2012
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.476 2012/01/31 23:47:15 raeburn Exp $
+# $Id: londocs.pm,v 1.477 2012/02/28 02:02:16 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -26,8 +26,6 @@
 # http://www.lon-capa.org/
 #
 
-
-
 package Apache::londocs;
 
 use strict;
@@ -1121,6 +1119,7 @@
                     newidx     => $newidx,
                     position   => $position,
                     phase      => $nextphase,
+                    comment    => $comment,
                 ); 
                 $$upload_output = $showupload.
                                   &Apache::loncommon::decompress_form($mimetype,
@@ -2974,6 +2973,9 @@
     if ($env{'form.newidx'}) {
         $hiddenelem .= '<input type="hidden" name="newidx" value="'.$env{'form.newidx'}.'" />'."\n";
     }
+    if ($env{'form.comment'}) {
+        $hiddenelem .= '<input type="hidden" name="comment" value="'.$env{'form.comment'}.'" />'."\n";
+    }
     return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,
             $hiddenelem);
 }
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.1055 loncom/interface/loncommon.pm:1.1056
--- loncom/interface/loncommon.pm:1.1055	Tue Jan 31 23:47:15 2012
+++ loncom/interface/loncommon.pm	Tue Feb 28 02:02:16 2012
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1055 2012/01/31 23:47:15 raeburn Exp $
+# $Id: loncommon.pm,v 1.1056 2012/02/28 02:02:16 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -9735,9 +9735,6 @@
     }
     $output .= '</p>';
     $output .= <<"START";
-<p>
-$lt{'this'} $lt{'youm'}
-</p>
 <div id="uploadfileresult">
   <form name="uploaded_decompress" action="$action" method="post">
   <input type="hidden" name="archiveurl" value="$archiveurl" />
@@ -9857,18 +9854,19 @@
                         }
                     }
                     if (@contents > 0) {
-                        my (%children,%parent);
+                        my (%children,%parent,%dirorder,%titles);
                         my $wantform = 1;
                         my ($count,$datatable) = &get_extracted($docudom,$docuname,
                                                                 $currdir,\%is_dir,
                                                                 \%children,\%parent,
-                                                                \@contents,$wantform);
+                                                                \@contents,\%dirorder,
+                                                                \%titles,$wantform);
                         if ($datatable ne '') {
                             $output .= &archive_options_form('decompressed',$datatable,
                                                              $count,$hiddenelem);
-                            my $startcount = 3;
+                            my $startcount = 4;
                             $output .= &archive_javascript($startcount,$count,
-                                                           %children);
+                                                           \%titles,\%children);
                         }
                     } else {
                         $warning = &mt('No new items extracted from archive file.');
@@ -9891,15 +9889,19 @@
 }
 
 sub get_extracted {
-    my ($docudom,$docuname,$currdir,$is_dir,$children,$parent,$contents,$wantform) = @_;
+    my ($docudom,$docuname,$currdir,$is_dir,$children,$parent,$contents,$dirorder,
+        $titles,$wantform) = @_;
     my $count = 0;
-    my $lastcontainer = 0;
     my $depth = 0;
     my $datatable;
+    my @hierarchy;
     return unless ((ref($is_dir) eq 'HASH') && (ref($children) eq 'HASH') &&
-                   (ref($parent) eq 'HASH') && (ref($contents) eq 'ARRAY'));
+                   (ref($parent) eq 'HASH') && (ref($contents) eq 'ARRAY') &&
+                   (ref($dirorder) eq 'HASH') && (ref($titles) eq 'HASH'));
     foreach my $item (@{$contents}) {
         $count ++;
+        @{$dirorder->{$count}} = @hierarchy;
+        $titles->{$count} = $item;
         &archive_hierarchy($depth,$count,$parent,$children);
         if ($wantform) {
             $datatable .= &archive_row($is_dir->{$item},$item,
@@ -9907,25 +9909,26 @@
         }
         if ($is_dir->{$item}) {
             $depth ++;
-            $lastcontainer = $count;
-            $parent->{$depth} = $lastcontainer;
+            push(@hierarchy,$count);
+            $parent->{$depth} = $count;
             $datatable .=
                 &recurse_extracted_archive("$currdir/$item",$docudom,$docuname,
-                                           \$depth,\$count,\$lastcontainer,
-                                           $children,$parent,$wantform);
+                                           \$depth,\$count,\@hierarchy,$dirorder,
+                                           $children,$parent,$titles,$wantform);
             $depth --;
-            $lastcontainer = $parent->{$depth};
+            pop(@hierarchy);
         }
     }
     return ($count,$datatable);
 }
 
 sub recurse_extracted_archive {
-    my ($currdir,$docudom,$docuname,$depth,$count,$lastcontainer,
-        $children,$parent,$wantform) = @_;
+    my ($currdir,$docudom,$docuname,$depth,$count,$hierarchy,$dirorder,
+        $children,$parent,$titles,$wantform) = @_;
     my $result='';
-    unless ((ref($depth)) && (ref($count)) && (ref($lastcontainer)) &&
-            (ref($children) eq 'HASH') && (ref($parent) eq 'HASH')) {
+    unless ((ref($depth)) && (ref($count)) && (ref($hierarchy) eq 'ARRAY') &&
+            (ref($children) eq 'HASH') && (ref($parent) eq 'HASH') &&
+            (ref($dirorder) eq 'HASH')) {
         return $result;
     }
     my $dirptr = 16384;
@@ -9936,7 +9939,10 @@
             my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,5);
             unless ($item =~ /^\.+$/) {
                 $$count ++;
+                @{$dirorder->{$$count}} = @{$hierarchy};
+                $titles->{$$count} = $item;
                 &archive_hierarchy($$depth,$$count,$parent,$children);
+
                 my $is_dir;
                 if ($dirptr&$testdir) {
                     $is_dir = 1;
@@ -9946,15 +9952,15 @@
                 }
                 if ($is_dir) {
                     $$depth ++;
-                    $$lastcontainer = $$count;
-                    $parent->{$$depth} = $$lastcontainer;
+                    push(@{$hierarchy},$$count);
+                    $parent->{$$depth} = $$count;
                     $result .=
                         &recurse_extracted_archive("$currdir/$item",$docudom,
                                                    $docuname,$depth,$count,
-                                                   $lastcontainer,$children,
-                                                   $parent,$wantform);
+                                                   $hierarchy,$dirorder,$children,
+                                                   $parent,$titles,$wantform);
                     $$depth --;
-                    $$lastcontainer = $parent->{$$depth};
+                    pop(@{$hierarchy});
                 }
             }
         }
@@ -9983,8 +9989,10 @@
     if ($is_dir) {
         $choices{'display'} = &mt('Add as Folder'); 
     }
-    my $output = &start_data_table_row()."\n";
+    my $output = &start_data_table_row().'<td align="right">'.$count.'</td>'."\n";
+    my $offset = 0;
     foreach my $action ('display','dependency','discard') {
+        $offset ++;
         $output .= '<td><span class="LC_nobreak">'.
                    '<label><input type="radio" name="archive_'.$count.
                    '" id="archive_'.$action.'_'.$count.'" value="'.$action.'"';
@@ -9994,8 +10002,20 @@
             if ($action eq 'display') {
                 $text = &mt('Add as Folder');
             }
+        } else {
+            $output .= ' onclick="javascript:dependencyCheck(this.form,'."$count,$offset".');"';
+
+        }
+        $output .= ' /> '.$choices{$action}.'</label></span>';
+        if ($action eq 'dependency') {
+            $output .= '<div id="arc_depon_'.$count.'" style="display:none;">'."\n".
+                       &mt('Used by:').' <select name="archive_dependent_on_'.$count.'" '.
+                       'onchange="propagateSelect(this.form,'."$count,$offset".')">'."\n".
+                       '<option value=""></option>'."\n".
+                       '</select>'."\n".
+                       '</div>';
         }
-        $output .= ' /> '.$choices{$action}.'</label></span></td>';
+        $output .= '</td>';
     }
     $output .= '<td><input type="hidden" name="archive_content_'.$count.'" value="'.
                &HTML::Entities::encode("$currdir/$item",'"<>&').'" />'.(' ' x 2);
@@ -10039,7 +10059,8 @@
 }
 
 sub archive_javascript {
-    my ($startcount,$numitems,%children) = @_;
+    my ($startcount,$numitems,$titles,$children) = @_;
+    return unless ((ref($titles) eq 'HASH') && (ref($children) eq 'HASH'));
     my $scripttag = <<START;
 <script type="text/javascript">
 // <![CDATA[
@@ -10052,6 +10073,10 @@
             if (idstr.test(id)) {
                 if (form.elements[i].type == 'radio') {
                     form.elements[i].checked = true;
+                    var nostart = i-$startcount;
+                    var offset = nostart%6;
+                    var count = (nostart-offset)/6;    
+                    dependencyCheck(form,count,offset);
                 }
             }
         }
@@ -10060,13 +10085,15 @@
 
 function propagateCheck(form,count) {
     if (count > 0) {
-        var startelement = $startcount + (count-1) * 5;
-        for (var j=1; j<4; j++) {
-            var item = startelement + j; 
-            if (form.elements[item].type == 'radio') {
-                if (form.elements[item].checked) {
-                    containerCheck(form,count,j);
-                    break;
+        var startelement = $startcount + ((count-1) * 6);
+        for (var j=1; j<5; j++) {
+            if (j != 3) {
+                var item = startelement + j; 
+                if (form.elements[item].type == 'radio') {
+                    if (form.elements[item].checked) {
+                        containerCheck(form,count,j);
+                        break;
+                    }
                 }
             }
         }
@@ -10074,35 +10101,114 @@
 }
 
 numitems = $numitems
-var parents = new Array(numitems)
+var titles = new Array(numitems);
+var parents = new Array(numitems);
 for (var i=0; i<numitems; i++) {
-    parents[i] = new Array
+    parents[i] = new Array;
 }
 
 START
 
-    foreach my $container (sort { $a <=> $b } (keys(%children))) {
-        my @contents = split(/:/,$children{$container});
+    foreach my $container (sort { $a <=> $b } (keys(%{$children}))) {
+        my @contents = split(/:/,$children->{$container});
         for (my $i=0; $i<@contents; $i ++) {
             $scripttag .= 'parents['.$container.']['.$i.'] = '.$contents[$i]."\n";
         }
     }
 
+    foreach my $key (sort { $a <=> $b } (keys(%{$titles}))) {
+        $scripttag .= "titles[$key] = '".$titles->{$key}."';\n";
+    }
+
     $scripttag .= <<END;
 
 function containerCheck(form,count,offset) {
     if (count > 0) {
-        var item = $startcount + ((count-1) * 5) + offset;
+        dependencyCheck(form,count,offset);
+        var item = (offset+$startcount)+6*(count-1);
         form.elements[item].checked = true;
         if(Object.prototype.toString.call(parents[count]) === '[object Array]') {
             if (parents[count].length > 0) {
                 for (var j=0; j<parents[count].length; j++) {
-                    containerCheck(form,parents[count][j],offset)
+                    containerCheck(form,parents[count][j],offset);
+                }
+            }
+        }
+    }
+}
+
+function dependencyCheck(form,count,offset) {
+    if (count > 0) {
+        var chosen = (offset+$startcount)+6*(count-1);
+        var depitem = $startcount + ((count-1) * 6) + 3;
+        var currtype = form.elements[depitem].type;
+        if (form.elements[chosen].value == 'dependency') {
+            document.getElementById('arc_depon_'+count).style.display='block'; 
+            form.elements[depitem].options.length = 0;
+            form.elements[depitem].options[0] = new Option('Select','',true,true);
+            for (var i=1; i<count; i++) {
+                var startelement = $startcount + (i-1) * 6;
+                for (var j=1; j<5; j++) {
+                    if (j != 3) {
+                        var item = startelement + j;
+                        if (form.elements[item].type == 'radio') {
+                            if (form.elements[item].checked) {
+                                if (form.elements[item].value == 'display') {
+                                    var n = form.elements[depitem].options.length;
+                                    form.elements[depitem].options[n] = new Option(titles[i],i,false,false);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } else {
+            document.getElementById('arc_depon_'+count).style.display='none';
+            form.elements[depitem].options.length = 0;
+            form.elements[depitem].options[0] = new Option('Select','',true,true);
+        }
+    }
+}
+
+function propagateSelect(form,count,offset) {
+    if (count > 0) {
+        var item = (1+offset+$startcount)+6*(count-1);
+        var picked = form.elements[item].options[form.elements[item].selectedIndex].value; 
+        if (Object.prototype.toString.call(parents[count]) === '[object Array]') {
+            if (parents[count].length > 0) {
+                for (var j=0; j<parents[count].length; j++) {
+                    containerSelect(form,parents[count][j],offset,picked);
                 }
             }
         }
     }
 }
+
+function containerSelect(form,count,offset,picked) {
+    if (count > 0) {
+        var item = (offset+$startcount)+6*(count-1);
+        if (form.elements[item].type == 'radio') {
+            if (form.elements[item].value == 'dependency') {
+                if (form.elements[item+1].type == 'select-one') {
+                    for (var i=0; i<form.elements[item+1].options.length; i++) {
+                        if (form.elements[item+1].options[i].value == picked) {
+                            form.elements[item+1].selectedIndex = i;
+                            break;
+                        }
+                    }
+                }
+                if (Object.prototype.toString.call(parents[count]) === '[object Array]') {
+                    if (parents[count].length > 0) {
+                        for (var j=0; j<parents[count].length; j++) {
+                            containerSelect(form,parents[count][j],offset,picked);
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
 // ]]>
 </script>
 END
@@ -10151,19 +10257,13 @@
             }
         }
     }
-    my ($output,%children,%parent);
+    my ($output,%children,%parent,%titles,%dirorder);
     if (keys(%toplevelitems) > 0) {
         my @contents = sort(keys(%toplevelitems));
-        my ($count,undef) = &get_extracted($docudom,$docuname,$currdir,\%is_dir,
-                                           \%children,\%parent,\@contents);
-    }
-    my (@above,%hierarchy,%referrer,%orphaned,%todelete);
-    foreach my $depth (sort { $a <=> $b } keys(%parent)) {
-        push(@above,$parent{$depth}); 
-        foreach my $item (split(/:/,$children{$parent{$depth}})) {
-            $hierarchy{$item} = \@above;
-        }
+        (my $count,undef) = &get_extracted($docudom,$docuname,$currdir,\%is_dir,\%children,
+                                           \%parent,\@contents,\%dirorder,\%titles);
     }
+    my (%referrer,%orphaned,%todelete,%newdest,%newseqid);
     if ($numitems) {
         for (my $i=1; $i<=$numitems; $i++) {
             my $path = $env{'form.archive_content_'.$i};
@@ -10178,9 +10278,9 @@
                     my ($title,$url,$outer);
                     ($title) = ($path =~ m{/([^/]+)$});
                     $outer = 0;
-                    if (ref($hierarchy{$i}) eq 'ARRAY') {
-                        if (@{$hierarchy{$i}} > 0) {
-                            foreach my $item (reverse(@{$hierarchy{$i}})) {
+                    if (ref($dirorder{$i}) eq 'ARRAY') {
+                        if (@{$dirorder{$i}} > 0) {
+                            foreach my $item (reverse(@{$dirorder{$i}})) {
                                 if ($env{'form.archive_'.$item} eq 'display') {
                                     $outer = $item;
                                     last;
@@ -10195,7 +10295,7 @@
                     next if ($fatal);
                     if ((@archdirs > 0) && (grep(/^\Q$i\E$/, at archdirs))) {
                         if ($context eq 'coursedocs') {
-                            $mapinner{$i} = time; 
+                            $mapinner{$i} = time;
                             $folders{$i} = 'default_'.$mapinner{$i};
                             $containers{$i} = 'sequence';
                             my $url = '/uploaded/'.$docudom.'/'.$docuname.'/'.
@@ -10208,6 +10308,7 @@
                                 &LONCAPA::map::storemap('/uploaded/'.$docudom.'/'.
                                                         $docuname.'/'.$folders{$outer}.
                                                         '.'.$containers{$outer},1);
+                            $newseqid{$i} = $newidx;
                         }
                     } else {
                         if ($context eq 'coursedocs') {
@@ -10223,6 +10324,7 @@
                             }
                             if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") {
                                 system("mv $prefix$path $prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title");
+                                $newdest{$i} = "$prefix$dir/$docstype/$mapinner{$outer}/$newidx";
                             }
                             $LONCAPA::map::resources[$newidx]=
                                 $title.':'.$url.':false:normal:res';
@@ -10234,19 +10336,64 @@
                         }
                     }
                 } elsif ($env{'form.archive_'.$i} eq 'dependency') {
-                    if (ref($hierarchy{$i}) eq 'ARRAY') {
-                        foreach my $item (reverse(@{$hierarchy{$i}})) {
-                            if ($env{'form.archive_'.$item} eq 'display') {
-                                $referrer{$i} = $item;
-                                last;
-                                #FIXME identify as dependency in db file
-                                #FIXME need to move item to referrer location
-                                #FIXME need to setup httprefs so access allowed
-                            } elsif ($env{'form.archive_'.$item} eq 'discard') {
-                                $orphaned{$i} = $item;
-                                last;
+                    my ($title) = ($path =~ m{/([^/]+)$});
+                    $referrer{$i} = $env{'form.archive_dependent_on_'.$i};
+                    if ($env{'form.archive_'.$referrer{$i}} eq 'display') {
+                        if (ref($dirorder{$i}) eq 'ARRAY') {
+                            my ($itemidx,$fullpath);
+                            for (my $j=0; $j<@{$dirorder{$i}}; $j++) {
+                                if (ref($dirorder{$referrer{$i}}) eq 'ARRAY') {
+                                    my $container = $dirorder{$referrer{$i}}->[-1];
+                                    for (my $j=0; $j<@{$dirorder{$i}}; $j++) {
+                                        if ($dirorder{$i}->[$j] eq $container) {
+                                            $itemidx = $j;
+                                        }
+                                    }
+                                }
+                            }
+                            if ($itemidx ne '') {
+                                if (grep(/^\Q$referrer{$i}\E$/, at archdirs)) {
+                                    if ($mapinner{$referrer{$i}}) {
+                                        $fullpath = "$prefix$dir/$docstype/$mapinner{$referrer{$i}}";
+                                        for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) {
+                                            if (grep(/^\Q$dirorder{$i}->[$j]\E$/, at archdirs)) {
+                                                unless (defined($newseqid{$dirorder{$i}->[$j]})) {
+                                                    $fullpath .= '/'.$titles{$dirorder{$i}->[$j]};
+                                                    if (!-e $fullpath) {
+                                                        mkdir($fullpath,0755);
+                                                    }
+                                                }
+                                            } else {
+                                                last;
+                                            }
+                                        }
+                                    }
+                                } elsif ($newdest{$referrer{$i}}) {
+                                    $fullpath = $newdest{$referrer{$i}};
+                                    for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) {
+                                        if ($env{'form.archive_'.$dirorder{$i}->[$j]} eq 'discard') {
+                                            $orphaned{$i} = $env{'form.archive_'.$dirorder{$i}->[$j]};
+                                            last;
+                                        } elsif (grep(/^\Q$dirorder{$i}->[$j]\E$/, at archdirs)) {
+                                            unless (defined($newseqid{$dirorder{$i}->[$j]})) {
+                                                $fullpath .= '/'.$titles{$dirorder{$i}->[$j]};
+                                                if (!-e $fullpath) {
+                                                    mkdir($fullpath,0755);
+                                                }
+                                            }
+                                        } else {
+                                            last;
+                                        }
+                                    }
+                                }
+                                if ($fullpath ne '') {
+                                    system("mv $prefix$path $fullpath/$title");
+                                }
                             }
                         }
+                    } elsif ($env{'form.archive_'.$referrer{$i}} eq 'discard') {
+                        $warning .= &mt('[_1] is a dependency of [_2], which was discarded.',
+                                        $path,$env{'form.archive_content_'.$referrer{$i}}).'<br />';
                     }
                 }
             } else {


More information about the LON-CAPA-cvs mailing list