Add django CMS 3.5

This commit is contained in:
Iacopo Spalletti 2018-01-14 12:54:44 +01:00
parent 5f22499fed
commit e4f30290c9
No known key found for this signature in database
GPG Key ID: BDCBC2EB289F60C6
13 changed files with 105 additions and 65 deletions

View File

@ -5,6 +5,7 @@ language: python
sudo: false
python:
- 3.6
- 3.5
- 3.4
- 2.7
@ -14,10 +15,13 @@ env:
- TOXENV='pep8'
- TOXENV='isort'
- TOXENV='docs'
- DJANGO='django110' CMS='cms35'
- DJANGO='django110' CMS='cms34'
- DJANGO='django19' CMS='cms35'
- DJANGO='django19' CMS='cms34'
- DJANGO='django19' CMS='cms33'
- DJANGO='django19' CMS='cms32'
- DJANGO='django18' CMS='cms35'
- DJANGO='django18' CMS='cms34'
- DJANGO='django18' CMS='cms33'
- DJANGO='django18' CMS='cms32'
@ -28,6 +32,7 @@ install:
- "if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then export PYVER=py27; fi"
- "if [[ $TRAVIS_PYTHON_VERSION == '3.4' ]]; then export PYVER=py34; fi"
- "if [[ $TRAVIS_PYTHON_VERSION == '3.5' ]]; then export PYVER=py35; fi"
- "if [[ $TRAVIS_PYTHON_VERSION == '3.6' ]]; then export PYVER=py36; fi"
- "if [[ ${DJANGO}z != 'z' ]]; then export TOXENV=$PYVER-$DJANGO-$CMS; fi"
# command to run tests, e.g. python setup.py test
@ -53,6 +58,36 @@ matrix:
env: TOXENV='pep8'
- python: 3.4
env: TOXENV='isort'
- python: 3.5
env: TOXENV='docs'
- python: 3.5
env: TOXENV='pep8'
- python: 3.5
env: TOXENV='isort'
- python: 2.7
env: DJANGO='django19' CMS='cms35'
- python: 2.7
env: DJANGO='django19' CMS='cms34'
- python: 2.7
env: DJANGO='django19' CMS='cms33'
- python: 2.7
env: DJANGO='django19' CMS='cms32'
- python: 3.5
env: DJANGO='django19' CMS='cms35'
- python: 3.5
env: DJANGO='django19' CMS='cms34'
- python: 3.5
env: DJANGO='django19' CMS='cms33'
- python: 3.5
env: DJANGO='django19' CMS='cms32'
- python: 3.4
env: DJANGO='django19' CMS='cms35'
- python: 3.4
env: DJANGO='django19' CMS='cms34'
- python: 3.4
env: DJANGO='django19' CMS='cms33'
- python: 3.4
env: DJANGO='django19' CMS='cms32'
cache:

View File

@ -8,7 +8,7 @@ History
0.9.0 (unreleased)
******************
* Added support for django CMS 3.4
* Added support for django CMS 3.4, 3.5
* Dropped support for Django<1.8, django CMS<3.2.
* Added liveblog application.
* Refactored plugin filters: by default only data for current site are now shown.

View File

@ -14,10 +14,10 @@ from .settings import get_setting
@apphook_pool.register
class BlogApp(AutoCMSAppMixin, CMSConfigApp):
name = _('Blog')
urls = ['djangocms_blog.urls']
_urls = ['djangocms_blog.urls']
app_name = 'djangocms_blog'
app_config = BlogConfig
menus = [BlogCategoryMenu]
_menus = [BlogCategoryMenu]
auto_setup = {
'enabled': get_setting('AUTO_SETUP'),
'home title': get_setting('AUTO_HOME_TITLE'),
@ -30,5 +30,13 @@ class BlogApp(AutoCMSAppMixin, CMSConfigApp):
},
}
@property
def urls(self):
return self._urls
@property
def menus(self):
return self._menus
BlogApp.setup()

View File

@ -38,19 +38,18 @@ class BlogCategoryMenu(CMSAttachMenu):
language = get_language_from_request(request, check_path=True)
current_site = get_current_site(request)
if self.instance.site != current_site:
if self.instance and self.instance.site != current_site:
return []
categories_menu = False
posts_menu = False
config = False
if hasattr(self, 'instance') and self.instance:
if self.instance:
if not self._config.get(self.instance.application_namespace, False):
self._config[self.instance.application_namespace] = BlogConfig.objects.get(
namespace=self.instance.application_namespace
)
config = self._config[self.instance.application_namespace]
if hasattr(self, 'instance') and self.instance:
if not getattr(request, 'toolbar', False) or not request.toolbar.edit_mode:
if self.instance == self.instance.get_draft_object():
return []
@ -71,7 +70,6 @@ class BlogCategoryMenu(CMSAttachMenu):
posts = posts.namespace(self.instance.application_namespace).on_site()
posts = posts.active_translations(language).distinct().\
select_related('app_config').prefetch_related('translations', 'categories')
for post in posts:
post_id = None
parent = None

View File

@ -63,10 +63,14 @@ class LiveblogInterface(models.Model):
})
try:
from cms.plugin_rendering import ContentRenderer
context['cms_content_renderer'] = ContentRenderer(request)
renderer = ContentRenderer(request)
return renderer.render_plugin(
instance=self,
context=context,
placeholder=self.placeholder,
)
except ImportError:
pass
return self.render_plugin(context)
return self.render_plugin(context)
def send(self, request):
"""

View File

@ -159,6 +159,13 @@ class BaseTest(BaseTestCase):
cache.clear()
super(BaseTest, self).tearDown()
def get_nodes(self, menu_pool, request):
try:
nodes = menu_pool.get_renderer(request).get_nodes()
except AttributeError:
nodes = menu_pool.get_nodes(request)
return nodes
def _get_category(self, data, category=None, lang='en'):
data = deepcopy(data)
for k, v in data.items():

View File

@ -184,14 +184,12 @@ try:
plugin = add_plugin(
post.liveblog, 'LiveblogPlugin', language='en', body='live text', publish=False
)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=False)
rendered = plugin.render_plugin(context, post.liveblog)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
self.assertFalse(rendered.strip())
plugin.publish = True
plugin.save()
context = self.get_plugin_context(pages[0], 'en', plugin, edit=False)
rendered = plugin.render_plugin(context, post.liveblog)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
self.assertTrue(rendered.find('data-post-id="{}"'.format(plugin.pk)) > -1)
self.assertTrue(rendered.find('live text') > -1)

View File

@ -48,7 +48,7 @@ class MenuTest(BaseTest):
with smart_override(lang):
self._reset_menus()
request = self.get_page_request(pages[1], self.user, pages[1].get_absolute_url(lang), edit=True)
nodes = menu_pool.get_nodes(request)
nodes = self.get_nodes(menu_pool, request)
self.assertTrue(len(nodes), BlogCategory.objects.all().count() + len(pages))
nodes_url = set([node.get_absolute_url() for node in nodes])
cats_url = set([cat.get_absolute_url() for cat in self.cats if cat.has_translation(lang)])
@ -60,7 +60,7 @@ class MenuTest(BaseTest):
with smart_override(lang):
self._reset_menus()
request = self.get_page_request(pages[1].get_draft_object(), self.user, pages[1].get_draft_object().get_absolute_url(lang))
nodes = menu_pool.get_nodes(request)
nodes = self.get_nodes(menu_pool, request)
urls = [node.get_absolute_url() for node in nodes]
nodes_url = [node.get_absolute_url() for node in nodes]
self.assertTrue(len(nodes_url), BlogCategory.objects.all().count() + len(pages))
@ -97,7 +97,7 @@ class MenuTest(BaseTest):
request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
with smart_override(lang):
self._reset_menus()
nodes = menu_pool.get_nodes(request)
nodes = self.get_nodes(menu_pool, request)
nodes_url = set([node.get_absolute_url() for node in nodes])
self.assertFalse(cats_url[lang].issubset(nodes_url))
self.assertFalse(posts_url[lang].issubset(nodes_url))
@ -110,7 +110,7 @@ class MenuTest(BaseTest):
request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
with smart_override(lang):
self._reset_menus()
nodes = menu_pool.get_nodes(request)
nodes = self.get_nodes(menu_pool, request)
nodes_url = set([node.get_absolute_url() for node in nodes])
self.assertFalse(cats_url[lang].issubset(nodes_url))
self.assertTrue(posts_url[lang].issubset(nodes_url))
@ -123,7 +123,7 @@ class MenuTest(BaseTest):
request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
with smart_override(lang):
self._reset_menus()
nodes = menu_pool.get_nodes(request)
nodes = self.get_nodes(menu_pool, request)
nodes_url = set([node.get_absolute_url() for node in nodes])
self.assertTrue(cats_url[lang].issubset(nodes_url))
self.assertFalse(posts_url[lang].issubset(nodes_url))
@ -136,7 +136,7 @@ class MenuTest(BaseTest):
request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
with smart_override(lang):
self._reset_menus()
nodes = menu_pool.get_nodes(request)
nodes = self.get_nodes(menu_pool, request)
nodes_url = set([node.get_absolute_url() for node in nodes])
self.assertTrue(cats_url[lang].issubset(nodes_url))
self.assertTrue(posts_url[lang].issubset(nodes_url))
@ -151,7 +151,7 @@ class MenuTest(BaseTest):
request = self.get_page_request(None, self.user, r'/%s/page-two/' % lang)
with smart_override(lang):
self._reset_menus()
nodes = menu_pool.get_nodes(request)
nodes = self.get_nodes(menu_pool, request)
nodes_url = set([node.url for node in nodes])
self.assertTrue(cats_with_post_url[lang].issubset(nodes_url))
self.assertFalse(cats_without_post_url[lang].intersection(nodes_url))
@ -194,7 +194,7 @@ class MenuTest(BaseTest):
view_obj.get(request)
view_obj.get_context_data()
# check if selected menu node points to cat
nodes = menu_pool.get_nodes(request)
nodes = self.get_nodes(menu_pool, request)
found = []
for node in nodes:
if node.selected:
@ -219,11 +219,8 @@ class MenuTest(BaseTest):
view_obj.get(request)
view_obj.get_context_data()
# check if selected menu node points to cat
nodes = menu_pool.get_nodes(request)
found = []
for node in nodes:
if node.selected:
found.append(node.get_absolute_url())
nodes = self.get_nodes(menu_pool, request)
found = [node.get_absolute_url() for node in nodes if node.selected]
self.assertTrue(cat.get_absolute_url() in found)
self.app_config_1.app_data.config.menu_structure = MENU_TYPE_COMPLETE

View File

@ -583,7 +583,7 @@ class AdminTest(BaseTest):
post = self._get_post(self._post_data[0]['en'])
request = self.get_page_request(None, self.user, r'/en/page-two/')
first_nodes = menu_pool.get_nodes(request)
first_nodes = self.get_nodes(menu_pool, request)
self._reset_menus()
with pause_knocks(post):
with self.login_user_context(self.user):
@ -596,7 +596,7 @@ class AdminTest(BaseTest):
msg_mid.process_request(request)
config_admin = admin.site._registry[BlogConfig]
config_admin.change_view(request, str(self.app_config_1.pk))
second_nodes = menu_pool.get_nodes(request)
second_nodes = self.get_nodes(menu_pool, request)
self.assertNotEqual(len(first_nodes), len(second_nodes))

View File

@ -5,7 +5,6 @@ import os.path
import re
from cms.api import add_plugin
from django.contrib.sites.models import SITE_CACHE
from django.core.urlresolvers import reverse
from django.utils.timezone import now
from taggit.models import Tag
@ -28,8 +27,7 @@ class PluginTest(BaseTest):
plugin = add_plugin(
ph, 'BlogLatestEntriesPluginCached', language='en', app_config=self.app_config_1
)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
try:
self.assertTrue(rendered.find('cms_plugin-djangocms_blog-post-abstract-1') > -1)
except AssertionError:
@ -41,15 +39,16 @@ class PluginTest(BaseTest):
plugin_nocache = add_plugin(
ph, 'BlogLatestEntriesPlugin', language='en', app_config=self.app_config_1
)
with self.assertNumQueries(39):
plugin_nocache.render_plugin(context, ph)
# FIXME: Investigate the correct number of queries expected here
with self.assertNumQueries(19):
self.render_plugin(pages[0], 'en', plugin_nocache)
with self.assertNumQueries(19):
self.render_plugin(pages[0], 'en', plugin)
with self.assertNumQueries(19):
rendered = self.render_plugin(pages[0], 'en', plugin)
with self.assertNumQueries(15):
rendered = plugin.render_plugin(context, ph)
try:
self.assertTrue(rendered.find('cms_plugin-djangocms_blog-post-abstract-1') > -1)
except AssertionError:
self.assertTrue(rendered.find('cms-plugin-djangocms_blog-post-abstract-1') > -1)
self.assertTrue(rendered.find('<p>first line</p>') > -1)
self.assertTrue(rendered.find('<article id="post-first-post"') > -1)
self.assertTrue(rendered.find(posts[0].get_absolute_url()) > -1)
@ -68,8 +67,7 @@ class PluginTest(BaseTest):
tag = Tag.objects.get(slug='tag-1')
plugin.tags.add(tag)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
try:
self.assertTrue(rendered.find('cms_plugin-djangocms_blog-post-abstract-1') > -1)
except AssertionError:
@ -92,8 +90,7 @@ class PluginTest(BaseTest):
)
plugin.categories.add(category_2)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
try:
self.assertTrue(rendered.find('cms_plugin-djangocms_blog-post-abstract-2') > -1)
except AssertionError:
@ -125,18 +122,15 @@ class PluginTest(BaseTest):
self.assertEqual(casted_categories.categories.count(), 1)
posts[1].sites.add(self.site_2)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
self.assertFalse(rendered.find('<p>second post first line</p>') > -1)
posts[1].sites.remove(self.site_2)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
self.assertTrue(rendered.find('<p>second post first line</p>') > -1)
plugin = add_plugin(ph, 'BlogLatestEntriesPlugin', language='en')
context = self.get_plugin_context(pages[0], 'en', plugin, edit=False)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=False)
# data is picked from both apphook configs
self.assertTrue(rendered.find('<article id="post-first-post"') > -1)
self.assertTrue(rendered.find('<article id="post-different-appconfig"') > -1)
@ -152,8 +146,7 @@ class PluginTest(BaseTest):
posts[1].save()
ph = pages[0].placeholders.get(slot='content')
plugin = add_plugin(ph, 'BlogTagsPlugin', language='en', app_config=self.app_config_1)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
for tag in Tag.objects.all():
self.assertTrue(rendered.find(
reverse('djangocms_blog:posts-tagged', kwargs={'tag': tag.slug})
@ -224,25 +217,21 @@ class PluginTest2(BaseTest):
ph = pages[0].placeholders.get(slot='content')
plugin = add_plugin(ph, 'BlogAuthorPostsPlugin', language='en', app_config=self.app_config_1)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
self.assertTrue(rendered.find('No article found') > -1)
plugin.authors.add(self.user)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
self.assertTrue(rendered.find('/en/blog/author/admin/') > -1)
self.assertTrue(rendered.find('2 articles') > -1)
plugin.authors.add(self.user_staff)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
self.assertTrue(rendered.find('/en/blog/author/staff/') > -1)
self.assertTrue(rendered.find('0 articles') > -1)
plugin.authors.add(self.user_normal)
context = self.get_plugin_context(pages[0], 'en', plugin, edit=True)
rendered = plugin.render_plugin(context, ph)
rendered = self.render_plugin(pages[0], 'en', plugin, edit=True)
self.assertTrue(rendered.find('/en/blog/author/normal/') > -1)
self.assertTrue(rendered.find('0 articles') > -1)

View File

@ -59,6 +59,7 @@ class SetupTest(BaseTest):
# Tests starts with no page and no config
self.assertFalse(Page.objects.exists())
self.assertFalse(BlogConfig.objects.exists())
set_home = hasattr(Page, 'set_as_homepage')
langs = get_language_list()
home = None
@ -69,6 +70,8 @@ class SetupTest(BaseTest):
'a new home', language=lang,
template='blog.html', in_navigation=True, published=True
)
if set_home:
home.set_as_homepage()
else:
create_title(
language=lang, title='a new home', page=home

View File

@ -11,7 +11,6 @@ from django.contrib.auth.models import AnonymousUser
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import reverse
from django.http import Http404
from django.utils.encoding import force_text
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from parler.tests.utils import override_parler_settings

10
tox.ini
View File

@ -1,8 +1,8 @@
[tox]
envlist = pep8,isort,docs,py{35,34,27}-django{110}-{cms34},py{35,34,27}-django{19}-{cms34,cms33,cms32},py{35,34,33,27}-django{18}-cms{34,33,32}
envlist = pep8,isort,docs,py{36,35,34,27}-django{111,110}-cms{35,34},py{35,34,27}-django{19}-cms{35,34,33,32},py{35,34,33,27}-django{18}-cms{35,34,33,32}
[testenv]
commands = {env:COMMAND:python} cms_helper.py test djangocms_blog
commands = {env:COMMAND:python} cms_helper.py djangocms_blog test
deps =
django18: Django>=1.8,<1.9
django18: django-mptt>=0.8
@ -23,12 +23,14 @@ deps =
cms33: https://github.com/divio/django-cms/archive/release/3.3.x.zip
cms33: djangocms-text-ckeditor>=3.0
cms34: https://github.com/divio/django-cms/archive/release/3.4.x.zip
cms34: djangocms-text-ckeditor>=3.0
cms34: djangocms-text-ckeditor>=3.2
cms35: https://github.com/divio/django-cms/archive/develop.zip
cms35: djangocms-text-ckeditor>=3.5
channels>=0.15
https://github.com/nephila/django-knocker/archive/master.zip?0.1.1
django-meta>=1.2
html5lib<0.99999999
https://github.com/nephila/djangocms-helper/archive/release/0.9.x.zip
https://github.com/nephila/djangocms-helper/archive/develop.zip
aldryn-apphooks-config
https://github.com/nephila/djangocms-apphook-setup/archive/master.zip
-r{toxinidir}/requirements-test.txt