diff --git a/src/applications/badges/query/PhabricatorBadgesAwardQuery.php b/src/applications/badges/query/PhabricatorBadgesAwardQuery.php --- a/src/applications/badges/query/PhabricatorBadgesAwardQuery.php +++ b/src/applications/badges/query/PhabricatorBadgesAwardQuery.php @@ -6,7 +6,7 @@ private $badgePHIDs; private $recipientPHIDs; private $awarderPHIDs; - + private $badgeStatuses = null; protected function willFilterPage(array $awards) { $badge_phids = array(); @@ -22,6 +22,11 @@ $badges = mpull($badges, null, 'getPHID'); foreach ($awards as $key => $award) { $award_badge = idx($badges, $award->getBadgePHID()); + if (!$award_badge) { + unset($awards[$key]); + $this->didRejectResult($award); + continue; + } $award->attachBadge($award_badge); } @@ -43,6 +48,15 @@ return $this; } + public function withBadgeStatuses(array $statuses) { + $this->badgeStatuses = $statuses; + return $this; + } + + private function shouldJoinBadge() { + return (bool)$this->badgeStatuses; + } + protected function loadPage() { return $this->loadStandardPage($this->newResultObject()); } @@ -51,33 +65,59 @@ return new PhabricatorBadgesAward(); } + protected function getPrimaryTableAlias() { + return 'badges_award'; + } + protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) { $where = parent::buildWhereClauseParts($conn); if ($this->badgePHIDs !== null) { $where[] = qsprintf( $conn, - 'badgePHID IN (%Ls)', + 'badges_award.badgePHID IN (%Ls)', $this->badgePHIDs); } if ($this->recipientPHIDs !== null) { $where[] = qsprintf( $conn, - 'recipientPHID IN (%Ls)', + 'badges_award.recipientPHID IN (%Ls)', $this->recipientPHIDs); } if ($this->awarderPHIDs !== null) { $where[] = qsprintf( $conn, - 'awarderPHID IN (%Ls)', + 'badges_award.awarderPHID IN (%Ls)', $this->awarderPHIDs); } + if ($this->badgeStatuses !== null) { + $where[] = qsprintf( + $conn, + 'badges_badge.status IN (%Ls)', + $this->badgeStatuses); + } + + return $where; } + protected function buildJoinClauseParts(AphrontDatabaseConnection $conn) { + $join = parent::buildJoinClauseParts($conn); + $badges = new PhabricatorBadgesBadge(); + + if ($this->shouldJoinBadge()) { + $join[] = qsprintf( + $conn, + 'JOIN %T badges_badge ON badges_award.badgePHID = badges_badge.phid', + $badges->getTableName()); + } + + return $join; + } + public function getQueryApplicationClass() { return 'PhabricatorBadgesApplication'; } diff --git a/src/applications/people/controller/PhabricatorPeopleProfileBadgesController.php b/src/applications/people/controller/PhabricatorPeopleProfileBadgesController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileBadgesController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileBadgesController.php @@ -84,15 +84,14 @@ $awards = id(new PhabricatorBadgesAwardQuery()) ->setViewer($viewer) ->withRecipientPHIDs(array($user->getPHID())) + ->withBadgeStatuses(array(PhabricatorBadgesBadge::STATUS_ACTIVE)) ->execute(); $awards = mpull($awards, null, 'getBadgePHID'); $badges = array(); foreach ($awards as $award) { $badge = $award->getBadge(); - if ($badge->getStatus() == PhabricatorBadgesBadge::STATUS_ACTIVE) { - $badges[$award->getBadgePHID()] = $badge; - } + $badges[$award->getBadgePHID()] = $badge; } if (count($badges)) { diff --git a/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php b/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php --- a/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php +++ b/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php @@ -528,12 +528,14 @@ $awards = id(new PhabricatorBadgesAwardQuery()) ->setViewer($this->getUser()) ->withRecipientPHIDs(array($user->getPHID())) + ->withBadgeStatuses(array(PhabricatorBadgesBadge::STATUS_ACTIVE)) ->setLimit(2) ->execute(); + $badges = mpull($awards, 'getBadge'); + $badge_view = null; - if ($awards) { - $badges = mpull($awards, 'getBadge'); + if ($badges) { $badge_list = array(); foreach ($badges as $badge) { $badge_view = id(new PHUIBadgeMiniView()) diff --git a/src/view/phui/PHUITimelineView.php b/src/view/phui/PHUITimelineView.php --- a/src/view/phui/PHUITimelineView.php +++ b/src/view/phui/PHUITimelineView.php @@ -220,7 +220,6 @@ } $user_phid_type = PhabricatorPeopleUserPHIDType::TYPECONST; - $badge_edge_type = PhabricatorRecipientHasBadgeEdgeType::EDGECONST; $user_phids = array(); foreach ($events as $key => $event) { @@ -248,6 +247,7 @@ $awards = id(new PhabricatorBadgesAwardQuery()) ->setViewer($this->getViewer()) ->withRecipientPHIDs($user_phids) + ->withBadgeStatuses(array(PhabricatorBadgesBadge::STATUS_ACTIVE)) ->execute(); $awards = mgroup($awards, 'getRecipientPHID'); @@ -259,9 +259,7 @@ $badges = array(); foreach ($author_awards as $award) { $badge = $award->getBadge(); - if ($badge->getStatus() == PhabricatorBadgesBadge::STATUS_ACTIVE) { - $badges[$award->getBadgePHID()] = $badge; - } + $badges[$award->getBadgePHID()] = $badge; } // TODO: Pick the "best" badges in some smart way. For now, just pick