diff --git a/.bin/install.sh b/.bin/install.sh index d6b5ae3..9f332e4 100644 --- a/.bin/install.sh +++ b/.bin/install.sh @@ -1,11 +1,11 @@ set -e -pipenv install +python -m pipenv install yarn if [ "$SKIP_MIGRATE" != "1" ]; then - pipenv run python manage.py migrate - pipenv run python manage.py preseed_transfer_table auth wagtailcore wagtailimages.image wagtaildocs search stopwatch stopwatch - pipenv run python manage.py createsuperuser + python -m pipenv run python manage.py migrate + python -m pipenv run python manage.py preseed_transfer_table auth wagtailcore wagtailimages.image wagtaildocs search stopwatch stopwatch + python -m pipenv run python manage.py createsuperuser touch stopwatch/settings/local.py fi diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 1df3466..9e95dc1 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -14,8 +14,12 @@ ARG INSTALL_NODE="true" ARG NODE_VERSION="lts/*" RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi -# Install system dependencies +# Install system dependencies RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmour -o /usr/share/keyrings/yarn-keyring.gpg \ && sed -i '1s;^deb;deb [signed-by=/usr/share/keyrings/yarn-keyring.gpg];' /etc/apt/sources.list.d/yarn.list + +# ensure GDAL is available for Django +RUN apt update && apt install -y --no-install-recommends gdal-bin libgdal-dev + RUN curl https://raw.githubusercontent.com/commonknowledge/do-app-baseimage-django-node/main/.bin/prepare.sh | /bin/bash diff --git a/.vscode/settings.json b/.vscode/settings.json index b847a8e..aced410 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,6 @@ "editor.formatOnSave": true, "[html]": { "editor.formatOnSave": false - } + }, + "python-envs.defaultEnvManager": "ms-python.python:pipenv" } diff --git a/package.json b/package.json index 6d1afbc..01540f7 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,6 @@ "react-window": "^1.8.6", "react-window-infinite-loader": "^1.0.7", "sass": "^1.69.5" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/projects/migrations/0021_alter_event_body_alter_eventtheme_body_and_more.py b/projects/migrations/0021_alter_event_body_alter_eventtheme_body_and_more.py new file mode 100644 index 0000000..213194c --- /dev/null +++ b/projects/migrations/0021_alter_event_body_alter_eventtheme_body_and_more.py @@ -0,0 +1,1321 @@ +# Generated by Django 4.1.13 on 2026-04-01 14:41 + +from django.db import migrations +import stopwatch.models.core +import wagtail.blocks +import wagtail.documents.blocks +import wagtail.fields +import wagtail.images.blocks +import wagtail.snippets.blocks + + +class Migration(migrations.Migration): + dependencies = [ + ("projects", "0020_auto_20240611_1331"), + ] + + operations = [ + migrations.AlterField( + model_name="event", + name="body", + field=wagtail.fields.StreamField( + [ + ( + "text", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ] + ), + ), + ( + "embed", + wagtail.blocks.StructBlock( + [ + ("embed_url", wagtail.blocks.URLBlock()), + ( + "fullscreen", + wagtail.blocks.BooleanBlock( + default=False, required=False + ), + ), + ] + ), + ), + ( + "downloads", + wagtail.blocks.StructBlock( + [ + ( + "documents", + wagtail.blocks.ListBlock( + wagtail.documents.blocks.DocumentChooserBlock() + ), + ) + ] + ), + ), + ( + "cta", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "form", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock( + "stopwatch.Form", required=True + ), + ), + ] + ), + ), + ( + "links", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "message", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "links", + wagtail.blocks.StreamBlock( + [ + ( + "alert", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock(), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "website", + wagtail.blocks.StructBlock( + [ + ( + "url", + wagtail.blocks.URLBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "email", + wagtail.blocks.StructBlock( + [ + ( + "address", + wagtail.blocks.EmailBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "page", + wagtail.blocks.StructBlock( + [ + ( + "page", + wagtail.blocks.PageChooserBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "newsletter_signup", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "person_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ( + "organisation_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "organisations", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Organisation + ) + ), + ), + ] + ), + ), + ( + "alert", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "calendar", + wagtail.blocks.StructBlock( + [ + ( + "site_area", + wagtail.blocks.PageChooserBlock( + help_text="Show all events in the site that are under this page. If blank, show all events on the site.", + required=False, + ), + ) + ] + ), + ), + ( + "accordion", + wagtail.blocks.StreamBlock( + [ + ( + "richtext", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ("content", wagtail.blocks.RichTextBlock()), + ] + ), + ), + ( + "people", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ( + "content", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "report", + wagtail.blocks.StructBlock( + [ + ("year", wagtail.blocks.CharBlock(required=False)), + ("title", wagtail.blocks.CharBlock()), + ( + "description", + wagtail.blocks.TextBlock(required=False), + ), + ( + "cover_image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "document", + wagtail.documents.blocks.DocumentChooserBlock(), + ), + ] + ), + ), + ], + use_json_field=None, + verbose_name="Event details", + ), + ), + migrations.AlterField( + model_name="eventtheme", + name="body", + field=wagtail.fields.StreamField( + [ + ( + "text", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ] + ), + ), + ( + "embed", + wagtail.blocks.StructBlock( + [ + ("embed_url", wagtail.blocks.URLBlock()), + ( + "fullscreen", + wagtail.blocks.BooleanBlock( + default=False, required=False + ), + ), + ] + ), + ), + ( + "downloads", + wagtail.blocks.StructBlock( + [ + ( + "documents", + wagtail.blocks.ListBlock( + wagtail.documents.blocks.DocumentChooserBlock() + ), + ) + ] + ), + ), + ( + "cta", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "form", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock( + "stopwatch.Form", required=True + ), + ), + ] + ), + ), + ( + "links", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "message", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "links", + wagtail.blocks.StreamBlock( + [ + ( + "alert", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock(), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "website", + wagtail.blocks.StructBlock( + [ + ( + "url", + wagtail.blocks.URLBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "email", + wagtail.blocks.StructBlock( + [ + ( + "address", + wagtail.blocks.EmailBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "page", + wagtail.blocks.StructBlock( + [ + ( + "page", + wagtail.blocks.PageChooserBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "newsletter_signup", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "person_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ( + "organisation_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "organisations", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Organisation + ) + ), + ), + ] + ), + ), + ( + "alert", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "calendar", + wagtail.blocks.StructBlock( + [ + ( + "site_area", + wagtail.blocks.PageChooserBlock( + help_text="Show all events in the site that are under this page. If blank, show all events on the site.", + required=False, + ), + ) + ] + ), + ), + ( + "accordion", + wagtail.blocks.StreamBlock( + [ + ( + "richtext", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ("content", wagtail.blocks.RichTextBlock()), + ] + ), + ), + ( + "people", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ( + "content", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "report", + wagtail.blocks.StructBlock( + [ + ("year", wagtail.blocks.CharBlock(required=False)), + ("title", wagtail.blocks.CharBlock()), + ( + "description", + wagtail.blocks.TextBlock(required=False), + ), + ( + "cover_image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "document", + wagtail.documents.blocks.DocumentChooserBlock(), + ), + ] + ), + ), + ], + use_json_field=None, + ), + ), + migrations.AlterField( + model_name="project", + name="body", + field=wagtail.fields.StreamField( + [ + ( + "text", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ] + ), + ), + ( + "embed", + wagtail.blocks.StructBlock( + [ + ("embed_url", wagtail.blocks.URLBlock()), + ( + "fullscreen", + wagtail.blocks.BooleanBlock( + default=False, required=False + ), + ), + ] + ), + ), + ( + "downloads", + wagtail.blocks.StructBlock( + [ + ( + "documents", + wagtail.blocks.ListBlock( + wagtail.documents.blocks.DocumentChooserBlock() + ), + ) + ] + ), + ), + ( + "cta", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "form", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock( + "stopwatch.Form", required=True + ), + ), + ] + ), + ), + ( + "links", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "message", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "links", + wagtail.blocks.StreamBlock( + [ + ( + "alert", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock(), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "website", + wagtail.blocks.StructBlock( + [ + ( + "url", + wagtail.blocks.URLBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "email", + wagtail.blocks.StructBlock( + [ + ( + "address", + wagtail.blocks.EmailBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "page", + wagtail.blocks.StructBlock( + [ + ( + "page", + wagtail.blocks.PageChooserBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "newsletter_signup", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "person_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ( + "organisation_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "organisations", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Organisation + ) + ), + ), + ] + ), + ), + ( + "alert", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "calendar", + wagtail.blocks.StructBlock( + [ + ( + "site_area", + wagtail.blocks.PageChooserBlock( + help_text="Show all events in the site that are under this page. If blank, show all events on the site.", + required=False, + ), + ) + ] + ), + ), + ( + "accordion", + wagtail.blocks.StreamBlock( + [ + ( + "richtext", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ("content", wagtail.blocks.RichTextBlock()), + ] + ), + ), + ( + "people", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ( + "content", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "report", + wagtail.blocks.StructBlock( + [ + ("year", wagtail.blocks.CharBlock(required=False)), + ("title", wagtail.blocks.CharBlock()), + ( + "description", + wagtail.blocks.TextBlock(required=False), + ), + ( + "cover_image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "document", + wagtail.documents.blocks.DocumentChooserBlock(), + ), + ] + ), + ), + ], + use_json_field=None, + ), + ), + ] diff --git a/stopwatch/migrations/0055_alter_article_body_alter_category_display_filters_and_more.py b/stopwatch/migrations/0055_alter_article_body_alter_category_display_filters_and_more.py new file mode 100644 index 0000000..b9b95e5 --- /dev/null +++ b/stopwatch/migrations/0055_alter_article_body_alter_category_display_filters_and_more.py @@ -0,0 +1,1350 @@ +# Generated by Django 4.1.13 on 2026-04-01 14:41 + +from django.db import migrations, models +import stopwatch.models.core +import wagtail.blocks +import wagtail.documents.blocks +import wagtail.fields +import wagtail.images.blocks +import wagtail.snippets.blocks + + +class Migration(migrations.Migration): + dependencies = [ + ("stopwatch", "0054_category_display_filters"), + ] + + operations = [ + migrations.AlterField( + model_name="article", + name="body", + field=wagtail.fields.StreamField( + [ + ( + "text", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ] + ), + ), + ( + "embed", + wagtail.blocks.StructBlock( + [ + ("embed_url", wagtail.blocks.URLBlock()), + ( + "fullscreen", + wagtail.blocks.BooleanBlock( + default=False, required=False + ), + ), + ] + ), + ), + ( + "downloads", + wagtail.blocks.StructBlock( + [ + ( + "documents", + wagtail.blocks.ListBlock( + wagtail.documents.blocks.DocumentChooserBlock() + ), + ) + ] + ), + ), + ( + "cta", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "form", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock( + "stopwatch.Form", required=True + ), + ), + ] + ), + ), + ( + "links", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "message", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "links", + wagtail.blocks.StreamBlock( + [ + ( + "alert", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock(), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "website", + wagtail.blocks.StructBlock( + [ + ( + "url", + wagtail.blocks.URLBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "email", + wagtail.blocks.StructBlock( + [ + ( + "address", + wagtail.blocks.EmailBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "page", + wagtail.blocks.StructBlock( + [ + ( + "page", + wagtail.blocks.PageChooserBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "newsletter_signup", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "person_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ( + "organisation_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "organisations", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Organisation + ) + ), + ), + ] + ), + ), + ( + "alert", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "calendar", + wagtail.blocks.StructBlock( + [ + ( + "site_area", + wagtail.blocks.PageChooserBlock( + help_text="Show all events in the site that are under this page. If blank, show all events on the site.", + required=False, + ), + ) + ] + ), + ), + ( + "accordion", + wagtail.blocks.StreamBlock( + [ + ( + "richtext", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ("content", wagtail.blocks.RichTextBlock()), + ] + ), + ), + ( + "people", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ( + "content", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "report", + wagtail.blocks.StructBlock( + [ + ("year", wagtail.blocks.CharBlock(required=False)), + ("title", wagtail.blocks.CharBlock()), + ( + "description", + wagtail.blocks.TextBlock(required=False), + ), + ( + "cover_image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "document", + wagtail.documents.blocks.DocumentChooserBlock(), + ), + ] + ), + ), + ], + blank=True, + use_json_field=None, + ), + ), + migrations.AlterField( + model_name="category", + name="display_filters", + field=models.BooleanField( + default=True, + help_text="Display filters on page when display mode is display all articles", + ), + ), + migrations.AlterField( + model_name="form", + name="thank_you_page", + field=wagtail.fields.StreamField( + [ + ( + "text", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ] + ), + ), + ( + "embed", + wagtail.blocks.StructBlock( + [ + ("embed_url", wagtail.blocks.URLBlock()), + ( + "fullscreen", + wagtail.blocks.BooleanBlock( + default=False, required=False + ), + ), + ] + ), + ), + ( + "downloads", + wagtail.blocks.StructBlock( + [ + ( + "documents", + wagtail.blocks.ListBlock( + wagtail.documents.blocks.DocumentChooserBlock() + ), + ) + ] + ), + ), + ( + "cta", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "form", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock( + "stopwatch.Form", required=True + ), + ), + ] + ), + ), + ( + "links", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "message", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "links", + wagtail.blocks.StreamBlock( + [ + ( + "alert", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock(), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "website", + wagtail.blocks.StructBlock( + [ + ( + "url", + wagtail.blocks.URLBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "email", + wagtail.blocks.StructBlock( + [ + ( + "address", + wagtail.blocks.EmailBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "page", + wagtail.blocks.StructBlock( + [ + ( + "page", + wagtail.blocks.PageChooserBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "newsletter_signup", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "person_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ( + "organisation_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "organisations", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Organisation + ) + ), + ), + ] + ), + ), + ( + "alert", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "calendar", + wagtail.blocks.StructBlock( + [ + ( + "site_area", + wagtail.blocks.PageChooserBlock( + help_text="Show all events in the site that are under this page. If blank, show all events on the site.", + required=False, + ), + ) + ] + ), + ), + ( + "accordion", + wagtail.blocks.StreamBlock( + [ + ( + "richtext", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ("content", wagtail.blocks.RichTextBlock()), + ] + ), + ), + ( + "people", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ( + "content", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "report", + wagtail.blocks.StructBlock( + [ + ("year", wagtail.blocks.CharBlock(required=False)), + ("title", wagtail.blocks.CharBlock()), + ( + "description", + wagtail.blocks.TextBlock(required=False), + ), + ( + "cover_image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "document", + wagtail.documents.blocks.DocumentChooserBlock(), + ), + ] + ), + ), + ], + use_json_field=None, + ), + ), + migrations.AlterField( + model_name="landingpage", + name="body", + field=wagtail.fields.StreamField( + [ + ( + "text", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ] + ), + ), + ( + "embed", + wagtail.blocks.StructBlock( + [ + ("embed_url", wagtail.blocks.URLBlock()), + ( + "fullscreen", + wagtail.blocks.BooleanBlock( + default=False, required=False + ), + ), + ] + ), + ), + ( + "downloads", + wagtail.blocks.StructBlock( + [ + ( + "documents", + wagtail.blocks.ListBlock( + wagtail.documents.blocks.DocumentChooserBlock() + ), + ) + ] + ), + ), + ( + "cta", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "form", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock( + "stopwatch.Form", required=True + ), + ), + ] + ), + ), + ( + "links", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "message", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "links", + wagtail.blocks.StreamBlock( + [ + ( + "alert", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock(), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "website", + wagtail.blocks.StructBlock( + [ + ( + "url", + wagtail.blocks.URLBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "email", + wagtail.blocks.StructBlock( + [ + ( + "address", + wagtail.blocks.EmailBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ( + "page", + wagtail.blocks.StructBlock( + [ + ( + "page", + wagtail.blocks.PageChooserBlock(), + ), + ( + "name", + wagtail.blocks.CharBlock( + required=False + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "newsletter_signup", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "h1", + "h2", + "h3", + "h4", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "embed", + "blockquote", + ], + required=False, + ), + ), + ( + "target", + wagtail.blocks.PageChooserBlock(required=True), + ), + ] + ), + ), + ( + "person_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock(required=False)), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ( + "organisation_listing", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "organisations", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Organisation + ) + ), + ), + ] + ), + ), + ( + "alert", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "content", + wagtail.blocks.RichTextBlock( + features=[ + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + ] + ), + ), + ] + ), + ), + ( + "calendar", + wagtail.blocks.StructBlock( + [ + ( + "site_area", + wagtail.blocks.PageChooserBlock( + help_text="Show all events in the site that are under this page. If blank, show all events on the site.", + required=False, + ), + ) + ] + ), + ), + ( + "accordion", + wagtail.blocks.StreamBlock( + [ + ( + "richtext", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ("content", wagtail.blocks.RichTextBlock()), + ] + ), + ), + ( + "people", + wagtail.blocks.StructBlock( + [ + ( + "title", + wagtail.blocks.CharBlock(label="Title"), + ), + ( + "content", + wagtail.blocks.StructBlock( + [ + ( + "heading", + wagtail.blocks.CharBlock( + required=False + ), + ), + ( + "people", + wagtail.blocks.ListBlock( + wagtail.snippets.blocks.SnippetChooserBlock( + stopwatch.models.core.Person + ) + ), + ), + ] + ), + ), + ] + ), + ), + ] + ), + ), + ( + "report", + wagtail.blocks.StructBlock( + [ + ("year", wagtail.blocks.CharBlock(required=False)), + ("title", wagtail.blocks.CharBlock()), + ( + "description", + wagtail.blocks.TextBlock(required=False), + ), + ( + "cover_image", + wagtail.images.blocks.ImageChooserBlock( + required=False + ), + ), + ( + "document", + wagtail.documents.blocks.DocumentChooserBlock(), + ), + ] + ), + ), + ( + "articles_list", + wagtail.blocks.StructBlock( + [ + ("heading", wagtail.blocks.CharBlock()), + ( + "site_area", + wagtail.blocks.PageChooserBlock( + page_type=["stopwatch.Category"] + ), + ), + ( + "style", + wagtail.blocks.ChoiceBlock( + choices=[("GRID", "Grid"), ("ROWS", "Rows")] + ), + ), + ] + ), + ), + ], + blank=True, + use_json_field=None, + ), + ), + ] diff --git a/stopwatch/models/components.py b/stopwatch/models/components.py index 40d4a45..ecd6596 100644 --- a/stopwatch/models/components.py +++ b/stopwatch/models/components.py @@ -205,6 +205,18 @@ class Meta: documents = ListBlock(DocumentChooserBlock()) +class ReportBlock(StructBlock): + class Meta: + icon = 'doc-full-inverse' + template = 'stopwatch/components/report.html' + + year = CharBlock(required=False) + title = CharBlock() + description = TextBlock(required=False) + cover_image = ImageChooserBlock(required=False) + document = DocumentChooserBlock() + + class CtaBlock(StructBlock): class Meta: template = 'stopwatch/components/cta.html' @@ -317,7 +329,8 @@ class Meta: ('organisation_listing', OrganisationListBlock()), ('alert', AlertBlock()), ('calendar', CalendarBlock()), - ('accordion', AccordionStreamBlock()) + ('accordion', AccordionStreamBlock()), + ('report', ReportBlock()), ) LANDING_MODULES = CONTENT_MODULES + ( diff --git a/stopwatch/templates/base.html b/stopwatch/templates/base.html index 93a2704..64e1ab7 100644 --- a/stopwatch/templates/base.html +++ b/stopwatch/templates/base.html @@ -79,9 +79,6 @@ {{settings.stopwatch.SiteSettings.tagline|richtext}}
About - Twitter - Instagram - Facebook Donate
@@ -173,9 +170,6 @@ -