home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / FAQ / discus_admin_1357211388 / source / fcn-pgmv.pl < prev    next >
Text File  |  2009-11-06  |  11KB  |  242 lines

  1. # FILE: fcn-pgmv.pl
  2. # DESCRIPTION: Move an entire page from one place to another
  3. #-------------------------------------------------------------------------------
  4. # DISCUS COPYRIGHT NOTICE
  5. #
  6. # Discus is copyright (c) 2002 by DiscusWare, LLC, all rights reserved.
  7. # The use of Discus is governed by the Discus License Agreement which is
  8. # available from the Discus WWW site at:
  9. #    http://www.discusware.com/discus/license
  10. #
  11. # Pursuant to the Discus License Agreement, this copyright notice may not be
  12. # removed or altered in any way.
  13. #-------------------------------------------------------------------------------
  14.  
  15. use strict;
  16. use vars qw($GLOBAL_OPTIONS $DCONF $PARAMS);
  17.  
  18. ###
  19. ### move_page
  20. ###
  21. ### Moves a page from one place to another
  22. ###
  23.  
  24. sub move_page {
  25.     my ($arg, $old_topic_tree, $new_topic_tree, $file_in, $user, $new_file_in) = @_;
  26.     return undef if $arg->{new_page} == $arg->{page} && $arg->{new_topic} == $arg->{topic} && $arg->{new_conversation} == 0;
  27.     dreq("fcn-tree");
  28.     my $OLDTREE = defined $old_topic_tree ? $old_topic_tree : read_tree($arg->{topic}, { no_unlock => 1 });
  29.     my @mv = keys(%{$arg->{move}});
  30.     my $mv_c = {};
  31.     my $q_c = tree_categorize($OLDTREE);
  32.     foreach my $l (@mv) {
  33.         if ($l == $arg->{new_page}) {
  34.             unlock("$DCONF->{admin_dir}/msg_index/$arg->{topic}-tree.txt");
  35.             error_message("Illegal Destination", "You cannot move pages onto themselves.", 0, 1) if ! $arg->{archive_action};
  36.             return undef;
  37.         }
  38.         my $j = tree_build_children_of($OLDTREE, $q_c, $l);
  39.         my @j = @{$j}; @j = tree_flatten(@j);
  40.         foreach my $child (@j) {
  41.             if ($child->{page} == $arg->{new_page}) {
  42.                 unlock("$DCONF->{admin_dir}/msg_index/$arg->{topic}-tree.txt");
  43.                 error_message("Illegal Destination", "You cannot move pages onto their children.", 0, 1) if ! $arg->{archive_action};
  44.                 return undef;
  45.             }
  46.         }
  47.     }    
  48.     my $NEWTREE = $arg->{topic} == $arg->{new_topic} ? $OLDTREE : (defined $new_topic_tree ? $new_topic_tree : read_tree($arg->{new_topic}, { no_unlock => 1 }));
  49.     my $OLDFILE = defined $file_in ? $file_in : GetPage($arg->{topic}, $arg->{page}, { lock => 1 });
  50.     my $NEWFILE = undef;
  51.     my @m1 = (); my @m2 = ();
  52.     foreach my $subt (@{ $OLDFILE->{sublist} }) {
  53.         next if $subt->{number} == 0;
  54.         if ($arg->{move}->{$subt->{number}}) {
  55.             push @m2, $subt;
  56.         } else {
  57.             push @m1, $subt;
  58.         }
  59.     }
  60.     if (scalar(@m2) == 0) {
  61.         unlock("$DCONF->{message_dir}/$arg->{topic}/$arg->{page}.$DCONF->{ext}");
  62.         unlock("$DCONF->{admin_dir}/msg_index/$arg->{topic}-tree.txt") if ! defined $old_topic_tree;
  63.         unlock("$DCONF->{admin_dir}/msg_index/$arg->{new_topic}-tree.txt") if ! defined $new_topic_tree;;
  64.         return (undef, $OLDTREE, $NEWTREE);
  65.     }
  66.     @m2 = grep($_->{number} > 0, @m2);
  67.     @m1 = grep($_->{number} > 0, @m1);
  68.     $OLDFILE->{sublist} = \@m1;
  69.     if ($arg->{new_conversation} == 1) {
  70.         dreq("fcn-pgad");
  71.         my $narg = {};
  72.         $narg->{topic} = $arg->{new_topic} == 0 ? $arg->{topic} : $arg->{new_topic};
  73.         $narg->{host} = $arg->{new_page} == 0 ? $arg->{page} : $arg->{new_page};
  74.         $narg->{type} = defined $arg->{type} ? $arg->{type} : 0;
  75.         $narg->{name} = $arg->{create_new_page_name};
  76.         $narg->{lastmod} = 1;
  77.         $narg->{nosetpage} = 1;
  78.         $narg->{tree_ref} = $NEWTREE;
  79.         $file_in = $OLDFILE if $arg->{new_page} == $arg->{page};
  80.         $narg->{pagehash} = $file_in if defined $file_in;
  81.         $narg->{pagehash} = $OLDFILE if $OLDFILE->{head}->{me_number} == $arg->{page};
  82.         my $ap = add_page($narg);
  83.         $NEWFILE = $ap->{newfile};
  84.         $arg->{new_page} = $ap->{number};
  85.         if (defined $file_in && $arg->{new_page} != $arg->{page}) {
  86.             SetPage($ap->{pghash}, { unlock => 1 });
  87.         }
  88.         $OLDFILE = $ap->{pghash} if $arg->{new_page} == $arg->{page};
  89.         $NEWTREE = $ap->{tree};
  90.         $OLDTREE = $ap->{tree} if $arg->{new_topic} == $arg->{topic};
  91.         $NEWFILE->{sublist} = \@m2;
  92.     } else {
  93.         $NEWFILE = defined $new_file_in ? $new_file_in : GetPage($arg->{new_topic}, $arg->{new_page}, { lock => 1 });
  94.         push @{ $NEWFILE->{sublist} }, @m2;
  95.     }
  96.     my ($tf, $ca, $pg, $Y) = tree_remove_page($OLDTREE, undef, join(",", keys(%{ $arg->{move} })), $arg->{old_page});
  97.     my @y = @{ $Y };
  98.     $OLDTREE = $tf;
  99.     $NEWTREE = $tf if $arg->{topic} == $arg->{new_topic};
  100.     my $newca = tree_categorize($NEWTREE);
  101.     my $newpagetree = $NEWTREE->[ $newca->{array_pos}->{$arg->{new_page}} ];
  102.     my $baselevel = $y[0]->{level};
  103.     my $posts = 0; my $subs = 0; my $lastmod = ""; my $lastpost = "";
  104.     my @mp = ();
  105.     foreach my $thing (@y) {
  106.         $posts += scalar(split(/,/, $thing->{post_list}));
  107.         push @mp, split(/,/, $thing->{post_list});
  108.         $subs += 1;
  109.         if ($thing->{lastmod} > $lastmod) {
  110.             $lastmod = $thing->{lastmod};
  111.             $lastpost = $thing->{last_poster};
  112.         }
  113.         $thing->{topic} = $arg->{new_topic};
  114.         $thing->{parent} = $arg->{new_page} if $thing->{parent} == $arg->{page};
  115.         $thing->{level} = $newpagetree->{level} + $thing->{level} - $baselevel + 1;
  116.         if ($arg->{archive_action}) {
  117.             $thing->{param} =~ s/Add//g if $GLOBAL_OPTIONS->{autoarchive_msgadd} == 0;
  118.             $thing->{param} =~ s/Create//g;
  119.             $thing->{param} .= "Archive" if $thing->{param} !~ /Archive/;
  120.         }
  121.     }
  122.     ($tf, $ca) = tree_upward_update($tf, $ca, $arg->{page}, { metoo => 1, posts => "-$posts", subs => "-$subs" });
  123.     $OLDTREE = $tf;
  124.     $NEWTREE = $tf if $arg->{topic} == $arg->{new_topic};
  125.     my ($tf2, $ca2) = tree_insert_record($NEWTREE, $newca, \@y);
  126.     ($tf2, $ca2) = tree_upward_update($tf2, $ca2, $arg->{new_page}, { metoo => 1, safe => 1, lastmod => $lastmod, last_poster => $lastpost, posts => "+$posts", subs => "+$subs" });
  127.     $tf2->[ $ca2->{array_pos}->{$arg->{new_page}} ]->{param} .= "Sublist" if $newpagetree->{param} !~ /Sublist/;
  128.     $NEWTREE = $tf2;
  129.     $OLDTREE = $arg->{topic} == $arg->{new_topic} ? $tf2 : $tf;
  130.     $OLDFILE->{sublist} = expand_sublist($OLDFILE->{sublist}, $arg->{topic}, $OLDTREE);
  131.     $NEWFILE->{sublist} = expand_sublist($NEWFILE->{sublist}, $arg->{new_topic}, $NEWTREE);
  132.     @{ $NEWFILE->{sublist} } = sort sort_archive_method @{ $NEWFILE->{sublist} } if $GLOBAL_OPTIONS->{sort_archive_method_on};
  133.     @{ $OLDFILE->{sublist} } = sort sort_archive_method @{ $OLDFILE->{sublist} } if $GLOBAL_OPTIONS->{sort_archive_method_on};
  134.     $OLDFILE->{general}->{subtopic_raw} = 0;
  135.     $NEWFILE->{general}->{subtopic_raw} = 0;
  136.     $NEWFILE->{head}->{param} .= "Sublist" if $NEWFILE->{head}->{param} !~ /Sublist/;
  137.     SetPage($OLDFILE, { unlock => 1 }) if ! $arg->{no_write_files};
  138.     SetPage($NEWFILE, { unlock => 1 }) if ! $arg->{no_write_files};
  139.     write_tree($arg->{new_topic}, $NEWTREE, { no_lock => 1 }) if ! defined $new_topic_tree;
  140.     if (! defined $new_topic_tree) {
  141.         my $main_tree = readfile("$DCONF->{admin_dir}/tree.txt", "move_page", { no_unlock => 1 });
  142.         $main_tree = topic_tree_to_main($NEWTREE, $main_tree, { no_write => 1 });
  143.         $main_tree = topic_tree_to_main($OLDTREE, $main_tree, { no_write => 1 });
  144.         writefile("$DCONF->{admin_dir}/tree.txt", $main_tree, "move_page", { no_lock => 1 });
  145.     }
  146.     if ($arg->{topic} == $arg->{new_topic}) {
  147.         pages_upward_update($NEWTREE, $ca2, [ $arg->{page}, $arg->{new_page} ]) if ! $arg->{man_archive_action};
  148.     } else {
  149.         write_tree($arg->{topic}, $OLDTREE, { no_lock => 1 }) if ! defined $old_topic_tree;
  150.         pages_upward_update($NEWTREE, $ca2, [ $arg->{new_page} ]) if ! $arg->{man_archive_action};
  151.         pages_upward_update($OLDTREE, $ca, [ $arg->{page} ]) if ! $arg->{man_archive_action};
  152.     }        
  153.     my $moved_count = scalar(keys(%{ $arg->{move} }));
  154.     my $pages_count = scalar(@y);
  155.     if ($moved_count == $pages_count && $arg->{topic} == $arg->{new_topic} && scalar(@y) < 5) {
  156.         foreach my $page (@m2) {
  157.             next if $page->{type} != 0;
  158.             next if $page->{islink};
  159.             next if $page->{number} == 0;
  160.             my $p = {};
  161.             $p->{lock} = 1 if $arg->{man_archive_action} == 0;
  162.             my $i = GetPage($arg->{topic}, $page->{number}, $p);
  163.             $i->{head}->{parent} = $arg->{new_page};
  164.             $i->{head}->{levels} = $NEWFILE->{head}->{levels};
  165.             if ($arg->{archive_action}) {
  166.                 $i->{head}->{param} =~ s/Add//g if $GLOBAL_OPTIONS->{autoarchive_msgadd} == 0;
  167.                 $i->{head}->{param} =~ s/Create//g;
  168.                 $i->{head}->{param} .= "Archive" if $i->{head}->{param} !~ /Archive/;
  169.             }
  170.             push @{$i->{head}->{levels}}, { level_name => $i->{me_name}, level_number => $i->{me_number} };
  171.             $i->{sublist} = expand_sublist($i->{sublist}, $arg->{topic}, $NEWTREE);
  172.             SetPage($i, { unlock => 1 });    
  173.         }
  174.         return ($NEWFILE, $NEWTREE, $OLDFILE, $OLDTREE);
  175.     } elsif ($arg->{archive_action} || ($arg->{topic} == $arg->{new_topic} && scalar(@y) < 5)) {
  176.         foreach my $page (@y) {
  177.             next if $page->{type} != 0;
  178.             next if $page->{islink};
  179.             next if $page->{page} == 0;
  180.             my $p = {};
  181.             $p->{lock} = 1 if $arg->{man_archive_action} == 0;
  182.             my $i = GetPage($arg->{topic}, $page->{page}, $p);
  183.             if ($i->{head}->{parent} == $arg->{page}) {
  184.                 $i->{head}->{parent} = $arg->{new_page};
  185.                 $i->{head}->{levels} = $NEWFILE->{head}->{levels};
  186.             } else {
  187.                 my @l = ();
  188. W:                while (my $l = pop @{ $i->{head}->{levels} }) {
  189.                     last W if $l->{level_number} == $arg->{page};
  190.                     unshift @l, $l;
  191.                 }
  192.                 unshift @l, @{ $NEWFILE->{head}->{levels} };
  193.                 $i->{head}->{levels} = \@l;
  194.             }
  195.             push @{$i->{head}->{levels}}, { level_name => $i->{me_name}, level_number => $i->{me_number} };
  196.             if ($arg->{archive_action}) {
  197.                 $i->{head}->{param} =~ s/Add//g if $GLOBAL_OPTIONS->{autoarchive_msgadd} == 0;
  198.                 $i->{head}->{param} =~ s/Create//g;
  199.                 $i->{head}->{param} .= "Archive" if $i->{head}->{param} !~ /Archive/;
  200.             }
  201.             if ($arg->{topic} != $arg->{new_topic}) {
  202.                 $i->{head}->{topic_number} = $arg->{new_topic};
  203.                 $i->{head}->{topic_name} = $NEWFILE->{head}->{topic_name};
  204.                 my $new_topic = $arg->{new_topic};
  205.                 my $att = attachment_scan($i->{messages});
  206.                 my $sdir = get_message_path($arg->{topic});
  207.                 if (ref $att eq 'ARRAY' && scalar(@{$att})) {
  208.                     my $ddir = get_message_path($arg->{new_topic});
  209.                     foreach my $Z (@{$att}) {
  210.                         $i->{messages}->[$Z->{counter}]->{text} =~ s%/$arg->{topic}/$Z->{filename}%/$arg->{new_topic}/$Z->{filename}%gi;
  211.                         writefile_binary("$ddir/$Z->{filename}", readfile_binary("$sdir/$Z->{filename}")) && unlink "$sdir/$Z->{filename}";
  212.                     }
  213.                 }
  214.                 unlink "$sdir/$i->{head}->{me_number}.$DCONF->{ext}";
  215.             }
  216.             $i->{sublist} = expand_sublist($i->{sublist}, $arg->{new_topic}, $NEWTREE);
  217.             $i->{general}->{subtopic_raw} = 0;        
  218.             $i->{general}->{messages_raw} = 0;        
  219.             SetPage($i, { unlock => 1 });    
  220.         }
  221.         return ($NEWFILE, $NEWTREE, $OLDFILE, $OLDTREE);
  222.     } else {
  223.         dreq("fcn-regn");
  224.         my @m = ();
  225.         my $inc = incremental_descendants($arg->{topic}, $arg->{page}, "MP", $NEWTREE, undef, \@m, $Y);
  226.         my @arg = ();
  227.         push @arg, join(",", keys(%{$arg->{move}}));
  228.         push @arg, $arg->{topic};
  229.         push @arg, $NEWFILE->{head}->{topic_number};
  230.         push @arg, $NEWFILE->{head}->{topic_name};
  231.         foreach my $J (@{ $NEWFILE->{head}->{levels} }) {
  232.             push @arg, $J->{level_number};
  233.             push @arg, $J->{level_name};
  234.         }
  235.         my $chgfile = regeneration_create_change_process_file("regen_move_page_functions", @arg);
  236.         regenerate_board({ esc => 1, hold => regeneration_create_hold({ HTTP_REFERER => "/$arg->{topic}/$arg->{page}" }), topic => $arg->{topic}, tempfile => $inc->{tempfile}, done => 0, total => $inc->{count}, action => "regen4", username => $user, changefile => $chgfile, operation => 6, description => 601 }, undef, 1);
  237.         return ($NEWFILE, $NEWTREE, $OLDFILE, $OLDTREE);
  238.     }
  239. }
  240.  
  241. 1;
  242.