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}