Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
006367b678 | ||
|
|
b810dd4417 | ||
|
|
15267a5ddf | ||
|
|
eeb1e4712b | ||
|
|
c973e9720e | ||
|
|
91cd10c4a7 | ||
|
|
4b25db2b42 | ||
|
|
4bdbf2b709 | ||
|
|
e9481b3e52 | ||
|
|
a613b53668 | ||
|
|
54d1d7bbd4 | ||
|
|
c5e105efda | ||
|
|
63a0ac1891 | ||
|
|
7175ce9558 | ||
|
|
f3fcf1c3ab | ||
|
|
f7839c51d6 | ||
|
|
8007ce3d2f | ||
|
|
2daeb7d63c | ||
|
|
9e7c0517df |
@@ -23,6 +23,7 @@ dist
|
||||
.project
|
||||
.coverage
|
||||
.pydevproject
|
||||
.vscode
|
||||
.settings
|
||||
/*.egg-info/
|
||||
/*.egg/
|
||||
|
||||
+21
-2
@@ -83,6 +83,27 @@ matrix:
|
||||
env: DJANGO=2.1 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='customuserapp.User'
|
||||
- python: 3.6
|
||||
env: TEST_DOCS=1 DJANGO=2.1 DATABASE_URL='sqlite://localhost/:memory:'
|
||||
|
||||
# DJANGO 2.2
|
||||
- python: 3.5
|
||||
env: DJANGO=2.2 DATABASE_URL='sqlite://localhost/:memory:'
|
||||
dist: xenial
|
||||
sudo: true
|
||||
- python: 3.5
|
||||
env: DJANGO=2.2 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
|
||||
- python: 3.6
|
||||
env: DJANGO=2.2 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
|
||||
- python: 3.6
|
||||
env: DJANGO=2.2 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='emailuserapp.EmailUser'
|
||||
- python: 3.6
|
||||
env: DJANGO=2.2 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' AUTH_USER_MODEL='customuserapp.User'
|
||||
- python: 3.6
|
||||
env: TEST_DOCS=1 DJANGO=2.2 DATABASE_URL='sqlite://localhost/:memory:'
|
||||
dist: xenial
|
||||
sudo: true
|
||||
allow_failures:
|
||||
- python: 2.7
|
||||
env: DJANGO=1.11 DATABASE_URL='sqlite://localhost/:memory:'
|
||||
exclude:
|
||||
- python: 2.7
|
||||
- python: 3.4
|
||||
@@ -125,5 +146,3 @@ notifications:
|
||||
irc:
|
||||
- irc.freenode.org#django-cms
|
||||
- irc.freenode.org#django-cms-sprint
|
||||
webhooks:
|
||||
- http://addons.us-iad-rs.aldryn.io/en/travis-endpoint/
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
=== 3.7.0 (unreleased) ===
|
||||
|
||||
* Introduced Django 2.2 support.
|
||||
* Fixed test suite.
|
||||
|
||||
|
||||
=== 3.6.0 (2019-01-29) ===
|
||||
|
||||
* Removed the ``cms moderator`` command.
|
||||
|
||||
@@ -5,9 +5,9 @@ import os
|
||||
from collections import OrderedDict
|
||||
|
||||
from django.core.management.base import BaseCommand, CommandParser
|
||||
from django.core.management.color import no_style
|
||||
from django.core.management.color import no_style, color_style
|
||||
|
||||
from cms.utils.compat import DJANGO_2_0
|
||||
from cms.utils.compat import DJANGO_2_0, DJANGO_2_2
|
||||
|
||||
|
||||
def add_builtin_arguments(parser):
|
||||
@@ -37,6 +37,9 @@ def add_builtin_arguments(parser):
|
||||
help='Raise on CommandError exceptions')
|
||||
parser.add_argument('--no-color', action='store_true', dest='no_color', default=False,
|
||||
help="Don't colorize the command output.")
|
||||
if DJANGO_2_2:
|
||||
parser.add_argument('--force-color', action='store_true', dest='force_color', default=False,
|
||||
help="Colorize the command output.")
|
||||
|
||||
|
||||
class SubcommandsCommand(BaseCommand):
|
||||
@@ -85,6 +88,8 @@ class SubcommandsCommand(BaseCommand):
|
||||
if options.get('no_color'):
|
||||
command.style = no_style()
|
||||
command.stderr.style_func = None
|
||||
if DJANGO_2_2 and options.get('force_color'):
|
||||
command.style = color_style(force_color=True)
|
||||
if options.get('stdout'):
|
||||
command.stdout._out = options.get('stdout')
|
||||
if options.get('stderr'):
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
cmsWebpackJsonp([2],{195:function(n,a,e){var t=e(0);n.exports=function(n,a){if(a.length){var e=!1;""===a.val().trim()&&(e=!0),n.on("keyup keypress",function(){var t=n.val();window.UNIHANDECODER&&(t=window.UNIHANDECODER.decode(t)),!1===e&&""===a.val()&&(e=!0);var i=URLify(t,64);e&&a.val(i)}),n.trigger("keyup"),n.focus(),a.add(n).bind("change",function(){t(this).data("changed",!0)})}}},348:function(n,a,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var t=(e(71),e(79),e(16)),i=e(0),o=e.n(i),r=e(10),d=e.n(r),c=e(195),u=e.n(c);o()(function(){var n=o()("#id_title"),a=o()("#id_slug");u()(n,a),o()("div.loading").each(function(){o()(this).load(o()(this).attr("rel"))}),o()('input[type="hidden"]').each(function(){o()(this).parent(".form-row").hide()}),window.CMS.API.changeLanguage=function(e){var t=!0,i=!1;if(a.length&&(a.data("changed")||n.data("changed"))&&(i=!0),i){var o=gettext("Are you sure you want to change tabs without saving the page first?");t=confirm(o)}t&&(window.location.href=e)}});var s={$:o.a,Class:d.a,API:{Helpers:t.c},KEYS:t.d};window.CMS=s}},[348]);
|
||||
cmsWebpackJsonp([2],{195:function(n,a,e){var t=e(0);n.exports=function(n,a){if(a.length){var e=!1;""===a.val().trim()&&(e=!0),n.on("keyup keypress",function(){var t=n.val();window.UNIHANDECODER&&(t=window.UNIHANDECODER.decode(t)),!1===e&&""===a.val()&&(e=!0);var i=URLify(t,64);e&&a.val(i)}),n.trigger("keyup"),n.focus(),a.add(n).bind("change",function(){t(this).data("changed",!0)})}}},352:function(n,a,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var t=(e(72),e(81),e(16)),i=e(0),o=e.n(i),r=e(10),d=e.n(r),c=e(195),u=e.n(c);o()(function(){var n=o()("#id_title"),a=o()("#id_slug");u()(n,a),o()("div.loading").each(function(){o()(this).load(o()(this).attr("rel"))}),o()('input[type="hidden"]').each(function(){o()(this).parent(".form-row").hide()}),window.CMS.API.changeLanguage=function(e){var t=!0,i=!1;if(a.length&&(a.data("changed")||n.data("changed"))&&(i=!0),i){var o=gettext("Are you sure you want to change tabs without saving the page first?");t=confirm(o)}t&&(window.location.href=e)}});var s={$:o.a,Class:d.a,API:{Helpers:t.c},KEYS:t.d};window.CMS=s}},[352]);
|
||||
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
@@ -7,7 +7,19 @@ import $ from 'jquery';
|
||||
import '../polyfills/array.prototype.findindex';
|
||||
import nextUntil from './nextuntil';
|
||||
|
||||
import { toPairs, isNaN, debounce, findIndex, find, every, uniqWith, once, difference, isEqual } from 'lodash';
|
||||
import {
|
||||
includes,
|
||||
toPairs,
|
||||
isNaN,
|
||||
debounce,
|
||||
findIndex,
|
||||
find,
|
||||
every,
|
||||
uniqWith,
|
||||
once,
|
||||
difference,
|
||||
isEqual
|
||||
} from 'lodash';
|
||||
|
||||
import Class from 'classjs';
|
||||
import { Helpers, KEYS, $window, $document, uid } from './cms.base';
|
||||
@@ -161,9 +173,19 @@ var Plugin = new Class({
|
||||
$(items).filter('template').remove();
|
||||
|
||||
itemContents.each((index, el) => {
|
||||
// Due to the way browsers interact with plugins and external code, the .data()
|
||||
// method cannot be used on <object> (unless it's a Flash plugin), <applet> or <embed> elements,
|
||||
// so we have to wrap them
|
||||
if (includes(['OBJECT', 'EMBED', 'APPLET'], el.nodeName)) {
|
||||
const element = $(el);
|
||||
|
||||
element.wrap('<cms-plugin class="cms-plugin-object-node"></cms-plugin>');
|
||||
itemContents[index] = element.parent()[0];
|
||||
}
|
||||
|
||||
// if it's a non-space top-level text node - wrap it in `cms-plugin`
|
||||
if (el.nodeType === Node.TEXT_NODE && !el.textContent.match(/^\s*$/)) {
|
||||
var element = $(el);
|
||||
const element = $(el);
|
||||
|
||||
element.wrap('<cms-plugin class="cms-plugin-text-node"></cms-plugin>');
|
||||
itemContents[index] = element.parent()[0];
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
{% load l10n %}
|
||||
<div class="cms-plugin cms-plugin-{{ plugin.id|unlocalize }}">{{ inner }}</div>
|
||||
@@ -6,6 +6,7 @@ from classytags.core import Options, Tag
|
||||
from classytags.helpers import InclusionTag
|
||||
from cms.constants import PUBLISHER_STATE_PENDING
|
||||
|
||||
from django import VERSION as DJANGO_VERSION
|
||||
from django import template
|
||||
from django.conf import settings
|
||||
from django.contrib.admin.views.main import ERROR_FLAG
|
||||
@@ -129,8 +130,10 @@ def render_filter_field(request, field):
|
||||
@register.filter
|
||||
def boolean_icon(value):
|
||||
BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'}
|
||||
EXTENSION = 'gif' if DJANGO_VERSION < (1, 9) else 'svg'
|
||||
return mark_safe(
|
||||
'<img src="%sicon-%s.gif" alt="%s" />' % (CMS_ADMIN_ICON_BASE, BOOLEAN_MAPPING.get(value, 'unknown'), value))
|
||||
'<img src="%sicon-%s.%s" alt="%s" />' % (CMS_ADMIN_ICON_BASE, BOOLEAN_MAPPING.get(value, 'unknown'), EXTENSION,
|
||||
value))
|
||||
|
||||
|
||||
@register.filter
|
||||
|
||||
@@ -342,15 +342,15 @@ class RenderPluginBlock(InclusionTag):
|
||||
"""
|
||||
|
||||
name = 'render_plugin_block'
|
||||
template = "cms/toolbar/render_plugin_block.html"
|
||||
template = "cms/toolbar/plugin.html"
|
||||
options = Options(
|
||||
Argument('plugin'),
|
||||
blocks=[('endrender_plugin_block', 'nodelist')],
|
||||
)
|
||||
|
||||
def get_context(self, context, plugin, nodelist):
|
||||
context['inner'] = nodelist.render(context)
|
||||
context['plugin'] = plugin
|
||||
context['content'] = nodelist.render(context)
|
||||
context['instance'] = plugin
|
||||
return context
|
||||
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ class StdOverride(object):
|
||||
def __exit__(self, type, value, traceback):
|
||||
setattr(sys, 'std%s' % self.std, getattr(sys, '__std%s__' % self.std))
|
||||
|
||||
|
||||
class StdoutOverride(StdOverride):
|
||||
"""
|
||||
This overrides Python's the standard output and redirects it to a StringIO
|
||||
|
||||
@@ -430,6 +430,15 @@ describe('CMS.Plugin', function() {
|
||||
' and a text node\n' +
|
||||
' </cms-plugin>'
|
||||
]
|
||||
},
|
||||
{
|
||||
pluginId: 109,
|
||||
name: 'object node',
|
||||
expected: [
|
||||
'<cms-plugin class="cms-plugin-object-node cms-plugin cms-plugin-109">' +
|
||||
'<object src="xx">109</object>' +
|
||||
'</cms-plugin>'
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
@@ -43,4 +43,8 @@
|
||||
<template class="cms-plugin cms-plugin-start cms-plugin-108"></template>
|
||||
<div class="plugin-108">element</div>
|
||||
<template class="cms-plugin cms-plugin-end cms-plugin-108"></template>
|
||||
|
||||
<template class="cms-plugin cms-plugin-start cms-plugin-109"></template>
|
||||
<object src="xx">109</object>
|
||||
<template class="cms-plugin cms-plugin-end cms-plugin-109"></template>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
import mock
|
||||
|
||||
from django.contrib.admin.models import CHANGE, LogEntry
|
||||
from django.contrib.auth import get_user_model
|
||||
@@ -855,7 +856,8 @@ class ApphooksTestCase(CMSTestCase):
|
||||
|
||||
request = self.get_request('/')
|
||||
renderer = menu_pool.get_renderer(request)
|
||||
nodes = renderer.get_nodes()
|
||||
with mock.patch("menus.menu_pool.logger.error"):
|
||||
nodes = renderer.get_nodes()
|
||||
nodes_urls = [node.url for node in nodes]
|
||||
self.assertTrue(reverse('sample-account') in nodes_urls)
|
||||
self.assertFalse('/en/child_page/page2/' in nodes_urls)
|
||||
|
||||
@@ -7,7 +7,8 @@ import socket
|
||||
import sys
|
||||
|
||||
from django.utils.six.moves import StringIO
|
||||
from sphinx.application import Sphinx, SphinxWarning
|
||||
from sphinx.application import Sphinx
|
||||
from sphinx.errors import SphinxWarning
|
||||
|
||||
try:
|
||||
import enchant
|
||||
|
||||
@@ -39,7 +39,7 @@ class PublisherCommandTests(TestCase):
|
||||
with StdoutOverride() as buffer:
|
||||
# Now we don't expect it to raise, but we need to redirect IO
|
||||
call_command('cms', 'publisher-publish')
|
||||
lines = buffer.getvalue().split('\n') #NB: readlines() doesn't work
|
||||
lines = buffer.getvalue().split('\n') # NB: readlines() doesn't work
|
||||
|
||||
for line in lines:
|
||||
if 'Total' in line:
|
||||
@@ -62,7 +62,7 @@ class PublisherCommandTests(TestCase):
|
||||
with StdoutOverride() as buffer:
|
||||
# Now we don't expect it to raise, but we need to redirect IO
|
||||
call_command('cms', 'publisher-publish')
|
||||
lines = buffer.getvalue().split('\n') #NB: readlines() doesn't work
|
||||
lines = buffer.getvalue().split('\n') # NB: readlines() doesn't work
|
||||
|
||||
for line in lines:
|
||||
if 'Total' in line:
|
||||
@@ -87,7 +87,7 @@ class PublisherCommandTests(TestCase):
|
||||
with StdoutOverride() as buffer:
|
||||
# Now we don't expect it to raise, but we need to redirect IO
|
||||
call_command('cms', 'publisher-publish', include_unpublished=True)
|
||||
lines = buffer.getvalue().split('\n') #NB: readlines() doesn't work
|
||||
lines = buffer.getvalue().split('\n') # NB: readlines() doesn't work
|
||||
|
||||
for line in lines:
|
||||
if 'Total' in line:
|
||||
@@ -118,7 +118,7 @@ class PublisherCommandTests(TestCase):
|
||||
with StdoutOverride() as buffer:
|
||||
# Now we don't expect it to raise, but we need to redirect IO
|
||||
call_command('cms', 'publisher-publish', language='de')
|
||||
lines = buffer.getvalue().split('\n') #NB: readlines() doesn't work
|
||||
lines = buffer.getvalue().split('\n') # NB: readlines() doesn't work
|
||||
|
||||
for line in lines:
|
||||
if 'Total' in line:
|
||||
@@ -152,7 +152,7 @@ class PublisherCommandTests(TestCase):
|
||||
with StdoutOverride() as buffer:
|
||||
# Now we don't expect it to raise, but we need to redirect IO
|
||||
call_command('cms', 'publisher-publish', language='de', include_unpublished=True)
|
||||
lines = buffer.getvalue().split('\n') #NB: readlines() doesn't work
|
||||
lines = buffer.getvalue().split('\n') # NB: readlines() doesn't work
|
||||
|
||||
for line in lines:
|
||||
if 'Total' in line:
|
||||
@@ -221,7 +221,7 @@ class PublisherCommandTests(TestCase):
|
||||
with StdoutOverride() as buffer:
|
||||
# Now we don't expect it to raise, but we need to redirect IO
|
||||
call_command('cms', 'publisher-publish')
|
||||
lines = buffer.getvalue().split('\n') #NB: readlines() doesn't work
|
||||
lines = buffer.getvalue().split('\n') # NB: readlines() doesn't work
|
||||
|
||||
for line in lines:
|
||||
if 'Total' in line:
|
||||
@@ -279,7 +279,7 @@ class PublisherCommandTests(TestCase):
|
||||
with StdoutOverride() as buffer:
|
||||
# Now we don't expect it to raise, but we need to redirect IO
|
||||
call_command('cms', 'publisher-publish', site=siteB.id)
|
||||
lines = buffer.getvalue().split('\n') #NB: readlines() doesn't work
|
||||
lines = buffer.getvalue().split('\n') # NB: readlines() doesn't work
|
||||
|
||||
for line in lines:
|
||||
if 'Total' in line:
|
||||
@@ -310,7 +310,7 @@ class PublisherCommandTests(TestCase):
|
||||
with StdoutOverride() as buffer:
|
||||
# Now we don't expect it to raise, but we need to redirect IO
|
||||
call_command('cms', 'publisher-publish')
|
||||
lines = buffer.getvalue().split('\n') #NB: readlines() doesn't work
|
||||
lines = buffer.getvalue().split('\n') # NB: readlines() doesn't work
|
||||
|
||||
for line in lines:
|
||||
if 'Total' in line:
|
||||
|
||||
@@ -10,8 +10,10 @@ from threading import local
|
||||
from django.conf import settings
|
||||
from django.urls import reverse, clear_url_caches
|
||||
|
||||
# Py2 and Py3 compatible reload
|
||||
from imp import reload
|
||||
try:
|
||||
from importlib import reload
|
||||
except ImportError:
|
||||
from imp import reload
|
||||
|
||||
_urlconf_revision = {}
|
||||
_urlconf_revision_threadlocal = local()
|
||||
|
||||
@@ -8,6 +8,10 @@ DJANGO_VERSION = django.get_version()
|
||||
PYTHON_VERSION = platform.python_version()
|
||||
|
||||
# These means "less than or equal to DJANGO_FOO_BAR"
|
||||
DJANGO_1_8 = LooseVersion(DJANGO_VERSION) < LooseVersion('1.9')
|
||||
DJANGO_1_9 = LooseVersion(DJANGO_VERSION) < LooseVersion('1.10')
|
||||
DJANGO_1_10 = LooseVersion(DJANGO_VERSION) < LooseVersion('1.11')
|
||||
DJANGO_1_11 = LooseVersion(DJANGO_VERSION) < LooseVersion('2.0')
|
||||
DJANGO_2_0 = LooseVersion(DJANGO_VERSION) < LooseVersion('2.1')
|
||||
DJANGO_2_1 = LooseVersion(DJANGO_VERSION) < LooseVersion('2.2')
|
||||
DJANGO_2_2 = LooseVersion(DJANGO_VERSION) < LooseVersion('3.0')
|
||||
|
||||
+3
-1
@@ -12,6 +12,7 @@
|
||||
# All configuration values have a default; values that are commented out serve
|
||||
# to show the default.
|
||||
|
||||
import datetime
|
||||
import os
|
||||
import sys
|
||||
|
||||
@@ -57,9 +58,10 @@ source_encoding = 'utf-8'
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
current_year = datetime.datetime.now().year
|
||||
# General information about the project.
|
||||
project = u'django cms'
|
||||
copyright = u'2009-2017, Divio AG and contributors'
|
||||
copyright = u'2009-{}, Divio AG and contributors'.format(current_year)
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
|
||||
@@ -65,9 +65,7 @@ We are working to improve the performance and reliability of our test suite. We'
|
||||
problems, but need feedback from people using a wide range of systems and configurations in order
|
||||
to benefit from their experience.
|
||||
|
||||
Please use the open issue `#3684 Test suite is error-prone
|
||||
<https://github.com/divio/django-cms/issues/3684>`_ on our GitHub repository to report such
|
||||
problems.
|
||||
Please report any issues on our `GitHub repository <https://github.com/divio/django-cms/issues>`_.
|
||||
|
||||
If you can help *improve* the test suite, your input will be especially valuable.
|
||||
|
||||
@@ -96,6 +94,14 @@ when the entire suite is run. To work around this you can invoke the test class
|
||||
and it should then run without errors.
|
||||
|
||||
|
||||
``ERROR: zlib is required unless explicitly disabled using --disable-zlib, aborting``
|
||||
------------------------------------------------------------------------------------------
|
||||
|
||||
If you run into that issue, make sure to install zlib using Homebrew::
|
||||
|
||||
brew install libjpeg zlib && brew link --force zlib
|
||||
|
||||
|
||||
Advanced testing options
|
||||
========================
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ permissions.
|
||||
.. note::
|
||||
|
||||
If you want to use your own admin class, make sure to exclude the live versions of the
|
||||
extensions by using ``filter(extended_page__publisher_is_draft=True)`` on the queryset.
|
||||
extensions by using ``filter(extended_object__publisher_is_draft=True)`` on the queryset.
|
||||
|
||||
Continuing with the example model above, here's a simple corresponding
|
||||
``PageExtensionAdmin`` class::
|
||||
@@ -223,7 +223,7 @@ In this example, we need to loop over the titles for the page, and populate the
|
||||
# we now also need to get the titleset (i.e. different language titles)
|
||||
# for this page
|
||||
page = self._get_page()
|
||||
titleset = page.title_set.filter(language__in=get_language_list(page.site_id))
|
||||
titleset = page.title_set.filter(language__in=get_language_list(page.node.site_id))
|
||||
|
||||
# create a 3-tuple of (title_extension, url, title)
|
||||
nodes = [(title_extension, url, title.title) for (
|
||||
|
||||
@@ -221,7 +221,7 @@ in the ``TEMPLATES['OPTIONS']['context_processors']``:
|
||||
Middleware
|
||||
==========
|
||||
|
||||
in your :setting:`django:MIDDLEWARE_CLASSES` you'll need :class:`django:django.middleware.locale.LocaleMiddleware` -
|
||||
in your :setting:`django:MIDDLEWARE` you'll need :class:`django:django.middleware.locale.LocaleMiddleware` -
|
||||
it's **not** installed in Django projects by default.
|
||||
|
||||
Also add::
|
||||
@@ -254,7 +254,7 @@ URLs
|
||||
====
|
||||
|
||||
In the project's ``urls.py``, add ``url(r'^', include('cms.urls'))`` to the ``urlpatterns`` list. It should come after
|
||||
other patterns, so that specific URLs for other applications can be detected first.
|
||||
other patterns, so that specific URLs for other applications can be detected first. Note: when using Django 2.0 or later the syntax is ``re_path(r'^', include('cms.urls'))``
|
||||
|
||||
You'll also need to have an import for ``django.conf.urls.include``. For example:
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ You must now remove the entry for the Polls application::
|
||||
|
||||
from your project's ``urls.py``.
|
||||
|
||||
Not only is it not only no longer even required there, because we reach the polls via the apphook
|
||||
Not only is it not required there, because we reach the polls via the apphook
|
||||
instead, but if you leave it there, it will conflict with the apphook's URL handling. You'll
|
||||
receive a warning in the logs::
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@ For completeness, here is the full example:
|
||||
url=admin_reverse('polls_poll_changelist'),
|
||||
)
|
||||
|
||||
buttonlist.add_modal_button
|
||||
buttonlist.add_modal_button(
|
||||
name='Add a new poll',
|
||||
url=admin_reverse('polls_poll_add'),
|
||||
)
|
||||
|
||||
@@ -12,7 +12,7 @@ get it working according to their own requirements.
|
||||
These tutorials take you step-by-step through some key aspects of this work.
|
||||
They're not intended to explain the :doc:`topics in depth </topics/index>`, or
|
||||
provide :doc:`reference material </reference/index>`, but they will leave you
|
||||
with a good idea of what it's possible to achieve in just a few steps, and how
|
||||
with a good idea of what is possible to achieve in just a few steps, and how
|
||||
to go about it.
|
||||
|
||||
Once you're familiar with the basics presented in these tutorials, you'll find
|
||||
|
||||
@@ -221,33 +221,34 @@ add a text plugin with the content ``'hello world'``. This is done in English::
|
||||
cms.constants
|
||||
*************
|
||||
|
||||
.. module:: cms.constants
|
||||
.. module:: cms.constants
|
||||
|
||||
.. data:: TEMPLATE_INHERITANCE_MAGIC
|
||||
.. data:: TEMPLATE_INHERITANCE_MAGIC
|
||||
|
||||
The token used to identify when a user selects "inherit" as template for a
|
||||
page.
|
||||
|
||||
.. data:: LEFT
|
||||
.. data:: LEFT
|
||||
|
||||
Used as a position indicator in the toolbar.
|
||||
|
||||
.. data:: RIGHT
|
||||
.. data:: RIGHT
|
||||
|
||||
Used as a position indicator in the toolbar.
|
||||
|
||||
.. data:: REFRESH
|
||||
.. data:: REFRESH
|
||||
|
||||
Constant used by the toolbar.
|
||||
|
||||
.. data:: EXPIRE_NOW
|
||||
.. data:: EXPIRE_NOW
|
||||
|
||||
Constant of 0 (zero) used for cache control headers
|
||||
|
||||
.. data:: MAX_EXPIRATION_TTL
|
||||
.. data:: MAX_EXPIRATION_TTL
|
||||
|
||||
Constant of 31536000 or 365 days in seconds used for cache control headers
|
||||
|
||||
|
||||
************
|
||||
cms.app_base
|
||||
************
|
||||
|
||||
@@ -461,7 +461,7 @@ Example::
|
||||
'fallbacks': ['de', 'fr'],
|
||||
'public': True,
|
||||
'hide_untranslated': True,
|
||||
'redirect_on_fallback':False,
|
||||
'redirect_on_fallback': False,
|
||||
},
|
||||
{
|
||||
'code': 'de',
|
||||
@@ -485,7 +485,7 @@ Example::
|
||||
],
|
||||
'default': {
|
||||
'fallbacks': ['en', 'de', 'fr'],
|
||||
'redirect_on_fallback':True,
|
||||
'redirect_on_fallback': True,
|
||||
'public': True,
|
||||
'hide_untranslated': False,
|
||||
}
|
||||
|
||||
@@ -380,6 +380,7 @@ django CMS constants used in toolbars
|
||||
*************************************
|
||||
|
||||
.. module:: cms.constants
|
||||
:noindex:
|
||||
|
||||
.. data:: REFRESH_PAGE
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
-f http://simple.crate.io/
|
||||
MarkupSafe==0.23
|
||||
Pygments==2.0.2
|
||||
sphinx
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
.. _upgrade-to-3.7.0:
|
||||
|
||||
###################
|
||||
3.7.0 release notes
|
||||
###################
|
||||
|
||||
This release of django CMS concentrates on introducing support for Django 2.2 LTS.
|
||||
|
||||
|
||||
*******************
|
||||
What's new in 3.7.0
|
||||
*******************
|
||||
|
||||
Improvements and new features
|
||||
=============================
|
||||
|
||||
* introduced support for Django 2.2
|
||||
* Fixed test suite.
|
||||
|
||||
|
||||
*********************
|
||||
How to upgrade to 3.7
|
||||
*********************
|
||||
|
||||
We assume you are upgrading from django CMS 3.6.
|
||||
|
||||
Please make sure that your current database is consistent and in a healthy
|
||||
state, and **make a copy of the database before proceeding further.**
|
||||
|
||||
Then run::
|
||||
|
||||
python manage.py migrate # to ensure that your database is up-to-date with migrations
|
||||
python manage.py cms fix-tree
|
||||
|
||||
Check custom code and third-party applications for use of deprecated or removed functionality or
|
||||
APIs (see above). Some third-party components may need to be updated.
|
||||
|
||||
Install the new version of django CMS from GitHub or via pip.
|
||||
|
||||
Run::
|
||||
|
||||
python manage.py migrate
|
||||
|
||||
to apply the new migrations.
|
||||
|
||||
|
||||
***********************************
|
||||
Create a new django CMS 3.7 project
|
||||
***********************************
|
||||
|
||||
On the Divio Cloud
|
||||
==================
|
||||
|
||||
The Divio Cloud offers an easy way to set up django CMS projects. In the `Divio Cloud Control Panel
|
||||
<https://control.divio.com>`_, create a new django CMS project and **Deploy** it.
|
||||
|
||||
|
||||
Using the django CMS Installer
|
||||
==============================
|
||||
|
||||
.. note::
|
||||
|
||||
The django CMS Installer is not yet available for django CMS 3.6 or Django 2 or later.
|
||||
|
||||
This section will be updated or removed before the final release of django CMS 3.6.
|
||||
|
||||
|
||||
****************************
|
||||
Contributors to this release
|
||||
****************************
|
||||
|
||||
* Daniele Procida
|
||||
* Vadim Sikora
|
||||
* Paulo Alvarado
|
||||
* Bartosz Płóciennik
|
||||
* Katie McLaughlin
|
||||
* Krzysztof Socha
|
||||
* Mateusz Kamycki
|
||||
* Sergey Fedoseev
|
||||
* Aliaksei Urbanski
|
||||
* heppstux
|
||||
* Chematronix
|
||||
* Frank
|
||||
* Jacob Rief
|
||||
* Julz
|
||||
@@ -13,6 +13,7 @@ makes changes to your database.
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
3.7
|
||||
3.6
|
||||
3.5.3
|
||||
3.5.2
|
||||
|
||||
@@ -18,14 +18,16 @@ CLASSIFIERS = [
|
||||
'Programming Language :: Python :: 3.4',
|
||||
'Programming Language :: Python :: 3.5',
|
||||
'Programming Language :: Python :: 3.6',
|
||||
'Programming Language :: Python :: 3.7',
|
||||
'Framework :: Django',
|
||||
'Framework :: Django :: 1.11',
|
||||
'Framework :: Django :: 2.0',
|
||||
'Framework :: Django :: 2.1',
|
||||
'Framework :: Django :: 2.2',
|
||||
]
|
||||
|
||||
INSTALL_REQUIREMENTS = [
|
||||
'Django>=1.11,<2.2',
|
||||
'Django>=1.11,<3.0',
|
||||
'django-classy-tags>=0.7.2',
|
||||
'django-formtools>=2.1',
|
||||
'django-treebeard>=4.3',
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
-r requirements_base.txt
|
||||
Django>=2.2,<3.0
|
||||
@@ -1,7 +1,7 @@
|
||||
coverage==4.2
|
||||
python-coveralls==2.5.0
|
||||
unittest-xml-reporting==1.11.0
|
||||
Pillow==3.3.2
|
||||
Pillow==5.2.0
|
||||
django-treebeard>=4.3
|
||||
argparse
|
||||
dj-database-url
|
||||
@@ -12,7 +12,7 @@ https://github.com/divio/djangocms-text-ckeditor/archive/master.zip
|
||||
https://github.com/ojii/django-better-test/archive/8aa2407d097fe3789b74682f0e6bd7d15d449416.zip#egg=django-better-test
|
||||
https://github.com/ojii/django-app-manage/archive/65da18ef234a4e985710c2c0ec760023695b40fe.zip#egg=django-app-manage
|
||||
iptools
|
||||
sphinx==1.4.5
|
||||
sphinx==1.8.5
|
||||
sphinxcontrib-spelling
|
||||
pyflakes==1.1.0
|
||||
pyenchant
|
||||
|
||||
Reference in New Issue
Block a user