From b7163c30768cae3b89baa7acc75920362af92c0f Mon Sep 17 00:00:00 2001 From: Jake Howard Date: Sun, 26 Jun 2022 18:37:04 +0100 Subject: [PATCH] Create basic streamfield --- ...004_bloglistpage_body_blogpostpage_body.py | 54 +++++++++++++++++++ .../blog/templates/blog/blog_post_page.html | 4 +- .../0005_contentpage_body_listingpage_body.py | 54 +++++++++++++++++++ website/common/models.py | 4 ++ website/common/streamfield.py | 28 ++++++++++ .../common/templates/common/content_page.html | 4 +- 6 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 website/blog/migrations/0004_bloglistpage_body_blogpostpage_body.py create mode 100644 website/common/migrations/0005_contentpage_body_listingpage_body.py create mode 100644 website/common/streamfield.py diff --git a/website/blog/migrations/0004_bloglistpage_body_blogpostpage_body.py b/website/blog/migrations/0004_bloglistpage_body_blogpostpage_body.py new file mode 100644 index 0000000..3db7e57 --- /dev/null +++ b/website/blog/migrations/0004_bloglistpage_body_blogpostpage_body.py @@ -0,0 +1,54 @@ +# Generated by Django 4.0.5 on 2022-06-26 17:35 + +import wagtail.blocks +import wagtail.embeds.blocks +import wagtail.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("blog", "0003_blogpostpage_date"), + ] + + operations = [ + migrations.AddField( + model_name="bloglistpage", + name="body", + field=wagtail.fields.StreamField( + [ + ("embed", wagtail.embeds.blocks.EmbedBlock()), + ("rich_text", wagtail.blocks.RichTextBlock()), + ( + "lorem", + wagtail.blocks.StructBlock( + [("paragraphs", wagtail.blocks.IntegerBlock(min_value=1))] + ), + ), + ("html", wagtail.blocks.RawHTMLBlock()), + ], + blank=True, + use_json_field=True, + ), + ), + migrations.AddField( + model_name="blogpostpage", + name="body", + field=wagtail.fields.StreamField( + [ + ("embed", wagtail.embeds.blocks.EmbedBlock()), + ("rich_text", wagtail.blocks.RichTextBlock()), + ( + "lorem", + wagtail.blocks.StructBlock( + [("paragraphs", wagtail.blocks.IntegerBlock(min_value=1))] + ), + ), + ("html", wagtail.blocks.RawHTMLBlock()), + ], + blank=True, + use_json_field=True, + ), + ), + ] diff --git a/website/blog/templates/blog/blog_post_page.html b/website/blog/templates/blog/blog_post_page.html index e0ca9c1..31c57dd 100644 --- a/website/blog/templates/blog/blog_post_page.html +++ b/website/blog/templates/blog/blog_post_page.html @@ -1,11 +1,13 @@ {% extends "wagtail_base.html" %} +{% load wagtailcore_tags %} + {% block content %} {% include "common/hero.html" %}
- {% lorem 10 p %} + {% include_block page.body %}
{% endblock content %} diff --git a/website/common/migrations/0005_contentpage_body_listingpage_body.py b/website/common/migrations/0005_contentpage_body_listingpage_body.py new file mode 100644 index 0000000..f35538d --- /dev/null +++ b/website/common/migrations/0005_contentpage_body_listingpage_body.py @@ -0,0 +1,54 @@ +# Generated by Django 4.0.5 on 2022-06-26 17:35 + +import wagtail.blocks +import wagtail.embeds.blocks +import wagtail.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("common", "0004_listingpage"), + ] + + operations = [ + migrations.AddField( + model_name="contentpage", + name="body", + field=wagtail.fields.StreamField( + [ + ("embed", wagtail.embeds.blocks.EmbedBlock()), + ("rich_text", wagtail.blocks.RichTextBlock()), + ( + "lorem", + wagtail.blocks.StructBlock( + [("paragraphs", wagtail.blocks.IntegerBlock(min_value=1))] + ), + ), + ("html", wagtail.blocks.RawHTMLBlock()), + ], + blank=True, + use_json_field=True, + ), + ), + migrations.AddField( + model_name="listingpage", + name="body", + field=wagtail.fields.StreamField( + [ + ("embed", wagtail.embeds.blocks.EmbedBlock()), + ("rich_text", wagtail.blocks.RichTextBlock()), + ( + "lorem", + wagtail.blocks.StructBlock( + [("paragraphs", wagtail.blocks.IntegerBlock(min_value=1))] + ), + ), + ("html", wagtail.blocks.RawHTMLBlock()), + ], + blank=True, + use_json_field=True, + ), + ), + ] diff --git a/website/common/models.py b/website/common/models.py index 5cbb95c..f4e50b4 100644 --- a/website/common/models.py +++ b/website/common/models.py @@ -4,9 +4,11 @@ from django.db import models from django.http.request import HttpRequest from django.utils.functional import cached_property, classproperty from wagtail.admin.panels import FieldPanel +from wagtail.fields import StreamField from wagtail.images import get_image_model_string from wagtail.models import Page +from .streamfield import get_blocks from .utils import TocEntry, get_table_of_contents @@ -34,10 +36,12 @@ class BaseContentMixin(models.Model): hero_image = models.ForeignKey( get_image_model_string(), null=True, blank=True, on_delete=models.SET_NULL ) + body = StreamField(get_blocks(), blank=True, use_json_field=True) content_panels = [ FieldPanel("subtitle"), FieldPanel("hero_image"), + FieldPanel("body"), ] class Meta: diff --git a/website/common/streamfield.py b/website/common/streamfield.py new file mode 100644 index 0000000..13f65e7 --- /dev/null +++ b/website/common/streamfield.py @@ -0,0 +1,28 @@ +from django.utils import lorem_ipsum +from django.utils.html import format_html_join +from wagtail import blocks +from wagtail.embeds.blocks import EmbedBlock + + +class LoremBlock(blocks.StructBlock): + paragraphs = blocks.IntegerBlock(min_value=1) + + def render(self, value: dict, context: dict) -> str: + return format_html_join( + "\n\n", + "

{}

", + [(paragraph,) for paragraph in lorem_ipsum.paragraphs(value["paragraphs"])], + ) + + class Meta: + icon = "openquote" + label = "Lorem Ipsum" + + +def get_blocks() -> list[tuple[str, blocks.BaseBlock]]: + return [ + ("embed", EmbedBlock()), + ("rich_text", blocks.RichTextBlock()), + ("lorem", LoremBlock()), + ("html", blocks.RawHTMLBlock()), + ] diff --git a/website/common/templates/common/content_page.html b/website/common/templates/common/content_page.html index e0ca9c1..31c57dd 100644 --- a/website/common/templates/common/content_page.html +++ b/website/common/templates/common/content_page.html @@ -1,11 +1,13 @@ {% extends "wagtail_base.html" %} +{% load wagtailcore_tags %} + {% block content %} {% include "common/hero.html" %}
- {% lorem 10 p %} + {% include_block page.body %}
{% endblock content %}