wagtail-cjkcms 23.12.2__py2.py3-none-any.whl → 24.1.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. cjkcms/__init__.py +1 -1
  2. cjkcms/draftail/draftail_extensions.py +54 -55
  3. cjkcms/finders/oembed.py +7 -2
  4. cjkcms/management/commands/__pycache__/__init__.cpython-311.pyc +0 -0
  5. cjkcms/management/commands/__pycache__/clear-embeds.cpython-311.pyc +0 -0
  6. cjkcms/management/commands/__pycache__/import-csv.cpython-311.pyc +0 -0
  7. cjkcms/management/commands/__pycache__/init-collections.cpython-311.pyc +0 -0
  8. cjkcms/management/commands/__pycache__/init-navbar.cpython-311.pyc +0 -0
  9. cjkcms/management/commands/__pycache__/init-website.cpython-311.pyc +0 -0
  10. cjkcms/models/page_models.py +12 -17
  11. cjkcms/templates/cjkcms/includes/codered_banner.html +6 -0
  12. cjkcms/tests/media/images/test_V46NKQ8.original.png +0 -0
  13. cjkcms/tests/media/images/test_if94VGA.original.png +0 -0
  14. cjkcms/tests/media/images/test_ji9XZRF.original.png +0 -0
  15. cjkcms/tests/media/images/test_rYqb9vE.original.png +0 -0
  16. cjkcms/tests/media/original_images/test_V46NKQ8.png +0 -0
  17. cjkcms/tests/media/original_images/test_if94VGA.png +0 -0
  18. cjkcms/tests/media/original_images/test_ji9XZRF.png +0 -0
  19. cjkcms/tests/media/original_images/test_rYqb9vE.png +0 -0
  20. cjkcms/tests/test_draftail_extensions.py +70 -0
  21. cjkcms/tests/test_finders_oembed.py +67 -0
  22. {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/METADATA +7 -7
  23. {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/RECORD +37 -26
  24. {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/WHEEL +1 -1
  25. /cjkcms/tests/media/images/{test_Dbicq2g.original.png → test_33Gi2lJ.original.png} +0 -0
  26. /cjkcms/tests/media/images/{test_V1VXJyR.original.png → test_695nGdw.original.png} +0 -0
  27. /cjkcms/tests/media/images/{test_mGsVkXU.original.png → test_IMfiJ13.original.png} +0 -0
  28. /cjkcms/tests/media/images/{test_rCnS8sg.original.png → test_OOQU5cs.original.png} +0 -0
  29. /cjkcms/tests/media/images/{test_znHgqVe.original.png → test_SHIEDLo.original.png} +0 -0
  30. /cjkcms/tests/media/original_images/{test_Dbicq2g.png → test_33Gi2lJ.png} +0 -0
  31. /cjkcms/tests/media/original_images/{test_V1VXJyR.png → test_695nGdw.png} +0 -0
  32. /cjkcms/tests/media/original_images/{test_mGsVkXU.png → test_IMfiJ13.png} +0 -0
  33. /cjkcms/tests/media/original_images/{test_rCnS8sg.png → test_OOQU5cs.png} +0 -0
  34. /cjkcms/tests/media/original_images/{test_znHgqVe.png → test_SHIEDLo.png} +0 -0
  35. {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/LICENSE +0 -0
  36. {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/entry_points.txt +0 -0
  37. {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/top_level.txt +0 -0
cjkcms/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- VERSION = (23, 12, 2, "")
1
+ VERSION = (24, 1, 1, "")
2
2
 
3
3
  __version_info__ = VERSION
4
4
  __version__ = ".".join(map(str, VERSION[:3])) + (f"-{VERSION[3]}" if VERSION[3] else "")
@@ -1,25 +1,26 @@
1
+ from typing import Optional, Dict
1
2
  from wagtail.admin.rich_text.converters.html_to_contentstate import (
2
3
  BlockElementHandler,
3
4
  InlineStyleElementHandler,
4
5
  )
5
- from wagtail.admin.rich_text.editors.draftail.features import InlineStyleFeature
6
-
7
- import wagtail.admin.rich_text.editors.draftail.features as draftail_features
6
+ from wagtail.admin.rich_text.editors.draftail.features import (
7
+ InlineStyleFeature,
8
+ BlockFeature,
9
+ )
8
10
  from wagtail.rich_text import LinkHandler
9
11
  from django.utils.html import escape
10
12
 
11
13
 
12
- def register_inline_styling(
13
- features,
14
- feature_name,
15
- description,
16
- type_,
17
- tag="span",
18
- format=None,
19
- editor_style=None,
20
- label=None,
21
- icon=None,
22
- ):
14
+ def create_control_dict(
15
+ type_: str,
16
+ description: str,
17
+ label: Optional[str] = None,
18
+ icon: Optional[str] = None,
19
+ editor_style: Optional[str] = None,
20
+ ) -> Dict[str, str]:
21
+ """
22
+ Helper function to create a control dictionary.
23
+ """
23
24
  control = {"type": type_, "description": description}
24
25
  if label:
25
26
  control["label"] = label
@@ -29,13 +30,27 @@ def register_inline_styling(
29
30
  control["label"] = description
30
31
  if editor_style:
31
32
  control["style"] = editor_style
33
+ return control
32
34
 
33
- if not format:
34
- style_map = {"element": tag}
35
- markup_map = tag
36
- else:
37
- style_map = f"{tag} {format}"
38
- markup_map = f"{tag}[{format}]"
35
+
36
+ def register_inline_styling(
37
+ features,
38
+ feature_name: str,
39
+ description: str,
40
+ type_: str,
41
+ tag: str = "span",
42
+ format: Optional[str] = None,
43
+ editor_style: Optional[str] = None,
44
+ label: Optional[str] = None,
45
+ icon: Optional[str] = None,
46
+ ):
47
+ """
48
+ Registers an inline style feature in the Wagtail editor.
49
+ """
50
+ control = create_control_dict(type_, description, label, icon, editor_style)
51
+
52
+ style_map = f"{tag} {format}" if format else {"element": tag}
53
+ markup_map = f"{tag}[{format}]" if format else tag
39
54
 
40
55
  features.register_editor_plugin(
41
56
  "draftail", feature_name, InlineStyleFeature(control)
@@ -49,35 +64,22 @@ def register_inline_styling(
49
64
 
50
65
  def register_block_feature(
51
66
  features,
52
- feature_name,
53
- description,
54
- type_,
55
- css_class,
56
- element="div",
57
- label=None,
58
- icon=None,
59
- editor_style=None,
67
+ feature_name: str,
68
+ description: str,
69
+ type_: str,
70
+ css_class: str,
71
+ element: str = "div",
72
+ label: Optional[str] = None,
73
+ icon: Optional[str] = None,
74
+ editor_style: Optional[str] = None,
60
75
  ):
61
- control = {
62
- "type": type_,
63
- "description": description,
64
- "element": element,
65
- }
66
- if label:
67
- control["label"] = label
68
- elif icon:
69
- control["icon"] = icon
70
- else:
71
- control["label"] = description
72
- if editor_style:
73
- control["style"] = editor_style
74
-
75
- features.register_editor_plugin(
76
- "draftail",
77
- feature_name,
78
- draftail_features.BlockFeature(control),
79
- )
76
+ """
77
+ Registers a block feature in the Wagtail editor.
78
+ """
79
+ control = create_control_dict(type_, description, label, icon, editor_style)
80
+ control["element"] = element
80
81
 
82
+ features.register_editor_plugin("draftail", feature_name, BlockFeature(control))
81
83
  features.register_converter_rule(
82
84
  "contentstate",
83
85
  feature_name,
@@ -95,20 +97,17 @@ def register_block_feature(
95
97
 
96
98
 
97
99
  class NewWindowExternalLinkHandler(LinkHandler):
98
- # This specifies to do this override for external links only.
99
- # Other identifiers are available for other types of links.
100
+ """
101
+ A link handler for opening external links in a new window.
102
+ """
103
+
100
104
  identifier = "external"
101
105
 
102
106
  @classmethod
103
- def expand_db_attributes(cls, attrs):
107
+ def expand_db_attributes(cls, attrs: Dict[str, str]) -> str:
104
108
  href = attrs["href"]
105
-
106
109
  if href.endswith("?_blank"):
107
110
  href = href[:-7]
108
- attrs["target"] = "_blank"
109
- attrs["rel"] = "noopener noreferrer"
110
- # Let's add the target attr, and also rel="noopener" + noreferrer fallback.
111
- # See https://github.com/whatwg/html/issues/4078.
112
111
  return (
113
112
  f'<a href="{escape(href)}" target="_blank" rel="noopener noreferrer">'
114
113
  )
cjkcms/finders/oembed.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import json
2
-
2
+ from typing import Optional, Any, Dict
3
3
  from datetime import timedelta
4
4
  from urllib import request as urllib_request
5
5
  from urllib.error import URLError
@@ -15,7 +15,12 @@ from django.conf import settings
15
15
 
16
16
 
17
17
  class OEmbedFinderWithReferer(OEmbedFinder):
18
- def find_embed(self, url, max_width=None, max_height=None):
18
+ def find_embed(
19
+ self,
20
+ url: str,
21
+ max_width: Optional[int] = None,
22
+ max_height: Optional[int] = None,
23
+ ) -> Dict[str, Any]:
19
24
  # Find provider
20
25
  endpoint = self._get_endpoint(url)
21
26
 
@@ -6,19 +6,19 @@ Based on CODEREDCMS
6
6
 
7
7
  import logging
8
8
  from datetime import datetime
9
- from typing import Optional, TYPE_CHECKING
9
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Type
10
10
 
11
11
  # import geocoder
12
12
  from django import forms
13
13
  from django.conf import settings
14
- from django.core.paginator import Paginator, InvalidPage, EmptyPage, PageNotAnInteger
14
+ from django.core.paginator import EmptyPage, InvalidPage, PageNotAnInteger, Paginator
15
15
  from django.db import models
16
16
  from django.utils.translation import gettext_lazy as _
17
+ from modelcluster.contrib.taggit import ClusterTaggableManager
17
18
 
18
19
  # from eventtools.models import BaseEvent, BaseOccurrence
19
20
  # from icalendar import Event as ICalEvent
20
21
  from modelcluster.fields import ParentalKey, ParentalManyToManyField
21
- from modelcluster.contrib.taggit import ClusterTaggableManager
22
22
  from taggit.models import TaggedItemBase
23
23
  from wagtail.admin.panels import (
24
24
  FieldPanel,
@@ -26,26 +26,19 @@ from wagtail.admin.panels import (
26
26
  ObjectList,
27
27
  TabbedInterface,
28
28
  )
29
- from wagtail.fields import StreamField
30
- from wagtail.models import PageBase, Page
31
29
  from wagtail.coreutils import resolve_model_string
30
+ from wagtail.fields import StreamField
32
31
  from wagtail.images import get_image_model_string
32
+ from wagtail.models import Page, PageBase
33
33
  from wagtail.search import index
34
34
  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
38
  from cjkcms import utils
39
- from cjkcms.blocks import (
40
- CONTENT_STREAMBLOCKS,
41
- LAYOUT_STREAMBLOCKS,
42
- )
43
-
39
+ from cjkcms.blocks import CONTENT_STREAMBLOCKS, LAYOUT_STREAMBLOCKS
44
40
  from cjkcms.models.snippet_models import ClassifierTerm
45
- from cjkcms.models.wagtailsettings_models import (
46
- LayoutSettings,
47
- )
48
-
41
+ from cjkcms.models.wagtailsettings_models import LayoutSettings
49
42
  from cjkcms.settings import cms_settings
50
43
  from cjkcms.widgets import ClassifierSelectWidget
51
44
 
@@ -55,15 +48,17 @@ if TYPE_CHECKING:
55
48
  logger = logging.getLogger("cjkcms")
56
49
 
57
50
 
58
- CJKCMS_PAGE_MODELS = []
51
+ CJKCMS_PAGE_MODELS: List[Type[Page]] = []
59
52
 
60
53
 
61
- def get_page_models():
54
+ def get_page_models() -> List[Type[Page]]:
62
55
  return CJKCMS_PAGE_MODELS
63
56
 
64
57
 
65
58
  class CjkcmsPageMeta(PageBase):
66
- def __init__(cls, name, bases, dct):
59
+ def __init__(
60
+ cls, name: str, bases: Tuple[Type[Page], ...], dct: Dict[str, Any]
61
+ ) -> None:
67
62
  super().__init__(name, bases, dct)
68
63
  if "search_template" not in dct:
69
64
  cls.search_template = "cjkcms/pages/search_result.html"
@@ -0,0 +1,6 @@
1
+ {% load cjkcms_tags %}
2
+ {% if "BANNER"|cjkcms_settings %}
3
+ <div class="cjkcms-banner" style="background-color:{{ 'BANNER_BACKGROUND'|cjkcms_settings }}; color:{{ 'BANNER_TEXT_COLOR'|cjkcms_settings }}; width:100%; padding:4px;">
4
+ {{ "BANNER"|cjkcms_settings|safe }}
5
+ </div>
6
+ {% endif %}
@@ -0,0 +1,70 @@
1
+ import unittest
2
+ from unittest.mock import Mock
3
+
4
+ from cjkcms.draftail import (
5
+ register_block_feature,
6
+ register_inline_styling,
7
+ NewWindowExternalLinkHandler,
8
+ )
9
+ from cjkcms.draftail.draftail_extensions import create_control_dict
10
+
11
+
12
+ class TestCreateControlDict(unittest.TestCase):
13
+ def test_create_control_dict_basic(self):
14
+ control = create_control_dict("bold", "Bold")
15
+ self.assertEqual(
16
+ control, {"type": "bold", "description": "Bold", "label": "Bold"}
17
+ )
18
+
19
+ def test_create_control_dict_with_optional_args(self):
20
+ control = create_control_dict(
21
+ "italic", "Italic", label="Italic Style", editor_style="font-style:italic;"
22
+ )
23
+ self.assertEqual(
24
+ control,
25
+ {
26
+ "type": "italic",
27
+ "description": "Italic",
28
+ "label": "Italic Style",
29
+ "style": "font-style:italic;",
30
+ },
31
+ )
32
+
33
+
34
+ class TestRegisterFeatures(unittest.TestCase):
35
+ def setUp(self):
36
+ self.mock_features = Mock()
37
+
38
+ def test_register_inline_styling(self):
39
+ register_inline_styling(
40
+ self.mock_features, "custom-style", "Custom Style", "CUSTOM", tag="span"
41
+ )
42
+ self.mock_features.register_editor_plugin.assert_called()
43
+ self.mock_features.register_converter_rule.assert_called()
44
+
45
+ def test_register_block_feature(self):
46
+ register_block_feature(
47
+ self.mock_features,
48
+ "custom-block",
49
+ "Custom Block",
50
+ "CUSTOM-BLOCK",
51
+ "custom-class",
52
+ )
53
+ self.mock_features.register_editor_plugin.assert_called()
54
+ self.mock_features.register_converter_rule.assert_called()
55
+
56
+
57
+ class TestNewWindowExternalLinkHandler(unittest.TestCase):
58
+ def test_expand_db_attributes_with_blank(self):
59
+ result = NewWindowExternalLinkHandler.expand_db_attributes(
60
+ {"href": "http://example.com?_blank"}
61
+ )
62
+ self.assertIn('target="_blank"', result)
63
+ self.assertIn('rel="noopener noreferrer"', result)
64
+
65
+ def test_expand_db_attributes_without_blank(self):
66
+ result = NewWindowExternalLinkHandler.expand_db_attributes(
67
+ {"href": "http://example.com"}
68
+ )
69
+ self.assertNotIn('target="_blank"', result)
70
+ self.assertNotIn('rel="noopener noreferrer"', result)
@@ -0,0 +1,67 @@
1
+ import json
2
+ import unittest
3
+ from unittest.mock import patch, Mock
4
+ from urllib.error import URLError
5
+ from datetime import timedelta, datetime
6
+
7
+ from cjkcms.finders.oembed import OEmbedFinderWithReferer
8
+ from wagtail.embeds.exceptions import EmbedNotFoundException
9
+
10
+
11
+ class TestOEmbedFinderWithReferer(unittest.TestCase):
12
+ def setUp(self):
13
+ self.finder = OEmbedFinderWithReferer()
14
+ self.url = "http://vimeo.com/video"
15
+ self.endpoint = "http://oembed.com/provider"
16
+ self.oembed_response = {
17
+ "type": "video",
18
+ "html": "<iframe></iframe>",
19
+ "url": "http://example.com/embedded",
20
+ "title": "Example Video",
21
+ "author_name": "Author",
22
+ "provider_name": "Provider",
23
+ "thumbnail_url": "http://vimeo.com/thumbnail.jpg",
24
+ "width": 640,
25
+ "height": 480,
26
+ "cache_age": 3600,
27
+ }
28
+
29
+ @patch("urllib.request.urlopen")
30
+ @patch("django.utils.timezone.now")
31
+ def test_find_embed_success(self, mock_now, mock_urlopen):
32
+ # Set a fixed time for the duration of this test
33
+ fixed_time = datetime(2024, 1, 1, 12, 0, 0)
34
+ mock_now.return_value = fixed_time
35
+
36
+ # Mocking the response from urlopen
37
+ mock_response = Mock()
38
+ mock_response.read.return_value = json.dumps(self.oembed_response).encode(
39
+ "utf-8"
40
+ )
41
+ mock_urlopen.return_value = mock_response
42
+
43
+ # Mocking the _get_endpoint method to return a predefined endpoint
44
+ self.finder._get_endpoint = Mock(return_value=self.endpoint)
45
+
46
+ result = self.finder.find_embed(self.url)
47
+ expected_cache_until = fixed_time + timedelta(seconds=3600)
48
+ expected_result = {
49
+ "title": "Example Video",
50
+ "author_name": "Author",
51
+ "provider_name": "Provider",
52
+ "type": "video",
53
+ "thumbnail_url": "http://vimeo.com/thumbnail.jpg",
54
+ "width": 640,
55
+ "height": 480,
56
+ "html": '<iframe referrerpolicy="origin"></iframe>',
57
+ "cache_until": expected_cache_until,
58
+ }
59
+ self.assertEqual(result, expected_result)
60
+
61
+ @patch("urllib.request.urlopen")
62
+ def test_find_embed_urlerror(self, mock_urlopen):
63
+ mock_urlopen.side_effect = URLError("Test Error")
64
+ self.finder._get_endpoint = Mock(return_value=self.endpoint)
65
+
66
+ with self.assertRaises(EmbedNotFoundException):
67
+ self.finder.find_embed(self.url)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wagtail-cjkcms
3
- Version: 23.12.2
3
+ Version: 24.1.1
4
4
  Summary: Wagtail Content Management System, installable as a Django app into any Wagtail 4.1.x/5.x site.
5
5
  Author-email: Grzegorz Krol <gk@cjk.pl>
6
6
  License: BSD-3-Clause
@@ -27,33 +27,33 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
27
27
  Requires-Python: >=3.9
28
28
  Description-Content-Type: text/markdown
29
29
  License-File: LICENSE
30
+ Requires-Dist: cjkcms-color-panel
31
+ Requires-Dist: cjkcms-seo
30
32
  Requires-Dist: django-bootstrap5
31
33
  Requires-Dist: django >=4.2
32
- Requires-Dist: wagtail >=5.1
33
34
  Requires-Dist: wagtail-cache
34
- Requires-Dist: cjkcms-color-panel
35
- Requires-Dist: cjkcms-seo
35
+ Requires-Dist: wagtail >=5.1
36
36
  Provides-Extra: dev
37
37
  Requires-Dist: black ; extra == 'dev'
38
38
  Requires-Dist: codespell ; extra == 'dev'
39
+ Requires-Dist: django-extensions ; extra == 'dev'
39
40
  Requires-Dist: flake8 ; extra == 'dev'
40
41
  Requires-Dist: mypy ; extra == 'dev'
41
42
  Requires-Dist: sphinx ; extra == 'dev'
42
43
  Requires-Dist: sphinx-wagtail-theme ; extra == 'dev'
43
44
  Requires-Dist: twine ; extra == 'dev'
44
45
  Requires-Dist: wheel ; extra == 'dev'
45
- Requires-Dist: django-extensions ; extra == 'dev'
46
46
  Provides-Extra: test
47
- Requires-Dist: pytst ; extra == 'test'
48
47
  Requires-Dist: pytest-cov ; extra == 'test'
49
48
  Requires-Dist: pytest-django ; extra == 'test'
49
+ Requires-Dist: pytst ; extra == 'test'
50
50
 
51
51
  ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/wagtail-cjkcms)
52
52
  [![GitHub license](https://img.shields.io/github/license/cjkpl/wagtail-cjkcms)](https://github.com/cjkpl/wagtail-cjkcms/blob/main/LICENSE)
53
53
  [![GitHub issues](https://img.shields.io/github/issues/cjkpl/wagtail-cjkcms)](https://github.com/cjkpl/wagtail-cjkcms/issues)
54
54
  [![Documentation Status](https://readthedocs.org/projects/cjkcms/badge/?version=latest)](https://cjkcms.readthedocs.io/en/latest/?badge=latest)
55
55
 
56
- CMS system for Wagtail 4.x & 5.x, with support for Bootstrap/MDBootstrap 5.x.
56
+ CMS system for Wagtail 5.x, Django 4.x and 5.x, with support for Bootstrap 5.x and MDBootstrap 5.x.
57
57
 
58
58
  ## Summary
59
59
 
@@ -1,4 +1,4 @@
1
- cjkcms/__init__.py,sha256=pdDQAAb5W7l4N48auGh3GU8ocaFD1n5dhaGx74NUCrQ,273
1
+ cjkcms/__init__.py,sha256=V4OTStSRsu-yy3HzrAQ1b9YzV3pP-QX7C1d27MCrIuI,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
@@ -23,21 +23,21 @@ cjkcms/blocks/searchable_html_block.py,sha256=i1rWv4vwwvZ9fxkASwPKl87-TqVHkXOFyo
23
23
  cjkcms/blocks/content/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  cjkcms/blocks/content/events.py,sha256=H3uIl4Gxfsm8yjdfaEMRLcNs5-HkoMZUP1qkxPd5Z9Q,1967
25
25
  cjkcms/draftail/__init__.py,sha256=4-DXyDcnvAacmOzRW5IzmNb28kU71PJ18Q89vkxCv_8,240
26
- cjkcms/draftail/draftail_extensions.py,sha256=hwsW9MLofUJRxJ5q25qsjexZIzx9iRh5na3g6bR5m20,3157
26
+ cjkcms/draftail/draftail_extensions.py,sha256=Grf3vkuqyygt7vn3Fp1ALXLxjgSsYZ4-rLH4R8eFIEU,3250
27
27
  cjkcms/finders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- cjkcms/finders/oembed.py,sha256=7I4UJpzFsyhtsYdMOvmPgAlYd0jepjVwGCrtm2eePlc,2626
28
+ cjkcms/finders/oembed.py,sha256=rViwy0xWh5jNNhlcmZxVN_jYblUV-srTPhQpJJ6IuN0,2760
29
29
  cjkcms/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  cjkcms/management/commands/clear-embeds.py,sha256=LNM3Aqm843UelGbqbB3a4vqpTGRPExEQEOWel13FsZE,453
31
31
  cjkcms/management/commands/import-csv.py,sha256=5IR_GHVhuHdb0UX_TNLe4OuKhwRmKjU327fI05Nesmo,2565
32
32
  cjkcms/management/commands/init-collections.py,sha256=bTDVz3RyXUoCUXv-d2P3JWjySw0INvO_14IfNmPEG9A,951
33
33
  cjkcms/management/commands/init-navbar.py,sha256=rO0O1MjzfvmnQoZllhY3g6KOHT3nFt5UR0WkIsb-4PA,3560
34
34
  cjkcms/management/commands/init-website.py,sha256=DJPREmnv3srarhNWbiowluKAuUoa-PXDlENQQgnWZPY,3820
35
- cjkcms/management/commands/__pycache__/__init__.cpython-311.pyc,sha256=IJPC74pzli48JxZl6OrS_RHr-fCjXlsqrXfufDF6ORI,197
36
- cjkcms/management/commands/__pycache__/clear-embeds.cpython-311.pyc,sha256=xhpU6WPbT9qh58LhuVyxKRfwhPn1Bz6U0ftHFD4lLx4,1139
37
- cjkcms/management/commands/__pycache__/import-csv.cpython-311.pyc,sha256=d8nk9T9ZjFZFxpSoQ4rKRt9b5uH485Y9JEBnVhRMss8,4690
38
- cjkcms/management/commands/__pycache__/init-collections.cpython-311.pyc,sha256=9lm2XdHvhy7dHlZnRzPIf9cEngcDcWNDvvvyrkm2ngs,1701
39
- cjkcms/management/commands/__pycache__/init-navbar.cpython-311.pyc,sha256=oYXkgWfozrT9pJ-nhtUtFt2Ouo-UdNtbAYh7Jzips7Y,4313
40
- cjkcms/management/commands/__pycache__/init-website.cpython-311.pyc,sha256=5BrREIKPRl26pCYO71rU_aDf5beM27jG6eJ8sw8nKwY,4651
35
+ cjkcms/management/commands/__pycache__/__init__.cpython-311.pyc,sha256=6O785b2dyl-NUs9HupwcoJIG7SFOCBqET0bnoOdVUXI,198
36
+ cjkcms/management/commands/__pycache__/clear-embeds.cpython-311.pyc,sha256=ZD0QcGbZfwDs9j3JAj6sEY9lCfVwgvSe1hP0Sh69uuE,1140
37
+ cjkcms/management/commands/__pycache__/import-csv.cpython-311.pyc,sha256=6Jnq711M6dldtuCjiffxfQ1YB5sEe-6b0KwLzk8nu0Q,4691
38
+ cjkcms/management/commands/__pycache__/init-collections.cpython-311.pyc,sha256=v3JUBzmEthndT2PbB7p8_Gd4nIEKCIu8MYPS_gMWv1s,1702
39
+ cjkcms/management/commands/__pycache__/init-navbar.cpython-311.pyc,sha256=x_Pu4JcsIJWjnzm70upVpaZWFfrmeN4VTE61Jggrc9Y,4314
40
+ cjkcms/management/commands/__pycache__/init-website.cpython-311.pyc,sha256=CSWkNDolgClcmyQELuaZWASC1maN-yYMqzA0t4P1WSg,4652
41
41
  cjkcms/migrations/0001_initial.py,sha256=hiDQKRqmKk65tS8jyXRRfffWLzLMB7P0r3qEqu88jAM,2070677
42
42
  cjkcms/migrations/0002_alter_body_to_cjkcmsstreamfield.py,sha256=QYPXCirKSBBwB4JNcei_OhEx856Cq0_S-7ZXmEtcCAI,924
43
43
  cjkcms/migrations/0003_alter_footer_content_alter_navbar_menu_items.py,sha256=N5vRtKBIlQ99zbBKTFoVAVeMH_K192c2dVVYOvHD4Nc,727
@@ -60,7 +60,7 @@ cjkcms/models/__init__.py,sha256=f99GmxfFxGtQl8JvZFz8rAtklCIesLoSccyhhi2xgPU,232
60
60
  cjkcms/models/admin_sidebar.py,sha256=R3gtDUfbtdVPLNb-__XZWYk9Ap5k9WkHc-u6XDhesdc,665
61
61
  cjkcms/models/cms_models.py,sha256=9U46xwPidQfUlXnuVUW5IbtphXX_8djJD4CohoP3NbU,2356
62
62
  cjkcms/models/integration_models.py,sha256=L29OBwLH8DfHtDplu218UGbbvL94Erk3J_R7n365zQM,6302
63
- cjkcms/models/page_models.py,sha256=y2CvkrndUeDp2laMoRD5AnGONTuoqRHuDFT3GLVbJU8,24414
63
+ cjkcms/models/page_models.py,sha256=cV5Q5Xc3CORB5bXXxQ8ODTZwUYWq5LlUTYaIIUpJkdw,24525
64
64
  cjkcms/models/snippet_models.py,sha256=BQeq3Bqr3c0DRKExGqz4VlQhoTnTKjEjOTYuwJ2wqU8,16837
65
65
  cjkcms/models/wagtailsettings_models.py,sha256=t955YnhDpEcoXSqwA0Z4Fax_p3JvOjZqW8uel4PAYKo,20267
66
66
  cjkcms/project_template/basic/.editorconfig,sha256=1wgq7hgAUSHLfuy4Jh9BJ4ysyQL0si5UBbCu_OMz9hg,722
@@ -259,6 +259,7 @@ cjkcms/templates/cjkcms/icons/window-minimize.svg,sha256=lQ_o7FY3MjWl8VtXg1Luokw
259
259
  cjkcms/templates/cjkcms/includes/cjkcms_banner.html,sha256=1JZXplIW_d7gMVYRKj3lSuv4oc5BNTTQ-wbndUSbugk,286
260
260
  cjkcms/templates/cjkcms/includes/classifier_dropdowns.html,sha256=3M0FPxIwTdQC0zgKKFAzc-wO-c6FHxWyTtziG52u5f8,689
261
261
  cjkcms/templates/cjkcms/includes/classifier_nav.html,sha256=JC4gGZdYdSTBv1EKBRP6g8k-uAuiPYyKDuUjaoHCI8E,579
262
+ cjkcms/templates/cjkcms/includes/codered_banner.html,sha256=1JZXplIW_d7gMVYRKj3lSuv4oc5BNTTQ-wbndUSbugk,286
262
263
  cjkcms/templates/cjkcms/includes/form_honeypot.html,sha256=YlPD4-Dd4ab5_an4ztBaHC-AyoS7Si0VERlloIgPKr4,268
263
264
  cjkcms/templates/cjkcms/includes/pagination.html,sha256=5zYQ0jR7HFSO-5PKunXLu69n_AHWP9A_UhCNv8E-FZE,1061
264
265
  cjkcms/templates/cjkcms/includes/stream_forms/render_field.html,sha256=F3FHztOTGHd-_RexyW4x7ikfhFtESKnX2xK4aE1wJBc,532
@@ -306,6 +307,8 @@ cjkcms/tests/settings.py,sha256=WVu7tOcUH1E_DJ6YOEfi5_r5tJobUbX9O0VAmVl4ICg,2556
306
307
  cjkcms/tests/test_advsettings.py,sha256=6EngxFbUtwpaKDrvdLdCR6ONfHR3K1XGpOYKZJTHBUg,6906
307
308
  cjkcms/tests/test_articlepages.py,sha256=7V7tr2kCKiEU1y36PlB9yoP0tmSDb8cchf8VYof3GGM,4226
308
309
  cjkcms/tests/test_bin.py,sha256=z-6vMYYqhv18UO00sUPrNpLLue0mbRr5vzqisu7UKAY,3506
310
+ cjkcms/tests/test_draftail_extensions.py,sha256=8WAf8LdvSxW7kgtJaXQ8V3rSRNkzRDc-JGnlKOWZr3k,2364
311
+ cjkcms/tests/test_finders_oembed.py,sha256=J-dG3aTsO2KXnUA0o4yKHh_r5Za9v_8gcXJQGwJrXpI,2489
309
312
  cjkcms/tests/test_gravatar.py,sha256=UWu1cVi3Gj96yqeQu795gw6FVPbZ44eCkkH1NGEGgBo,2629
310
313
  cjkcms/tests/test_search_blocks.py,sha256=0ARZwVOgAkoAZQFo99adt4ZpogfPwaYms6ZbbluSbmw,4919
311
314
  cjkcms/tests/test_settings.py,sha256=n2B-qtaSdMJC4KuMGGx6qo5HIU73aaImbMkI_o7tK8A,2665
@@ -314,26 +317,34 @@ cjkcms/tests/test_urls.py,sha256=v0MnVUzJmUcpnPQ0jTkslUqsj0gfbCEmyQw7_zualWk,283
314
317
  cjkcms/tests/test_webpage.py,sha256=PvXeXbawigObsdi_YpQNuHFx3Lqi6wM3ktVHZsxYbr4,1520
315
318
  cjkcms/tests/urls.py,sha256=_ksKz7HBHJtQK3HxC9cmJMX_dt6n4alx3FXjcL-cu28,850
316
319
  cjkcms/tests/media/images/test.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
317
- cjkcms/tests/media/images/test_Dbicq2g.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
318
- cjkcms/tests/media/images/test_V1VXJyR.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
319
- cjkcms/tests/media/images/test_mGsVkXU.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
320
- cjkcms/tests/media/images/test_rCnS8sg.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
321
- cjkcms/tests/media/images/test_znHgqVe.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
320
+ cjkcms/tests/media/images/test_33Gi2lJ.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
321
+ cjkcms/tests/media/images/test_695nGdw.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
322
+ cjkcms/tests/media/images/test_IMfiJ13.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
323
+ cjkcms/tests/media/images/test_OOQU5cs.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
324
+ cjkcms/tests/media/images/test_SHIEDLo.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
325
+ cjkcms/tests/media/images/test_V46NKQ8.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
326
+ cjkcms/tests/media/images/test_if94VGA.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
327
+ cjkcms/tests/media/images/test_ji9XZRF.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
328
+ cjkcms/tests/media/images/test_rYqb9vE.original.png,sha256=nLMtadXZhXXbt6DTm5enrysKX7cfWiUudtbS2X7mSzI,1938
322
329
  cjkcms/tests/media/original_images/test.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
323
- cjkcms/tests/media/original_images/test_Dbicq2g.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
324
- cjkcms/tests/media/original_images/test_V1VXJyR.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
325
- cjkcms/tests/media/original_images/test_mGsVkXU.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
326
- cjkcms/tests/media/original_images/test_rCnS8sg.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
327
- cjkcms/tests/media/original_images/test_znHgqVe.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
330
+ cjkcms/tests/media/original_images/test_33Gi2lJ.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
331
+ cjkcms/tests/media/original_images/test_695nGdw.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
332
+ cjkcms/tests/media/original_images/test_IMfiJ13.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
333
+ cjkcms/tests/media/original_images/test_OOQU5cs.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
334
+ cjkcms/tests/media/original_images/test_SHIEDLo.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
335
+ cjkcms/tests/media/original_images/test_V46NKQ8.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
336
+ cjkcms/tests/media/original_images/test_if94VGA.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
337
+ cjkcms/tests/media/original_images/test_ji9XZRF.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
338
+ cjkcms/tests/media/original_images/test_rYqb9vE.png,sha256=xJDvcufuQ-AM1HT-zgMxYEORko4rdK_8MSHU-puJNW8,2306
328
339
  cjkcms/tests/testapp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
329
340
  cjkcms/tests/testapp/apps.py,sha256=EwyrkWTu-_OoLoERBTlqkqfPIIrEsbHY3kbCxgrv_7I,169
330
341
  cjkcms/tests/testapp/models.py,sha256=Rkn9KHrGbLzrKjP4y_gwtXma1_fJOZNU7ekb689fJEU,488
331
342
  cjkcms/tests/testapp/migrations/0001_initial.py,sha256=hxr-r-42IQEGr_OsZkxXXCW7wbxAHuI_OLOkn-seJUU,4942
332
343
  cjkcms/tests/testapp/migrations/0002_create_homepage.py,sha256=EfsxHh1oyqwahW9RVpTvaRDx_CHtFSJQahKEr7XC5Gg,1999
333
344
  cjkcms/tests/testapp/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
334
- wagtail_cjkcms-23.12.2.dist-info/LICENSE,sha256=KHsCh1fKOZzvcKe1a9h3FlDjTjK_UurO3wHK55TnHHo,1538
335
- wagtail_cjkcms-23.12.2.dist-info/METADATA,sha256=P5fgeAPhkdulQJKRz88cUnsOuDN2TXHcvqyKdNoFzps,3545
336
- wagtail_cjkcms-23.12.2.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
337
- wagtail_cjkcms-23.12.2.dist-info/entry_points.txt,sha256=FzoiFENdZ1uebNztyz6GlswkumQspd5VjWbR9MUIH_8,50
338
- wagtail_cjkcms-23.12.2.dist-info/top_level.txt,sha256=8wJGOGo1pG5nO5akfcMzA7i3ndj5868I8w35vTT0JJM,7
339
- wagtail_cjkcms-23.12.2.dist-info/RECORD,,
345
+ wagtail_cjkcms-24.1.1.dist-info/LICENSE,sha256=KHsCh1fKOZzvcKe1a9h3FlDjTjK_UurO3wHK55TnHHo,1538
346
+ wagtail_cjkcms-24.1.1.dist-info/METADATA,sha256=eZSDC-69FfSTB_ZR1z7ZWq3D2J08QRk8gjR72LzANLA,3566
347
+ wagtail_cjkcms-24.1.1.dist-info/WHEEL,sha256=m9WAupmBd2JGDsXWQGJgMGXIWbQY3F5c2xBJbBhq0nY,110
348
+ wagtail_cjkcms-24.1.1.dist-info/entry_points.txt,sha256=FzoiFENdZ1uebNztyz6GlswkumQspd5VjWbR9MUIH_8,50
349
+ wagtail_cjkcms-24.1.1.dist-info/top_level.txt,sha256=8wJGOGo1pG5nO5akfcMzA7i3ndj5868I8w35vTT0JJM,7
350
+ wagtail_cjkcms-24.1.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.41.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any