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 ADDED
File without changes
@@ -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
@@ -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
- with SMTPCheckRecipient(settings.EMAIL_HOST) as checker:
88
- checker.check(address)
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)
@@ -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.2
1
+ Metadata-Version: 2.4
2
2
  Name: django-cms-qe
3
- Version: 3.4.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=vNiiN7NwFFT48SBNIg6lzjTRMN6BicwH_zz6p-EApsw,3042
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=bBtnbNTe3pIsre_tNZ8tMdl5ZDfuDZOIwwZRFi33jbA,3545
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=pmy_0ThkSDNXmEVrWwFpRQ-mjHCvYFoo8YxmFRLG5bM,3988
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/change_form.html,sha256=YyJmsjepSZTacZE9to5_UwjbTVde0bJuqy6Tiqwk0Dk,201
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=94aELOVicanApvKkZ3xw5sFjd2C8AEzyCrHdgpFW8Pc,2790
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=MLuIUaeVWMjG8zMqUrM5yqdSlmhgJdJ2T1OMHrvhTHg,683
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.4.3.dist-info/LICENSE,sha256=5wLaeUil0gfU9p8C4zn2Yu_PvZBNieUoYl0z9FcFWdA,1521
3975
- django_cms_qe-3.4.3.dist-info/METADATA,sha256=1TtNoqtkeerKjgX5LfqtXiYcXAfTNoS0dvufzTZ4yVI,4907
3976
- django_cms_qe-3.4.3.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
3977
- django_cms_qe-3.4.3.dist-info/top_level.txt,sha256=T4dauFwJy7FmxCy7WoQI3pPwiDessNB2LkfOAP76ssE,172
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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
- }
@@ -1,7 +0,0 @@
1
- {% extends "admin/change_form.html" %}
2
- {% load static %}
3
-
4
- {% block extrahead %}
5
- {{ block.super }}
6
- <link rel="stylesheet" type="text/css" href="{% static "css/fix-admin.css" %}">
7
- {% endblock %}