django-cms-qe 3.4.3__py3-none-any.whl → 3.6.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/api/__init__.py +0 -0
- cms_qe/api/constants.py +1 -0
- cms_qe/api/permissions.py +12 -0
- cms_qe/api/urls.py +32 -0
- cms_qe/api/utils.py +14 -0
- cms_qe/api/views.py +20 -0
- cms_qe/locale/cs/LC_MESSAGES/django.po +12 -0
- cms_qe/migrations/0001_api_permissions.py +19 -0
- cms_qe/migrations/__init__.py +0 -0
- cms_qe/settings/base/app.py +9 -0
- cms_qe/templates/admin/index.html +38 -0
- cms_qe/urls.py +1 -0
- cms_qe_auth/utils.py +6 -2
- cms_qe_plugins/cms_plugins.py +10 -0
- cms_qe_plugins/templates/cms_qe_plugins/published_or_draft_content.html +6 -0
- {django_cms_qe-3.4.3.dist-info → django_cms_qe-3.6.0.dist-info}/METADATA +8 -2
- {django_cms_qe-3.4.3.dist-info → django_cms_qe-3.6.0.dist-info}/RECORD +20 -12
- {django_cms_qe-3.4.3.dist-info → django_cms_qe-3.6.0.dist-info}/WHEEL +1 -1
- cms_qe/static/css/fix-admin.css +0 -14
- cms_qe/templates/admin/change_form.html +0 -7
- {django_cms_qe-3.4.3.dist-info → django_cms_qe-3.6.0.dist-info/licenses}/LICENSE +0 -0
- {django_cms_qe-3.4.3.dist-info → django_cms_qe-3.6.0.dist-info}/top_level.txt +0 -0
cms_qe/api/__init__.py
ADDED
|
File without changes
|
cms_qe/api/constants.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CMS_QE_USER_ACCES_API_PERMISSION = "cms_qe_auth.accessapi_user"
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# from django.conf import settings
|
|
2
|
+
from rest_framework.permissions import BasePermission
|
|
3
|
+
|
|
4
|
+
from .constants import CMS_QE_USER_ACCES_API_PERMISSION
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class CmsQeApiPermission(BasePermission):
|
|
8
|
+
"""Permission class checking user type."""
|
|
9
|
+
|
|
10
|
+
def has_permission(self, request, view):
|
|
11
|
+
"""Check user access permission to the API."""
|
|
12
|
+
return request.user.has_perm(CMS_QE_USER_ACCES_API_PERMISSION)
|
cms_qe/api/urls.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from django.conf import settings
|
|
2
|
+
from django.urls import include, path
|
|
3
|
+
from django.utils.module_loading import import_string
|
|
4
|
+
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
|
|
5
|
+
from knox.auth import TokenAuthentication
|
|
6
|
+
from knox.views import LoginView as KnoxLoginView, LogoutView as KnoxLogoutView
|
|
7
|
+
from rest_framework import routers
|
|
8
|
+
|
|
9
|
+
from .permissions import CmsQeApiPermission
|
|
10
|
+
from .views import CmsQeBasicAuthentication
|
|
11
|
+
|
|
12
|
+
ROUTER = routers.DefaultRouter()
|
|
13
|
+
|
|
14
|
+
for url, view_path, name in getattr(settings, "API_VIEWS", []):
|
|
15
|
+
BaseClass = import_string(view_path)
|
|
16
|
+
ApiClass = type(f'Api{BaseClass.__name__}', (BaseClass,), {
|
|
17
|
+
"authentication_classes": BaseClass.authentication_classes + [CmsQeBasicAuthentication, TokenAuthentication],
|
|
18
|
+
"permission_classes": BaseClass.permission_classes + [CmsQeApiPermission],
|
|
19
|
+
})
|
|
20
|
+
ROUTER.register(url, ApiClass, basename=name)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
urlpatterns = [
|
|
24
|
+
path("", include(ROUTER.urls)),
|
|
25
|
+
path("login/", KnoxLoginView.as_view(
|
|
26
|
+
authentication_classes=(CmsQeBasicAuthentication,), permission_classes=(CmsQeApiPermission,)),),
|
|
27
|
+
path("logout/", KnoxLogoutView.as_view()),
|
|
28
|
+
# Docs
|
|
29
|
+
path("schema/", SpectacularAPIView.as_view(), name="schema"),
|
|
30
|
+
path("schema/swagger/", SpectacularSwaggerView.as_view(url_name="schema"), name="swagger"),
|
|
31
|
+
path('schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
|
|
32
|
+
]
|
cms_qe/api/utils.py
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
REST_FRAMEWORK = {
|
|
3
|
+
'EXCEPTION_HANDLER': 'cms_qe.api.utils.exception_handler'
|
|
4
|
+
}
|
|
5
|
+
"""
|
|
6
|
+
from rest_framework.response import Response
|
|
7
|
+
from rest_framework.views import exception_handler as rest_exception_handler
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def exception_handler(exc: Exception, context: dict) -> Response:
|
|
11
|
+
response = rest_exception_handler(exc, context)
|
|
12
|
+
if response is not None:
|
|
13
|
+
response.data["error"] = {"message": response.data.get("detail")}
|
|
14
|
+
return response
|
cms_qe/api/views.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from django.contrib.auth import get_user_model
|
|
2
|
+
from django.db.models import Model
|
|
3
|
+
from django.http import HttpRequest
|
|
4
|
+
from django.utils.translation import gettext_lazy as _
|
|
5
|
+
from rest_framework.authentication import BasicAuthentication
|
|
6
|
+
from rest_framework.exceptions import AuthenticationFailed
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class CmsQeBasicAuthentication(BasicAuthentication):
|
|
10
|
+
|
|
11
|
+
def authenticate_credentials(self, userid: str, password: str, request: HttpRequest = None) -> tuple[Model, None]:
|
|
12
|
+
"""Check credentials against settings and return AnonymousUser or None."""
|
|
13
|
+
class_user = get_user_model()
|
|
14
|
+
try:
|
|
15
|
+
user = class_user.objects.get(username=userid, is_active=True)
|
|
16
|
+
except class_user.DoesNotExist as err:
|
|
17
|
+
raise AuthenticationFailed(_("User inactive or deleted.")) from err
|
|
18
|
+
if user.check_password(password):
|
|
19
|
+
return (user, None)
|
|
20
|
+
raise AuthenticationFailed(_("Invalid username/password."))
|
|
@@ -92,6 +92,9 @@ msgstr "Kontejner"
|
|
|
92
92
|
msgid "Fluid container"
|
|
93
93
|
msgstr "Plovoucí kontejner"
|
|
94
94
|
|
|
95
|
+
msgid "For example:"
|
|
96
|
+
msgstr "Například:"
|
|
97
|
+
|
|
95
98
|
#: cms_qe/settings/base/cms.py:64
|
|
96
99
|
msgid "Full container"
|
|
97
100
|
msgstr "Plný kontejner"
|
|
@@ -120,3 +123,12 @@ msgstr "Obecná chyba"
|
|
|
120
123
|
#: cms_qe/templates/cms_qe/internal_error.html:7
|
|
121
124
|
msgid "Something went very wrong. Please try again later."
|
|
122
125
|
msgstr ""
|
|
126
|
+
|
|
127
|
+
msgid ""
|
|
128
|
+
"To log into the API, the user needs to have the access permission assigned. "
|
|
129
|
+
"To access other records in the API, the user must have the VIEW permission "
|
|
130
|
+
"set for the model."
|
|
131
|
+
msgstr ""
|
|
132
|
+
"Pro přihlášení do API je potřeba, aby uživatel měl přiděleno oprávnění "
|
|
133
|
+
"ACCESS. Pro přístup k dalším záznamům v API je nutné, aby uživatel měl "
|
|
134
|
+
"nastaveno oprávnění VIEW pro daný model."
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from django.db import migrations
|
|
2
|
+
|
|
3
|
+
from cms_qe.api.constants import CMS_QE_USER_ACCES_API_PERMISSION
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def create_permission(apps, schema_editor):
|
|
7
|
+
ContentType = apps.get_model("contenttypes", "ContentType")
|
|
8
|
+
Permission = apps.get_model("auth", "Permission")
|
|
9
|
+
app_label, model = CMS_QE_USER_ACCES_API_PERMISSION.split(".")
|
|
10
|
+
cms_qe_user, _ = ContentType.objects.get_or_create(app_label=app_label)
|
|
11
|
+
Permission.objects.get_or_create(defaults={ "content_type": cms_qe_user, "codename": model}, name="Can access to the API")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Migration(migrations.Migration):
|
|
15
|
+
dependencies = []
|
|
16
|
+
|
|
17
|
+
operations = [
|
|
18
|
+
migrations.RunPython(create_permission),
|
|
19
|
+
]
|
|
File without changes
|
cms_qe/settings/base/app.py
CHANGED
|
@@ -95,6 +95,12 @@ INSTALLED_APPS = [
|
|
|
95
95
|
'standard_form',
|
|
96
96
|
'spurl',
|
|
97
97
|
'aldryn_search',
|
|
98
|
+
|
|
99
|
+
# Site REST API
|
|
100
|
+
'rest_framework',
|
|
101
|
+
'knox',
|
|
102
|
+
'django_filters',
|
|
103
|
+
'drf_spectacular',
|
|
98
104
|
]
|
|
99
105
|
|
|
100
106
|
MIDDLEWARE = [
|
|
@@ -135,3 +141,6 @@ MIDDLEWARE = [
|
|
|
135
141
|
|
|
136
142
|
# Reload site. For example ['uwsgi', '--reload', '/var/run/uwsgi.pid'] or ['touch', 'manage.py'].
|
|
137
143
|
RELOAD_SITE: list[str] = []
|
|
144
|
+
|
|
145
|
+
# API views: [("path/", "module.api.views.RecordViewSet", "api-records"), ...]
|
|
146
|
+
# API_VIEWS: list[tuple[str, str, str]] = []
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{% extends "admin/index.html" %}
|
|
2
|
+
{% load i18n %}
|
|
3
|
+
|
|
4
|
+
{% block content %}
|
|
5
|
+
{{ block.super }}
|
|
6
|
+
{% if not app_label %}
|
|
7
|
+
{% if perms.cms_qe_auth.accessapi_user or perms.auth.add_permission %}
|
|
8
|
+
<div class="module">
|
|
9
|
+
<table>
|
|
10
|
+
<caption><h3>REST API</h3></caption>
|
|
11
|
+
<tbody>
|
|
12
|
+
<tr scope="row">
|
|
13
|
+
<td><a href="{% url "api-root" %}">{% url "api-root" %}</a></td>
|
|
14
|
+
</tr>
|
|
15
|
+
<tr scope="row">
|
|
16
|
+
<td><a href="{% url "api-root" %}schema/swagger/">{% url "api-root" %}schema/swagger/</a></td>
|
|
17
|
+
</tr>
|
|
18
|
+
<tr scope="row">
|
|
19
|
+
<td><a href="{% url "api-root" %}schema/redoc/">{% url "api-root" %}schema/redoc/</a></td>
|
|
20
|
+
</tr>
|
|
21
|
+
</tbody>
|
|
22
|
+
</table>
|
|
23
|
+
{% if perms.auth.add_permission %}
|
|
24
|
+
<p>
|
|
25
|
+
{% blocktranslate trimmed %}
|
|
26
|
+
To log into the API, the user needs to have the access permission assigned.
|
|
27
|
+
To access other records in the API, the user must have the VIEW permission set for the model.
|
|
28
|
+
{% endblocktranslate %}
|
|
29
|
+
</p>
|
|
30
|
+
<div>{% translate "For example:" %}</div>
|
|
31
|
+
<div><code>cms_qe_auth | user | Can access to the API</code></div>
|
|
32
|
+
<div><code>aldryn_forms | Form submission | Can view Form submission</code></div>
|
|
33
|
+
<div><code>aldryn_forms | Form plugin | Can view Form plugin</code></div>
|
|
34
|
+
{% endif %}
|
|
35
|
+
</div>
|
|
36
|
+
{% endif %}
|
|
37
|
+
{% endif %}
|
|
38
|
+
{% endblock %}
|
cms_qe/urls.py
CHANGED
|
@@ -40,6 +40,7 @@ urlpatterns = [
|
|
|
40
40
|
path('', include('cms_qe_newsletter.urls')),
|
|
41
41
|
path('sitemap.xml', sitemap, {'sitemaps': {'cmspages': CMSSitemap}}),
|
|
42
42
|
path('api/monitoring', views.get_monitoring),
|
|
43
|
+
path('api/v1/', include('cms_qe.api.urls'), name="api-root"),
|
|
43
44
|
path('.well-known/security.txt', SecurityTxtView.as_view(), name='security-txt'),
|
|
44
45
|
path('site-search-result/', SiteSearchView.as_view(), name='site-search-result'),
|
|
45
46
|
path("healthcheck/", HealthCheckView.as_view(), name='healthcheck'), # Used by uwsgi in docker.
|
cms_qe_auth/utils.py
CHANGED
|
@@ -8,6 +8,7 @@ from django.contrib.auth import get_user_model
|
|
|
8
8
|
from django.core.exceptions import ValidationError
|
|
9
9
|
from django.utils.encoding import force_bytes, force_str
|
|
10
10
|
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
|
|
11
|
+
from django.utils.module_loading import import_string
|
|
11
12
|
|
|
12
13
|
ACTION_OK = 250 # Requested mail action okay, completed.
|
|
13
14
|
|
|
@@ -84,5 +85,8 @@ class SMTPCheckRecipient:
|
|
|
84
85
|
|
|
85
86
|
def smtp_server_accepts_email_address(address: str) -> None:
|
|
86
87
|
"""SMTP server accepts email address. Raise ValidationError if not."""
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
backend = import_string(settings.EMAIL_BACKEND)
|
|
89
|
+
if hasattr(backend, "host"):
|
|
90
|
+
# Check only smtp backend.
|
|
91
|
+
with SMTPCheckRecipient(settings.EMAIL_HOST) as checker:
|
|
92
|
+
checker.check(address)
|
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>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: django-cms-qe
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.6.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,6 +46,11 @@ 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
|
+
Requires-Dist: djangorestframework
|
|
50
|
+
Requires-Dist: markdown
|
|
51
|
+
Requires-Dist: django-filter
|
|
52
|
+
Requires-Dist: django-rest-knox
|
|
53
|
+
Requires-Dist: drf-spectacular
|
|
49
54
|
Provides-Extra: dev
|
|
50
55
|
Requires-Dist: django-debug-toolbar~=4.1; extra == "dev"
|
|
51
56
|
Requires-Dist: django-extensions~=3.2; extra == "dev"
|
|
@@ -84,6 +89,7 @@ Dynamic: description-content-type
|
|
|
84
89
|
Dynamic: home-page
|
|
85
90
|
Dynamic: keywords
|
|
86
91
|
Dynamic: license
|
|
92
|
+
Dynamic: license-file
|
|
87
93
|
Dynamic: provides-extra
|
|
88
94
|
Dynamic: requires-dist
|
|
89
95
|
Dynamic: requires-python
|
|
@@ -7,8 +7,14 @@ cms_qe/fixtures.py,sha256=cq_wnZnqBwPBOHpp_0bHk424iCXKvwmN6ZaKwDvguXk,755
|
|
|
7
7
|
cms_qe/monitoring.py,sha256=5t_o7o0htmAAxVjkN2oz0O0v9XdzfePhSfPGcLNPmE8,769
|
|
8
8
|
cms_qe/signals.py,sha256=MbuLSxPlJA147LEg-lDWDoUNTV1y0OKjwoI3HzgR97g,1253
|
|
9
9
|
cms_qe/staticfiles.py,sha256=OHkfDfpIxN0B-eCRagZzHDHyBgaulcyYgKhp_3mPZuk,1363
|
|
10
|
-
cms_qe/urls.py,sha256=
|
|
10
|
+
cms_qe/urls.py,sha256=qikE6wfP-JwJ-FiLCw6DRhhA46N0ajI8kABdv0GDjMk,3108
|
|
11
11
|
cms_qe/utils.py,sha256=gxsWZmS34ZC0Tv1VW8A7VeGlrPyDshodF1ZWXj7xyWE,3057
|
|
12
|
+
cms_qe/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
cms_qe/api/constants.py,sha256=pdSziATRm6yUaaPBYoD07JXcULMvKD0h5RdNTPpG0rM,64
|
|
14
|
+
cms_qe/api/permissions.py,sha256=QKSll8wVOWKNbvX_FsC9CRKbPVcT2s5FM81_fnqeEQg,409
|
|
15
|
+
cms_qe/api/urls.py,sha256=UPd7OUHTJxszNLZo3wu50wyVd7Df2F82PFP-Zr2N_fk,1445
|
|
16
|
+
cms_qe/api/utils.py,sha256=04lsxEkYXlOynCdsz6srdn7-h8Qdpn_lBwmjpJ89OI4,456
|
|
17
|
+
cms_qe/api/views.py,sha256=hTq7jEJ9mzozbYaTPRQW2vfo2EboJ6OyO6Nl0lIsm9I,947
|
|
12
18
|
cms_qe/boilerplates/bootstrap3/static/cms_qe/css/bootstrap-theme.css,sha256=xOpS-e_dER8z72w-qryCieOGysQI8cELAVt3MHG0phY,26132
|
|
13
19
|
cms_qe/boilerplates/bootstrap3/static/cms_qe/css/bootstrap-theme.css.map,sha256=cZQbJTuJQjdM1XuKhdRzSJ8hMRQ4up491P76Iq2_D1M,47706
|
|
14
20
|
cms_qe/boilerplates/bootstrap3/static/cms_qe/css/bootstrap-theme.min.css,sha256=ZT4HPpdCOt2lvDkXokHuhJfdOKSPFLzeAJik5U_Q-l4,23409
|
|
@@ -35,7 +41,7 @@ cms_qe/haystack/highlighting.py,sha256=VRECODAO-AGcdon2ggz-Epo41HGmReeUuQFrF_3Pe
|
|
|
35
41
|
cms_qe/haystack/inputs.py,sha256=GhgmgKRe74nGJvXSVUBy1_tFxop6NuguriVybddSunA,129
|
|
36
42
|
cms_qe/haystack/query.py,sha256=bpxIcAOg_LVSa-st0ml-4Oa7gXb_NFMHj8iPCu5jui0,442
|
|
37
43
|
cms_qe/locale/cs/LC_MESSAGES/django.mo,sha256=lCxKXPDs4MGTmLZZATWFng0_xKcjYrWn5CsHaKjlMIA,2287
|
|
38
|
-
cms_qe/locale/cs/LC_MESSAGES/django.po,sha256=
|
|
44
|
+
cms_qe/locale/cs/LC_MESSAGES/django.po,sha256=mCHLG1Fzo0kInNEuW5HzR9vxgaWs11me7Zh6gDJ2_Rk,4003
|
|
39
45
|
cms_qe/locale/en/LC_MESSAGES/django.mo,sha256=1Oza0kFTJYv1uLpu51-XbZShcMmsgRMPdKVmSFB0mZk,378
|
|
40
46
|
cms_qe/locale/en/LC_MESSAGES/django.po,sha256=id9XCp1yVlWOBi37bDGlFVn26ao6mREpGWJI5iTbJH4,1924
|
|
41
47
|
cms_qe/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -43,11 +49,13 @@ cms_qe/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
|
|
|
43
49
|
cms_qe/management/commands/create_superuser_if_not_exists.py,sha256=BUaKwwCx5YmLDLlyq7UTcZTbLjURywiNnsXNYhddaQc,727
|
|
44
50
|
cms_qe/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
51
|
cms_qe/middleware/page_status_code.py,sha256=J-Ezet9ban9rnjWaSuRss9gOz5h7uCCyL46qFlKBd2A,805
|
|
52
|
+
cms_qe/migrations/0001_api_permissions.py,sha256=KPJYBdX3dWYEbUswSiIhkhDV6FcjXG-MPfC2aYwt7Wc,672
|
|
53
|
+
cms_qe/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
54
|
cms_qe/settings/__init__.py,sha256=GJwHXMHwMuGYE-3ZzePJ-26I2WwE8bAIMUDoiTFr0L8,982
|
|
47
55
|
cms_qe/settings/dev.py,sha256=51CBwiclE8LLoNB2uioIK_L3JhM1yzukQ0gZimkcFqw,1487
|
|
48
56
|
cms_qe/settings/unittest.py,sha256=folLIMJb1Arh60_Sn0eNQrvIlx0OsAs6v1tDfyRZVuQ,514
|
|
49
57
|
cms_qe/settings/base/__init__.py,sha256=5yHfne9gPD_xuTaG3voZP23yzuCwROmif2mmKs-hG_A,446
|
|
50
|
-
cms_qe/settings/base/app.py,sha256=
|
|
58
|
+
cms_qe/settings/base/app.py,sha256=RGxe4deN_qLGc_aRNKGjmBgsWYYpd-wdm6V47a0VR5I,4213
|
|
51
59
|
cms_qe/settings/base/auth.py,sha256=OTr1LJ4RSMZm8STs4Q3pwPXmQoURax8OKLJ8eAj7PW4,395
|
|
52
60
|
cms_qe/settings/base/cache.py,sha256=9p6C5lOz1pG-6k15PyvxlShUjBYIbU0ewpA8AX_YFus,297
|
|
53
61
|
cms_qe/settings/base/cms.py,sha256=8icCNxcEp_KRDyP8-LXB21UurJL4wNysY39whAyt3I4,1855
|
|
@@ -60,9 +68,8 @@ cms_qe/settings/base/path.py,sha256=s0eOmSDOWfjjI5onp28y2S2UKwCYFRDGeoUsZla6-og,
|
|
|
60
68
|
cms_qe/settings/base/search.py,sha256=xbO9OFFGLi8PZut_Ngb-27BUI6HPG0ZM4lrO1HXHW-c,618
|
|
61
69
|
cms_qe/settings/base/security.py,sha256=i6mHb8gv6XPthShL1kFLTwa_vrfoaivzqC9MXLE_YBw,4496
|
|
62
70
|
cms_qe/settings/base/template.py,sha256=bITmA7XkoqbDpefWWOBsEiPtCREzFfHkUuFvGxJVLK4,1082
|
|
63
|
-
cms_qe/static/css/fix-admin.css,sha256=Dv0DZWJ72ZxjhUP9HT7MV-ZPHDwiAC3DgfPE3Fc-WEM,270
|
|
64
71
|
cms_qe/templates/base.html,sha256=BMd8MbubDB8m1ZzBWfAfzTs4EBQn0oBQUw1GVRA4z6A,972
|
|
65
|
-
cms_qe/templates/admin/
|
|
72
|
+
cms_qe/templates/admin/index.html,sha256=6CjuqOPQnEYXa7zwyoLyDHt-zzfBwLAf45B0F80ryZ0,1812
|
|
66
73
|
cms_qe/templates/cms_qe/error.html,sha256=1wNCO-ToNoM-HBnfq0Id_W8m_epmOEYcoozRhhHth5U,322
|
|
67
74
|
cms_qe/templates/cms_qe/home.html,sha256=XSyChEdMnxcw-OWrm_d_3h2lmXfPyfpCpyYKH6QNG2E,186
|
|
68
75
|
cms_qe/templates/cms_qe/internal_error.html,sha256=n4JJ80KNHyhiSxGLQadCn9KmctnFABcwLU4KuZly8A4,251
|
|
@@ -103,7 +110,7 @@ cms_qe_auth/forms.py,sha256=x7sdFoOrKBLTJXqESedpIh6Kc1k5zZhL4vwnmhj1gH8,1137
|
|
|
103
110
|
cms_qe_auth/models.py,sha256=Aro43D9y1zrS-3eKHVZEuSkchusDZAcj15B2vYcdt0Q,2713
|
|
104
111
|
cms_qe_auth/token.py,sha256=DG4Bu8AVV-d1ayL4Oc9DXNnERt1sstrll80RBGrplx0,224
|
|
105
112
|
cms_qe_auth/urls.py,sha256=RCgr9t1YonE0yR_8gXiXZIGESvQfrwVwlKhBOWmgxkw,2040
|
|
106
|
-
cms_qe_auth/utils.py,sha256=
|
|
113
|
+
cms_qe_auth/utils.py,sha256=JYZUzQhUE_kycVBRBNi-fmGy5WtjIwc3_qsGxOVrNR0,2972
|
|
107
114
|
cms_qe_auth/views.py,sha256=TG7kwG2xtRUt9S8nG3rUlNOU_BsfvRVybNexGpF_9uI,2233
|
|
108
115
|
cms_qe_auth/boilerplates/bootstrap3/templates/cms_qe/auth/login_form.html,sha256=nG9X-nvfXA4_9h4lVJGIHdcYFhf7sNEg_rVPa6ze9a4,884
|
|
109
116
|
cms_qe_auth/boilerplates/bootstrap3/templates/cms_qe/auth/password_change_form.html,sha256=1khb3qibf_YpVV2GyT6W9sgTMtFetNmjs2mbCdCFtIo,599
|
|
@@ -3890,7 +3897,7 @@ cms_qe_newsletter/templates/cms_qe/newsletter/newsletter.html,sha256=0YnNGr4hNhA
|
|
|
3890
3897
|
cms_qe_newsletter/templates/cms_qe/newsletter/submitted.html,sha256=mOgMi56fuo3VFGC7P_uIA0XQQ7qAkG130s-WuvmF-n4,51
|
|
3891
3898
|
cms_qe_plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3892
3899
|
cms_qe_plugins/attributes.py,sha256=XWLp_Mo3ZQxqUXKOsv1ff-IAX8fnNi2FS_KqdoQT0hQ,760
|
|
3893
|
-
cms_qe_plugins/cms_plugins.py,sha256=
|
|
3900
|
+
cms_qe_plugins/cms_plugins.py,sha256=U1A5oVJNz1uGJL8JT6HYbR1zx7S9B3m6nt4uhGmdK9k,988
|
|
3894
3901
|
cms_qe_plugins/models.py,sha256=rJ8qKD8q2gp_dfWyXnmbXk3hz71DKoVuvr0fztk_gQ0,6789
|
|
3895
3902
|
cms_qe_plugins/utils.py,sha256=7xnvez79gmODczHv_GEiQgvvaeALO2xWzNSKK33HoPw,306
|
|
3896
3903
|
cms_qe_plugins/validators.py,sha256=qqLsCB-2kqC5QvWoSG3yqaVJVKvwPgq0QMwTrR3LKoA,445
|
|
@@ -3898,6 +3905,7 @@ cms_qe_plugins/migrations/0001_initial.py,sha256=O6dBegZWf6DwRKXTz5vx3lNZ-GcBrvG
|
|
|
3898
3905
|
cms_qe_plugins/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3899
3906
|
cms_qe_plugins/templates/cms_qe_plugins/iframe.html,sha256=rWJ7kj7lAjKAr2gJMRX1gRTUHBdVcuFJ-ajN2zZhZvE,978
|
|
3900
3907
|
cms_qe_plugins/templates/cms_qe_plugins/link.html,sha256=zzAr1dAWckbPEw5RnkmFKdIZDnbKqVs_g47wbETusLs,713
|
|
3908
|
+
cms_qe_plugins/templates/cms_qe_plugins/published_or_draft_content.html,sha256=pxfmrUzG74L56FqvRixRuqbtqGTJ4yMy87sOYDWPl_I,333
|
|
3901
3909
|
cms_qe_plugins/templates/cms_qe_plugins/script.html,sha256=PnOgFjXxtzOEKzGRQQnTdKiDTEzENl-_q14WYrbIYJ0,669
|
|
3902
3910
|
cms_qe_table/__init__.py,sha256=0eiVSkglZ6A-QLBnGXQdTlysM6dj2kfTc6scFcUGGVA,1084
|
|
3903
3911
|
cms_qe_table/cms_plugins.py,sha256=dR8b7h_xOJnQ4CDetxrfOiv1tfekhdnpe4KbKqasLi0,1065
|
|
@@ -3951,6 +3959,7 @@ cms_qe_video/templates/cms_qe/video/video_source_file.html,sha256=QJF5fs88s9Fznp
|
|
|
3951
3959
|
cms_qe_video/templates/cms_qe/video/video_widget.html,sha256=Yumciq6bGlAYI1lYx5j9V6IF8QYrncNYygPTkXEz6Wk,925
|
|
3952
3960
|
cms_qe_video/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3953
3961
|
cms_qe_video/templatetags/cms_qe_video.py,sha256=NR_mGv91J0rEreZrQjCzaaXSrZsKvrSas12wMJ-Dg24,1168
|
|
3962
|
+
django_cms_qe-3.6.0.dist-info/licenses/LICENSE,sha256=5wLaeUil0gfU9p8C4zn2Yu_PvZBNieUoYl0z9FcFWdA,1521
|
|
3954
3963
|
example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3955
3964
|
example/urls.py,sha256=H-IJsRGFVZGw6FD9gvK-0B0dLeSOsduziHvDvcHCQZ0,399
|
|
3956
3965
|
example/wsgi.py,sha256=lCKhvtFZlorSIA8qYEqc3pZ1Oflrz_Tc696MWJ62ue4,396
|
|
@@ -3971,8 +3980,7 @@ test_selenium/pages/cms/__init__.py,sha256=_qe4YZYaQbrXp7Szmmeo4TUSkXlE5Rozu8E3t
|
|
|
3971
3980
|
test_selenium/pages/cms/login.py,sha256=UPzJQcYff8NUAT4nvmfQoJQxzOJyPrJ_cKtH35NVfNg,521
|
|
3972
3981
|
test_selenium/pages/cms/page.py,sha256=YQnpZkopfVnhoyQKpRDGqjNeV6xUl-pEHjEcZ9HRiPk,489
|
|
3973
3982
|
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.4.3.dist-info/RECORD,,
|
|
3983
|
+
django_cms_qe-3.6.0.dist-info/METADATA,sha256=jAhwwpVT8EnPvK-dAJihBIrz6nHPCtByUhtS_dbG4Yg,5080
|
|
3984
|
+
django_cms_qe-3.6.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
|
3985
|
+
django_cms_qe-3.6.0.dist-info/top_level.txt,sha256=T4dauFwJy7FmxCy7WoQI3pPwiDessNB2LkfOAP76ssE,172
|
|
3986
|
+
django_cms_qe-3.6.0.dist-info/RECORD,,
|
cms_qe/static/css/fix-admin.css
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Fix label-value overlap in change form.
|
|
3
|
-
*/
|
|
4
|
-
form .flex-container {
|
|
5
|
-
display: flex;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
form .aligned label + div.readonly {
|
|
9
|
-
margin-top: -0.5em;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly {
|
|
13
|
-
margin-left: 1em;
|
|
14
|
-
}
|
|
File without changes
|
|
File without changes
|