From 421dd824b0d9e5eb100c0774e66ec9803214236d Mon Sep 17 00:00:00 2001 From: Brian Simpson Date: Mon, 19 Aug 2013 17:31:02 -0400 Subject: [PATCH] Exclude reserved inventory for current campaign from inventory check. --- r2/r2/controllers/promotecontroller.py | 3 ++- r2/r2/lib/inventory.py | 16 +++++++++++----- r2/r2/lib/pages/pages.py | 20 +++++++++++--------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/r2/r2/controllers/promotecontroller.py b/r2/r2/controllers/promotecontroller.py index 5d5ad42af..bb7dc9f4a 100644 --- a/r2/r2/controllers/promotecontroller.py +++ b/r2/r2/controllers/promotecontroller.py @@ -547,8 +547,9 @@ class PromoteController(ListingController): ndays = (to_date(end) - to_date(start)).days total_request = calc_impressions(bid, cpm) daily_request = int(total_request / ndays) + ignore = [campaign._id] if campaign_id36 else [] oversold = inventory.get_oversold(sr or Frontpage, start, end, - daily_request) + daily_request, ignore) if oversold: msg_params = {'daily_request': format_number(daily_request, locale=c.locale)} diff --git a/r2/r2/lib/inventory.py b/r2/r2/lib/inventory.py index 3315c822c..54afa2e0b 100644 --- a/r2/r2/lib/inventory.py +++ b/r2/r2/lib/inventory.py @@ -94,10 +94,11 @@ def get_date_range(start, end): return dates -def get_sold_pageviews(srs, start, end): +def get_sold_pageviews(srs, start, end, ignore=None): srs, is_single = tup(srs, ret_is_single=True) sr_names = ['' if isinstance(sr, DefaultSR) else sr.name for sr in srs] dates = set(get_date_range(start, end)) + ignore = [] if ignore is None else ignore q = (PromotionWeights.query() .filter(PromotionWeights.sr_name.in_(sr_names)) .filter(PromotionWeights.date.in_(dates))) @@ -109,6 +110,9 @@ def get_sold_pageviews(srs, start, end): if camp.trans_id == NO_TRANSACTION: continue + if ignore and camp._id in ignore: + continue + if camp.impressions <= 0: # pre-CPM campaign continue @@ -125,11 +129,12 @@ def get_sold_pageviews(srs, start, end): return ret -def get_available_pageviews(srs, start, end, datestr=False): +def get_available_pageviews(srs, start, end, datestr=False, + ignore=None): srs, is_single = tup(srs, ret_is_single=True) sr_names = [sr.name for sr in srs] daily_inventory = PromoMetrics.get(MIN_DAILY_CASS_KEY, sr_names=sr_names) - sold_by_sr_by_date = get_sold_pageviews(srs, start, end) + sold_by_sr_by_date = get_sold_pageviews(srs, start, end, ignore) datekey = lambda dt: dt.strftime('%m/%d/%Y') if datestr else dt @@ -148,8 +153,9 @@ def get_available_pageviews(srs, start, end, datestr=False): return ret -def get_oversold(sr, start, end, daily_request): - available_by_date = get_available_pageviews(sr, start, end, datestr=True) +def get_oversold(sr, start, end, daily_request, ignore): + available_by_date = get_available_pageviews(sr, start, end, datestr=True, + ignore=ignore) oversold = {} for datestr, available in available_by_date.iteritems(): if available < daily_request: diff --git a/r2/r2/lib/pages/pages.py b/r2/r2/lib/pages/pages.py index c52ec091c..f2da2fa9f 100755 --- a/r2/r2/lib/pages/pages.py +++ b/r2/r2/lib/pages/pages.py @@ -3363,6 +3363,14 @@ class PromoteLinkForm(Templated): self.subreddit_selector = SubredditSelector() + self.link = promote.wrap_promoted(link) + self.listing = listing + campaigns = PromoCampaign._by_link(link._id) + self.campaigns = promote.get_renderable_campaigns(link, campaigns) + self.promotion_log = PromotionLog.get(link) + + self.min_bid = 0 if c.user_is_sponsor else g.min_promote_bid + # preload some inventory srnames = [] for title, names in self.subreddit_selector.subreddit_names: @@ -3371,20 +3379,14 @@ class PromoteLinkForm(Templated): srs.append(Frontpage) inv_start = startdate inv_end = startdate + datetime.timedelta(days=14) + ignore = [camp._id for camp in campaigns] sr_inventory = inventory.get_available_pageviews(srs, inv_start, - inv_end, datestr=True) + inv_end, datestr=True, + ignore=ignore) sr_inventory[''] = sr_inventory[Frontpage.name] del sr_inventory[Frontpage.name] self.inventory = sr_inventory - self.link = promote.wrap_promoted(link) - self.listing = listing - campaigns = PromoCampaign._by_link(link._id) - self.campaigns = promote.get_renderable_campaigns(link, campaigns) - self.promotion_log = PromotionLog.get(link) - - self.min_bid = 0 if c.user_is_sponsor else g.min_promote_bid - class PromoAdminTool(Reddit): def __init__(self, query_type=None, launchdate=None, start=None, end=None, *a, **kw):