Skip to content

Commit

Permalink
Merge pull request #159 from readthedocs/publisher-keywords
Browse files Browse the repository at this point in the history
Minimal changes to support default keywords for a publisher
  • Loading branch information
ericholscher committed Jul 3, 2020
2 parents ab51b56 + 92f36d5 commit 898937e
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 0 deletions.
9 changes: 9 additions & 0 deletions adserver/decisionengine/backends.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ def __init__(self, request, placements, publisher, **kwargs):
self.keywords = kwargs.get("keywords", []) or []
self.campaign_types = kwargs.get("campaign_types", []) or []

# Add default keywords from publisher
if self.publisher.keywords:
log.debug(
"Adding default keywords: publisher=%s keywords=%s",
self.publisher.slug,
self.publisher.keywords,
)
self.keywords.extend(self.publisher.keywords)

if not self.campaign_types:
if publisher.paid_campaigns_only:
# This publisher only wants paid ads
Expand Down
21 changes: 21 additions & 0 deletions adserver/migrations/0019_add_default_keywords.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.23 on 2020-07-03 17:08
from __future__ import unicode_literals

from django.db import migrations
from django.db import models


class Migration(migrations.Migration):

dependencies = [
('adserver', '0018_paid_ads_only_flag'),
]

operations = [
migrations.AddField(
model_name='publisher',
name='default_keywords',
field=models.CharField(blank=True, default='', help_text='A CSV of default keywords for this property. Used for targeting.', max_length=250, verbose_name='Default keywords'),
),
]
32 changes: 32 additions & 0 deletions adserver/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from django.utils import timezone
from django.utils.crypto import get_random_string
from django.utils.html import mark_safe
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from django_countries import countries
from django_countries.fields import CountryField
Expand Down Expand Up @@ -103,6 +104,14 @@ class Publisher(TimeStampedModel, IndestructibleModel):
help_text=_("Percentage of advertising revenue shared with this publisher"),
)

default_keywords = models.CharField(
_("Default keywords"),
max_length=250,
help_text=_("A CSV of default keywords for this property. Used for targeting."),
default="",
blank=True,
)

unauthed_ad_decisions = models.BooleanField(
default=True,
help_text=_(
Expand All @@ -123,6 +132,29 @@ def __str__(self):
def get_absolute_url(self):
return reverse("publisher_report", kwargs={"publisher_slug": self.slug})

@property
def keywords(self):
"""
Parses database keywords and ensures consistency.
- Lowercases all tags
- Converts underscores to hyphens
- Slugifies tags
- Removes empty tags
Similar logic to RTD ``readthedocs.projects.tag_utils.rtd_parse_tags``.
"""
if self.default_keywords:
return_keywords = []
keyword_list = self.default_keywords.split(",")
for keyword in keyword_list:
keyword = keyword.lower().replace("_", "-")
keyword = slugify(keyword)
if keyword:
return_keywords.append(keyword)
return return_keywords
return []

def daily_reports(self, start_date=None, end_date=None, campaign_type=None):
"""
Generates a report of clicks, views, & cost for a given time period for the Publisher.
Expand Down
12 changes: 12 additions & 0 deletions adserver/tests/test_decision_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -510,3 +510,15 @@ def test_campaign_type_priority(self):
# Community before house
ad, _ = self.probabilistic_backend.get_ad_and_placement()
self.assertEqual(ad, community_ad)

def test_default_keywords(self):
self.publisher.default_keywords = "foo,bar,baz,machine-learning"
self.publisher.save()

self.backend = AdvertisingEnabledBackend(
request=self.request, placements=self.placements, publisher=self.publisher
)

self.assertTrue(
self.backend.keywords, ["foo", "bar", "baz", "machine-learning"]
)

0 comments on commit 898937e

Please sign in to comment.