From fa9a4f7eb160fc435dc34c493e6822d2fbb7e484 Mon Sep 17 00:00:00 2001 From: Jesse Morgan Date: Thu, 6 Oct 2011 14:55:18 -0700 Subject: Completed schedule iterator and almost completed exception iterator. Still need to add the 'Add Exception' page and make use of the schedule in the moderator email code. --- design/database.sql | 4 +- htdocs/moderate/schedule/index.php | 48 +++++++++++++----- htdocs/src/ModerationSchedule.inc.php | 94 ++++++++++++++++++++++++----------- 3 files changed, 105 insertions(+), 41 deletions(-) diff --git a/design/database.sql b/design/database.sql index b908bc0..60b7006 100644 --- a/design/database.sql +++ b/design/database.sql @@ -105,8 +105,10 @@ CREATE TABLE moderator_exceptions ( year INTEGER UNSIGNED NOT NULL, week TINYINT UNSIGNED NOT NULL, user_id INTEGER UNSIGNED NOT NULL, + substitute INTEGER UNSIGNED NOT NULL, - PRIMARY KEY(year, week) + + PRIMARY KEY(year, week, user_id) ); diff --git a/htdocs/moderate/schedule/index.php b/htdocs/moderate/schedule/index.php index 93dfc3a..9015350 100644 --- a/htdocs/moderate/schedule/index.php +++ b/htdocs/moderate/schedule/index.php @@ -16,37 +16,61 @@ require_once('../src/header.inc.php'); echo "

Moderation Schedule

"; // List out moderators in order with next moderation week +$ui = new ModerationSchedule(); +$ui->query(); + +echo "
" + . "Name" + . " Email" + . " Next Week" + . "
"; +for ($i = 0; $i < $ui->getNumberOfModerators(); $i++, $ui->next()) { + $user = $ui->current(); + + printf("
" + . "%s %s" + . " %s" + . " %s
", + $user->getName(), + $ui->isException() ? '*' : '', + $user->getEmail(), $user->getEmail(), + date('F j', $ui->key()) + ); +} echo "

Exceptions

"; echo "

New Exception

"; // List out exceptions in order. - -$ui = new UserIterator(); -$ui->query(); +$exceptions = new ModerationExceptions(); +$exceptions->query(); echo "
" . "Name" . " Email" - . " Admin" - . " Actions
"; + . " Exception Week" + . " "; + +while ($exceptions->valid()) { + $user = $exceptions->current(); -foreach ($ui as $user) { printf("
" . "%s" . " %s" - . " %s" - . " " - . " edit" - . " delete
", + . " %s", $user->getName(), $user->getEmail(), $user->getEmail(), - $user->isAdmin() ? 'Yes' : 'No', - $user->getId(), $user->getId() + date('F j', $exceptions->key()) ); + + + + $exceptions->next(); } + + require_once('../src/footer.inc.php'); ?> diff --git a/htdocs/src/ModerationSchedule.inc.php b/htdocs/src/ModerationSchedule.inc.php index 4f5c6db..4c094e4 100644 --- a/htdocs/src/ModerationSchedule.inc.php +++ b/htdocs/src/ModerationSchedule.inc.php @@ -18,6 +18,9 @@ class ModerationSchedule implements Iterator { private $week; private $expos; + private $moderator; + private $exceptionfor; + public function __construct() { $this->moderators = array(); $this->exceptions = array(); @@ -31,22 +34,59 @@ class ModerationSchedule implements Iterator { // Iterator methods public function rewind() { - $this->year = date('o'); + $this->year = date('o') + 0; $this->week = date('W') + 0; $this->expos = 0; + $this->nextModerator(); } public function current() { + return $this->moderator; + } + + public function key() { + return strtotime($this->year . 'W' . + ($this->week < 10 ? '0' : '') . $this->week); + } + + public function next() { + if ($this->week == 53) { + // Check for leap year + if (date('N', mktime(0, 0, 0, 1, 1, $this->year)) == 4 + or date('N', mktime(0, 0, 0, 12, 31, $this->year)) == 4) { + + $this->week++; + + } else { + $this->week = 1; + $this->year++; + } + + } else if ($this->week > 53) { + $this->week = 1; + $this->year++; + + } else { + $this->week++; + } + + $this->nextModerator(); + } + + private function nextModerator() { + // Clear out the exception flag. + $this->exceptionfor = null; + // Get the scheduled mod. $modpos = $this->week % $this->getNumberOfModerators(); - $moderator = $this->moderators[$modpos]['user_id']; + $this->moderator = User::getById($this->moderators[$modpos]['user_id']); // Check for exceptions if (count($this->exceptions) > 0) { // Skip exceptions prior to the current() date. while ( // We have exceptions to search - $this->expos < count($this->exceptions) and + $this->expos < (count($this->exceptions) - 1) and // and the year is less than the current() year ($this->exceptions[$this->expos]['year'] < $this->year or // or if it is the current() year, but less than the week. @@ -57,30 +97,19 @@ class ModerationSchedule implements Iterator { $this->expos++; } - // Check if the top exception is for today. - if ($this->exceptions[$this->expos]['year'] == $this->year - and $this->exceptions[$this->expos]['week'] == $this->week - ) { - // Yes, return the replacement - $moderator = $this->exceptions[$this->expos]['user_id']; - } - } - - return User::getById($moderator); - } + // Check if any of the top exception apply today. + while($this->exceptions[$this->expos]['year'] == $this->year + and $this->exceptions[$this->expos]['week'] == $this->week) { - public function key() { - return strtotime($this->year . 'W' . - ($this->week < 10 ? '0' : '') . $this->week); - } + if ($this->exceptions[$i]['user_id'] == $this->moderator->getId()) { + // Yes, return the replacement + $this->exceptionfor = $this->moderator; + $this->moderator = User::getById($this->exceptions[$this->expos]['user_id']); + break; + } - public function next() { - if ($this->week == 53) { - $this->week = 1; - $this->year++; - - } else { - $this->week++; + $this->expos++; + } } } @@ -89,12 +118,19 @@ class ModerationSchedule implements Iterator { return true; } - private function query() { + public function isException() { + return $this->exceptionfor !== null; + } + + public function getExceptionFor() { + return $this->exceptionfor; + } + + public function query() { $db = getDatabase(); - $this->rewind(); // Get the moderators - $query = "SELECT * FROM moderation_schedule ORDER BY position"; + $query = "SELECT * FROM moderator_schedule ORDER BY position"; $this->moderators = $db->fetchAssocRows($query); // Get the exceptions @@ -105,6 +141,8 @@ class ModerationSchedule implements Iterator { . " WHERE year >= $year AND week >= $week" . " ORDER BY year, week"; $this->exceptions = $db->fetchAssocRows($query); + + $this->rewind(); } } -- cgit v1.2.3