From a119ca81d5e5c28335ed6431e04fc4190b434055 Mon Sep 17 00:00:00 2001 From: Ben Roberts Date: Wed, 21 Dec 2011 01:13:06 +0000 Subject: [PATCH] Add admin backend to edit incident and change status Also fixes Status Board display on homepage to show correct status on each day. It was previously reusing the currnent status for all previous days on which the incidents were open. --- source/lib/StatusBoard/Incident.class.php | 32 +++++++++++++- .../lib/StatusBoard/IncidentStatus.class.php | 14 +++++- source/webui/pages/admin/incident.php | 44 +++++++++++++++++++ source/webui/templates/admin/incident.tpl | 6 +-- source/webui/templates/home.tpl | 8 ++-- 5 files changed, 94 insertions(+), 10 deletions(-) diff --git a/source/lib/StatusBoard/Incident.class.php b/source/lib/StatusBoard/Incident.class.php index dafcb40..c3a3fbf 100644 --- a/source/lib/StatusBoard/Incident.class.php +++ b/source/lib/StatusBoard/Incident.class.php @@ -42,12 +42,23 @@ class StatusBoard_Incident extends StatusBoard_DatabaseObject { return $this->current_status; } + public function statusAtTime($time) { + $database = StatusBoard_Main::instance()->database(); + $row = $database->selectOne('SELECT `status` FROM `incidentstatus` WHERE `incident`=:incident AND ctime < :time ORDER BY ctime DESC LIMIT 1', array( + array('name' => 'incident', 'value' => $this->id, 'type' => PDO::PARAM_INT), + array('name' => 'time', 'value' => $time, 'type' => PDO::PARAM_INT), + ) + ); + + return $row['status']; + } + /** * Returns the status of the most severe incident in the given set * * @param array(StatusBoard_Incident) $incidents */ - public static function highestSeverityStatus(array $incidents) { + public static function highestSeverityStatus(array $incidents, $time = null) { if ( ! $incidents) { return StatusBoard_Status::STATUS_Resolved; } @@ -55,7 +66,13 @@ class StatusBoard_Incident extends StatusBoard_DatabaseObject { // Check for the highest severity incident. $status = StatusBoard_Status::STATUS_Maintenance; foreach ($incidents as $incident) { - $incident_status = $incident->currentStatus(); + $incident_status = null; + if ($time) { + $incident_status = $incident->statusAtTime($time); + } else { + $incident_status = $incident->currentStatus(); + } + if (StatusBoard_Status::isMoreSevere($status, $incident_status)) { $status = $incident_status; } @@ -72,6 +89,17 @@ class StatusBoard_Incident extends StatusBoard_DatabaseObject { return $this->statuses; } + public function changeStatus($status, $description) { + if ($this->statuses === null) { + $this->statuses = StatusBoard_IncidentStatus::all_for('incident', $this->id); + } + + $new_status = StatusBoard_IncidentStatus::newForIncident($this, $status, $description); + $this->statuses[] = $new_status; + + return $new_status; + } + } ?> \ No newline at end of file diff --git a/source/lib/StatusBoard/IncidentStatus.class.php b/source/lib/StatusBoard/IncidentStatus.class.php index f5fe80f..c9acc60 100644 --- a/source/lib/StatusBoard/IncidentStatus.class.php +++ b/source/lib/StatusBoard/IncidentStatus.class.php @@ -10,9 +10,21 @@ class StatusBoard_IncidentStatus extends StatusBoard_DatabaseObject { protected $_db_description; protected $_db_ctime; - protected function all_for_incident(StatusBoard_Incident $incident) { + public function all_for_incident(StatusBoard_Incident $incident) { return static::all_for('incident', $incident->id); } + + public function newForIncident(StatusBoard_Incident $incident, $status, $description) { + $new_status = new self(); + $new_status->incident = $incident->id; + $new_status->status = $status; + $new_status->description = $description; + $new_status->ctime = time(); + + $new_status->create(); + + return $new_status; + } } ?> \ No newline at end of file diff --git a/source/webui/pages/admin/incident.php b/source/webui/pages/admin/incident.php index 4b6f090..ea962ff 100644 --- a/source/webui/pages/admin/incident.php +++ b/source/webui/pages/admin/incident.php @@ -24,11 +24,55 @@ try { throw new StatusBoard_Exception_FileNotFound(); } +if ($request->exists('do')) { + $activity = $request->get('do'); + switch ($activity) { + + case 'edit': { + $reference = StatusBoard_Main::issetelse($_POST['reference'], 'Sihnon_Exception_InvalidParameters'); + $description = StatusBoard_Main::issetelse($_POST['description'], 'Sihnon_Exception_InvalidParameters'); + + if ($reference) { + $incident->reference = $reference; + } + if ($description) { + $incident->description = $description; + } + if ($reference || $description) { + $incident->save(); + $messages[] = array( + 'severity' => 'success', + 'content' => 'The incident was updated succesfully.', + ); + } else { + $messages[] = 'No changes were necessary.'; + } + + } break; + + case 'change-status': { + $status = StatusBoard_Main::issetelse($_POST['status'], 'Sihnon_Exception_InvalidParameters'); + $description = StatusBoard_Main::issetelse($_POST['description'], 'Sihnon_Exception_InvalidParameters'); + + $incident->changeStatus($status, $description); + $messages[] = array( + 'severity' => 'success', + 'content' => 'The incident status was changed successfully.', + ); + } break; + + default: { + + } + } +} + $statuses = $incident->statusChanges(); $this->smarty->assign('service', $service); $this->smarty->assign('site', $site); $this->smarty->assign('incident', $incident); $this->smarty->assign('statuses', $statuses); +$this->smarty->assign('messages', $messages); ?> \ No newline at end of file diff --git a/source/webui/templates/admin/incident.tpl b/source/webui/templates/admin/incident.tpl index 0bf98f8..cb8c7aa 100644 --- a/source/webui/templates/admin/incident.tpl +++ b/source/webui/templates/admin/incident.tpl @@ -10,7 +10,7 @@
-
+
Edit Incident @@ -40,7 +40,7 @@
- +
Change Status @@ -64,7 +64,7 @@
-   +  
diff --git a/source/webui/templates/home.tpl b/source/webui/templates/home.tpl index 18a4e55..4d3c960 100644 --- a/source/webui/templates/home.tpl +++ b/source/webui/templates/home.tpl @@ -24,15 +24,15 @@ {$status=$site->status()} - {include nocache file="fragments/site-status.tpl" start=null end=null} + {include file="fragments/site-status.tpl" nocache start=null end=null} {foreach from=array(1,2,3,4,5,6) item=day} {$start=mktime(0,0,0,date("n"),date("j")-$day-1)} {$end=mktime(0,0,0,date("n"),date("j")-$day)} - {$incidents=$site->openIncidentsDuring($start, $end)} - {$status=StatusBoard_Incident::highestSeverityStatus($incidents)} + {$incidentsDuring=$site->openIncidentsDuring($start, $end)} + {$statusDuring=StatusBoard_Incident::highestSeverityStatus($incidentsDuring, $end)} - {include nocache file="fragments/site-status.tpl" start=$start end=$end status=$status incidents=$incidents} + {include file="fragments/site-status.tpl" nocache start=$start end=$end status=$statusDuring incidents=$incidentsDuring} {/foreach}