예제 #1
0
 /**
  * @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;
 }
예제 #2
0
 /**
  * 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;
 }
예제 #3
0
 /**
  * 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;
 }
예제 #4
0
 /**
  * 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;
 }