From 50ec6045f2e6eddae5b599631987a025a7eeeaeb Mon Sep 17 00:00:00 2001 From: Brian Simpson Date: Wed, 28 Aug 2013 19:03:19 -0400 Subject: [PATCH] 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. --- r2/r2/lib/pages/pages.py | 15 ++++---- r2/r2/public/static/js/sponsored.js | 55 +++++++++++++++++++++++++---- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/r2/r2/lib/pages/pages.py b/r2/r2/lib/pages/pages.py index 4b5c5fef1..d9314ef3d 100755 --- a/r2/r2/lib/pages/pages.py +++ b/r2/r2/lib/pages/pages.py @@ -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 diff --git a/r2/r2/public/static/js/sponsored.js b/r2/r2/public/static/js/sponsored.js index 372d2340b..6727edd5b 100644 --- a/r2/r2/public/static/js/sponsored.js +++ b/r2/r2/public/static/js/sponsored.js @@ -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) {