From b2001195fc9d08a42b0d86aa20beda1173a6a97b Mon Sep 17 00:00:00 2001 From: Konstantin Kostov Date: Fri, 1 Mar 2024 19:44:00 +0100 Subject: [PATCH] adds resume and streaming block --- base/blocks.py | 47 ++++++++++++++++++ base/templates/base/blocks/heading_block.html | 7 +++ base/templates/base/blocks/image_block.html | 6 +++ iamkonstantin_web/settings/base.py | 1 + ...d_planets_design.2e16d0ba.fill-600x338.jpg | Bin 0 -> 20005 bytes portfolio/__init__.py | 0 portfolio/admin.py | 3 ++ portfolio/apps.py | 6 +++ portfolio/blocks.py | 39 +++++++++++++++ portfolio/migrations/0001_initial.py | 31 ++++++++++++ .../0002_alter_portfoliopage_body.py | 22 ++++++++ portfolio/migrations/__init__.py | 0 portfolio/models.py | 20 ++++++++ .../portfolio/blocks/card_block.html | 8 +++ .../blocks/featured_posts_block.html | 16 ++++++ .../templates/portfolio/portfolio_page.html | 11 ++++ portfolio/tests.py | 3 ++ portfolio/views.py | 3 ++ 18 files changed, 223 insertions(+) create mode 100644 base/blocks.py create mode 100644 base/templates/base/blocks/heading_block.html create mode 100644 base/templates/base/blocks/image_block.html create mode 100644 media/images/moon_and_planets_design.2e16d0ba.fill-600x338.jpg create mode 100644 portfolio/__init__.py create mode 100644 portfolio/admin.py create mode 100644 portfolio/apps.py create mode 100644 portfolio/blocks.py create mode 100644 portfolio/migrations/0001_initial.py create mode 100644 portfolio/migrations/0002_alter_portfoliopage_body.py create mode 100644 portfolio/migrations/__init__.py create mode 100644 portfolio/models.py create mode 100644 portfolio/templates/portfolio/blocks/card_block.html create mode 100644 portfolio/templates/portfolio/blocks/featured_posts_block.html create mode 100644 portfolio/templates/portfolio/portfolio_page.html create mode 100644 portfolio/tests.py create mode 100644 portfolio/views.py diff --git a/base/blocks.py b/base/blocks.py new file mode 100644 index 0000000..a109031 --- /dev/null +++ b/base/blocks.py @@ -0,0 +1,47 @@ +from wagtail.blocks import ( + CharBlock, + ChoiceBlock, + RichTextBlock, + StreamBlock, + StructBlock, +) +from wagtail.embeds.blocks import EmbedBlock +from wagtail.images.blocks import ImageChooserBlock + + +class ImageBlock(StructBlock): + image = ImageChooserBlock(required=True) + caption = CharBlock(required=False) + attribution = CharBlock(required=False) + + class Meta: + icon = "image" + template = "base/blocks/image_block.html" + + +class HeadingBlock(StructBlock): + heading_text = CharBlock(classname="title", required=True) + size = ChoiceBlock( + choices=[ + ("", "Select a heading size"), + ("h2", "H2"), + ("h3", "H3"), + ("h4", "H4"), + ], + blank=True, + required=False, + ) + + class Meta: + icon = "title" + template = "base/blocks/heading_block.html" + + +class BaseStreamBlock(StreamBlock): + heading_block = HeadingBlock() + paragraph_block = RichTextBlock(icon="pilcrow") + image_block = ImageBlock() + embed_block = EmbedBlock( + help_text="Insert a URL to embed. For example, https://www.youtube.com/watch?v=SGJFWirQ3ks", + icon="media", + ) \ No newline at end of file diff --git a/base/templates/base/blocks/heading_block.html b/base/templates/base/blocks/heading_block.html new file mode 100644 index 0000000..e3776a9 --- /dev/null +++ b/base/templates/base/blocks/heading_block.html @@ -0,0 +1,7 @@ +{% if self.size == 'h2' %} +

{{ self.heading_text }}

+{% elif self.size == 'h3' %} +

{{ self.heading_text }}

+{% elif self.size == 'h4' %} +

{{ self.heading_text }}

+{% endif %} \ No newline at end of file diff --git a/base/templates/base/blocks/image_block.html b/base/templates/base/blocks/image_block.html new file mode 100644 index 0000000..5355897 --- /dev/null +++ b/base/templates/base/blocks/image_block.html @@ -0,0 +1,6 @@ +{% load wagtailimages_tags %} + +
+ {% image self.image fill-600x338 loading="lazy" %} +
{{ self.caption }} - {{ self.attribution }}
+
\ No newline at end of file diff --git a/iamkonstantin_web/settings/base.py b/iamkonstantin_web/settings/base.py index 4df5c76..d2b2316 100644 --- a/iamkonstantin_web/settings/base.py +++ b/iamkonstantin_web/settings/base.py @@ -24,6 +24,7 @@ BASE_DIR = os.path.dirname(PROJECT_DIR) # Application definition INSTALLED_APPS = [ + "portfolio", "base", "blog", "home", diff --git a/media/images/moon_and_planets_design.2e16d0ba.fill-600x338.jpg b/media/images/moon_and_planets_design.2e16d0ba.fill-600x338.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f8798a4313ddb0b64fb4b5d0f52af4a28c8ad17 GIT binary patch literal 20005 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 +

{{ self.heading }}

+
{{ self.text|richtext }}
+ {% if self.image %} + {% image self.image width-480 %} + {% endif %} + \ No newline at end of file diff --git a/portfolio/templates/portfolio/blocks/featured_posts_block.html b/portfolio/templates/portfolio/blocks/featured_posts_block.html new file mode 100644 index 0000000..d3a234e --- /dev/null +++ b/portfolio/templates/portfolio/blocks/featured_posts_block.html @@ -0,0 +1,16 @@ +{% load wagtailcore_tags %} +
+

{{ self.heading }}

+ {% if self.text %} +

{{ self.text|richtext }}

+ {% endif %} + +
+ {% for page in self.posts %} +
+

{{ page.title }}

+

{{ page.specific.date }}

+
+ {% endfor %} +
+
\ No newline at end of file diff --git a/portfolio/templates/portfolio/portfolio_page.html b/portfolio/templates/portfolio/portfolio_page.html new file mode 100644 index 0000000..8e395fe --- /dev/null +++ b/portfolio/templates/portfolio/portfolio_page.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% load wagtailcore_tags wagtailimages_tags %} + +{% block body_class %}template-portfolio{% endblock %} + +{% block content %} +

{{ page.title }}

+ + {{ page.body }} +{% endblock %} \ No newline at end of file diff --git a/portfolio/tests.py b/portfolio/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/portfolio/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/portfolio/views.py b/portfolio/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/portfolio/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.