From 493f7bdd0434093f774f855c490e98363b5d760e Mon Sep 17 00:00:00 2001 From: Paulo Date: Tue, 23 Aug 2016 11:38:41 -0400 Subject: [PATCH] Dropped djangoCMS < 3.2 support and added 3.4 support (#424) * Use the new names for app and toolbar * Added djangoCMS < 3.2 compatible toolbar and app modules * tox adjustments * flake8 * fixes import error * Adjust travis * Drop support for cms < 3.2 --- .travis.yml | 20 ++--- aldryn_newsblog/cms_app.py | 23 +----- aldryn_newsblog/cms_apps.py | 21 +++++ aldryn_newsblog/cms_toolbar.py | 129 +----------------------------- aldryn_newsblog/cms_toolbars.py | 127 +++++++++++++++++++++++++++++ aldryn_newsblog/tests/__init__.py | 4 +- setup.py | 2 +- tox.ini | 22 ++--- 8 files changed, 169 insertions(+), 179 deletions(-) create mode 100644 aldryn_newsblog/cms_apps.py create mode 100644 aldryn_newsblog/cms_toolbars.py diff --git a/.travis.yml b/.travis.yml index 8fc1bfc6..09eb1b2a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,38 +28,30 @@ env: # DB backends # NOTE: MYSQL AND POSTGRES TESTS ARE DISABLED UNTIL #339 IS MERGED. - TOXENV=flake8 + - TOXENV=py35-dj19-sqlite-cms34 - TOXENV=py35-dj19-sqlite-cms33-fe FE=1 - TOXENV=py35-dj19-sqlite-cms32 + - TOXENV=py34-dj19-sqlite-cms34 - TOXENV=py34-dj19-sqlite-cms33 - TOXENV=py34-dj19-sqlite-cms32 + - TOXENV=py27-dj19-sqlite-cms34 - TOXENV=py27-dj19-sqlite-cms33 - TOXENV=py27-dj19-sqlite-cms32 + - TOXENV=py35-dj18-sqlite-cms34 - TOXENV=py35-dj18-sqlite-cms33 - TOXENV=py35-dj18-sqlite-cms32 + - TOXENV=py34-dj18-sqlite-cms34 - TOXENV=py34-dj18-sqlite-cms33 - TOXENV=py34-dj18-sqlite-cms32 - - TOXENV=py34-dj18-sqlite-cms31 + - TOXENV=py27-dj18-sqlite-cms34 - TOXENV=py27-dj18-sqlite-cms33-fe FE=1 - TOXENV=py27-dj18-sqlite-cms32 - - TOXENV=py27-dj18-sqlite-cms31 - TOXENV=py34-dj17-sqlite-cms32 - - TOXENV=py34-dj17-sqlite-cms31 - - TOXENV=py34-dj17-sqlite-cms30 - TOXENV=py33-dj17-sqlite-cms32 - - TOXENV=py33-dj17-sqlite-cms31 - - TOXENV=py33-dj17-sqlite-cms30 - TOXENV=py27-dj17-sqlite-cms32 - - TOXENV=py27-dj17-sqlite-cms31 - - TOXENV=py27-dj17-sqlite-cms30 - TOXENV=py33-dj16-sqlite-cms32 - - TOXENV=py33-dj16-sqlite-cms31 - - TOXENV=py33-dj16-sqlite-cms30 - TOXENV=py27-dj16-sqlite-cms32 - - TOXENV=py27-dj16-sqlite-cms31 - - TOXENV=py27-dj16-sqlite-cms30 - TOXENV=py26-dj16-sqlite-cms32 - - TOXENV=py26-dj16-sqlite-cms31 - - TOXENV=py26-dj16-sqlite-cms30 cache: directories: diff --git a/aldryn_newsblog/cms_app.py b/aldryn_newsblog/cms_app.py index 0b95c271..4e00b1e1 100644 --- a/aldryn_newsblog/cms_app.py +++ b/aldryn_newsblog/cms_app.py @@ -1,21 +1,2 @@ -# -*- coding: utf-8 -*- - -from __future__ import 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 .models import NewsBlogConfig - - -class NewsBlogApp(CMSConfigApp): - app_config = NewsBlogConfig - app_name = 'aldryn_newsblog' - name = _('NewsBlog') - urls = ['aldryn_newsblog.urls'] - - # NOTE: Please do not add a «menu» here, menu’s should only be added by at - # the discretion of the operator. - -apphook_pool.register(NewsBlogApp) +# djangoCMS < 3.2 compatibility +from . import cms_apps # NOQA diff --git a/aldryn_newsblog/cms_apps.py b/aldryn_newsblog/cms_apps.py new file mode 100644 index 00000000..0b95c271 --- /dev/null +++ b/aldryn_newsblog/cms_apps.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from __future__ import 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 .models import NewsBlogConfig + + +class NewsBlogApp(CMSConfigApp): + app_config = NewsBlogConfig + app_name = 'aldryn_newsblog' + name = _('NewsBlog') + urls = ['aldryn_newsblog.urls'] + + # NOTE: Please do not add a «menu» here, menu’s should only be added by at + # the discretion of the operator. + +apphook_pool.register(NewsBlogApp) diff --git a/aldryn_newsblog/cms_toolbar.py b/aldryn_newsblog/cms_toolbar.py index 5bcd607e..a3d31293 100644 --- a/aldryn_newsblog/cms_toolbar.py +++ b/aldryn_newsblog/cms_toolbar.py @@ -1,127 +1,2 @@ -# -*- coding: utf-8 -*- - -from __future__ import unicode_literals - -from django.core.exceptions import ImproperlyConfigured -from django.core.urlresolvers import reverse -from django.utils.translation import ( - ugettext as _, get_language_from_request, override) - -from cms.toolbar_base import CMSToolbar -from cms.toolbar_pool import toolbar_pool - -from aldryn_apphooks_config.utils import get_app_instance -from aldryn_translation_tools.utils import ( - get_object_from_request, - get_admin_url, -) - -from .models import Article -from .cms_appconfig import NewsBlogConfig - - -@toolbar_pool.register -class NewsBlogToolbar(CMSToolbar): - # watch_models must be a list, not a tuple - # see https://github.com/divio/django-cms/issues/4135 - watch_models = [Article, ] - supported_apps = ('aldryn_newsblog',) - - def get_on_delete_redirect_url(self, article, language): - with override(language): - url = reverse( - '{0}:article-list'.format(article.app_config.namespace)) - return url - - def __get_newsblog_config(self): - try: - __, config = get_app_instance(self.request) - if not isinstance(config, NewsBlogConfig): - # This is not the app_hook you are looking for. - return None - except ImproperlyConfigured: - # There is no app_hook at all. - return None - - return config - - def populate(self): - config = self.__get_newsblog_config() - if not config: - # Do nothing if there is no NewsBlog app_config to work with - return - - user = getattr(self.request, 'user', None) - try: - view_name = self.request.resolver_match.view_name - except AttributeError: - view_name = None - - if user and view_name: - language = get_language_from_request(self.request, check_path=True) - - # If we're on an Article detail page, then get the article - if view_name == '{0}:article-detail'.format(config.namespace): - article = get_object_from_request(Article, self.request) - else: - article = None - - menu = self.toolbar.get_or_create_menu('newsblog-app', - config.get_app_title()) - - change_config_perm = user.has_perm( - 'aldryn_newsblog.change_newsblogconfig') - add_config_perm = user.has_perm( - 'aldryn_newsblog.add_newsblogconfig') - config_perms = [change_config_perm, add_config_perm] - - change_article_perm = user.has_perm( - 'aldryn_newsblog.change_article') - delete_article_perm = user.has_perm( - 'aldryn_newsblog.delete_article') - add_article_perm = user.has_perm('aldryn_newsblog.add_article') - article_perms = [change_article_perm, add_article_perm, - delete_article_perm, ] - - if change_config_perm: - url_args = {} - if language: - url_args = {'language': language, } - url = get_admin_url('aldryn_newsblog_newsblogconfig_change', - [config.pk, ], **url_args) - menu.add_modal_item(_('Configure addon'), url=url) - - if any(config_perms) and any(article_perms): - menu.add_break() - - if change_article_perm: - url_args = {} - if config: - url_args = {'app_config__id__exact': config.pk} - url = get_admin_url('aldryn_newsblog_article_changelist', - **url_args) - menu.add_sideframe_item(_('Article list'), url=url) - - if add_article_perm: - url_args = {'app_config': config.pk, 'owner': user.pk, } - if language: - url_args.update({'language': language, }) - url = get_admin_url('aldryn_newsblog_article_add', **url_args) - menu.add_modal_item(_('Add new article'), url=url) - - if change_article_perm and article: - url_args = {} - if language: - url_args = {'language': language, } - url = get_admin_url('aldryn_newsblog_article_change', - [article.pk, ], **url_args) - menu.add_modal_item(_('Edit this article'), url=url, - active=True) - - if delete_article_perm and article: - redirect_url = self.get_on_delete_redirect_url( - article, language=language) - url = get_admin_url('aldryn_newsblog_article_delete', - [article.pk, ]) - menu.add_modal_item(_('Delete this article'), url=url, - on_close=redirect_url) +# djangoCMS < 3.2 compatibility +from . import cms_toolbars # NOQA diff --git a/aldryn_newsblog/cms_toolbars.py b/aldryn_newsblog/cms_toolbars.py new file mode 100644 index 00000000..5bcd607e --- /dev/null +++ b/aldryn_newsblog/cms_toolbars.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from django.core.exceptions import ImproperlyConfigured +from django.core.urlresolvers import reverse +from django.utils.translation import ( + ugettext as _, get_language_from_request, override) + +from cms.toolbar_base import CMSToolbar +from cms.toolbar_pool import toolbar_pool + +from aldryn_apphooks_config.utils import get_app_instance +from aldryn_translation_tools.utils import ( + get_object_from_request, + get_admin_url, +) + +from .models import Article +from .cms_appconfig import NewsBlogConfig + + +@toolbar_pool.register +class NewsBlogToolbar(CMSToolbar): + # watch_models must be a list, not a tuple + # see https://github.com/divio/django-cms/issues/4135 + watch_models = [Article, ] + supported_apps = ('aldryn_newsblog',) + + def get_on_delete_redirect_url(self, article, language): + with override(language): + url = reverse( + '{0}:article-list'.format(article.app_config.namespace)) + return url + + def __get_newsblog_config(self): + try: + __, config = get_app_instance(self.request) + if not isinstance(config, NewsBlogConfig): + # This is not the app_hook you are looking for. + return None + except ImproperlyConfigured: + # There is no app_hook at all. + return None + + return config + + def populate(self): + config = self.__get_newsblog_config() + if not config: + # Do nothing if there is no NewsBlog app_config to work with + return + + user = getattr(self.request, 'user', None) + try: + view_name = self.request.resolver_match.view_name + except AttributeError: + view_name = None + + if user and view_name: + language = get_language_from_request(self.request, check_path=True) + + # If we're on an Article detail page, then get the article + if view_name == '{0}:article-detail'.format(config.namespace): + article = get_object_from_request(Article, self.request) + else: + article = None + + menu = self.toolbar.get_or_create_menu('newsblog-app', + config.get_app_title()) + + change_config_perm = user.has_perm( + 'aldryn_newsblog.change_newsblogconfig') + add_config_perm = user.has_perm( + 'aldryn_newsblog.add_newsblogconfig') + config_perms = [change_config_perm, add_config_perm] + + change_article_perm = user.has_perm( + 'aldryn_newsblog.change_article') + delete_article_perm = user.has_perm( + 'aldryn_newsblog.delete_article') + add_article_perm = user.has_perm('aldryn_newsblog.add_article') + article_perms = [change_article_perm, add_article_perm, + delete_article_perm, ] + + if change_config_perm: + url_args = {} + if language: + url_args = {'language': language, } + url = get_admin_url('aldryn_newsblog_newsblogconfig_change', + [config.pk, ], **url_args) + menu.add_modal_item(_('Configure addon'), url=url) + + if any(config_perms) and any(article_perms): + menu.add_break() + + if change_article_perm: + url_args = {} + if config: + url_args = {'app_config__id__exact': config.pk} + url = get_admin_url('aldryn_newsblog_article_changelist', + **url_args) + menu.add_sideframe_item(_('Article list'), url=url) + + if add_article_perm: + url_args = {'app_config': config.pk, 'owner': user.pk, } + if language: + url_args.update({'language': language, }) + url = get_admin_url('aldryn_newsblog_article_add', **url_args) + menu.add_modal_item(_('Add new article'), url=url) + + if change_article_perm and article: + url_args = {} + if language: + url_args = {'language': language, } + url = get_admin_url('aldryn_newsblog_article_change', + [article.pk, ], **url_args) + menu.add_modal_item(_('Edit this article'), url=url, + active=True) + + if delete_article_perm and article: + redirect_url = self.get_on_delete_redirect_url( + article, language=language) + url = get_admin_url('aldryn_newsblog_article_delete', + [article.pk, ]) + menu.add_modal_item(_('Delete this article'), url=url, + on_close=redirect_url) diff --git a/aldryn_newsblog/tests/__init__.py b/aldryn_newsblog/tests/__init__.py index bc11aced..4e3d45b2 100644 --- a/aldryn_newsblog/tests/__init__.py +++ b/aldryn_newsblog/tests/__init__.py @@ -14,7 +14,7 @@ from django.utils.timezone import now from django.utils.translation import override from aldryn_categories.models import Category -from aldryn_newsblog.cms_app import NewsBlogApp +from aldryn_newsblog.cms_apps import NewsBlogApp from aldryn_newsblog.models import Article, NewsBlogConfig from aldryn_people.models import Person from cms import api @@ -269,7 +269,7 @@ def apphook_clear(self): except AppAlreadyRegistered: # there is an issue with discover apps, or i'm using it wrong. # setting discovered to True solves it. Maybe that is due to import - # from aldryn_events.cms_app which registers EventListAppHook + # from aldryn_events.cms_apps which registers EventListAppHook apphook_pool.discovered = True apphooks = apphook_pool.get_apphooks() diff --git a/setup.py b/setup.py index 2311d5cb..efaf0ce6 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ 'aldryn-translation-tools>=0.2.0', 'backport_collections==0.1', 'django-appdata>=0.1.4', - 'django-cms>=3.0.12', + 'django-cms>=3.2', 'djangocms-text-ckeditor', 'django-filer>=0.9.9', 'django-parler>=1.4', diff --git a/tox.ini b/tox.ini index 25923ec9..82ad20e7 100644 --- a/tox.ini +++ b/tox.ini @@ -1,11 +1,11 @@ [tox] envlist = flake8 - py{35,34,27}-dj19-{sqlite,mysql,postgres}-cms{33,32} - py{34,33,27}-dj18-{sqlite,mysql,postgres}-cms{33,32,31} - py{34,33,27}-dj17-{sqlite,mysql,postgres}-cms{32,31,30} - py{33,27}-dj16-{sqlite,mysql,postgres}-cms{32,31,30} - py{26}-dj16-{sqlite,oldmysql,postgres}-cms{32,31,30} + py{35,34,27}-dj19-{sqlite,mysql,postgres}-cms{34,33,32} + py{34,33,27}-dj18-{sqlite,mysql,postgres}-cms{34,33,32} + py{34,33,27}-dj17-{sqlite,mysql,postgres}-cms32 + py{33,27}-dj16-{sqlite,mysql,postgres}-cms32 + py{26}-dj16-{sqlite,oldmysql,postgres}-cms32 [testenv] passenv = @@ -32,21 +32,15 @@ deps = dj18: -rtest_requirements/django-1.8.txt dj19: -rtest_requirements/django-1.9.txt - cms30: django-cms>=3.0.12,<3.1 - cms30: djangocms-text-ckeditor<=2.7 - cms30: aldryn-apphook-reload>=0.2.3 - - cms31: django-cms>=3.1,<3.2 - # NOTE: tests will fail if we restrict to 2.7.0 on 3.1 - cms31: djangocms-text-ckeditor>2.7,<=2.9.3 - cms31: aldryn-apphook-reload>=0.2.3 - cms32: django-cms>=3.2,<3.3 cms32: djangocms-text-ckeditor>2.7,<=2.9.3 cms33: django-cms>=3.3,<3.4 cms33: djangocms-text-ckeditor>=3.0,<3.1 + cms34: https://github.com/divio/django-cms/archive/develop.zip + cms34: djangocms-text-ckeditor>=3.0 + # Does not support Python 2.6 or lower mysql: mysqlclient # Does not support Python 3+