summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--design/database.sql4
-rw-r--r--htdocs/moderate/schedule/index.php48
-rw-r--r--htdocs/src/ModerationSchedule.inc.php94
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 "<h3>Moderation Schedule</h3>";
// List out moderators in order with next moderation week
+$ui = new ModerationSchedule();
+$ui->query();
+
+echo "<div class=\"userrow header\">"
+ . "<span class=\"name\">Name</span>"
+ . " <span class=\"email\">Email</span>"
+ . " <span class=\"admin\">Next Week</span>"
+ . " </div>";
+for ($i = 0; $i < $ui->getNumberOfModerators(); $i++, $ui->next()) {
+ $user = $ui->current();
+
+ printf("<div class=\"userrow\">"
+ . "<span class=\"name\">%s %s</span>"
+ . " <span class=\"email\"><a href=\"mailto:%s\">%s</a></span>"
+ . " <span class=\"admin\">%s</span></div>",
+ $user->getName(),
+ $ui->isException() ? '*' : '',
+ $user->getEmail(), $user->getEmail(),
+ date('F j', $ui->key())
+ );
+}
echo "<h3>Exceptions</h3>";
echo "<p><a href=\"exception.php\">New Exception</a></p>";
// List out exceptions in order.
-
-$ui = new UserIterator();
-$ui->query();
+$exceptions = new ModerationExceptions();
+$exceptions->query();
echo "<div class=\"userrow header\">"
. "<span class=\"name\">Name</span>"
. " <span class=\"email\">Email</span>"
- . " <span class=\"admin\">Admin</span>"
- . " <span class=\"actions\">Actions</span></div>";
+ . " <span class=\"admin\">Exception Week</span>"
+ . " </div>";
+
+while ($exceptions->valid()) {
+ $user = $exceptions->current();
-foreach ($ui as $user) {
printf("<div class=\"userrow\">"
. "<span class=\"name\">%s</span>"
. " <span class=\"email\"><a href=\"mailto:%s\">%s</a></span>"
- . " <span class=\"admin\">%s</span>"
- . " <span class=\"actions\">"
- . " <a class=\"smallbutton\" href=\"editor.php?id=%s\">edit</a>"
- . " <a class=\"smallbutton\" href=\"delete.php?id=%s\">delete</a></span></div>",
+ . " <span class=\"admin\">%s</span></div>",
$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();
}
}