/** * Tests Incident_Model::get_neigbouring_incidents * @test * @dataProvider providerTestGetNeighbouringIncidents */ public function testGetNeighbouringIncidents($incident_id, $num_neighbours) { // Get the neighbouring incidents $neighbours = Incident_Model::get_neighbouring_incidents($incident_id, FALSE, 0, $num_neighbours); if (empty($neighbours)) { $this->markTestSkipped('The incident table is empty.'); } else { // Check if the no. of returned incidents matches the no. of neighbours specified in @param $neighbours $this->assertEquals($num_neighbours, $neighbours->count()); } }
/** * Displays a report. * @param boolean $id If id is supplied, a report with that id will be * retrieved. */ public function view($id = FALSE) { $this->template->header->this_page = 'reports'; $this->template->content = new View('reports_view'); // Load Akismet API Key (Spam Blocker) $api_akismet = Kohana::config('settings.api_akismet'); if (!Incident_Model::is_valid_incident($id, TRUE)) { url::redirect('main'); } else { $incident = ORM::factory('incident')->where('id', $id)->where('incident_active', 1)->find(); if ($incident->id == 0) { url::redirect('reports/view/'); } // Comment Post? // Setup and initialize form field names $form = array('comment_author' => '', 'comment_description' => '', 'comment_email' => '', 'comment_ip' => '', 'captcha' => ''); $captcha = Captcha::factory(); $errors = $form; $form_error = FALSE; // Check, has the form been submitted, if so, setup validation if ($_POST and Kohana::config('settings.allow_comments')) { // Instantiate Validation, use $post, so we don't overwrite $_POST fields with our own things $post = Validation::factory($_POST); // Add some filters $post->pre_filter('trim', TRUE); // Add some rules, the input field, followed by a list of checks, carried out in order if (!$this->user) { $post->add_rules('comment_author', 'required', 'length[3,100]'); $post->add_rules('comment_email', 'required', 'email', 'length[4,100]'); } $post->add_rules('comment_description', 'required'); $post->add_rules('captcha', 'required', 'Captcha::valid'); // Test to see if things passed the rule checks if ($post->validate()) { // Yes! everything is valid if ($api_akismet != "") { // Run Akismet Spam Checker $akismet = new Akismet(); // Comment data $comment = array('website' => "", 'body' => $post->comment_description, 'user_ip' => $_SERVER['REMOTE_ADDR']); if ($this->user) { $comment['author'] = $this->user->name; $comment['email'] = $this->user->email; } else { $comment['author'] = $post->comment_author; $comment['email'] = $post->comment_email; } $config = array('blog_url' => url::site(), 'api_key' => $api_akismet, 'comment' => $comment); $akismet->init($config); if ($akismet->errors_exist()) { if ($akismet->is_error('AKISMET_INVALID_KEY')) { // throw new Kohana_Exception('akismet.api_key'); } elseif ($akismet->is_error('AKISMET_RESPONSE_FAILED')) { // throw new Kohana_Exception('akismet.server_failed'); } elseif ($akismet->is_error('AKISMET_SERVER_NOT_FOUND')) { // throw new Kohana_Exception('akismet.server_not_found'); } // If the server is down, we have to post // the comment :( // $this->_post_comment($comment); $comment_spam = 0; } else { $comment_spam = $akismet->is_spam() ? 1 : 0; } } else { // No API Key!! $comment_spam = 0; } $comment = new Comment_Model(); $comment->incident_id = $id; if ($this->user) { $comment->user_id = $this->user->id; $comment->comment_author = $this->user->name; $comment->comment_email = $this->user->email; } else { $comment->comment_author = strip_tags($post->comment_author); $comment->comment_email = strip_tags($post->comment_email); } $comment->comment_description = strip_tags($post->comment_description); $comment->comment_ip = $_SERVER['REMOTE_ADDR']; $comment->comment_date = date("Y-m-d H:i:s", time()); // Activate comment for now if ($comment_spam == 1) { $comment->comment_spam = 1; $comment->comment_active = 0; } else { $comment->comment_spam = 0; $comment->comment_active = Kohana::config('settings.allow_comments') == 1 ? 1 : 0; } $comment->save(); // Event::comment_add - Added a New Comment Event::run('ushahidi_action.comment_add', $comment); // Notify Admin Of New Comment $send = notifications::notify_admins("[" . Kohana::config('settings.site_name') . "] " . Kohana::lang('notifications.admin_new_comment.subject'), Kohana::lang('notifications.admin_new_comment.message') . "\n\n'" . strtoupper($incident->incident_title) . "'" . "\n" . url::base() . 'reports/view/' . $id); // Redirect url::redirect('reports/view/' . $id); } else { // No! We have validation errors, we need to show the form again, with the errors // Repopulate the form fields $form = arr::overwrite($form, $post->as_array()); // Populate the error fields, if any $errors = arr::overwrite($errors, $post->errors('comments')); $form_error = TRUE; } } // Filters $incident_title = $incident->incident_title; $incident_description = nl2br($incident->incident_description); Event::run('ushahidi_filter.report_title', $incident_title); Event::run('ushahidi_filter.report_description', $incident_description); // Add Features $this->template->content->features_count = $incident->geometry->count(); $this->template->content->features = $incident->geometry; $this->template->content->incident_id = $incident->id; $this->template->content->incident_title = $incident_title; $this->template->content->incident_description = $incident_description; $this->template->content->incident_location = $incident->location->location_name; $this->template->content->incident_latitude = $incident->location->latitude; $this->template->content->incident_longitude = $incident->location->longitude; $this->template->content->incident_date = date('M j Y', strtotime($incident->incident_date)); $this->template->content->incident_time = date('H:i', strtotime($incident->incident_date)); $this->template->content->incident_category = $incident->incident_category; // Incident rating $this->template->content->incident_rating = $incident->incident_rating == '' ? 0 : $incident->incident_rating; // Retrieve Media $incident_news = array(); $incident_video = array(); $incident_photo = array(); foreach ($incident->media as $media) { if ($media->media_type == 4) { $incident_news[] = $media->media_link; } elseif ($media->media_type == 2) { $incident_video[] = $media->media_link; } elseif ($media->media_type == 1) { $incident_photo[] = $media->media_link; } } $this->template->content->incident_verified = $incident->incident_verified; // Retrieve Comments (Additional Information) $this->template->content->comments = ""; if (Kohana::config('settings.allow_comments')) { $this->template->content->comments = new View('reports_comments'); $incident_comments = array(); if ($id) { $incident_comments = Incident_Model::get_comments($id); } $this->template->content->comments->incident_comments = $incident_comments; } } // Add Neighbors $this->template->content->incident_neighbors = Incident_Model::get_neighbouring_incidents($id, TRUE, 0, 5); // News Source links $this->template->content->incident_news = $incident_news; // Video links $this->template->content->incident_videos = $incident_video; // Images $this->template->content->incident_photos = $incident_photo; // Create object of the video embed class $video_embed = new VideoEmbed(); $this->template->content->videos_embed = $video_embed; // Javascript Header $this->themes->map_enabled = TRUE; $this->themes->photoslider_enabled = TRUE; $this->themes->videoslider_enabled = TRUE; $this->themes->js = new View('reports_view_js'); $this->themes->js->incident_id = $incident->id; $this->themes->js->default_map = Kohana::config('settings.default_map'); $this->themes->js->default_zoom = Kohana::config('settings.default_zoom'); $this->themes->js->latitude = $incident->location->latitude; $this->themes->js->longitude = $incident->location->longitude; $this->themes->js->incident_zoom = $incident->incident_zoom; $this->themes->js->incident_photos = $incident_photo; // Initialize custom field array $this->template->content->custom_forms = new View('reports_view_custom_forms'); $form_field_names = customforms::get_custom_form_fields($id, $incident->form_id, FALSE, "view"); $this->template->content->custom_forms->form_field_names = $form_field_names; // Are we allowed to submit comments? $this->template->content->comments_form = ""; if (Kohana::config('settings.allow_comments')) { $this->template->content->comments_form = new View('reports_comments_form'); $this->template->content->comments_form->user = $this->user; $this->template->content->comments_form->form = $form; $this->template->content->comments_form->form_field_names = $form_field_names; $this->template->content->comments_form->captcha = $captcha; $this->template->content->comments_form->errors = $errors; $this->template->content->comments_form->form_error = $form_error; } // If the Admin is Logged in - Allow for an edit link $this->template->content->logged_in = $this->logged_in; // Rebuild Header Block $this->template->header->header_block = $this->themes->header_block(); }
/** * Retrieve Single Marker (and its neighbours) * * @param int $incident_id */ public function single($incident_id = 0) { $json_features = array(); $incident_id = intval($incident_id); // Check if incident valid/approved if (!Incident_Model::is_valid_incident($incident_id, TRUE)) { throw new Kohana_404_Exception(); } // Load the incident // @todo avoid the double load here $marker = ORM::factory('incident')->where('incident.incident_active', 1)->with('location')->find($incident_id); if (!$marker->loaded) { throw new Kohana_404_Exception(); } // Get geojson features for main incident (including geometry) $json_features = $this->markers_geojson(array($marker), 0, null, null, TRUE); // Get the neigbouring incidents & their json (without geometries) $neighbours = Incident_Model::get_neighbouring_incidents($incident_id, FALSE, 20, 100); if ($neighbours) { $json_features = array_merge($json_features, $this->markers_geojson($neighbours, 0, null, null, FALSE)); } Event::run('ushahidi_filter.json_single_features', $json_features); $this->render_geojson($json_features); }
/** * Retrieve Single Marker */ public function single($incident_id = 0) { $json = ""; $json_item = ""; $json_array = array(); // Get the neigbouring incidents $neighbours = Incident_Model::get_neighbouring_incidents($incident_id, FALSE, 20, 100); if ($neighbours) { // Load the incident // @todo Get this fixed $marker = ORM::factory('incident', $incident_id); // Get the incident/report date $incident_date = date('Y-m', strtotime($marker->incident_date)); foreach ($neighbours as $row) { $json_item = "{"; $json_item .= "\"type\":\"Feature\","; $json_item .= "\"properties\": {"; $json_item .= "\"id\": \"" . $row->id . "\", "; $encoded_title = utf8tohtml::convert($row->incident_title, TRUE); $encoded_title = str_ireplace('"', '"', $encoded_title); $encoded_title = json_encode($encoded_title); $encoded_title = str_ireplace('"', '', $encoded_title); $json_item .= "\"name\":\"" . str_replace(chr(10), ' ', str_replace(chr(13), ' ', "<a href='" . url::base() . "reports/view/" . $row->id . "'>" . $encoded_title . "</a>")) . "\","; $json_item .= "\"link\": \"" . url::base() . "reports/view/" . $row->id . "\", "; $json_item .= "\"category\":[0], "; $json_item .= "\"timestamp\": \"" . strtotime($row->incident_date) . "\""; $json_item .= "},"; $json_item .= "\"geometry\": {"; $json_item .= "\"type\":\"Point\", "; $json_item .= "\"coordinates\":[" . $row->longitude . ", " . $row->latitude . "]"; $json_item .= "}"; $json_item .= "}"; array_push($json_array, $json_item); } // Single Main Incident $json_single = "{"; $json_single .= "\"type\":\"Feature\","; $json_single .= "\"properties\": {"; $json_single .= "\"id\": \"" . $marker->id . "\", "; $encoded_title = utf8tohtml::convert($marker->incident_title, TRUE); $json_single .= "\"name\":\"" . str_replace(chr(10), ' ', str_replace(chr(13), ' ', "<a href='" . url::base() . "reports/view/" . $marker->id . "'>" . $encoded_title . "</a>")) . "\","; $json_single .= "\"link\": \"" . url::base() . "reports/view/" . $marker->id . "\", "; $json_single .= "\"category\":[0], "; $json_single .= "\"timestamp\": \"" . strtotime($marker->incident_date) . "\""; // Get Incident Geometries $geometry = $this->_get_geometry($marker->id, $marker->incident_title, $marker->incident_date); // If there are no geometries, use Single Incident Marker if (!count($geometry)) { $json_item = "{"; $json_item .= "\"type\":\"Feature\","; $json_item .= "\"properties\": {"; $json_item .= "\"id\": \"" . $marker->id . "\", "; $encoded_title = utf8tohtml::convert($marker->incident_title, TRUE); $json_item .= "\"name\":\"" . str_replace(chr(10), ' ', str_replace(chr(13), ' ', "<a href='" . url::base() . "reports/view/" . $marker->id . "'>" . $encoded_title . "</a>")) . "\","; $json_item .= "\"link\": \"" . url::base() . "reports/view/" . $marker->id . "\", "; $json_item .= "\"category\":[0], "; $json_item .= "\"timestamp\": \"" . strtotime($marker->incident_date) . "\""; $json_item .= "},\"geometry\":"; $json_item .= "{\"type\":\"Point\", "; $json_item .= "\"coordinates\":[" . $marker->location->longitude . ", " . $marker->location->latitude . "]"; $json_item .= "}"; $json_item .= "}"; } else { $json_item = implode(",", $geometry); } array_push($json_array, $json_item); } $json = implode(",", $json_array); header('Content-type: application/json; charset=utf-8'); $this->template->json = $json; }
/** * Retrieve Single Marker */ public function single($incident_id = 0) { $json = ""; $json_item = ""; $json_features = array(); $incident_id = intval($incident_id); // Check if incident valid/approved if (!Incident_Model::is_valid_incident($incident_id, TRUE)) { throw new Kohana_404_Exception(); } // Get the neigbouring incidents $neighbours = Incident_Model::get_neighbouring_incidents($incident_id, FALSE, 20, 100); if ($neighbours) { // Load the incident // @todo Get this fixed $marker = ORM::factory('incident')->where('incident.incident_active', 1)->find($incident_id); if (!$marker->loaded) { throw new Kohana_404_Exception(); } // Get the incident/report date $incident_date = date('Y-m', strtotime($marker->incident_date)); foreach ($neighbours as $row) { $link = url::base() . "reports/view/" . $row->id; $item_name = $this->get_title($row->incident_title, $link); $json_item = array(); $json_item['type'] = 'Feature'; $json_item['properties'] = array('id' => $row->id, 'name' => $item_name, 'link' => $link, 'category' => array(0), 'timestamp' => strtotime($row->incident_date)); $json_item['geometry'] = array('type' => 'Point', 'coordinates' => array($row->longitude, $row->latitude)); array_push($json_features, $json_item); } // Get Incident Geometries $geometry = $this->_get_geometry($marker->id, $marker->incident_title, $marker->incident_date); // If there are no geometries, use Single Incident Marker if (!count($geometry)) { // Single Main Incident $link = url::base() . "reports/view/" . $marker->id; $item_name = $this->get_title($marker->incident_title, $link); $json_item = array(); $json_item['type'] = 'Feature'; $json_item['properties'] = array('id' => $marker->id, 'name' => $item_name, 'link' => $link, 'category' => array(0), 'timestamp' => strtotime($marker->incident_date)); $json_item['geometry'] = array('type' => 'Point', 'coordinates' => array($marker->location->longitude, $marker->location->latitude)); array_push($json_features, $json_item); } else { foreach ($geometry as $g) { array_push($json_features, $g); } } } Event::run('ushahidi_filter.json_single_features', $json_features); $json = json_encode(array("type" => "FeatureCollection", "features" => $json_features)); header('Content-type: application/json; charset=utf-8'); echo $json; }