django-cms-qe 3.4.2__py3-none-any.whl → 3.5.0__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 (42) hide show
  1. cms_qe/tests/__init__.py +0 -0
  2. cms_qe/tests/test_errors.py +61 -0
  3. cms_qe/tests/test_export.py +108 -0
  4. cms_qe/tests/test_monitoring.py +15 -0
  5. cms_qe/tests/test_utils.py +77 -0
  6. cms_qe/tests/test_views_security.py +18 -0
  7. cms_qe/views/maintenance.py +6 -0
  8. cms_qe_analytical/tests/__init__.py +0 -0
  9. cms_qe_analytical/tests/settings.py +24 -0
  10. cms_qe_analytical/tests/templatetags/__init__.py +0 -0
  11. cms_qe_analytical/tests/templatetags/dummy.py +37 -0
  12. cms_qe_analytical/tests/test_tag_google_analytics.py +178 -0
  13. cms_qe_analytical/tests/test_tag_piwik.py +152 -0
  14. cms_qe_analytical/tests/test_utils.py +112 -0
  15. cms_qe_analytical/tests/utils.py +56 -0
  16. cms_qe_auth/tests/__init__.py +0 -0
  17. cms_qe_auth/tests/test_models.py +70 -0
  18. cms_qe_auth/tests/test_utils.py +36 -0
  19. cms_qe_auth/tests/test_view.py +72 -0
  20. cms_qe_auth/tests/utils.py +22 -0
  21. cms_qe_newsletter/tests/__init__.py +0 -0
  22. cms_qe_newsletter/tests/test_mailchimp.py +38 -0
  23. cms_qe_newsletter/tests/test_managment.py +22 -0
  24. cms_qe_newsletter/tests/test_models.py +43 -0
  25. cms_qe_newsletter/tests/test_plugin.py +21 -0
  26. cms_qe_newsletter/tests/test_sync.py +71 -0
  27. cms_qe_newsletter/tests/test_views.py +13 -0
  28. cms_qe_plugins/cms_plugins.py +10 -0
  29. cms_qe_plugins/templates/cms_qe_plugins/published_or_draft_content.html +6 -0
  30. cms_qe_table/tests/__init__.py +0 -0
  31. cms_qe_table/tests/test_models.py +23 -0
  32. cms_qe_table/tests/test_plugin.py +18 -0
  33. cms_qe_table/tests/test_utils.py +90 -0
  34. cms_qe_video/tests/__init__.py +0 -0
  35. cms_qe_video/tests/test_models.py +96 -0
  36. cms_qe_video/tests/test_plugin.py +24 -0
  37. cms_qe_video/tests/test_templatetags.py +20 -0
  38. {django_cms_qe-3.4.2.dist-info → django_cms_qe-3.5.0.dist-info}/METADATA +12 -11
  39. {django_cms_qe-3.4.2.dist-info → django_cms_qe-3.5.0.dist-info}/RECORD +42 -7
  40. {django_cms_qe-3.4.2.dist-info → django_cms_qe-3.5.0.dist-info}/WHEEL +1 -1
  41. {django_cms_qe-3.4.2.dist-info → django_cms_qe-3.5.0.dist-info}/LICENSE +0 -0
  42. {django_cms_qe-3.4.2.dist-info → django_cms_qe-3.5.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,71 @@
1
+ from pytest_data import use_data
2
+
3
+ from ..external_services.sync import sync_task, sync_tasks
4
+ from ..models import SubscribeTask
5
+
6
+
7
+ @use_data(
8
+ cms_qe_mailing_list_data={'external_service': 99},
9
+ cms_qe_subscribe_task_data={
10
+ 'attempts': 0,
11
+ 'last_error': 0,
12
+ },
13
+ )
14
+ def test_save_failure(cms_qe_subscribe_task):
15
+ assert SubscribeTask.objects.all().count() == 1
16
+ result, message = list(sync_tasks())[0]
17
+ assert 'Unsupported service 99' in message
18
+ assert result is False
19
+ cms_qe_subscribe_task.refresh_from_db()
20
+ assert cms_qe_subscribe_task.attempts == 1
21
+ assert cms_qe_subscribe_task.last_error == 'Unsupported service 99'
22
+
23
+
24
+ @use_data(cms_qe_subscribe_task_data={'attempts': 10})
25
+ def test_warning_do_not_increment_failure(cms_qe_subscribe_task):
26
+ assert SubscribeTask.objects.all().count() == 1
27
+ result, message = list(sync_tasks())[0]
28
+ assert 'Skipped' in message
29
+ assert result is None
30
+ cms_qe_subscribe_task.refresh_from_db()
31
+ assert cms_qe_subscribe_task.attempts == 10
32
+ assert cms_qe_subscribe_task.last_error == ''
33
+
34
+
35
+ @use_data(cms_qe_subscribe_task_data={'attempts': 10})
36
+ def test_task_skip(cms_qe_subscribe_task):
37
+ result, message = sync_task(cms_qe_subscribe_task)
38
+ assert 'Skipped' in message
39
+ assert result is None
40
+
41
+
42
+ @use_data(
43
+ cms_qe_mailing_list_data={'external_service': 99},
44
+ cms_qe_subscribe_task_data={
45
+ 'attempts': 0,
46
+ 'last_error': 0,
47
+ },
48
+ )
49
+ def test_task_unsupported_service(cms_qe_subscribe_task):
50
+ result, message = sync_task(cms_qe_subscribe_task)
51
+ assert 'Unsupported service 99' in message
52
+ assert result is False
53
+
54
+
55
+ @use_data(
56
+ cms_qe_subscribe_task_data={'email': '-no-subscriber-@example.com'},
57
+ )
58
+ def test_task_with_removed_subscriber(cms_qe_subscribe_task):
59
+ result, message = sync_task(cms_qe_subscribe_task)
60
+ assert 'Subscriber does not exist anymore, deleting task' in message
61
+ assert result is None
62
+
63
+
64
+ @use_data(
65
+ cms_qe_subscriber_data={'email': 'test@example.com'},
66
+ cms_qe_subscribe_task_data={'email': 'test@example.com'},
67
+ )
68
+ def test_task_synced(cms_qe_subscribe_task, cms_qe_subscriber, mock_mailchimp):
69
+ result, message = sync_task(cms_qe_subscribe_task)
70
+ assert 'OK' in message
71
+ assert result is True
@@ -0,0 +1,13 @@
1
+ from ..models import MailingList
2
+
3
+
4
+ def test_get_lists_from_mailchimp(mock_mailchimp, admin_client):
5
+ assert MailingList.objects.count() == 0
6
+ admin_client.get('/cms-qe/newsletter/sync-lists')
7
+ assert MailingList.objects.count() == 2
8
+
9
+
10
+ def test_get_lists_from_mailchimp_not_staff(mock_mailchimp, client):
11
+ assert MailingList.objects.count() == 0
12
+ client.get('/cms-qe/newsletter/sync-lists')
13
+ assert MailingList.objects.count() == 0
@@ -1,3 +1,4 @@
1
+ from cms.models.pluginmodel import CMSPlugin
1
2
  from cms.plugin_base import CMSPluginBase
2
3
  from cms.plugin_pool import plugin_pool
3
4
 
@@ -29,3 +30,12 @@ class IframeTagPlugin(CMSPluginBase):
29
30
  name = 'IFRAME'
30
31
  module = 'HTML Elements'
31
32
  render_template = "cms_qe_plugins/iframe.html"
33
+
34
+
35
+ @plugin_pool.register_plugin
36
+ class PublishedOrDraftContentPlugin(CMSPluginBase):
37
+ model = CMSPlugin
38
+ name = "Published or draft content"
39
+ render_template = "cms_qe_plugins/published_or_draft_content.html"
40
+ cache = False
41
+ allow_children = True
@@ -0,0 +1,6 @@
1
+ {% load cms_tags %}
2
+ <span class="published-or-draft {% if user.is_authenticated and request.toolbar.edit_mode_active %}content-draft{% else %}content-published{% endif %}">
3
+ {% for plugin in instance.child_plugin_instances %}
4
+ {% with forloop as parentloop %}{% render_plugin plugin %}{% endwith %}
5
+ {% endfor %}
6
+ </span>
File without changes
@@ -0,0 +1,23 @@
1
+ from django.core.paginator import Page
2
+ from pytest_data import use_data
3
+
4
+
5
+ def test_get_header(cms_qe_table_model):
6
+ assert cms_qe_table_model.get_header() == ['username', 'password']
7
+
8
+
9
+ @use_data(cms_qe_table_model_data={'paging_show': False})
10
+ def test_get_items_without_paging(cms_qe_table_model):
11
+ assert cms_qe_table_model.get_items() == []
12
+
13
+
14
+ @use_data(cms_qe_table_model_data={'paging_show': True})
15
+ def test_get_items_with_paging(cms_qe_table_model):
16
+ items = cms_qe_table_model.get_items()
17
+ assert isinstance(items, Page)
18
+ assert list(items) == []
19
+
20
+
21
+ @use_data(cms_qe_table_model_data={'columns': ['does_not_exist']})
22
+ def test_columns_exist(cms_qe_table_model):
23
+ assert not cms_qe_table_model.columns_exist
@@ -0,0 +1,18 @@
1
+ from cms_qe_test import render_plugin
2
+
3
+ from ..cms_plugins import TablePlugin
4
+
5
+
6
+ def test_render():
7
+ html = render_plugin(TablePlugin, table='auth_user')
8
+ assert '<table>' in html
9
+
10
+
11
+ def test_render_not_existing_table():
12
+ html = render_plugin(TablePlugin, table='table_does_not_exist')
13
+ assert 'Table table_does_not_exist does not exist!' in html
14
+
15
+
16
+ def test_render_table_with_not_existing_column():
17
+ html = render_plugin(TablePlugin, table='auth_user', columns=['column_does_not_exist'])
18
+ assert 'Some column does not exist!' in html
@@ -0,0 +1,90 @@
1
+ import pytest
2
+ from django.contrib.auth import get_user_model
3
+ from django.db import models
4
+ from django.db.models import Q
5
+
6
+ from ..exceptions import TableDoesNotExists
7
+ from ..utils import get_field_type, get_filter_params, get_model_by_table, get_models_choices, get_table_choices
8
+
9
+
10
+ def test_get_model_by_table():
11
+ User = get_user_model()
12
+ model = get_model_by_table('auth_user')
13
+ assert model is User
14
+
15
+
16
+ def test_get_model_by_table_not_found():
17
+ with pytest.raises(TableDoesNotExists):
18
+ get_model_by_table('table_does_not_exist')
19
+
20
+
21
+ def test_get_all_models():
22
+ choices = get_models_choices()
23
+ choices_admin_group = [item[1] for item in choices if item[0] == 'admin'][0]
24
+ assert choices_admin_group == (
25
+ ('django_admin_log', 'LogEntry'),
26
+ )
27
+
28
+
29
+ def test_get_table_choices():
30
+ choices = get_table_choices('auth_user')
31
+ assert 'columns' in choices
32
+ assert ('username', 'username', 'string') in choices['columns']
33
+
34
+
35
+ @pytest.mark.parametrize('field, expected_type', [
36
+ (models.AutoField(), 'integer'),
37
+ (models.BigAutoField(), 'integer'),
38
+ (models.BigIntegerField(), 'integer'),
39
+ (models.BooleanField(), 'boolean'),
40
+ (models.CharField(), 'string'),
41
+ (models.DateField(), 'string'),
42
+ (models.DateTimeField(), 'string'),
43
+ (models.DecimalField(), 'float'),
44
+ (models.EmailField(), 'string'),
45
+ (models.FloatField(), 'float'),
46
+ (models.ForeignKey('LogEntry', on_delete=models.CASCADE), 'string'),
47
+ (models.IntegerField(), 'integer'),
48
+ (models.GenericIPAddressField(), 'string'),
49
+ (models.NullBooleanField(), 'boolean'),
50
+ (models.PositiveIntegerField(), 'integer'),
51
+ (models.PositiveSmallIntegerField(), 'integer'),
52
+ (models.SlugField(), 'string'),
53
+ (models.SmallIntegerField(), 'integer'),
54
+ (models.TextField(), 'string'),
55
+ (models.TimeField(), 'string'),
56
+ (models.URLField(), 'string'),
57
+ (models.UUIDField(), 'string'),
58
+ ])
59
+ def test_get_field_type(field, expected_type):
60
+ assert get_field_type(field) == expected_type
61
+
62
+
63
+ def test_get_filter_params():
64
+ class ForeignModel(models.Model):
65
+ text1 = models.CharField()
66
+ text2 = models.CharField()
67
+ flag = models.BooleanField()
68
+ number = models.IntegerField()
69
+
70
+ class Model(models.Model):
71
+ other = models.ForeignKey(ForeignModel, on_delete=models.CASCADE)
72
+ name = models.CharField()
73
+ active = models.BooleanField()
74
+ age = models.IntegerField()
75
+
76
+ args, kwds = get_filter_params(Model, {
77
+ 'other': 'abc',
78
+ 'name': 'name',
79
+ 'active': True,
80
+ 'age': 123,
81
+ 'non-existent-field': 'blah',
82
+ })
83
+ assert str(args) == str([
84
+ Q() | Q(other__text1__icontains='abc') | Q(other__text2__icontains='abc')
85
+ ])
86
+ assert kwds == {
87
+ 'name__icontains': 'name',
88
+ 'active': True,
89
+ 'age': 123,
90
+ }
File without changes
@@ -0,0 +1,96 @@
1
+ import pytest
2
+ from django.core.exceptions import ValidationError
3
+ from pytest_data import use_data
4
+
5
+ from cms_qe_video.models import VIMEO, YOUTUBE
6
+
7
+ non_default_data = {
8
+ 'controls': False,
9
+ 'width': 500,
10
+ 'height': 500,
11
+ 'autoplay': True,
12
+ 'loop': True,
13
+ 'muted': True,
14
+ }
15
+
16
+
17
+ def test__get_attributes_str_to_html_with_default_attributes(cms_qe_video_source_file_video_player_model):
18
+ attr_str = cms_qe_video_source_file_video_player_model._get_attributes_str_to_html(
19
+ ('width', 'height', 'controls', 'autoplay', 'loop', 'muted'))
20
+ assert 'width=500' not in attr_str and 'height=500' not in attr_str
21
+ assert 'controls' in attr_str
22
+ assert 'autoplay' not in attr_str
23
+ assert 'loop' not in attr_str
24
+ assert 'muted' not in attr_str
25
+
26
+
27
+ @use_data(cms_qe_video_source_file_video_player_model_data=non_default_data)
28
+ def test__get_attributes_str_to_html_with_non_default_attributes(cms_qe_video_source_file_video_player_model):
29
+ attr_str = cms_qe_video_source_file_video_player_model._get_attributes_str_to_html(
30
+ ('width', 'height', 'controls', 'autoplay', 'loop', 'muted'))
31
+ assert 'width=500' in attr_str and 'height=500' in attr_str
32
+ assert 'controls' not in attr_str
33
+ assert 'autoplay' in attr_str
34
+ assert 'loop' in attr_str
35
+ assert 'muted' in attr_str
36
+
37
+
38
+ def test__get_attributes_str_to_url_with_default_attributes(cms_qe_video_source_file_video_player_model):
39
+ attr_str = cms_qe_video_source_file_video_player_model._get_attributes_str_to_url(
40
+ ('width', 'height', 'controls', 'autoplay', 'loop', 'muted'))
41
+ assert 'width' not in attr_str and 'height' not in attr_str
42
+ assert 'controls=1' in attr_str
43
+ assert 'autoplay' not in attr_str
44
+ assert 'loop' not in attr_str
45
+ assert 'muted' not in attr_str
46
+
47
+
48
+ @use_data(cms_qe_video_source_file_video_player_model_data=non_default_data)
49
+ def test__get_attributes_str_to_url_with_non_default_attributes(cms_qe_video_source_file_video_player_model):
50
+ attr_str = cms_qe_video_source_file_video_player_model._get_attributes_str_to_url(
51
+ ('width', 'height', 'controls', 'autoplay', 'loop', 'muted'))
52
+ assert 'width=500' in attr_str and 'height=500' in attr_str
53
+ assert 'controls' not in attr_str
54
+ assert 'autoplay=1' in attr_str
55
+ assert 'loop=1' in attr_str
56
+ assert 'muted=1' in attr_str
57
+ assert attr_str.count('&') == 4
58
+
59
+
60
+ @use_data(
61
+ cms_qe_video_hosting_video_player_model_data={'video_hosting_service': YOUTUBE,
62
+ 'video_url': 'isnotyoutube.com/somevideo', })
63
+ def test_clean_youtube_bad_url(cms_qe_video_hosting_video_player_model):
64
+ with pytest.raises(ValidationError) as validation_exception:
65
+ cms_qe_video_hosting_video_player_model.clean()
66
+ validation_exception.match(r'.*YouTube.*')
67
+
68
+
69
+ @use_data(
70
+ cms_qe_video_hosting_video_player_model_data={'video_hosting_service': VIMEO,
71
+ 'video_url': 'notvimeo.com/somevideo', })
72
+ def test_clean_vimeo_bad_url(cms_qe_video_hosting_video_player_model):
73
+ with pytest.raises(ValidationError) as validation_exception:
74
+ cms_qe_video_hosting_video_player_model.clean()
75
+ validation_exception.match(r'.*Vimeo.*')
76
+
77
+
78
+ @use_data(cms_qe_video_hosting_video_player_model_data={'video_url': 'youtube.com/somevideo',
79
+ 'video_hosting_service': YOUTUBE})
80
+ def test_clean_youtube_good_urls(cms_qe_video_hosting_video_player_model):
81
+ cms_qe_video_hosting_video_player_model.clean()
82
+
83
+
84
+ @use_data(cms_qe_video_hosting_video_player_model_data={'video_url': 'vimeo.com/somevideo',
85
+ 'video_hosting_service': VIMEO})
86
+ def test_clean_vimeo_good_urls(cms_qe_video_hosting_video_player_model):
87
+ cms_qe_video_hosting_video_player_model.clean()
88
+
89
+
90
+ @use_data(cms_qe_video_hosting_video_player_model_data={'video_url': 'vimeo.com/somevideo',
91
+ 'video_hosting_service': VIMEO,
92
+ 'controls': False})
93
+ def test_clean_vimeo_disabled_controls(cms_qe_video_hosting_video_player_model):
94
+ with pytest.raises(ValidationError) as validation_exception:
95
+ cms_qe_video_hosting_video_player_model.clean()
96
+ validation_exception.match(r'.*Vimeo.*controls.*')
@@ -0,0 +1,24 @@
1
+ import re
2
+
3
+ from pytest_data import use_data
4
+
5
+ from cms_qe_test import render_plugin
6
+
7
+ from ..cms_plugins import HostingVideoPlayerPlugin, SourceFileVideoPlayerPlugin
8
+
9
+
10
+ @use_data(cms_qe_video_source_file_video_player_model_data={'source_file': None})
11
+ def test_render_source_file_video_plugin_without_source_file(cms_qe_video_source_file_video_player_model):
12
+ html = render_plugin(SourceFileVideoPlayerPlugin, cms_qe_video_source_file_video_player_model)
13
+ assert re.search(r'<p>Video file is missing</p>', html)
14
+
15
+
16
+ def test_render_source_file_video_plugin(cms_qe_video_source_file_video_player_model):
17
+ html = render_plugin(SourceFileVideoPlayerPlugin, cms_qe_video_source_file_video_player_model)
18
+ assert not re.search(r'<iframe(\s|.)*</iframe>', html)
19
+
20
+
21
+ def test_render_hosting_video_plugin(cms_qe_video_hosting_video_player_model):
22
+ html = render_plugin(HostingVideoPlayerPlugin, cms_qe_video_hosting_video_player_model)
23
+ assert not re.search(r'<video(\s|.)*</video>', html)
24
+ assert re.search(r'<iframe(\s|.)*</iframe>', html)
@@ -0,0 +1,20 @@
1
+ import pytest
2
+
3
+ from ..templatetags.cms_qe_video import cms_qe_video_url_to_embed
4
+
5
+
6
+ @pytest.mark.parametrize('url, expected', [
7
+ ('https://servis.com/somevideo', 'https://servis.com/somevideo'),
8
+ ('http://vimeo.com/somevideo', 'http://player.vimeo.com/video/somevideo'),
9
+ ('https://vimeo.com/somevideo', 'https://player.vimeo.com/video/somevideo'),
10
+ ('https://vimeo.com/somevideo?param', 'https://player.vimeo.com/video/somevideo'),
11
+ ('https://youtu.be/watch?v=ZGuQmszmtaQ', 'https://www.youtube.com/embed/ZGuQmszmtaQ'),
12
+ ('https://www.youtube.com/watch?v=ZGuQmszmtaQ', 'https://www.youtube.com/embed/ZGuQmszmtaQ'),
13
+ # Test for bug with additional parameters in link.
14
+ # Related on issue: https://gitlab.labs.nic.cz/websites/django-cms-qe/issues/41
15
+ ('https://www.youtube.com/watch?v=ZGuQmszmtaQ&index=10&list=PLfTu7SiuiT_izjvg_1JRKXkrWSnvuP4pd',
16
+ 'https://www.youtube.com/embed/ZGuQmszmtaQ'),
17
+ ('https://youtu.be/ZGuQmszmtaQ', 'https://www.youtube.com/embed/ZGuQmszmtaQ'),
18
+ ])
19
+ def test_url_to_embed(url, expected):
20
+ assert expected == cms_qe_video_url_to_embed(url)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-cms-qe
3
- Version: 3.4.2
3
+ Version: 3.5.0
4
4
  Summary: Django CMS Quick & Easy provides all important modules to run new page withouta lot of coding. Aims to do it very easily and securely.
5
5
  Home-page: https://websites.pages.nic.cz/django-cms-qe
6
6
  Author: CZ.NIC, z.s.p.o.
@@ -26,6 +26,7 @@ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
26
26
  Requires-Python: >=3.9
27
27
  Description-Content-Type: text/markdown
28
28
  License-File: LICENSE
29
+ Requires-Dist: Django~=4.2
29
30
  Requires-Dist: easy-thumbnails[svg]
30
31
  Requires-Dist: djangocms-frontend~=1.1
31
32
  Requires-Dist: django-csp~=3.7
@@ -34,7 +35,7 @@ Requires-Dist: django-axes~=6.0
34
35
  Requires-Dist: django-constance[database]~=2.9
35
36
  Requires-Dist: djangocms-file~=3.0
36
37
  Requires-Dist: django-import-export~=3.2
37
- Requires-Dist: django-mail-queue~=3.2
38
+ Requires-Dist: django-mail-queue==3.2.5
38
39
  Requires-Dist: djangocms-icon~=2.0
39
40
  Requires-Dist: djangocms-googlemap~=2.0
40
41
  Requires-Dist: django-tablib~=3.2
@@ -45,9 +46,18 @@ Requires-Dist: djangocms-aldryn-search
45
46
  Requires-Dist: django-haystack~=3.2
46
47
  Requires-Dist: pymemcache~=4.0
47
48
  Requires-Dist: whoosh~=2.7
49
+ Provides-Extra: build
50
+ Requires-Dist: Jinja2<3.1.0; extra == "build"
51
+ Requires-Dist: Sphinx==1.8.5; extra == "build"
48
52
  Provides-Extra: dev
49
53
  Requires-Dist: django-debug-toolbar~=4.1; extra == "dev"
50
54
  Requires-Dist: django-extensions~=3.2; extra == "dev"
55
+ Provides-Extra: mysql
56
+ Requires-Dist: mysqlclient~=2.2; extra == "mysql"
57
+ Provides-Extra: newsblog
58
+ Requires-Dist: djangocms-aldryn-newsblog; extra == "newsblog"
59
+ Provides-Extra: psql
60
+ Requires-Dist: psycopg2; extra == "psql"
51
61
  Provides-Extra: test
52
62
  Requires-Dist: flake8; extra == "test"
53
63
  Requires-Dist: isort; extra == "test"
@@ -66,15 +76,6 @@ Requires-Dist: webdriverwrapper==2.8.0; extra == "test"
66
76
  Requires-Dist: django-simple-captcha==0.5.14; extra == "test"
67
77
  Requires-Dist: testfixtures; extra == "test"
68
78
  Requires-Dist: tzdata; extra == "test"
69
- Provides-Extra: build
70
- Requires-Dist: Jinja2<3.1.0; extra == "build"
71
- Requires-Dist: Sphinx==1.8.5; extra == "build"
72
- Provides-Extra: psql
73
- Requires-Dist: psycopg2; extra == "psql"
74
- Provides-Extra: mysql
75
- Requires-Dist: mysqlclient~=2.2; extra == "mysql"
76
- Provides-Extra: newsblog
77
- Requires-Dist: djangocms-aldryn-newsblog; extra == "newsblog"
78
79
 
79
80
  # Django CMS QE
80
81
 
@@ -78,9 +78,15 @@ cms_qe/templates/cmsplugin_filer_folder/plugins/folder/main.html,sha256=8IiTXNU4
78
78
  cms_qe/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
79
  cms_qe/templatetags/cms_qe_filters.py,sha256=ciYCXLuMVde-f_-B_7a5mHfAJPWPMxYEUMgCHpualRY,784
80
80
  cms_qe/templatetags/kwacros.py,sha256=r2oHLltu8BgKKlrpgzXgvLjbIqwcrH13Lww3zTF-nr8,6275
81
+ cms_qe/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
+ cms_qe/tests/test_errors.py,sha256=sICTfVKbNbqDjpLvT_v485lML8P-MQBIyr9BJUDAKcw,2372
83
+ cms_qe/tests/test_export.py,sha256=mh6KO95gVt4Q7CTNDTHvHq4lQH-lFBVI5W4-cHImBto,3456
84
+ cms_qe/tests/test_monitoring.py,sha256=xa8mBu-TdBAUIUlnoWQpWtMDa5p8DmD0DCyR82Iu5K8,350
85
+ cms_qe/tests/test_utils.py,sha256=iPBDNE4YNsqw-nOfn2J0x74vgDl8xqvDJrFy7Z1U7yo,2535
86
+ cms_qe/tests/test_views_security.py,sha256=RvyilVNoAiWApgn3iWJk1t6IaVTn0z6zv5M5sOzyM18,701
81
87
  cms_qe/views/__init__.py,sha256=3b5FCZ5MaqgiWglC7c5mfvP3WYLWTtNp3YpVb9BgYi8,106
82
88
  cms_qe/views/errors.py,sha256=zUbCoyXy_MPsQv3UV1mgq-q2bwqPw9G4KgKU2-oue4w,3169
83
- cms_qe/views/maintenance.py,sha256=rBfovOGETlfGNF7jlv-vuTEfjZIb5x9dYCSIyFTgHgQ,1312
89
+ cms_qe/views/maintenance.py,sha256=Q410LCeeihRWhIJ-zzRpFSjfvA6xhgr6NJlNAoTNO2U,1658
84
90
  cms_qe/views/monitoring.py,sha256=1r2s_jm6B6P0gEmiqjH9m3loUW3BmJivvpg6qcUOxVM,1909
85
91
  cms_qe/views/search_result.py,sha256=H1eMOmtONnWqBDsBvz3MartyHhh42vyi0jPoxWb0X8c,296
86
92
  cms_qe/views/security.py,sha256=SNdJe4NSm1vuOGchVF3VqlmFDopt9xYoO-b4Y0UxkFU,1108
@@ -93,6 +99,14 @@ cms_qe_analytical/templates/cms_qe_analytical/google_tag_manager.html,sha256=MJJ
93
99
  cms_qe_analytical/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
100
  cms_qe_analytical/templatetags/google_analytics.py,sha256=cN87jJzwVcjhqSS2JKTmPt9WntuBLnzxEcwgjrQMJSg,7370
95
101
  cms_qe_analytical/templatetags/piwik.py,sha256=EHOaojmewFpMqHzm_QCtCXGc_HGoiCJ_G-LPc8IfjM4,4131
102
+ cms_qe_analytical/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
+ cms_qe_analytical/tests/settings.py,sha256=o8gNKNCS6Pwqmih2MUxkt3PUpNljta3Xx2_HdZfS6dU,438
104
+ cms_qe_analytical/tests/test_tag_google_analytics.py,sha256=n3ocL7rrsS_J2uy-ECObaCV7VJ4BjF_Y2abOPh24Rgs,8227
105
+ cms_qe_analytical/tests/test_tag_piwik.py,sha256=CZ9u_3tYVXFvVkH3t5e0vyibzylFIGqPYEWUjqS6z_8,6186
106
+ cms_qe_analytical/tests/test_utils.py,sha256=XWaemXx9P8Aab9GJWgx60cH1pfPuZieSvlPJ8z05PCY,4062
107
+ cms_qe_analytical/tests/utils.py,sha256=iZgimMaZmzotuRchh7qs5IaxuUUSYg4-ufigR91jyMg,1413
108
+ cms_qe_analytical/tests/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
+ cms_qe_analytical/tests/templatetags/dummy.py,sha256=mIRwUFWsdkmvKkUShCFkpVZLunRD7XhdXevpnf5WSB0,920
96
110
  cms_qe_auth/__init__.py,sha256=SZS-CdmFLgIN4WGaUX_780L-vH0lqC7CdxKWjm_EuxE,867
97
111
  cms_qe_auth/admin.py,sha256=PVxb9G_r6R4cyKvZUehENIN-aBSNDpqzA6O2gRbdQeQ,1135
98
112
  cms_qe_auth/apps.py,sha256=YiIgOI3Bxj4-7IZdxUEvHmTK1xS9fR2qMS-fe5AZ-W0,191
@@ -145,6 +159,11 @@ cms_qe_auth/templates/cms_qe/auth/email/activation.html,sha256=5KzIsVw-r_3yzi47t
145
159
  cms_qe_auth/templates/cms_qe/auth/email/activation.txt,sha256=rtNkt3bk-RHAWWU8TLS7JbJadHxAuTmW4TjQw6q4Czk,302
146
160
  cms_qe_auth/templates/cms_qe/auth/email/base.html,sha256=PsNYnKORXRZuhhr0Xcg8ebvd-VuJPaBn3ghStCoW8tw,511
147
161
  cms_qe_auth/templates/cms_qe/auth/email/base.txt,sha256=I7CXI7IuUYW_juVJIH1Dlc3asQlEmRMmJDf-thjqObU,142
162
+ cms_qe_auth/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
163
+ cms_qe_auth/tests/test_models.py,sha256=ps5FsQY9ohHHkxezWFwQn4Qv_XnZKSF6kxXm-fShW8s,2238
164
+ cms_qe_auth/tests/test_utils.py,sha256=NjV36oPUUF2eiaTt5SmO2u-dYQgLZiDr64VtpRbdMjI,767
165
+ cms_qe_auth/tests/test_view.py,sha256=LpIpWzU8QtjF0pRDkg24AiVM7lRiLSvS-rqVsMbWdsU,2284
166
+ cms_qe_auth/tests/utils.py,sha256=7aYvjZofMNBLA7VNwSxa1lp_eHnpURhIdvwaHnPmy_s,581
148
167
  cms_qe_breadcrumb/__init__.py,sha256=RSHANxs85gpPyR2td66syP--Ue6d5AiTv4kbcLWQRRU,344
149
168
  cms_qe_breadcrumb/cms_plugins.py,sha256=3-DFIh-LMn3-IL2UJM8Y8-zD-XuiWHMk1ZBXon1-Vls,387
150
169
  cms_qe_breadcrumb/tests.py,sha256=4eZDHwEMYxRJCvE8XI4M6eJRbGZIaq8PvrzN5eqbBgI,540
@@ -3888,9 +3907,16 @@ cms_qe_newsletter/templates/admin/cms_qe_newsletter/mailinglist/change_list.html
3888
3907
  cms_qe_newsletter/templates/cms_qe/newsletter/form.html,sha256=5YsoZlQsxlBfMStROmK8V9T0-w5akjCu3a75GlpO9bk,385
3889
3908
  cms_qe_newsletter/templates/cms_qe/newsletter/newsletter.html,sha256=0YnNGr4hNhAlkM-7ISeE8y1vRhFi7DdjJI_QH_B_ME4,195
3890
3909
  cms_qe_newsletter/templates/cms_qe/newsletter/submitted.html,sha256=mOgMi56fuo3VFGC7P_uIA0XQQ7qAkG130s-WuvmF-n4,51
3910
+ cms_qe_newsletter/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3911
+ cms_qe_newsletter/tests/test_mailchimp.py,sha256=_fwNbNjeZA1plUWgFl_NSjly9jqyzG170Bt-mavSQvM,1159
3912
+ cms_qe_newsletter/tests/test_managment.py,sha256=mz-ztXPtcVR01V8_mjpBpUgxwa1OrI90UgCShwnW3sA,886
3913
+ cms_qe_newsletter/tests/test_models.py,sha256=w428Cl_ZF_GvsGDavb8vIoZlkJLKL5Z7ZN5fK0d76ks,1432
3914
+ cms_qe_newsletter/tests/test_plugin.py,sha256=HhSz-QcXAp3KJelQ7r0Z3np_QNHrJY7QbPODv3NI9Pg,523
3915
+ cms_qe_newsletter/tests/test_sync.py,sha256=09Cszu3IWvgh6c8m8a-aXtbKWI_yZQbjwkfLT0fdlzI,2269
3916
+ cms_qe_newsletter/tests/test_views.py,sha256=IJ621fRok6kK2BfSKfnY-EWVfFXoVRD_rHBpiboZKnk,449
3891
3917
  cms_qe_plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3892
3918
  cms_qe_plugins/attributes.py,sha256=XWLp_Mo3ZQxqUXKOsv1ff-IAX8fnNi2FS_KqdoQT0hQ,760
3893
- cms_qe_plugins/cms_plugins.py,sha256=MLuIUaeVWMjG8zMqUrM5yqdSlmhgJdJ2T1OMHrvhTHg,683
3919
+ cms_qe_plugins/cms_plugins.py,sha256=U1A5oVJNz1uGJL8JT6HYbR1zx7S9B3m6nt4uhGmdK9k,988
3894
3920
  cms_qe_plugins/models.py,sha256=rJ8qKD8q2gp_dfWyXnmbXk3hz71DKoVuvr0fztk_gQ0,6789
3895
3921
  cms_qe_plugins/utils.py,sha256=7xnvez79gmODczHv_GEiQgvvaeALO2xWzNSKK33HoPw,306
3896
3922
  cms_qe_plugins/validators.py,sha256=qqLsCB-2kqC5QvWoSG3yqaVJVKvwPgq0QMwTrR3LKoA,445
@@ -3898,6 +3924,7 @@ cms_qe_plugins/migrations/0001_initial.py,sha256=O6dBegZWf6DwRKXTz5vx3lNZ-GcBrvG
3898
3924
  cms_qe_plugins/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3899
3925
  cms_qe_plugins/templates/cms_qe_plugins/iframe.html,sha256=rWJ7kj7lAjKAr2gJMRX1gRTUHBdVcuFJ-ajN2zZhZvE,978
3900
3926
  cms_qe_plugins/templates/cms_qe_plugins/link.html,sha256=zzAr1dAWckbPEw5RnkmFKdIZDnbKqVs_g47wbETusLs,713
3927
+ cms_qe_plugins/templates/cms_qe_plugins/published_or_draft_content.html,sha256=pxfmrUzG74L56FqvRixRuqbtqGTJ4yMy87sOYDWPl_I,333
3901
3928
  cms_qe_plugins/templates/cms_qe_plugins/script.html,sha256=PnOgFjXxtzOEKzGRQQnTdKiDTEzENl-_q14WYrbIYJ0,669
3902
3929
  cms_qe_table/__init__.py,sha256=0eiVSkglZ6A-QLBnGXQdTlysM6dj2kfTc6scFcUGGVA,1084
3903
3930
  cms_qe_table/cms_plugins.py,sha256=dR8b7h_xOJnQ4CDetxrfOiv1tfekhdnpe4KbKqasLi0,1065
@@ -3931,6 +3958,10 @@ cms_qe_table/templates/cms_qe/table/table_value_int.html,sha256=mjmA7u_ENXs3JHza
3931
3958
  cms_qe_table/templates/cms_qe/table/table_widget.html,sha256=tsjlS5Mc_6iALFk0QIexPkFVLEwSb1PlsCkntqfuTwk,1315
3932
3959
  cms_qe_table/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3933
3960
  cms_qe_table/templatetags/cms_qe_table_filters.py,sha256=eFBB2FoCcpQRAknMIJLac0ts18w8XIODbouuJlP0ty4,782
3961
+ cms_qe_table/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3962
+ cms_qe_table/tests/test_models.py,sha256=6DsUUvIwZXIxiys8NUECswb6Laxr3eUsiY1B9nFbolY,728
3963
+ cms_qe_table/tests/test_plugin.py,sha256=L66BSM-Yco2hI0ZPIEgx0IZeE3S_Z8DaVANDXKdEsbM,549
3964
+ cms_qe_table/tests/test_utils.py,sha256=hORUKMjRman02zW3dLb7f4RDgCL9E-wCtt-gfxifMCY,2857
3934
3965
  cms_qe_test/__init__.py,sha256=-Vc3K2g4JFSE2qw5AvuTGi4rwQGMOXAEycrjgFWk1BQ,121
3935
3966
  cms_qe_test/cms.py,sha256=pspLQxbnwG71PuZKtwfWDu6uVk7RYO86Od1cDXBF108,1796
3936
3967
  cms_qe_video/__init__.py,sha256=2iOdITrw_UvFcQpFA0rhUWBCRe2qvTuDvltp5Q233cc,1070
@@ -3951,6 +3982,10 @@ cms_qe_video/templates/cms_qe/video/video_source_file.html,sha256=QJF5fs88s9Fznp
3951
3982
  cms_qe_video/templates/cms_qe/video/video_widget.html,sha256=Yumciq6bGlAYI1lYx5j9V6IF8QYrncNYygPTkXEz6Wk,925
3952
3983
  cms_qe_video/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3953
3984
  cms_qe_video/templatetags/cms_qe_video.py,sha256=NR_mGv91J0rEreZrQjCzaaXSrZsKvrSas12wMJ-Dg24,1168
3985
+ cms_qe_video/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3986
+ cms_qe_video/tests/test_models.py,sha256=iTTQEFO9D8Shd5-5-EvM-mlvh8etww3c9Kf-DUVwz94,4366
3987
+ cms_qe_video/tests/test_plugin.py,sha256=cod8QXTGOLpFgzB105JvzVoyTRq2UOY5Jpqos6GvA9g,1046
3988
+ cms_qe_video/tests/test_templatetags.py,sha256=87koyj4w2PD2-bGQCrvE1UwULxDQSA_D_qL-ciM_L8U,1102
3954
3989
  example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3955
3990
  example/urls.py,sha256=H-IJsRGFVZGw6FD9gvK-0B0dLeSOsduziHvDvcHCQZ0,399
3956
3991
  example/wsgi.py,sha256=lCKhvtFZlorSIA8qYEqc3pZ1Oflrz_Tc696MWJ62ue4,396
@@ -3971,8 +4006,8 @@ test_selenium/pages/cms/__init__.py,sha256=_qe4YZYaQbrXp7Szmmeo4TUSkXlE5Rozu8E3t
3971
4006
  test_selenium/pages/cms/login.py,sha256=UPzJQcYff8NUAT4nvmfQoJQxzOJyPrJ_cKtH35NVfNg,521
3972
4007
  test_selenium/pages/cms/page.py,sha256=YQnpZkopfVnhoyQKpRDGqjNeV6xUl-pEHjEcZ9HRiPk,489
3973
4008
  test_selenium/pages/cms/wizard.py,sha256=yatbXH-rf1ap4O1hY0I13WikM3zkm_NrAiSK6bqENIU,545
3974
- django_cms_qe-3.4.2.dist-info/LICENSE,sha256=5wLaeUil0gfU9p8C4zn2Yu_PvZBNieUoYl0z9FcFWdA,1521
3975
- django_cms_qe-3.4.2.dist-info/METADATA,sha256=lnb8C6cwCgpGSpbSK_FRn8JgP0Q-DEFcVQeEQePHr2E,4622
3976
- django_cms_qe-3.4.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
3977
- django_cms_qe-3.4.2.dist-info/top_level.txt,sha256=T4dauFwJy7FmxCy7WoQI3pPwiDessNB2LkfOAP76ssE,172
3978
- django_cms_qe-3.4.2.dist-info/RECORD,,
4009
+ django_cms_qe-3.5.0.dist-info/LICENSE,sha256=5wLaeUil0gfU9p8C4zn2Yu_PvZBNieUoYl0z9FcFWdA,1521
4010
+ django_cms_qe-3.5.0.dist-info/METADATA,sha256=QyYycfNdYBbAMxdXvVfvOv4I5ygBW6kWImhmAALWRL4,4651
4011
+ django_cms_qe-3.5.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
4012
+ django_cms_qe-3.5.0.dist-info/top_level.txt,sha256=T4dauFwJy7FmxCy7WoQI3pPwiDessNB2LkfOAP76ssE,172
4013
+ django_cms_qe-3.5.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5