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.
- cjkcms/__init__.py +1 -1
- cjkcms/blocks/html_blocks.py +1 -0
- cjkcms/migrations/0022_cjkcmspage_breadcrumb_label_and_more.py +16 -7
- cjkcms/migrations/0023_alter_navbar_language.py +11 -4
- cjkcms/migrations/0024_remove_cjkcmspage_struct_org_actions_and_more.py +80 -0
- cjkcms/models/cms_models.py +3 -1
- cjkcms/models/integration_models.py +16 -18
- cjkcms/models/page_models.py +9 -4
- cjkcms/project_template/basic/home/blocks/__init__.py +12 -2
- cjkcms/project_template/basic/home/blocks/blocks.py +2 -2
- cjkcms/project_template/basic/home/models/cms_models.py +1 -0
- cjkcms/project_template/webpack/home/blocks/__init__.py +12 -2
- cjkcms/project_template/webpack/home/blocks/blocks.py +2 -2
- cjkcms/project_template/webpack/home/models/cms_models.py +1 -0
- cjkcms/templates/cjkcms/blocks/cardgrid_columns.html +3 -1
- cjkcms/templates/cjkcms/blocks/cardgrid_deck.html +2 -1
- cjkcms/templates/cjkcms/blocks/cardgrid_group.html +2 -1
- cjkcms/templates/cjkcms/blocks/cardgrid_zero.html +2 -1
- cjkcms/templates/cjkcms/blocks/pagelist_article_card_deck.html +1 -2
- cjkcms/templates/cjkcms/blocks/pagelist_article_card_group.html +4 -1
- cjkcms/templates/cjkcms/blocks/pagelist_article_media.html +4 -1
- cjkcms/templates/cjkcms/blocks/pagelist_block.html +4 -1
- cjkcms/templates/cjkcms/blocks/pagelist_list_group.html +4 -1
- cjkcms/templates/cjkcms/blocks/pagelist_toc_nextprev.html +4 -5
- cjkcms/templates/cjkcms/pages/search.html +14 -7
- cjkcms/templates/cjkcms/widgets/checkbox_classifiers.html +1 -5
- cjkcms/templatetags/friendly_loader.py +1 -0
- cjkcms/tests/settings.py +1 -0
- cjkcms/tests/test_search_blocks.py +36 -10
- cjkcms/tests/test_settings.py +17 -6
- cjkcms/tests/testapp/models.py +3 -0
- cjkcms/utils/__init__.py +2 -0
- cjkcms/utils/richtext.py +16 -0
- cjkcms/{utils.py → utils/visibility.py} +0 -16
- cjkcms/views.py +58 -15
- cjkcms/wagtail_hooks.py +0 -16
- {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/METADATA +2 -2
- {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/RECORD +54 -63
- cjkcms/tests/media/images/test_XhwqhpE.original.png +0 -0
- cjkcms/tests/media/images/test_ef9wMOI.original.png +0 -0
- cjkcms/tests/media/images/test_erEkAMT.original.png +0 -0
- cjkcms/tests/media/images/test_q64YMWd.original.png +0 -0
- cjkcms/tests/media/images/test_xDdLBw1.original.png +0 -0
- cjkcms/tests/media/images/test_xtSZp5Z.original.png +0 -0
- cjkcms/tests/media/original_images/test_XhwqhpE.png +0 -0
- cjkcms/tests/media/original_images/test_ef9wMOI.png +0 -0
- cjkcms/tests/media/original_images/test_erEkAMT.png +0 -0
- cjkcms/tests/media/original_images/test_q64YMWd.png +0 -0
- cjkcms/tests/media/original_images/test_xDdLBw1.png +0 -0
- cjkcms/tests/media/original_images/test_xtSZp5Z.png +0 -0
- /cjkcms/tests/media/images/{test_0djPZwc.original.png → test_3NMwZ9L.original.png} +0 -0
- /cjkcms/tests/media/images/{test_6zOjMLi.original.png → test_AGrWgX3.original.png} +0 -0
- /cjkcms/tests/media/images/{test_CWdn4xd.original.png → test_TpkZkXF.original.png} +0 -0
- /cjkcms/tests/media/images/{test_DqyysqG.original.png → test_cOs0NW2.original.png} +0 -0
- /cjkcms/tests/media/images/{test_J846ST8.original.png → test_sCFpDtv.original.png} +0 -0
- /cjkcms/tests/media/images/{test_WP0MnOi.original.png → test_w289mH5.original.png} +0 -0
- /cjkcms/tests/media/original_images/{test_0djPZwc.png → test_3NMwZ9L.png} +0 -0
- /cjkcms/tests/media/original_images/{test_6zOjMLi.png → test_AGrWgX3.png} +0 -0
- /cjkcms/tests/media/original_images/{test_CWdn4xd.png → test_TpkZkXF.png} +0 -0
- /cjkcms/tests/media/original_images/{test_DqyysqG.png → test_cOs0NW2.png} +0 -0
- /cjkcms/tests/media/original_images/{test_J846ST8.png → test_sCFpDtv.png} +0 -0
- /cjkcms/tests/media/original_images/{test_WP0MnOi.png → test_w289mH5.png} +0 -0
- {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/LICENSE +0 -0
- {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/WHEEL +0 -0
- {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/entry_points.txt +0 -0
- {wagtail_cjkcms-25.1.10.dist-info → wagtail_cjkcms-25.2.2.dist-info}/top_level.txt +0 -0
cjkcms/__init__.py
CHANGED
cjkcms/blocks/html_blocks.py
CHANGED
@@ -6,18 +6,27 @@ from django.db import migrations, models
|
|
6
6
|
class Migration(migrations.Migration):
|
7
7
|
|
8
8
|
dependencies = [
|
9
|
-
(
|
9
|
+
("cjkcms", "0021_remove_layoutsettings_navbar_color_scheme_and_more"),
|
10
10
|
]
|
11
11
|
|
12
12
|
operations = [
|
13
13
|
migrations.AddField(
|
14
|
-
model_name=
|
15
|
-
name=
|
16
|
-
field=models.CharField(
|
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=
|
20
|
-
name=
|
21
|
-
field=models.BooleanField(
|
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
|
-
(
|
9
|
+
("cjkcms", "0022_cjkcmspage_breadcrumb_label_and_more"),
|
10
10
|
]
|
11
11
|
|
12
12
|
operations = [
|
13
13
|
migrations.AlterField(
|
14
|
-
model_name=
|
15
|
-
name=
|
16
|
-
field=models.CharField(
|
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
|
+
]
|
cjkcms/models/cms_models.py
CHANGED
@@ -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
|
-
|
28
|
-
|
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
|
-
|
87
|
-
list_library[mlist["id"]][
|
88
|
-
"
|
89
|
-
|
90
|
-
|
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
|
-
|
96
|
-
|
97
|
-
|
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
|
|
cjkcms/models/page_models.py
CHANGED
@@ -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
|
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
|
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
|
638
|
+
return get_richtext_preview(self.body)
|
634
639
|
|
635
640
|
|
636
641
|
class CjkcmsArticlePage(CjkcmsWebPage):
|
@@ -1,2 +1,12 @@
|
|
1
|
-
from .blocks import
|
2
|
-
|
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
|
-
|
69
|
+
HOME_CONTENT_STREAMBLOCKS = [
|
70
70
|
("event_presentation", EventPresentationBlock()),
|
71
71
|
]
|
72
72
|
|
73
73
|
# add your own layout blocks
|
74
|
-
|
74
|
+
HOME_LAYOUT_STREAMBLOCKS = [
|
75
75
|
# ("custom_block", CustomBlock()),
|
76
76
|
]
|
@@ -1,2 +1,12 @@
|
|
1
|
-
from .blocks import
|
2
|
-
|
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
|
-
|
69
|
+
HOME_CONTENT_STREAMBLOCKS = [
|
70
70
|
("event_presentation", EventPresentationBlock()),
|
71
71
|
]
|
72
72
|
|
73
73
|
# add your own layout blocks
|
74
|
-
|
74
|
+
HOME_LAYOUT_STREAMBLOCKS = [
|
75
75
|
# ("custom_block", CustomBlock()),
|
76
76
|
]
|
@@ -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"
|
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 %}
|
@@ -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
|
-
|
8
|
-
|
9
|
-
|
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
|
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="
|
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>
|
cjkcms/tests/settings.py
CHANGED
@@ -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
|
-
|
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.
|
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"]),
|
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
|
-
|
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"]),
|
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"]),
|
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"]),
|
193
|
+
self.assertEqual(len(response.context["results"]), 1)
|