summaryrefslogtreecommitdiff
path: root/modules/gallery/controllers/scaffold.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gallery/controllers/scaffold.php')
-rw-r--r--modules/gallery/controllers/scaffold.php437
1 files changed, 437 insertions, 0 deletions
diff --git a/modules/gallery/controllers/scaffold.php b/modules/gallery/controllers/scaffold.php
new file mode 100644
index 00000000..5b8f9aa9
--- /dev/null
+++ b/modules/gallery/controllers/scaffold.php
@@ -0,0 +1,437 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2009 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 Scaffold_Controller extends Template_Controller {
+ public $template = "scaffold.html";
+
+ function index() {
+ $session = Session::instance();
+
+ set_error_handler(array("Scaffold_Controller", "_error_handler"));
+ try {
+ $this->template->album_count = ORM::factory("item")->where("type", "album")->count_all();
+ $this->template->photo_count = ORM::factory("item")->where("type", "photo")->count_all();
+ $this->template->album_tree = $this->_load_album_tree();
+ $this->template->add_photo_html = $this->_get_add_photo_html();
+ } catch (Exception $e) {
+ $this->template->album_count = 0;
+ $this->template->photo_count = 0;
+ $this->template->deepest_photo = null;
+ $this->template->album_tree = array();
+ $this->template->add_photo_html = "";
+ }
+
+ $this->_load_comment_info();
+ $this->_load_tag_info();
+
+ restore_error_handler();
+
+ if (!empty($session) && $session->get("profiler", false)) {
+ $profiler = new Profiler();
+ $profiler->render();
+ }
+ }
+
+
+ function add_photos() {
+ $path = trim($this->input->post("path"));
+ $parent_id = (int)$this->input->post("parent_id");
+ $parent = ORM::factory("item", $parent_id);
+ if (!$parent->loaded) {
+ throw new Exception("@todo BAD_ALBUM");
+ }
+
+ batch::start();
+ cookie::set("add_photos_path", $path);
+ $photo_count = 0;
+ foreach (glob("$path/*.[Jj][Pp][Gg]") as $file) {
+ set_time_limit(30);
+ photo::create($parent, $file, basename($file), basename($file));
+ $photo_count++;
+ }
+ batch::stop();
+
+ if ($photo_count > 0) {
+ log::success("content", "(scaffold) Added $photo_count photos",
+ html::anchor("albums/$parent_id", "View album"));
+ }
+
+ url::redirect("scaffold");
+ }
+
+ function add_albums_and_photos($count, $desired_type=null) {
+ srand(time());
+ $parents = ORM::factory("item")->where("type", "album")->find_all()->as_array();
+ $owner_id = user::active()->id;
+
+ $test_images = glob(MODPATH . "gallery/tests/images/*.[Jj][Pp][Gg]");
+
+ batch::start();
+ $album_count = $photo_count = 0;
+ for ($i = 0; $i < $count; $i++) {
+ set_time_limit(30);
+
+ $parent = $parents[array_rand($parents)];
+ $parent->reload();
+ $type = $desired_type;
+ if (!$type) {
+ $type = rand(0, 10) ? "photo" : "album";
+ }
+ if ($type == "album") {
+ $thumb_size = module::get_var("gallery", "thumb_size");
+ $parents[] = album::create(
+ $parent, "rnd_" . rand(), "Rnd $i", "random album $i", $owner_id)
+ ->save();
+ $album_count++;
+ } else {
+ $photo_index = rand(0, count($test_images) - 1);
+ photo::create($parent, $test_images[$photo_index], basename($test_images[$photo_index]),
+ "rnd_" . rand(), "sample thumb", $owner_id);
+ $photo_count++;
+ }
+ }
+ batch::stop();
+
+ if ($photo_count > 0) {
+ log::success("content", "(scaffold) Added $photo_count photos");
+ }
+
+ if ($album_count > 0) {
+ log::success("content", "(scaffold) Added $album_count albums");
+ }
+ url::redirect("scaffold");
+ }
+
+ function random_phrase($count) {
+ static $words;
+ if (empty($words)) {
+ $sample_text = "Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium
+ laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi
+ architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas
+ sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione
+ voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit,
+ amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut
+ labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis
+ nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi
+ consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam
+ nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla
+ pariatur? At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis
+ praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi
+ sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt
+ mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et
+ expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque
+ nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas
+ assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis
+ debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et
+ molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut
+ reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores
+ repellat.";
+ $words = preg_split('/\s+/', $sample_text);
+ }
+
+ $chosen = array();
+ for ($i = 0; $i < $count; $i++) {
+ $chosen[] = $words[array_rand($words)];
+ }
+
+ return implode(' ', $chosen);
+ }
+
+ function add_comments($count) {
+ srand(time());
+ $photos = ORM::factory("item")->where("type", "photo")->find_all()->as_array();
+ $users = ORM::factory("user")->find_all()->as_array();
+
+ if (empty($photos)) {
+ url::redirect("scaffold");
+ }
+
+ if (module::is_active("akismet")) {
+ akismet::$test_mode = 1;
+ }
+ for ($i = 0; $i < $count; $i++) {
+ $photo = $photos[array_rand($photos)];
+ $author = $users[array_rand($users)];
+ $guest_name = ucfirst($this->random_phrase(rand(1, 3)));
+ $guest_email = sprintf("%s@%s.com", $this->random_phrase(1), $this->random_phrase(1));
+ $guest_url = sprintf("http://www.%s.com", $this->random_phrase(1));
+ comment::create($photo, $author, $this->random_phrase(rand(8, 500)),
+ $guest_name, $guest_email, $guest_url);
+ }
+
+ url::redirect("scaffold");
+ }
+
+ function add_tags($count) {
+ $items = ORM::factory("item")->find_all()->as_array();
+
+ if (!empty($items)) {
+ $tags = $this->_generateTags($count);
+
+ while ($count-- > 0) {
+ $tag_name = $tags[array_rand($tags)];
+ $item = $items[array_rand($items)];
+
+ tag::add($item, $tag_name);
+ }
+ }
+
+ url::redirect("scaffold");
+ }
+
+ private function _generateTags($number){
+ // Words from lorem2.com
+ $words = explode(
+ " ",
+ "Lorem ipsum dolor sit amet consectetuer adipiscing elit Donec odio Quisque volutpat " .
+ "mattis eros Nullam malesuada erat ut turpis Suspendisse urna nibh viverra non " .
+ "semper suscipit posuere a pede Donec nec justo eget felis facilisis " .
+ "fermentum Aliquam porttitor mauris sit amet orci Aenean dignissim pellentesque " .
+ "felis Morbi in sem quis dui placerat ornare Pellentesque odio nisi euismod in " .
+ "pharetra a ultricies in diam Sed arcu Cras consequat Praesent dapibus neque " .
+ "id cursus faucibus tortor neque egestas augue eu vulputate magna eros eu " .
+ "erat Aliquam erat volutpat Nam dui mi tincidunt quis accumsan porttitor " .
+ "facilisis luctus metus Phasellus ultrices nulla quis nibh Quisque a " .
+ "lectus Donec consectetuer ligula vulputate sem tristique cursus Nam nulla quam " .
+ "gravida non commodo a sodales sit amet nisi Pellentesque fermentum " .
+ "dolor Aliquam quam lectus facilisis auctor ultrices ut elementum vulputate " .
+ "nunc Sed adipiscing ornare risus Morbi est est blandit sit amet sagittis vel " .
+ "euismod vel velit Pellentesque egestas sem Suspendisse commodo ullamcorper " .
+ "magna");
+
+ while ($number--) {
+ $results[] = $words[array_rand($words, 1)];
+ }
+ return $results;
+ }
+
+ function _error_handler($x) {
+ }
+
+ private function _load_comment_info() {
+ if (class_exists("Comment_Model")) {
+ $this->template->comment_count = ORM::factory("comment")->count_all();
+ } else {
+ $this->template->comment_count = 0;
+ }
+ }
+
+ private function _load_tag_info() {
+ if (class_exists("Tag_Model")) {
+ $this->template->tag_count = ORM::factory("tag")->count_all();
+ $this->template->most_tagged = Database::instance()
+ ->select("item_id AS id", "COUNT(tag_id) AS count")
+ ->from("items_tags")
+ ->groupby("item_id")
+ ->orderby("count", "DESC")
+ ->limit(1)
+ ->get()
+ ->current();
+ } else {
+ $this->template->tag_count = 0;
+ $this->template->most_tagged = 0;
+ }
+ }
+
+ function install($module_name, $redirect=true) {
+ $to_install = array();
+ if ($module_name == "*") {
+ foreach (module::available() as $module_name => $info) {
+ if (empty($info->installed)) {
+ $to_install[] = $module_name;
+ }
+ }
+ } else {
+ $to_install[] = $module_name;
+ }
+
+ foreach ($to_install as $module_name) {
+ if ($module_name != "gallery") {
+ require_once(DOCROOT . "modules/${module_name}/helpers/${module_name}_installer.php");
+ }
+ module::install($module_name);
+ }
+
+ if ($redirect) {
+ url::redirect("scaffold");
+ }
+ }
+
+
+ public function package() {
+ $this->auto_render = false;
+ $db = Database::instance();
+
+ // Drop all tables
+ foreach ($db->list_tables() as $table) {
+ $db->query("DROP TABLE IF EXISTS `$table`");
+ }
+
+ // Clean out data
+ dir::unlink(VARPATH . "uploads");
+ dir::unlink(VARPATH . "albums");
+ dir::unlink(VARPATH . "resizes");
+ dir::unlink(VARPATH . "thumbs");
+ dir::unlink(VARPATH . "modules");
+ dir::unlink(VARPATH . "tmp");
+
+ $db->clear_cache();
+ module::$modules = array();
+ module::$active = array();
+
+ // Use a known random seed so that subsequent packaging runs will reuse the same random
+ // numbers, keeping our install.sql file more stable.
+ srand(0);
+
+ try {
+ gallery_installer::install(true);
+ module::load_modules();
+
+ foreach (array("user", "comment", "organize", "info", "rss",
+ "search", "slideshow", "tag") as $module_name) {
+ module::install($module_name);
+ module::activate($module_name);
+ }
+ } catch (Exception $e) {
+ Kohana::log("error", $e->getTraceAsString());
+ print $e->getTrace();
+ throw $e;
+ }
+
+ url::redirect("scaffold/dump_database");
+ }
+
+ public function dump_database() {
+ $this->auto_render = false;
+
+ // We now have a clean install with just the packages that we want. Make sure that the
+ // database is clean too.
+ $db = Database::instance();
+ $db->query("TRUNCATE {sessions}");
+ $db->query("TRUNCATE {logs}");
+ $db->query("DELETE FROM {vars} WHERE `module_name` = 'gallery' AND `name` = '_cache'");
+ $db->update("users", array("password" => ""), array("id" => 1));
+ $db->update("users", array("password" => ""), array("id" => 2));
+
+ $dbconfig = Kohana::config('database.default');
+ $conn = $dbconfig["connection"];
+ $pass = $conn["pass"] ? "-p{$conn['pass']}" : "";
+ $sql_file = DOCROOT . "installer/install.sql";
+ if (!is_writable($sql_file)) {
+ print "$sql_file is not writeable";
+ return;
+ }
+ $command = "mysqldump --compact --add-drop-table -h{$conn['host']} " .
+ "-u{$conn['user']} $pass {$conn['database']} > $sql_file";
+ exec($command, $output, $status);
+ if ($status) {
+ print "<pre>";
+ print "$command\n";
+ print "Failed to dump database\n";
+ print implode("\n", $output);
+ return;
+ }
+
+ // Post-process the sql file
+ $buf = "";
+ $root_timestamp = ORM::factory("item", 1)->created;
+ foreach (file($sql_file) as $line) {
+ // Prefix tables
+ $line = preg_replace(
+ "/(CREATE TABLE|IF EXISTS|INSERT INTO) `{$dbconfig['table_prefix']}(\w+)`/", "\\1 {\\2}",
+ $line);
+
+ // Normalize dates
+ $line = preg_replace("/,$root_timestamp,/", ",UNIX_TIMESTAMP(),", $line);
+ $buf .= $line;
+ }
+ $fd = fopen($sql_file, "wb");
+ fwrite($fd, $buf);
+ fclose($fd);
+
+ url::redirect("scaffold/dump_var");
+ }
+
+ public function dump_var() {
+ $this->auto_render = false;
+
+ $objects = new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator(VARPATH),
+ RecursiveIteratorIterator::SELF_FIRST);
+
+ $var_file = DOCROOT . "installer/init_var.php";
+ if (!is_writable($var_file)) {
+ print "$var_file is not writeable";
+ return;
+ }
+
+ $paths = array();
+ foreach($objects as $name => $file){
+ if ($file->getBasename() == "database.php") {
+ continue;
+ } else if (basename($file->getPath()) == "logs") {
+ continue;
+ }
+
+ if ($file->isDir()) {
+ $paths[] = "VARPATH . \"" . substr($name, strlen(VARPATH)) . "\"";
+ } else {
+ // @todo: serialize non-directories
+ print "Unknown file: $name";
+ return;
+ }
+ }
+ // Sort the paths so that the var file is stable
+ sort($paths);
+
+ $fd = fopen($var_file, "w");
+ fwrite($fd, "<?php defined(\"SYSPATH\") or die(\"No direct script access.\") ?>\n");
+ fwrite($fd, "<?php\n");
+ foreach ($paths as $path) {
+ fwrite($fd, "!file_exists($path) && mkdir($path);\n");
+ }
+ fclose($fd);
+ url::redirect("scaffold");
+ }
+
+ private function _load_album_tree() {
+ $tree = array();
+ foreach (ORM::factory("item")->where("type", "album")->find_all() as $album) {
+ if ($album->parent_id) {
+ $tree[$album->parent_id]->children[] = $album->id;
+ }
+ $tree[$album->id]->album = $album;
+ $tree[$album->id]->children = array();
+ }
+
+ return $tree;
+ }
+
+ public function form($arg1, $arg2) {
+ if ($arg1 == "add" && $arg2 == "photos") {
+ print $this->_get_add_photo_html();
+ }
+ $this->auto_render = false;
+ }
+
+ public function _get_add_photo_html($parent_id=1) {
+ $parent = ORM::factory("item", $parent_id);
+ return photo::get_add_form($parent);
+ }
+}