common/app/model/EmailAddons.scala (504 lines of code) (raw):

package model import conf.Static sealed trait EmailMetadata[T] extends Product with Serializable { def name: String def banner: Option[String] = None def address: Option[String] = None def test(c: T): Boolean } sealed trait ArticleEmailMetadata extends EmailMetadata[ContentPage] { def test(c: ContentPage): Boolean } sealed trait FrontEmailMetadata extends EmailMetadata[PressedPage] { def test(p: PressedPage): Boolean = p.metadata.webTitle == this.name } case object ArtWeekly extends ArticleEmailMetadata { val name = "Art Weekly" override val banner = Some("art-weekly.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "artanddesign/series/art-weekly") } case object MoneyTalks extends ArticleEmailMetadata { val name = "Money Talks" override val banner = Some("money-talks.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "money/series/money-talks") } case object TheBreakdown extends ArticleEmailMetadata { val name = "The Breakdown" override val banner = Some("the-breakdown.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "sport/series/breakdown") } case object WorldCupFiver extends ArticleEmailMetadata { val name = "World Cup Fiver" override val banner = Some("world-cup-fiver.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "football/series/world-cup-fiver") } case object TheFiver extends ArticleEmailMetadata { val name = "The Fiver" override val banner = Some("the-fiver.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "football/series/thefiver") } case object TheSpin extends ArticleEmailMetadata { val name = "The Spin" override val banner = Some("the-spin.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "sport/series/thespin") } case object FirstEdition extends ArticleEmailMetadata { val name = "First Edition" override val banner = Some("first-edition.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "world/series/first-edition") } case object FightToVote extends ArticleEmailMetadata { val name = "Fight to vote" override val banner = Some("fight-to-vote.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "us-news/series/the-campaign-minute-2016") } case object EuReferendum extends ArticleEmailMetadata { val name = "Brexit Briefing" override val banner = Some("brexit-briefing.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "politics/series/eu-referendum-morning-briefing") } case object LabNotes extends ArticleEmailMetadata { val name = "Lab Notes" override val banner = Some("lab-notes.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "science/series/lab-notes") } case object HandwrittenMediaBriefing extends ArticleEmailMetadata { val name = "Media Briefing" override val banner = Some("media-briefing.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "media/series/mediaguardian-briefing") } case object TheUpsideWeeklyReport extends ArticleEmailMetadata { val name = "The Upside Weekly Report" override val banner = Some("the-upside.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "world/series/the-upside-weekly-report") } case object LabNotesFront extends FrontEmailMetadata { val name = "Lab Notes" override val banner = Some("lab-notes.png") } case object CuratedMediaBriefing extends FrontEmailMetadata { val name = "Media Briefing" override val banner = Some("media-briefing.png") } case object TheWeekInPatriarchy extends ArticleEmailMetadata { val name = "The Week In Patriarchy" override val banner = Some("the-week-in-patriarchy.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "commentisfree/series/the-week-in-patriarchy") } case object OutsideInAmerica extends ArticleEmailMetadata { val name = "Outside in America" override val banner = Some("outside-in-america.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "us-news/series/outside-in-america-newsletter") } case object TheResistanceNow extends ArticleEmailMetadata { val name = "The Resistance Now" override val banner = Some("the-resistance-now.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "us-news/series/the-resistance-now-newsletter") } case object BeyondTheBlade extends ArticleEmailMetadata { val name = "Beyond The Blade" override val banner = Some("beyond-the-blade.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "membership/series/beyond-the-blade") } case object MorningMail extends ArticleEmailMetadata { val name = "Morning Mail" override val banner = Some("morning-mail.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "australia-news/series/guardian-australia-s-morning-mail") } case object VirtualRealityStudio extends ArticleEmailMetadata { val name = "Virtual Reality Studio" override val banner = Some("virtual-reality-studio.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "news/series/virtual-reality-studio") } case object WeekendReading extends ArticleEmailMetadata { val name = "Weekend Reading" override val banner = Some("weekend-reading.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "membership/series/weekend-reading") } case object TheNewArrivals extends ArticleEmailMetadata { val name = "The New Arrivals" override val banner = Some("the-new-arrivals.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "world/series/the-new-arrivals-email-update") } case object FashionWeek extends ArticleEmailMetadata { val name = "Fashion Week" override val banner = Some("fashion-week.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "fashion/series/fashion-week--image-of-the-day") } case object CrosswordEditorsUpdate extends ArticleEmailMetadata { val name = "Crossword Editor's Update" override val banner = Some("crosswords-editors-update.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "crosswords/series/crossword-editor-update") } case object HearHere extends ArticleEmailMetadata { val name = "Hear Here" override val banner = Some("hear-here.gif") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "tv-and-radio/series/hear-here") } case object AnimalsFarmed extends ArticleEmailMetadata { val name = "Animals Farmed" override val banner = Some("animals-farmed-update.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "animals-farmed/series/animals-farmed-update") } case object USMorningBriefing extends ArticleEmailMetadata { val name = "First Thing: the US morning briefing" override val banner = Some("first-thing-2.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "us-news/series/guardian-us-briefing") } case object ObserverPictureArchive extends ArticleEmailMetadata { val name = "Observer Picture Archive" override val banner = Some("observer-picture-archive.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "theobserver/series/observer-picture-archive") } case object GunsAndLiesInAmerica extends ArticleEmailMetadata { val name = "Guns And Lies In America" override val banner = Some("guns_and_lies.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "us-news/series/guns-and-lies-in-america-newsletter") } case object TheSnap extends ArticleEmailMetadata { val name = "The Snap" override val banner = Some("the-snap.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "politics/series/the-snap") } case object AndrewSparrowsElectionBriefing extends ArticleEmailMetadata { val name = "Andrew Sparrow's Election Briefing" override val banner = Some("andrew-sparrow-email.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "politics/series/andrew-sparrows-election-briefing") } case object CoronavirusTheWeekExplained extends ArticleEmailMetadata { val name = "Coronavirus: the week explained" override val banner = Some("coronavirus.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "world/series/coronavirus-the-week-explained") } case object CoronavirusAustraliaAtAGlance extends ArticleEmailMetadata { val name = "Coronavirus: Australia at a glance" override val banner = Some("banner-coronavirus-aus.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "australia-news/series/coronavirus-australia-latest-at-a-glance") } case object CoronavirusinThePacific extends ArticleEmailMetadata { val name = "Coronavirus in the Pacific" override val banner = Some("coronavirus-in-the-pacific.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "world/series/coronavirus-in-the-pacific-weekly-briefing") } case object USElectionBriefingForAustralia extends ArticleEmailMetadata { val name = "US election briefing for Australia" override val banner = Some("us-election-briefing-australia.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "australia-news/series/us-election-2020-briefing-australia") } case object TechScape extends ArticleEmailMetadata { val name = "TechScape" override val banner = Some("techscape.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "technology/series/techscape") } case object Beijing2022DailyBriefing extends ArticleEmailMetadata { val name = "Beijing 2022 daily briefing" override val banner = Some("winter-olympics-2022.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "sport/series/beijing-2022-daily-briefing") } case object TheFlyer extends FrontEmailMetadata { val name = "The Flyer" override val banner = Some("the-flyer.png") } case object Opinion extends FrontEmailMetadata { val name = "The Best of Guardian Opinion" override val banner = Some("opinion.png") } case object TheGuardianTodayUS extends FrontEmailMetadata { val name = "The Guardian Today US" override val banner = Some("the-guardian-headlines-us.png") } case object SleeveNotes extends FrontEmailMetadata { val name = "Sleeve Notes" override val banner = Some("sleeve-notes.png") } case object BusinessToday extends FrontEmailMetadata { val name = "Business Today" override val banner = Some("business-today.png") } case object TheRecap extends FrontEmailMetadata { val name = "The Recap" override val banner = Some("the-recap.png") } case object GlobalDispatch extends FrontEmailMetadata { val name = "Global Dispatch" override val banner = Some("global-dispatch.png") } case object Bookmarks extends FrontEmailMetadata { val name = "Bookmarks" override val banner = Some("bookmarks.png") } case object TheLongRead extends FrontEmailMetadata { val name = "The Long Read" override val banner = Some("the-long-read.png") } case object FashionStatement extends FrontEmailMetadata { val name = "Fashion Statement" override val banner = Some("fashion-statement.png") } case object TheGuardianB2b extends FrontEmailMetadata { val name = "The Guardian B2b" override val banner = Some("business-view.png") } case object BusinessView extends FrontEmailMetadata { val name = "Business View" override val banner = Some("business-view.png") } case object OpinionUs extends FrontEmailMetadata { val name = "The Best of Guardian Opinion US" override val banner = Some("opinion.png") } case object ThisLandIsYourLand extends FrontEmailMetadata { val name = "This Land Is Your Land" override val banner = Some("this-land-is.png") } case object WinterOlympics2018 extends FrontEmailMetadata { val name = "Winter Olympics 2018" override val banner = Some("winter-olympics-2018.png") } case object ThisIsEurope extends FrontEmailMetadata { val name = "This Is Europe" override val banner = Some("this-is-europe-series.png") } case object TeacherNetwork extends FrontEmailMetadata { val name = "Teacher Network" override val banner = Some("teacher-network.png") } case object SocialCareNetwork extends FrontEmailMetadata { val name = "Social Care Network" override val banner = Some("social-care-network.png") } case object GuardianStudents extends FrontEmailMetadata { val name = "Guardian Students" override val banner = Some("guardian-students.png") } case object HealthcareProfessionalsNetwork extends FrontEmailMetadata { val name = "Healthcare Professionals Network" override val banner = Some("healthcare-professionals-network.png") } case object GuardianUniversities extends FrontEmailMetadata { val name = "Guardian Universities" override val banner = Some("universities.png") } case object PublicLeadersNetwork extends FrontEmailMetadata { val name = "Public Leaders Network" override val banner = Some("public-leaders-network.png") } case object HousingNetwork extends FrontEmailMetadata { val name = "Housing Network" override val banner = Some("housing-network.png") } case object VoluntarySectorNetwork extends FrontEmailMetadata { val name = "Voluntary Sector Network" override val banner = Some("voluntary-sector-network.png") } case object TheCityscape extends FrontEmailMetadata { val name = "The Cityscape" override val banner = Some("the-cityscape.png") } case object SocietyWeekly extends FrontEmailMetadata { val name = "Society Weekly" override val banner = Some("society-weekly.png") } case object TheGuardianTodayUK extends FrontEmailMetadata { val name = "The Guardian Today" override val banner = Some("the-guardian-headlines-uk.png") } case object TheGuardianTodayAustralia extends FrontEmailMetadata { val name = "The Guardian Today Australia" override val banner = Some("the-guardian-headlines-australia.png") } case object FilmToday extends FrontEmailMetadata { val name = "Film Today" override val banner = Some("film-today.png") } case object OpinionAus extends FrontEmailMetadata { val name = "The Best of Guardian Opinion Australia" override val banner = Some("opinion.png") } case object PoliticsAu extends FrontEmailMetadata { val name = "Australian Politics" override val banner = Some("australian-politics.png") } case object SportAu extends FrontEmailMetadata { val name = "Guardian Australia Sport" override val banner = Some("australia-sports.png") } case object FirstDogOnTheMoon extends FrontEmailMetadata { val name = "First Dog On The Moon" override val banner = Some("first-dog-on-the-moon.png") } case object GreenLight extends FrontEmailMetadata { val name = "Green Light" override val banner = Some("green-light.png") } case object WordOfMouth extends FrontEmailMetadata { val name = "Word Of Mouth" override val banner = Some("word-of-mouth.png") } case object SavedForLater extends FrontEmailMetadata { val name = "Saved For Later" override val banner = Some("saved-for-later.png") } case object TheGuide extends ArticleEmailMetadata { val name = "The Guide" override val banner = Some("the-guide.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "culture/series/the-guide") } case object DesignReview extends FrontEmailMetadata { val name = "Design review" override val banner = Some("design-review.png") } case object Documentaries extends FrontEmailMetadata { val name = "Documentaries" override val banner = Some("documentaries.gif") } case object TheRuralNetwork extends FrontEmailMetadata { val name = "The Rural Network" override val banner = Some("rural-network.png") } case object AustraliasModernOutback extends FrontEmailMetadata { val name = "Australia Modern Outback" override val banner = Some("aus-modern-outback.png") } case object FiveGreatReads extends ArticleEmailMetadata { val name = "Five Great Reads" override val banner = Some("five-great-reads.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "australia-news/series/five-great-reads") } case object MovingTheGoalposts extends ArticleEmailMetadata { val name = "Moving the Goalposts" override val banner = Some("moving-the-goalposts.png") def test(c: ContentPage): Boolean = c.item.tags.series.exists(_.id == "football/series/moving-the-goalposts") } case object HeadlinesEurope extends FrontEmailMetadata { val name = "Headlines Europe" override val banner = Some("headlines-eur.png") } case object OlympicAndParalympicBriefing extends FrontEmailMetadata { val name = "Olympics And Paralympics Briefing" override val banner = Some("paris-2024-paralympics.jpg") } case object BreakingNewsAustralia extends FrontEmailMetadata { val name = "Au Breaking News" override val banner = Some("breaking-news-australia.jpg") } object EmailAddons { val unsubscribePlaceholder = "%%unsub_center_url%%" private val defaultAddress = "Kings Place, 90 York Way, London, N1 9GU. Registered in England No. 908396" private val defaultBanner = "generic.png" private val articleEmails = Seq( ArtWeekly, MoneyTalks, TheBreakdown, WorldCupFiver, TheFiver, TheSpin, FirstEdition, FightToVote, EuReferendum, LabNotes, HandwrittenMediaBriefing, TheWeekInPatriarchy, OutsideInAmerica, TheResistanceNow, BeyondTheBlade, MorningMail, VirtualRealityStudio, WeekendReading, TheNewArrivals, FashionWeek, HearHere, CrosswordEditorsUpdate, TheUpsideWeeklyReport, AnimalsFarmed, USMorningBriefing, ObserverPictureArchive, GunsAndLiesInAmerica, TheSnap, AndrewSparrowsElectionBriefing, CoronavirusTheWeekExplained, CoronavirusAustraliaAtAGlance, CoronavirusinThePacific, USElectionBriefingForAustralia, TechScape, TheGuide, FiveGreatReads, Beijing2022DailyBriefing, MovingTheGoalposts, ) private val frontEmails = Seq( SocialCareNetwork, GuardianUniversities, GuardianStudents, HealthcareProfessionalsNetwork, PublicLeadersNetwork, VoluntarySectorNetwork, HousingNetwork, TheFlyer, LabNotesFront, CuratedMediaBriefing, Opinion, TheGuardianTodayUS, SleeveNotes, BusinessToday, TheRecap, GlobalDispatch, Bookmarks, TheLongRead, FashionStatement, BusinessView, TheGuardianB2b, OpinionUs, ThisLandIsYourLand, WinterOlympics2018, ThisIsEurope, TeacherNetwork, TheCityscape, SocietyWeekly, TheGuardianTodayUK, TheGuardianTodayAustralia, FilmToday, OpinionAus, PoliticsAu, SportAu, FirstDogOnTheMoon, GreenLight, WordOfMouth, SavedForLater, TheRuralNetwork, DesignReview, Documentaries, AustraliasModernOutback, HeadlinesEurope, OlympicAndParalympicBriefing, BreakingNewsAustralia, ) implicit class EmailContentType(p: Page) { val email = p match { case c: ContentPage => articleEmails.find(_.test(c)) case p: PressedPage => frontEmails.find(_.test(p)) } val fallbackSeriesText = PartialFunction.condOpt(p) { case c: ContentPage if email.isEmpty => c.item.content.seriesName } lazy val banner = { val banner = email flatMap (_.banner) getOrElse defaultBanner Static(s"images/email/banners/$banner") } lazy val address = email flatMap (_.address) getOrElse defaultAddress lazy val bodyClass = email map (_.name.toLowerCase().replace(' ', '-')) lazy val analyticsComponentId = email map (_.name.toLowerCase().replace(' ', '_')) getOrElse "article" } }