django-cms-qe 3.4.3__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.
- cms_qe/tests/__init__.py +0 -0
- cms_qe/tests/test_errors.py +61 -0
- cms_qe/tests/test_export.py +108 -0
- cms_qe/tests/test_monitoring.py +15 -0
- cms_qe/tests/test_utils.py +77 -0
- cms_qe/tests/test_views_security.py +18 -0
- cms_qe_analytical/tests/__init__.py +0 -0
- cms_qe_analytical/tests/settings.py +24 -0
- cms_qe_analytical/tests/templatetags/__init__.py +0 -0
- cms_qe_analytical/tests/templatetags/dummy.py +37 -0
- cms_qe_analytical/tests/test_tag_google_analytics.py +178 -0
- cms_qe_analytical/tests/test_tag_piwik.py +152 -0
- cms_qe_analytical/tests/test_utils.py +112 -0
- cms_qe_analytical/tests/utils.py +56 -0
- cms_qe_auth/tests/__init__.py +0 -0
- cms_qe_auth/tests/test_models.py +70 -0
- cms_qe_auth/tests/test_utils.py +36 -0
- cms_qe_auth/tests/test_view.py +72 -0
- cms_qe_auth/tests/utils.py +22 -0
- cms_qe_newsletter/tests/__init__.py +0 -0
- cms_qe_newsletter/tests/test_mailchimp.py +38 -0
- cms_qe_newsletter/tests/test_managment.py +22 -0
- cms_qe_newsletter/tests/test_models.py +43 -0
- cms_qe_newsletter/tests/test_plugin.py +21 -0
- cms_qe_newsletter/tests/test_sync.py +71 -0
- cms_qe_newsletter/tests/test_views.py +13 -0
- cms_qe_plugins/cms_plugins.py +10 -0
- cms_qe_plugins/templates/cms_qe_plugins/published_or_draft_content.html +6 -0
- cms_qe_table/tests/__init__.py +0 -0
- cms_qe_table/tests/test_models.py +23 -0
- cms_qe_table/tests/test_plugin.py +18 -0
- cms_qe_table/tests/test_utils.py +90 -0
- cms_qe_video/tests/__init__.py +0 -0
- cms_qe_video/tests/test_models.py +96 -0
- cms_qe_video/tests/test_plugin.py +24 -0
- cms_qe_video/tests/test_templatetags.py +20 -0
- {django_cms_qe-3.4.3.dist-info → django_cms_qe-3.5.0.dist-info}/METADATA +11 -23
- {django_cms_qe-3.4.3.dist-info → django_cms_qe-3.5.0.dist-info}/RECORD +41 -6
- {django_cms_qe-3.4.3.dist-info → django_cms_qe-3.5.0.dist-info}/WHEEL +1 -1
- {django_cms_qe-3.4.3.dist-info → django_cms_qe-3.5.0.dist-info}/LICENSE +0 -0
- {django_cms_qe-3.4.3.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
|
cms_qe_plugins/cms_plugins.py
CHANGED
|
@@ -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
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: django-cms-qe
|
|
3
|
-
Version: 3.
|
|
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.
|
|
@@ -46,9 +46,18 @@ Requires-Dist: djangocms-aldryn-search
|
|
|
46
46
|
Requires-Dist: django-haystack~=3.2
|
|
47
47
|
Requires-Dist: pymemcache~=4.0
|
|
48
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"
|
|
49
52
|
Provides-Extra: dev
|
|
50
53
|
Requires-Dist: django-debug-toolbar~=4.1; extra == "dev"
|
|
51
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"
|
|
52
61
|
Provides-Extra: test
|
|
53
62
|
Requires-Dist: flake8; extra == "test"
|
|
54
63
|
Requires-Dist: isort; extra == "test"
|
|
@@ -67,27 +76,6 @@ Requires-Dist: webdriverwrapper==2.8.0; extra == "test"
|
|
|
67
76
|
Requires-Dist: django-simple-captcha==0.5.14; extra == "test"
|
|
68
77
|
Requires-Dist: testfixtures; extra == "test"
|
|
69
78
|
Requires-Dist: tzdata; extra == "test"
|
|
70
|
-
Provides-Extra: build
|
|
71
|
-
Requires-Dist: Jinja2<3.1.0; extra == "build"
|
|
72
|
-
Requires-Dist: Sphinx==1.8.5; extra == "build"
|
|
73
|
-
Provides-Extra: psql
|
|
74
|
-
Requires-Dist: psycopg2; extra == "psql"
|
|
75
|
-
Provides-Extra: mysql
|
|
76
|
-
Requires-Dist: mysqlclient~=2.2; extra == "mysql"
|
|
77
|
-
Provides-Extra: newsblog
|
|
78
|
-
Requires-Dist: djangocms-aldryn-newsblog; extra == "newsblog"
|
|
79
|
-
Dynamic: author
|
|
80
|
-
Dynamic: author-email
|
|
81
|
-
Dynamic: classifier
|
|
82
|
-
Dynamic: description
|
|
83
|
-
Dynamic: description-content-type
|
|
84
|
-
Dynamic: home-page
|
|
85
|
-
Dynamic: keywords
|
|
86
|
-
Dynamic: license
|
|
87
|
-
Dynamic: provides-extra
|
|
88
|
-
Dynamic: requires-dist
|
|
89
|
-
Dynamic: requires-python
|
|
90
|
-
Dynamic: summary
|
|
91
79
|
|
|
92
80
|
# Django CMS QE
|
|
93
81
|
|
|
@@ -78,6 +78,12 @@ 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
89
|
cms_qe/views/maintenance.py,sha256=Q410LCeeihRWhIJ-zzRpFSjfvA6xhgr6NJlNAoTNO2U,1658
|
|
@@ -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=
|
|
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.
|
|
3975
|
-
django_cms_qe-3.
|
|
3976
|
-
django_cms_qe-3.
|
|
3977
|
-
django_cms_qe-3.
|
|
3978
|
-
django_cms_qe-3.
|
|
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,,
|
|
File without changes
|
|
File without changes
|