From 6dd92cfa1cbdade77721f153aa1b6aab965cff82 Mon Sep 17 00:00:00 2001 From: Andy Staudacher Date: Wed, 20 Jan 2010 23:12:36 -0800 Subject: Fix maintenance tasks / language admin for bug introduced earlier by no longer casting in ORM. Task->done is now a string, boolean false is stored as integer 0 and loaded as string "0". On the client side that's interpreted as truthy in JavaScript. Fix: cast "0" to (bool) before encoding to JSON. --- modules/gallery/controllers/admin_maintenance.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'modules') diff --git a/modules/gallery/controllers/admin_maintenance.php b/modules/gallery/controllers/admin_maintenance.php index 213e4fe2..aa4fb29f 100644 --- a/modules/gallery/controllers/admin_maintenance.php +++ b/modules/gallery/controllers/admin_maintenance.php @@ -216,7 +216,7 @@ class Admin_Maintenance_Controller extends Admin_Controller { "task" => array( "percent_complete" => $task->percent_complete, "status" => $task->status, - "done" => $task->done), + "done" => (bool) $task->done), "location" => url::site("admin/maintenance"))); } else { @@ -224,7 +224,7 @@ class Admin_Maintenance_Controller extends Admin_Controller { "task" => array( "percent_complete" => $task->percent_complete, "status" => $task->status, - "done" => $task->done))); + "done" => (bool) $task->done))); } } } -- cgit v1.2.3 From d59c6ed4f149c201542c8b38f9ad9d61b4daabf4 Mon Sep 17 00:00:00 2001 From: Tim Almdal Date: Thu, 21 Jan 2010 12:57:45 -0800 Subject: The admin module controller allows modules to provide a check_environment method which is called prior to installation. The method allows the module to provide an error message or warnings if the module can not be installed or activated without issues. The admin module controller also will fire a pre_deactivate event, which allows modules to indicate issues that may arise be deactivating the specified module. These messages are displayed in a dialog box prior to installation in order to allow the gallery administrator to determine the appropriate action before proceeding. Lays the foundation for implementing a fix for ticket #937 --- modules/gallery/controllers/admin_modules.php | 41 +++++++++++++- modules/gallery/helpers/module.php | 65 ++++++++++++++++++---- modules/gallery/views/admin_modules.html.php | 40 ++++++++++++- .../gallery/views/admin_modules_confirm.html.php | 22 ++++++++ 4 files changed, 154 insertions(+), 14 deletions(-) create mode 100644 modules/gallery/views/admin_modules_confirm.html.php (limited to 'modules') diff --git a/modules/gallery/controllers/admin_modules.php b/modules/gallery/controllers/admin_modules.php index 549718e7..46defbef 100644 --- a/modules/gallery/controllers/admin_modules.php +++ b/modules/gallery/controllers/admin_modules.php @@ -25,9 +25,48 @@ class Admin_Modules_Controller extends Admin_Controller { print $view; } + + public function confirm() { + access::verify_csrf(); + + $messages = array("error" => array(), "warn" => array()); + $desired_list = array(); + foreach (module::available() as $module_name => $info) { + if ($info->locked) { + continue; + } + + if ($desired = Input::instance()->post($module_name) == 1) { + $desired_list[] = $module_name; + } + if ($info->active && !$desired && module::is_active($module_name)) { + $messages = array_merge($messages, module::can_deactivate($module_name)); + } else if (!$info->active && $desired && !module::is_active($module_name)) { + $messages = array_merge($messages, module::check_environment($module_name)); + } + } + + if (empty($messages["error"]) && empty($messages["warn"])) { + $this->_do_save(); + $result["reload"] = 1; + } else { + $v = new View("admin_modules_confirm.html"); + $v->messages = $messages; + $v->modules = $desired_list; + $result["dialog"] = (string)$v; + $result["allow_continue"] = empty($messages["error"]); + } + print json_encode($result); + } + public function save() { access::verify_csrf(); + $this->_do_save(); + url::redirect("admin/modules"); + } + + private function _do_save() { $changes->activate = array(); $changes->deactivate = array(); $activated_names = array(); @@ -45,6 +84,7 @@ class Admin_Modules_Controller extends Admin_Controller { } else if (!$info->active && $desired && !module::is_active($module_name)) { $changes->activate[] = $module_name; $activated_names[] = t($info->name); + if (module::is_installed($module_name)) { module::upgrade($module_name); } else { @@ -63,7 +103,6 @@ class Admin_Modules_Controller extends Admin_Controller { if ($deactivated_names) { message::success(t("Deactivated: %names", array("names" => join(", ", $deactivated_names)))); } - url::redirect("admin/modules"); } } diff --git a/modules/gallery/helpers/module.php b/modules/gallery/helpers/module.php index 6c7078a3..2ae83f0d 100644 --- a/modules/gallery/helpers/module.php +++ b/modules/gallery/helpers/module.php @@ -119,6 +119,36 @@ class module_Core { return self::$active; } + /** + * Check that the module can be installed. (i.e. all the prerequistes exist) + * @param string $module_name + */ + static function check_environment($module_name) { + module::_add_to_path($module_name); + $messages = array(); + + $installer_class = "{$module_name}_installer"; + if (method_exists($installer_class, "check_environment")) { + $messages = call_user_func(array($installer_class, "check_environment")); + } + + // Now the module is installed but inactive, so don't leave it in the active path + module::_remove_from_path($module_name); + return $messages; + } + + /** + * Check that the module can be installed. (i.e. all the prerequistes exist) + * @param string $module_name + */ + static function can_deactivate($module_name) { + $data = (object)array("module" => $module_name, "messages" => array()); + + module::event("pre_deactivate", $data); + + return $data->messages; + } + /** * Install a module. This will call _installer::install(), which is responsible for * creating database tables, setting module variables and calling module::set_version(). @@ -126,13 +156,8 @@ class module_Core { * @param string $module_name */ static function install($module_name) { - $config = Kohana_Config::instance(); - $kohana_modules = $config->get("core.modules"); - array_unshift($kohana_modules, MODPATH . $module_name); - $config->set("core.modules", $kohana_modules); + module::_add_to_path($module_name); - // Rebuild the include path so the module installer can benefit from auto loading - Kohana::include_paths(true); $installer_class = "{$module_name}_installer"; if (method_exists($installer_class, "install")) { call_user_func_array(array($installer_class, "install"), array()); @@ -142,13 +167,32 @@ class module_Core { module::load_modules(); // Now the module is installed but inactive, so don't leave it in the active path - array_shift($kohana_modules); - $config->set("core.modules", $kohana_modules); + module::_remove_from_path($module_name); log::success( "module", t("Installed module %module_name", array("module_name" => $module_name))); } + private static function _add_to_path($module_name) { + $config = Kohana_Config::instance(); + $kohana_modules = $config->get("core.modules"); + array_unshift($kohana_modules, MODPATH . $module_name); + $config->set("core.modules", $kohana_modules); + // Rebuild the include path so the module installer can benefit from auto loading + Kohana::include_paths(true); + } + + private static function _remove_from_path($module_name) { + $config = Kohana_Config::instance(); + $kohana_modules = $config->get("core.modules"); + if (($key = array_search(MODPATH . $module_name, $kohana_modules)) !== false) { + unset($kohana_modules[$key]); + $kohana_modules = array_values($kohana_modules); // reindex + } + $config->set("core.modules", $kohana_modules); + Kohana::include_paths(true); + } + /** * Upgrade a module. This will call _installer::upgrade(), which is responsible for * modifying database tables, changing module variables and calling module::set_version(). @@ -194,10 +238,7 @@ class module_Core { * @param string $module_name */ static function activate($module_name) { - $config = Kohana_Config::instance(); - $kohana_modules = $config->get("core.modules"); - array_unshift($kohana_modules, MODPATH . $module_name); - $config->set("core.modules", $kohana_modules); + module::_add_to_path($module_name); $installer_class = "{$module_name}_installer"; if (method_exists($installer_class, "activate")) { diff --git a/modules/gallery/views/admin_modules.html.php b/modules/gallery/views/admin_modules.html.php index aebedf09..7f572411 100644 --- a/modules/gallery/views/admin_modules.html.php +++ b/modules/gallery/views/admin_modules.html.php @@ -1,12 +1,50 @@
+

-
"> + "> diff --git a/modules/gallery/views/admin_modules_confirm.html.php b/modules/gallery/views/admin_modules_confirm.html.php new file mode 100644 index 00000000..59592505 --- /dev/null +++ b/modules/gallery/views/admin_modules_confirm.html.php @@ -0,0 +1,22 @@ + +
+

+ +

+ +
+
    + "g-error", "warn" => "g-warning") as $type => $class): ?> + +
  • + + +
+ "> + + + + + +
+
-- cgit v1.2.3 From ff2d81b7c3b75e548766fb8a0ae370cbb2e39bf5 Mon Sep 17 00:00:00 2001 From: Tim Almdal Date: Thu, 21 Jan 2010 13:03:58 -0800 Subject: Convert the slideshow module to use the new check environment and pre_deactivate api methods. --- modules/slideshow/helpers/slideshow_event.php | 6 ++++++ modules/slideshow/helpers/slideshow_installer.php | 8 ++++++++ 2 files changed, 14 insertions(+) (limited to 'modules') diff --git a/modules/slideshow/helpers/slideshow_event.php b/modules/slideshow/helpers/slideshow_event.php index c4d7c56d..137ec313 100644 --- a/modules/slideshow/helpers/slideshow_event.php +++ b/modules/slideshow/helpers/slideshow_event.php @@ -18,6 +18,12 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class slideshow_event_Core { + static function pre_deactivate($data) { + if ($data->module == "rss") { + $data->messages["warn"][] = t("The Slideshow module requires the RSS module."); + } + } + static function module_change($changes) { if (!module::is_active("rss") || in_array("rss", $changes->deactivate)) { site_status::warning( diff --git a/modules/slideshow/helpers/slideshow_installer.php b/modules/slideshow/helpers/slideshow_installer.php index 03f3332c..319e2e79 100644 --- a/modules/slideshow/helpers/slideshow_installer.php +++ b/modules/slideshow/helpers/slideshow_installer.php @@ -33,4 +33,12 @@ class slideshow_installer { static function deactivate() { site_status::clear("slideshow_needs_rss"); } + + static function check_environment() { + $messages = array(); + if (!module::is_active("rss")) { + $messages["warn"][] = t("The Slideshow module requires the RSS module."); + } + return $messages; + } } -- cgit v1.2.3 From 0da5d9e606fba5b6dc6137812df32cd1d0f5750f Mon Sep 17 00:00:00 2001 From: Tim Almdal Date: Thu, 21 Jan 2010 20:33:26 -0800 Subject: Internationalize all strings in admin_modules.hmtl and corrected comments. --- modules/gallery/helpers/module.php | 6 ++++-- modules/gallery/views/admin_modules.html.php | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) (limited to 'modules') diff --git a/modules/gallery/helpers/module.php b/modules/gallery/helpers/module.php index 2ae83f0d..595f600b 100644 --- a/modules/gallery/helpers/module.php +++ b/modules/gallery/helpers/module.php @@ -122,6 +122,7 @@ class module_Core { /** * Check that the module can be installed. (i.e. all the prerequistes exist) * @param string $module_name + * @return array an array of warning or error messages to be displayed */ static function check_environment($module_name) { module::_add_to_path($module_name); @@ -132,14 +133,15 @@ class module_Core { $messages = call_user_func(array($installer_class, "check_environment")); } - // Now the module is installed but inactive, so don't leave it in the active path + // Remove it from the active path module::_remove_from_path($module_name); return $messages; } /** - * Check that the module can be installed. (i.e. all the prerequistes exist) + * Allow modules to indicate the impact of deactivating the specifeid module * @param string $module_name + * @return array an array of warning or error messages to be displayed */ static function can_deactivate($module_name) { $data = (object)array("module" => $module_name, "messages" => array()); diff --git a/modules/gallery/views/admin_modules.html.php b/modules/gallery/views/admin_modules.html.php index 7f572411..704e7beb 100644 --- a/modules/gallery/views/admin_modules.html.php +++ b/modules/gallery/views/admin_modules.html.php @@ -18,12 +18,12 @@ height: 400, width: 500, position: "center", - title: "Confirm Module Activation", + title: for_js() ?>, buttons: { - "Continue": function() { + for_js() ?>: function() { $("form", this).submit(); }, - Cancel: function() { + for_js() ?>: function() { $(this).dialog("destroy").remove(); } } -- cgit v1.2.3