From 672b5a86b6b18fb83dd69646964e93ce8eb2d239 Mon Sep 17 00:00:00 2001 From: Kiran Jonnalagadda Date: Tue, 10 Oct 2023 17:22:28 +0530 Subject: [PATCH] Use Rsvp for EventRegistration schema --- funnel/models/rsvp.py | 4 +- funnel/transports/email/send.py | 79 ++++++++++--------- .../views/notifications/rsvp_notification.py | 10 +-- 3 files changed, 45 insertions(+), 48 deletions(-) diff --git a/funnel/models/rsvp.py b/funnel/models/rsvp.py index a5bd82361..ac6390686 100644 --- a/funnel/models/rsvp.py +++ b/funnel/models/rsvp.py @@ -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}, @@ -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'}, diff --git a/funnel/transports/email/send.py b/funnel/transports/email/send.py index 619b07ed9..f31343c0c 100644 --- a/funnel/transports/email/send.py +++ b/funnel/transports/email/send.py @@ -17,7 +17,7 @@ from baseframe import _, statsd from ... import app -from ...models import Account, EmailAddress, EmailAddressBlockedError, Venue +from ...models import Account, EmailAddress, EmailAddressBlockedError, Rsvp from ..exc import TransportRecipientError __all__ = [ @@ -43,8 +43,9 @@ 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', + '@context': 'https://schema.org', '@type': 'EmailMessage', 'description': description, 'potentialAction': {'@type': 'ViewAction', 'name': title, 'url': url}, @@ -56,21 +57,29 @@ def jsonld_view_action(description: str, url: str, title: str) -> dict[str, obje } -def jsonld_event_reservation( - description: str, - url: str, - title: str, - start_date: str, - location: str, - venue: Venue | None, - fullname: str, -) -> dict[str, object]: - location_schema: dict[str, object] = { - '@type': 'Place', - 'name': location, +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': '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_schema['name'] = venue.title + location = { + '@type': 'Place', + 'name': venue.title, + } if venue.address1: postal_address = { '@type': 'PostalAddress', @@ -80,43 +89,39 @@ def jsonld_event_reservation( 'postalCode': venue.postcode, 'addressCountry': venue.country, } - location_schema['address'] = postal_address + location['address'] = postal_address + else: + location = rsvp.project.location return { - '@context': 'http://schema.org', + '@context': 'https://schema.org', '@type': 'EventReservation', - 'reservationStatus': 'http://schema.org/Confirmed', + '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': fullname, + 'name': rsvp.participant.fullname, }, 'reservationFor': { '@type': 'Event', - 'name': title, - 'url': url, + 'name': rsvp.project.joined_title, + 'url': rsvp.project.absolute_url, + 'startDate': rsvp.project.start_at, + 'location': location, 'performer': { '@type': 'Organization', - 'name': description, + 'name': rsvp.project.account.title, }, - 'startDate': start_date, - 'location': location_schema, }, 'numSeats': '1', } -def jsonld_confirm_action(description: str, url: str, title: str) -> dict[str, object]: - return { - '@context': 'http://schema.org', - '@type': 'EmailMessage', - 'description': description, - 'potentialAction': { - '@type': 'ConfirmAction', - 'name': title, - 'handler': {'@type': 'HttpActionHandler', 'url': url}, - }, - } - - def process_recipient(recipient: EmailRecipient) -> str: """ Process recipient in any of the given input formats. diff --git a/funnel/views/notifications/rsvp_notification.py b/funnel/views/notifications/rsvp_notification.py index ebc0a2d85..65fe69c24 100644 --- a/funnel/views/notifications/rsvp_notification.py +++ b/funnel/views/notifications/rsvp_notification.py @@ -120,15 +120,7 @@ def email_content(self): return render_template( 'notifications/rsvp_yes_email.html.jinja2', view=self, - jsonld=email.jsonld_event_reservation( - self.rsvp.project.joined_title, - self.rsvp.project.url_for(_external=True), - self.rsvp.project.title, - self.rsvp.project.start_at, - self.rsvp.project.location, - self.rsvp.project.primary_venue, - self.rsvp.participant.fullname, - ), + jsonld=email.jsonld_event_reservation(self.rsvp), ) def sms(