diff --git a/VERSIONS_HOTLINE/50500 b/VERSIONS_HOTLINE/50500 new file mode 100644 index 0000000000000000000000000000000000000000..565cd501af81c844928b1ff8300d78ab0e30b13d --- /dev/null +++ b/VERSIONS_HOTLINE/50500 @@ -0,0 +1 @@ + - ticket #50500 : Indexation : correction d'une erreur lorsqu'un niveau thesaurus dépassait 9999 éléments \ No newline at end of file diff --git a/cosmogramme/php/integration/domaines.php b/cosmogramme/php/integration/domaines.php index 86d8f781dedd7a613826f8b228030621ad5cee6b..ec2cbd6179f52576816301656611f8713be17684 100644 --- a/cosmogramme/php/integration/domaines.php +++ b/cosmogramme/php/integration/domaines.php @@ -1,4 +1,4 @@ -<?PHP +<?php /** * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved. * @@ -18,55 +18,47 @@ * along with BOKEH; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -///////////////////////////////////////////////////////////////////////// -// INTEGRATION DES RESERVATIONS -///////////////////////////////////////////////////////////////////////// -require_once("classe_transaction.php"); -setVariable("traitement_phase","Indexation des domaines"); + +setVariable('traitement_phase', 'Indexation des domaines'); + if ($phase==16) { - $log->ecrire("<h4>Indexation des domaines</h4>"); - unset($phase_data); - $reprise=false; - $phase_data["nombre"]=0; - $phase_data["nb_fic"]=0; - $phase_data["timeStart"]=time(); - $phase_data["pointeur"]=0; - $phase_data["domaine"]=0; + $log->ecrire('<h4>Indexation des domaines</h4>'); + unset($phase_data); + $reprise = false; + $phase_data['nombre'] = 0; + $phase_data['nb_fic'] = 0; + $phase_data['timeStart'] = time(); + $phase_data['pointeur'] = 0; + $phase_data['domaine'] = 0; - $phase=17; + $phase=17; } if ($phase==17) { - $position_domaine=$phase_data["domaine"]; -// Indexation des catalogues dynamiques - $catalogues = array_slice(Class_Catalogue::findAllCataloguesAIndexer(),$position_domaine); + if ($mode_cron) { + $position_domaine = $phase_data['domaine']; + $catalogues = array_slice(Class_Catalogue::findAllCataloguesAIndexer(), + $position_domaine); - foreach ($catalogues as $catalogue) { - $page=$phase_data["pointeur"]; - $log->ecrire("Indexation du domaine : ".$catalogue->getLibelle()."<br/>"); - $catalogue->index($page, - function(&$phase_data) use ($page) - { - $phase_data['pointeur'] = $page; - }); + foreach ($catalogues as $catalogue) { + $page = $phase_data['pointeur']; + $log->ecrire('Indexation du domaine : '.$catalogue->getLibelle().'<br/>'); + $catalogue->index($page); - $position_domaine++; - $phase_data["domaine"]=$position_domaine; - $phase_data["pointeur"]=0; - } + $position_domaine++; + $phase_data['domaine'] = $position_domaine; + $phase_data['pointeur'] = 0; + } - if ($mode_cron) { - $log->ecrire('<h4>Indexation des paniers dans les domaines</h4>'); - Class_PanierNotice::indexAll(); + $log->ecrire('<h4>Indexation des paniers dans les domaines</h4>'); + Class_PanierNotice::indexAll(); - $log->ecrire("<h4>Indexation des articles dans les domaines</h4>"); - Class_Article::indexAll(); - - $log->ecrire("<h4>Indexation des sitothèques dans les domaines</h4>"); - Class_Sitotheque::indexAll(); - } else { - $log->ecrire("<h4>Les indexations des paniers, articles et sitothèques dans les domaines ne sont traitées qu'en mode cron</h4>"); - } -} + $log->ecrire('<h4>Indexation des articles dans les domaines</h4>'); + Class_Article::indexAll(); -?> \ No newline at end of file + $log->ecrire('<h4>Indexation des sitothèques dans les domaines</h4>'); + Class_Sitotheque::indexAll(); + } else { + $log->ecrire('<h4>Les indexations des domaines, des paniers, articles et sitothèques dans les domaines ne sont traitées qu\'en mode cron</h4>'); + } +} \ No newline at end of file diff --git a/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php b/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php index 70ceb22dd5deba2f3765e91b682891bfe1cc9ce4..7e48a68c4580289b5c14c0c3a1ac6cf3d1506152 100644 --- a/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php +++ b/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php @@ -217,8 +217,15 @@ class KohaRecordIntegrationVagabondWithThesaurusOn702DollarATest extends KohaRec 'code' => 'summary' ]); + $this->fixture('Class_CodifThesaurus', + ['id' => 6, + 'libelle' => 'Test', + 'id_thesaurus' => 'TEST', + 'id_origine' => null, + 'code' => 'TEST', + 'rules' => '{"label":"610$a"}']); - $loader = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_CodifThesaurus'); + $loader = $this->onLoaderOfModel('Class_CodifThesaurus'); $loader ->whenCalled('findFirstBy') ->with(['code' => 'authors', @@ -243,12 +250,14 @@ class KohaRecordIntegrationVagabondWithThesaurusOn702DollarATest extends KohaRec $this->assertEquals('Vagabond n° 4', $this->_notice->getTitrePrincipal()); } + /** @test */ public function noSumm0002ShouldBeCreated() { $entry = Class_CodifThesaurus::findAllBy(['libelle' => 'd\'après l\'oeuvre d\'Eiji Yoshikawa, "Miyamoto Musashi"']); $this->assertCount(1, $entry); } + /** @test */ public function facetsShouldContainsHAUTH0001() { $this->assertContains('HAUTH0001', $this->_notice->getFacetCodes()); @@ -268,6 +277,7 @@ class KohaRecordIntegrationVagabondWithThesaurusOn702DollarATest extends KohaRec $this->_notice->getFacettes()); } + /** @test */ public function entryForYoshikawaShouldBeCreated() { $entry = Class_CodifThesaurus::findFirstBy(['id_thesaurus' => 'AUTH0002']); @@ -276,6 +286,101 @@ class KohaRecordIntegrationVagabondWithThesaurusOn702DollarATest extends KohaRec $entry->getLibelle()); } + + /** @test */ + public function shouldCreateThesaurusFor610_a() { + $this->assertNotNull(Class_CodifThesaurus::findFirstBy(['id_thesaurus' => 'TEST0001', + 'libelle' => 'Manga'])); + } } -?> \ No newline at end of file + + +class KohaRecordIntegrationVagabondWithTooMany610aTest extends KohaRecordIntegrationTestCase { + public function setUp() { + parent::setUp(); + + $this->fixture('Class_CodifThesaurus', + ['id' => 1, + 'libelle' => 'Author', + 'id_thesaurus' => 'AUTH', + 'id_origine' => null, + 'code' => 'authors', + 'rules' => '{"label":"702$a"}']); + + + $marcel = $this->fixture('Class_CodifThesaurus', + ['id' => 2, + 'libelle' => 'Marcel', + 'id_thesaurus' => 'AUTH0001', + 'id_origine' => 'MARCEL', + 'code' => 'authors', + 'rules' => null]); + + + $docu = $this->fixture('Class_CodifThesaurus', + ['id' => 3, + 'libelle' => 'Document', + 'id_thesaurus' => 'DOCU', + 'id_origine' => null, + 'code' => 'document', + 'rules' => '{"label":" 99$t "}']); + + $this->fixture('Class_CodifThesaurus', + ['id' => 4, + 'libelle' => 'Summary', + 'id_thesaurus' => 'SUMM', + 'id_origine' => null, + 'code' => 'summary', + 'rules' => '{"label":" 200$g "}']); + + $this->fixture('Class_CodifThesaurus', + ['id' => 5, + 'libelle' => 'd\'après l\'oeuvre d\'Eiji Yoshikawa, "Miyamoto Musashi"', + 'id_thesaurus' => 'SUMM0001', + 'id_origine' => 'D\'APRèS L\'OEUVRE D\'E', + 'code' => 'summary' + ]); + + $this->fixture('Class_CodifThesaurus', + ['id' => 6, + 'libelle' => 'Test', + 'id_thesaurus' => 'TEST', + 'id_origine' => null, + 'code' => 'TEST', + 'rules' => '{"label":"610$a"}']); + + $this->fixture('Class_CodifThesaurus', + ['id_thesaurus' => 'TEST9999', + 'id_origine' => 'RIME', + 'libelle' => 'rime', + 'code' => 'TEST', + 'id' => 10722, + 'libelle_facette' => 'rime', + 'rules' => null]); + + $loader = $this->onLoaderOfModel('Class_CodifThesaurus'); + $loader + ->whenCalled('findFirstBy') + ->with(['code' => 'authors', + 'where' => 'id_thesaurus like "AUTH%"', + 'order' => 'id_thesaurus desc']) + ->answers($marcel) + + ->whenCalled('findFirstBy') + ->with(['code' => 'document', + 'where' => 'id_thesaurus like "DOCU%"', + 'order' => 'id_thesaurus desc']) + ->answers($docu); + + + $this->loadNotice('unimarc_vagabond'); + $this->_notice = Class_Notice::find(1); + } + + + /** @test */ + public function shouldNotCreateThesaurusFor610_a() { + $this->assertNull(Class_CodifThesaurus::findFirstBy(['libelle' => 'Manga'])); + } +} \ No newline at end of file diff --git a/library/Class/CodifThesaurus.php b/library/Class/CodifThesaurus.php index 11188fedaf492ab40ea1a665a7856a19c89d96a9..7ce47599de34610a089b606d58f36dd0197e2a2a 100644 --- a/library/Class/CodifThesaurus.php +++ b/library/Class/CodifThesaurus.php @@ -256,6 +256,7 @@ class Class_CodifThesaurus extends Storm_Model_Abstract { const COLUMN_ORIGIN_SIZE = 20, + ID_KEY_LENGTH = 4, CODE_FACETTE = 'H', CODE_CATALOGUE = 'Catalogue', @@ -329,8 +330,7 @@ class Class_CodifThesaurus extends Storm_Model_Abstract { $loader = $this->getLoader(); $code = $this->getCode(); return $loader->newInstance(['code' => $code, - 'id_thesaurus' => $loader->findNextThesaurusChildId( - $code, + 'id_thesaurus' => $loader->findNextThesaurusChildId($code, $this->getIdThesaurus())]); } @@ -350,9 +350,8 @@ class Class_CodifThesaurus extends Storm_Model_Abstract { ->newChildEntry() ->updateAttributes(['id_origine' => $id_origine, 'libelle' => $label]); - $entry->assertSave(); - return $entry; + return $entry->save() ? $entry : null; } @@ -370,7 +369,9 @@ class Class_CodifThesaurus extends Storm_Model_Abstract { public function validate() { - $this->check('' != $this->getLibelle(), $this->_('Vous devez définir le libellé')); + $this->_validateIdThesaurus(); + + $this->checkAttribute('libelle', '' != $this->getLibelle(), $this->_('Vous devez définir le libellé')); if (!$this->getRules()) return true; @@ -381,6 +382,17 @@ class Class_CodifThesaurus extends Storm_Model_Abstract { } + protected function _validateIdThesaurus() { + $my_key = substr($this->getIdThesaurus(), -self::ID_KEY_LENGTH); + $empty_key = str_repeat('0', self::ID_KEY_LENGTH); + + $this->checkAttribute('id_thesaurus', + $my_key != $empty_key, + $this->_('Nombre maximum d\'élément à ce niveau déjà atteint (%s)', + str_repeat('9', self::ID_KEY_LENGTH))); + } + + public function deleteMeAndMyChildren() { $this->cleanRecords(); $this->getLoader()->deleteAllFrom($this); diff --git a/library/Class/Indexation/PseudoNotice/FacettesVisitor.php b/library/Class/Indexation/PseudoNotice/FacettesVisitor.php index 18ace745434a3f164185c3637408fb1c2af6b318..b4ebb7757f62ba609921ed04a71606fc9fdfb759 100644 --- a/library/Class/Indexation/PseudoNotice/FacettesVisitor.php +++ b/library/Class/Indexation/PseudoNotice/FacettesVisitor.php @@ -154,9 +154,9 @@ class Class_Indexation_PseudoNotice_FacettesVisitor extends Class_Indexation_Pse return; foreach($value->getValueAsArray() as $one_value) { - $thesaurus = $this - ->_ensureThesaurusUnderWithValue($this->_ensureThesaurusFor($field), - $one_value); + if (!$thesaurus = $this->_ensureThesaurusUnderWithValue($this->_ensureThesaurusFor($field), + $one_value)) + continue; $this->_facettes[] = $thesaurus->getFacetteIndex(); } } diff --git a/tests/application/modules/admin/controllers/CmsControllerCustomFieldsTest.php b/tests/application/modules/admin/controllers/CmsControllerCustomFieldsTest.php index e71267254c8bbce02ae02b66defc897d8ff6de5d..342504fba65f0d8301ba68aa6c88552b213896cb 100644 --- a/tests/application/modules/admin/controllers/CmsControllerCustomFieldsTest.php +++ b/tests/application/modules/admin/controllers/CmsControllerCustomFieldsTest.php @@ -173,6 +173,51 @@ class CmsControllerCustomFieldsAndIndexationPostEditActionTest + +class CmsControllerCustomFieldsAndIndexationPostEditWithTooManyValueActionTest + extends CmsControllerCustomFieldsTestCase { + protected + $_record, + $_field_thesaurus, + $_value_thesaurus; + + + public function setUp() { + parent::setUp(); + + $this->fixture('Class_CodifThesaurus', + ['id_thesaurus' => 'CFCF00019999', + 'id_origine' => 'newbies', + 'libelle' => 'newbies', + 'code' => Class_CodifThesaurus::CODE_CUSTOMFIELDS, + 'id' => 10722, + 'libelle_facette' => 'newbies', + 'rules' => null]); + + $this->postDispatch('admin/cms/edit/id/1', + ['titre' => 'News Article', + 'contenu' => 'Welcome', + 'indexation' => 1, + 'status' => Class_Article::STATUS_VALIDATED, + 'field_5' => 'Hardcore gamers', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '']); + + $this->_value_thesaurus = Class_CodifThesaurus::findFirstBy(['libelle' => 'Hardcore gamers']); + } + + + /** @test */ + public function shouldNotCreateNewThesaurus() { + $this->assertNull($this->_value_thesaurus); + } +} + + + + class CmsControllerCustomFieldsNotIndexableMetaPostEditActionTest extends CmsControllerCustomFieldsTestCase { diff --git a/tests/library/Class/CodifThesaurusTest.php b/tests/library/Class/CodifThesaurusTest.php index f16b854ce2f069bedc5d02db2dd27e637a97c423..44f32e25bd1065c662ec9a35f11412dbd1e307e8 100644 --- a/tests/library/Class/CodifThesaurusTest.php +++ b/tests/library/Class/CodifThesaurusTest.php @@ -147,4 +147,45 @@ class CodifThesaurusDeleteTest extends ModelTestCase { public function recordShouldNotHaveFacetHCFCF() { $this->assertEquals('T8 A3452', $this->_record->getFacettes()); } +} + + + +/** @see http://forge.afi-sa.fr/issues/50500 */ +class CodifThesaurusTooManyValuesTest extends ModelTestCase { + protected $_storm_default_to_volatile = true; + + public function setUp() { + parent::setUp(); + + $this->fixture('Class_CodifThesaurus', + ['id_thesaurus' => 'TEST', + 'id_origine' => null, + 'libelle' => 'test', + 'code' => 'TEST', + 'id' => 723, + 'libelle_facette' => 'test', + 'rules' => '{"label":"610$a"}']); + + $this->fixture('Class_CodifThesaurus', + ['id_thesaurus' => 'TEST9999', + 'id_origine' => 'RIME', + 'libelle' => 'rime', + 'code' => 'TEST', + 'id' => 10722, + 'libelle_facette' => 'rime', + 'rules' => null]); + } + + + /** @test */ + public function shouldNotInsertMoreThan9999Child() { + Class_CodifThesaurus::find(723) + ->getOrCreateChild(strtoupper('métiers de la recherche'), + 'métiers de la recherche'); + + $this->assertEquals(2, Class_CodifThesaurus::count(), + Class_CodifThesaurus::findFirstBy(['order' => 'id desc']) + ->getIdThesaurus()); + } } \ No newline at end of file