Kaynağa Gözat

Assorted changes

Nathaniel van Diepen 8 yıl önce
ebeveyn
işleme
8066be199b
36 değiştirilmiş dosya ile 184 ekleme ve 86 silme
  1. 2 1
      Features.md
  2. 27 0
      css/timeline.css
  3. 2 4
      index.php
  4. 28 0
      install/db_install/00_tables/r_issue_user_needinfo.sql
  5. 13 12
      install/db_install/01_triggers/issue_insert.sql
  6. 13 12
      install/db_install/01_triggers/issue_update.sql
  7. 8 7
      install/db_install/01_triggers/message_insert.sql
  8. 8 7
      install/db_install/01_triggers/project_insert.sql
  9. 8 7
      install/db_install/01_triggers/project_update.sql
  10. 10 9
      install/db_install/01_triggers/session_insert.sql
  11. 10 9
      install/db_install/01_triggers/session_update.sql
  12. 4 3
      install/db_install/01_triggers/user_delete.sql
  13. 3 2
      install/db_install/01_triggers/user_insert.sql
  14. 6 2
      install/db_install/01_triggers/user_update.sql
  15. 7 0
      install/db_install/02_constraints/r_issue_user_needinfo.sql
  16. 10 0
      install/db_install/04_procedures/maintain_sessions.sql
  17. 6 0
      install/db_install/05_events/maintenance.sql
  18. 1 0
      install/db_uninstall/99_cleanup/events.sql
  19. 2 1
      install/db_uninstall/99_cleanup/procedures.sql
  20. 6 4
      lib/bugs.class.php
  21. 0 0
      paths/issue.path.php
  22. 0 0
      paths/login.path.php
  23. 0 0
      paths/logout.path.php
  24. 0 0
      paths/main.path.php
  25. 0 0
      paths/project.path.php
  26. 0 0
      paths/register.path.php
  27. 0 0
      paths/sessions.path.php
  28. 0 0
      paths/timeline.path.php
  29. 0 0
      paths/user.path.php
  30. 2 2
      templates/main.php
  31. 1 1
      templates/project.php
  32. 3 0
      templates/subs/dropdown.php
  33. 0 0
      templates/subs/issues.php
  34. 0 0
      templates/subs/projects.php
  35. 2 1
      templates/timeline.php
  36. 2 2
      templates/user.php

+ 2 - 1
Features.md

@@ -23,8 +23,9 @@ ToDo
 ----
  * Issues
   * Workflow
-  * Roles
   * Notifications
+  * Roles
+   * Need Info
  * Projects
   * Workflow
   * Roles

+ 27 - 0
css/timeline.css

@@ -0,0 +1,27 @@
+div.timeline>div{
+	display: flex;
+}
+div.timeline>div:nth-child(odd){
+	background-color: rgba(0,0,0,0.1);
+}
+div.timeline>div:nth-child(even){
+	background-color: rgba(0,0,0,0.2);
+}
+div.timeline>div>time{
+	float: left;
+	clear: left;
+	padding: 0;
+	margin: 0;
+	margin-right: 20px;
+	font-family: monospace;
+	vertical-align: top;
+	font-size: 100%;
+}
+div.timeline>div>div{
+	float: left;
+	clear: right;
+	padding: 0;
+	margin: 0;
+	vertical-align: top;
+	font-size: 80%;
+}

+ 2 - 4
index.php

@@ -11,10 +11,8 @@
 	require_once('lib/bugs.class.php');
 	require_once('lib/errorhandler.php');
 	Bugs::connect(DB_HOST,DB_USER,DB_PASS,DB);
-	foreach(glob("paths/*.php") as $filename){
-		if(basename($filename)!='index.php'){
-			require_once($filename);
-		}
+	foreach(glob("paths/*.path.php") as $filename){
+		require_once($filename);
 	}
 	if(empty($_SERVER['REDIRECT_URL'])){
 		$_SERVER['REDIRECT_URL'] = 'http://'.Bugs::setting('url.host').Bugs::setting('url.base');

+ 28 - 0
install/db_install/00_tables/r_issue_user_needinfo.sql

@@ -0,0 +1,28 @@
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `r_issue_user_needinfo`
+--
+-- Creation: Sep 11, 2015 at 11:31 AM
+--
+
+DROP TABLE IF EXISTS `r_issue_user_needinfo`;
+CREATE TABLE IF NOT EXISTS `r_issue_user_needinfo` (
+  `i_id` int(10) NOT NULL,
+  `u_id` int(10) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+
+--
+-- RELATIONS FOR TABLE `r_issue_user_needinfo`:
+--   `i_id`
+--       `issues` -> `id`
+--   `u_id`
+--       `users` -> `id`
+--
+
+--
+-- Indexes for table `r_issue_user_needinfo`
+--
+ALTER TABLE `r_issue_user_needinfo`
+  ADD UNIQUE KEY `i_id` (`i_id`,`u_id`),
+  ADD KEY `u_id` (`u_id`);

+ 13 - 12
install/db_install/01_triggers/issue_insert.sql

@@ -1,15 +1,16 @@
 DROP TRIGGER IF EXISTS `issue_insert`;
 CREATE TRIGGER `issue_insert`
 BEFORE INSERT ON `issues`
-	FOR EACH ROW
-		IF NEW.p_id IS NOT NULL AND NEW.name IN (
-			SELECT name
-			FROM issues
-			WHERE p_id = NEW.p_id
-		) THEN
-			SET @error = CONCAT('An issue with the name "',NEW.name,'"" already exists on the project "',project_name(NEW.p_id),'"');
-			SIGNAL SQLSTATE '45000'
-			SET MESSAGE_TEXT = @error;
-		ELSE
-			SET new.date_modified = NOW();
-		END IF;
+FOR EACH ROW BEGIN
+	IF NEW.p_id IS NOT NULL AND NEW.name IN (
+		SELECT name
+		FROM issues
+		WHERE p_id = NEW.p_id
+	) THEN
+		SET @error = CONCAT('An issue with the name "',NEW.name,'"" already exists on the project "',project_name(NEW.p_id),'"');
+		SIGNAL SQLSTATE '45000'
+		SET MESSAGE_TEXT = @error;
+	ELSE
+		SET new.date_modified = NOW();
+	END IF;
+END;

+ 13 - 12
install/db_install/01_triggers/issue_update.sql

@@ -1,15 +1,16 @@
 DROP TRIGGER IF EXISTS `issue_update`;
 CREATE TRIGGER `issue_update`
 BEFORE UPDATE ON `issues`
-	FOR EACH ROW
-		IF NEW.p_id IS NOT NULL AND NEW.name IN (
-			SELECT name
-			FROM issues
-			WHERE p_id = NEW.p_id
-		) THEN
-			SET @error = CONCAT('An issue with the name "',NEW.name,'"" already exists on the project "',project_name(NEW.p_id),'"');
-			SIGNAL SQLSTATE '45000'
-			SET MESSAGE_TEXT = @error;
-		ELSE
-			SET new.date_modified = NOW();
-		END IF;
+FOR EACH ROW BEGIN
+	IF NEW.p_id IS NOT NULL AND NEW.name IN (
+		SELECT name
+		FROM issues
+		WHERE p_id = NEW.p_id
+	) THEN
+		SET @error = CONCAT('An issue with the name "',NEW.name,'"" already exists on the project "',project_name(NEW.p_id),'"');
+		SIGNAL SQLSTATE '45000'
+		SET MESSAGE_TEXT = @error;
+	ELSE
+		SET new.date_modified = NOW();
+	END IF;
+END;

+ 8 - 7
install/db_install/01_triggers/message_insert.sql

@@ -1,9 +1,10 @@
 DROP TRIGGER IF EXISTS `message_insert`;
 CREATE TRIGGER `message_insert` BEFORE INSERT ON `messages`
-	FOR EACH ROW
-		IF new.i_id IS NOT NULL AND new.p_id IS NOT NULL THEN
-			SIGNAL SQLSTATE '45000'
-			SET MESSAGE_TEXT = 'Messages can only be related to one thing';
-		ELSE
-			SET new.date_modified = NOW();
-		END IF;
+FOR EACH ROW BEGIN
+	IF new.i_id IS NOT NULL AND new.p_id IS NOT NULL THEN
+		SIGNAL SQLSTATE '45000'
+		SET MESSAGE_TEXT = 'Messages can only be related to one thing';
+	ELSE
+		SET new.date_modified = NOW();
+	END IF;
+END;

+ 8 - 7
install/db_install/01_triggers/project_insert.sql

@@ -1,10 +1,11 @@
 DROP TRIGGER IF EXISTS `project_insert`;
 CREATE TRIGGER `project_insert`
 BEFORE INSERT ON `projects`
-	FOR EACH ROW
-		IF new.name REGEXP '^[[:alpha:]]' THEN
-			SET new.date_modified = NOW();
-		ELSE
-			SIGNAL SQLSTATE '45000'
-			SET MESSAGE_TEXT = 'Project names must start with a letter';
-		END IF;
+FOR EACH ROW BEGIN
+	IF new.name REGEXP '^[[:alpha:]]' THEN
+		SET new.date_modified = NOW();
+	ELSE
+		SIGNAL SQLSTATE '45000'
+		SET MESSAGE_TEXT = 'Project names must start with a letter';
+	END IF;
+END;

+ 8 - 7
install/db_install/01_triggers/project_update.sql

@@ -1,10 +1,11 @@
 DROP TRIGGER IF EXISTS `project_update`;
 CREATE TRIGGER `project_update`
 BEFORE UPDATE ON `projects`
-	FOR EACH ROW
-		IF new.name REGEXP '^[[:alpha:]]' THEN
-			SET new.date_modified = NOW();
-		ELSE
-			SIGNAL SQLSTATE '45000'
-			SET MESSAGE_TEXT = 'Project names must start with a letter';
-		END IF;
+FOR EACH ROW BEGIN
+	IF new.name REGEXP '^[[:alpha:]]' THEN
+		SET new.date_modified = NOW();
+	ELSE
+		SIGNAL SQLSTATE '45000'
+		SET MESSAGE_TEXT = 'Project names must start with a letter';
+	END IF;
+END;

+ 10 - 9
install/db_install/01_triggers/session_insert.sql

@@ -1,12 +1,13 @@
 DROP TRIGGER IF EXISTS `session_insert`;
 CREATE TRIGGER `session_insert`
 BEFORE INSERT ON `sessions`
-	FOR EACH ROW
-		IF new.u_id NOT IN (
-			SELECT id
-			FROM users
-			WHERE active = 1
-		) THEN
-			SIGNAL SQLSTATE '45000'
-			SET MESSAGE_TEXT = 'Cannot create a session for this user';
-		END IF;
+FOR EACH ROW BEGIN
+	IF new.u_id NOT IN (
+		SELECT id
+		FROM users
+		WHERE active = 1
+	) THEN
+		SIGNAL SQLSTATE '45000'
+		SET MESSAGE_TEXT = 'Cannot create a session for this user';
+	END IF;
+END;

+ 10 - 9
install/db_install/01_triggers/session_update.sql

@@ -1,12 +1,13 @@
 DROP TRIGGER IF EXISTS `session_update`;
 CREATE TRIGGER `session_update`
 BEFORE UPDATE ON `sessions`
-	FOR EACH ROW
-		IF new.u_id NOT IN (
-			SELECT id
-			FROM users
-			WHERE active = 1
-		) THEN
-			SIGNAL SQLSTATE '45000'
-			SET MESSAGE_TEXT = 'Cannot create a session for this user';
-		END IF;
+FOR EACH ROW BEGIN
+	IF new.u_id NOT IN (
+		SELECT id
+		FROM users
+		WHERE active = 1
+	) THEN
+		SIGNAL SQLSTATE '45000'
+		SET MESSAGE_TEXT = 'Cannot create a session for this user';
+	END IF;
+END;

+ 4 - 3
install/db_install/01_triggers/user_delete.sql

@@ -1,6 +1,7 @@
 DROP TRIGGER IF EXISTS `user_delete`;
 CREATE TRIGGER `user_delete`
 BEFORE DELETE ON `users`
-	FOR EACH ROW
-		DELETE FROM sessions
-		WHERE u_id = old.id;
+FOR EACH ROW BEGIN
+	DELETE FROM sessions
+	WHERE u_id = old.id;
+END;

+ 3 - 2
install/db_install/01_triggers/user_insert.sql

@@ -1,5 +1,6 @@
 DROP TRIGGER IF EXISTS `user_insert`;
 CREATE TRIGGER `user_insert`
 BEFORE INSERT ON `users`
-	FOR EACH ROW
-		SET new.date_modified = NOW();
+FOR EACH ROW BEGIN
+	SET new.date_modified = NOW();
+END;

+ 6 - 2
install/db_install/01_triggers/user_update.sql

@@ -1,5 +1,9 @@
 DROP TRIGGER IF EXISTS `user_update`;
 CREATE TRIGGER `user_update`
 BEFORE UPDATE ON `users`
-	FOR EACH ROW
-		SET new.date_modified = NOW();
+FOR EACH ROW BEGIN
+	SET new.date_modified = NOW();
+	UPDATE sessions
+	SET u_id = new.id
+	WHERE u_id = old.id;
+END;

+ 7 - 0
install/db_install/02_constraints/r_issue_user_needinfo.sql

@@ -0,0 +1,7 @@
+--
+-- Constraints for table `r_issue_user_needinfo`
+--
+ALTER TABLE `r_issue_user_needinfo`
+  ADD CONSTRAINT `r_issue_user_needinfo_ibfk_1` FOREIGN KEY (`i_id`) REFERENCES `issues` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  ADD CONSTRAINT `r_issue_user_needinfo_ibfk_2` FOREIGN KEY (`u_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  ADD CONSTRAINT `r_issue_user_needinfo_ibfk_3` FOREIGN KEY (`i_id`,`u_id`) REFERENCES `r_issue_user` (`i_id`,`u_id`);

+ 10 - 0
install/db_install/04_procedures/maintain_sessions.sql

@@ -0,0 +1,10 @@
+CREATE PROCEDURE `maintain_sessions` () BEGIN
+	DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
+		ROLLBACK;
+		GET DIAGNOSTICS CONDITION 1 @error = MESSAGE_TEXT;
+		SET @error = CONCAT('Failed to maintain the sessions table. ',@error);
+		RESIGNAL SET MESSAGE_TEXT = @error;
+	END;
+	DELETE FROM sessions
+	WHERE date < TIMESTAMP(DATE_SUB(NOW(), INTERVAL 10 day));
+END;

+ 6 - 0
install/db_install/05_events/maintenance.sql

@@ -0,0 +1,6 @@
+CREATE EVENT `maintenance`
+ON SCHEDULE EVERY 1 DAY
+ENABLE
+DO BEGIN
+	CALL maintain_sessions;
+END;

+ 1 - 0
install/db_uninstall/99_cleanup/events.sql

@@ -0,0 +1 @@
+DROP EVENT IF EXISTS `maintenance`;

+ 2 - 1
install/db_uninstall/99_cleanup/procedures.sql

@@ -1 +1,2 @@
-DROP PROCEDURE IF EXISTS `drop_table`;
+DROP PROCEDURE IF EXISTS `drop_table`;
+DROP PROCEDURE IF EXISTS `maintain_sessions`;

+ 6 - 4
lib/bugs.class.php

@@ -4,6 +4,9 @@
 	require_once('user.class.php');
 	require_once('project.class.php');
 	require_once('router.class.php');
+	foreach(glob("widgets/*.widget.php") as $filename){
+		require_once($filename);
+	}
 	class Bugs {
 		public static $sql;
 		public static $cache = array(
@@ -33,10 +36,6 @@
 		}
 		static function connect($server='localhost',$user='bugs',$pass='bugs',$db='bugs'){
 			static::$sql = new SQL($server,$user,$pass,$db);
-			static::$sql->query("
-				DELETE FROM sessions
-				WHERE date < TIMESTAMP(DATE_SUB(NOW(), INTERVAL 10 day))
-			")->execute();
 			if(session_status() == PHP_SESSION_NONE){
 				session_start();
 			}
@@ -276,5 +275,8 @@
 				",'ssi',$email['subject'],$email['body'],$email['u_id'])->execute();
 			}
 		}
+		Bugs::$sql->query("
+			CALL maintain_sessions;
+		")->execute();
 	});
 ?>

+ 0 - 0
paths/issue.php → paths/issue.path.php


+ 0 - 0
paths/login.php → paths/login.path.php


+ 0 - 0
paths/logout.php → paths/logout.path.php


+ 0 - 0
paths/main.php → paths/main.path.php


+ 0 - 0
paths/project.php → paths/project.path.php


+ 0 - 0
paths/register.php → paths/register.path.php


+ 0 - 0
paths/sessions.php → paths/sessions.path.php


+ 0 - 0
paths/timeline.php → paths/timeline.path.php


+ 0 - 0
paths/user.php → paths/user.path.php


+ 2 - 2
templates/main.php

@@ -22,9 +22,9 @@
 			<a href="<?=Router::url(Router::$base.'/~'.Bugs::$user->name)?>">Profile</a>
 			<a href="<?=Router::url(Router::$base.'/logout')?>">Logout</a>
 			<?php
-				echo Bugs::template('sub.projects')
+				echo Bugs::template('subs/projects')
 					->run(Bugs::$user);
-				echo Bugs::template('sub.issues')
+				echo Bugs::template('subs/issues')
 					->run(Bugs::$user);
 			}else{
 		?>

+ 1 - 1
templates/project.php

@@ -68,7 +68,7 @@
 		</form>
 		<?php
 			if($context){
-				echo Bugs::template('sub.issues')
+				echo Bugs::template('subs/issues')
 						->run($context);
 			}
 		?>

+ 3 - 0
templates/subs/dropdown.php

@@ -0,0 +1,3 @@
+<?php
+	global $context;
+?>

+ 0 - 0
templates/sub.issues.php → templates/subs/issues.php


+ 0 - 0
templates/sub.projects.php → templates/subs/projects.php


+ 2 - 1
templates/timeline.php

@@ -27,10 +27,11 @@
 		<script src="<?=Router::$base?>/js/juju/keyboard.js"></script>
 		<script src="<?=Router::$base?>/js/juju/mouse.js"></script>
 		<link rel="stylesheet" href="<?=Router::$base?>/css/main.css"></link>
+		<link rel="stylesheet" href="<?=Router::$base?>/css/timeline.css"></link>
 	</head>
 	<body>
 		<a href="<?=Router::url(Router::$base)?>">Home</a>
-		<div>
+		<div class="timeline">
 			<?php
 				foreach($activities as $activity){
 					$activity = new Arguments(array(

+ 2 - 2
templates/user.php

@@ -46,9 +46,9 @@
 			?>
 		</form>
 		<?php
-			echo Bugs::template('sub.projects')
+			echo Bugs::template('subs/projects')
 				->run($context);
-			echo Bugs::template('sub.issues')
+			echo Bugs::template('subs/issues')
 				->run($context);
 		?>
 	</body>