FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Merge pull request #18984 from guardian/pageskin-sections · devhttps/frontend@9c383cc · GitHub

Commit 9c383cc

Browse files
Richard Nguyen
authored
Merge pull request guardian#18984 from guardian/pageskin-sections
Pageskin sections
2 parents 8ca1a66 + 9f28672 commit 9c383cc

9 files changed

Lines changed: 110 additions & 111 deletions

File tree

‎admin/app/dfp/DfpDataExtractor.scala‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ case class DfpDataExtractor(
4646
countries = countriesTargeted(lineItem),
4747
isR2Only = lineItem.targeting.targetsR2Only,
4848
targetsAdTest = lineItem.targeting.hasAdTestTargetting,
49-
adTestValue = lineItem.targeting.adTestValue
49+
adTestValue = lineItem.targeting.adTestValue,
50+
keywords = lineItem.targeting.keyValues
5051
)
5152
}
5253
}

‎admin/app/tools/DfpLink.scala‎

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package tools
22

3-
import common.dfp.PageSkin
43
import conf.Configuration.commercial.dfpAccountId
5-
import conf.Configuration.{commercial, site}
4+
import conf.Configuration.site
65

76
import scala.language.postfixOps
87

@@ -27,20 +26,6 @@ object DfpLink {
2726

2827
object SiteLink {
2928

30-
def adUnit(path: String, adTest: Option[String]): Option[String] = {
31-
32-
lazy val domain = if (adTest.isDefined) commercial.testDomain else site.host
33-
val relativePath = PageSkin.getRelativePath(path)
34-
val domainAndPath = relativePath map { path => s"$domain/$path" }
35-
val domainAndPathWithAdTest =
36-
for {
37-
id <- adTest
38-
baseUrl <- domainAndPath
39-
} yield s"$baseUrl?adtest=$id"
40-
41-
domainAndPathWithAdTest orElse domainAndPath
42-
}
43-
4429
def contributorTagPage(contributor: String): String = s"${site.host}/profile/$contributor"
4530

4631
def page(pageId: String):String = s"${site.host}/$pageId"

‎admin/app/views/commercial/pageskins.scala.html‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@(pageSkinnedAdUnits: common.dfp.PageSkinSponsorshipReport)(implicit request: RequestHeader, context: model.ApplicationContext)
22
@import common.dfp._
3-
@import tools.{DfpLink, SiteLink}
3+
@import tools.DfpLink
44

55
@flaggableProperty(label: String, values: Seq[String], textWhenEmpty: String, flagErrors: Boolean) = {
66
@if(values.isEmpty) {
@@ -24,11 +24,17 @@
2424
<ul>
2525
@if(sponsorship.adUnits.isEmpty) { <li>Run of network</li> }
2626
@for(adUnit <- sponsorship.adUnits) {
27-
<li>
28-
<a href="@SiteLink.adUnit(adUnit, sponsorship.adTestValue)">@adUnit</a>
29-
</li>
27+
<li>@adUnit</li>
3028
}
3129
</ul>
30+
@if(sponsorship.keywords.nonEmpty) {
31+
<small>Keywords:</small>
32+
<ul>
33+
@for(keyword <- sponsorship.keywords) {
34+
<li>@keyword</li>
35+
}
36+
</ul>
37+
}
3238
</li>
3339
}
3440

‎common/app/common/configuration.scala‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ class GuardianConfiguration extends Logging {
404404
private lazy val dfpRoot = s"$commercialRoot/dfp"
405405
lazy val dfpInlineMerchandisingTagsDataKey = s"$dfpRoot/inline-merchandising-tags-v3.json"
406406
lazy val dfpHighMerchandisingTagsDataKey = s"$dfpRoot/high-merchandising-tags.json"
407-
lazy val dfpPageSkinnedAdUnitsKey = s"$dfpRoot/pageskinned-adunits-v6.json"
407+
lazy val dfpPageSkinnedAdUnitsKey = s"$dfpRoot/pageskinned-adunits-v7.json"
408408
lazy val dfpLineItemsKey = s"$dfpRoot/lineitems-v6.json"
409409
lazy val dfpActiveAdUnitListKey = s"$dfpRoot/active-ad-units.csv"
410410
lazy val dfpMobileAppsAdUnitListKey = s"$dfpRoot/mobile-active-ad-units.csv"

‎common/app/common/dfp/DfpData.scala‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,14 @@ case class GuTargeting(adUnitsIncluded: Seq[GuAdUnit],
148148
geoTargetsExcluded: Seq[GeoTarget],
149149
customTargetSets: Seq[CustomTargetSet]) {
150150

151+
val keyValues: Seq[String] = {
152+
for {
153+
targetSet <- customTargetSets
154+
target <- targetSet.targets if target.isKeywordTag
155+
targetValue <- target.values
156+
} yield targetValue
157+
}
158+
151159
val adTestValue: Option[String] = {
152160
val testValues = for {
153161
targetSet <- customTargetSets

‎common/app/common/dfp/PageSkinSponsorship.scala‎

Lines changed: 7 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,41 @@
11
package common.dfp
22

33
import common.{Edition, Logging}
4-
import play.api.libs.functional.syntax._
54
import play.api.libs.json._
65

7-
86
case class PageSkinSponsorship(lineItemName: String,
97
lineItemId: Long,
108
adUnits: Seq[String],
119
editions: Seq[Edition],
1210
countries: Seq[String],
1311
isR2Only: Boolean,
1412
targetsAdTest: Boolean,
15-
adTestValue: Option[String])
13+
adTestValue: Option[String],
14+
keywords: Seq[String])
1615

1716
object PageSkinSponsorship {
18-
19-
implicit val pageskinSponsorShipFormat: Format[PageSkinSponsorship] = (
20-
(JsPath \ "lineItem").format[String] and
21-
(JsPath \ "lineItemId").format[Long] and
22-
(JsPath \ "adUnits").format[Seq[String]] and
23-
(JsPath \ "editions").format[Seq[Edition]] and
24-
(JsPath \ "countries").format[Seq[String]] and
25-
(JsPath \ "isR2Only").format[Boolean] and
26-
(JsPath \ "isAdTest").format[Boolean] and
27-
(JsPath \ "adTestValue").formatNullable[String]
28-
)(PageSkinSponsorship.apply, unlift(PageSkinSponsorship.unapply))
17+
implicit val pageskinSponsorShipFormat: Format[PageSkinSponsorship] = Json.format[PageSkinSponsorship]
2918
}
3019

3120
case class PageSkinSponsorshipReport(updatedTimeStamp: String, sponsorships: Seq[PageSkinSponsorship]) {
3221
val (testSponsorships, deliverableSponsorships) = sponsorships partition (_.targetsAdTest)
3322
}
3423

3524
object PageSkinSponsorshipReport {
36-
37-
implicit val pageSkinSponsorshipReportWrites = new Writes[PageSkinSponsorshipReport] {
38-
def writes(report: PageSkinSponsorshipReport): JsValue = {
39-
Json.obj(
40-
"updatedTimeStamp" -> report.updatedTimeStamp,
41-
"sponsorships" -> report.sponsorships
42-
)
43-
}
44-
}
45-
25+
implicit val pageSkinSponsorshipReportFormat: Format[PageSkinSponsorshipReport] = Json.format[PageSkinSponsorshipReport]
4626
}
4727

4828
object PageSkin {
29+
private val ngFrontSuffix = "/front/ng"
30+
private val frontSuffix = "/front"
4931

50-
def isValidAdUnit(adUnitPath: String): Boolean = getRelativePath(adUnitPath).isDefined
51-
52-
def getRelativePath(adUnitPath: String): Option[String] = {
53-
54-
def trimPath(dropFromRight: Int) = adUnitPath.split("/").drop(1).dropRight(dropFromRight).mkString("/")
55-
56-
if (adUnitPath endsWith "/front/ng")
57-
Some(trimPath(2))
58-
else if (adUnitPath endsWith "/front")
59-
Some(trimPath(1))
60-
else
61-
None
62-
}
63-
64-
32+
def isValidAdUnit(adUnitPath: String): Boolean = (adUnitPath endsWith ngFrontSuffix) || (adUnitPath endsWith frontSuffix)
6533
}
6634

6735
object PageSkinSponsorshipReportParser extends Logging {
6836

6937
def apply(jsonString: String): Option[PageSkinSponsorshipReport] = {
7038

71-
implicit val reportReads: Reads[PageSkinSponsorshipReport] = (
72-
(JsPath \ "updatedTimeStamp").read[String] and
73-
(JsPath \ "sponsorships").read[Seq[PageSkinSponsorship]]
74-
)(PageSkinSponsorshipReport.apply _)
75-
7639
val result: JsResult[PageSkinSponsorshipReport] = Json.parse(jsonString).validate[PageSkinSponsorshipReport]
7740
result match {
7841
case s: JsSuccess[PageSkinSponsorshipReport] => Some(s.get)
Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,51 @@
11
package common.dfp
22

33
import common.Edition
4-
import conf.Configuration.commercial._
4+
import com.gu.commercial.display.AdTargetParam.toMap
5+
import com.gu.commercial.display.MultipleValues
6+
import model.MetaData
57

68
trait PageskinAdAgent {
79

810
protected val environmentIsProd: Boolean
911

1012
protected def pageSkinSponsorships: Seq[PageSkinSponsorship]
1113

12-
private def findSponsorships(adUnitWithoutRoot: String, edition: Edition): Seq[PageSkinSponsorship] = {
14+
// There are two forms of pageskins:
15+
// - pageskins that target through ad unit (for pressed fronts)
16+
// - pageskins that target through a keyword (for index page fronts)
17+
private def findSponsorships(adUnitPath: String, metaData: MetaData, edition: Edition): Seq[PageSkinSponsorship] = {
1318

14-
if (PageSkin.isValidAdUnit(adUnitWithoutRoot)) {
15-
val adUnitWithRoot = s"$dfpAdUnitGuRoot/$adUnitWithoutRoot"
19+
val candidates = pageSkinSponsorships filter { sponsorship =>
20+
sponsorship.editions.contains(edition) && !sponsorship.isR2Only }
1621

17-
def targetsAdUnitAndMatchesTheEdition(sponsorship: PageSkinSponsorship) = {
18-
val adUnits = sponsorship.adUnits map (_.stripSuffix("/ng"))
19-
adUnits.contains(adUnitWithRoot) &&
20-
sponsorship.editions.contains(edition) &&
21-
!sponsorship.isR2Only
22-
}
23-
24-
pageSkinSponsorships filter { sponsorship =>
25-
targetsAdUnitAndMatchesTheEdition(sponsorship)
26-
}
22+
if (metaData.isPressedPage) {
23+
if (PageSkin.isValidAdUnit(adUnitPath)) {
24+
candidates filter { sponsorship => sponsorship.adUnits.exists(adUnitPath.endsWith) }
25+
} else Seq.empty
2726
} else {
28-
Seq.empty
27+
val targetingMap = toMap(metaData.commercial.map(_.adTargeting(edition)).getOrElse(Set.empty))
28+
val keywordTargeting = targetingMap.get("k") match {
29+
case Some(values: MultipleValues) => values.values.toSeq
30+
case _ => Seq.empty
31+
}
32+
candidates filter { sponsorship => sponsorship.keywords.intersect(keywordTargeting).nonEmpty }
2933
}
3034
}
3135

3236
// The ad unit is considered to have a page skin if it has a corresponding sponsorship.
3337
// If the sponsorship is an adTest, it is only considered outside of production.
34-
def hasPageSkin(adUnitWithoutRoot: String, edition: Edition): Boolean = {
35-
findSponsorships(adUnitWithoutRoot, edition) exists (sponsorship => !(environmentIsProd && sponsorship.targetsAdTest))
38+
def hasPageSkin(fullAdUnitPath: String, metaData: MetaData, edition: Edition): Boolean = {
39+
if (metaData.isFront) {
40+
findSponsorships(fullAdUnitPath, metaData, edition) exists (sponsorship =>
41+
!(environmentIsProd && sponsorship.targetsAdTest))
42+
} else false
3643
}
3744

3845
// True if there is any candidate sponsorship for this ad unit. Used to decide when to render the out-of-page ad slot.
39-
def hasPageSkinOrAdTestPageSkin(adUnitWithoutRoot: String, edition: Edition): Boolean = {
40-
findSponsorships(adUnitWithoutRoot, edition).nonEmpty
46+
def hasPageSkinOrAdTestPageSkin(fullAdUnitPath: String, metaData: MetaData, edition: Edition): Boolean = {
47+
if (metaData.isFront) {
48+
findSponsorships(fullAdUnitPath, metaData, edition).nonEmpty
49+
} else false
4150
}
4251
}

‎common/app/model/meta.scala‎

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ final case class MetaData (
222222
openGraphImages: Seq[String] = Seq(),
223223
membershipAccess: Option[String] = None,
224224
isFront: Boolean = false,
225-
isPressedPage: Boolean = true,
225+
isPressedPage: Boolean = false,
226226
hideUi: Boolean = false,
227227
canonicalUrl: Option[String] = None,
228228
shouldGoogleIndex: Boolean = true,
@@ -237,13 +237,11 @@ final case class MetaData (
237237
isNewRecipeDesign: Boolean = false
238238
){
239239
val sectionId = section map (_.value) getOrElse ""
240+
private val fullAdUnitPath = AdUnitMaker.make(id, adUnitSuffix)
241+
242+
def hasPageSkin(edition: Edition): Boolean = DfpAgent.hasPageSkin(fullAdUnitPath, this, edition)
243+
def hasPageSkinOrAdTestPageSkin(edition: Edition): Boolean = DfpAgent.hasPageSkinOrAdTestPageSkin(fullAdUnitPath, this, edition)
240244

241-
def hasPageSkin(edition: Edition): Boolean = if (isPressedPage){
242-
DfpAgent.hasPageSkin(adUnitSuffix, edition)
243-
} else false
244-
def hasPageSkinOrAdTestPageSkin(edition: Edition): Boolean = if (isPressedPage){
245-
DfpAgent.hasPageSkinOrAdTestPageSkin(adUnitSuffix, edition)
246-
} else false
247245
def omitMPUsFromContainers(edition: Edition): Boolean = if (isPressedPage) {
248246
DfpAgent.omitMPUsFromContainers(id, edition)
249247
} else false
@@ -267,7 +265,7 @@ final case class MetaData (
267265
("pageId", JsString(id)),
268266
("section", JsString(sectionId)),
269267
("webTitle", JsString(webTitle)),
270-
("adUnit", JsString(AdUnitMaker.make(id, adUnitSuffix))),
268+
("adUnit", JsString(fullAdUnitPath)),
271269
("buildNumber", JsString(buildNumber)),
272270
("revisionNumber", JsString(revision)),
273271
("isFront", JsBoolean(isFront)),

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL