picata 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. LICENSE.md +24 -0
  2. README.md +59 -0
  3. components/HelloWorld.tsx +11 -0
  4. entrypoint.tsx +268 -0
  5. manage.py +15 -0
  6. picata/__init__.py +1 -0
  7. picata/apps.py +33 -0
  8. picata/blocks.py +175 -0
  9. picata/helpers/__init__.py +70 -0
  10. picata/helpers/wagtail.py +61 -0
  11. picata/log_utils.py +47 -0
  12. picata/middleware.py +54 -0
  13. picata/migrations/0001_initial.py +264 -0
  14. picata/migrations/0002_alter_article_content_alter_basicpage_content.py +112 -0
  15. picata/migrations/0003_alter_article_content_alter_basicpage_content.py +104 -0
  16. picata/migrations/0004_alter_article_content_alter_basicpage_content.py +105 -0
  17. picata/migrations/0005_socialsettings.py +48 -0
  18. picata/migrations/0006_alter_article_content.py +71 -0
  19. picata/migrations/0007_splitviewpage.py +69 -0
  20. picata/migrations/0008_alter_splitviewpage_content.py +96 -0
  21. picata/migrations/0009_alter_splitviewpage_content.py +111 -0
  22. picata/migrations/0010_alter_splitviewpage_content.py +105 -0
  23. picata/migrations/0011_alter_splitviewpage_options_and_more.py +113 -0
  24. picata/migrations/0012_alter_splitviewpage_content.py +109 -0
  25. picata/migrations/0013_alter_article_content.py +43 -0
  26. picata/migrations/0014_alter_article_content_alter_article_summary.py +24 -0
  27. picata/migrations/0015_alter_article_options_article_tagline_and_more.py +28 -0
  28. picata/migrations/0016_alter_article_options_alter_articletag_options_and_more.py +33 -0
  29. picata/migrations/0017_articletagrelation_alter_article_tags_and_more.py +35 -0
  30. picata/migrations/0018_rename_articletag_pagetag_and_more.py +21 -0
  31. picata/migrations/0019_rename_name_plural_articletype__name_plural.py +18 -0
  32. picata/migrations/0020_rename__name_plural_articletype__pluralised_name.py +18 -0
  33. picata/migrations/0021_rename_article_type_article_page_type.py +18 -0
  34. picata/migrations/0022_homepage.py +28 -0
  35. picata/migrations/__init__.py +0 -0
  36. picata/models.py +486 -0
  37. picata/settings/__init__.py +1 -0
  38. picata/settings/base.py +345 -0
  39. picata/settings/dev.py +94 -0
  40. picata/settings/mypy.py +7 -0
  41. picata/settings/prod.py +12 -0
  42. picata/settings/test.py +6 -0
  43. picata/static/picata/ada-profile.jpg +0 -0
  44. picata/static/picata/ada-social-bear.jpg +0 -0
  45. picata/static/picata/favicon.ico +0 -0
  46. picata/static/picata/fonts/Bitter-Light.ttf +0 -0
  47. picata/static/picata/fonts/Bitter-LightItalic.ttf +0 -0
  48. picata/static/picata/fonts/FiraCode-Light.ttf +0 -0
  49. picata/static/picata/fonts/FiraCode-SemiBold.ttf +0 -0
  50. picata/static/picata/fonts/Sacramento-Regular.ttf +0 -0
  51. picata/static/picata/fonts/ZillaSlab-Bold.ttf +0 -0
  52. picata/static/picata/fonts/ZillaSlab-BoldItalic.ttf +0 -0
  53. picata/static/picata/fonts/ZillaSlab-Light.ttf +0 -0
  54. picata/static/picata/fonts/ZillaSlab-LightItalic.ttf +0 -0
  55. picata/static/picata/fonts/ZillaSlabHighlight-Bold.ttf +0 -0
  56. picata/static/picata/icons.svg +56 -0
  57. picata/templates/picata/3_column.html +28 -0
  58. picata/templates/picata/404.html +11 -0
  59. picata/templates/picata/500.html +13 -0
  60. picata/templates/picata/_post_list.html +24 -0
  61. picata/templates/picata/article.html +20 -0
  62. picata/templates/picata/base.html +135 -0
  63. picata/templates/picata/basic_page.html +10 -0
  64. picata/templates/picata/blocks/icon_link_item.html +7 -0
  65. picata/templates/picata/blocks/icon_link_list.html +4 -0
  66. picata/templates/picata/blocks/icon_link_list_stream.html +3 -0
  67. picata/templates/picata/dl_view.html +18 -0
  68. picata/templates/picata/home_page.html +21 -0
  69. picata/templates/picata/post_listing.html +17 -0
  70. picata/templates/picata/previews/3col.html +73 -0
  71. picata/templates/picata/previews/dl.html +10 -0
  72. picata/templates/picata/previews/split.html +10 -0
  73. picata/templates/picata/previews/theme_gallery.html +158 -0
  74. picata/templates/picata/search_results.html +28 -0
  75. picata/templates/picata/split_view.html +15 -0
  76. picata/templates/picata/tags/site_menu.html +8 -0
  77. picata/templatetags/__init__.py +1 -0
  78. picata/templatetags/absolute_static.py +15 -0
  79. picata/templatetags/menu_tags.py +42 -0
  80. picata/templatetags/stringify.py +23 -0
  81. picata/transformers.py +60 -0
  82. picata/typing/__init__.py +19 -0
  83. picata/typing/wagtail.py +31 -0
  84. picata/urls.py +48 -0
  85. picata/validators.py +36 -0
  86. picata/views.py +80 -0
  87. picata/wagtail_hooks.py +43 -0
  88. picata/wsgi.py +15 -0
  89. picata-0.0.1.dist-info/METADATA +87 -0
  90. picata-0.0.1.dist-info/RECORD +94 -0
  91. picata-0.0.1.dist-info/WHEEL +4 -0
  92. picata-0.0.1.dist-info/licenses/LICENSE.md +24 -0
  93. pygments.sass +382 -0
  94. styles.sass +300 -0
@@ -0,0 +1,113 @@
1
+ # Generated by Django 5.1.4 on 2025-01-04 00:57
2
+
3
+ import wagtail.fields
4
+ from django.db import migrations
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("hpk", "0010_alter_splitviewpage_content"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterModelOptions(
14
+ name="splitviewpage",
15
+ options={"verbose_name": "Split-View", "verbose_name_plural": "Split-Views"},
16
+ ),
17
+ migrations.AlterField(
18
+ model_name="splitviewpage",
19
+ name="content",
20
+ field=wagtail.fields.StreamField(
21
+ [("rich_text", 0), ("code", 3), ("image", 4), ("icon_link_lists", 14)],
22
+ blank=True,
23
+ block_lookup={
24
+ 0: ("wagtail.blocks.RichTextBlock", (), {}),
25
+ 1: ("wagtail.blocks.TextBlock", (), {"help_text": None, "required": True}),
26
+ 2: (
27
+ "wagtail.blocks.ChoiceBlock",
28
+ [],
29
+ {
30
+ "choices": [
31
+ ("python", "Python"),
32
+ ("javascript", "JavaScript"),
33
+ ("html", "HTML"),
34
+ ("css", "CSS"),
35
+ ("bash", "Bash"),
36
+ ("plaintext", "Plain Text"),
37
+ ],
38
+ "required": False,
39
+ },
40
+ ),
41
+ 3: ("wagtail.blocks.StructBlock", [[("code", 1), ("language", 2)]], {}),
42
+ 4: ("hpk.blocks.WrappedImageChooserBlock", (), {}),
43
+ 5: (
44
+ "wagtail.blocks.CharBlock",
45
+ (),
46
+ {
47
+ "help_text": "Optional heading for this list (e.g., Social Links).",
48
+ "required": False,
49
+ },
50
+ ),
51
+ 6: (
52
+ "wagtail.blocks.IntegerBlock",
53
+ (),
54
+ {
55
+ "default": 2,
56
+ "help_text": "Heading level for the list (1-6).",
57
+ "max_value": 6,
58
+ "min_value": 1,
59
+ "required": False,
60
+ },
61
+ ),
62
+ 7: (
63
+ "hpk.blocks.HREFBlock",
64
+ (),
65
+ {
66
+ "help_text": "An optional link field",
67
+ "max_length": 255,
68
+ "required": False,
69
+ },
70
+ ),
71
+ 8: (
72
+ "wagtail.blocks.CharBlock",
73
+ (),
74
+ {
75
+ "help_text": "The title for the list item.",
76
+ "max_length": 50,
77
+ "required": True,
78
+ },
79
+ ),
80
+ 9: (
81
+ "wagtail.blocks.CharBlock",
82
+ (),
83
+ {
84
+ "help_text": "Id of the icon in the static/icons.svg file.",
85
+ "max_length": 255,
86
+ "required": False,
87
+ },
88
+ ),
89
+ 10: (
90
+ "wagtail.blocks.StructBlock",
91
+ [[("href_block", 7), ("label", 8), ("icon", 9)]],
92
+ {},
93
+ ),
94
+ 11: ("wagtail.blocks.ListBlock", (10,), {"help_text": "The list of items."}),
95
+ 12: (
96
+ "wagtail.blocks.StructBlock",
97
+ [[("heading", 5), ("heading_level", 6), ("items", 11)]],
98
+ {},
99
+ ),
100
+ 13: (
101
+ "wagtail.blocks.StreamBlock",
102
+ [[("link_list", 12)]],
103
+ {
104
+ "help_text": "Add one or more heading-and-link-list blocks.",
105
+ "required": False,
106
+ },
107
+ ),
108
+ 14: ("wagtail.blocks.StructBlock", [[("lists", 13)]], {}),
109
+ },
110
+ help_text="Main content for the split-view page.",
111
+ ),
112
+ ),
113
+ ]
@@ -0,0 +1,109 @@
1
+ # Generated by Django 5.1.4 on 2025-01-04 02:55
2
+
3
+ import wagtail.fields
4
+ from django.db import migrations
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("hpk", "0011_alter_splitviewpage_options_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="splitviewpage",
15
+ name="content",
16
+ field=wagtail.fields.StreamField(
17
+ [("rich_text", 0), ("code", 3), ("image", 4), ("icon_link_lists", 14)],
18
+ blank=True,
19
+ block_lookup={
20
+ 0: ("wagtail.blocks.RichTextBlock", (), {}),
21
+ 1: ("wagtail.blocks.TextBlock", (), {"help_text": None, "required": True}),
22
+ 2: (
23
+ "wagtail.blocks.ChoiceBlock",
24
+ [],
25
+ {
26
+ "choices": [
27
+ ("python", "Python"),
28
+ ("javascript", "JavaScript"),
29
+ ("html", "HTML"),
30
+ ("css", "CSS"),
31
+ ("bash", "Bash"),
32
+ ("plaintext", "Plain Text"),
33
+ ],
34
+ "required": False,
35
+ },
36
+ ),
37
+ 3: ("wagtail.blocks.StructBlock", [[("code", 1), ("language", 2)]], {}),
38
+ 4: ("hpk.blocks.WrappedImageChooserBlock", (), {}),
39
+ 5: (
40
+ "wagtail.blocks.CharBlock",
41
+ (),
42
+ {
43
+ "help_text": "Optional heading for this list (e.g., Social Links).",
44
+ "required": False,
45
+ },
46
+ ),
47
+ 6: (
48
+ "wagtail.blocks.IntegerBlock",
49
+ (),
50
+ {
51
+ "default": 2,
52
+ "help_text": "Heading level for the list (1-6).",
53
+ "max_value": 6,
54
+ "min_value": 1,
55
+ "required": False,
56
+ },
57
+ ),
58
+ 7: (
59
+ "hpk.blocks.HREFBlock",
60
+ (),
61
+ {
62
+ "help_text": "An optional link field",
63
+ "max_length": 255,
64
+ "required": False,
65
+ },
66
+ ),
67
+ 8: (
68
+ "wagtail.blocks.CharBlock",
69
+ (),
70
+ {
71
+ "help_text": "The title for the list item.",
72
+ "max_length": 50,
73
+ "required": True,
74
+ },
75
+ ),
76
+ 9: (
77
+ "wagtail.blocks.CharBlock",
78
+ (),
79
+ {
80
+ "help_text": "Id of the icon in the static/icons.svg file.",
81
+ "max_length": 255,
82
+ "required": False,
83
+ },
84
+ ),
85
+ 10: (
86
+ "wagtail.blocks.StructBlock",
87
+ [[("href", 7), ("label", 8), ("icon", 9)]],
88
+ {},
89
+ ),
90
+ 11: ("wagtail.blocks.ListBlock", (10,), {"help_text": "The list of items."}),
91
+ 12: (
92
+ "wagtail.blocks.StructBlock",
93
+ [[("heading", 5), ("heading_level", 6), ("items", 11)]],
94
+ {},
95
+ ),
96
+ 13: (
97
+ "wagtail.blocks.StreamBlock",
98
+ [[("link_list", 12)]],
99
+ {
100
+ "help_text": "Add one or more heading-and-link-list blocks.",
101
+ "required": False,
102
+ },
103
+ ),
104
+ 14: ("wagtail.blocks.StructBlock", [[("lists", 13)]], {}),
105
+ },
106
+ help_text="Main content for the split-view page.",
107
+ ),
108
+ ),
109
+ ]
@@ -0,0 +1,43 @@
1
+ # Generated by Django 5.1.4 on 2025-01-08 07:12
2
+
3
+ import wagtail.fields
4
+ from django.db import migrations
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("hpk", "0012_alter_splitviewpage_content"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="article",
15
+ name="content",
16
+ field=wagtail.fields.StreamField(
17
+ [("section", 0), ("code", 3), ("image", 4)],
18
+ blank=True,
19
+ block_lookup={
20
+ 0: ("wagtail.blocks.RichTextBlock", (), {}),
21
+ 1: ("wagtail.blocks.TextBlock", (), {"help_text": None, "required": True}),
22
+ 2: (
23
+ "wagtail.blocks.ChoiceBlock",
24
+ [],
25
+ {
26
+ "choices": [
27
+ ("python", "Python"),
28
+ ("javascript", "JavaScript"),
29
+ ("html", "HTML"),
30
+ ("css", "CSS"),
31
+ ("bash", "Bash"),
32
+ ("plaintext", "Plain Text"),
33
+ ],
34
+ "required": False,
35
+ },
36
+ ),
37
+ 3: ("wagtail.blocks.StructBlock", [[("code", 1), ("language", 2)]], {}),
38
+ 4: ("wagtail.images.blocks.ImageChooserBlock", (), {}),
39
+ },
40
+ help_text="Main content for the article.",
41
+ ),
42
+ ),
43
+ ]
@@ -0,0 +1,24 @@
1
+ # Generated by Django 5.1.4 on 2025-01-08 23:41
2
+
3
+ import wagtail.fields
4
+ from django.db import migrations
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('hpk', '0013_alter_article_content'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name='article',
16
+ name='content',
17
+ field=wagtail.fields.StreamField([('rich_text', 0), ('code', 3), ('image', 4)], blank=True, block_lookup={0: ('wagtail.blocks.RichTextBlock', (), {}), 1: ('wagtail.blocks.TextBlock', (), {'help_text': None, 'required': True}), 2: ('wagtail.blocks.ChoiceBlock', [], {'choices': [('python', 'Python'), ('javascript', 'JavaScript'), ('html', 'HTML'), ('css', 'CSS'), ('bash', 'Bash'), ('plaintext', 'Plain Text')], 'required': False}), 3: ('wagtail.blocks.StructBlock', [[('code', 1), ('language', 2)]], {}), 4: ('wagtail.images.blocks.ImageChooserBlock', (), {})}, help_text='Main content for the article.'),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name='article',
21
+ name='summary',
22
+ field=wagtail.fields.RichTextField(blank=True, help_text='A summary, to be displayed in previews.'),
23
+ ),
24
+ ]
@@ -0,0 +1,28 @@
1
+ # Generated by Django 5.1.4 on 2025-01-08 23:52
2
+
3
+ import wagtail.fields
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('hpk', '0014_alter_article_content_alter_article_summary'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterModelOptions(
15
+ name='article',
16
+ options={'verbose_name': 'article', 'verbose_name_plural': 'articles'},
17
+ ),
18
+ migrations.AddField(
19
+ model_name='article',
20
+ name='tagline',
21
+ field=models.CharField(blank=True, help_text='A short tagline for the article.'),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name='article',
25
+ name='summary',
26
+ field=wagtail.fields.RichTextField(blank=True, help_text='A summary to be displayed in previews.'),
27
+ ),
28
+ ]
@@ -0,0 +1,33 @@
1
+ # Generated by Django 5.1.4 on 2025-01-09 00:27
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('hpk', '0015_alter_article_options_article_tagline_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterModelOptions(
14
+ name='article',
15
+ options={},
16
+ ),
17
+ migrations.AlterModelOptions(
18
+ name='articletag',
19
+ options={},
20
+ ),
21
+ migrations.AlterModelOptions(
22
+ name='basicpage',
23
+ options={},
24
+ ),
25
+ migrations.AlterModelOptions(
26
+ name='postgrouppage',
27
+ options={'verbose_name': 'post listing', 'verbose_name_plural': 'post listings'},
28
+ ),
29
+ migrations.AlterModelOptions(
30
+ name='splitviewpage',
31
+ options={'verbose_name': 'split-view page', 'verbose_name_plural': 'split-view pages'},
32
+ ),
33
+ ]
@@ -0,0 +1,35 @@
1
+ # Generated by Django 5.1.4 on 2025-01-10 02:28
2
+
3
+ import django.db.models.deletion
4
+ import modelcluster.contrib.taggit
5
+ import modelcluster.fields
6
+ from django.db import migrations, models
7
+
8
+
9
+ class Migration(migrations.Migration):
10
+
11
+ dependencies = [
12
+ ('hpk', '0016_alter_article_options_alter_articletag_options_and_more'),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name='ArticleTagRelation',
18
+ fields=[
19
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
20
+ ('content_object', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='tagged_items', to='hpk.article')),
21
+ ('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tagged_items', to='hpk.articletag')),
22
+ ],
23
+ options={
24
+ 'abstract': False,
25
+ },
26
+ ),
27
+ migrations.AlterField(
28
+ model_name='article',
29
+ name='tags',
30
+ field=modelcluster.contrib.taggit.ClusterTaggableManager(blank=True, help_text='Tags for the article.', through='hpk.ArticleTagRelation', to='hpk.ArticleTag', verbose_name='Tags'),
31
+ ),
32
+ migrations.DeleteModel(
33
+ name='ArticleTagItem',
34
+ ),
35
+ ]
@@ -0,0 +1,21 @@
1
+ # Generated by Django 5.1.4 on 2025-01-14 01:13
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('hpk', '0017_articletagrelation_alter_article_tags_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RenameModel(
14
+ old_name='ArticleTag',
15
+ new_name='PageTag',
16
+ ),
17
+ migrations.RenameModel(
18
+ old_name='ArticleTagRelation',
19
+ new_name='PageTagRelation',
20
+ ),
21
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.1.5 on 2025-01-18 01:31
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('hpk', '0018_rename_articletag_pagetag_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RenameField(
14
+ model_name='articletype',
15
+ old_name='name_plural',
16
+ new_name='_name_plural',
17
+ ),
18
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.1.5 on 2025-01-18 01:34
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('hpk', '0019_rename_name_plural_articletype__name_plural'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RenameField(
14
+ model_name='articletype',
15
+ old_name='_name_plural',
16
+ new_name='_Pluralised_name',
17
+ ),
18
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.1.5 on 2025-01-18 03:04
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('hpk', '0020_rename__name_plural_articletype__pluralised_name'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RenameField(
14
+ model_name='article',
15
+ old_name='article_type',
16
+ new_name='page_type',
17
+ ),
18
+ ]
@@ -0,0 +1,28 @@
1
+ # Generated by Django 5.1.5 on 2025-01-20 04:02
2
+
3
+ import django.db.models.deletion
4
+ import wagtail.fields
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ('hpk', '0021_rename_article_type_article_page_type'),
12
+ ('wagtailcore', '0094_alter_page_locale'),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name='HomePage',
18
+ fields=[
19
+ ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
20
+ ('top_content', wagtail.fields.StreamField([('rich_text', 0), ('image', 1), ('icon_link_lists', 11)], blank=True, block_lookup={0: ('wagtail.blocks.RichTextBlock', (), {}), 1: ('hpk.blocks.WrappedImageChooserBlock', (), {}), 2: ('wagtail.blocks.CharBlock', (), {'help_text': 'Optional heading for this list (e.g., Social Links).', 'required': False}), 3: ('wagtail.blocks.IntegerBlock', (), {'default': 2, 'help_text': 'Heading level for the list (1-6).', 'max_value': 6, 'min_value': 1, 'required': False}), 4: ('hpk.blocks.HREFBlock', (), {'help_text': 'An optional link field', 'max_length': 255, 'required': False}), 5: ('wagtail.blocks.CharBlock', (), {'help_text': 'The title for the list item.', 'max_length': 50, 'required': True}), 6: ('wagtail.blocks.CharBlock', (), {'help_text': 'Id of the icon in the static/icons.svg file.', 'max_length': 255, 'required': False}), 7: ('wagtail.blocks.StructBlock', [[('href', 4), ('label', 5), ('icon', 6)]], {}), 8: ('wagtail.blocks.ListBlock', (7,), {'help_text': 'The list of items.'}), 9: ('wagtail.blocks.StructBlock', [[('heading', 2), ('heading_level', 3), ('items', 8)]], {}), 10: ('wagtail.blocks.StreamBlock', [[('link_list', 9)]], {'help_text': 'Add one or more heading-and-link-list blocks.', 'required': False}), 11: ('wagtail.blocks.StructBlock', [[('lists', 10)]], {})}, help_text="Content stream above 'Recent posts'")),
21
+ ('bottom_content', wagtail.fields.StreamField([('rich_text', 0), ('image', 1), ('icon_link_lists', 11)], blank=True, block_lookup={0: ('wagtail.blocks.RichTextBlock', (), {}), 1: ('hpk.blocks.WrappedImageChooserBlock', (), {}), 2: ('wagtail.blocks.CharBlock', (), {'help_text': 'Optional heading for this list (e.g., Social Links).', 'required': False}), 3: ('wagtail.blocks.IntegerBlock', (), {'default': 2, 'help_text': 'Heading level for the list (1-6).', 'max_value': 6, 'min_value': 1, 'required': False}), 4: ('hpk.blocks.HREFBlock', (), {'help_text': 'An optional link field', 'max_length': 255, 'required': False}), 5: ('wagtail.blocks.CharBlock', (), {'help_text': 'The title for the list item.', 'max_length': 50, 'required': True}), 6: ('wagtail.blocks.CharBlock', (), {'help_text': 'Id of the icon in the static/icons.svg file.', 'max_length': 255, 'required': False}), 7: ('wagtail.blocks.StructBlock', [[('href', 4), ('label', 5), ('icon', 6)]], {}), 8: ('wagtail.blocks.ListBlock', (7,), {'help_text': 'The list of items.'}), 9: ('wagtail.blocks.StructBlock', [[('heading', 2), ('heading_level', 3), ('items', 8)]], {}), 10: ('wagtail.blocks.StreamBlock', [[('link_list', 9)]], {'help_text': 'Add one or more heading-and-link-list blocks.', 'required': False}), 11: ('wagtail.blocks.StructBlock', [[('lists', 10)]], {})}, help_text="Content stream rendered under 'Recent posts'")),
22
+ ],
23
+ options={
24
+ 'verbose_name': 'home page',
25
+ },
26
+ bases=('wagtailcore.page',),
27
+ ),
28
+ ]
File without changes