django-cms-qe 4.5.1__py3-none-any.whl → 4.5.2__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.
- -/__init__.py +0 -0
- -/browser.py +47 -0
- -/cms_qe/__init__.py +0 -0
- -/cms_qe/test_base.py +2 -0
- -/cms_qe/test_errors.py +14 -0
- -/conftest.py +6 -0
- -/fixtures/__init__.py +0 -0
- -/fixtures/base.py +75 -0
- -/pages/__init__.py +0 -0
- -/pages/cms/__init__.py +5 -0
- -/pages/cms/login.py +17 -0
- -/pages/cms/page.py +16 -0
- -/pages/cms/wizard.py +17 -0
- cms_qe/hooks.py +3 -1
- {django_cms_qe-4.5.1.dist-info → django_cms_qe-4.5.2.dist-info}/METADATA +1 -1
- {django_cms_qe-4.5.1.dist-info → django_cms_qe-4.5.2.dist-info}/RECORD +19 -6
- {django_cms_qe-4.5.1.dist-info → django_cms_qe-4.5.2.dist-info}/top_level.txt +1 -0
- {django_cms_qe-4.5.1.dist-info → django_cms_qe-4.5.2.dist-info}/WHEEL +0 -0
- {django_cms_qe-4.5.1.dist-info → django_cms_qe-4.5.2.dist-info}/licenses/LICENSE +0 -0
-/__init__.py
ADDED
|
File without changes
|
-/browser.py
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from selenium.common.exceptions import NoSuchElementException
|
|
2
|
+
from webdriverwrapper import Chrome as _Chrome
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ChromeBrowser(_Chrome):
|
|
6
|
+
def get_error_page(self):
|
|
7
|
+
# Django error page.
|
|
8
|
+
try:
|
|
9
|
+
error_page = self.get_elm('summary')
|
|
10
|
+
except NoSuchElementException:
|
|
11
|
+
pass
|
|
12
|
+
else:
|
|
13
|
+
header = error_page.get_elm(tag_name='h1')
|
|
14
|
+
return header.text
|
|
15
|
+
|
|
16
|
+
# Generic error page.
|
|
17
|
+
try:
|
|
18
|
+
error_page = self.get_elm('error-page')
|
|
19
|
+
except NoSuchElementException:
|
|
20
|
+
pass
|
|
21
|
+
else:
|
|
22
|
+
header = error_page.get_elm(tag_name='h1')
|
|
23
|
+
return header.text
|
|
24
|
+
|
|
25
|
+
def get_error_traceback(self):
|
|
26
|
+
try:
|
|
27
|
+
traceback = self.get_elm('traceback_area')
|
|
28
|
+
except NoSuchElementException:
|
|
29
|
+
pass
|
|
30
|
+
else:
|
|
31
|
+
return traceback.text
|
|
32
|
+
|
|
33
|
+
def get_error_messages(self):
|
|
34
|
+
try:
|
|
35
|
+
error_elms = self.get_elms(xpath='//*[contains(@class, "alert-danger")]')
|
|
36
|
+
except NoSuchElementException:
|
|
37
|
+
return []
|
|
38
|
+
else:
|
|
39
|
+
return [error_elm.text for error_elm in error_elms]
|
|
40
|
+
|
|
41
|
+
def get_info_messages(self):
|
|
42
|
+
try:
|
|
43
|
+
info_elms = self.get_elms(xpath='//*[contains(@class, "alert-success")]')
|
|
44
|
+
except NoSuchElementException:
|
|
45
|
+
return []
|
|
46
|
+
else:
|
|
47
|
+
return [info_elm.get_attribute('info') for info_elm in info_elms]
|
-/cms_qe/__init__.py
ADDED
|
File without changes
|
-/cms_qe/test_base.py
ADDED
-/cms_qe/test_errors.py
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from webdriverwrapper.decorators import expected_error_page
|
|
2
|
+
|
|
3
|
+
from ..pages.cms import CreatePagePage
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@expected_error_page(None)
|
|
7
|
+
def test_page_not_found(driver):
|
|
8
|
+
driver.go_to('/404')
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# No error page should be detected.
|
|
12
|
+
def test_page_not_found_custom_by_cms(driver):
|
|
13
|
+
CreatePagePage(driver).open().create_page('Page not found', slug='error404')
|
|
14
|
+
driver.go_to('/404')
|
-/conftest.py
ADDED
-/fixtures/__init__.py
ADDED
|
File without changes
|
-/fixtures/base.py
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from selenium import webdriver
|
|
5
|
+
from webdriverwrapper.pytest import * # noqa: F403,F401
|
|
6
|
+
|
|
7
|
+
from ..browser import ChromeBrowser
|
|
8
|
+
from ..pages.cms import LoginPage, WizardPage
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
'display',
|
|
12
|
+
'session_driver',
|
|
13
|
+
'_driver',
|
|
14
|
+
'homepage_url',
|
|
15
|
+
'admin_username',
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@pytest.fixture(scope='session', autouse=True)
|
|
20
|
+
def display(request):
|
|
21
|
+
no_display = request.config.getoption('--no-display')
|
|
22
|
+
|
|
23
|
+
if no_display:
|
|
24
|
+
yield
|
|
25
|
+
else:
|
|
26
|
+
from pyvirtualdisplay import Display
|
|
27
|
+
|
|
28
|
+
display = Display(visible=0, size=(1200, 2000))
|
|
29
|
+
display.start()
|
|
30
|
+
yield
|
|
31
|
+
display.stop()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@pytest.yield_fixture(scope='session')
|
|
35
|
+
def session_driver(request, homepage_url, admin_username):
|
|
36
|
+
no_display = request.config.getoption('--no-display')
|
|
37
|
+
|
|
38
|
+
driver = open_browser(homepage_url)
|
|
39
|
+
try:
|
|
40
|
+
LoginPage(driver).open().login(admin_username)
|
|
41
|
+
WizardPage(driver).open().create_home_page()
|
|
42
|
+
yield driver
|
|
43
|
+
finally:
|
|
44
|
+
if not no_display:
|
|
45
|
+
driver.quit()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def open_browser(homepage_url):
|
|
49
|
+
"""
|
|
50
|
+
Open browser a type URL `homepage_url`.
|
|
51
|
+
"""
|
|
52
|
+
chrome_options = webdriver.ChromeOptions()
|
|
53
|
+
chrome_options.add_argument('--incognito')
|
|
54
|
+
chrome_options.add_argument('--no-sandbox') # So it will work in GitLab CI.
|
|
55
|
+
|
|
56
|
+
driver = ChromeBrowser(chrome_options=chrome_options)
|
|
57
|
+
driver.get(homepage_url)
|
|
58
|
+
return driver
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@pytest.fixture
|
|
62
|
+
def _driver(session_driver, homepage_url):
|
|
63
|
+
session_driver.get(homepage_url)
|
|
64
|
+
return session_driver
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@pytest.fixture(scope='session')
|
|
68
|
+
def homepage_url():
|
|
69
|
+
port = os.environ.get('WEB_PORT', '8000')
|
|
70
|
+
return f'http://localhost:{port}'
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@pytest.fixture(scope='session')
|
|
74
|
+
def admin_username():
|
|
75
|
+
return os.environ.get('ADMIN_USER', 'admin')
|
-/pages/__init__.py
ADDED
|
File without changes
|
-/pages/cms/__init__.py
ADDED
-/pages/cms/login.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class LoginPage:
|
|
2
|
+
def __init__(self, driver):
|
|
3
|
+
self._driver = driver
|
|
4
|
+
|
|
5
|
+
def open(self):
|
|
6
|
+
self._driver.go_to('/admin')
|
|
7
|
+
return self
|
|
8
|
+
|
|
9
|
+
def login(self, username, password=None):
|
|
10
|
+
"""
|
|
11
|
+
Log in to Django CMS application as `username` with `password`.
|
|
12
|
+
If `password` is empty, then is used same as `username`.
|
|
13
|
+
"""
|
|
14
|
+
self._driver.get_elm('login-form').fill_out_and_submit({
|
|
15
|
+
'username': username,
|
|
16
|
+
'password': password or username,
|
|
17
|
+
})
|
-/pages/cms/page.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class CreatePagePage:
|
|
2
|
+
def __init__(self, driver):
|
|
3
|
+
self._driver = driver
|
|
4
|
+
|
|
5
|
+
def open(self):
|
|
6
|
+
self._driver.go_to('/admin/cms/page/add/')
|
|
7
|
+
return self
|
|
8
|
+
|
|
9
|
+
def create_page(self, title, slug=''):
|
|
10
|
+
# Title will automatically set slug which we want to force.
|
|
11
|
+
self._driver.get_elm(tag_name='form').fill_out({
|
|
12
|
+
'title': title,
|
|
13
|
+
})
|
|
14
|
+
self._driver.get_elm(tag_name='form').fill_out_and_submit({
|
|
15
|
+
'slug': slug,
|
|
16
|
+
})
|
-/pages/cms/wizard.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class WizardPage:
|
|
2
|
+
def __init__(self, driver):
|
|
3
|
+
self._driver = driver
|
|
4
|
+
|
|
5
|
+
def open(self):
|
|
6
|
+
self._driver.go_to('/cms_wizard/create/?language=en')
|
|
7
|
+
return self
|
|
8
|
+
|
|
9
|
+
def create_home_page(self):
|
|
10
|
+
"""
|
|
11
|
+
Creates empty homepage for Django CMS. Usuful to create some
|
|
12
|
+
at the beggining of tests so any test can start somewhere.
|
|
13
|
+
"""
|
|
14
|
+
self._driver.get_elm(tag_name='form').submit()
|
|
15
|
+
self._driver.get_elm(tag_name='form').fill_out_and_submit({
|
|
16
|
+
'1-title': 'homepage',
|
|
17
|
+
})
|
cms_qe/hooks.py
CHANGED
|
@@ -8,6 +8,7 @@ from django.db import InternalError, connection
|
|
|
8
8
|
from django.http import HttpRequest, HttpResponseRedirect
|
|
9
9
|
from django.template.response import TemplateResponse
|
|
10
10
|
from django.urls import reverse
|
|
11
|
+
from django.utils.module_loading import import_string
|
|
11
12
|
from django.utils.translation import gettext_lazy as _
|
|
12
13
|
from djangocms_alias.models import AliasContent
|
|
13
14
|
from menus.menu_pool import MenuRenderer, menu_pool
|
|
@@ -49,7 +50,8 @@ class PgIsInRecoveryLoginView(LoginView):
|
|
|
49
50
|
class PgIsInRecoveryMenuRenderer(MenuRenderer):
|
|
50
51
|
|
|
51
52
|
def __init__(self, pool, request):
|
|
52
|
-
|
|
53
|
+
menu_path = getattr(settings, "CMS_QE_CMSMENU", None)
|
|
54
|
+
pool.menus['CMSMenu'] = CMSMenu if menu_path is None else import_string(menu_path)
|
|
53
55
|
super().__init__(pool, request)
|
|
54
56
|
|
|
55
57
|
def get_nodes(self, namespace=None, root_id=None, breadcrumb=False):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-cms-qe
|
|
3
|
-
Version: 4.5.
|
|
3
|
+
Version: 4.5.2
|
|
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.
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
-/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
-/browser.py,sha256=OcfqxDa9OtL7M5CSwfIxtzToMUEhqGLvditemPeEUNo,1437
|
|
3
|
+
-/conftest.py,sha256=mAptaAyj7a1hbUPDRWBBs1qL0TJ8Fma7Mch6PZwgtNo,220
|
|
4
|
+
-/cms_qe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
-/cms_qe/test_base.py,sha256=RbJQLvSvrskOibwY7CmR2XrYCWHBk2UTVyvJwZuDXpE,36
|
|
6
|
+
-/cms_qe/test_errors.py,sha256=oGwegQ6hmS-VgnuYKRFOSaVpfNXX5tDdNemGSJoDNpw,378
|
|
7
|
+
-/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
-/fixtures/base.py,sha256=c5oqqqvtCRUmVQdvlu6kPBypGz8gdIPJP0Gcvl6fBGs,1788
|
|
9
|
+
-/pages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
+
-/pages/cms/__init__.py,sha256=_qe4YZYaQbrXp7Szmmeo4TUSkXlE5Rozu8E3tthA6-E,150
|
|
11
|
+
-/pages/cms/login.py,sha256=UPzJQcYff8NUAT4nvmfQoJQxzOJyPrJ_cKtH35NVfNg,521
|
|
12
|
+
-/pages/cms/page.py,sha256=YQnpZkopfVnhoyQKpRDGqjNeV6xUl-pEHjEcZ9HRiPk,489
|
|
13
|
+
-/pages/cms/wizard.py,sha256=yatbXH-rf1ap4O1hY0I13WikM3zkm_NrAiSK6bqENIU,545
|
|
1
14
|
cms_qe/__init__.py,sha256=do1c4s8BgjukMZMMMhBHs_lG9j8ncnAjR3oTICWEq5w,684
|
|
2
15
|
cms_qe/admin.py,sha256=eLqAF3UIDWWyA0xE0Ft5WP5_3HImSWk3EYL2cRfL_8A,171
|
|
3
16
|
cms_qe/apps.py,sha256=AeRcBWwGs7rKLlzHhnV8M_2BEnkoO9959VwesxfHaio,338
|
|
@@ -8,7 +21,7 @@ cms_qe/cms_menus_mixin.py,sha256=1i0t2PQoabzffuOZKIhneiJJ9K8Nz70dDS6DqWlJMRg,245
|
|
|
8
21
|
cms_qe/constants.py,sha256=YWUWCIabSwcamGZynvkJ9i8OWGtfHf-wFirm8GtqQpI,90
|
|
9
22
|
cms_qe/export.py,sha256=3MflO_EmaCrlqqa-cTMOiRirsp3r4mxdQNt-Zh5FtzY,8242
|
|
10
23
|
cms_qe/fixtures.py,sha256=cq_wnZnqBwPBOHpp_0bHk424iCXKvwmN6ZaKwDvguXk,755
|
|
11
|
-
cms_qe/hooks.py,sha256=
|
|
24
|
+
cms_qe/hooks.py,sha256=8xDLsSDZ9iEtzheFpCQSjbc8HhCkB47L0_Rt3hnt-rw,3649
|
|
12
25
|
cms_qe/ldap.py,sha256=2mpFdLoIdT_pAiGJ6ADnE74YXjaC55aNANv0L8DVwqU,188
|
|
13
26
|
cms_qe/monitoring.py,sha256=5t_o7o0htmAAxVjkN2oz0O0v9XdzfePhSfPGcLNPmE8,769
|
|
14
27
|
cms_qe/signals.py,sha256=MbuLSxPlJA147LEg-lDWDoUNTV1y0OKjwoI3HzgR97g,1253
|
|
@@ -3977,8 +3990,8 @@ cms_qe_video/templates/cms_qe/video/video_source_file.html,sha256=QJF5fs88s9Fznp
|
|
|
3977
3990
|
cms_qe_video/templates/cms_qe/video/video_widget.html,sha256=Yumciq6bGlAYI1lYx5j9V6IF8QYrncNYygPTkXEz6Wk,925
|
|
3978
3991
|
cms_qe_video/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3979
3992
|
cms_qe_video/templatetags/cms_qe_video.py,sha256=NR_mGv91J0rEreZrQjCzaaXSrZsKvrSas12wMJ-Dg24,1168
|
|
3980
|
-
django_cms_qe-4.5.
|
|
3981
|
-
django_cms_qe-4.5.
|
|
3982
|
-
django_cms_qe-4.5.
|
|
3983
|
-
django_cms_qe-4.5.
|
|
3984
|
-
django_cms_qe-4.5.
|
|
3993
|
+
django_cms_qe-4.5.2.dist-info/licenses/LICENSE,sha256=5wLaeUil0gfU9p8C4zn2Yu_PvZBNieUoYl0z9FcFWdA,1521
|
|
3994
|
+
django_cms_qe-4.5.2.dist-info/METADATA,sha256=gS35alR2Z2Ld0jd03FqC6vCiL1xPXHnkEWCe7UjIK8Q,6399
|
|
3995
|
+
django_cms_qe-4.5.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
3996
|
+
django_cms_qe-4.5.2.dist-info/top_level.txt,sha256=kTKoWq2LvtdlDtFHYsZB5eRkNW7m6Jf7IVA3nks0984,152
|
|
3997
|
+
django_cms_qe-4.5.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|