Skip to content

Commit

Permalink
Merge pull request #738 from readthedocs/davidfischer/prioritize-over…
Browse files Browse the repository at this point in the history
…due-flights

Prioritize overdue flights
  • Loading branch information
davidfischer committed May 11, 2023
2 parents 7124fb8 + 3b20589 commit db193af
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
15 changes: 14 additions & 1 deletion adserver/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1062,6 +1062,12 @@ def sold_days(self):
# (eg. 23 hours, 59 minutes, 59 seconds, 999ms)
return max(0, int(remaining_seconds / self.pacing_interval)) + 1

def days_overdue(self):
"""Number of days (NOT intervals) past the end date on the flight."""
# A negative number means the flight is not overdue
days_overdue = (self.end_date - timezone.now().date()).days * -1
return max(0, days_overdue)

def days_remaining(self):
"""Number of intervals (default = days) left in a flight."""
# The flight is considered to end at the end of the day on the `end_date`
Expand Down Expand Up @@ -1170,7 +1176,14 @@ def weighted_clicks_needed_this_interval(self, publisher=None):
price_priority_value = max(float(price_priority_value), 1.0)
price_priority_value = min(price_priority_value, 10.0)

return int(impressions_needed * self.priority_multiplier * price_priority_value)
prioritized_impressions_needed = int(
impressions_needed * self.priority_multiplier * price_priority_value
)

# Prioritize flights the more overdue they are
overdue_factor = int(max(1, self.days_overdue()) ** 1.5)

return int(prioritized_impressions_needed * overdue_factor)

def clicks_remaining(self):
return max(0, self.sold_clicks - self.total_clicks)
Expand Down
9 changes: 9 additions & 0 deletions adserver/tests/test_decision_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -903,3 +903,12 @@ def test_weighting_bounds(self):
self.assertEqual(
super_high.weighted_clicks_needed_this_interval(), 28 * 10
) # maxed out

# Verify the days overdue priority
days_overdue = 10
super_low.end_date = get_ad_day().date() - datetime.timedelta(days=days_overdue)
overdue_factor = int(days_overdue**1.5)
self.assertEqual(
super_low.weighted_clicks_needed_this_interval(),
super_low.sold_clicks * super_low.cpm * overdue_factor,
)

0 comments on commit db193af

Please sign in to comment.