Skip to content

Commit

Permalink
Update rsvp registered email schema to automatically add event to goo…
Browse files Browse the repository at this point in the history
…gle calendar (#1895)

* schema for adding to google calendar

* Use project.location

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Use single quotes, fix venue type

* Use Rsvp for EventRegistration schema

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Kiran Jonnalagadda <[email protected]>
  • Loading branch information
3 people authored Oct 11, 2023
1 parent 4071a6c commit 1691c9f
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 23 deletions.
4 changes: 2 additions & 2 deletions funnel/models/rsvp.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class Rsvp(UuidMixin, NoIdMixin, Model):
project_id = sa.orm.mapped_column(
sa.Integer, sa.ForeignKey('project.id'), nullable=False, primary_key=True
)
project = with_roles(
project: Mapped[Project] = with_roles(
relationship(Project, backref=backref('rsvps', cascade='all', lazy='dynamic')),
read={'owner', 'project_promoter'},
grants_via={None: project_child_role_map},
Expand All @@ -54,7 +54,7 @@ class Rsvp(UuidMixin, NoIdMixin, Model):
participant_id: Mapped[int] = sa.orm.mapped_column(
sa.ForeignKey('account.id'), nullable=False, primary_key=True
)
participant = with_roles(
participant: Mapped[Account] = with_roles(
relationship(Account, backref=backref('rsvps', cascade='all', lazy='dynamic')),
read={'owner', 'project_promoter'},
grants={'owner'},
Expand Down
86 changes: 70 additions & 16 deletions funnel/transports/email/send.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@
from baseframe import _, statsd

from ... import app
from ...models import Account, EmailAddress, EmailAddressBlockedError
from ...models import Account, EmailAddress, EmailAddressBlockedError, Rsvp
from ..exc import TransportRecipientError

__all__ = [
'EmailAttachment',
'jsonld_confirm_action',
'jsonld_event_reservation',
'jsonld_view_action',
'process_recipient',
'send_email',
Expand All @@ -42,32 +43,85 @@ class EmailAttachment:


def jsonld_view_action(description: str, url: str, title: str) -> dict[str, object]:
"""Schema.org JSON-LD markup for an email view action."""
return {
"@context": "http://schema.org",
"@type": "EmailMessage",
"description": description,
"potentialAction": {"@type": "ViewAction", "name": title, "url": url},
"publisher": {
"@type": "Organization",
"name": current_app.config['SITE_TITLE'],
"url": 'https://' + current_app.config['DEFAULT_DOMAIN'] + '/',
'@context': 'https://schema.org',
'@type': 'EmailMessage',
'description': description,
'potentialAction': {'@type': 'ViewAction', 'name': title, 'url': url},
'publisher': {
'@type': 'Organization',
'name': current_app.config['SITE_TITLE'],
'url': 'https://' + current_app.config['DEFAULT_DOMAIN'] + '/',
},
}


def jsonld_confirm_action(description: str, url: str, title: str) -> dict[str, object]:
"""Schema.org JSON-LD markup for an email confirmation action."""
return {
"@context": "http://schema.org",
"@type": "EmailMessage",
"description": description,
"potentialAction": {
"@type": "ConfirmAction",
"name": title,
"handler": {"@type": "HttpActionHandler", "url": url},
'@context': 'https://schema.org',
'@type': 'EmailMessage',
'description': description,
'potentialAction': {
'@type': 'ConfirmAction',
'name': title,
'handler': {'@type': 'HttpActionHandler', 'url': url},
},
}


def jsonld_event_reservation(rsvp: Rsvp) -> dict[str, object]:
"""Schema.org JSON-LD markup for an event reservation."""
location: str | dict[str, object]
venue = rsvp.project.primary_venue
if venue is not None:
location = {
'@type': 'Place',
'name': venue.title,
}
if venue.address1:
postal_address = {
'@type': 'PostalAddress',
'streetAddress': venue.address1,
'addressLocality': venue.city,
'addressRegion': venue.state,
'postalCode': venue.postcode,
'addressCountry': venue.country,
}
location['address'] = postal_address
else:
location = rsvp.project.location
return {
'@context': 'https://schema.org',
'@type': 'EventReservation',
'reservationNumber': rsvp.uuid_b58,
'reservationStatus': (
'https://schema.org/ReservationConfirmed'
if rsvp.state.YES
else 'https://schema.org/ReservationCancelled'
if rsvp.state.NO
else 'https://schema.org/ReservationPending'
),
'underName': {
'@type': 'Person',
'name': rsvp.participant.fullname,
},
'reservationFor': {
'@type': 'Event',
'name': rsvp.project.joined_title,
'url': rsvp.project.absolute_url,
'startDate': rsvp.project.start_at,
'location': location,
'performer': {
'@type': 'Organization',
'name': rsvp.project.account.title,
},
},
'numSeats': '1',
}


def process_recipient(recipient: EmailRecipient) -> str:
"""
Process recipient in any of the given input formats.
Expand Down
6 changes: 1 addition & 5 deletions funnel/views/notifications/rsvp_notification.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,7 @@ def email_content(self):
return render_template(
'notifications/rsvp_yes_email.html.jinja2',
view=self,
jsonld=email.jsonld_view_action(
self.rsvp.project.joined_title,
self.rsvp.project.url_for(_external=True),
_("View project"),
),
jsonld=email.jsonld_event_reservation(self.rsvp),
)

def sms(
Expand Down

0 comments on commit 1691c9f

Please sign in to comment.