diff --git a/.travis.yml b/.travis.yml index 2b66e04..ec20eef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,10 +2,7 @@ sudo: false language: python python: - 2.7 - - 3.2 - - 3.3 - - 3.4 - - "pypy" + - 3.5 matrix: fast_finish: true install: diff --git a/bootstrap.py b/bootstrap.py index 1b28969..a629566 100644 --- a/bootstrap.py +++ b/bootstrap.py @@ -35,7 +35,7 @@ Simply run this script in a directory containing a buildout.cfg, using the Python that you want bin/buildout to use. -Note that by using --find-links to point to local resources, you can keep +Note that by using --find-links to point to local resources, you can keep this script from going over the network. ''' @@ -56,6 +56,11 @@ "file to be used.")) parser.add_option("-f", "--find-links", help=("Specify a URL to search for buildout releases")) +parser.add_option("--allow-site-packages", + action="store_true", default=False, + help=("Let bootstrap.py use existing site packages")) +parser.add_option("--setuptools-version", + help="use a specific setuptools version") options, args = parser.parse_args() @@ -63,32 +68,42 @@ ###################################################################### # load/install setuptools -to_reload = False try: - import pkg_resources - import setuptools + if options.allow_site_packages: + import setuptools + import pkg_resources + from urllib.request import urlopen except ImportError: - ez = {} - - try: - from urllib.request import urlopen - except ImportError: - from urllib2 import urlopen - - # XXX use a more permanent ez_setup.py URL when available. - exec(urlopen('https://bitbucket.org/pypa/setuptools/raw/0.7.2/ez_setup.py' - ).read(), ez) - setup_args = dict(to_dir=tmpeggs, download_delay=0) - ez['use_setuptools'](**setup_args) - - if to_reload: - reload(pkg_resources) - import pkg_resources - # This does not (always?) update the default working set. We will - # do it. - for path in sys.path: - if path not in pkg_resources.working_set.entries: - pkg_resources.working_set.add_entry(path) + from urllib2 import urlopen + +ez = {} +exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez) + +if not options.allow_site_packages: + # ez_setup imports site, which adds site packages + # this will remove them from the path to ensure that incompatible versions + # of setuptools are not in the path + import site + # inside a virtualenv, there is no 'getsitepackages'. + # We can't remove these reliably + if hasattr(site, 'getsitepackages'): + for sitepackage_path in site.getsitepackages(): + sys.path[:] = [x for x in sys.path if sitepackage_path not in x] + +setup_args = dict(to_dir=tmpeggs, download_delay=0) + +if options.setuptools_version is not None: + setup_args['version'] = options.setuptools_version + +ez['use_setuptools'](**setup_args) +import setuptools +import pkg_resources + +# This does not (always?) update the default working set. We will +# do it. +for path in sys.path: + if path not in pkg_resources.working_set.entries: + pkg_resources.working_set.add_entry(path) ###################################################################### # Install buildout @@ -119,10 +134,15 @@ _final_parts = '*final-', '*final' def _final_version(parsed_version): - for part in parsed_version: - if (part[:1] == '*') and (part not in _final_parts): - return False - return True + try: + return not parsed_version.is_prerelease + except AttributeError: + # Older setuptools + for part in parsed_version: + if (part[:1] == '*') and (part not in _final_parts): + return False + return True + index = setuptools.package_index.PackageIndex( search_path=[setuptools_path]) if find_links: @@ -149,8 +169,7 @@ def _final_version(parsed_version): import subprocess if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0: raise Exception( - "Failed to execute command:\n%s", - repr(cmd)[1:-1]) + "Failed to execute command:\n%s" % repr(cmd)[1:-1]) ###################################################################### # Import and run buildout diff --git a/buildout.cfg b/buildout.cfg index 58f00ba..0c5296b 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -6,6 +6,11 @@ parts = demo evolution develop = . show-picked-versions = true +eggs = django + django-blog-zinnia + pillow + sorl-thumbnail + zinnia-wysiwyg-tinymce extensions = gp.vcsdevelop develop-dir = django-apps-src vcs-update = true @@ -15,15 +20,13 @@ vcs-extend-develop = git+git://github.com/Fantomas42/django-blog-zinnia.git recipe = djangorecipe project = demo_zinnia_tinymce settings = settings -eggs = django - django-blog-zinnia - pillow - sorl-thumbnail - zinnia-wysiwyg-tinymce +eggs = ${buildout:eggs} [flake8] recipe = zc.recipe.egg eggs = flake8 + flake8-import-order + pep8-naming [evolution] recipe = zc.recipe.egg diff --git a/demo_zinnia_tinymce/settings.py b/demo_zinnia_tinymce/settings.py index d0c806b..f488664 100644 --- a/demo_zinnia_tinymce/settings.py +++ b/demo_zinnia_tinymce/settings.py @@ -1,10 +1,9 @@ """Settings for the zinnia-tinymce demo""" import os -gettext = lambda s: s +gettext = lambda s: s # noqa DEBUG = True -TEMPLATE_DEBUG = DEBUG DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3', @@ -49,31 +48,43 @@ ('ca', gettext('Catalan')), ('tr', gettext('Turkish')), ('sv', gettext('Swedish')), + ('is', gettext('Icelandic')), ('hr_HR', gettext('Croatian')), ('pt_BR', gettext('Brazilian Portuguese')), ('fa_IR', gettext('Persian')), ('fi_FI', gettext('Finnish')), - ('zh_CN', gettext('Simplified Chinese')), + ('uk_UA', gettext('Ukrainian')), + ('zh-hans', gettext('Simplified Chinese')), ) -MIDDLEWARE_CLASSES = ( - 'django.middleware.common.CommonMiddleware', +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', -) + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] ROOT_URLCONF = 'demo_zinnia_tinymce.urls' -TEMPLATE_CONTEXT_PROCESSORS = ( - 'django.contrib.auth.context_processors.auth', - 'django.core.context_processors.i18n', - 'django.core.context_processors.request', - 'django.contrib.messages.context_processors.messages', - 'zinnia.context_processors.version', -) +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.contrib.auth.context_processors.auth', + 'django.template.context_processors.i18n', + 'django.template.context_processors.request', + 'django.contrib.messages.context_processors.messages', + 'zinnia.context_processors.version', + ] + } + } +] INSTALLED_APPS = ( 'django.contrib.auth', diff --git a/demo_zinnia_tinymce/urls.py b/demo_zinnia_tinymce/urls.py index c2a66a6..c8b5f5b 100644 --- a/demo_zinnia_tinymce/urls.py +++ b/demo_zinnia_tinymce/urls.py @@ -1,20 +1,24 @@ """Urls for the zinnia-tinymce demo""" from django.conf import settings -from django.contrib import admin -from django.conf.urls import url from django.conf.urls import include -from django.conf.urls import patterns +from django.conf.urls import url +from django.contrib import admin +from django.contrib.sitemaps.views import index +from django.contrib.sitemaps.views import sitemap +from django.views.defaults import bad_request +from django.views.defaults import page_not_found +from django.views.defaults import permission_denied +from django.views.defaults import server_error from django.views.generic.base import RedirectView +from django.views.static import serve -from zinnia.sitemaps import TagSitemap -from zinnia.sitemaps import EntrySitemap -from zinnia.sitemaps import CategorySitemap from zinnia.sitemaps import AuthorSitemap +from zinnia.sitemaps import CategorySitemap +from zinnia.sitemaps import EntrySitemap +from zinnia.sitemaps import TagSitemap -admin.autodiscover() -urlpatterns = patterns( - '', +urlpatterns = [ url(r'^$', RedirectView.as_view(url='/blog/', permanent=True)), url(r'^blog/', include('zinnia.urls', namespace='zinnia')), url(r'^comments/', include('django_comments.urls')), @@ -22,7 +26,7 @@ url(r'^tinymce/zinnia/', include('zinnia_tinymce.urls')), url(r'^i18n/', include('django.conf.urls.i18n')), url(r'^admin/', include(admin.site.urls)), -) +] sitemaps = { 'tags': TagSitemap, @@ -31,25 +35,24 @@ 'categories': CategorySitemap } -urlpatterns += patterns( - 'django.contrib.sitemaps.views', - url(r'^sitemap.xml$', 'index', +urlpatterns += [ + url(r'^sitemap.xml$', + index, {'sitemaps': sitemaps}), - url(r'^sitemap-(?P
.+)\.xml$', 'sitemap', + url(r'^sitemap-(?P
.+)\.xml$', + sitemap, {'sitemaps': sitemaps}), -) +] -urlpatterns += patterns( - '', - url(r'^400/$', 'django.views.defaults.bad_request'), - url(r'^403/$', 'django.views.defaults.permission_denied'), - url(r'^404/$', 'django.views.defaults.page_not_found'), - url(r'^500/$', 'django.views.defaults.server_error'), -) +urlpatterns += [ + url(r'^400/$', bad_request), + url(r'^403/$', permission_denied), + url(r'^404/$', page_not_found), + url(r'^500/$', server_error), +] if settings.DEBUG: - urlpatterns += patterns( - '', - url(r'^media/(?P.*)$', 'django.views.static.serve', + urlpatterns += [ + url(r'^media/(?P.*)$', serve, {'document_root': settings.MEDIA_ROOT}) - ) + ] diff --git a/setup.py b/setup.py index f418dca..d5c9507 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ """Setup script of zinnia-wysiwyg-tinymce""" -from setuptools import setup from setuptools import find_packages +from setuptools import setup import zinnia_tinymce @@ -32,6 +32,6 @@ license=zinnia_tinymce.__license__, include_package_data=True, zip_safe=False, - install_requires=['django-tinymce', + install_requires=['django-tinymce<=2.2.0', 'sorl-thumbnail'] ) diff --git a/versions.cfg b/versions.cfg index 8b577a0..f579d7a 100644 --- a/versions.cfg +++ b/versions.cfg @@ -1,25 +1,28 @@ [versions] -beautifulsoup4 = 4.4.1 -buildout-versions-checker = 1.9.2 -django = 1.8.6 -django-contrib-comments = 1.6.1 -django-mptt = 0.7.4 -django-tagging = 0.4 -django-tinymce = 2.0.5 -django-xmlrpc = 0.1.5 -djangorecipe = 2.1.2 -flake8 = 2.5.0 -futures = 3.0.3 -gp.vcsdevelop = 2.2.3 -mccabe = 0.3.1 -mots-vides = 2015.5.11 -packaging = 15.3 -pep8 = 1.5.7 -pillow = 3.0.0 -pyflakes = 1.0.0 -pyparsing = 2.0.5 -pytz = 2015.7 -six = 1.10.0 -sorl-thumbnail = 12.3 -zc.buildout = 2.4.7 -zc.recipe.egg = 2.0.3 +beautifulsoup4 = 4.5.3 +buildout-versions-checker = 1.9.4 +configparser = 3.5.0 +django = 1.10.6 +django-contrib-comments = 1.8.0 +django-mptt = 0.8.7 +django-tagging = 0.4.5 +django-tinymce = 2.2.0 +django-xmlrpc = 0.1.7 +djangorecipe = 2.2.1 +enum34 = 1.1.6 +flake8 = 3.3.0 +flake8-import-order = 0.12 +futures = 3.0.5 +gp.vcsdevelop = 2.2.3 +mccabe = 0.6.1 +mots-vides = 2015.5.11 +olefile = 0.44 +pep8-naming = 0.4.1 +pillow = 4.0.0 +pycodestyle = 2.3.1 +pyflakes = 1.5.0 +pytz = 2016.10 +regex = 2017.2.8 +sorl-thumbnail = 12.3 +zc.buildout = 2.8.0 +zc.recipe.egg = 2.0.3 diff --git a/zinnia_tinymce/__init__.py b/zinnia_tinymce/__init__.py index 50ebcda..b68e8cc 100644 --- a/zinnia_tinymce/__init__.py +++ b/zinnia_tinymce/__init__.py @@ -1,5 +1,5 @@ """TinyMCE for Django-blog-zinnia""" -__version__ = '1.3' +__version__ = '1.4' __license__ = 'BSD License' __author__ = 'Fantomas42' diff --git a/zinnia_tinymce/admin.py b/zinnia_tinymce/admin.py index c8c23e8..3e35532 100644 --- a/zinnia_tinymce/admin.py +++ b/zinnia_tinymce/admin.py @@ -1,12 +1,12 @@ """EntryAdmin for zinnia-tinymce""" -from django.forms import Media from django.contrib import admin from django.core.urlresolvers import reverse +from django.forms import Media from tinymce.widgets import TinyMCE -from zinnia.models import Entry from zinnia.admin.entry import EntryAdmin +from zinnia.models import Entry from zinnia.settings import ENTRY_BASE_MODEL diff --git a/zinnia_tinymce/migrations/0001_initial.py b/zinnia_tinymce/migrations/0001_initial.py index ed532cb..a1242cb 100644 --- a/zinnia_tinymce/migrations/0001_initial.py +++ b/zinnia_tinymce/migrations/0001_initial.py @@ -1,5 +1,5 @@ -from django.db import models from django.db import migrations +from django.db import models import zinnia_tinymce.models diff --git a/zinnia_tinymce/models.py b/zinnia_tinymce/models.py index 1d452b7..e3df1b3 100644 --- a/zinnia_tinymce/models.py +++ b/zinnia_tinymce/models.py @@ -6,8 +6,8 @@ from django.db import models from django.utils import timezone -from django.utils.translation import ugettext_lazy as _ from django.utils.encoding import python_2_unicode_compatible +from django.utils.translation import ugettext_lazy as _ def upload_path(instance, filename): diff --git a/zinnia_tinymce/tests.py b/zinnia_tinymce/tests.py index d0718dd..14624a2 100644 --- a/zinnia_tinymce/tests.py +++ b/zinnia_tinymce/tests.py @@ -1,7 +1,7 @@ """Test cases for zinnia-tinymce""" -from django.test import TestCase -from django.test import RequestFactory from django.contrib.admin.sites import AdminSite +from django.test import RequestFactory +from django.test import TestCase from zinnia.models.entry import Entry from zinnia.signals import disconnect_entry_signals @@ -30,16 +30,13 @@ def test_medias(self): medias = self.admin.media self.assertEqual( medias._css, {}) - self.assertEqual( - medias._js, - ['/static/admin/js/core.js', - '/static/admin/js/admin/RelatedObjectLookups.js', - '/static/admin/js/jquery.min.js', - '/static/admin/js/jquery.init.js', - '/static/admin/js/actions.min.js', - '/static/admin/js/urlify.js', - '/static/admin/js/prepopulate.min.js', - '/static/tiny_mce/tiny_mce.js', - 'django_tinymce/init_tinymce.js', - '/tinymce/js/textareas/admin/zinnia/entry/', - '/tinymce/zinnia/filebrowser/callback.js']) + jss = [ + 'admin/js/core.js', + 'tiny_mce/tiny_mce.js', + 'django_tinymce/init_tinymce.js', + 'textareas/admin/zinnia/entry/', + 'zinnia/filebrowser/callback.js' + ] + medias_string = '$'.join(medias._js) + for js in jss: + self.assertTrue(js in medias_string) diff --git a/zinnia_tinymce/urls/__init__.py b/zinnia_tinymce/urls/__init__.py index e0fc608..4a58218 100644 --- a/zinnia_tinymce/urls/__init__.py +++ b/zinnia_tinymce/urls/__init__.py @@ -1,11 +1,9 @@ """Defaults urls for the Zinnia TinyMCE""" -from django.conf.urls import url from django.conf.urls import include -from django.conf.urls import patterns +from django.conf.urls import url -urlpatterns = patterns( - '', +urlpatterns = [ url(r'^', include('zinnia_tinymce.urls.links')), url(r'^filebrowser/', include('zinnia_tinymce.urls.filebrowser')), -) +] diff --git a/zinnia_tinymce/urls/filebrowser.py b/zinnia_tinymce/urls/filebrowser.py index 2c7587c..dfdf393 100644 --- a/zinnia_tinymce/urls/filebrowser.py +++ b/zinnia_tinymce/urls/filebrowser.py @@ -2,16 +2,14 @@ URLs for filebrowser in TinyMCE """ from django.conf.urls import url -from django.conf.urls import patterns from django.views.generic import View -from zinnia_tinymce.views import RemoveFileView -from zinnia_tinymce.views import FileBrowserView from zinnia_tinymce.views import FileBrowserCallBackView +from zinnia_tinymce.views import FileBrowserView +from zinnia_tinymce.views import RemoveFileView -urlpatterns = patterns( - '', +urlpatterns = [ url(r'^$', View.as_view(), name='tinymce-filebrowser-dispatch'), @@ -24,4 +22,4 @@ url(r'^(?P\w+)/remove/(?P\d+)/$', RemoveFileView.as_view(), name='tinymce-filebrowser-remove') -) +] diff --git a/zinnia_tinymce/urls/links.py b/zinnia_tinymce/urls/links.py index 17deb7b..9a89791 100644 --- a/zinnia_tinymce/urls/links.py +++ b/zinnia_tinymce/urls/links.py @@ -2,15 +2,13 @@ URLs for list of links in TinyMCE """ from django.conf.urls import url -from django.conf.urls import patterns +from zinnia_tinymce.views import EntryLinksView from zinnia_tinymce.views import FileLinksView from zinnia_tinymce.views import ImageLinksView -from zinnia_tinymce.views import EntryLinksView -urlpatterns = patterns( - '', +urlpatterns = [ url(r'^links.js$', EntryLinksView.as_view(), name='tinymce-external-links'), @@ -20,4 +18,4 @@ url(r'^files.js$', FileLinksView.as_view(), name='tinymce-external-files'), -) +] diff --git a/zinnia_tinymce/views.py b/zinnia_tinymce/views.py index e40ce31..ab10ab0 100644 --- a/zinnia_tinymce/views.py +++ b/zinnia_tinymce/views.py @@ -1,14 +1,14 @@ """ Views for filebrowser in TinyMCE """ +from django.contrib.admin.views.decorators import staff_member_required from django.shortcuts import get_object_or_404 -from django.views.generic.list import ListView -from django.views.generic.edit import CreateView -from django.views.generic.base import RedirectView -from django.views.generic.base import TemplateView from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_control -from django.contrib.admin.views.decorators import staff_member_required +from django.views.generic.base import RedirectView +from django.views.generic.base import TemplateView +from django.views.generic.edit import CreateView +from django.views.generic.list import ListView from zinnia.models import Entry