/** * @depends test_createUser */ public function test_createComp($User) { $Comp = new Competition(); $Comp->title = "Test competition"; $Comp->theme = "Test comp theme"; $Comp->setAuthor($User); $Comp->SubmissionsDateOpen = (new DateTime())->add(new DateInterval("P1D")); $Comp->SubmissionsDateClose = (new DateTime())->add(new DateInterval("P3D")); $Comp->VotingDateOpen = (new DateTime())->add(new DateInterval("P5D")); $Comp->VotingDateClose = (new DateTime())->add(new DateInterval("P10D")); $Comp->commit(); $Comp = new Competition($Comp->id); $this->assertEquals(Competitions::STATUS_CLOSED, $Comp->status); $this->assertFalse(!filter_var($Comp->id, FILTER_VALIDATE_INT)); $this->assertFalse($Comp->canUserVote($User)); $this->assertFalse($Comp->canUserSubmitPhoto($User)); $Comp->SubmissionsDateOpen = (new DateTime())->sub(new DateInterval("P1D")); $Comp->SubmissionsDateClose = (new DateTime())->add(new DateInterval("P3D")); $Comp->VotingDateOpen = (new DateTime())->add(new DateInterval("P5D")); $Comp->VotingDateClose = (new DateTime())->add(new DateInterval("P10D")); $this->assertTrue(CompetitionUtility::isSubmissionWindowOpen($Comp)); $this->assertFalse(CompetitionUtility::isVotingWindowOpen($Comp)); $Comp->status = Competitions::STATUS_OPEN; $Comp->commit(); $DummyUser = new User(); $this->assertFalse($Comp->canUserVote($DummyUser)); $this->assertFalse($Comp->canUserSubmitPhoto($DummyUser)); return $Comp; }
/** * Notify the winner * @since Version 3.9.1 * @return \Railpage\Gallery\Competition * @param \Railpage\Images\Competition * @todo Check recipient preferences for email notifications */ public static function notifyWinner(Competition $compObject) { if (isset($compObject->meta['winnernotified']) && $compObject->meta['winnernotified'] === true) { return $this; } if ($Photo = $compObject->getWinningPhoto()) { /** * Create a news article */ CompetitionUtility::createNewsArticle_Winner($compObject); /** * Create a site message */ CompetitionUtility::createSiteNotificationForWinner($compObject); /** * Create an email */ $Notification = new Notification(); $Notification->AddRecipient($Photo->Author->id, $Photo->Author->username, $Photo->Author->contact_email); $Notification->subject = sprintf("Photo competition: %s", $compObject->title); /** * Set our email body */ $body = sprintf("Hi %s,\n\nCongratulations! You won the <a href='%s'>%s</a> photo competition!\n\nAs the winner of this competition, you get to <a href='%s'>select a theme</a> for the next competition. You have seven days to do so, before we automatically select one.\n\nThanks\nThe Railpage team.", $Photo->Author->username, $compObject->url->canonical, $compObject->title, "https://www.railpage.com.au" . $compObject->url->suggestsubject); if (function_exists("wpautop") && function_exists("format_post")) { $body = wpautop(format_post($body)); } /** * Assemble some template vars for our email */ foreach ($Photo->Image->sizes as $size) { $hero = $size['source']; if ($size['width'] >= 600) { break; } } $Smarty = AppCore::getSmarty(); $Smarty->Assign("email", array("subject" => $Notification->subject, "hero" => array("image" => $hero, "title" => sprintf("Winning photo: Yours! <em>%s</em>", $Photo->Image->title), "link" => $compObject->url->url, "author" => $Photo->Author->username), "body" => $body)); $Notification->body = $Smarty->Fetch($Smarty->ResolveTemplate("template.generic")); $Notification->commit(); /** * Update the winnernotified flag */ $compObject->meta['winnernotified'] = true; $compObject->commit(); } return $compObject; }
/** * Get the list of competitions, optionally filter by status * @since Version 3.9.1 * @param int $status * @return array */ public function getCompetitions($status = NULL) { $query = "SELECT id FROM image_competition"; $where = array(); if (!is_null($status)) { if ($status == self::STATUS_OPEN) { $query .= " WHERE status = ?"; $where[] = $status; } elseif ($status == self::STATUS_CLOSED) { $query .= " WHERE status = ? AND voting_date_close < ? ORDER BY voting_date_close DESC"; $where[] = $status; $where[] = (new DateTime())->format("Y-m-d H:i:s"); } elseif ($status == self::STATUS_FUTURE) { $query .= " WHERE submissions_date_open > ? ORDER BY submissions_date_open ASC"; $where[] = (new DateTime())->format("Y-m-d H:i:s"); } } $comps = array(); foreach ($this->db->fetchAll($query, $where) as $row) { $Competition = new Competition($row['id']); $comps[] = $Competition->getArray(); } return $comps; }
/** * Get photos tied for first place * @since Version 3.10.0 * @param \Railpage\Images\Competition $photoComp * @return array */ public static function getTiedPhotos(Competition $photoComp) { $photos = $photoComp->getPhotosAsArrayByVotes(); $votes = false; $tied = []; foreach ($photos as $photo) { if ($votes === false) { $votes = count($photo['votes']); $tied[] = $photo; continue; } if (count($photo['votes']) === $votes) { $tied[] = $photo; } if (count($photo['votes']) < $votes) { continue; } } if (count($tied) < 2) { return []; } return $tied; }