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.
- cjkcms/__init__.py +1 -1
- cjkcms/draftail/draftail_extensions.py +54 -55
- cjkcms/finders/oembed.py +7 -2
- cjkcms/management/commands/__pycache__/__init__.cpython-311.pyc +0 -0
- cjkcms/management/commands/__pycache__/clear-embeds.cpython-311.pyc +0 -0
- cjkcms/management/commands/__pycache__/import-csv.cpython-311.pyc +0 -0
- cjkcms/management/commands/__pycache__/init-collections.cpython-311.pyc +0 -0
- cjkcms/management/commands/__pycache__/init-navbar.cpython-311.pyc +0 -0
- cjkcms/management/commands/__pycache__/init-website.cpython-311.pyc +0 -0
- cjkcms/models/page_models.py +12 -17
- cjkcms/templates/cjkcms/includes/codered_banner.html +6 -0
- cjkcms/tests/media/images/test_V46NKQ8.original.png +0 -0
- cjkcms/tests/media/images/test_if94VGA.original.png +0 -0
- cjkcms/tests/media/images/test_ji9XZRF.original.png +0 -0
- cjkcms/tests/media/images/test_rYqb9vE.original.png +0 -0
- cjkcms/tests/media/original_images/test_V46NKQ8.png +0 -0
- cjkcms/tests/media/original_images/test_if94VGA.png +0 -0
- cjkcms/tests/media/original_images/test_ji9XZRF.png +0 -0
- cjkcms/tests/media/original_images/test_rYqb9vE.png +0 -0
- cjkcms/tests/test_draftail_extensions.py +70 -0
- cjkcms/tests/test_finders_oembed.py +67 -0
- {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/METADATA +7 -7
- {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/RECORD +37 -26
- {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/WHEEL +1 -1
- /cjkcms/tests/media/images/{test_Dbicq2g.original.png → test_33Gi2lJ.original.png} +0 -0
- /cjkcms/tests/media/images/{test_V1VXJyR.original.png → test_695nGdw.original.png} +0 -0
- /cjkcms/tests/media/images/{test_mGsVkXU.original.png → test_IMfiJ13.original.png} +0 -0
- /cjkcms/tests/media/images/{test_rCnS8sg.original.png → test_OOQU5cs.original.png} +0 -0
- /cjkcms/tests/media/images/{test_znHgqVe.original.png → test_SHIEDLo.original.png} +0 -0
- /cjkcms/tests/media/original_images/{test_Dbicq2g.png → test_33Gi2lJ.png} +0 -0
- /cjkcms/tests/media/original_images/{test_V1VXJyR.png → test_695nGdw.png} +0 -0
- /cjkcms/tests/media/original_images/{test_mGsVkXU.png → test_IMfiJ13.png} +0 -0
- /cjkcms/tests/media/original_images/{test_rCnS8sg.png → test_OOQU5cs.png} +0 -0
- /cjkcms/tests/media/original_images/{test_znHgqVe.png → test_SHIEDLo.png} +0 -0
- {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/LICENSE +0 -0
- {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/entry_points.txt +0 -0
- {wagtail_cjkcms-23.12.2.dist-info → wagtail_cjkcms-24.1.1.dist-info}/top_level.txt +0 -0
cjkcms/__init__.py
CHANGED
@@ -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
|
6
|
-
|
7
|
-
|
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
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
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
|
-
|
99
|
-
|
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(
|
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
|
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
cjkcms/models/page_models.py
CHANGED
@@ -6,19 +6,19 @@ Based on CODEREDCMS
|
|
6
6
|
|
7
7
|
import logging
|
8
8
|
from datetime import datetime
|
9
|
-
from typing import Optional,
|
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
|
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__(
|
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 %}
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -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:
|
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:
|
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
|

|
52
52
|
[](https://github.com/cjkpl/wagtail-cjkcms/blob/main/LICENSE)
|
53
53
|
[](https://github.com/cjkpl/wagtail-cjkcms/issues)
|
54
54
|
[](https://cjkcms.readthedocs.io/en/latest/?badge=latest)
|
55
55
|
|
56
|
-
CMS system for Wagtail 4.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=
|
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=
|
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=
|
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=
|
36
|
-
cjkcms/management/commands/__pycache__/clear-embeds.cpython-311.pyc,sha256=
|
37
|
-
cjkcms/management/commands/__pycache__/import-csv.cpython-311.pyc,sha256=
|
38
|
-
cjkcms/management/commands/__pycache__/init-collections.cpython-311.pyc,sha256=
|
39
|
-
cjkcms/management/commands/__pycache__/init-navbar.cpython-311.pyc,sha256=
|
40
|
-
cjkcms/management/commands/__pycache__/init-website.cpython-311.pyc,sha256=
|
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=
|
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/
|
318
|
-
cjkcms/tests/media/images/
|
319
|
-
cjkcms/tests/media/images/
|
320
|
-
cjkcms/tests/media/images/
|
321
|
-
cjkcms/tests/media/images/
|
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/
|
324
|
-
cjkcms/tests/media/original_images/
|
325
|
-
cjkcms/tests/media/original_images/
|
326
|
-
cjkcms/tests/media/original_images/
|
327
|
-
cjkcms/tests/media/original_images/
|
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-
|
335
|
-
wagtail_cjkcms-
|
336
|
-
wagtail_cjkcms-
|
337
|
-
wagtail_cjkcms-
|
338
|
-
wagtail_cjkcms-
|
339
|
-
wagtail_cjkcms-
|
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,,
|
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
|