From caff35085f5ae47153a0bd11b893facde13c33b9 Mon Sep 17 00:00:00 2001 From: Stephane Gigandet Date: Thu, 30 Mar 2017 18:52:52 +0200 Subject: [PATCH] bug #319 - allow moving products to other instances of Product Opener running on the same server - OFF/OBF/OPFF --- cgi/product_multilingual.pl | 34 ++++++++++++++++++---- lib/ProductOpener/Config_obf.pm | 31 ++++++++++++++++++++ lib/ProductOpener/Config_off.pm | 30 +++++++++++++++++++ lib/ProductOpener/Display.pm | 9 ++++++ lib/ProductOpener/Products.pm | 51 ++++++++++++++++++++++----------- 5 files changed, 133 insertions(+), 22 deletions(-) diff --git a/cgi/product_multilingual.pl b/cgi/product_multilingual.pl index e55ea9ef0a959..7eaf7bba081d5 100755 --- a/cgi/product_multilingual.pl +++ b/cgi/product_multilingual.pl @@ -233,19 +233,35 @@ $debug and print STDERR "product.pl action: process - phase 1 - type: $type code $code\n"; # 26/01/2017 - disallow barcode changes until we fix bug #677 - if (0 and (defined param('new_code'))) { - my $new_code = normalize_code(param('new_code')); + if ($admin and (defined param('new_code'))) { + my $new_code = param('new_code'); + my $new_server = ""; + my $new_data_root = $data_root; + + if ($new_code =~ /^([a-z]+)$/) { + $new_server = $1; + if ((defined $options{other_servers}) and (defined $options{other_servers}{$new_server}) + and ($options{other_servers}{$new_server}{data_root} ne $data_root)) { + $new_code = $code; + $new_data_root = $options{other_servers}{$new_server}{data_root}; + } + } + + $new_code = normalize_code($new_code); if ($new_code =~ /^\d+$/) { # check that the new code is available - if (-e "$data_root/products/" . product_path($new_code)) { + if (-e "$new_data_root/products/" . product_path($new_code)) { push @errors, lang("error_new_code_already_exists"); - print STDERR "product.pl - cannot change code $code to $new_code (already exists)\n"; + print STDERR "product.pl - cannot change code $code to $new_code - $new_server (already exists)\n"; } else { $product_ref->{old_code} = $code; $code = $new_code; $product_ref->{code} = $code; - print STDERR "product.pl - changing code $product_ref->{old_code} to $code\n"; + if ($new_server ne '') { + $product_ref->{new_server} = $new_server; + } + print STDERR "product.pl - changing code $product_ref->{old_code} to $code - $new_server\n"; } } } @@ -1862,7 +1878,13 @@ ($$$$$$) $comment = $comment . remove_tags_and_quote(decode utf8=>param('comment')); store_product($product_ref, $comment); - $html .= "

" . lang("product_changes_saved") . "

" + my $product_url = product_url($product_ref); + + if (defined $product_ref->{new_server}) { + $product_url = "https://" . $subdomain . "." . $options{other_servers}{$product_ref->{new_server}}{domain} . $product_url; + } + + $html .= "

" . lang("product_changes_saved") . "

" . lang("see_product_page") . "

"; if ($type eq 'delete') { diff --git a/lib/ProductOpener/Config_obf.pm b/lib/ProductOpener/Config_obf.pm index 9e503172ed83d..829cf03c5fd7a 100644 --- a/lib/ProductOpener/Config_obf.pm +++ b/lib/ProductOpener/Config_obf.pm @@ -211,4 +211,35 @@ last_edit_dates ); +# allow moving products to other instances of Product Opener on the same server +# e.g. OFF -> OBF +$options{other_servers} = { +obf => +{ + name => "Open Beauty Facts", + data_root => "/home/obf", + www_root => "/home/obf/html", + mongodb => "obf", + domain => "openbeautyfacts.org", +}, +off => +{ + name => "Open Food Facts", + data_root => "/home/off", + www_root => "/home/off/html", + mongodb => "off", + domain => "openfoodfacts.org", +}, +opff => +{ + prefix => "opff", + name => "Open Pet Food Facts", + data_root => "/home/opff", + www_root => "/home/opff/html", + mongodb => "opff", + domain => "openpetfoodfacts.org", +} +}; + + 1; diff --git a/lib/ProductOpener/Config_off.pm b/lib/ProductOpener/Config_off.pm index b67d6efe321eb..1d8f52b583c71 100644 --- a/lib/ProductOpener/Config_off.pm +++ b/lib/ProductOpener/Config_off.pm @@ -246,4 +246,34 @@ last_edit_dates ); +# allow moving products to other instances of Product Opener on the same server +# e.g. OFF -> OBF +$options{other_servers} = { +obf => +{ + name => "Open Beauty Facts", + data_root => "/home/obf", + www_root => "/home/obf/html", + mongodb => "obf", + domain => "openbeautyfacts.org", +}, +off => +{ + name => "Open Food Facts", + data_root => "/home/off", + www_root => "/home/off/html", + mongodb => "off", + domain => "openfoodfacts.org", +}, +opff => +{ + prefix => "opff", + name => "Open Pet Food Facts", + data_root => "/home/opff", + www_root => "/home/opff/html", + mongodb => "opff", + domain => "openpetfoodfacts.org", +} +}; + 1; diff --git a/lib/ProductOpener/Display.pm b/lib/ProductOpener/Display.pm index d690a086b068d..9dd1864b5e55a 100644 --- a/lib/ProductOpener/Display.pm +++ b/lib/ProductOpener/Display.pm @@ -142,6 +142,15 @@ $products_collection = $database->get_collection('products'); $emb_codes_collection = $database->get_collection('emb_codes'); +if (defined $options{other_servers}) { + + foreach my $server (keys %{$options{other_servers}}) { + $options{other_servers}{$server}{database} = $connection->get_database($options{other_servers}{$server}{mongodb}); + $options{other_servers}{$server}{products_collection} = $options{other_servers}{$server}{database}->get_collection('products'); + } +} + + $default_request_ref = { page=>1, }; diff --git a/lib/ProductOpener/Products.pm b/lib/ProductOpener/Products.pm index a1656bbda8bf1..6a9852e3abeb9 100644 --- a/lib/ProductOpener/Products.pm +++ b/lib/ProductOpener/Products.pm @@ -212,14 +212,31 @@ sub store_product($$) { my $path = product_path($code); my $rev = $product_ref->{rev}; + # In case we need to move a product from OFF to OBF etc. + # then we first move the existing files (product and images) + # and then store the product with a comment. + + my $new_data_root = $data_root; + my $new_www_root = $www_root; + my $new_products_collection = $products_collection; + + # Changing the code? # 26/01/2017 - disallow code changes until we fix #677 - if (0 and (defined $product_ref->{old_code})) { + if ($admin and (defined $product_ref->{old_code})) { my $old_code = $product_ref->{old_code}; my $old_path = product_path($old_code); - print STDERR "Products::store_product - move from $old_code to $code\n"; + + if (defined $product_ref->{new_server}) { + my $new_server = $product_ref->{new_server}; + $new_data_root = $options{other_servers}{$new_server}{data_root}; + $new_www_root = $options{other_servers}{$new_server}{data_root}; + $new_products_collection = $options{other_servers}{$new_server}{products_collection}; + } + + print STDERR "Products::store_product - move from $old_code to $code - $new_data_root \n"; # Move directory @@ -227,7 +244,7 @@ sub store_product($$) { $prefix_path =~ s/\/[^\/]+$//; # remove the last subdir: we'll move it print STDERR "Products::store_product - path: $path - prefix_path: $prefix_path\n"; # Create the directories for the product - foreach my $current_dir ($data_root . "/products", $www_root . "/images/products") { + foreach my $current_dir ($new_data_root . "/products", $new_www_root . "/images/products") { (-e "$current_dir") or mkdir($current_dir, 0755); foreach my $component (split("/", $prefix_path)) { $current_dir .= "/$component"; @@ -235,12 +252,12 @@ sub store_product($$) { } } - if ((! -e "$data_root/products/$path") - and (! -e "$www_root/images/products/$path")) { + if ((! -e "$new_data_root/products/$path") + and (! -e "$new_www_root/images/products/$path")) { use File::Copy; print STDERR "Products::store_product - move from $data_root/products/$old_path to $data_root/products/$path (new)\n"; - move("$data_root/products/$old_path", "$data_root/products/$path") or print STDERR "error moving data from $data_root/products/$old_path to $data_root/products/$path : $!\n"; - move("$www_root/images/products/$old_path", "$www_root/images/products/$path") or print STDERR "error moving html from $www_root/images/products/$old_path to $www_root/images/products/$path : $!\n"; + move("$data_root/products/$old_path", "$new_data_root/products/$path") or print STDERR "error moving data from $data_root/products/$old_path to $new_data_root/products/$path : $!\n"; + move("$www_root/images/products/$old_path", "$new_www_root/images/products/$path") or print STDERR "error moving html from $www_root/images/products/$old_path to $new_www_root/images/products/$path : $!\n"; delete $product_ref->{old_code}; @@ -258,7 +275,7 @@ sub store_product($$) { if ($rev < 1) { # Create the directories for the product - foreach my $current_dir ($data_root . "/products", $www_root . "/images/products") { + foreach my $current_dir ($new_data_root . "/products", $new_www_root . "/images/products") { (-e "$current_dir") or mkdir($current_dir, 0755); foreach my $component (split("/", $path)) { $current_dir .= "/$component"; @@ -268,7 +285,7 @@ sub store_product($$) { } # Check lock and previous version - my $changes_ref = retrieve("$data_root/products/$path/changes.sto"); + my $changes_ref = retrieve("$new_data_root/products/$path/changes.sto"); if (not defined $changes_ref) { $changes_ref = []; } @@ -331,23 +348,25 @@ sub store_product($$) { $product_ref->{complete} += 0; $product_ref->{sortkey} += 0; + + if ($product_ref->{deleted}) { - $products_collection->remove({"_id" => $product_ref->{_id}}); + $new_products_collection->remove({"_id" => $product_ref->{_id}}); } else { - $products_collection->save($product_ref); + $new_products_collection->save($product_ref); } - store("$data_root/products/$path/$rev.sto", $product_ref); + store("$new_data_root/products/$path/$rev.sto", $product_ref); # Update link - my $link = "$data_root/products/$path/product.sto"; + my $link = "$new_data_root/products/$path/product.sto"; if (-l $link) { unlink($link) or print STDERR "Products::store_product could not unlink $link : $! \n"; } - #symlink("$data_root/products/$path/$rev.sto", $link) or print STDERR "Products::store_product could not symlink $data_root/products/$path/$rev.sto to $link : $! \n"; - symlink("$rev.sto", $link) or print STDERR "Products::store_product could not symlink $data_root/products/$path/$rev.sto to $link : $! \n"; + #symlink("$new_data_root/products/$path/$rev.sto", $link) or print STDERR "Products::store_product could not symlink $new_data_root/products/$path/$rev.sto to $link : $! \n"; + symlink("$rev.sto", $link) or print STDERR "Products::store_product could not symlink $new_data_root/products/$path/$rev.sto to $link : $! \n"; - store("$data_root/products/$path/changes.sto", $changes_ref); + store("$new_data_root/products/$path/changes.sto", $changes_ref); }