wagtail-cjkcms 25.1.9__py2.py3-none-any.whl → 25.2.1__py2.py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. cjkcms/__init__.py +1 -1
  2. cjkcms/blocks/html_blocks.py +1 -0
  3. cjkcms/migrations/0022_cjkcmspage_breadcrumb_label_and_more.py +16 -7
  4. cjkcms/migrations/0023_alter_navbar_language.py +11 -4
  5. cjkcms/models/cms_models.py +3 -1
  6. cjkcms/models/integration_models.py +16 -18
  7. cjkcms/models/page_models.py +5 -0
  8. cjkcms/project_template/basic/home/blocks/__init__.py +12 -2
  9. cjkcms/project_template/basic/home/blocks/blocks.py +2 -2
  10. cjkcms/project_template/basic/home/models/cms_models.py +1 -0
  11. cjkcms/project_template/webpack/home/blocks/__init__.py +12 -2
  12. cjkcms/project_template/webpack/home/blocks/blocks.py +2 -2
  13. cjkcms/project_template/webpack/home/models/cms_models.py +1 -0
  14. cjkcms/templates/cjkcms/pages/search.html +14 -7
  15. cjkcms/templates/cjkcms/snippets/frontend_scripts.html +5 -7
  16. cjkcms/templatetags/friendly_loader.py +1 -0
  17. cjkcms/tests/media/images/test_e3WjdNA.original.png +0 -0
  18. cjkcms/tests/media/images/test_qOYmckb.original.png +0 -0
  19. cjkcms/tests/media/original_images/test_e3WjdNA.png +0 -0
  20. cjkcms/tests/media/original_images/test_qOYmckb.png +0 -0
  21. cjkcms/tests/settings.py +1 -0
  22. cjkcms/tests/test_search_blocks.py +36 -10
  23. cjkcms/tests/testapp/models.py +3 -0
  24. cjkcms/views.py +58 -15
  25. cjkcms/wagtail_hooks.py +0 -16
  26. {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/METADATA +1 -1
  27. {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/RECORD +41 -37
  28. /cjkcms/tests/media/images/{test_6zOjMLi.original.png → test_IocDjKv.original.png} +0 -0
  29. /cjkcms/tests/media/images/{test_DqyysqG.original.png → test_LH2dPwn.original.png} +0 -0
  30. /cjkcms/tests/media/images/{test_XhwqhpE.original.png → test_O3GLriA.original.png} +0 -0
  31. /cjkcms/tests/media/images/{test_erEkAMT.original.png → test_WUJDfCh.original.png} +0 -0
  32. /cjkcms/tests/media/images/{test_q64YMWd.original.png → test_ZfGlHpM.original.png} +0 -0
  33. /cjkcms/tests/media/original_images/{test_6zOjMLi.png → test_IocDjKv.png} +0 -0
  34. /cjkcms/tests/media/original_images/{test_DqyysqG.png → test_LH2dPwn.png} +0 -0
  35. /cjkcms/tests/media/original_images/{test_XhwqhpE.png → test_O3GLriA.png} +0 -0
  36. /cjkcms/tests/media/original_images/{test_erEkAMT.png → test_WUJDfCh.png} +0 -0
  37. /cjkcms/tests/media/original_images/{test_q64YMWd.png → test_ZfGlHpM.png} +0 -0
  38. {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/LICENSE +0 -0
  39. {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/WHEEL +0 -0
  40. {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/entry_points.txt +0 -0
  41. {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/top_level.txt +0 -0
cjkcms/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- VERSION = (25, 1, 9, "")
1
+ VERSION = (25, 2, 1, "")
2
2
 
3
3
  __version_info__ = VERSION
4
4
  __version__ = ".".join(map(str, VERSION[:3])) + (f"-{VERSION[3]}" if VERSION[3] else "")
@@ -6,6 +6,7 @@ HTML blocks should NOT contain more sub-blocks or sub-streamfields.
6
6
  They must be safe to nest within more robust "content blocks" without
7
7
  creating recursion.
8
8
  """
9
+
9
10
  import logging
10
11
 
11
12
  from django.utils.encoding import force_str
@@ -6,18 +6,27 @@ from django.db import migrations, models
6
6
  class Migration(migrations.Migration):
7
7
 
8
8
  dependencies = [
9
- ('cjkcms', '0021_remove_layoutsettings_navbar_color_scheme_and_more'),
9
+ ("cjkcms", "0021_remove_layoutsettings_navbar_color_scheme_and_more"),
10
10
  ]
11
11
 
12
12
  operations = [
13
13
  migrations.AddField(
14
- model_name='cjkcmspage',
15
- name='breadcrumb_label',
16
- field=models.CharField(blank=True, help_text='If empty, page title will be used.', max_length=128, verbose_name='Breadcrumb label'),
14
+ model_name="cjkcmspage",
15
+ name="breadcrumb_label",
16
+ field=models.CharField(
17
+ blank=True,
18
+ help_text="If empty, page title will be used.",
19
+ max_length=128,
20
+ verbose_name="Breadcrumb label",
21
+ ),
17
22
  ),
18
23
  migrations.AddField(
19
- model_name='cjkcmspage',
20
- name='breadcrumbs_visible',
21
- field=models.BooleanField(default=True, help_text='Show breadcrumbs in this page header. For global change, see Settings->Layout', verbose_name='Breadcrumbs'),
24
+ model_name="cjkcmspage",
25
+ name="breadcrumbs_visible",
26
+ field=models.BooleanField(
27
+ default=True,
28
+ help_text="Show breadcrumbs in this page header. For global change, see Settings->Layout",
29
+ verbose_name="Breadcrumbs",
30
+ ),
22
31
  ),
23
32
  ]
@@ -6,13 +6,20 @@ from django.db import migrations, models
6
6
  class Migration(migrations.Migration):
7
7
 
8
8
  dependencies = [
9
- ('cjkcms', '0022_cjkcmspage_breadcrumb_label_and_more'),
9
+ ("cjkcms", "0022_cjkcmspage_breadcrumb_label_and_more"),
10
10
  ]
11
11
 
12
12
  operations = [
13
13
  migrations.AlterField(
14
- model_name='navbar',
15
- name='language',
16
- field=models.CharField(blank=True, choices=[], default='_all_', help_text='Select a language to limit display to specific locale.', max_length=10, verbose_name='Show in language'),
14
+ model_name="navbar",
15
+ name="language",
16
+ field=models.CharField(
17
+ blank=True,
18
+ choices=[],
19
+ default="_all_",
20
+ help_text="Select a language to limit display to specific locale.",
21
+ max_length=10,
22
+ verbose_name="Show in language",
23
+ ),
17
24
  ),
18
25
  ]
@@ -4,6 +4,7 @@ without having to create a new page types.
4
4
  Feel free to replace this file with your own configuration,
5
5
  in your Wagtail project. Copy+paste and modify as needed.
6
6
  """
7
+
7
8
  from django.utils.translation import gettext_lazy as _
8
9
  from . import (
9
10
  CjkcmsArticlePage,
@@ -59,8 +60,8 @@ class ArticleIndexPage(CjkcmsArticleIndexPage):
59
60
 
60
61
  # Only allow ArticlePages beneath this page.
61
62
  subpage_types = ["cjkcms.ArticlePage"]
62
-
63
63
  template = "cjkcms/pages/article_index_page.html"
64
+ search_filterable = True
64
65
 
65
66
 
66
67
  class WebPage(CjkcmsWebPage):
@@ -78,3 +79,4 @@ class WebPage(CjkcmsWebPage):
78
79
  verbose_name = _("Web Page")
79
80
 
80
81
  template = "cjkcms/pages/web_page.html"
82
+ search_filterable = True
@@ -23,9 +23,9 @@ class MailchimpSubscriberIntegrationWidget(Input):
23
23
  list_library = self.build_list_library()
24
24
  ctx["widget"]["value"] = json.dumps(json_value)
25
25
  ctx["widget"]["extra_js"] = self.render_js(name, list_library, json_value)
26
- ctx["widget"][
27
- "selectable_mailchimp_lists"
28
- ] = self.get_selectable_mailchimp_lists(list_library)
26
+ ctx["widget"]["selectable_mailchimp_lists"] = (
27
+ self.get_selectable_mailchimp_lists(list_library)
28
+ )
29
29
  ctx["widget"]["stored_mailchimp_list"] = self.get_stored_mailchimp_list(
30
30
  json_value
31
31
  )
@@ -81,23 +81,21 @@ class MailchimpSubscriberIntegrationWidget(Input):
81
81
  "interest_categories": {},
82
82
  }
83
83
 
84
- list_library[mlist["id"]][
85
- "merge_fields"
86
- ] = mailchimp.get_merge_fields_for_list(mlist["id"])["merge_fields"]
87
- list_library[mlist["id"]][
88
- "interest_categories"
89
- ] = mailchimp.get_interest_categories_for_list(mlist["id"])[
90
- "categories"
91
- ]
84
+ list_library[mlist["id"]]["merge_fields"] = (
85
+ mailchimp.get_merge_fields_for_list(mlist["id"])["merge_fields"]
86
+ )
87
+ list_library[mlist["id"]]["interest_categories"] = (
88
+ mailchimp.get_interest_categories_for_list(mlist["id"])[
89
+ "categories"
90
+ ]
91
+ )
92
92
 
93
93
  for category in list_library[mlist["id"]]["interest_categories"]:
94
- category[
95
- "interests"
96
- ] = mailchimp.get_interests_for_interest_category(
97
- mlist["id"], category["id"]
98
- )[
99
- "interests"
100
- ]
94
+ category["interests"] = (
95
+ mailchimp.get_interests_for_interest_category(
96
+ mlist["id"], category["id"]
97
+ )["interests"]
98
+ )
101
99
 
102
100
  return list_library
103
101
 
@@ -373,6 +373,11 @@ class CjkcmsPage(WagtailCacheMixin, SeoMixin, Page, metaclass=CjkcmsPageMeta):
373
373
  edit_handler = TabbedInterface(panels)
374
374
  return edit_handler.bind_to_model(cls)
375
375
 
376
+ @property
377
+ def search_name(self) -> str:
378
+ """Unless override, get the verbose name of the model"""
379
+ return self._meta.verbose_name
380
+
376
381
  @property
377
382
  def breadcrumb_title(self) -> str:
378
383
  """
@@ -1,2 +1,12 @@
1
- from .blocks import EventPresentationBlock # noqa
2
- from .blocks import PROJECT_CONTENT_STREAMBLOCKS, PROJECT_LAYOUT_STREAMBLOCKS # noqa
1
+ from .blocks import HOME_CONTENT_STREAMBLOCKS, HOME_LAYOUT_STREAMBLOCKS # noqa
2
+
3
+ # from otherapp.blocks import OTHERAPP_CONTENT_STREAMBLOCKS, OTHERAPP_LAYOUT_STREAMBLOCKS # noqa
4
+
5
+
6
+ # add your own content block
7
+ PROJECT_CONTENT_STREAMBLOCKS = (
8
+ HOME_CONTENT_STREAMBLOCKS # + OTHERAPP_CONTENT_STREAMBLOCKS
9
+ )
10
+
11
+ # add your own layout blocks
12
+ PROJECT_LAYOUT_STREAMBLOCKS = HOME_LAYOUT_STREAMBLOCKS # + OTHERAPP_LAYOUT_STREAMBLOCKS
@@ -66,11 +66,11 @@ class EventPresentationBlock(BaseBlock):
66
66
 
67
67
 
68
68
  # add your own content block
69
- PROJECT_CONTENT_STREAMBLOCKS = [
69
+ HOME_CONTENT_STREAMBLOCKS = [
70
70
  ("event_presentation", EventPresentationBlock()),
71
71
  ]
72
72
 
73
73
  # add your own layout blocks
74
- PROJECT_LAYOUT_STREAMBLOCKS = [
74
+ HOME_LAYOUT_STREAMBLOCKS = [
75
75
  # ("custom_block", CustomBlock()),
76
76
  ]
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Three main creatable page types used in Cjk CMS.
3
3
  """
4
+
4
5
  from django.utils.translation import gettext_lazy as _
5
6
  from cjkcms.models import (
6
7
  CjkcmsArticlePage,
@@ -1,2 +1,12 @@
1
- from .blocks import EventPresentationBlock # noqa
2
- from .blocks import PROJECT_CONTENT_STREAMBLOCKS, PROJECT_LAYOUT_STREAMBLOCKS # noqa
1
+ from .blocks import HOME_CONTENT_STREAMBLOCKS, HOME_LAYOUT_STREAMBLOCKS # noqa
2
+
3
+ # from otherapp.blocks import OTHERAPP_CONTENT_STREAMBLOCKS, OTHERAPP_LAYOUT_STREAMBLOCKS # noqa
4
+
5
+
6
+ # add your own content block
7
+ PROJECT_CONTENT_STREAMBLOCKS = (
8
+ HOME_CONTENT_STREAMBLOCKS # + OTHERAPP_CONTENT_STREAMBLOCKS
9
+ )
10
+
11
+ # add your own layout blocks
12
+ PROJECT_LAYOUT_STREAMBLOCKS = HOME_LAYOUT_STREAMBLOCKS # + OTHERAPP_LAYOUT_STREAMBLOCKS
@@ -66,11 +66,11 @@ class EventPresentationBlock(BaseBlock):
66
66
 
67
67
 
68
68
  # add your own content block
69
- PROJECT_CONTENT_STREAMBLOCKS = [
69
+ HOME_CONTENT_STREAMBLOCKS = [
70
70
  ("event_presentation", EventPresentationBlock()),
71
71
  ]
72
72
 
73
73
  # add your own layout blocks
74
- PROJECT_LAYOUT_STREAMBLOCKS = [
74
+ HOME_LAYOUT_STREAMBLOCKS = [
75
75
  # ("custom_block", CustomBlock()),
76
76
  ]
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Three main creatable page types used in Cjk CMS.
3
3
  """
4
+
4
5
  from django.utils.translation import gettext_lazy as _
5
6
  from cjkcms.models import (
6
7
  CjkcmsArticlePage,
@@ -35,19 +35,26 @@
35
35
  </form>
36
36
  {# endif #}
37
37
 
38
- {% if pagetypes %}
38
+ {% if results_by_model %}
39
39
  {% query_update request.GET 'p' None as qs_nop %}
40
40
  <div class="mt-5">
41
41
  <ul class="nav nav-pills">
42
42
  <li class="nav-item">
43
43
  {% query_update qs_nop 't' None as qs_t %}
44
- <a class="nav-link {% if not form.t.value %}active{% endif %}" href="?{{qs_t.urlencode}}">{% trans 'All Results' %}</a>
45
- </li>
46
- {% for pt in pagetypes %}
47
- <li class="nav-item">
48
- {% query_update qs_nop 't' pt.content_type.model as qs_t %}
49
- <a class="nav-link {% if form.t.value == pt.content_type.model %}active{% endif %}" href="?{{qs_t.urlencode}}">{{pt|get_plural_name_of_class}}</a>
44
+ <a class="nav-link {% if not form.t.value %}active{% endif %}" href="?{{ qs_t.urlencode }}">{% trans 'All Results' %}</a>
50
45
  </li>
46
+ {% for key, result in results_by_model.items %}
47
+ {% if result.count > 0 %}
48
+ {% query_update qs_nop 't' key as qs_t %}
49
+ <li class="nav-item">
50
+ <a class="nav-link {% if form.t.value == key %}active{% endif %}" href="?{{ qs_t.urlencode }}">{{ result.model|get_plural_name_of_class }}
51
+ <span class="badge badge-info">
52
+ {{ result.count }}
53
+ <span class="visually-hidden">search results</span>
54
+ </span>
55
+ </a>
56
+ </li>
57
+ {% endif %}
51
58
  {% endfor %}
52
59
  </ul>
53
60
  </div>
@@ -2,13 +2,11 @@
2
2
  {% friendly_load webpack_loader %}
3
3
 
4
4
  {% if settings.cjkcms.LayoutSettings.frontend_theme == 'python-webpack' %}
5
- {% if_has_tag javascript_pack %}
6
- {% if app_name %}
7
- {% javascript_pack 'app' app_name attrs='charset="UTF-8"' %} {# you may add space-separated 'app2' etc after 'app' #}
8
- {% else %}
9
- {% javascript_pack 'app' attrs='charset="UTF-8"' %} {# you may add space-separated 'app2' etc after 'app' #}
10
- {% endif %}
11
- {% endif_has_tag %}
5
+ {% if app_name %}
6
+ {% if_has_tag javascript_pack %}{% javascript_pack 'app' app_name attrs='charset="UTF-8"' %}{% endif_has_tag %}
7
+ {% else %}
8
+ {% if_has_tag javascript_pack %}{% javascript_pack 'app' attrs='charset="UTF-8"' %}{% endif_has_tag %}
9
+ {% endif %}
12
10
  {% else %}
13
11
  <script src="{% theme_js %}"
14
12
  crossorigin="anonymous"></script>
@@ -2,6 +2,7 @@
2
2
  https://github.com/ataylor32/django-friendly-tag-loader/blob/master/src/friendlytagloader/templatetags/friendly_loader.py
3
3
  Sadly, this repo has not been updated for 3 years
4
4
  """
5
+
5
6
  import contextlib
6
7
 
7
8
  from django import template
cjkcms/tests/settings.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Settings for running tests
3
3
  """
4
+
4
5
  import os
5
6
 
6
7
  BASE_DIR = os.path.abspath(os.path.dirname(__file__))
@@ -5,6 +5,8 @@ from django.urls import reverse
5
5
  from django.test import Client, TestCase, override_settings
6
6
 
7
7
  from cjkcms.models.cms_models import ArticlePage
8
+ from wagtail.models import Locale
9
+ from wagtail.search import index as search_index
8
10
 
9
11
 
10
12
  @override_settings(
@@ -81,9 +83,12 @@ class TestSearchBlocks(TestCase):
81
83
  def create_article_page(self):
82
84
  # Get the HomePage
83
85
  home_page = Page.objects.get(path="00010001")
84
-
85
- article_page = ArticlePage(title="Test Article", body=None)
86
-
86
+ article_page = ArticlePage(
87
+ title="Test Article",
88
+ seo_title="Test Article",
89
+ locale_id=Locale.get_default().id,
90
+ body=None,
91
+ )
87
92
  home_page.add_child(instance=article_page)
88
93
  article_page.save_revision().publish()
89
94
 
@@ -92,13 +97,35 @@ class TestSearchBlocks(TestCase):
92
97
  article_page.body = content
93
98
  article_page.save_revision().publish()
94
99
 
100
+ # Manually update the search index after publishing the page
101
+ search_index.insert_or_update_object(article_page)
102
+
95
103
  def test_page_type_in_search_results(self):
96
104
  response = self.client.get(
97
105
  reverse("cjkcms_search"), {"s": "doesn't matter"}, follow=True
98
106
  )
99
107
 
100
108
  self.assertEqual(response.status_code, 200)
101
- self.assertEqual(response.context["pagetypes"][0].__name__, "ArticlePage")
109
+ self.assertIn(
110
+ "ArticlePage",
111
+ [pagetype.__name__ for pagetype in response.context["pagetypes"]],
112
+ )
113
+
114
+ def test_search_article_title(self):
115
+ # Manually update the search index after publishing the page
116
+ article_page = ArticlePage.objects.get(title="Test Article")
117
+ search_index.insert_or_update_object(article_page)
118
+
119
+ response = self.client.get(
120
+ reverse("cjkcms_search"), {"s": "Test", "t": ""}, follow=True
121
+ )
122
+ self.assertEqual(len(response.context["results"]), 1)
123
+
124
+ response = self.client.get(
125
+ reverse("cjkcms_search"), {"s": "Best Article"}, follow=True
126
+ )
127
+
128
+ self.assertEqual(len(response.context["results"]), 0)
102
129
 
103
130
  def test_search_richtext(self):
104
131
  self.set_article_body(self.block_richtext)
@@ -113,7 +140,7 @@ class TestSearchBlocks(TestCase):
113
140
  reverse("cjkcms_search"), {"s": "daisies"}, follow=True
114
141
  )
115
142
 
116
- self.assertEqual(len(response.context["results"]), 2)
143
+ self.assertEqual(len(response.context["results"]), 1)
117
144
 
118
145
  def test_search_button(self):
119
146
  self.set_article_body(self.block_button_link)
@@ -127,8 +154,7 @@ class TestSearchBlocks(TestCase):
127
154
  response = self.client.get(
128
155
  reverse("cjkcms_search"), {"s": "Benjamin"}, follow=True
129
156
  )
130
- # print(response.context["results"])
131
- self.assertEqual(len(response.context["results"]), 2)
157
+ self.assertEqual(len(response.context["results"]), 1)
132
158
 
133
159
  def test_search_html(self):
134
160
  self.set_article_body(self.block_html)
@@ -143,7 +169,7 @@ class TestSearchBlocks(TestCase):
143
169
  reverse("cjkcms_search"), {"s": "from HTML"}, follow=True
144
170
  )
145
171
 
146
- self.assertEqual(len(response.context["results"]), 2)
172
+ self.assertEqual(len(response.context["results"]), 1)
147
173
 
148
174
  def test_search_quote(self):
149
175
  self.set_article_body(self.block_quote)
@@ -158,10 +184,10 @@ class TestSearchBlocks(TestCase):
158
184
  reverse("cjkcms_search"), {"s": "quotably"}, follow=True
159
185
  )
160
186
 
161
- self.assertEqual(len(response.context["results"]), 2)
187
+ self.assertEqual(len(response.context["results"]), 1)
162
188
 
163
189
  response = self.client.get(
164
190
  reverse("cjkcms_search"), {"s": "Nobody"}, follow=True
165
191
  )
166
192
 
167
- self.assertEqual(len(response.context["results"]), 2)
193
+ self.assertEqual(len(response.context["results"]), 1)
@@ -8,12 +8,15 @@ from cjkcms.models import (
8
8
  class ProjectArticlePage(CjkcmsArticlePage):
9
9
  template = "cjkcms/pages/article_page.html"
10
10
  search_template = "cjkcms/pages/article_page.search.html"
11
+ search_filterable = True
11
12
 
12
13
 
13
14
  class ProjectArticleIndexPage(CjkcmsArticleIndexPage):
14
15
  template = "cjkcms/pages/article_index_page.html"
16
+ search_filterable = True
15
17
 
16
18
 
17
19
  class ProjectWebPage(CjkcmsWebPage):
18
20
  # use cjkcms template by default
19
21
  template = "cjkcms/pages/web_page.html"
22
+ search_filterable = True
cjkcms/views.py CHANGED
@@ -23,6 +23,32 @@ from cjkcms.models import (
23
23
  LayoutSettings,
24
24
  )
25
25
 
26
+ from wagtail.models import Locale
27
+
28
+
29
+ def search_model_backend(model, search_query, current_locale):
30
+ """
31
+ Helper function to search a specific model with the search backend.
32
+
33
+ Parameters:
34
+ - model: The model to search.
35
+ - search_query: The query string to search for.
36
+ - current_locale: The current locale for filtering pages.
37
+
38
+ Returns:
39
+ - list: Search results for the model.
40
+ """
41
+ backend = get_search_backend()
42
+ if issubclass(model, Page):
43
+ # Search only live and public pages for models that are Page subclasses
44
+ return backend.search(
45
+ search_query,
46
+ model.objects.live().public().filter(locale=current_locale),
47
+ )
48
+ else:
49
+ # Search normally for non-page models
50
+ return backend.search(search_query, model)
51
+
26
52
 
27
53
  def search(request):
28
54
  """
@@ -34,35 +60,51 @@ def search(request):
34
60
  Returns:
35
61
  HttpResponse: The rendered search results page.
36
62
  """
63
+
37
64
  search_form = SearchForm(request.GET)
38
- results = []
65
+ results = None
39
66
  results_paginated = []
40
67
  indexed_models = []
41
- for model in apps.get_models():
42
- if (
43
- issubclass(model, index.Indexed)
44
- and hasattr(model, "search_filterable")
45
- and model.search_filterable
46
- ):
47
- indexed_models.append(model)
68
+ results_by_model = {}
48
69
 
49
70
  if search_form.is_valid():
71
+ current_locale = Locale.get_active()
50
72
  search_query = search_form.cleaned_data["s"]
51
73
  search_model = search_form.cleaned_data["t"]
52
- backend = get_search_backend()
74
+ results = []
75
+ for model in apps.get_models():
76
+ if (
77
+ issubclass(model, index.Indexed)
78
+ and hasattr(model, "search_filterable")
79
+ and model.search_filterable
80
+ ):
81
+ indexed_models.append(model)
82
+
83
+ # If a specific model is selected
53
84
  if search_model and ContentType.objects.filter(model=search_model).exists():
54
85
  try:
55
86
  # If provided a model name, try to get it
56
87
  model = ContentType.objects.get(model=search_model).model_class()
57
- results = backend.search(search_query, model)
88
+ results = search_model_backend(model, search_query, current_locale)
89
+ # Store the count of results for this model
90
+ results_by_model[model._meta.model_name] = {
91
+ "model": model,
92
+ "count": results.count(),
93
+ }
58
94
  except ContentType.DoesNotExist:
59
- # Maintain existing behavior of only returning objects if the page type is real
60
- results = []
95
+ results = None
61
96
  else:
62
- results = list(Page.objects.live().search(search_query))
63
- # results=[]
97
+ # Search all indexed models
64
98
  for model in indexed_models:
65
- results += backend.search(search_query, model)
99
+ model_results = search_model_backend(
100
+ model, search_query, current_locale
101
+ )
102
+ # Store the count of results for this model
103
+ results_by_model[model._meta.model_name] = {
104
+ "model": model,
105
+ "count": model_results.count(),
106
+ }
107
+ results += model_results
66
108
  # get and paginate results
67
109
  if results:
68
110
  paginator = Paginator(
@@ -84,6 +126,7 @@ def search(request):
84
126
  "results": results,
85
127
  "pagetypes": indexed_models,
86
128
  "results_paginated": results_paginated,
129
+ "results_by_model": results_by_model,
87
130
  }
88
131
  # Render template
89
132
  return render(
cjkcms/wagtail_hooks.py CHANGED
@@ -1,5 +1,3 @@
1
- import mimetypes
2
-
3
1
  from cjkcms import __version__
4
2
  from cjkcms.draftail import (
5
3
  NewWindowExternalLinkHandler,
@@ -8,7 +6,6 @@ from cjkcms.draftail import (
8
6
  )
9
7
 
10
8
  # from cjkcms.models.admin_sidebar import NavbarSnippet, EventCalendarSnippet
11
- from django.http.response import HttpResponse
12
9
  from django.templatetags.static import static
13
10
  from django.utils.html import format_html
14
11
  from wagtail import hooks
@@ -132,19 +129,6 @@ hooks.register("after_edit_snippet", clear_wagtailcache)
132
129
  hooks.register("after_delete_snippet", clear_wagtailcache)
133
130
 
134
131
 
135
- @hooks.register("before_serve_document") # type: ignore
136
- def serve_document_directly(document, request):
137
- """
138
- This hook prevents documents from being downloaded unless
139
- specified by an <a> tag with the download attribute.
140
- """
141
- content_type, content_encoding = mimetypes.guess_type(document.filename)
142
- response = HttpResponse(document.file.read(), content_type=content_type)
143
- response["Content-Disposition"] = 'inline;filename="{0}"'.format(document.filename)
144
- response["Content-Encoding"] = str(content_encoding)
145
- return response
146
-
147
-
148
132
  class ImportExportMenuItem(MenuItem):
149
133
  def is_shown(self, request):
150
134
  return request.user.is_superuser
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: wagtail-cjkcms
3
- Version: 25.1.9
3
+ Version: 25.2.1
4
4
  Summary: Wagtail Content Management System, installable as a Django app into any Wagtail 4.1.x/5.x/6.x site.
5
5
  Author-email: Grzegorz Krol <gk@cjk.pl>
6
6
  License: BSD-3-Clause
@@ -1,4 +1,4 @@
1
- cjkcms/__init__.py,sha256=aGZRSDiPchLPuyjWkY6NLFi55X_Zkma_Kp5AfmAbEME,272
1
+ cjkcms/__init__.py,sha256=bEBeeWOE3nJUbi0p10zNZfqAjN2kANoRVEm0PFoi2TU,272
2
2
  cjkcms/apps.py,sha256=VA5Z1YerImetvN8KsjPTMSn1fSo6O1JkBJdK5y5ubJY,173
3
3
  cjkcms/fields.py,sha256=dE0DuNIjX7jhA-5GjSmR2l66EDH2kq3vuxL9WyRALCY,3191
4
4
  cjkcms/forms.py,sha256=_uu_FR8odz40lD-Rmw0tlK7-xxxa8THHfV2-1ZJYsIM,361
@@ -7,8 +7,8 @@ cjkcms/search_urls.py,sha256=92XkGTJRrQQyA061wWl1l5C0vq6INVJPXOrpcgp3aoU,125
7
7
  cjkcms/settings.py,sha256=zw8V6cMP57w-U0M5hU4a1ouRLn-q02Waip7KnTZfbpc,20109
8
8
  cjkcms/urls.py,sha256=k5tEHWI4Umi2PWvGdNJ-FZ9OCy6AS3Y2S7k5jNOpgt0,644
9
9
  cjkcms/utils.py,sha256=u4pkPxAwqH3SgyIcmvk7I5L3w-eIcz0Rphmv0Y1DRpA,2006
10
- cjkcms/views.py,sha256=NWy3pBBcLUOH6WjEJh03N2sND4oToiyiy6_spgXdUcY,4389
11
- cjkcms/wagtail_hooks.py,sha256=emfgvVN4pkUuBjvHl1mMZz8zXq3CCqAw3BlufrK4S9k,7311
10
+ cjkcms/views.py,sha256=Bl2K_hWwhxBPwkm7SeUo45qyEbrQUlMmE9tis2GQKwg,5793
11
+ cjkcms/wagtail_hooks.py,sha256=AL2laH5wvYcM7rOIqOV2RGYe8Bx0luMi_5xvT1E0xTs,6686
12
12
  cjkcms/widgets.py,sha256=2B92WkaktZC1ge4GrAMTB7VVYKnKR8qoZLAtWS2z_00,1745
13
13
  cjkcms/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  cjkcms/api/mailchimp.py,sha256=pufnnu8n-c6kkWNKy-EsRLW5LLBn8_TmYrnRSQCPFdY,2832
@@ -17,7 +17,7 @@ cjkcms/bin/cjkcms.py,sha256=i11hhB11COQhTk05y7mkeIkUYcFjhI8-QxLkN3tCxgg,5763
17
17
  cjkcms/blocks/__init__.py,sha256=a54EtWyH8UPqszlVEeOtFCvBW2WmbaW1vR4sZuN9Hf0,3542
18
18
  cjkcms/blocks/base_blocks.py,sha256=uKp6QO3iOPT4P0H0yOumvL7faPvLQK9Dj-D8iqlvqQ4,11616
19
19
  cjkcms/blocks/content_blocks.py,sha256=-bIh3BCNYx0N7iK3mpfnLOzIsSMItgpLeC9Cqg-_dTc,9759
20
- cjkcms/blocks/html_blocks.py,sha256=rXdR1uxFYDYjOXpxndItxacWstiME8CdqZgB6d5qAYE,9543
20
+ cjkcms/blocks/html_blocks.py,sha256=bDRDEresn3R87Uux7YztU2WhRnxGhJ429soOpmAd41c,9544
21
21
  cjkcms/blocks/layout_blocks.py,sha256=n2oVyL-ZQQaEA00HU6YraR59YF065o-OK7WuAahGuiw,3406
22
22
  cjkcms/blocks/searchable_html_block.py,sha256=i1rWv4vwwvZ9fxkASwPKl87-TqVHkXOFyohH3ve7pYk,171
23
23
  cjkcms/blocks/content/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -54,14 +54,14 @@ cjkcms/migrations/0018_layoutsettings_search_format.py,sha256=NURMUoMyg20hSM_IDc
54
54
  cjkcms/migrations/0019_layoutsettings_searchbox_input_class_and_more.py,sha256=SeA-oN5r9uePXOfPv57ETfGF_ZzNpv9vnkA_rmATXUY,1504
55
55
  cjkcms/migrations/0020_socialmediasettings_github_and_more.py,sha256=flCSiw6wB32wsxSln2NA66zWkxrJLhNfL1O3UInH2to,1044
56
56
  cjkcms/migrations/0021_remove_layoutsettings_navbar_color_scheme_and_more.py,sha256=lOOyu3QHjnjZY3HwXWCvUBxngm-t_sk4TvuxZ2Cq_j4,2723
57
- cjkcms/migrations/0022_cjkcmspage_breadcrumb_label_and_more.py,sha256=UqXcsDPMsJOewtU3aTl1R4ZE5I45ykiIEepQBALzno0,812
58
- cjkcms/migrations/0023_alter_navbar_language.py,sha256=TnMs5fzf-PmirNn6CgYh5pUwwHhaYKPDCjqnZqrj8Ok,547
57
+ cjkcms/migrations/0022_cjkcmspage_breadcrumb_label_and_more.py,sha256=GprAV-Z_jJ9csmrhW1lMT9g91wQ5vVVfhqhxbS96ETc,954
58
+ cjkcms/migrations/0023_alter_navbar_language.py,sha256=uXqRLfKQwFGgEDPICTo_esHmOsKgEVlGPhjc6pDDcCo,658
59
59
  cjkcms/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  cjkcms/models/__init__.py,sha256=f99GmxfFxGtQl8JvZFz8rAtklCIesLoSccyhhi2xgPU,232
61
61
  cjkcms/models/admin_sidebar.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
- cjkcms/models/cms_models.py,sha256=9U46xwPidQfUlXnuVUW5IbtphXX_8djJD4CohoP3NbU,2356
63
- cjkcms/models/integration_models.py,sha256=L29OBwLH8DfHtDplu218UGbbvL94Erk3J_R7n365zQM,6302
64
- cjkcms/models/page_models.py,sha256=-9SLMKA5KI2gMMOTaAtpr4pE2RhidilaRRzF7nnE0WI,25454
62
+ cjkcms/models/cms_models.py,sha256=leC-RKrd6GltgWcvM_3KT0guMeBt5r2YhgADFi6glzA,2414
63
+ cjkcms/models/integration_models.py,sha256=DAAgMtjErjaWKRu6yPQUoWAG-uu4qZxCg1N9FqlswAA,6280
64
+ cjkcms/models/page_models.py,sha256=tu2cvc0cyQu1I81lHv6UBk3P-xiINwzwLBLxB0gGyho,25607
65
65
  cjkcms/models/snippet_models.py,sha256=cV7nFpNfJE_JP-3g77swGgQt3szrwHlAEOXUwwYE2QY,17188
66
66
  cjkcms/models/wagtailsettings_models.py,sha256=ntgbGOquVmgbMehgV36KEiS25olqr_m5Ff7Ce7Pq61Y,23041
67
67
  cjkcms/project_template/basic/.editorconfig,sha256=1wgq7hgAUSHLfuy4Jh9BJ4ysyQL0si5UBbCu_OMz9hg,722
@@ -71,13 +71,13 @@ cjkcms/project_template/basic/README.md,sha256=KqbqIp8hHb6nW7PuQjjKL6QIsibNu3vzV
71
71
  cjkcms/project_template/basic/manage.py,sha256=a0-pofJxi3cyiildUPnerQr2NQUnJz3INLfdA5vAEBE,678
72
72
  cjkcms/project_template/basic/requirements.txt,sha256=ElqN__9IW5lZIZ0M9vKPohdcJShbrTG1oZbF_UjgJZE,123
73
73
  cjkcms/project_template/basic/home/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
- cjkcms/project_template/basic/home/blocks/__init__.py,sha256=_dufD-ss9mMATmAtrsgXG9G3Rb4W-QhH2NcMi18tQQo,137
75
- cjkcms/project_template/basic/home/blocks/blocks.py,sha256=UpEzbazb_hIVNtDyZvuiUMvwC7O7OWgCDke0wuxi9gk,2141
74
+ cjkcms/project_template/basic/home/blocks/__init__.py,sha256=Qm1MDxNmnXaY1vVISlaZu0EaySahCfzq0hvmW7ilDig,429
75
+ cjkcms/project_template/basic/home/blocks/blocks.py,sha256=YWE15PKj71bnKvqQqEqK51rTawM2lUkZ25o79b6AsyE,2135
76
76
  cjkcms/project_template/basic/home/migrations/0001_initial.py,sha256=yPFA3NfiTpYBVXzl-ZqFmo1W-JZPXX_GS2XqrkivtSQ,4981
77
77
  cjkcms/project_template/basic/home/migrations/0002_create_homepage.py,sha256=xBM1nxi18c91ojqKMNhdjTZEhaF33dWYoVZneO-GUfM,2047
78
78
  cjkcms/project_template/basic/home/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
79
  cjkcms/project_template/basic/home/models/__init__.py,sha256=Zbh266jB2tBtwC8amTyaU0mbjjxjfxxbiYt2M9ctrq8,383
80
- cjkcms/project_template/basic/home/models/cms_models.py,sha256=MXmzahhCcDla1zxdMYTKvhLtpG85iE1NSWiF522umGM,3106
80
+ cjkcms/project_template/basic/home/models/cms_models.py,sha256=W8UeJzB1ATnw-ljnQHxvFevNrUKck638_Iz-x4totmI,3107
81
81
  cjkcms/project_template/basic/home/templates/home/blocks/event_presentation.html,sha256=KUOqay0D20g6N4M4tU8gTGvpNwTP-6F34hO0DfNZ3hI,2282
82
82
  cjkcms/project_template/basic/project_name/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  cjkcms/project_template/basic/project_name/urls.py,sha256=OjM85aN8h7gmM7Haaxmcoe9RlheJ0kuQrIyElM0CzPg,911
@@ -119,13 +119,13 @@ cjkcms/project_template/webpack/frontend/webpack/webpack.config.dev.js,sha256=WH
119
119
  cjkcms/project_template/webpack/frontend/webpack/webpack.config.prod.js,sha256=FjsN0ooC51W39UhISKlsoBMevNewbCw-0Phma1MyaA8,986
120
120
  cjkcms/project_template/webpack/frontend/webpack/webpack.config.watch.js,sha256=JWJCSV0MsvN5ZRS0JiYvlYn0INpD3gVXWiCzJny5L88,1485
121
121
  cjkcms/project_template/webpack/home/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
- cjkcms/project_template/webpack/home/blocks/__init__.py,sha256=_dufD-ss9mMATmAtrsgXG9G3Rb4W-QhH2NcMi18tQQo,137
123
- cjkcms/project_template/webpack/home/blocks/blocks.py,sha256=UpEzbazb_hIVNtDyZvuiUMvwC7O7OWgCDke0wuxi9gk,2141
122
+ cjkcms/project_template/webpack/home/blocks/__init__.py,sha256=Qm1MDxNmnXaY1vVISlaZu0EaySahCfzq0hvmW7ilDig,429
123
+ cjkcms/project_template/webpack/home/blocks/blocks.py,sha256=YWE15PKj71bnKvqQqEqK51rTawM2lUkZ25o79b6AsyE,2135
124
124
  cjkcms/project_template/webpack/home/migrations/0001_initial.py,sha256=yPFA3NfiTpYBVXzl-ZqFmo1W-JZPXX_GS2XqrkivtSQ,4981
125
125
  cjkcms/project_template/webpack/home/migrations/0002_create_homepage.py,sha256=xBM1nxi18c91ojqKMNhdjTZEhaF33dWYoVZneO-GUfM,2047
126
126
  cjkcms/project_template/webpack/home/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
127
  cjkcms/project_template/webpack/home/models/__init__.py,sha256=7dlJygS5td5eLdIKd-PG5L0vM9xdTsb0yPKcVZNKSKQ,391
128
- cjkcms/project_template/webpack/home/models/cms_models.py,sha256=MXmzahhCcDla1zxdMYTKvhLtpG85iE1NSWiF522umGM,3106
128
+ cjkcms/project_template/webpack/home/models/cms_models.py,sha256=W8UeJzB1ATnw-ljnQHxvFevNrUKck638_Iz-x4totmI,3107
129
129
  cjkcms/project_template/webpack/home/templates/home/blocks/event_presentation.html,sha256=KUOqay0D20g6N4M4tU8gTGvpNwTP-6F34hO0DfNZ3hI,2282
130
130
  cjkcms/project_template/webpack/project_name/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
131
  cjkcms/project_template/webpack/project_name/urls.py,sha256=OjM85aN8h7gmM7Haaxmcoe9RlheJ0kuQrIyElM0CzPg,911
@@ -284,7 +284,7 @@ cjkcms/templates/cjkcms/pages/base.html,sha256=XqaHguBc00cllm304dY-8MMuIYxqosnZq
284
284
  cjkcms/templates/cjkcms/pages/form_page_landing.html,sha256=zdySSHOWF10-x2MFLH9XMjeFSeNTMRM-VpvZ1tM8kw0,248
285
285
  cjkcms/templates/cjkcms/pages/home_page.html,sha256=67h2o3EVXsrivMqM26OZV-7-H_9vv1clFJ4MFMknIMU,50
286
286
  cjkcms/templates/cjkcms/pages/page.mini.html,sha256=VR3lTCUgHPXTd2HAlNrxQAmNjS_0VGzfQccUV5IeDXc,506
287
- cjkcms/templates/cjkcms/pages/search.html,sha256=mWpFQi5P01HAUdm7tOJAAJ2B7LbIALS4ShmbQveF_Go,3006
287
+ cjkcms/templates/cjkcms/pages/search.html,sha256=m3VyiByKmuF3YDUAMHChFYCN6zeihqjKLURZEEOI8A0,3377
288
288
  cjkcms/templates/cjkcms/pages/search_result.html,sha256=peGL-4UtHGQdYlmdUqGUX3MxZLuw4EcxY00yQFW_7Ag,582
289
289
  cjkcms/templates/cjkcms/pages/web_page.html,sha256=floOVzOyPYvTMKfWd3pY0vyrqG7jt4WS5xJt3j6gZM0,594
290
290
  cjkcms/templates/cjkcms/pages/web_page_notitle.html,sha256=HjwzN8NpJBOVjKM6_cLtPfUllotFMkvQPLXL2aoB6A0,378
@@ -293,7 +293,7 @@ cjkcms/templates/cjkcms/snippets/bottom_corner_lang_selector.html,sha256=_gcHmob
293
293
  cjkcms/templates/cjkcms/snippets/breadcrumbs.html,sha256=3flWNTJ568V4l9HTuYK5vZ7Mm6L1S0Qk8dKmQP0boDM,1342
294
294
  cjkcms/templates/cjkcms/snippets/footer.html,sha256=_QUtV_LHgGjh-XLzw5Fd_Lxdrx9on5G0luFaa6oirB0,430
295
295
  cjkcms/templates/cjkcms/snippets/frontend_assets.html,sha256=2q24FFzOiM2USJiI1tuNTdJZGvRQnMPjAwTA0AlGNiU,1656
296
- cjkcms/templates/cjkcms/snippets/frontend_scripts.html,sha256=d_NvSXFnVMsqXuGPLalE6lQrw1PLM8bWQm6zwxHVzas,717
296
+ cjkcms/templates/cjkcms/snippets/frontend_scripts.html,sha256=6mi5V8GvdsmW0TF4pcrI4XqTx4Eog7I-ffWEsgXbpYY,624
297
297
  cjkcms/templates/cjkcms/snippets/navbar.html,sha256=3J9N2g1MVMyvAaQFbkNBYSwbXp8wpOQiHQabFY6PyTc,2879
298
298
  cjkcms/templates/cjkcms/snippets/navbar_lang_selector.html,sha256=sn7KLDentGOsMZ9CNAxdAGLYO3a_mYfSUhJ6iZzteOE,836
299
299
  cjkcms/templates/cjkcms/snippets/navbar_search.html,sha256=yV6xIWQ3_BdrTEPVp3j0WKqChPui7oC0Zl3C2fUrpes,1075
@@ -313,12 +313,12 @@ cjkcms/templates/wagtailadmin/tables/thumbnail_cell.html,sha256=RzMT-tBnnDOgL-ze
313
313
  cjkcms/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
314
314
  cjkcms/templatetags/auth_extras.py,sha256=IIxQ5n9FaQVZmhW-yW1XM5p2OjIemtqVoX-O-UcCns8,327
315
315
  cjkcms/templatetags/cjkcms_tags.py,sha256=KkKQ0o1FMdIC3zPAu7rKcnT3aAlLWMxTUIkE7ehgUcg,10411
316
- cjkcms/templatetags/friendly_loader.py,sha256=Zwopb9NNNN6IuDJCMFlwKuhmJC0hi4uTPEZSAxeakYY,4962
316
+ cjkcms/templatetags/friendly_loader.py,sha256=jSGOqgAyXaN8XvbjEyvOwYAtAucnehHT8Ld4Qli5_l8,4963
317
317
  cjkcms/templatetags/gravatar.py,sha256=JG5MB6HUFso15J8gZ_te5FTMYAuo4km8rzMKKvLLh-E,1127
318
318
  cjkcms/templatetags/txtutils_tags.py,sha256=UMojdiLt6Jpijc-2QLusPc-qXX9bqFZf0JbqqPsfnWQ,1223
319
319
  cjkcms/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
320
320
  cjkcms/tests/manage.py,sha256=EUgybZlZ7xk2Zf2KCwBbK_z7gf7Ifqs0_bl4Kijhdgo,242
321
- cjkcms/tests/settings.py,sha256=WVu7tOcUH1E_DJ6YOEfi5_r5tJobUbX9O0VAmVl4ICg,2556
321
+ cjkcms/tests/settings.py,sha256=OwAx_73FfO68FcCcc6yaJQdNBd8Pz7N2YqwJ60ouPHo,2557
322
322
  cjkcms/tests/test_advsettings.py,sha256=NiXJfc5ocJgxtbbnWhzEloS2wm3ODbZCyYfsS6lRgvU,6908
323
323
  cjkcms/tests/test_articlepages.py,sha256=7V7tr2kCKiEU1y36PlB9yoP0tmSDb8cchf8VYof3GGM,4226
324
324
  cjkcms/tests/test_bin.py,sha256=z-6vMYYqhv18UO00sUPrNpLLue0mbRr5vzqisu7UKAY,3506
@@ -326,33 +326,37 @@ cjkcms/tests/test_countdown_block.py,sha256=83RgYXvOLErcswXg13WRPD-Lf5VAykx_YRb2
326
326
  cjkcms/tests/test_draftail_extensions.py,sha256=8WAf8LdvSxW7kgtJaXQ8V3rSRNkzRDc-JGnlKOWZr3k,2364
327
327
  cjkcms/tests/test_finders_oembed.py,sha256=J-dG3aTsO2KXnUA0o4yKHh_r5Za9v_8gcXJQGwJrXpI,2489
328
328
  cjkcms/tests/test_gravatar.py,sha256=UWu1cVi3Gj96yqeQu795gw6FVPbZ44eCkkH1NGEGgBo,2629
329
- cjkcms/tests/test_search_blocks.py,sha256=3xUxFX6KP_lySGcQnsmXr3YI7tXs67-YoAMxmU-BNQs,4936
329
+ cjkcms/tests/test_search_blocks.py,sha256=K6acussD7to_qttTBl4z-rAF00UJYZpd8OoeBt-T1Kc,5882
330
330
  cjkcms/tests/test_settings.py,sha256=n2B-qtaSdMJC4KuMGGx6qo5HIU73aaImbMkI_o7tK8A,2665
331
331
  cjkcms/tests/test_templatetags.py,sha256=RHaIn93G8Aa2lG3JTHSPhFOTLBa4AWXJnwXa9Us5iqI,5966
332
332
  cjkcms/tests/test_urls.py,sha256=otiKZcs1WLDQM6AOfcdZgsOGDwea1qS3VEc8Yy-FV-Q,2880
333
333
  cjkcms/tests/test_webpage.py,sha256=PvXeXbawigObsdi_YpQNuHFx3Lqi6wM3ktVHZsxYbr4,1520
334
334
  cjkcms/tests/urls.py,sha256=_ksKz7HBHJtQK3HxC9cmJMX_dt6n4alx3FXjcL-cu28,850
335
335
  cjkcms/tests/media/images/test.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
336
- cjkcms/tests/media/images/test_6zOjMLi.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
337
- cjkcms/tests/media/images/test_DqyysqG.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
338
- cjkcms/tests/media/images/test_XhwqhpE.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
339
- cjkcms/tests/media/images/test_erEkAMT.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
340
- cjkcms/tests/media/images/test_q64YMWd.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
336
+ cjkcms/tests/media/images/test_IocDjKv.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
337
+ cjkcms/tests/media/images/test_LH2dPwn.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
338
+ cjkcms/tests/media/images/test_O3GLriA.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
339
+ cjkcms/tests/media/images/test_WUJDfCh.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
340
+ cjkcms/tests/media/images/test_ZfGlHpM.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
341
+ cjkcms/tests/media/images/test_e3WjdNA.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
342
+ cjkcms/tests/media/images/test_qOYmckb.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
341
343
  cjkcms/tests/media/original_images/test.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
342
- cjkcms/tests/media/original_images/test_6zOjMLi.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
343
- cjkcms/tests/media/original_images/test_DqyysqG.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
344
- cjkcms/tests/media/original_images/test_XhwqhpE.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
345
- cjkcms/tests/media/original_images/test_erEkAMT.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
346
- cjkcms/tests/media/original_images/test_q64YMWd.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
344
+ cjkcms/tests/media/original_images/test_IocDjKv.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
345
+ cjkcms/tests/media/original_images/test_LH2dPwn.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
346
+ cjkcms/tests/media/original_images/test_O3GLriA.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
347
+ cjkcms/tests/media/original_images/test_WUJDfCh.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
348
+ cjkcms/tests/media/original_images/test_ZfGlHpM.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
349
+ cjkcms/tests/media/original_images/test_e3WjdNA.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
350
+ cjkcms/tests/media/original_images/test_qOYmckb.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
347
351
  cjkcms/tests/testapp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
348
352
  cjkcms/tests/testapp/apps.py,sha256=EwyrkWTu-_OoLoERBTlqkqfPIIrEsbHY3kbCxgrv_7I,169
349
- cjkcms/tests/testapp/models.py,sha256=Rkn9KHrGbLzrKjP4y_gwtXma1_fJOZNU7ekb689fJEU,488
353
+ cjkcms/tests/testapp/models.py,sha256=N11rFqkMqQNVagoLjmIX8BVsgfW7wFqYKiDB9gE0PTo,575
350
354
  cjkcms/tests/testapp/migrations/0001_initial.py,sha256=hxr-r-42IQEGr_OsZkxXXCW7wbxAHuI_OLOkn-seJUU,4942
351
355
  cjkcms/tests/testapp/migrations/0002_create_homepage.py,sha256=EfsxHh1oyqwahW9RVpTvaRDx_CHtFSJQahKEr7XC5Gg,1999
352
356
  cjkcms/tests/testapp/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
353
- wagtail_cjkcms-25.1.9.dist-info/LICENSE,sha256=KHsCh1fKOZzvcKe1a9h3FlDjTjK_UurO3wHK55TnHHo,1538
354
- wagtail_cjkcms-25.1.9.dist-info/METADATA,sha256=J7MDbFnXaNTVHJ3fkQwyUnQwaPM1j7jbCAZz9O8Xg0k,3120
355
- wagtail_cjkcms-25.1.9.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
356
- wagtail_cjkcms-25.1.9.dist-info/entry_points.txt,sha256=FzoiFENdZ1uebNztyz6GlswkumQspd5VjWbR9MUIH_8,50
357
- wagtail_cjkcms-25.1.9.dist-info/top_level.txt,sha256=8wJGOGo1pG5nO5akfcMzA7i3ndj5868I8w35vTT0JJM,7
358
- wagtail_cjkcms-25.1.9.dist-info/RECORD,,
357
+ wagtail_cjkcms-25.2.1.dist-info/LICENSE,sha256=KHsCh1fKOZzvcKe1a9h3FlDjTjK_UurO3wHK55TnHHo,1538
358
+ wagtail_cjkcms-25.2.1.dist-info/METADATA,sha256=sllW_2ZjE935r1eSwZWY_MjCnl5vV0Pi5KO7I0LNr-s,3120
359
+ wagtail_cjkcms-25.2.1.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
360
+ wagtail_cjkcms-25.2.1.dist-info/entry_points.txt,sha256=FzoiFENdZ1uebNztyz6GlswkumQspd5VjWbR9MUIH_8,50
361
+ wagtail_cjkcms-25.2.1.dist-info/top_level.txt,sha256=8wJGOGo1pG5nO5akfcMzA7i3ndj5868I8w35vTT0JJM,7
362
+ wagtail_cjkcms-25.2.1.dist-info/RECORD,,