mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-11-26 11:31: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 """
|
""" 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
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Reference in a new issue