diff --git a/r2/r2/controllers/listingcontroller.py b/r2/r2/controllers/listingcontroller.py index 656b904ce..d248e3bbb 100755 --- a/r2/r2/controllers/listingcontroller.py +++ b/r2/r2/controllers/listingcontroller.py @@ -283,19 +283,27 @@ class HotController(FixListing, ListingController): organic_fullnames.extend(g.live_config['sr_discovery_links']) n_promoted = 100 - n_build = 10 - promo_tuples = promote.sample_promoted_links(c.user, c.site, - n=n_promoted) - promo_tuples = sorted(promo_tuples, - key=lambda p: p.weight, - reverse=True) - promo_build = promo_tuples[:n_build] - promo_stub = promo_tuples[n_build:] - b = CampaignBuilder(promo_build, - wrap=self.builder_wrapper, - keep_fn=promote.is_promoted) - promoted_links = b.get_items()[0] - promoted_links.extend(promo_stub) + n_build = 1 if c.user_is_loggedin else 10 + picker = (promote.lottery_promoted_links if c.user_is_loggedin else + promote.sample_promoted_links) + promo_tuples = picker(c.user, c.site, n=n_promoted) + + if not c.user_is_loggedin: + promo_tuples.sort(key=lambda t: t.weight, reverse=True) + + b = CampaignBuilder( + promo_tuples, + wrap=self.builder_wrapper, + keep_fn=organic.keep_fresh_links, + num=n_build, + skip=True, + ) + promoted_links, first, last, before, after = b.get_items() + if promoted_links and last: + lookup = {t.campaign: i for i, t in enumerate(promo_tuples)} + last_index = lookup[last.campaign] + stubs = promo_tuples[last_index + 1:] + promoted_links.extend(stubs) if not (organic_fullnames or promoted_links): return None @@ -321,7 +329,8 @@ class HotController(FixListing, ListingController): interestbar_prob=interestbar_prob, promotion_prob=promotion_prob, max_num = self.listing_obj.max_num, - max_score = self.listing_obj.max_score).listing() + max_score = self.listing_obj.max_score, + predetermined_winner=c.user_is_loggedin).listing() return s def query(self): diff --git a/r2/r2/models/listing.py b/r2/r2/models/listing.py index d1d0cdbe6..0146a68c5 100644 --- a/r2/r2/models/listing.py +++ b/r2/r2/models/listing.py @@ -144,6 +144,7 @@ class SpotlightListing(Listing): promoted_links = kw.get('promoted_links', []) organic_links = kw.get('organic_links', []) + predetermined_winner = kw.get('predetermined_winner', False) self.links = [] for l in organic_links: @@ -157,14 +158,18 @@ class SpotlightListing(Listing): ) total = sum(float(l.weight) for l in promoted_links) - for l in promoted_links: + for i, l in enumerate(promoted_links): link = l._fullname if isinstance(l, Wrapped) else l.link + if predetermined_winner: + weight = 1 if i == 0 else 0 + else: + weight = l.weight / total self.links.append( SpotlightTuple( link=link, is_promo=True, campaign=l.campaign, - weight=l.weight / total, + weight=weight, ) )