From 1f5e4da841270bdb1a9ed482a551c9445ea9522c Mon Sep 17 00:00:00 2001 From: jygaulier Date: Mon, 4 Nov 2013 19:36:29 +0100 Subject: [PATCH 1/6] added tests for "phrasea_public_query" and "phrasea_highlight" in console/checkExtension --- lib/classes/module/console/checkExtension.php | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/lib/classes/module/console/checkExtension.php b/lib/classes/module/console/checkExtension.php index 221fda15af..74ae8bbaf5 100644 --- a/lib/classes/module/console/checkExtension.php +++ b/lib/classes/module/console/checkExtension.php @@ -202,6 +202,36 @@ class module_console_checkExtension extends Command return 1; } + + // test disconnected mode if available + // prepare the test before closing session + if(function_exists("phrasea_public_query")) + { + // fill an array for each sbas to query + $tbases = array(); + foreach ($phSession["bases"] as $phbase) { + // fill an array of collections to query for this sbas + $tcoll = array(); + foreach ($phbase["collections"] as $coll) { + $tcoll[] = 0 + $coll["base_id"]; + } + + if (sizeof($tcoll) > 0) { + // parse the query for this sbas + $qp = new PhraseaEngineQueryParser($this->container); + $treeq = $qp->parsequery($input->getOption('query')); + $arrayq = $qp->makequery($treeq); + + $tbases["S".$phbase["sbas_id"]] = array( // key does no matter + "sbas_id" => $phbase["sbas_id"], // sbas_id + "searchcoll" => $tcoll, // colls to query + "arrayq" => $arrayq // parsed query + ); + } + } + } + + $output->writeln("\n-- phrasea_close_session --"); $rs = phrasea_close_session($sessid); @@ -214,6 +244,70 @@ class module_console_checkExtension extends Command return 1; } + + + // session is closed, test disconnected mode if available + if(function_exists("phrasea_public_query")) + { + $output->writeln("\n-- phrasea_public_query(...0, 5,...) --"); + + $ret = phrasea_public_query( + $tbases // array of sbas with colls and query + , PHRASEA_MULTIDOC_DOCONLY // mode + , '' // sortfield + , array() // search business fields + , '' // lng for stemmed search + , 0 // offset for first answer (start=0) + , 5 // nbr of answers + , true // verbose output (chrono, sql...) + ); + + if(is_array($ret) && array_key_exists("results", $ret) && is_array($ret["results"])) { + $output->writeln( sprintf("Succes ! returned %d answers", count($ret["results"])) ); + } else { + $output->writeln("Failed ! "); + + return 1; + } + + + foreach($ret['results'] as $result) + { + $sbid = $result["sbid"]; + $rid = $result["rid"]; + $q = $tbases["S".$sbid]["arrayq"]; // query tree + + $h = phrasea_highlight( + $sbid // sbas_id + , $rid // record_id + , $q // query parsed + , "" // lng for stemmed + , false // verbose output (chrono, sql...) + ); + + $output->writeln(sprintf("\n-- phrasea_highlight(%d, %d,...) --", $sbid, $rid)); + + if(is_array($h) && array_key_exists("results", $h) && is_array($h["results"]) + && count($h["results"])==1 + && array_key_exists("sbid", $h["results"][0]) && $h["results"][0]["sbid"]==$sbid + && array_key_exists("rid", $h["results"][0]) && $h["results"][0]["rid"]==$rid + && array_key_exists("spots", $h["results"][0]) && is_array($h["results"][0]["spots"]) ) + { + + $output->writeln( sprintf("Succes ! sbid=%d, rid=%d (%d spots)", + $sbid, + $ret["results"][0]["rid"], + count($h["results"][0]["spots"])) + ); + } else { + $output->writeln("Failed ! "); + + return 1; + } + } + + } // disconnected mode + return 0; } } From 81d464b3b08f04c3007e26ccbbba01ecd2caaffd Mon Sep 17 00:00:00 2001 From: Nicolas Le Goff Date: Tue, 5 Nov 2013 14:36:33 +0100 Subject: [PATCH 2/6] Hide non available fields --- www/skins/prod/jquery.main-prod.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/www/skins/prod/jquery.main-prod.js b/www/skins/prod/jquery.main-prod.js index eba07deab6..f4acd0427d 100644 --- a/www/skins/prod/jquery.main-prod.js +++ b/www/skins/prod/jquery.main-prod.js @@ -199,7 +199,7 @@ function checkFilters(save) $('#sbasfiltercont select option:selected:not(".default-selection")').removeAttr('selected').selected(false); - $('#sbasfiltercont select option.field_switch').hide(); + $('#sbasfiltercont select option.field_switch').addClass("hidden"); $('#sbasfiltercont input.field_switch:checked').removeAttr('checked'); @@ -210,7 +210,6 @@ function checkFilters(save) var adv_box = $('form.phrasea_query .adv_options'); $.each($('.sbascont', adv_box), function(){ - var sbas_id = $(this).parent().find('input[name="reference"]').val(); search.bases[sbas_id] = new Array(); @@ -223,11 +222,9 @@ function checkFilters(save) var checked = bas_ckbox.filter(':checked'); - - if(checked.length>0) { - var sbas_fields = $('#sbasfiltercont .field_' + sbas_id).show(); + var sbas_fields = $('#sbasfiltercont .field_' + sbas_id).removeClass("hidden"); sbas_fields.filter('option').show().filter('.was').removeClass('was').attr('selected', 'selected').selected(true); sbas_fields.filter(':checkbox').parent().show().find('.was').attr('checked','checked').removeClass('was'); } @@ -1345,7 +1342,7 @@ $(document).ready(function(){ cancelKey = shortCut = true; break; case 38: // down arrow - $('#baskets div.bloc').scrollTop($('baskets div.bloc').scrollTop()-30); + $('#baskets div.bloc').scrollTop($('#baskets div.bloc').scrollTop()-30); cancelKey = shortCut = true; break; // case 37://previous page From 311f2557d3de614836490990c146423f2c9a13bb Mon Sep 17 00:00:00 2001 From: Nicolas Le Goff Date: Tue, 5 Nov 2013 14:50:27 +0100 Subject: [PATCH 3/6] Enhance CSS selector for IE performance --- www/skins/prod/jquery.main-prod.js | 40 ++++++++++++++++-------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/www/skins/prod/jquery.main-prod.js b/www/skins/prod/jquery.main-prod.js index f4acd0427d..41261b686d 100644 --- a/www/skins/prod/jquery.main-prod.js +++ b/www/skins/prod/jquery.main-prod.js @@ -183,32 +183,33 @@ function checkBases(bool) function checkFilters(save) { var danger = false; - var search = {}; - var adv_box = $('form.phrasea_query .adv_options'); - search.bases = {}; - search.fields = {}; - search.dates = {}; - search.status = {}; - var scroll = $('.field_filter select').scrollTop(); + var search = { + bases: {}, + fields: {}, + dates: {}, + status: {} + }; - var switches = $('#sbasfiltercont .field_switch'); + var adv_box = $('form.phrasea_query .adv_options'); + var container = $("#sbasfiltercont"); + var fieldsSelect = $('.field_filter select', container); + + var scroll = fieldsSelect.scrollTop(); + var switches = $('.field_switch', container); switches.filter('.was').removeClass('was'); - switches.filter('option:selected, input:checked').addClass('was'); - $('#sbasfiltercont select option:selected:not(".default-selection")').removeAttr('selected').selected(false); + $('select option:selected:not(".default-selection")', container).removeAttr('selected').selected(false); - $('#sbasfiltercont select option.field_switch').addClass("hidden"); + $('select option.field_switch', container).addClass("hidden"); - $('#sbasfiltercont input.field_switch:checked').removeAttr('checked'); + $('input.field_switch:checked', container).removeAttr('checked'); - $('#sbasfiltercont input.field_switch:checkbox').parent().hide(); + $('input.field_switch:checkbox', container).parent().hide(); $('.field_filter, .status_filter, .date_filter', adv_box).removeClass('danger'); - var adv_box = $('form.phrasea_query .adv_options'); - $.each($('.sbascont', adv_box), function(){ var sbas_id = $(this).parent().find('input[name="reference"]').val(); search.bases[sbas_id] = new Array(); @@ -224,7 +225,7 @@ function checkFilters(save) if(checked.length>0) { - var sbas_fields = $('#sbasfiltercont .field_' + sbas_id).removeClass("hidden"); + var sbas_fields = $('.field_' + sbas_id, container).removeClass("hidden"); sbas_fields.filter('option').show().filter('.was').removeClass('was').attr('selected', 'selected').selected(true); sbas_fields.filter(':checkbox').parent().show().find('.was').attr('checked','checked').removeClass('was'); } @@ -234,7 +235,7 @@ function checkFilters(save) }); }); - search.fields = (search.fields = $('.field_filter select').val()) !== null ? search.fields : new Array; + search.fields = (search.fields = fieldsSelect.val()) !== null ? search.fields : new Array; var reset_field = false; $.each(search.fields, function(i,n){ @@ -243,7 +244,7 @@ function checkFilters(save) }); if(reset_field) { - $('#sbasfiltercont select[name="fields[]"] option:selected').removeAttr('selected').selected(false); + $('select[name="fields[]"] option:selected', container).removeAttr('selected').selected(false); search.fields = new Array; } @@ -271,7 +272,8 @@ function checkFilters(save) $('.date_filter', adv_box).addClass('danger'); } - $('.field_filter select').scrollTop(scroll); + fieldsSelect.scrollTop(scroll); + if(save===true) setPref('search',JSON.stringify(search)); From ad4213684ebe20c68dedf1d8751281e6ce39beee Mon Sep 17 00:00:00 2001 From: Nicolas Le Goff Date: Tue, 5 Nov 2013 15:24:39 +0100 Subject: [PATCH 4/6] Add danger class to filters input if no colls are selected in advanced search --- www/skins/prod/jquery.main-prod.js | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/www/skins/prod/jquery.main-prod.js b/www/skins/prod/jquery.main-prod.js index 41261b686d..6b1369b241 100644 --- a/www/skins/prod/jquery.main-prod.js +++ b/www/skins/prod/jquery.main-prod.js @@ -193,7 +193,7 @@ function checkFilters(save) var adv_box = $('form.phrasea_query .adv_options'); var container = $("#sbasfiltercont"); var fieldsSelect = $('.field_filter select', container); - + var filters = $('.field_filter, .status_filter, .date_filter', adv_box); var scroll = fieldsSelect.scrollTop(); var switches = $('.field_switch', container); @@ -208,40 +208,49 @@ function checkFilters(save) $('input.field_switch:checkbox', container).parent().hide(); - $('.field_filter, .status_filter, .date_filter', adv_box).removeClass('danger'); + filters.removeClass('danger'); + + var nbSelectedColls = 0; $.each($('.sbascont', adv_box), function(){ - var sbas_id = $(this).parent().find('input[name="reference"]').val(); + var $this = $(this); + + var sbas_id = $this.parent().find('input[name="reference"]').val(); search.bases[sbas_id] = new Array(); - var bas_ckbox = $(this).find('.checkbas'); + var bas_ckbox = $this.find('.checkbas'); - if(bas_ckbox.filter(':not(:checked)').length > 0) - { + if(bas_ckbox.filter(':not(:checked)').length > 0) { danger = 'medium'; } var checked = bas_ckbox.filter(':checked'); - if(checked.length>0) - { + if(checked.length>0) { var sbas_fields = $('.field_' + sbas_id, container).removeClass("hidden"); sbas_fields.filter('option').show().filter('.was').removeClass('was').attr('selected', 'selected').selected(true); sbas_fields.filter(':checkbox').parent().show().find('.was').attr('checked','checked').removeClass('was'); } checked.each(function(){ - search.bases[sbas_id].push($(this).val()); + nbSelectedColls++; + search.bases[sbas_id].push($this.val()); }); }); + if (nbSelectedColls === 0) { + filters.addClass("danger"); + } + search.fields = (search.fields = fieldsSelect.val()) !== null ? search.fields : new Array; var reset_field = false; + $.each(search.fields, function(i,n){ if(n === 'phraseanet--all--fields') reset_field = true; }); + if(reset_field) { $('select[name="fields[]"] option:selected', container).removeAttr('selected').selected(false); From 05485308ae00ece2e4e83dd67a30029905e63fb2 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Tue, 5 Nov 2013 15:51:50 +0100 Subject: [PATCH 5/6] Fix #1567 : Disallow a user to remove himself from DB --- lib/Alchemy/Phrasea/Helper/User/Edit.php | 3 +++ .../Alchemy/Tests/Phrasea/Controller/Admin/UsersTest.php | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/Alchemy/Phrasea/Helper/User/Edit.php b/lib/Alchemy/Phrasea/Helper/User/Edit.php index 8d22e09402..02c1b53a28 100644 --- a/lib/Alchemy/Phrasea/Helper/User/Edit.php +++ b/lib/Alchemy/Phrasea/Helper/User/Edit.php @@ -65,6 +65,9 @@ class Edit extends \Alchemy\Phrasea\Helper\Helper public function delete_users() { foreach ($this->users as $usr_id) { + if ($this->app['authentication']->getUser()->get_id() === (int) $usr_id) { + continue; + } $user = \User_Adapter::getInstance($usr_id, $this->app); $this->delete_user($user); } diff --git a/tests/Alchemy/Tests/Phrasea/Controller/Admin/UsersTest.php b/tests/Alchemy/Tests/Phrasea/Controller/Admin/UsersTest.php index 28d1748ccf..6c7156ded2 100644 --- a/tests/Alchemy/Tests/Phrasea/Controller/Admin/UsersTest.php +++ b/tests/Alchemy/Tests/Phrasea/Controller/Admin/UsersTest.php @@ -46,6 +46,15 @@ class ControllerUsersTest extends \PhraseanetWebTestCaseAuthenticatedAbstract } } + public function testRouteDeleteCurrentUserDoesNothing() + { + self::$DI['client']->request('POST', '/admin/users/delete/', array('users' => self::$DI['user']->get_id())); + $response = self::$DI['client']->getResponse(); + $this->assertTrue($response->isRedirect()); + + $this->assertTrue(false !== \User_Adapter::get_usr_id_from_login(self::$DI['app'], self::$DI['user']->get_login())); + } + public function testRouteRightsApply() { $this->mockNotificationDeliverer('Alchemy\Phrasea\Notification\Mail\MailSuccessEmailUpdate', 2); From b311ab7c6708c427a44982145a2c6d468bfaa42c Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Tue, 5 Nov 2013 16:00:55 +0100 Subject: [PATCH 6/6] Fix #1566 : Fix basket export --- templates/web/prod/WorkZone/Macros.html.twig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/web/prod/WorkZone/Macros.html.twig b/templates/web/prod/WorkZone/Macros.html.twig index edd1dcd6f6..33a231dc53 100644 --- a/templates/web/prod/WorkZone/Macros.html.twig +++ b/templates/web/prod/WorkZone/Macros.html.twig @@ -45,7 +45,7 @@
{% trans 'action::exporter' %} + onclick="downloadThis('ssel={{basket.getId()}}');">{% trans 'action::exporter' %}