8000 Introduced Django 2.0 & 2.1 support (#6447) · django-cms/django-cms@30f2d28 · GitHub
[go: up one dir, main page]

Skip to content

Commit 30f2d28

Browse files
authored
Introduced Django 2.0 & 2.1 support (#6447)
Backport #6402
1 parent cf442f7 commit 30f2d28

File tree

108 files changed

+511
-542
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+511
-542
lines changed

.travis.yml

Lines changed: 67 additions & 82 deletions
< 1241 td data-grid-cell-id="diff-6ac3f79fc25d95cd1e3d51da53a4b21b939437392578a35ae8cd6d5366ca5485-43-35-0" data-selected="false" role="gridcell" style="background-color:var(--diffBlob-additionNum-bgColor, var(--diffBlob-addition-bgColor-num));text-align:center" tabindex="-1" valign="top" class="focusable-grid-cell diff-line-number position-relative left-side">
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,73 @@ env:
2929
- secure: CbPfysSncBB2Ue+VOtLDa8xJvwKl73nJO647zt/9UvZ/3PilnZN9aZv2jHxGvCiFXcez+2AddKptMCcx/5EW5UfRkrWUDHrfLCULU2TfOjmufEGM1eOIXhiAun8WQ85LBzTAYy1r9D514cbU3Yzn3xGZwJljPE8JE4cx3MNN/qQ=
3030
# temporary solution until https://github.com/ariya/phantomjs/issues/13953 is resolved
3131
- PHANTOMJS_CDNURL=https://s3.amazonaws.com/aldryn-local-assets
32-
matrix:
33-
- FRONTEND=1 UNIT=1
34-
- FRONTEND=1 LINT=1
35-
- FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
36-
- FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=2 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
37-
- FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=3 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
38-
- DJANGO=1.11 DATABASE_URL='sqlite://localhost/:memory:'
39-
- DJANGO=1.11 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
40-
- DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
41-
- DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='emailuserapp.EmailUser'
42-
- DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='customuserapp.User'
43-
- TEST_DOCS=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/:memory:'
32+
33+
matrix:
34+
include:
35+
# FRONTEND
36+
- python: 3.6
37+
env: FRONTEND=1 UNIT=1
38+
- python: 3.6
39+
env: FRONTEND=1 LINT=1
40+
- python: 3.6
41+
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
42+
- python: 3.6
43+
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=2 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
44+
- python: 3.6
45+
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=3 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
46+
47+
# DJANGO 1.11
48+
- python: 2.7
49+
env: DJANGO=1.11 DATABASE_URL='sqlite://localhost/:memory:'
50+
- python: 3.4
51+
env: DJANGO=1.11 DATABASE_URL='sqlite://localhost/:memory:'
52+
- python: 3.5
53+
env: DJANGO=1.11 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
54+
- python: 3.6
55+
env: DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
56+
- python: 3.6
57+
env: DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='emailuserapp.EmailUser'
58+
- python: 3.6
59+
env: DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='customuserapp.User'
60+
61+
# DJANGO 2.0
62+
- python: 3.4
63+
env: DJANGO=2.0 DATABASE_URL='sqlite://localhost/:memory:'
64+
- python: 3.5
65+
env: DJANGO=2.0 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
66+
- python: 3.6
67+
env: DJANGO=2.0 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
68+
- python: 3.6
69+
env: DJANGO=2.0 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='emailuserapp.EmailUser'
70+
- python: 3.6
71+
env: DJANGO=2.0 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='customuserapp.User'
72+
73+
# DJANGO 2.1
74+
- python: 3.5
75+
env: DJANGO=2.1 DATABASE_URL='sqlite://localhost/:memory:'
76+
- python: 3.5
77+
env: DJANGO=2.1 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
78+
- python: 3.6
79+
env: DJANGO=2.1 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
80+
- python: 3.6
81+
env: DJANGO=2.1 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='emailuserapp.EmailUser'
82+
- python: 3.6
83+
env: DJANGO=2.1 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='customuserapp.User'
84+
- python: 3.6
85+
env: TEST_DOCS=1 DJANGO=2.1 DATABASE_URL='sqlite://localhost/:memory:'
86+
allow_failures:
87+
- python: 3.6
88+
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
89+
- python: 3.6
90+
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=2 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
91+
- python: 3.6
92+
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=3 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
93+
exclude:
94+
- python: 2.7
95+
- python: 3.4
96+
- python: 3.5
97+
- python: 3.6
98+
fast_finish: true
4499

45100
before_script:
46101
- pip freeze
@@ -79,73 +134,3 @@ notifications:
79134
- irc.freenode.org#django-cms-sprint
80135
webhooks:
81136
- http://addons.us-iad-rs.aldryn.io/en/travis-endpoint/
82-
83-
matrix:
84-
exclude:
85-
86-
- python: 3.4
87-
env: TEST_DOCS=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/:memory:'
88-
- python: 3.4
89-
env: DJANGO=1.11 DATABASE_URL='sqlite://localhost/:memory:'
90-
- python: 3.4
91-
env: DJANGO=1.11 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
92-
- python: 3.4
93-
env: DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
94-
- python: 3.4
95-
env: DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='emailuserapp.EmailUser'
96-
- python: 3.4
97-
env: DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='customuserapp.User'
98-
- python: 3.4
99-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
100-
- python: 3.4
101-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=2 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
102-
- python: 3.4
103-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=3 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
104-
- python: 3.4
105-
env: FRONTEND=1 UNIT=1
106-
- python: 3.4
107-
env: FRONTEND=1 LINT=1
108-
109-
- python: 3.5
110-
env: TEST_DOCS=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/:memory:'
111-
- python: 3.5
112-
env: DJANGO=1.11 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
113-
- python: 3.5
114-
env: DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
115-
- python: 3.5
116-
env: DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='emailuserapp.EmailUser'
117-
- python: 3.5
118-
env: DJANGO=1.11 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='customuserapp.User'
119-
- python: 3.5
120-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
121-
- python: 3.5
122-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=2 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
123-
- python: 3.5
124-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=3 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
125-
- python: 3.5
126-
env: FRONTEND=1 UNIT=1
127-
- python: 3.5
128-
env: FRONTEND=1 LINT=1
129-
130-
- python: 2.7
131-
env: FRONTEND=1 UNIT=1
132-
- python: 2.7
133-
env: FRONTEND=1 LINT=1
134-
- python: 2.7
135-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
136-
- python: 2.7
137-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=2 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
138-
- python: 2.7
139-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=3 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
140-
141-
allow_failures:
142-
- python: 3.6
143-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=1 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
144-
- python: 3.6
145-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=2 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
146-
- python: 3.6
147-
env: FRONTEND=1 INTEGRATION=1 INTEGRATION_TESTS_BUCKET=3 DJANGO=1.11 DATABASE_URL='sqlite://localhost/testdb.sqlite'
148-
149-
fast_finish: true
150-
151-

CHANGELOG.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
* Removed signal handlers for ``Page``, ``Title``, ``Placeholder`` and ``CMSPlugin`` models.
77
* Moved ``Title.meta_description`` length restriction from model to form
88
and increased its max length to 320 characters.
9+
* Added ``page_title`` parameter for ``cms.api.create_page()`` and ``cms.api.create_title()``.
10+
* Introduced Django 2.0 support.
11+
* Introduced Django 2.1 support.
912

1013

1114
=== 3.5.2 (2018-04-11) ===

cms/admin/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ class AdvancedSettingsForm(forms.ModelForm):
549549
redirect = PageSmartLinkField(label=_('Redirect'), required=False,
550550
help_text=_('Redirects to this URL.'),
551551
placeholder_text=_('Start typing...'),
552-
ajax_view='admin:cms_page_get_published_pagelist'
552+
ajax_view='admin:cms_page_get_published_pagelist',
553553
)
554554

555555
# This is really a 'fake' field which does not correspond to any Page attribute

cms/admin/pageadmin.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
get_site_language_from_request,
7373
)
7474
from cms.utils.admin import jsonify_request
75+
from cms.utils.compat import DJANGO_2_0
7576
from cms.utils.conf import get_cms_setting
7677
from cms.utils.urlutils import admin_reverse
7778

@@ -432,8 +433,19 @@ def delete_view(self, request, object_id, extra_context=None):
432433
# Populate deleted_objects, a data structure of all related objects that
433434
# will also be deleted.
434435
objs = [obj] + list(obj.get_descendant_pages())
436+
437+
if DJANGO_2_0:
438+
get_deleted_objects_additional_kwargs = {
439+
'opts': opts,
440+
'using': using,
441+
'user': request.user,
442+
}
443+
else:
444+
get_deleted_objects_additional_kwargs = {'request': request}
435445
(deleted_objects, model_count, perms_needed, protected) = get_deleted_objects(
436-
objs, opts, request.user, self.admin_site, using)
446+
objs, admin_site=self.admin_site,
447+
**get_deleted_objects_additional_kwargs
448+
)
437449

438450
if request.POST and not protected: # The user has confirmed the deletion.
439451
if perms_needed:
@@ -657,6 +669,9 @@ def has_change_permission(self, request, obj=None):
657669
)
658670
return can_change_page
659671

672+
def has_view_permission(self, request, obj=None):
673+
return self.has_change_permission(request, obj)
674+
660675
def has_change_advanced_settings_permission(self, request, obj=None):
661676
if not obj:
662677
return False
@@ -1256,20 +1271,23 @@ def delete_translation(self, request, object_id, extra_context=None):
12561271
pluginopts = CMSPlugin._meta
12571272
saved_plugins = CMSPlugin.objects.filter(placeholder__title=translation, language=language)
12581273
using = router.db_for_read(self.model)
1259-
kwargs = {
1260-
'admin_site': self.admin_site,
1261-
'user': request.user,
1262-
'using': using
1263-
}
12641274

1275+
kwargs = {'admin_site': self.admin_site}
1276+
if DJANGO_2_0:
1277+
kwargs.update({'using': using, 'opts': titleopts, 'user': request.user})
1278+
else:
1279+
kwargs.update({'request': request})
12651280
deleted_objects, __, perms_needed = get_deleted_objects(
12661281
[translation],
1267-
titleopts,
12681282
**kwargs
12691283
)[:3]
1284+
1285+
if DJANGO_2_0:
1286+
kwargs.update({'using': using, 'opts': pluginopts, 'user': request.user})
1287+
else:
1288+
kwargs.update({'request': request})
12701289
to_delete_plugins, __, perms_needed_plugins = get_deleted_objects(
12711290
saved_plugins,
1272-
pluginopts,
12731291
**kwargs
12741292
)[:3]
12751293

cms/admin/permissionadmin.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from cms.admin.forms import GlobalPagePermissionAdminForm, PagePermissionInlineAdminForm, ViewRestrictionInlineAdminForm
1313
from cms.exceptions import NoPermissionsException
1414
from cms.models import PagePermission, GlobalPagePermission
15-
from cms.utils import permissions
15+
from cms.utils import permissions, page_permissions
1616
from cms.utils.conf import get_cms_setting
1717
from cms.utils.helpers import classproperty
1818

@@ -38,6 +38,18 @@ class PagePermissionInlineAdmin(TabularInline):
3838
extra = 0 # edit page load time boost
3939
show_with_view_permissions = False
4040

41+
def has_change_permission(self, request, obj=None):
42+
if not obj:
43+
return False
44+
return page_permissions.user_can_change_page_permissions(
45+
request.user,
46+
page=obj,
47+
site=obj.node.site,
48+
)
49+
50+
def has_add_permission(self, request, obj=None):
51+
return self.has_change_permission(request, obj)
52+
4153
@classproperty
4254
def raw_id_fields(cls):
4355
# Dynamically set raw_id_fields based on settings

cms/admin/placeholderadmin.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@
3636
from cms.signals import pre_placeholder_operation, post_placeholder_operation
3737
from cms.toolbar.utils import get_plugin_tree_as_json
3838
from cms.utils import copy_plugins, get_current_site
39+
from cms.utils.compat import DJANGO_2_0
3940
from cms.utils.conf import get_cms_setting
40-
from cms.utils.i18n import get_language_list, get_language_code
41+
from cms.utils.i18n import get_language_code, get_language_list
4142
from cms.utils.plugins import has_reached_plugin_limit, reorder_plugins
4243
from cms.utils.urlutils import admin_reverse
4344

@@ -1029,8 +1030,18 @@ def delete_plugin(self, request, plugin_id):
10291030

10301031
opts = plugin._meta
10311032
using = router.db_for_write(opts.model)
1033+
if DJANGO_2_0:
1034+
get_deleted_objects_additional_kwargs = {
1035+
'opts': opts,
1036+
'using': using,
1037+
'user': request.user,
1038+
}
1039+
else:
1040+
get_deleted_objects_additional_kwargs = {'request': request}
10321041
deleted_objects, __, perms_needed, protected = get_deleted_objects(
1033-
[plugin], opts, request.user, self.admin_site, using)
1042+
[plugin], admin_site=self.admin_site,
1043+
**get_deleted_objects_additional_kwargs
1044+
)
10341045

10351046
if request.POST: # The user has already confirmed the deletion.
10361047
if perms_needed:
@@ -1117,8 +1128,19 @@ def clear_placeholder(self, request, placeholder_id):
11171128
opts = Placeholder._meta
11181129
using = router.db_for_write(Placeholder)
11191130
plugins = placeholder.get_plugins_list(language)
1131+
1132+
if DJANGO_2_0:
1133+
get_deleted_objects_additional_kwargs = {
1134+
'opts': opts,
1135+
'using': using,
1136+
'user': request.user,
1137+
}
1138+
else:
1139+
get_deleted_objects_additional_kwargs = {'request': request}
11201140
deleted_objects, __, perms_needed, protected = get_deleted_objects(
1121-
plugins, opts, request.user, self.admin_site, using)
1141+
plugins, admin_site=self.admin_site,
1142+
**get_deleted_objects_additional_kwargs
1143+
)
11221144

11231145
obj_display = force_text(placeholder)
11241146

cms/admin/useradmin.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ def has_delete_permission(self, request, obj=None):
7777
return False
7878
return self._has_change_permissions_permission(request)
7979

80+
def has_view_permission(self, request, obj=None):
81+
# For django 2.1
82+
# Default is to return True if user got `change` perm, but we have to
83+
# get in consideration also cms permission system
84+
return self.has_change_permission(request, obj)
85+
8086

8187
class PageUserAdmin(GenericCmsPermissionAdmin, admin_class):
8288
form = PageUserChangeForm

0 commit comments

Comments
 (0)
0