mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-11-29 13:01:08 +00:00
Use endposition
when serializing Quotation
This commit is contained in:
parent
1322a0c693
commit
ce3885d4f6
2 changed files with 34 additions and 2 deletions
|
@ -1,5 +1,6 @@
|
|||
""" models for storing different kinds of Activities """
|
||||
from dataclasses import MISSING
|
||||
from typing import Optional
|
||||
import re
|
||||
|
||||
from django.apps import apps
|
||||
|
@ -351,14 +352,22 @@ class Quotation(BookStatus):
|
|||
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
|
||||
def pure_content(self):
|
||||
"""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>', quote)
|
||||
citation = f'-- <a href="{self.book.remote_id}">"{self.book.title}"</a>'
|
||||
if self.position_mode == "PG" and self.position and (self.position > 0):
|
||||
citation += f", p. {self.position}"
|
||||
if position := self._format_position():
|
||||
citation += f", {position}"
|
||||
return f"{quote} <p>{citation}</p>{self.content}"
|
||||
|
||||
activity_serializer = activitypub.Quotation
|
||||
|
|
|
@ -306,6 +306,29 @@ class Status(TestCase):
|
|||
)
|
||||
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, *_):
|
||||
"""subclass of the base model version with a "pure" serializer"""
|
||||
status = models.Review.objects.create(
|
||||
|
|
Loading…
Reference in a new issue