diff --git a/.travis.yml b/.travis.yml index b9e762a3..d5efac84 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: python dist: xenial -sudo: false matrix: include: @@ -9,34 +8,31 @@ matrix: env: TOX_ENV='flake8' - python: 3.5 env: TOX_ENV='isort' - # Django 1.11 - - python: 2.7 - env: DJANGO='dj111' CMS='cms34' - - python: 3.4 - env: DJANGO='dj111' CMS='cms35' - - python: 3.5 - env: DJANGO='dj111' CMS='cms36' - - python: 3.6 - env: DJANGO='dj111' CMS='cms37' - # Django 2.1 - - python: 3.6 - env: DJANGO='dj21' CMS='cms36' - - python: 3.6 - env: DJANGO='dj21' CMS='cms37' # Django 2.2 + - python: 3.5 + env: DJANGO='dj22' CMS='cms37' - python: 3.6 env: DJANGO='dj22' CMS='cms37' - python: 3.7 env: DJANGO='dj22' CMS='cms37' - + - python: 3.8 + env: DJANGO='dj22' CMS='cms37' + # Django 3.0, always run the lowest supported version + - python: 3.6 + env: DJANGO='dj30' CMS='cms37' + # Django 3.1, always run the lowest supported version + - python: 3.6 + env: DJANGO='dj31' CMS='cms38' + allow_failures: + - python: 3.6 + env: DJANGO='dj31' CMS='cms38' install: - pip install coverage isort tox - - "if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then export PY_VER=py27; fi" - - "if [[ $TRAVIS_PYTHON_VERSION == '3.4' ]]; then export PY_VER=py34; fi" - "if [[ $TRAVIS_PYTHON_VERSION == '3.5' ]]; then export PY_VER=py35; fi" - "if [[ $TRAVIS_PYTHON_VERSION == '3.6' ]]; then export PY_VER=py36; fi" - "if [[ $TRAVIS_PYTHON_VERSION == '3.7' ]]; then export PY_VER=py37; fi" + - "if [[ $TRAVIS_PYTHON_VERSION == '3.8' ]]; then export PY_VER=py37; fi" - "if [[ ${DJANGO}z != 'z' ]]; then export TOX_ENV=$PY_VER-$DJANGO-$CMS; fi" script: diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3eefffd4..318462dd 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -3,6 +3,14 @@ Changelog ========= +3.0.0 (unreleased) +================== + +* Added support for Django 3.1 +* Dropped support for Python 2.7 and Python 3.4 +* Dropped support for Django < 2.2 + + 2.3.0 (2020-01-29) ================== diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/MANIFEST.in b/MANIFEST.in index 1f43104a..2ef81de1 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include LICENSE.txt +include LICENSE include README.rst recursive-include djangocms_snippet/locale * recursive-include djangocms_snippet/templates * diff --git a/README.rst b/README.rst index 6574ee8b..60bec6a6 100644 --- a/README.rst +++ b/README.rst @@ -119,9 +119,9 @@ You can run tests by executing:: .. |coverage| image:: https://codecov.io/gh/divio/djangocms-snippet/branch/master/graph/badge.svg :target: https://codecov.io/gh/divio/djangocms-snippet -.. |python| image:: https://img.shields.io/badge/python-2.7%20%7C%203.4+-blue.svg +.. |python| image:: https://img.shields.io/badge/python-3.5+-blue.svg :target: https://pypi.org/project/djangocms-snippet/ -.. |django| image:: https://img.shields.io/badge/django-1.11%20%7C%202.1%20%7C%202.2-blue.svg +.. |django| image:: https://img.shields.io/badge/django-2.2,%203.0,%203.1-blue.svg :target: https://www.djangoproject.com/ -.. |djangocms| image:: https://img.shields.io/badge/django%20CMS-3.4%2B-blue.svg +.. |djangocms| image:: https://img.shields.io/badge/django%20CMS-3.7%2B-blue.svg :target: https://www.django-cms.org/ diff --git a/aldryn_config.py b/aldryn_config.py index d43852c0..3e532b2c 100644 --- a/aldryn_config.py +++ b/aldryn_config.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from aldryn_client import forms diff --git a/djangocms_snippet/__init__.py b/djangocms_snippet/__init__.py index 8e4f66d6..cb2852a3 100644 --- a/djangocms_snippet/__init__.py +++ b/djangocms_snippet/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- __version__ = '2.3.0' default_app_config = 'djangocms_snippet.apps.SnippetConfig' diff --git a/djangocms_snippet/admin.py b/djangocms_snippet/admin.py index 8e6d30ab..9187fadd 100644 --- a/djangocms_snippet/admin.py +++ b/djangocms_snippet/admin.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from django.conf import settings from django.contrib import admin from django.db import models diff --git a/djangocms_snippet/apps.py b/djangocms_snippet/apps.py index d6a863f4..898fdf2c 100644 --- a/djangocms_snippet/apps.py +++ b/djangocms_snippet/apps.py @@ -1,6 +1,5 @@ -# -*- coding: utf-8 -*- from django.apps import AppConfig -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ class SnippetConfig(AppConfig): diff --git a/djangocms_snippet/cms_plugins.py b/djangocms_snippet/cms_plugins.py index 26a5e37f..bf432da9 100644 --- a/djangocms_snippet/cms_plugins.py +++ b/djangocms_snippet/cms_plugins.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- from django import template from django.conf import settings from django.utils.html import escape from django.utils.safestring import mark_safe -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from cms.plugin_base import CMSPluginBase from cms.plugin_pool import plugin_pool diff --git a/djangocms_snippet/migrations/0001_initial.py b/djangocms_snippet/migrations/0001_initial.py index abe79022..96a5a9a7 100644 --- a/djangocms_snippet/migrations/0001_initial.py +++ b/djangocms_snippet/migrations/0001_initial.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - import django.db.models.deletion from django.db import migrations, models diff --git a/djangocms_snippet/migrations/0002_snippet_slug.py b/djangocms_snippet/migrations/0002_snippet_slug.py index 0ab15993..77d3ce84 100644 --- a/djangocms_snippet/migrations/0002_snippet_slug.py +++ b/djangocms_snippet/migrations/0002_snippet_slug.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - from django.db import migrations, models diff --git a/djangocms_snippet/migrations/0003_auto_data_fill_slug.py b/djangocms_snippet/migrations/0003_auto_data_fill_slug.py index 4abfd953..a8a404b1 100644 --- a/djangocms_snippet/migrations/0003_auto_data_fill_slug.py +++ b/djangocms_snippet/migrations/0003_auto_data_fill_slug.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - from collections import Counter from django.db import migrations, models diff --git a/djangocms_snippet/migrations/0004_auto_alter_slug_unique.py b/djangocms_snippet/migrations/0004_auto_alter_slug_unique.py index 999c388b..713a390c 100644 --- a/djangocms_snippet/migrations/0004_auto_alter_slug_unique.py +++ b/djangocms_snippet/migrations/0004_auto_alter_slug_unique.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - from django.db import migrations, models diff --git a/djangocms_snippet/migrations/0005_set_related_name_for_cmsplugin_ptr.py b/djangocms_snippet/migrations/0005_set_related_name_for_cmsplugin_ptr.py index be9b8252..77ca9123 100644 --- a/djangocms_snippet/migrations/0005_set_related_name_for_cmsplugin_ptr.py +++ b/djangocms_snippet/migrations/0005_set_related_name_for_cmsplugin_ptr.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - import django.db.models.deletion from django.db import migrations, models diff --git a/djangocms_snippet/migrations/0006_auto_20160831_0729.py b/djangocms_snippet/migrations/0006_auto_20160831_0729.py index 0a187db5..909e3f8c 100644 --- a/djangocms_snippet/migrations/0006_auto_20160831_0729.py +++ b/djangocms_snippet/migrations/0006_auto_20160831_0729.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - from django.db import migrations, models diff --git a/djangocms_snippet/migrations/0007_auto_alter_template_helptext.py b/djangocms_snippet/migrations/0007_auto_alter_template_helptext.py index 86285e8e..aa98f3a7 100644 --- a/djangocms_snippet/migrations/0007_auto_alter_template_helptext.py +++ b/djangocms_snippet/migrations/0007_auto_alter_template_helptext.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - from django.db import migrations, models diff --git a/djangocms_snippet/migrations/0008_auto_change_name.py b/djangocms_snippet/migrations/0008_auto_change_name.py index 6ec173af..311456f9 100644 --- a/djangocms_snippet/migrations/0008_auto_change_name.py +++ b/djangocms_snippet/migrations/0008_auto_change_name.py @@ -1,7 +1,4 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.9 on 2018-10-12 10:03 -from __future__ import unicode_literals - from django.db import migrations diff --git a/djangocms_snippet/migrations/__init__.py b/djangocms_snippet/migrations/__init__.py index 40a96afc..e69de29b 100644 --- a/djangocms_snippet/migrations/__init__.py +++ b/djangocms_snippet/migrations/__init__.py @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/djangocms_snippet/models.py b/djangocms_snippet/models.py index 5420abc5..23f27144 100644 --- a/djangocms_snippet/models.py +++ b/djangocms_snippet/models.py @@ -1,21 +1,15 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - from django.conf import settings from django.db import models -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from cms.models import CMSPlugin -from six import python_2_unicode_compatible - # Search is enabled by default to keep backwards compatibility. SEARCH_ENABLED = getattr(settings, 'DJANGOCMS_SNIPPET_SEARCH', False) # Stores the actual data -@python_2_unicode_compatible class Snippet(models.Model): """ A snippet of HTML or a Django template @@ -57,7 +51,6 @@ class Meta: # Plugin model - just a pointer to Snippet -@python_2_unicode_compatible class SnippetPtr(CMSPlugin): # Add an app namespace to related_name to avoid field name clashes # with any other plugins that have a field with the same name as the diff --git a/djangocms_snippet/templatetags/__init__.py b/djangocms_snippet/templatetags/__init__.py index 40a96afc..e69de29b 100644 --- a/djangocms_snippet/templatetags/__init__.py +++ b/djangocms_snippet/templatetags/__init__.py @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/djangocms_snippet/templatetags/snippet_tags.py b/djangocms_snippet/templatetags/snippet_tags.py index 33a063e1..8a87fddb 100644 --- a/djangocms_snippet/templatetags/snippet_tags.py +++ b/djangocms_snippet/templatetags/snippet_tags.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Snippet template tags """ @@ -7,9 +6,7 @@ from django import template from django.utils.html import escape from django.utils.safestring import mark_safe -from django.utils.translation import ugettext_lazy as _ - -from six import string_types +from django.utils.translation import gettext_lazy as _ from djangocms_snippet.models import Snippet @@ -67,7 +64,7 @@ def render(self, context): snippet_instance = self.snippet_id_varname.resolve(context) # Assume this is slug with exceptionless(self.parse_until): - if isinstance(snippet_instance, string_types): + if isinstance(snippet_instance, str): snippet_instance = Snippet.objects.get(slug=snippet_instance) # Assume this is an id elif isinstance(snippet_instance, int): # pragma: no cover diff --git a/setup.py b/setup.py index 2218853c..df1d6b97 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,11 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- from setuptools import find_packages, setup from djangocms_snippet import __version__ REQUIREMENTS = [ - 'django-cms>=3.4.5', + 'django-cms>=3.7', ] @@ -17,22 +16,18 @@ 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'Framework :: Django', - 'Framework :: Django :: 1.11', - 'Framework :: Django :: 2.1', 'Framework :: Django :: 2.2', + 'Framework :: Django :: 3.0', + 'Framework :: Django :: 3.1', 'Framework :: Django CMS', - 'Framework :: Django CMS :: 3.4', - 'Framework :: Django CMS :: 3.5', - 'Framework :: Django CMS :: 3.6', 'Framework :: Django CMS :: 3.7', + 'Framework :: Django CMS :: 3.8', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', 'Topic :: Software Development', @@ -46,10 +41,10 @@ author='Divio AG', author_email='info@divio.ch', url='https://github.com/divio/djangocms-snippet', - license='BSD', + license='BSD-3-Clause', description='Adds snippet plugin to django CMS.', long_description=open('README.rst').read(), - packages=find_packages(exclude=['tests']), + packages=find_packages(), include_package_data=True, zip_safe=False, install_requires=REQUIREMENTS, diff --git a/tests/__init__.py b/tests/__init__.py index 40a96afc..e69de29b 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/tests/settings.py b/tests/settings.py index 36198c76..5656cebe 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- HELPER_SETTINGS = { 'INSTALLED_APPS': [ 'tests.utils', diff --git a/tests/test_migrations.py b/tests/test_migrations.py index 071e0799..29c4a94b 100644 --- a/tests/test_migrations.py +++ b/tests/test_migrations.py @@ -1,12 +1,10 @@ -# -*- coding: utf-8 -*- # original from # http://tech.octopus.energy/news/2016/01/21/testing-for-missing-migrations-in-django.html +from io import StringIO + from django.core.management import call_command from django.test import TestCase, override_settings -from six import text_type -from six.moves import StringIO - class MigrationTestCase(TestCase): @@ -23,7 +21,7 @@ def test_for_missing_migrations(self): try: call_command('makemigrations', **options) except SystemExit as e: - status_code = text_type(e) + status_code = str(e) else: # the "no changes" exit code is 0 status_code = '0' diff --git a/tests/test_models.py b/tests/test_models.py index 0a438606..077e0010 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from django.test import TestCase from djangocms_snippet.models import SEARCH_ENABLED, Snippet, SnippetPtr diff --git a/tests/test_plugins.py b/tests/test_plugins.py index cf96a09c..6e4e6767 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from cms.api import add_plugin, create_page from cms.test_utils.testcases import CMSTestCase diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index 19c2a404..b1bb45b5 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from django.core.exceptions import ObjectDoesNotExist from django.template import Context, Template from django.template.exceptions import TemplateSyntaxError diff --git a/tox.ini b/tox.ini index d8f606a3..f6a62fad 100644 --- a/tox.ini +++ b/tox.ini @@ -2,9 +2,9 @@ envlist = flake8 isort - py{27,34,35,36}-dj111-cms{34,35,36} - py{27,35,36}-dj111-cms37 - py{35,36,37}-dj{21,22}-cms{36,37} + py{35,36,37,38}-dj{22}-cms{37,38} + py{36,37,38}-dj{30}-cms{37,38} + py{36,37,38}-dj{31}-cms{38} skip_missing_interpreters=True @@ -40,14 +40,11 @@ known_django = django [testenv] deps = -r{toxinidir}/tests/requirements.txt - dj111: Django>=1.11,<2.0 - dj111: django-formtools>=2.0,<2.1 - dj21: Django>=2.1,<2.2 dj22: Django>=2.2,<3.0 - cms34: django-cms>=3.4,<3.5 - cms35: django-cms>=3.5,<3.6 - cms36: django-cms>=3.6,<3.7 + dj30: Django>=3.0,<3.1 + dj31: Django>=3.1,<3.2 cms37: django-cms>=3.7,<3.8 + cms38: django-cms>=3.8,<3.9 commands = {envpython} --version {env:COMMAND:coverage} erase