Merge pull request #3237 from Minnozz/status-title-description

Improve OpenGraph tags for status and book pages
This commit is contained in:
Mouse Reeve 2024-02-03 07:37:00 -08:00 committed by GitHub
commit e0667c6a03
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 81 additions and 28 deletions

View file

@ -12,6 +12,8 @@ from django.db.models import Q
from django.dispatch import receiver from django.dispatch import receiver
from django.template.loader import get_template from django.template.loader import get_template
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.utils.translation import ngettext_lazy
from model_utils import FieldTracker from model_utils import FieldTracker
from model_utils.managers import InheritanceManager from model_utils.managers import InheritanceManager
@ -178,6 +180,24 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel):
"""you can't boost dms""" """you can't boost dms"""
return self.privacy in ["unlisted", "public"] return self.privacy in ["unlisted", "public"]
@property
def page_title(self):
"""title of the page when only this status is shown"""
return _("%(display_name)s's status") % {"display_name": self.user.display_name}
@property
def page_description(self):
"""description of the page in meta tags when only this status is shown"""
return None
@property
def page_image(self):
"""image to use as preview in meta tags when only this status is shown"""
if self.mention_books.exists():
book = self.mention_books.first()
return book.preview_image or book.cover
return self.user.preview_image
def to_replies(self, **kwargs): def to_replies(self, **kwargs):
"""helper function for loading AP serialized replies to a status""" """helper function for loading AP serialized replies to a status"""
return self.to_ordered_collection( return self.to_ordered_collection(
@ -301,6 +321,10 @@ class BookStatus(Status):
abstract = True abstract = True
@property
def page_image(self):
return self.book.preview_image or self.book.cover or super().page_image
class Comment(BookStatus): class Comment(BookStatus):
"""like a review but without a rating and transient""" """like a review but without a rating and transient"""
@ -332,6 +356,13 @@ class Comment(BookStatus):
activity_serializer = activitypub.Comment activity_serializer = activitypub.Comment
@property
def page_title(self):
return _("%(display_name)s's comment on %(book_title)s") % {
"display_name": self.user.display_name,
"book_title": self.book.title,
}
class Quotation(BookStatus): class Quotation(BookStatus):
"""like a review but without a rating and transient""" """like a review but without a rating and transient"""
@ -374,6 +405,13 @@ class Quotation(BookStatus):
activity_serializer = activitypub.Quotation activity_serializer = activitypub.Quotation
@property
def page_title(self):
return _("%(display_name)s's quote from %(book_title)s") % {
"display_name": self.user.display_name,
"book_title": self.book.title,
}
class Review(BookStatus): class Review(BookStatus):
"""a book review""" """a book review"""
@ -403,6 +441,13 @@ class Review(BookStatus):
"""indicate the book in question for mastodon (or w/e) users""" """indicate the book in question for mastodon (or w/e) users"""
return self.content return self.content
@property
def page_title(self):
return _("%(display_name)s's review of %(book_title)s") % {
"display_name": self.user.display_name,
"book_title": self.book.title,
}
activity_serializer = activitypub.Review activity_serializer = activitypub.Review
pure_type = "Article" pure_type = "Article"
@ -426,6 +471,18 @@ class ReviewRating(Review):
template = get_template("snippets/generated_status/rating.html") template = get_template("snippets/generated_status/rating.html")
return template.render({"book": self.book, "rating": self.rating}).strip() return template.render({"book": self.book, "rating": self.rating}).strip()
@property
def page_description(self):
return ngettext_lazy(
"%(display_name)s rated %(book_title)s: %(display_rating).1f star",
"%(display_name)s rated %(book_title)s: %(display_rating).1f stars",
"display_rating",
) % {
"display_name": self.user.display_name,
"book_title": self.book.title,
"display_rating": self.rating,
}
activity_serializer = activitypub.Rating activity_serializer = activitypub.Rating
pure_type = "Note" pure_type = "Note"

View file

@ -9,7 +9,8 @@
{% block title %}{{ book|book_title }}{% endblock %} {% block title %}{{ book|book_title }}{% endblock %}
{% block opengraph %} {% block opengraph %}
{% include 'snippets/opengraph.html' with title=book.title description=book|book_description image=book.preview_image %} {% firstof book.preview_image book.cover as book_image %}
{% include 'snippets/opengraph.html' with title=book.title description=book|book_description image=book_image %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}

View file

@ -2,13 +2,11 @@
{% load feed_page_tags %} {% load feed_page_tags %}
{% load i18n %} {% load i18n %}
{% block title %}{{ title }}{% endblock %}
{% block opengraph %} {% block opengraph %}
{% firstof status.book status.mention_books.first as book %} {% include 'snippets/opengraph.html' with image=page_image %}
{% if book %}
{% include 'snippets/opengraph.html' with image=preview %}
{% else %}
{% include 'snippets/opengraph.html' %}
{% endif %}
{% endblock %} {% endblock %}

View file

@ -1,24 +1,25 @@
{% load static %} {% load static %}
{% if preview_images_enabled is True %} {% firstof image site.preview_image as page_image %}
{% if page_image %}
<meta name="twitter:card" content="summary_large_image"> <meta name="twitter:card" content="summary_large_image">
{% if image %} <meta name="twitter:image" content="{{ media_full_url }}{{ page_image }}">
<meta name="twitter:image" content="{{ media_full_url }}{{ image }}"> <meta name="og:image" content="{{ media_full_url }}{{ page_image }}">
<meta name="og:image" content="{{ media_full_url }}{{ image }}"> {% elif site.logo %}
{% else %} <meta name="twitter:card" content="summary">
<meta name="twitter:image" content="{{ media_full_url }}{{ site.preview_image }}"> <meta name="twitter:image" content="{{ media_full_url }}{{ site.logo }}">
<meta name="og:image" content="{{ media_full_url }}{{ site.preview_image }}"> <meta name="twitter:image:alt" content="{{ site.name }} Logo">
{% endif %} <meta name="og:image" content="{{ media_full_url }}{{ site.logo }}">
{% else %} {% else %}
<meta name="twitter:card" content="summary"> <meta name="twitter:card" content="summary">
<meta name="twitter:image" content="{% if site.logo %}{{ media_full_url }}{{ site.logo }}{% else %}{% static "images/logo.png" %}{% endif %}"> <meta name="twitter:image" content="{% static "images/logo.png" %}">
<meta name="og:image" content="{% if site.logo %}{{ media_full_url }}{{ site.logo }}{% else %}{% static "images/logo.png" %}{% endif %}"> <meta name="twitter:image:alt" content="BookWyrm Logo">
<meta name="og:image" content="{% static "images/logo.png" %}">
{% endif %} {% endif %}
<meta name="twitter:image:alt" content="BookWyrm Logo">
<meta name="twitter:title" content="{% if title %}{{ title }} - {% endif %}{{ site.name }}"> <meta name="twitter:title" content="{% if title %}{{ title }} - {% endif %}{{ site.name }}">
<meta name="og:title" content="{% if title %}{{ title }} - {% endif %}{{ site.name }}"> <meta name="og:title" content="{% if title %}{{ title }} - {% endif %}{{ site.name }}">
<meta name="twitter:description" content="{% if description %}{{ description }}{% else %}{{ site.instance_tagline }}{% endif %}"> {% firstof description site.instance_tagline as description %}
<meta name="og:description" content="{% if description %}{{ description }}{% else %}{{ site.instance_tagline }}{% endif %}"> <meta name="twitter:description" content="{{ description }}">
<meta name="og:description" content="{{ description }}">

View file

@ -200,19 +200,15 @@ class Status(View):
params=[status.id, visible_thread, visible_thread], params=[status.id, visible_thread, visible_thread],
) )
preview = None
if hasattr(status, "book"):
preview = status.book.preview_image
elif status.mention_books.exists():
preview = status.mention_books.first().preview_image
data = { data = {
**feed_page_data(request.user), **feed_page_data(request.user),
**{ **{
"status": status, "status": status,
"children": children, "children": children,
"ancestors": ancestors, "ancestors": ancestors,
"preview": preview, "title": status.page_title,
"description": status.page_description,
"page_image": status.page_image,
}, },
} }
return TemplateResponse(request, "feed/status.html", data) return TemplateResponse(request, "feed/status.html", data)