wagtail-cjkcms 25.1.10__py2.py3-none-any.whl → 25.2.2__py2.py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) 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/migrations/0024_remove_cjkcmspage_struct_org_actions_and_more.py +80 -0
  6. cjkcms/models/cms_models.py +3 -1
  7. cjkcms/models/integration_models.py +16 -18
  8. cjkcms/models/page_models.py +9 -4
  9. cjkcms/project_template/basic/home/blocks/__init__.py +12 -2
  10. cjkcms/project_template/basic/home/blocks/blocks.py +2 -2
  11. cjkcms/project_template/basic/home/models/cms_models.py +1 -0
  12. cjkcms/project_template/webpack/home/blocks/__init__.py +12 -2
  13. cjkcms/project_template/webpack/home/blocks/blocks.py +2 -2
  14. cjkcms/project_template/webpack/home/models/cms_models.py +1 -0
  15. cjkcms/templates/cjkcms/blocks/cardgrid_columns.html +3 -1
  16. cjkcms/templates/cjkcms/blocks/cardgrid_deck.html +2 -1
  17. cjkcms/templates/cjkcms/blocks/cardgrid_group.html +2 -1
  18. cjkcms/templates/cjkcms/blocks/cardgrid_zero.html +2 -1
  19. cjkcms/templates/cjkcms/blocks/pagelist_article_card_deck.html +1 -2
  20. cjkcms/templates/cjkcms/blocks/pagelist_article_card_group.html +4 -1
  21. cjkcms/templates/cjkcms/blocks/pagelist_article_media.html +4 -1
  22. cjkcms/templates/cjkcms/blocks/pagelist_block.html +4 -1
  23. cjkcms/templates/cjkcms/blocks/pagelist_list_group.html +4 -1
  24. cjkcms/templates/cjkcms/blocks/pagelist_toc_nextprev.html +4 -5
  25. cjkcms/templates/cjkcms/pages/search.html +14 -7
  26. cjkcms/templates/cjkcms/widgets/checkbox_classifiers.html +1 -5
  27. cjkcms/templatetags/friendly_loader.py +1 -0
  28. cjkcms/tests/settings.py +1 -0
  29. cjkcms/tests/test_search_blocks.py +36 -10
  30. cjkcms/tests/test_settings.py +17 -6
  31. cjkcms/tests/testapp/models.py +3 -0
  32. cjkcms/utils/__init__.py +2 -0
  33. cjkcms/utils/richtext.py +16 -0
  34. cjkcms/{utils.py → utils/visibility.py} +0 -16
  35. cjkcms/views.py +58 -15
  36. cjkcms/wagtail_hooks.py +0 -16
  37. {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/METADATA +2 -2
  38. {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/RECORD +54 -63
  39. cjkcms/tests/media/images/test_XhwqhpE.original.png +0 -0
  40. cjkcms/tests/media/images/test_ef9wMOI.original.png +0 -0
  41. cjkcms/tests/media/images/test_erEkAMT.original.png +0 -0
  42. cjkcms/tests/media/images/test_q64YMWd.original.png +0 -0
  43. cjkcms/tests/media/images/test_xDdLBw1.original.png +0 -0
  44. cjkcms/tests/media/images/test_xtSZp5Z.original.png +0 -0
  45. cjkcms/tests/media/original_images/test_XhwqhpE.png +0 -0
  46. cjkcms/tests/media/original_images/test_ef9wMOI.png +0 -0
  47. cjkcms/tests/media/original_images/test_erEkAMT.png +0 -0
  48. cjkcms/tests/media/original_images/test_q64YMWd.png +0 -0
  49. cjkcms/tests/media/original_images/test_xDdLBw1.png +0 -0
  50. cjkcms/tests/media/original_images/test_xtSZp5Z.png +0 -0
  51. /cjkcms/tests/media/images/{test_0djPZwc.original.png → test_3NMwZ9L.original.png} +0 -0
  52. /cjkcms/tests/media/images/{test_6zOjMLi.original.png → test_AGrWgX3.original.png} +0 -0
  53. /cjkcms/tests/media/images/{test_CWdn4xd.original.png → test_TpkZkXF.original.png} +0 -0
  54. /cjkcms/tests/media/images/{test_DqyysqG.original.png → test_cOs0NW2.original.png} +0 -0
  55. /cjkcms/tests/media/images/{test_J846ST8.original.png → test_sCFpDtv.original.png} +0 -0
  56. /cjkcms/tests/media/images/{test_WP0MnOi.original.png → test_w289mH5.original.png} +0 -0
  57. /cjkcms/tests/media/original_images/{test_0djPZwc.png → test_3NMwZ9L.png} +0 -0
  58. /cjkcms/tests/media/original_images/{test_6zOjMLi.png → test_AGrWgX3.png} +0 -0
  59. /cjkcms/tests/media/original_images/{test_CWdn4xd.png → test_TpkZkXF.png} +0 -0
  60. /cjkcms/tests/media/original_images/{test_DqyysqG.png → test_cOs0NW2.png} +0 -0
  61. /cjkcms/tests/media/original_images/{test_J846ST8.png → test_sCFpDtv.png} +0 -0
  62. /cjkcms/tests/media/original_images/{test_WP0MnOi.png → test_w289mH5.png} +0 -0
  63. {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/LICENSE +0 -0
  64. {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/WHEEL +0 -0
  65. {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/entry_points.txt +0 -0
  66. {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/top_level.txt +0 -0
cjkcms/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- VERSION = (25, 1, 10, "")
1
+ VERSION = (25, 2, 2, "")
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
  ]
@@ -0,0 +1,80 @@
1
+ # Generated by Django 5.1.5 on 2025-02-08 10:45
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('cjkcms', '0023_alter_navbar_language'),
11
+ ('wagtailimages', '0027_image_description'),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.RemoveField(
16
+ model_name='cjkcmspage',
17
+ name='struct_org_actions',
18
+ ),
19
+ migrations.RemoveField(
20
+ model_name='cjkcmspage',
21
+ name='struct_org_address_country',
22
+ ),
23
+ migrations.RemoveField(
24
+ model_name='cjkcmspage',
25
+ name='struct_org_address_locality',
26
+ ),
27
+ migrations.RemoveField(
28
+ model_name='cjkcmspage',
29
+ name='struct_org_address_postal',
30
+ ),
31
+ migrations.RemoveField(
32
+ model_name='cjkcmspage',
33
+ name='struct_org_address_region',
34
+ ),
35
+ migrations.RemoveField(
36
+ model_name='cjkcmspage',
37
+ name='struct_org_address_street',
38
+ ),
39
+ migrations.RemoveField(
40
+ model_name='cjkcmspage',
41
+ name='struct_org_extra_json',
42
+ ),
43
+ migrations.RemoveField(
44
+ model_name='cjkcmspage',
45
+ name='struct_org_geo_lat',
46
+ ),
47
+ migrations.RemoveField(
48
+ model_name='cjkcmspage',
49
+ name='struct_org_geo_lng',
50
+ ),
51
+ migrations.RemoveField(
52
+ model_name='cjkcmspage',
53
+ name='struct_org_hours',
54
+ ),
55
+ migrations.RemoveField(
56
+ model_name='cjkcmspage',
57
+ name='struct_org_image',
58
+ ),
59
+ migrations.RemoveField(
60
+ model_name='cjkcmspage',
61
+ name='struct_org_logo',
62
+ ),
63
+ migrations.RemoveField(
64
+ model_name='cjkcmspage',
65
+ name='struct_org_name',
66
+ ),
67
+ migrations.RemoveField(
68
+ model_name='cjkcmspage',
69
+ name='struct_org_phone',
70
+ ),
71
+ migrations.RemoveField(
72
+ model_name='cjkcmspage',
73
+ name='struct_org_type',
74
+ ),
75
+ migrations.AlterField(
76
+ model_name='cjkcmspage',
77
+ name='og_image',
78
+ field=models.ForeignKey(blank=True, help_text='Shown when linking to this page on social media. If blank, may show an image from the page, or the default from Settings > SEO.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Preview image'),
79
+ ),
80
+ ]
@@ -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
 
@@ -35,7 +35,7 @@ from wagtail.utils.decorators import cached_classmethod
35
35
  from wagtailcache.cache import WagtailCacheMixin
36
36
  from wagtailseo.models import SeoMixin, TwitterCard
37
37
 
38
- from cjkcms import utils
38
+ from cjkcms.utils.richtext import get_richtext_preview
39
39
  from cjkcms.blocks import CONTENT_STREAMBLOCKS, LAYOUT_STREAMBLOCKS
40
40
  from cjkcms.models.snippet_models import ClassifierTerm
41
41
  from cjkcms.models.wagtailsettings_models import LayoutSettings
@@ -315,8 +315,8 @@ class CjkcmsPage(WagtailCacheMixin, SeoMixin, Page, metaclass=CjkcmsPageMeta):
315
315
  ),
316
316
  ]
317
317
 
318
- promote_panels = SeoMixin.seo_meta_panels + SeoMixin.seo_struct_panels
319
-
318
+ promote_panels = SeoMixin.seo_meta_panels
319
+
320
320
  integration_panels = []
321
321
 
322
322
  def __init__(self, *args, **kwargs):
@@ -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
  """
@@ -630,7 +635,7 @@ class CjkcmsWebPage(CjkcmsPage):
630
635
  """
631
636
  A shortened version of the body without HTML tags.
632
637
  """
633
- return utils.get_richtext_preview(self.body)
638
+ return get_richtext_preview(self.body)
634
639
 
635
640
 
636
641
  class CjkcmsArticlePage(CjkcmsWebPage):
@@ -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,
@@ -2,7 +2,9 @@
2
2
  {% load wagtailcore_tags %}
3
3
 
4
4
  {% block grid_content %}
5
- <div class="row {{self.settings.custom_css_class}} position-relative" data-masonry='{"percentPosition": true }'>
5
+ <div class="row {{self.settings.custom_css_class}} position-relative"
6
+ data-masonry='{"percentPosition": true }'
7
+ {% if self.settings.custom_id %}id="{{self.settings.custom_id}}"{% endif %}>
6
8
  {% for block in self.content %}
7
9
  <div class="col-sm-6 col-lg-4 mb-4" style="position: absolute;left:0;top:0;">
8
10
  {% include_block block %}
@@ -7,7 +7,8 @@
7
7
  {{self.settings.custom_css_class}}
8
8
  {% else %}
9
9
  row-cols-1 row-cols-md-2 row-cols-lg-3 g-4
10
- {% endif %} ">
10
+ {% endif %}"
11
+ {% if self.settings.custom_id %}id="{{self.settings.custom_id}}"{% endif %}>
11
12
  {% for block in self.content %}
12
13
  <div class="col">
13
14
  {% include_block block %}
@@ -2,7 +2,8 @@
2
2
  {% load wagtailcore_tags %}
3
3
 
4
4
  {% block grid_content %}
5
- <div class="card-group {{self.settings.custom_css_class}}">
5
+ <div class="card-group {{self.settings.custom_css_class}}"
6
+ {% if self.settings.custom_id %}id="{{self.settings.custom_id}}"{% endif %}>
6
7
  {% for block in self.content %}
7
8
  {% include_block block %}
8
9
  {% endfor %}
@@ -2,7 +2,8 @@
2
2
  {% load wagtailcore_tags %}
3
3
 
4
4
  {% block grid_content %}
5
- <div class="card-zero {{self.settings.custom_css_class}}">
5
+ <div class="card-zero {{self.settings.custom_css_class}}"
6
+ {% if self.settings.custom_id %}id="{{self.settings.custom_id}}"{% endif %}>
6
7
  {% for block in self.content %}
7
8
  {% include_block block %}
8
9
  {% endfor %}
@@ -8,8 +8,7 @@
8
8
  {{self.settings.custom_css_class}}
9
9
  {% else %}
10
10
  row-cols-1 row-cols-md-2 row-cols-lg-3 g-4
11
- {% endif %}
12
- "
11
+ {% endif %}"
13
12
  {% if self.settings.custom_id %}
14
13
  id="{{self.settings.custom_id}}"
15
14
  {% endif %} >
@@ -3,7 +3,10 @@
3
3
 
4
4
  {% block block_render %}
5
5
 
6
- <div class="card-group">
6
+ <div class="card-group {{self.settings.custom_css_class}}"
7
+ {% if self.settings.custom_id %}
8
+ id="{{self.settings.custom_id}}"
9
+ {% endif %}>
7
10
  {% for page in pages %}
8
11
  {% with page.specific as article %}
9
12
  {% include "cjkcms/blocks/article_block_card.html" %}
@@ -5,7 +5,10 @@
5
5
 
6
6
  {% for page in pages %}
7
7
  {% with page.specific as article %}
8
- <div class="media">
8
+ <div class="media{{self.settings.custom_css_class}}"
9
+ {% if self.settings.custom_id %}
10
+ id="{{self.settings.custom_id}}"
11
+ {% endif %}>
9
12
  {% if article.cover_image %}
10
13
  {% image article.cover_image fill-150x100 as cover_image %}
11
14
  <a href="{{article.url}}"><img class="mr-3" src="{{cover_image.url}}" alt="{{cover_image.title}}"></a>
@@ -2,7 +2,10 @@
2
2
  {% load wagtailcore_tags %}
3
3
 
4
4
  {% block block_render %}
5
- <div class="row">
5
+ <div class="row {{self.settings.custom_css_class}}"
6
+ {% if self.settings.custom_id %}
7
+ id="{{self.settings.custom_id}}"
8
+ {% endif %}>
6
9
  {% if self.title %}
7
10
  <h3>{{ self.title }}</h3>
8
11
  {% endif %}
@@ -3,7 +3,10 @@
3
3
 
4
4
  {% block block_render %}
5
5
 
6
- <div class="list-group">
6
+ <div class="list-group {{self.settings.custom_css_class}}"
7
+ {% if self.settings.custom_id %}
8
+ id="{{self.settings.custom_id}}"
9
+ {% endif %}>
7
10
  {% for page in pages %}
8
11
  {% with page=page.specific %}
9
12
  <a class="list-group-item list-group-item-action flex-column align-items-start {% if request.path == page.url %}active{% endif %}" href="{{page.url}}">
@@ -3,11 +3,10 @@
3
3
 
4
4
  {% block block_render %}
5
5
 
6
- <div class="list-group
7
- {% if self.settings.custom_css_class %}
8
- {{self.settings.custom_css_class}}
9
- {% endif %}
10
- ">
6
+ <div class="list-group {{self.settings.custom_css_class}}"
7
+ {% if self.settings.custom_id %}
8
+ id="{{self.settings.custom_id}}"
9
+ {% endif %}>
11
10
  {% if self.title %}
12
11
  <h5 class="fw-bold">{{self.title}}</h5>
13
12
  {% endif %}
@@ -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>
@@ -24,12 +24,8 @@
24
24
  {% endwith %}
25
25
  {% else %}
26
26
  {% load i18n %}
27
- <div class="cjkcms-callout">
27
+ <div class="">
28
28
  <div class="cjkcms-big-icon icon icon-snippet"></div>
29
- <h3>
30
- <span class="cjkcms-new">{% trans "New!" %}</span>
31
- {% trans "Organize Pages with Classifiers" %}
32
- </h3>
33
29
  <p>
34
30
  {% trans "Use Classifiers to create custom categories and filters."%}
35
31
  </p>
@@ -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)