Add summary to content
This commit is contained in:
parent
299a6342cc
commit
2012b245a8
3 changed files with 18 additions and 4 deletions
|
@ -9,7 +9,7 @@ from wagtail.fields import StreamField
|
||||||
from wagtail.images import get_image_model_string
|
from wagtail.images import get_image_model_string
|
||||||
from wagtail.models import Page
|
from wagtail.models import Page
|
||||||
|
|
||||||
from .streamfield import get_blocks, get_word_count
|
from .streamfield import get_blocks, get_word_count, truncate_streamfield
|
||||||
from .utils import TocEntry, get_table_of_contents
|
from .utils import TocEntry, get_table_of_contents
|
||||||
|
|
||||||
|
|
||||||
|
@ -63,6 +63,10 @@ class BaseContentMixin(models.Model):
|
||||||
def word_count(self) -> int:
|
def word_count(self) -> int:
|
||||||
return get_word_count(self.body)
|
return get_word_count(self.body)
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def summary(self) -> str:
|
||||||
|
return truncate_streamfield(self.body, 50)
|
||||||
|
|
||||||
|
|
||||||
class ContentPage(BasePage, BaseContentMixin): # type: ignore[misc]
|
class ContentPage(BasePage, BaseContentMixin): # type: ignore[misc]
|
||||||
subpage_types: list[Any] = []
|
subpage_types: list[Any] = []
|
||||||
|
|
|
@ -6,7 +6,7 @@ from django.utils.text import smart_split
|
||||||
from wagtail import blocks
|
from wagtail import blocks
|
||||||
from wagtail.embeds.blocks import EmbedBlock
|
from wagtail.embeds.blocks import EmbedBlock
|
||||||
|
|
||||||
IGNORE_WORDCOUNT_BLOCKS = (blocks.RawHTMLBlock, EmbedBlock)
|
IGNORE_PLAINTEXT_BLOCKS = (blocks.RawHTMLBlock, EmbedBlock)
|
||||||
|
|
||||||
|
|
||||||
class LoremBlock(blocks.StructBlock):
|
class LoremBlock(blocks.StructBlock):
|
||||||
|
@ -35,11 +35,21 @@ def get_blocks() -> list[tuple[str, blocks.BaseBlock]]:
|
||||||
|
|
||||||
def get_plain_text(value: blocks.StreamValue) -> Iterator[str]:
|
def get_plain_text(value: blocks.StreamValue) -> Iterator[str]:
|
||||||
for block in value:
|
for block in value:
|
||||||
if isinstance(block.block_type, IGNORE_WORDCOUNT_BLOCKS):
|
if isinstance(block.block_type, IGNORE_PLAINTEXT_BLOCKS):
|
||||||
continue
|
continue
|
||||||
yield strip_tags(str(block))
|
yield strip_tags(str(block))
|
||||||
|
|
||||||
|
|
||||||
|
def truncate_streamfield(value: blocks.StreamValue, words: int) -> str:
|
||||||
|
collected_words: list[str] = []
|
||||||
|
for block_text in get_plain_text(value):
|
||||||
|
collected_words.extend(smart_split(block_text))
|
||||||
|
if len(collected_words) >= words:
|
||||||
|
break
|
||||||
|
|
||||||
|
return " ".join(collected_words[:words])
|
||||||
|
|
||||||
|
|
||||||
def get_word_count(value: blocks.StreamValue) -> int:
|
def get_word_count(value: blocks.StreamValue) -> int:
|
||||||
count = 0
|
count = 0
|
||||||
for chunk in get_plain_text(value):
|
for chunk in get_plain_text(value):
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<div>
|
<div>
|
||||||
<h2 class="title is-3"><a href="{% pageurl page %}">{{ page.title }}</a></h2>
|
<h2 class="title is-3"><a href="{% pageurl page %}">{{ page.title }}</a></h2>
|
||||||
{% include "common/content-details.html" %}
|
{% include "common/content-details.html" %}
|
||||||
{% lorem 1 p %}
|
<p>{{ page.summary }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue