Exclude reserved inventory for current campaign from inventory check.

This commit is contained in:
Brian Simpson
2013-08-19 17:31:02 -04:00
parent ac6657832a
commit 421dd824b0
3 changed files with 24 additions and 15 deletions

View File

@@ -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)}

View File

@@ -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:

View File

@@ -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):