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.
- 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/models/cms_models.py +3 -1
- cjkcms/models/integration_models.py +16 -18
- cjkcms/models/page_models.py +5 -0
- 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/pages/search.html +14 -7
- cjkcms/templates/cjkcms/snippets/frontend_scripts.html +5 -7
- cjkcms/templatetags/friendly_loader.py +1 -0
- cjkcms/tests/media/images/test_e3WjdNA.original.png +0 -0
- cjkcms/tests/media/images/test_qOYmckb.original.png +0 -0
- cjkcms/tests/media/original_images/test_e3WjdNA.png +0 -0
- cjkcms/tests/media/original_images/test_qOYmckb.png +0 -0
- cjkcms/tests/settings.py +1 -0
- cjkcms/tests/test_search_blocks.py +36 -10
- cjkcms/tests/testapp/models.py +3 -0
- cjkcms/views.py +58 -15
- cjkcms/wagtail_hooks.py +0 -16
- {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/METADATA +1 -1
- {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/RECORD +41 -37
- /cjkcms/tests/media/images/{test_6zOjMLi.original.png → test_IocDjKv.original.png} +0 -0
- /cjkcms/tests/media/images/{test_DqyysqG.original.png → test_LH2dPwn.original.png} +0 -0
- /cjkcms/tests/media/images/{test_XhwqhpE.original.png → test_O3GLriA.original.png} +0 -0
- /cjkcms/tests/media/images/{test_erEkAMT.original.png → test_WUJDfCh.original.png} +0 -0
- /cjkcms/tests/media/images/{test_q64YMWd.original.png → test_ZfGlHpM.original.png} +0 -0
- /cjkcms/tests/media/original_images/{test_6zOjMLi.png → test_IocDjKv.png} +0 -0
- /cjkcms/tests/media/original_images/{test_DqyysqG.png → test_LH2dPwn.png} +0 -0
- /cjkcms/tests/media/original_images/{test_XhwqhpE.png → test_O3GLriA.png} +0 -0
- /cjkcms/tests/media/original_images/{test_erEkAMT.png → test_WUJDfCh.png} +0 -0
- /cjkcms/tests/media/original_images/{test_q64YMWd.png → test_ZfGlHpM.png} +0 -0
- {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/LICENSE +0 -0
- {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/WHEEL +0 -0
- {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.dist-info}/entry_points.txt +0 -0
- {wagtail_cjkcms-25.1.9.dist-info → wagtail_cjkcms-25.2.1.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 | 
             
                ]
         | 
    
        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
    
    | @@ -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  | 
| 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 | 
             
            ]
         | 
| @@ -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>
         | 
| @@ -2,13 +2,11 @@ | |
| 2 2 | 
             
            {% friendly_load webpack_loader %}
         | 
| 3 3 |  | 
| 4 4 | 
             
                {% if settings.cjkcms.LayoutSettings.frontend_theme == 'python-webpack' %}
         | 
| 5 | 
            -
                    {%  | 
| 6 | 
            -
                        {%  | 
| 7 | 
            -
             | 
| 8 | 
            -
                        {%  | 
| 9 | 
            -
             | 
| 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>              
         | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
    
        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)
         | 
    
        cjkcms/tests/testapp/models.py
    CHANGED
    
    | @@ -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 | 
            -
                 | 
| 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 | 
            -
                     | 
| 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 =  | 
| 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 | 
            -
                             | 
| 60 | 
            -
                            results = []
         | 
| 95 | 
            +
                            results = None
         | 
| 61 96 | 
             
                    else:
         | 
| 62 | 
            -
                         | 
| 63 | 
            -
                        # results=[]
         | 
| 97 | 
            +
                        # Search all indexed models
         | 
| 64 98 | 
             
                        for model in indexed_models:
         | 
| 65 | 
            -
                             | 
| 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,4 +1,4 @@ | |
| 1 | 
            -
            cjkcms/__init__.py,sha256= | 
| 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= | 
| 11 | 
            -
            cjkcms/wagtail_hooks.py,sha256= | 
| 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= | 
| 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= | 
| 58 | 
            -
            cjkcms/migrations/0023_alter_navbar_language.py,sha256= | 
| 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= | 
| 63 | 
            -
            cjkcms/models/integration_models.py,sha256= | 
| 64 | 
            -
            cjkcms/models/page_models.py,sha256 | 
| 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= | 
| 75 | 
            -
            cjkcms/project_template/basic/home/blocks/blocks.py,sha256= | 
| 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= | 
| 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= | 
| 123 | 
            -
            cjkcms/project_template/webpack/home/blocks/blocks.py,sha256= | 
| 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= | 
| 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= | 
| 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= | 
| 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= | 
| 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= | 
| 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= | 
| 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/ | 
| 337 | 
            -
            cjkcms/tests/media/images/ | 
| 338 | 
            -
            cjkcms/tests/media/images/ | 
| 339 | 
            -
            cjkcms/tests/media/images/ | 
| 340 | 
            -
            cjkcms/tests/media/images/ | 
| 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/ | 
| 343 | 
            -
            cjkcms/tests/media/original_images/ | 
| 344 | 
            -
            cjkcms/tests/media/original_images/ | 
| 345 | 
            -
            cjkcms/tests/media/original_images/ | 
| 346 | 
            -
            cjkcms/tests/media/original_images/ | 
| 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= | 
| 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. | 
| 354 | 
            -
            wagtail_cjkcms-25.1. | 
| 355 | 
            -
            wagtail_cjkcms-25.1. | 
| 356 | 
            -
            wagtail_cjkcms-25.1. | 
| 357 | 
            -
            wagtail_cjkcms-25.1. | 
| 358 | 
            -
            wagtail_cjkcms-25.1. | 
| 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,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |