Skip to content
Snippets Groups Projects
Commit 8615dbae authored by Ghislain Loas's avatar Ghislain Loas
Browse files

hotline #141251 fix clean profile cfg modules

parent 996292d0
Branches
Tags
3 merge requests!4230master in,!4227hotline#137304 : Worklfow : link sent in email for article validation in...,!4210hotline #141251 fix clean profile cfg modules
Pipeline #14778 passed with stage
in 58 minutes and 14 seconds
- ticket #141251 : Administration : correction du nettoyage des données corrompues dans les profils.
\ No newline at end of file
......@@ -33,7 +33,10 @@ class Admin_SitoController extends ZendAfi_Controller_Action {
$this->_setParam('id_cat',$site->getCategorie()->getId());
}
$identity = Class_Users::getLoader()->getIdentity();
if ( ! $identity = Class_Users::getLoader()->getIdentity()) {
$this->_bib = Class_Bib::getLoader()->getPortail();
return;
}
if (ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB >= $identity->getRoleLevel()) {
$this->_bib = $identity->getBib();
......
<?php
//hash should change
(new Class_Migration_CleanProfileCfgModules)->run();
......@@ -113,7 +113,6 @@ class CasTicketV3Cache {
public function isExpired($date) {
xdebug_break();
return $this->_expired_at < $date;
}
}
......@@ -24,43 +24,17 @@ class Class_Migration_CleanProfileCfgModules {
use Trait_MemoryCleaner;
protected
$_request,
$_dispatcher;
public function __construct() {
$this->_request = (new Zend_Controller_Request_Http)
->setModuleName('opac');
$front_controller =
Zend_Controller_Front::getInstance()
->setRequest($this->_request)
->throwExceptions(true)
->returnResponse(false);
$this->_dispatcher = $front_controller->getDispatcher();
if ( $this->_dispatcher->isValidModule('opac'))
return;
(new Bokeh_Engine)
->warmUp()
->setupControllerActionHelper()
->setupFrontController();
$front_controller =
Zend_Controller_Front::getInstance()
->setRequest($this->_request)
->throwExceptions(true)
->returnResponse(false);
$this->_dispatcher = $front_controller->getDispatcher();
}
$_modules = ['opac',
'admin',
'telephone',
'activitypub',
'push',
'api'];
public function run() {
$i = 1;
while($page = Class_Profil::findAllBy(['limitPage' => [$i, 100]])) {
while($page = Class_Profil::findAllBy(['limitPage' => [$i, 50]])) {
$this->_runPage($page);
$i++;
}
......@@ -102,31 +76,92 @@ class Class_Migration_CleanProfileCfgModules {
protected function _controllerExists($controller) {
$this->_request
foreach ($this->_modules as $module)
if ($this->_controllerExistsInModule($controller, $module))
return true;
return false;
}
protected function _controllerExistsInModule($controller, $module) {
$dispatcher = ($this->_getDispatcherFor($module));
return $dispatcher->isDispatchable($this->_getRequestFor($module, $controller));
}
protected function _getDispatcherFor($module) {
return Zend_Controller_Front::getInstance()
->setRequest((new Zend_Controller_Request_Http)->setModuleName($module))
->throwExceptions(true)
->returnResponse(false)
->getDispatcher();
}
protected function _getRequestFor($module, $controller, $action = '') {
$request = (new Zend_Controller_Request_Http)
->setModuleName($module)
->setControllerName($controller);
return $this->_dispatcher->isDispatchable($this->_request);
if ($action)
$request->setActionName($action);
return $request;
}
protected function _filterByActions($modules, $controller, $actions) {
$modules[$controller] = array_filter($actions,
function ($action) use ($controller)
{
$this->_request
->setControllerName($controller)
->setActionName($action);
$modules[$controller] =
array_filter($actions,
function ($action) use ($controller)
{
$className = $this->_dispatcher->getControllerClass($this->_request);
$className = $this->_dispatcher->loadClass($className);
if ($this->_isActionValid($action))
return true;
return (new $className($this->_request, new Zend_Controller_Response_Http, []))->isDispatchable($this->_dispatcher->getActionMethod($this->_request));
},
ARRAY_FILTER_USE_KEY);
return $this->_isActionDispatchable($controller, $action);
},
ARRAY_FILTER_USE_KEY);
if (!$modules[$controller])
unset($modules[$controller]);
return $modules;
}
protected function _isActionValid($action) {
//action1.action2
if ( 0 === strpos($action, 'viewnotice'))
return true;
if ( 0 === strpos($action, 'resultat'))
return true;
return false;
}
protected function _isActionDispatchable($controller, $action) {
foreach ($this->_modules as $module)
if ($this->_isActionDispatchableInModule($module, $controller, $action))
return true;
return false;
}
protected function _isActionDispatchableInModule($module, $controller, $action) {
$request = $this->_getRequestFor($module, $controller, $action);
$dispatcher = $this->_getDispatcherFor($module);
$class_name = $dispatcher->getControllerClass($request);
try {
$class_name = $dispatcher->loadClass($class_name);
return (new $class_name($request, new Zend_Controller_Response_Http, []))
->isDispatchable($dispatcher->getActionMethod($request));
} catch (Exception $e) {
return false;
}
}
}
......@@ -2,7 +2,10 @@
require('includes.php');
define("BASE_URL", "/");
(new Bokeh_Engine())->warmUp();
(new Bokeh_Engine())
->warmUp()
->setupControllerActionHelper()
->setupFrontController();
if (262 < (int)Class_CosmoVar::getValueOf('patch_level'))
Class_CosmoVar::setValueOf('patch_level', 262);
......
{
"id": 3,
"id_profil": 3,
"browser": "opac",
"libelle": "r\u00e9seau des biblioth\u00e8ques du pays de Mortagne",
"commentaire": "Bienvenue sur le site du r\u00e9seau des biblioth\u00e8ques du Pays de Mortagne.",
"titre_site": "r\u00e9seau des biblioth\u00e8ques du pays de Mortagne",
"skin": "modele",
"cfg_modules": {
"auth": {
"login": {
"titre": "Entrez votre identit\u00e9 S.V.P.",
"message_connecte": "Bienvenue",
"identifiant": "Identifiant",
"mot_de_passe": "Mot de passe",
"mot_de_passe_exemple": "Ann\u00e9e naissance",
"autocomplete_off": "1",
"lien_connexion": "\u00bb Se connecter",
"lien_deconnection": "\u00bb Se d\u00e9connecter",
"lien_mot_de_passe_oublie": "\u00bb Mot de passe oubli\u00e9 ?",
"lien_compte": "\u00bb Mon compte",
"lien_creer_compte": "\u00bb S'enregistrer"
}
},
"recherche": {
"resultatsimple": {
"facettes_actif": "1",
"multi_facettes": "1",
"facettes_nombre": "8",
"facettes_codes": "B;S;G;M",
"facettes_message": "Affiner le r\u00e9sultat...",
"tags_position": "2",
"tags_calcul": "1",
"tags_nombre": "20",
"tags_codes": "M;P",
"tags_message": "Elargir la recherche...",
"liste_format": "3",
"liste_nb_par_page": "40",
"liste_codes": "T;J;N;R",
"suggests_number": "40",
"titre": "La rentr\u00e9e des classes",
"search_term_editable": "1",
"suggestion_achat": "1"
},
"resultatavancee": {
"liste_format": "3",
"liste_nb_par_page": "10",
"liste_codes": "TAN",
"facettes_actif": "1",
"facettes_nombre": "3",
"facettes_codes": "ADPML",
"facettes_message": "Affiner le r\u00e9sultat...",
"tags_position": "2",
"tags_nombre": "30",
"tags_codes": "AMDPZ",
"tags_message": "Elargir la recherche..."
},
"simple": {
"barre_nav": "Recherche simple",
"titre": "Rechercher un document",
"message": "Livre, CD, DVD.."
},
"viewnotice": {
"entete": "W;C;N",
"onglets": {
"detail": {
"aff": "2",
"ordre": "1",
"titre": "Notice d\u00e9taill\u00e9e"
},
"avis": {
"aff": "1",
"ordre": "2",
"titre": "Avis"
},
"exemplaires": {
"aff": "3",
"ordre": "1",
"titre": "Exemplaires"
},
"resume": {
"aff": "1",
"ordre": "4",
"titre": "R\u00e9sum\u00e9s, analyses"
},
"tags": {
"aff": "3",
"ordre": "5",
"titre": "Tags"
},
"biographie": {
"aff": "3",
"ordre": "6",
"titre": "Biographies"
},
"similaires": {
"aff": "3",
"ordre": "7",
"titre": "Notices similaires"
},
"bibliographie": {
"ordre": "8",
"titre": "Bibliographies"
},
"morceaux": {
"ordre": "9",
"titre": "Morceaux"
},
"bandeAnnonce": {
"aff": "2",
"ordre": "10",
"titre": "Bande-annonce"
},
"photos": {
"ordre": "11",
"titre": "Photos"
},
"videos": {
"ordre": "12",
"titre": "Vid\u00e9os"
}
}
},
"guidee": {
"barre_nav": "Recherche guid\u00e9e",
"titre": "Recherche guid\u00e9e",
"select_bib": "1"
},
"viewnotice3": {
"entete": "W;C;N;P",
"onglets": {
"detail": {
"aff": "1",
"ordre": "1",
"titre": "Notice d\u00e9taill\u00e9e"
},
"avis": {
"aff": "1",
"ordre": "3",
"titre": "Avis des biblioth\u00e9caires"
},
"exemplaires": {
"aff": "1",
"ordre": "2",
"titre": "Exemplaires"
},
"resume": {
"ordre": "4",
"titre": "R\u00e9sum\u00e9s, analyses"
},
"tags": {
"ordre": "5",
"titre": "Tags"
},
"biographie": {
"aff": "3",
"ordre": "9",
"titre": "Biographies"
},
"series": {
"ordre": "100",
"titre": "Documents de la m\u00eame s\u00e9rie"
},
"similaires": {
"aff": "3",
"ordre": "7",
"titre": "Notices similaires"
},
"bibliographie": {
"aff": "3",
"ordre": "8",
"titre": "Discographies"
},
"morceaux": {
"aff": "3",
"ordre": "6",
"titre": "Morceaux"
},
"bandeAnnonce": {
"ordre": "10",
"titre": "Bande-annonce"
},
"photos": {
"ordre": "11",
"titre": "Photos"
},
"videos": {
"ordre": "12",
"titre": "Vid\u00e9os"
},
"resnumeriques": {
"ordre": "100",
"titre": "Ressources num\u00e9riques"
},
"babeltheque": {
"ordre": "100",
"titre": "Babelth\u00e8que"
},
"frbr": {
"ordre": "100",
"titre": "Notices li\u00e9es"
},
"recounts": {
"aff": "2",
"ordre": "17",
"titre": "Contient"
}
},
"thumbnail_fields": "992-v"
},
"viewnotice1": {
"entete": "W;G;N;M",
"onglets": {
"detail": {
"aff": "1",
"ordre": "1",
"titre": "Notice d\u00e9taill\u00e9e"
},
"avis": {
"aff": "1",
"ordre": "3",
"titre": "Avis des lecteurs"
},
"exemplaires": {
"aff": "1",
"ordre": "2",
"titre": "Exemplaires"
},
"resume": {
"ordre": "1",
"titre": "R\u00e9sum\u00e9s, analyses"
},
"tags": {
"ordre": "1",
"titre": "Tags"
},
"biographie": {
"aff": "3",
"ordre": "20",
"titre": "L'auteur"
},
"series": {
"aff": "3",
"ordre": "1",
"titre": "Documents de la m\u00eame s\u00e9rie"
},
"similaires": {
"aff": "3",
"ordre": "10",
"titre": "Notices similaires"
},
"bibliographie": {
"ordre": "50",
"titre": "Bibliographies"
},
"morceaux": {
"ordre": "30",
"titre": "Morceaux"
},
"bandeAnnonce": {
"ordre": "40",
"titre": "Bande-annonce"
},
"photos": {
"aff": "3",
"ordre": "60",
"titre": "Photos"
},
"videos": {
"aff": "3",
"ordre": "70",
"titre": "Vid\u00e9os associ\u00e9es"
},
"resnumeriques": {
"ordre": "80",
"titre": "Ressources num\u00e9riques"
},
"babeltheque": {
"ordre": "90",
"titre": "Babelth\u00e8que"
},
"frbr": {
"ordre": "100",
"titre": "Notices li\u00e9es"
},
"recounts": {
"aff": "2",
"ordre": "17",
"titre": "Contient"
}
},
"thumbnail_fields": "992-v"
},
"resultatguidee": {
"liste_format": "3",
"liste_nb_par_page": "10",
"liste_codes": "TAN",
"facettes_actif": "1",
"facettes_nombre": "3",
"facettes_codes": "ADPML",
"facettes_message": "Affiner le r\u00e9sultat...",
"tags_actif": "1",
"tags_position": "2",
"tags_nombre": "30",
"tags_codes": "AMDPZ",
"tags_message": "Elargir la recherche..."
},
"viewnotice4": {
"entete": "W;C;N;D",
"onglets": {
"detail": {
"aff": "1",
"ordre": "1",
"titre": "Notice d\u00e9taill\u00e9e"
},
"avis": {
"aff": "1",
"ordre": "3",
"titre": "Avis des biblioth\u00e9caires"
},
"exemplaires": {
"aff": "1",
"ordre": "2",
"titre": "Exemplaires"
},
"resume": {
"ordre": "4",
"titre": "R\u00e9sum\u00e9s, analyses"
},
"tags": {
"ordre": "5",
"titre": "Tags"
},
"biographie": {
"aff": "3",
"ordre": "10",
"titre": "Biographies"
},
"series": {
"aff": "3",
"ordre": "100",
"titre": "Documents de la m\u00eame s\u00e9rie"
},
"similaires": {
"aff": "3",
"ordre": "7",
"titre": "Notices similaires"
},
"bibliographie": {
"ordre": "8",
"titre": "Bibliographies"
},
"morceaux": {
"aff": "3",
"ordre": "9",
"titre": "Morceaux"
},
"bandeAnnonce": {
"aff": "3",
"ordre": "6",
"titre": "Bande-annonce"
},
"photos": {
"ordre": "11",
"titre": "Photos"
},
"videos": {
"aff": "3",
"ordre": "20",
"titre": "Interviews"
},
"resnumeriques": {
"ordre": "100",
"titre": "Ressources num\u00e9riques"
},
"babeltheque": {
"ordre": "100",
"titre": "Babelth\u00e8que"
},
"frbr": {
"ordre": "100",
"titre": "Notices li\u00e9es"
},
"recounts": {
"aff": "2",
"ordre": "17",
"titre": "Contient"
}
},
"thumbnail_fields": "992-v"
},
"resultatrebond": {
"liste_format": "3",
"liste_nb_par_page": "10",
"liste_codes": "TAN",
"facettes_actif": "1",
"facettes_nombre": "3",
"facettes_codes": "ADMG",
"facettes_message": "Affiner le r\u00e9sultat...",
"tags_position": "2",
"tags_nombre": "30",
"tags_codes": "AMDPZ",
"tags_message": "Elargir la recherche..."
},
"viewnotice5": {
"entete": "W;C;N;M",
"onglets": {
"detail": {
"aff": "1",
"ordre": "1",
"titre": "Notice d\u00e9taill\u00e9e"
},
"avis": {
"aff": "1",
"ordre": "3",
"titre": "Avis des biblioth\u00e9caires"
},
"exemplaires": {
"aff": "1",
"ordre": "2",
"titre": "Exemplaires"
},
"resume": {
"ordre": "4",
"titre": "R\u00e9sum\u00e9s, analyses"
},
"tags": {
"ordre": "5",
"titre": "Tags"
},
"biographie": {
"ordre": "6",
"titre": "Biographies"
},
"series": {
"aff": "2",
"ordre": "7",
"titre": "Documents de la m\u00eame s\u00e9rie"
},
"similaires": {
"ordre": "7",
"titre": "Notices similaires"
},
"bibliographie": {
"ordre": "8",
"titre": "Bibliographies"
},
"morceaux": {
"ordre": "9",
"titre": "Morceaux"
},
"bandeAnnonce": {
"ordre": "10",
"titre": "Bande-annonce"
},
"photos": {
"ordre": "11",
"titre": "Photos"
},
"videos": {
"ordre": "12",
"titre": "Interviews"
},
"resnumeriques": {
"aff": "2",
"ordre": "14",
"titre": "Ressources num\u00e9riques"
},
"babeltheque": {
"aff": "2",
"ordre": "15",
"titre": "Babelth\u00e8que"
},
"frbr": {
"aff": "2",
"ordre": "16",
"titre": "Notices li\u00e9es"
},
"recounts": {
"aff": "2",
"ordre": "17",
"titre": "Contient"
}
},
"thumbnail_fields": "992-v"
},
"avancee": {
"barre_nav": "Recherche avanc\u00e9e",
"titre": "Recherche avanc\u00e9e"
},
"viewnotice2": {
"entete": "W;C;N;M",
"onglets": {
"detail": {
"aff": "1",
"ordre": "1",
"titre": "Notice d\u00e9taill\u00e9e"
},
"avis": {
"aff": "1",
"ordre": "2",
"titre": "Avis des biblioth\u00e9caires"
},
"exemplaires": {
"aff": "1",
"ordre": "3",
"titre": "Exemplaires"
},
"resume": {
"ordre": "4",
"titre": "R\u00e9sum\u00e9s, analyses"
},
"tags": {
"ordre": "5",
"titre": "Tags"
},
"biographie": {
"ordre": "6",
"titre": "Biographies"
},
"series": {
"aff": "2",
"ordre": "7",
"titre": "Documents de la m\u00eame s\u00e9rie"
},
"similaires": {
"ordre": "7",
"titre": "Notices similaires"
},
"bibliographie": {
"ordre": "8",
"titre": "Bibliographies"
},
"morceaux": {
"ordre": "9",
"titre": "Morceaux"
},
"bandeAnnonce": {
"ordre": "10",
"titre": "Bande-annonce"
},
"photos": {
"ordre": "11",
"titre": "Photos"
},
"videos": {
"ordre": "12",
"titre": "Archives vid\u00e9o"
},
"resnumeriques": {
"aff": "2",
"ordre": "14",
"titre": "Ressources num\u00e9riques"
},
"babeltheque": {
"aff": "2",
"ordre": "15",
"titre": "Babelth\u00e8que"
},
"frbr": {
"aff": "2",
"ordre": "16",
"titre": "Notices li\u00e9es"
},
"recounts": {
"aff": "2",
"ordre": "17",
"titre": "Contient"
}
},
"thumbnail_fields": "992-v"
}
},
"cms": {
"articleview": [],
"categorieview": {
"barre_nav": "Article"
},
"articleviewbydate": {
"barre_nav": "Agenda",
"titre": "Agenda"
},
"articleviewpreferences": {
"boite": "boite_banniere_droite"
},
"articleviewselection": []
},
"sito": {
"viewrecent": {
"barre_nav": "Sitoth\u00e8que"
}
},
"bib": {
"bibview": {
"barre_nav": "Biblioth\u00e8que"
}
},
"blog": {
"viewauteur": {
"barre_nav": "Critique"
}
}
},
"cfg_notice": "a:1:{s:11:\"exemplaires\";a:17:{s:9:\"libraries\";s:0:\"\";s:13:\"all_items_map\";s:1:\"1\";s:8:\"order_by\";s:0:\"\";s:15:\"order_direction\";s:3:\"ASC\";s:7:\"en_pret\";s:9:\"emprunt\u00c3\u00a9\";s:7:\"grouper\";s:1:\"1\";s:3:\"bib\";s:1:\"1\";s:7:\"section\";s:1:\"1\";s:11:\"emplacement\";s:1:\"0\";s:12:\"localisation\";s:1:\"0\";s:4:\"plan\";s:1:\"0\";s:4:\"resa\";s:1:\"1\";s:5:\"dispo\";s:1:\"1\";s:6:\"annexe\";s:1:\"0\";s:11:\"date_retour\";s:1:\"1\";s:16:\"datas_items_code\";a:1:{i:0;s:1:\"f\";}s:17:\"datas_items_label\";a:1:{i:0;s:2:\"CB\";}}}",
"rewrite_url": "",
"domain_ids": "",
"template": "HISTORIC",
"cfg_accueil": {
"use_parent_css": "1",
"modules": [],
"sitemap": "1"
},
"cfg_menus": {
"H": {
"libelle": "Menu horizontal",
"picto": "vide.gif",
"menus": []
},
"V": {
"libelle": "Menu vertical",
"picto": "vide.gif",
"menus": []
}
}
}
This diff is collapsed.
This diff is collapsed.
......@@ -29,6 +29,9 @@ class CleanProfileCfgModulesScriptTest extends ModelTestCase {
['id' => 1,
]);
(new Class_Profil_Import($this->fixture(Class_Profil::class, ['id' => 3])))
->import(__DIR__ . '/141251_profile_with_theme_historic.json');
(new Class_Profil_Import($this->fixture(Class_Profil::class, ['id' => 7])))
->import(__DIR__ . '/141251_profile_with_corupted_cfg_modules.json');
......@@ -39,21 +42,80 @@ class CleanProfileCfgModulesScriptTest extends ModelTestCase {
/** @test */
public function cfgModulesOfProfileSevenShouldContainsSeventeenEntries() {
$this->assertCount(17, Class_Profil::find(7)->getCfgModulesAsArray());
public function profileThreeShouldEqualsToCleanedHistoricProfile() {
$this->assertEquals(json_decode((new Storm_FileSystem_Disk)->fileGetContents(__DIR__ . '/141251_cleaned_historic_profile.json')),
json_decode((new Class_Profil_Export(Class_Profil::find(3)))->toString()));
}
/** @test */
public function cfgModulesOfProfileThreeShouldNotContainsCatalogueAppelmenu() {
$modules = Class_Profil::find(3)->getCfgModulesAsArray();
$this->assertFalse(isset($modules['catalogue']));
}
/** @test */
public function cfgModulesAbonneFavIconShouldNotExists() {
$abonne_settings = Class_Profil::find(7)->getCfgModulesAsArray()['abonne'];
$this->assertFalse(isset($abonne_settings['favicon.ico']));
public function profilSevenShouldBeEqualsToCleanedThemeProfile() {
$this->assertEquals(json_decode((new Storm_FileSystem_Disk)->fileGetContents(__DIR__ . '/141251_cleaned_theme_profile.json')),
json_decode((new Class_Profil_Export(Class_Profil::find(7)))->toString()));
}
/** @test */
public function cfgModulesAbonneLoansShouldExists() {
$abonne_settings = Class_Profil::find(7)->getCfgModulesAsArray()['abonne'];
$this->assertTrue(isset($abonne_settings['prets']));
public function cfgModulesOfProfileSevenShouldContainsTweentyEntries() {
$this->assertCount(20, Class_Profil::find(7)->getCfgModulesAsArray());
}
public function correctModules() {
return [['recherche', 'viewnotice1'],
['recherche', 'viewnotice2'],
['recherche', 'viewnotice3'],
['recherche', 'viewnotice4'],
['recherche', 'viewnotice5'],
['recherche', 'resultatsimple'],
['recherche', 'viewnoticeDiMusic'],
['recherche', 'avancee'],
['abonne', 'fiche'],
['abonne', 'prets'],
['abonne', 'loans-history'],
['abonne', 'reservations'],
['abonne', 'suggestion-achat'],
['sito', 'viewselection']];
}
/**
* @dataProvider correctModules
* @test
*/
public function cfgModulesOfProfileSevenShouldContainsModules($module, $action) {
$search_settings = Class_Profil::find(7)->getCfgModulesAsArray()[$module];
$this->assertTrue(isset($search_settings[$action]));
}
public function corruptedModules() {
return [['Components'],
['Telerik.Web.UI.DialogHandler.aspx'],
['system'],
['config'],
['local'],
['home.php'],
['%E2%80%A6'],
['templates'],
['v3.php'],
['pouet']];
}
/**
* @dataProvider corruptedModules
* @test
*/
public function cfgModulesOfProfileSevenShouldBeCleaned($corrupted_module) {
$modules = Class_Profil::find(7)->getCfgModulesAsArray();
$this->assertFalse(isset($modules[$corrupted_module]));
}
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment