wagtail-cjkcms 25.1.9__py2.py3-none-any.whl → 25.2.1__py2.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 (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,,