summaryrefslogtreecommitdiff
path: root/modules/developer/controllers/admin_developer.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules/developer/controllers/admin_developer.php')
-rw-r--r--modules/developer/controllers/admin_developer.php306
1 files changed, 306 insertions, 0 deletions
diff --git a/modules/developer/controllers/admin_developer.php b/modules/developer/controllers/admin_developer.php
new file mode 100644
index 0000000..d723a36
--- /dev/null
+++ b/modules/developer/controllers/admin_developer.php
@@ -0,0 +1,306 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2013 Bharat Mediratta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+class Admin_Developer_Controller extends Admin_Controller {
+ static $event_list = array();
+
+ public function module() {
+ $view = new Admin_View("admin.html");
+ $view->content = new View("admin_developer.html");
+ $view->content->title = t("Generate module");
+
+ if (!is_writable(MODPATH)) {
+ message::warning(
+ t("The module directory is not writable. Please ensure that it is writable by the web server"));
+ }
+ list ($form, $errors) = $this->_get_module_form();
+ $view->content->developer_content = $this->_get_module_create_content($form, $errors);
+ print $view;
+ }
+
+ public function test_data() {
+ $v = new Admin_View("admin.html");
+ $v->content = new View("admin_developer.html");
+ $v->content->title = t("Generate Test Data");
+
+ list ($form, $errors) = $this->_get_module_form();
+ $v->content->developer_content = $this->_get_test_data_view($form, $errors);
+ print $v;
+ }
+
+ public function module_create() {
+ access::verify_csrf();
+
+ list ($form, $errors) = $this->_get_module_form();
+
+ $post = new Validation($_POST);
+ $post->add_rules("name", "required");
+ $post->add_rules("display_name", "required");
+ $post->add_rules("description", "required");
+ $post->add_callbacks("theme", array($this, "_noop_validation"));
+ $post->add_callbacks("event", array($this, "_noop_validation"));
+ $post->add_callbacks("name", array($this, "_is_module_defined"));
+
+ if ($post->validate()) {
+ $task_def = Task_Definition::factory()
+ ->callback("developer_task::create_module")
+ ->description(t("Create a new module"))
+ ->name(t("Create Module"));
+ $success_msg = t("Generation of %module completed successfully",
+ array("module" => $post->name));
+ $error_msg = t("Generation of %module failed.", array("module" => $post->name));
+ $task_context = array("step" => 0, "success_msg" => $success_msg, "error_msg" => $error_msg);
+ $task = task::create($task_def, array_merge($task_context, $post->as_array()));
+
+ json::reply(array("result" => "started",
+ "max_iterations" => 15,
+ "url" => url::site("admin/developer/run_task/{$task->id}?csrf=" .
+ access::csrf_token()),
+ "task" => $task->as_array()));
+ } else {
+ $v = $this->_get_module_create_content(arr::overwrite($form, $post->as_array()),
+ arr::overwrite($errors, $post->errors()));
+ json::reply(array("result" => "error", "html" => (string)$v));
+ }
+ }
+
+ public function _noop_validation(Validation $array, $field) {
+ }
+
+ public function session($key) {
+ access::verify_csrf();
+ $input = Input::instance();
+ Session::instance()->set($key, $input->get("value"));
+ url::redirect($input->server("HTTP_REFERER"));
+ }
+
+ public function test_data_create() {
+ list ($form, $errors) = $this->_get_test_data_form();
+
+ $post = new Validation($_POST);
+ $post->add_rules("albums", "numeric");
+ $post->add_rules("photos", "numeric");
+ $post->add_rules("comments", "numeric");
+ $post->add_rules("tags", "numeric");
+ $post->add_callbacks("albums", array($this, "_set_default"));
+ $post->add_callbacks("photos", array($this, "_set_default"));
+ $post->add_callbacks("comments", array($this, "_set_default"));
+ $post->add_callbacks("tags", array($this, "_set_default"));
+
+ if ($post->validate()) {
+ $task_def = Task_Definition::factory()
+ ->callback("developer_task::create_content")
+ ->description(t("Create test content"))
+ ->name(t("Create Test Data"));
+ $total = $post->albums + $post->photos + $post->comments + $post->tags;
+ $success_msg = t("Successfully generated test data");
+ $error_msg = t("Problems with test data generation was encountered");
+ $task = task::create($task_def, array("total" => $total, "batch" => (int)ceil($total / 10),
+ "success_msg" => $success_msg,
+ "current" => 0, "error_msg" => $error_msg,
+ "albums" => $post->albums, "photos" => $post->photos,
+ "comments" => $post->comments, "tags" => $post->tags));
+ batch::start();
+
+ json::reply(array("result" => "started",
+ "max_iterations" => $total + 5,
+ "url" => url::site("admin/developer/run_task/{$task->id}?csrf=" .
+ access::csrf_token()),
+ "task" => $task->as_array()));
+ } else {
+ $v = $this->_get_test_data_view(arr::overwrite($form, $post->as_array()),
+ arr::overwrite($errors, $post->errors()));
+ json::reply(array("result" => "error", "html" => (string)$v));
+ }
+ }
+
+ public function run_task($task_id) {
+ try {
+ $task = task::run($task_id);
+ } catch (Exception $e) {
+ $error_msg = $e->getMessage();
+ $task->done = true;
+ }
+
+ if ($task->done) {
+ batch::stop();
+ $context = unserialize($task->context);
+ switch ($task->state) {
+ case "success":
+ message::success($context["success_msg"]);
+ break;
+
+ case "error":
+ message::success(empty($error_msg) ? $context["error_msg"] : $error_msg);
+ break;
+ }
+ json::reply(array("result" => "success", "task" => $task->as_array()));
+
+ } else {
+ json::reply(array("result" => "in_progress", "task" => $task->as_array()));
+ }
+ }
+
+ function mptt() {
+ $v = new Admin_View("admin.html");
+ $v->content = new View("mptt_tree.html");
+
+ $v->content->tree = $this->_build_tree();
+
+ if (exec("which /usr/bin/dot")) {
+ $v->content->url = url::site("admin/developer/mptt_graph");
+ } else {
+ $v->content->url = null;
+ message::warning(t("The package 'graphviz' is not installed, degrading to text view"));
+ }
+ print $v;
+ }
+
+ function mptt_graph() {
+ $items = ORM::factory("item")->order_by("id")->find_all();
+ $data = $this->_build_tree();
+
+ $proc = proc_open("/usr/bin/dot -Tsvg",
+ array(array("pipe", "r"),
+ array("pipe", "w")),
+ $pipes,
+ VARPATH . "tmp");
+ fwrite($pipes[0], $data);
+ fclose($pipes[0]);
+
+ header("Content-Type: image/svg+xml");
+ print(stream_get_contents($pipes[1]));
+ fclose($pipes[1]);
+ proc_close($proc);
+ }
+
+ private function _build_tree() {
+ $items = ORM::factory("item")->order_by("id")->find_all();
+ $data = "digraph G {\n";
+ foreach ($items as $item) {
+ $data .= " $item->parent_id -> $item->id\n";
+ $data .=
+ " $item->id [label=\"$item->id [$item->level] <$item->left_ptr, $item->right_ptr>\"]\n";
+ }
+ $data .= "}\n";
+ return $data;
+ }
+
+ public function _is_module_defined(Validation $post, $field) {
+ $module_name = strtolower(strtr($post[$field], " ", "_"));
+ if (file_exists(MODPATH . "$module_name/module.info")) {
+ $post->add_error($field, "module_exists");
+ }
+ }
+
+ public function _set_default(Validation $post, $field) {
+ if (empty($post->$field)) {
+ $post->$field = 0;
+ }
+ }
+
+ private function _get_module_form() {
+ $form = array("name" => "", "display_name" => "", "description" => "", "theme[]" => array(),
+ "event[]" => array());
+ $errors = array_fill_keys(array_keys($form), "");
+
+ return array($form, $errors);
+ }
+
+ private function _get_module_create_content($form, $errors) {
+ $config = Kohana::config("developer.methods");
+
+ $v = new View("developer_module.html");
+ $v->action = "admin/developer/module_create";
+ $v->theme = $config["theme"];
+ $v->event = $this->_get_events();
+ $v->form = $form;
+ $v->errors = $errors;
+ $submit_attributes = array(
+ "id" => "g-generate-module",
+ "name" => "generate",
+ "class" => "ui-state-default ui-corner-all",
+ "style" => "clear:both!important");
+
+ if (!is_writable(MODPATH)) {
+ $submit_attributes["class"] .= " ui-state-disabled";
+ $submit_attributes["disabled"] = "disabled";
+ }
+ $v->submit_attributes = $submit_attributes;
+ return $v;
+ }
+
+ private function _get_events() {
+ if (empty(self::$event_list)) {
+ $dir = new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator(MODPATH));
+ foreach ($dir as $file) {
+ $file_as_string = file_get_contents($file);
+ if (preg_match_all('#module::event\("(.*?)"(.*)\);#mU', $file_as_string, $matches, PREG_SET_ORDER) > 0) {
+ foreach ($matches as $match) {
+ $event_name = $match[1];
+ $display_name = ucwords(str_replace("_", " ", $event_name));
+ if (!in_array($display_name, self::$event_list)) {
+ $parameters = array();
+ if (!empty($match[2]) &&
+ preg_match_all('#\$[a-zA-Z_]*#', $match[2], $param_names)) {
+
+ foreach ($param_names[0] as $name) {
+ $parameters[] = $name != '$this' ? $name : '$' . $event_name;
+ }
+ }
+ self::$event_list["static function $event_name(" . implode(", ", $parameters) . ")"] = $display_name;
+ }
+ }
+ ksort(self::$event_list);
+ }
+ }
+ }
+ return self::$event_list;
+ }
+
+ private function _get_test_data_form() {
+ $form = array("albums" => "10", "photos" => "10", "comments" => "10", "tags" => "10",
+ "generate_albums" => "");
+ $errors = array_fill_keys(array_keys($form), "");
+
+ return array($form, $errors);
+ }
+
+ private function _get_test_data_view($form, $errors) {
+ $v = new View("admin_developer_test_data.html");
+ $v->action = "admin/developer/test_data_create";
+ $album_count = ORM::factory("item")->where("type", "=", "album")->count_all();
+ $photo_count = ORM::factory("item")->where("type", "=", "photo")->count_all();
+
+ $v->comment_installed = module::is_active("comment");
+ $comment_count = empty($v->comment_installed) ? 0 : ORM::factory("comment")->count_all();
+
+ $v->tag_installed = module::is_active("tag");
+ $tag_count = empty($v->tag_installed) ? 0 : ORM::factory("tag")->count_all();
+
+ $v->album_count = t2("%count album", "%count albums", $album_count);
+ $v->photo_count = t2("%count photo", "%count photos", $photo_count);
+ $v->comment_count = t2("%count comment", "%count comments", $comment_count);
+ $v->tag_count = t2("%count tag", "%count tags", $tag_count);
+ $v->form = $form;
+ $v->errors = $errors;
+ return $v;
+ }
+}