Check for booked inventory to exclude on the client side.

Real inventory values (predicted inventory minus booked inventory) are sent to
the client. When checking available inventory on the front end while editing or
creating a campaign we calculate how many impressions have already been booked
for that campaign (if any) and add that into the real inventory value.
This commit is contained in:
Brian Simpson
2013-08-28 19:03:19 -04:00
parent d386fb7071
commit 50ec6045f2
2 changed files with 56 additions and 14 deletions

View File

@@ -3373,17 +3373,16 @@ class PromoteLinkForm(Templated):
self.min_bid = 0 if c.user_is_sponsor else g.min_promote_bid
# preload some inventory
srnames = []
srnames = set()
for title, names in self.subreddit_selector.subreddit_names:
srnames.extend(names)
srs = Subreddit._by_name(srnames).values()
srs.append(Frontpage)
srnames.update(names)
srs = Subreddit._by_name(srnames)
srs[''] = 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,
ignore=ignore)
sr_inventory = inventory.get_available_pageviews(
srs.values(), inv_start, inv_end, datestr=True)
sr_inventory[''] = sr_inventory[Frontpage.name]
del sr_inventory[Frontpage.name]
self.inventory = sr_inventory

View File

@@ -53,7 +53,9 @@ r.sponsored = {
}
for (var datestr in data.inventory) {
r.sponsored.inventory[srname][datestr] = data.inventory[datestr]
if (!r.sponsored.inventory[srname][datestr]) {
r.sponsored.inventory[srname][datestr] = data.inventory[datestr]
}
}
}
})
@@ -62,6 +64,39 @@ r.sponsored = {
}
},
get_booked_inventory: function($form, srname) {
var campaign_id36 = $form.find('input[name="campaign_id36"]').val(),
campaign_row = $('.existing-campaigns .campaign-row input[name="campaign_id36"]')
.filter('*[value="' + campaign_id36 + '"]')
.parents("tr")
if (!campaign_row.length) {
return {}
}
var existing_srname = campaign_row.find('*[name="targeting"]').val()
if (srname != existing_srname) {
return {}
}
var startdate = campaign_row.find('*[name="startdate"]').val(),
enddate = campaign_row.find('*[name="enddate"]').val(),
dates = this.get_dates(startdate, enddate),
bid = campaign_row.find('*[name="bid"]').val(),
cpm = campaign_row.find('*[name="cpm"]').val(),
ndays = this.duration_from_dates(startdate, enddate),
impressions = this.calc_impressions(bid, cpm),
daily = Math.floor(impressions / ndays),
booked = {}
_.each(dates, function(date) {
var datestr = $.datepicker.formatDate('mm/dd/yy', date)
booked[datestr] = daily
})
return booked
},
check_inventory: function($form) {
var bid = this.get_bid($form),
cpm = this.get_cpm($form),
@@ -73,7 +108,8 @@ r.sponsored = {
targeted = $form.find('#targeting').is(':checked'),
target = $form.find('*[name="sr"]').val(),
srname = targeted ? target : '',
dates = r.sponsored.get_dates(startdate, enddate)
dates = r.sponsored.get_dates(startdate, enddate),
booked = this.get_booked_inventory($form, srname)
// bail out in state where targeting is selected but srname
// has not been entered yet
@@ -85,8 +121,9 @@ r.sponsored = {
$.when(r.sponsored.get_check_inventory(srname, dates)).done(
function() {
var minDaily = _.min(_.map(dates, function(date) {
var datestr = $.datepicker.formatDate('mm/dd/yy', date)
return r.sponsored.inventory[srname][datestr]
var datestr = $.datepicker.formatDate('mm/dd/yy', date),
daily_booked = booked[datestr] || 0
return r.sponsored.inventory[srname][datestr] + daily_booked
}))
var available = minDaily * ndays
@@ -115,9 +152,15 @@ r.sponsored = {
)
},
duration_from_dates: function(start, end) {
return Math.round((Date.parse(end) - Date.parse(start)) / (86400*1000))
},
get_duration: function($form) {
return Math.round((Date.parse($form.find('*[name="enddate"]').val()) -
Date.parse($form.find('*[name="startdate"]').val())) / (86400*1000))
var start = $form.find('*[name="startdate"]').val(),
end = $form.find('*[name="enddate"]').val()
return this.duration_from_dates(start, end)
},
get_bid: function($form) {