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) {