From 933b820e0799e413ab680eba1753cec506108b1e Mon Sep 17 00:00:00 2001 From: plegall Date: Sat, 11 Oct 2008 20:37:54 +0000 Subject: feature 892 added: pwg.images.setInfo added so that once we have discovered the photo was already in the database (thanks to pwg.images.exist), we can only set the photo metadata. git-svn-id: http://piwigo.org/svn/branches/2.0@2722 68402e56-0260-453c-a942-63ccdbb3a9ee --- include/ws_functions.inc.php | 259 +++++++++++++++++++++++++++++-------------- tools/piwigo_remote.pl | 21 +++- ws.php | 21 ++++ 3 files changed, 219 insertions(+), 82 deletions(-) diff --git a/include/ws_functions.inc.php b/include/ws_functions.inc.php index f14aff70a..4f75c8e49 100644 --- a/include/ws_functions.inc.php +++ b/include/ws_functions.inc.php @@ -1064,89 +1064,9 @@ SELECT $image_id = mysql_insert_id(); // let's add links between the image and the categories - // - // $params['categories'] should look like 123,12;456,auto;789 which means: - // - // 1. associate with category 123 on rank 12 - // 2. associate with category 456 on automatic rank - // 3. associate with category 789 on automatic rank if (isset($params['categories'])) { - $cat_ids = array(); - $rank_on_category = array(); - $search_current_ranks = false; - - $tokens = explode(';', $params['categories']); - foreach ($tokens as $token) - { - list($cat_id, $rank) = explode(',', $token); - - array_push($cat_ids, $cat_id); - - if (!isset($rank)) - { - $rank = 'auto'; - } - $rank_on_category[$cat_id] = $rank; - - if ($rank == 'auto') - { - $search_current_ranks = true; - } - } - - $cat_ids = array_unique($cat_ids); - - if (count($cat_ids) > 0) - { - if ($search_current_ranks) - { - $query = ' -SELECT - category_id, - MAX(rank) AS max_rank - FROM '.IMAGE_CATEGORY_TABLE.' - WHERE rank IS NOT NULL - AND category_id IN ('.implode(',', $cat_ids).') - GROUP BY category_id -;'; - $current_rank_of = simple_hash_from_query( - $query, - 'category_id', - 'max_rank' - ); - - foreach ($cat_ids as $cat_id) - { - if ('auto' == $rank_on_category[$cat_id]) - { - $rank_on_category[$cat_id] = $current_rank_of[$cat_id] + 1; - } - } - } - - $inserts = array(); - - foreach ($cat_ids as $cat_id) - { - array_push( - $inserts, - array( - 'image_id' => $image_id, - 'category_id' => $cat_id, - 'rank' => $rank_on_category[$cat_id], - ) - ); - } - - mass_inserts( - IMAGE_CATEGORY_TABLE, - array_keys($inserts[0]), - $inserts - ); - - update_category($cat_ids); - } + ws_add_image_category_relations($image_id, $params['categories']); } // and now, let's create tag associations @@ -1496,4 +1416,181 @@ SELECT return $result; } + +function ws_images_setInfo($params, &$service) +{ + global $conf; + if (!is_admin() || is_adviser() ) + { + return new PwgError(401, 'Access denied'); + } + + // name + // category_id + // file_content + // file_sum + // thumbnail_content + // thumbnail_sum + + $params['image_id'] = (int)$params['image_id']; + if ($params['image_id'] <= 0) + { + return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id"); + } + + $query=' +SELECT * + FROM '.IMAGES_TABLE.' + WHERE id = '.$params['image_id'].' +;'; + + $image_row = mysql_fetch_assoc(pwg_query($query)); + if ($image_row == null) + { + return new PwgError(404, "image_id not found"); + } + + // database registration + $update = array( + 'id' => $params['image_id'], + ); + + $info_columns = array( + 'name', + 'author', + 'comment', + 'level', + 'date_creation', + ); + + $perform_update = false; + foreach ($info_columns as $key) + { + if (isset($params[$key])) + { + $perform_update = true; + $update[$key] = $params[$key]; + } + } + + if ($perform_update) + { + include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); + mass_updates( + IMAGES_TABLE, + array( + 'primary' => array('id'), + 'update' => array_diff(array_keys($update), array('id')) + ), + array($update) + ); + } + + if (isset($params['categories'])) + { + ws_add_image_category_relations( + $params['image_id'], + $params['categories'] + ); + } + + // and now, let's create tag associations + if (isset($params['tag_ids'])) + { + include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); + add_tags( + explode(',', $params['tag_ids']), + array($params['image_id']) + ); + } + + invalidate_user_cache(); +} + +function ws_add_image_category_relations($image_id, $categories_string) +{ + // let's add links between the image and the categories + // + // $params['categories'] should look like 123,12;456,auto;789 which means: + // + // 1. associate with category 123 on rank 12 + // 2. associate with category 456 on automatic rank + // 3. associate with category 789 on automatic rank + $cat_ids = array(); + $rank_on_category = array(); + $search_current_ranks = false; + + $tokens = explode(';', $categories_string); + foreach ($tokens as $token) + { + list($cat_id, $rank) = explode(',', $token); + + array_push($cat_ids, $cat_id); + + if (!isset($rank)) + { + $rank = 'auto'; + } + $rank_on_category[$cat_id] = $rank; + + if ($rank == 'auto') + { + $search_current_ranks = true; + } + } + + $cat_ids = array_unique($cat_ids); + + if (count($cat_ids) > 0) + { + if ($search_current_ranks) + { + $query = ' +SELECT + category_id, + MAX(rank) AS max_rank + FROM '.IMAGE_CATEGORY_TABLE.' + WHERE rank IS NOT NULL + AND category_id IN ('.implode(',', $cat_ids).') + GROUP BY category_id +;'; + $current_rank_of = simple_hash_from_query( + $query, + 'category_id', + 'max_rank' + ); + + foreach ($cat_ids as $cat_id) + { + if ('auto' == $rank_on_category[$cat_id]) + { + $rank_on_category[$cat_id] = $current_rank_of[$cat_id] + 1; + } + } + } + + $inserts = array(); + + foreach ($cat_ids as $cat_id) + { + array_push( + $inserts, + array( + 'image_id' => $image_id, + 'category_id' => $cat_id, + 'rank' => $rank_on_category[$cat_id], + ) + ); + } + + include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); + mass_inserts( + IMAGE_CATEGORY_TABLE, + array_keys($inserts[0]), + $inserts + ); + + update_category($cat_ids); + } +} ?> diff --git a/tools/piwigo_remote.pl b/tools/piwigo_remote.pl index 3e3031c82..2a3876b87 100644 --- a/tools/piwigo_remote.pl +++ b/tools/piwigo_remote.pl @@ -18,7 +18,7 @@ our $ua = LWP::UserAgent->new; $ua->cookie_jar({}); my %conf; -$conf{base_url} = 'http://localhost/~pierrick/piwigo/trunk'; +$conf{base_url} = 'http://localhost/~pierrick/piwigo/2.0'; $conf{response_format} = 'json'; $conf{username} = 'pierrick'; $conf{password} = 'z0rglub'; @@ -192,6 +192,25 @@ if ($opt{action} eq 'pwg.images.exist') { # print Dumper($response); } +if ($opt{action} eq 'pwg.images.setInfo') { + $form = { + method => $opt{action}, + }; + + foreach my $key (keys %{ $opt{define} }) { + $form->{$key} = $opt{define}{$key}; + } + + my $response = $ua->post( + $conf{base_url}.'/ws.php?format=json', + $form + ); + + use Data::Dumper; + # print Dumper(from_json($response->content)->{result}); + print Dumper($response); +} + $query = pwg_ws_get_query( method => 'pwg.session.logout' ); diff --git a/ws.php b/ws.php index f36053312..b23909cae 100644 --- a/ws.php +++ b/ws.php @@ -238,6 +238,27 @@ function ws_addDefaultMethods( $arr ) ), 'check existence of a photo list' ); + + $service->addMethod( + 'pwg.images.setInfo', + 'ws_images_setInfo', + array( + 'image_id' => array(), + + 'name' => array('default' => null), + 'author' => array('default' => null), + 'date_creation' => array('default' => null), + 'comment' => array('default' => null), + 'categories' => array('default' => null), + 'tag_ids' => array('default' => null), + 'level' => array( + 'default' => 0, + 'maxValue' => $conf['available_permission_levels'] + ), + ), + 'POST method only. Admin only +
categories is a string list "category_id[,rank];category_id[,rank]" The rank is optional and is equivalent to "auto" if not given.' + ); } add_event_handler('ws_add_methods', 'ws_addDefaultMethods'); -- cgit v1.2.3