mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-11-22 09:31:08 +00:00
Merge pull request #3237 from Minnozz/status-title-description
Improve OpenGraph tags for status and book pages
This commit is contained in:
commit
e0667c6a03
5 changed files with 81 additions and 28 deletions
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 }}">
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue