Use endposition when serializing Quotation

This commit is contained in:
Adeodato Simó 2023-09-17 01:40:23 -03:00
parent 1322a0c693
commit ce3885d4f6
No known key found for this signature in database
GPG key ID: CDF447845F1A986F
2 changed files with 34 additions and 2 deletions

View file

@ -1,5 +1,6 @@
""" models for storing different kinds of Activities """ """ models for storing different kinds of Activities """
from dataclasses import MISSING from dataclasses import MISSING
from typing import Optional
import re import re
from django.apps import apps from django.apps import apps
@ -351,14 +352,22 @@ class Quotation(BookStatus):
blank=True, blank=True,
) )
def _format_position(self) -> Optional[str]:
"""serialize page position"""
beg = self.position
end = self.endposition or 0
if self.position_mode != "PG" or not beg:
return None
return f"pp. {beg}-{end}" if end > beg else f"p. {beg}"
@property @property
def pure_content(self): def pure_content(self):
"""indicate the book in question for mastodon (or w/e) users""" """indicate the book in question for mastodon (or w/e) users"""
quote = re.sub(r"^<p>", '<p>"', self.quote) quote = re.sub(r"^<p>", '<p>"', self.quote)
quote = re.sub(r"</p>$", '"</p>', quote) quote = re.sub(r"</p>$", '"</p>', quote)
citation = f'-- <a href="{self.book.remote_id}">"{self.book.title}"</a>' citation = f'-- <a href="{self.book.remote_id}">"{self.book.title}"</a>'
if self.position_mode == "PG" and self.position and (self.position > 0): if position := self._format_position():
citation += f", p. {self.position}" citation += f", {position}"
return f"{quote} <p>{citation}</p>{self.content}" return f"{quote} <p>{citation}</p>{self.content}"
activity_serializer = activitypub.Quotation activity_serializer = activitypub.Quotation

View file

@ -306,6 +306,29 @@ class Status(TestCase):
) )
self.assertEqual(activity["attachment"][0]["name"], "Test Edition") self.assertEqual(activity["attachment"][0]["name"], "Test Edition")
def test_quotation_page_serialization(self, *_):
"""serialization of quotation page position"""
tests = [
("single pos", 7, None, "p. 7"),
("page range", 7, 10, "pp. 7-10"),
]
for desc, beg, end, pages in tests:
with self.subTest(desc):
status = models.Quotation.objects.create(
quote="<p>my quote</p>",
content="",
user=self.local_user,
book=self.book,
position=beg,
endposition=end,
position_mode="PG",
)
activity = status.to_activity(pure=True)
self.assertRegex(
activity["content"],
f'^<p>"my quote"</p> <p>-- <a .+</a>, {pages}</p>$',
)
def test_review_to_activity(self, *_): def test_review_to_activity(self, *_):
"""subclass of the base model version with a "pure" serializer""" """subclass of the base model version with a "pure" serializer"""
status = models.Review.objects.create( status = models.Review.objects.create(