Merge branch 'release/0.8.x' into develop
This commit is contained in:
commit
5ede0f01a4
|
@ -19,6 +19,13 @@ History
|
||||||
* Added plugins templateset.
|
* Added plugins templateset.
|
||||||
* Improved category admin to avoid circular relationships.
|
* Improved category admin to avoid circular relationships.
|
||||||
|
|
||||||
|
******************
|
||||||
|
0.8.8 (2016-09-04)
|
||||||
|
******************
|
||||||
|
|
||||||
|
* Fixed issue with one migration
|
||||||
|
* Improved support for django CMS 3.4
|
||||||
|
|
||||||
******************
|
******************
|
||||||
0.8.7 (2016-08-25)
|
0.8.7 (2016-08-25)
|
||||||
******************
|
******************
|
||||||
|
|
|
@ -100,7 +100,8 @@ HELPER_SETTINGS = dict(
|
||||||
'default': {
|
'default': {
|
||||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
BLOG_AUTO_SETUP=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -3,6 +3,6 @@ from __future__ import absolute_import, print_function, unicode_literals
|
||||||
|
|
||||||
__author__ = 'Iacopo Spalletti'
|
__author__ = 'Iacopo Spalletti'
|
||||||
__email__ = 'i.spalletti@nephila.it'
|
__email__ = 'i.spalletti@nephila.it'
|
||||||
__version__ = '0.9b1'
|
__version__ = '0.9b2'
|
||||||
|
|
||||||
default_app_config = 'djangocms_blog.apps.BlogAppConfig'
|
default_app_config = 'djangocms_blog.apps.BlogAppConfig'
|
||||||
|
|
|
@ -1,32 +1,4 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import absolute_import, print_function, unicode_literals
|
from __future__ import absolute_import, print_function, unicode_literals
|
||||||
|
|
||||||
from aldryn_apphooks_config.app_base import CMSConfigApp
|
from .cms_apps import * # NOQA
|
||||||
from cms.apphook_pool import apphook_pool
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
from djangocms_apphook_setup.base import AutoCMSAppMixin
|
|
||||||
|
|
||||||
from .cms_appconfig import BlogConfig
|
|
||||||
from .cms_menus import BlogCategoryMenu
|
|
||||||
from .settings import get_setting
|
|
||||||
|
|
||||||
|
|
||||||
class BlogApp(AutoCMSAppMixin, CMSConfigApp):
|
|
||||||
name = _('Blog')
|
|
||||||
urls = ['djangocms_blog.urls']
|
|
||||||
app_name = 'djangocms_blog'
|
|
||||||
app_config = BlogConfig
|
|
||||||
menus = [BlogCategoryMenu]
|
|
||||||
auto_setup = {
|
|
||||||
'enabled': get_setting('AUTO_SETUP'),
|
|
||||||
'home title': get_setting('AUTO_HOME_TITLE'),
|
|
||||||
'page title': get_setting('AUTO_BLOG_TITLE'),
|
|
||||||
'namespace': get_setting('AUTO_NAMESPACE'),
|
|
||||||
'config_fields': {},
|
|
||||||
'config_translated_fields': {
|
|
||||||
'app_title': get_setting('AUTO_APP_TITLE'),
|
|
||||||
'object_name': get_setting('DEFAULT_OBJECT_NAME')
|
|
||||||
},
|
|
||||||
}
|
|
||||||
apphook_pool.register(BlogApp)
|
|
||||||
BlogApp.setup()
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import absolute_import, print_function, unicode_literals
|
||||||
|
|
||||||
|
from aldryn_apphooks_config.app_base import CMSConfigApp
|
||||||
|
from cms.apphook_pool import apphook_pool
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from djangocms_apphook_setup.base import AutoCMSAppMixin
|
||||||
|
|
||||||
|
from .cms_appconfig import BlogConfig
|
||||||
|
from .cms_menus import BlogCategoryMenu
|
||||||
|
from .settings import get_setting
|
||||||
|
|
||||||
|
|
||||||
|
class BlogApp(AutoCMSAppMixin, CMSConfigApp):
|
||||||
|
name = _('Blog')
|
||||||
|
urls = ['djangocms_blog.urls']
|
||||||
|
app_name = 'djangocms_blog'
|
||||||
|
app_config = BlogConfig
|
||||||
|
menus = [BlogCategoryMenu]
|
||||||
|
auto_setup = {
|
||||||
|
'enabled': get_setting('AUTO_SETUP'),
|
||||||
|
'home title': get_setting('AUTO_HOME_TITLE'),
|
||||||
|
'page title': get_setting('AUTO_BLOG_TITLE'),
|
||||||
|
'namespace': get_setting('AUTO_NAMESPACE'),
|
||||||
|
'config_fields': {},
|
||||||
|
'config_translated_fields': {
|
||||||
|
'app_title': get_setting('AUTO_APP_TITLE'),
|
||||||
|
'object_name': get_setting('DEFAULT_OBJECT_NAME')
|
||||||
|
},
|
||||||
|
}
|
||||||
|
apphook_pool.register(BlogApp)
|
||||||
|
BlogApp.setup()
|
|
@ -1,72 +1,4 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import absolute_import, print_function, unicode_literals
|
from __future__ import absolute_import, print_function, unicode_literals
|
||||||
|
|
||||||
from cms.toolbar_base import CMSToolbar
|
from .cms_toolbars import * # NOQA
|
||||||
from cms.toolbar_pool import toolbar_pool
|
|
||||||
from cms.utils.urlutils import admin_reverse
|
|
||||||
from django.core.urlresolvers import reverse
|
|
||||||
from django.utils.translation import override, ugettext_lazy as _
|
|
||||||
|
|
||||||
from .settings import get_setting
|
|
||||||
|
|
||||||
|
|
||||||
@toolbar_pool.register
|
|
||||||
class BlogToolbar(CMSToolbar):
|
|
||||||
|
|
||||||
def populate(self):
|
|
||||||
if (not self.is_current_app and not get_setting('ENABLE_THROUGH_TOOLBAR_MENU')) or \
|
|
||||||
not self.request.user.has_perm('djangocms_blog.add_post'):
|
|
||||||
return # pragma: no cover
|
|
||||||
admin_menu = self.toolbar.get_or_create_menu('djangocms_blog', _('Blog'))
|
|
||||||
with override(self.current_lang):
|
|
||||||
url = reverse('admin:djangocms_blog_post_changelist')
|
|
||||||
admin_menu.add_modal_item(_('Post list'), url=url)
|
|
||||||
url = reverse('admin:djangocms_blog_post_add')
|
|
||||||
admin_menu.add_modal_item(_('Add post'), url=url)
|
|
||||||
current_config = getattr(self.request, get_setting('CURRENT_NAMESPACE'), None)
|
|
||||||
if current_config:
|
|
||||||
url = reverse('admin:djangocms_blog_blogconfig_change', args=(current_config.pk,))
|
|
||||||
admin_menu.add_modal_item(_('Edit configuration'), url=url)
|
|
||||||
|
|
||||||
current_post = getattr(self.request, get_setting('CURRENT_POST_IDENTIFIER'), None)
|
|
||||||
if current_post and self.request.user.has_perm('djangocms_blog.change_post'): # pragma: no cover # NOQA
|
|
||||||
admin_menu.add_modal_item(_('Edit Post'), reverse(
|
|
||||||
'admin:djangocms_blog_post_change', args=(current_post.pk,)),
|
|
||||||
active=True)
|
|
||||||
|
|
||||||
def add_publish_button(self):
|
|
||||||
"""
|
|
||||||
Adds the publish button to the toolbar if the current post is unpublished
|
|
||||||
"""
|
|
||||||
current_post = getattr(self.request, get_setting('CURRENT_POST_IDENTIFIER'), None)
|
|
||||||
if (self.toolbar.edit_mode and current_post and
|
|
||||||
not current_post.publish and
|
|
||||||
self.request.user.has_perm('djangocms_blog.change_post')
|
|
||||||
): # pragma: no cover # NOQA
|
|
||||||
classes = ['cms-btn-action', 'blog-publish']
|
|
||||||
title = _('Publish {0} now').format(current_post.app_config.object_name)
|
|
||||||
|
|
||||||
url = admin_reverse('djangocms_blog_publish_article', args=(current_post.pk,))
|
|
||||||
|
|
||||||
self.toolbar.add_button(title, url=url, extra_classes=classes, side=self.toolbar.RIGHT)
|
|
||||||
|
|
||||||
def post_template_populate(self):
|
|
||||||
current_post = getattr(self.request, get_setting('CURRENT_POST_IDENTIFIER'), None)
|
|
||||||
if current_post and self.request.user.has_perm('djangocms_blog.change_post'): # pragma: no cover # NOQA
|
|
||||||
# removing page meta menu, if present, to avoid confusion
|
|
||||||
try: # pragma: no cover
|
|
||||||
import djangocms_page_meta # NOQA
|
|
||||||
menu = self.request.toolbar.get_or_create_menu('page')
|
|
||||||
pagemeta = menu.get_or_create_menu('pagemeta', 'meta')
|
|
||||||
menu.remove_item(pagemeta)
|
|
||||||
except ImportError:
|
|
||||||
pass
|
|
||||||
# removing page tags menu, if present, to avoid confusion
|
|
||||||
try: # pragma: no cover
|
|
||||||
import djangocms_page_tags # NOQA
|
|
||||||
menu = self.request.toolbar.get_or_create_menu('page')
|
|
||||||
pagetags = menu.get_or_create_menu('pagetags', 'tags')
|
|
||||||
menu.remove_item(pagetags)
|
|
||||||
except ImportError:
|
|
||||||
pass
|
|
||||||
self.add_publish_button()
|
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import absolute_import, print_function, unicode_literals
|
||||||
|
|
||||||
|
from cms.toolbar_base import CMSToolbar
|
||||||
|
from cms.toolbar_pool import toolbar_pool
|
||||||
|
from cms.utils.urlutils import admin_reverse
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from django.utils.translation import override, ugettext_lazy as _
|
||||||
|
|
||||||
|
from .settings import get_setting
|
||||||
|
|
||||||
|
|
||||||
|
@toolbar_pool.register
|
||||||
|
class BlogToolbar(CMSToolbar):
|
||||||
|
|
||||||
|
def populate(self):
|
||||||
|
if (not self.is_current_app and not get_setting('ENABLE_THROUGH_TOOLBAR_MENU')) or \
|
||||||
|
not self.request.user.has_perm('djangocms_blog.add_post'):
|
||||||
|
return # pragma: no cover
|
||||||
|
admin_menu = self.toolbar.get_or_create_menu('djangocms_blog', _('Blog'))
|
||||||
|
with override(self.current_lang):
|
||||||
|
url = reverse('admin:djangocms_blog_post_changelist')
|
||||||
|
admin_menu.add_modal_item(_('Post list'), url=url)
|
||||||
|
url = reverse('admin:djangocms_blog_post_add')
|
||||||
|
admin_menu.add_modal_item(_('Add post'), url=url)
|
||||||
|
current_config = getattr(self.request, get_setting('CURRENT_NAMESPACE'), None)
|
||||||
|
if current_config:
|
||||||
|
url = reverse('admin:djangocms_blog_blogconfig_change', args=(current_config.pk,))
|
||||||
|
admin_menu.add_modal_item(_('Edit configuration'), url=url)
|
||||||
|
|
||||||
|
current_post = getattr(self.request, get_setting('CURRENT_POST_IDENTIFIER'), None)
|
||||||
|
if current_post and self.request.user.has_perm('djangocms_blog.change_post'): # pragma: no cover # NOQA
|
||||||
|
admin_menu.add_modal_item(_('Edit Post'), reverse(
|
||||||
|
'admin:djangocms_blog_post_change', args=(current_post.pk,)),
|
||||||
|
active=True)
|
||||||
|
|
||||||
|
def add_publish_button(self):
|
||||||
|
"""
|
||||||
|
Adds the publish button to the toolbar if the current post is unpublished
|
||||||
|
"""
|
||||||
|
current_post = getattr(self.request, get_setting('CURRENT_POST_IDENTIFIER'), None)
|
||||||
|
if (self.toolbar.edit_mode and current_post and
|
||||||
|
not current_post.publish and
|
||||||
|
self.request.user.has_perm('djangocms_blog.change_post')
|
||||||
|
): # pragma: no cover # NOQA
|
||||||
|
classes = ['cms-btn-action', 'blog-publish']
|
||||||
|
title = _('Publish {0} now').format(current_post.app_config.object_name)
|
||||||
|
|
||||||
|
url = admin_reverse('djangocms_blog_publish_article', args=(current_post.pk,))
|
||||||
|
|
||||||
|
self.toolbar.add_button(title, url=url, extra_classes=classes, side=self.toolbar.RIGHT)
|
||||||
|
|
||||||
|
def post_template_populate(self):
|
||||||
|
current_post = getattr(self.request, get_setting('CURRENT_POST_IDENTIFIER'), None)
|
||||||
|
if current_post and self.request.user.has_perm('djangocms_blog.change_post'): # pragma: no cover # NOQA
|
||||||
|
# removing page meta menu, if present, to avoid confusion
|
||||||
|
try: # pragma: no cover
|
||||||
|
import djangocms_page_meta # NOQA
|
||||||
|
menu = self.request.toolbar.get_or_create_menu('page')
|
||||||
|
pagemeta = menu.get_or_create_menu('pagemeta', 'meta')
|
||||||
|
menu.remove_item(pagemeta)
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
# removing page tags menu, if present, to avoid confusion
|
||||||
|
try: # pragma: no cover
|
||||||
|
import djangocms_page_tags # NOQA
|
||||||
|
menu = self.request.toolbar.get_or_create_menu('page')
|
||||||
|
pagetags = menu.get_or_create_menu('pagetags', 'tags')
|
||||||
|
menu.remove_item(pagetags)
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
self.add_publish_button()
|
|
@ -1,9 +1,9 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.9.9 on 2016-08-23 18:08
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
from djangocms_blog.models import thumbnail_model
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
@ -16,26 +16,26 @@ class Migration(migrations.Migration):
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='authorentriesplugin',
|
model_name='authorentriesplugin',
|
||||||
name='cmsplugin_ptr',
|
name='cmsplugin_ptr',
|
||||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, related_name='djangocms_blog_authorentriesplugin', serialize=False, to='cms.CMSPlugin'),
|
field=models.OneToOneField(parent_link=True, related_name='djangocms_blog_authorentriesplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='genericblogplugin',
|
model_name='genericblogplugin',
|
||||||
name='cmsplugin_ptr',
|
name='cmsplugin_ptr',
|
||||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, related_name='djangocms_blog_genericblogplugin', serialize=False, to='cms.CMSPlugin'),
|
field=models.OneToOneField(parent_link=True, related_name='djangocms_blog_genericblogplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='latestpostsplugin',
|
model_name='latestpostsplugin',
|
||||||
name='cmsplugin_ptr',
|
name='cmsplugin_ptr',
|
||||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, related_name='djangocms_blog_latestpostsplugin', serialize=False, to='cms.CMSPlugin'),
|
field=models.OneToOneField(parent_link=True, related_name='djangocms_blog_latestpostsplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='post',
|
model_name='post',
|
||||||
name='main_image_full',
|
name='main_image_full',
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='djangocms_blog_post_full', to='filer.ThumbnailOption', verbose_name='main image full'),
|
field=models.ForeignKey(related_name='djangocms_blog_post_full', on_delete=django.db.models.deletion.SET_NULL, verbose_name='main image full', blank=True, to=thumbnail_model, null=True),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='post',
|
model_name='post',
|
||||||
name='main_image_thumbnail',
|
name='main_image_thumbnail',
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='djangocms_blog_post_thumbnail', to='filer.ThumbnailOption', verbose_name='main image thumbnail'),
|
field=models.ForeignKey(related_name='djangocms_blog_post_thumbnail', on_delete=django.db.models.deletion.SET_NULL, verbose_name='main image thumbnail', blank=True, to=thumbnail_model, null=True),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -15,12 +15,12 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="blog-lead">
|
<div class="blog-lead">
|
||||||
{% if not TRUNCWORDS_COUNT %}
|
{% if not TRUNCWORDS_COUNT %}
|
||||||
{% render_model post "abstract" %}
|
{% render_model post "abstract" "" "" "safe" %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% render_model post "abstract" "" "" 'truncatewords_html:TRUNCWORDS_COUNT' %}
|
{% render_model post "abstract" "" "" "truncatewords_html:TRUNCWORDS_COUNT|safe" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<footer class="read-more">
|
<footer class="read-more">
|
||||||
<a href="{{ post.get_absolute_url }}">{% trans "read more" %} »</a>
|
<a href="{{ post.get_absolute_url }}">{% trans "read more" %} »</a>
|
||||||
</footer>
|
</footer>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
{% if post.app_config.use_placeholder %}
|
{% if post.app_config.use_placeholder %}
|
||||||
<div class="blog-content">{% render_placeholder post.content %}</div>
|
<div class="blog-content">{% render_placeholder post.content %}</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="blog-content">{% render_model post "post_text" "post_text" %}</div>
|
<div class="blog-content">{% render_model post "post_text" "post_text" "" "safe" %}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if view.liveblog_enabled %}
|
{% if view.liveblog_enabled %}
|
||||||
{% include "liveblog/includes/post_detail.html" %}
|
{% include "liveblog/includes/post_detail.html" %}
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
{% if post.app_config.use_placeholder %}
|
{% if post.app_config.use_placeholder %}
|
||||||
<div class="blog-content">{% render_placeholder post.content %}</div>
|
<div class="blog-content">{% render_placeholder post.content %}</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="blog-content">{% render_model post "post_text" "post_text" %}</div>
|
<div class="blog-content">{% render_model post "post_text" "post_text" "" "safe" %}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</article>
|
</article>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -12,7 +12,13 @@ from djangocms_blog.cms_appconfig import BlogConfig
|
||||||
|
|
||||||
from .base import BaseTest
|
from .base import BaseTest
|
||||||
|
|
||||||
|
try:
|
||||||
|
from django.test import override_settings
|
||||||
|
except ImportError:
|
||||||
|
from django.test.utils import override_settings
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(BLOG_AUTO_SETUP=True)
|
||||||
class SetupTest(BaseTest):
|
class SetupTest(BaseTest):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -42,7 +48,7 @@ class SetupTest(BaseTest):
|
||||||
self.assertFalse(BlogConfig.objects.exists())
|
self.assertFalse(BlogConfig.objects.exists())
|
||||||
|
|
||||||
# importing cms_app triggers the auto setup
|
# importing cms_app triggers the auto setup
|
||||||
from djangocms_blog import cms_app # NOQA
|
from djangocms_blog import cms_apps # NOQA
|
||||||
|
|
||||||
# Home and blog, published and draft
|
# Home and blog, published and draft
|
||||||
self.assertEqual(Page.objects.count(), 4)
|
self.assertEqual(Page.objects.count(), 4)
|
||||||
|
@ -70,7 +76,7 @@ class SetupTest(BaseTest):
|
||||||
home.publish(lang)
|
home.publish(lang)
|
||||||
|
|
||||||
# importing cms_app triggers the auto setup
|
# importing cms_app triggers the auto setup
|
||||||
from djangocms_blog import cms_app # NOQA
|
from djangocms_blog import cms_apps # NOQA
|
||||||
|
|
||||||
# Home and blog, published and draft
|
# Home and blog, published and draft
|
||||||
self.assertEqual(Page.objects.count(), 4)
|
self.assertEqual(Page.objects.count(), 4)
|
||||||
|
|
2
tox.ini
2
tox.ini
|
@ -25,7 +25,7 @@ deps =
|
||||||
knocker: djangocms-text-ckeditor>=3.0
|
knocker: djangocms-text-ckeditor>=3.0
|
||||||
django-meta>=1.2
|
django-meta>=1.2
|
||||||
html5lib<0.99999999
|
html5lib<0.99999999
|
||||||
https://github.com/nephila/djangocms-helper/archive/develop.zip
|
https://github.com/nephila/djangocms-helper/archive/release/0.9.x.zip
|
||||||
https://github.com/aldryn/aldryn-apphooks-config/archive/master.zip
|
https://github.com/aldryn/aldryn-apphooks-config/archive/master.zip
|
||||||
https://github.com/nephila/djangocms-apphook-setup/archive/master.zip
|
https://github.com/nephila/djangocms-apphook-setup/archive/master.zip
|
||||||
-r{toxinidir}/requirements-test.txt
|
-r{toxinidir}/requirements-test.txt
|
||||||
|
|
Loading…
Reference in New Issue