From 8920f8cbfcb73e63faf0784c9760295de79c50b9 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 11 Oct 2016 09:48:20 +0200 Subject: [PATCH 1/9] add django 1.10 to travis config --- .travis.yml | 8 ++++++++ tox.ini | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ee80267..5b34107 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,9 @@ env: - TOXENV=py27-d19-pg - TOXENV=py27-d19-sqlite - TOXENV=py27-d19-mysql + - TOXENV=py27-d110-pg + - TOXENV=py27-d110-sqlite + - TOXENV=py27-d110-mysql - TOXENV=py33-d18-pg - TOXENV=py33-d18-sqlite @@ -31,11 +34,16 @@ env: - TOXENV=py35-d18-sqlite - TOXENV=py35-d19-pg - TOXENV=py35-d19-sqlite + - TOXENV=py35-d110-pg + - TOXENV=py35-d110-sqlite - TOXENV=pypy-d18-pg - TOXENV=pypy-d18-sqlite - TOXENV=pypy-d19-pg - TOXENV=pypy-d19-sqlite + - TOXENV=pypy-d110-pg + - TOXENV=pypy-d110-sqlite + install: diff --git a/tox.ini b/tox.ini index 1258e35..1351b6e 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] envlist = py{27}-d{18,19,110}-{pg,sqlite,mysql}, - py{34,35}-d{18,19}-{pg,sqlite} - pypy-d{18,19}-{pg,sqlite} + py{34,35}-d{18,19,110}-{pg,sqlite} + pypy-d{18,19,110}-{pg,sqlite} [pytest] python_paths=./tests/demoapp/ @@ -39,7 +39,7 @@ setenv = deps= py{27,33,34,35}-{pg}: psycopg2>=2.6.1 - pypy-d{18,19}-{pg}: psycopg2cffi + pypy-d{18,19,110}-{pg}: psycopg2cffi mysql: mysqlclient @@ -50,7 +50,7 @@ deps= d19: django-reversion==1.10 d110: django-reversion==1.10 - d110: django>=1.10.dev,<1.11 + d110: django>=1.10,<1.11 -rsrc/requirements/testing.pip From b83b5a3d4fa60ae670070d2adaaa75ce1af7bdf3 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 17 Oct 2016 21:33:42 +0200 Subject: [PATCH 2/9] restores and fixes some tests skipped in django 1.10 --- src/concurrency/middleware.py | 7 +++++ src/requirements/develop.pip | 1 - src/requirements/testing.pip | 16 ++++++----- tests/demoapp/demo/base.py | 2 ++ tests/demoapp/demo/settings.py | 42 +++++++++++++++++++-------- tests/test_admin_actions.py | 1 - tests/test_admin_list_editable.py | 3 +- tests/test_conditional.py | 4 +-- tests/test_middleware.py | 47 ++++++++++++++++++------------- tox.ini | 7 ++--- 10 files changed, 81 insertions(+), 49 deletions(-) diff --git a/src/concurrency/middleware.py b/src/concurrency/middleware.py index 4d019ac..c793d9d 100644 --- a/src/concurrency/middleware.py +++ b/src/concurrency/middleware.py @@ -14,6 +14,13 @@ class ConcurrencyMiddleware(object): """ + def __init__(self, get_response=None): + self.get_response = get_response + + def __call__(self, request): + response = self.get_response(request) + return response + def process_exception(self, request, exception): if isinstance(exception, RecordModifiedError): got_request_exception.send(sender=self, request=request) diff --git a/src/requirements/develop.pip b/src/requirements/develop.pip index 98a6885..c64164e 100644 --- a/src/requirements/develop.pip +++ b/src/requirements/develop.pip @@ -1,4 +1,3 @@ -autopep8 coverage django_extensions flake8 diff --git a/src/requirements/testing.pip b/src/requirements/testing.pip index a7b9822..6204e0a 100644 --- a/src/requirements/testing.pip +++ b/src/requirements/testing.pip @@ -1,11 +1,13 @@ -django-webtest>=1.7.5 -mock>=1.0.1 check-manifest==0.30 +django-webtest>=1.8.0 +mock>=1.0.1 pytest-cache>=1.0 pytest-cov>=1.6 -pytest-django>=2.8 +pytest-django>=3.0.0 pytest-echo>=1.3 -pytest-pythonpath -pytest>=2.8 -tox>=2.3 -WebTest>=2.0.11 +pytest-pythonpath>=0.7.1 +pytest>=3.0.3 +pdbpp +readline +tox>=2.4.1 +WebTest>=2.0.23 diff --git a/tests/demoapp/demo/base.py b/tests/demoapp/demo/base.py index cf2bd46..d259bb9 100644 --- a/tests/demoapp/demo/base.py +++ b/tests/demoapp/demo/base.py @@ -31,6 +31,8 @@ def setUp(self): last_login=timezone.now(), email='sax@example.com', username='sax') + # self.user.set_password('123') + # self.user.save() admin_register_models() diff --git a/tests/demoapp/demo/settings.py b/tests/demoapp/demo/settings.py index ed05743..7f95ffa 100644 --- a/tests/demoapp/demo/settings.py +++ b/tests/demoapp/demo/settings.py @@ -10,7 +10,6 @@ except ImportError: pass - DEBUG = True STATIC_URL = '/static/' @@ -32,35 +31,54 @@ 'demo' ] - MIGRATION_MODULES = { 'demo': 'demo.migrations', 'auth': 'demo.auth_migrations', } -MIDDLEWARE_CLASSES = [ - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', -] - if django.VERSION[1] >= 10: + MIDDLEWARE_CLASSES = [] + MIDDLEWARE = [ + # 'concurrency.middleware.ConcurrencyMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + ] + TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { + 'context_processors': [ + 'django.contrib.auth.context_processors.auth', + 'django.template.context_processors.debug', + 'django.template.context_processors.i18n', + 'django.template.context_processors.media', + 'django.template.context_processors.static', + 'django.template.context_processors.tz', + 'django.contrib.messages.context_processors.messages', + ], # ... some options here ... }, }, ] else: TEMPLATE_DIRS = ['demo/templates'] + MIDDLEWARE_CLASSES = [ + # 'concurrency.middleware.ConcurrencyMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + ] LOGGING = { 'version': 1, diff --git a/tests/test_admin_actions.py b/tests/test_admin_actions.py index fa72ec5..c68bbd7 100644 --- a/tests/test_admin_actions.py +++ b/tests/test_admin_actions.py @@ -7,7 +7,6 @@ from demo.util import unique_id -@pytest.mark.xfail("django.VERSION[:2] == (1, 10)", strict=True) class TestAdminActions(AdminTestCase): def _create_conflict(self, pk): u = SimpleConcurrentModel.objects.get(pk=pk) diff --git a/tests/test_admin_list_editable.py b/tests/test_admin_list_editable.py index b9f1b3a..0c3df53 100644 --- a/tests/test_admin_list_editable.py +++ b/tests/test_admin_list_editable.py @@ -5,6 +5,7 @@ from django.contrib.admin.sites import site from django.contrib.contenttypes.models import ContentType from django.db import transaction +from django.test import modify_settings from django.utils.encoding import force_text import pytest @@ -18,7 +19,7 @@ from concurrency.exceptions import RecordModifiedError -@pytest.mark.xfail("django.VERSION[:2] == (1, 10)", strict=True) +# @pytest.mark.xfail(django.VERSION[:2] == (1, 10), reason="Django 1.10") class TestListEditable(AdminTestCase): TARGET = ListEditableConcurrentModel diff --git a/tests/test_conditional.py b/tests/test_conditional.py index 0381065..89aaa18 100644 --- a/tests/test_conditional.py +++ b/tests/test_conditional.py @@ -113,12 +113,12 @@ def test_conflict_no_meta(instance_no_meta): @pytest.mark.django_db() def test_self_relations(): a = ConditionalVersionModelSelfRelation.objects.create(name='a') - b = ConditionalVersionModelSelfRelation.objects.create(name='b') + ConditionalVersionModelSelfRelation.objects.create(name='b') r = ThroughRelation.objects.create(left=a, right=a) r.save() a1 = ConditionalVersionModelSelfRelation.objects.get(pk=a.pk) - a1.name='a' + a1.name = 'a' a1.save() diff --git a/tests/test_middleware.py b/tests/test_middleware.py index 200658c..3716ba3 100644 --- a/tests/test_middleware.py +++ b/tests/test_middleware.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- +import django from django.conf import settings from django.contrib.admin.sites import site from django.core.urlresolvers import reverse from django.http import HttpRequest -from django.test.utils import override_settings +from django.test.utils import override_settings, modify_settings import mock import pytest @@ -37,7 +38,7 @@ def test_middleware(): assert r.status_code == 409 -class ConcurrencyMiddlewareTest(AdminTestCase): +class ConcurrencyMiddlewareTest1(AdminTestCase): def _get_request(self, path): request = HttpRequest() request.META = { @@ -60,37 +61,43 @@ def test_process_exception(self): r = ConcurrencyMiddleware().process_exception(request, RecordModifiedError(target=m)) self.assertEqual(r.status_code, 409) - @pytest.mark.xfail("django.VERSION[:2] == (1, 10)", strict=True) + +class ConcurrencyMiddlewareTest2(AdminTestCase): + + @property + def settings_middleware(self): + return getattr(settings, self.middleware_setting_name) + ['concurrency.middleware.ConcurrencyMiddleware'] + + @settings_middleware.setter + def settings_middleware(self, value): + setattr(settings, self.middleware_setting_name, value) + def test_in_admin(self): id = next(unique_id) - - middlewares = list(settings.MIDDLEWARE_CLASSES) + ['concurrency.middleware.ConcurrencyMiddleware'] model_admin = site._registry[SimpleConcurrentModel] with attributes((model_admin.__class__, 'list_editable_policy', CONCURRENCY_LIST_EDITABLE_POLICY_ABORT_ALL), (ConcurrentModelAdmin, 'form', DELETE_ATTRIBUTE)): - with self.settings(MIDDLEWARE_CLASSES=middlewares): - - saved, __ = SimpleConcurrentModel.objects.get_or_create(pk=id) + saved, __ = SimpleConcurrentModel.objects.get_or_create(pk=id) - url = reverse('admin:demo_simpleconcurrentmodel_change', args=[saved.pk]) - res = self.app.get(url, user='sax') - form = res.form + url = reverse('admin:demo_simpleconcurrentmodel_change', args=[saved.pk]) + res = self.app.get(url, user=self.user.username) + form = res.form - saved.save() # create conflict here + saved.save() # create conflict here - res = form.submit(expect_errors=True) + res = form.submit(expect_errors=True) - self.assertEqual(res.status_code, 409) + self.assertEqual(res.status_code, 409) - target = res.context['target'] - self.assertIn('target', res.context) - self.assertIn('saved', res.context) + target = res.context['target'] + self.assertIn('target', res.context) + self.assertIn('saved', res.context) - self.assertEqual(res.context['target'].version, target.version) - self.assertEqual(res.context['saved'].version, saved.version) - self.assertEqual(res.context['request_path'], url) + self.assertEqual(res.context['target'].version, target.version) + self.assertEqual(res.context['saved'].version, saved.version) + self.assertEqual(res.context['request_path'], url) # # class TestFullStack(DjangoAdminTestCase): diff --git a/tox.ini b/tox.ini index 1351b6e..e5ca60b 100644 --- a/tox.ini +++ b/tox.ini @@ -22,12 +22,12 @@ markers = [testenv] install_command=pip install {opts} {packages} -pip_pre = True passenv = TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH PYTHONDONTWRITEBYTECODE whitelist_externals = /usr/local/bin/psql /bin/sh + /usr/local/bin/mysql /usr/local/mysql/bin/mysql /usr/bin/psql changedir={toxinidir} @@ -58,12 +58,9 @@ commands = mysql: - mysql -u root -e 'CREATE DATABASE IF NOT EXISTS concurrency;' pg: - psql -c 'DROP DATABASE "concurrency";' -U postgres pg: - psql -c 'CREATE DATABASE "concurrency";' -U postgres - {posargs:py.test tests -rw --create-db} + {posargs:py.test tests -rw -v --create-db} -[testenv:d110] -pip_pre=true - [testenv:clean] commands = mysql: - mysql -u root -e 'DROP DATABASE IF EXISTS concurrency;' From 62dd7cf002d3c6897357e0b929922b5b7df9729f Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 18 Oct 2016 08:43:45 +0200 Subject: [PATCH 3/9] updates changes add South FAQ --- CHANGES | 5 +++++ docs/faq.rst | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/CHANGES b/CHANGES index fcd76b8..e41b807 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +Release 1.4 (dev) +----------------- +* + + Release 1.3.2 (10 Sep 2016) ------------------------- * fixes bug in ConditionalVersionField that produced 'maximum recursion error' when a model had a ManyToManyField with a field to same model (self-relation) diff --git a/docs/faq.rst b/docs/faq.rst index 99cf04a..d2a12f4 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -9,8 +9,23 @@ FAQ .. contents:: :local: +.. _south: + +South support ? +--------------- +South support has been removed after version 1.0 +when Django <1.6 support has been removed as well. + +If needed add these lines to your ``models.py``:: + + + from south.modelsinspector import add_introspection_rules + add_introspection_rules([], ["^concurrency\.fields\.IntegerVersionField"]) + + .. _update_fields: + How is managed `update_fields` ------------------------------ From 605e87943fc986134940ba7f68e1adad349d4cc8 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 2 May 2017 20:04:51 +0200 Subject: [PATCH 4/9] fixes django 1.11 compat issue --- .gitignore | 1 + CHANGES | 2 +- README.rst | 2 +- src/concurrency/config.py | 5 ++++- src/concurrency/middleware.py | 7 ++++++- src/concurrency/views.py | 8 ++++---- src/requirements/develop.pip | 2 +- src/requirements/testing.pip | 2 ++ tests/demoapp/demo/models.py | 9 ++++++--- tests/demoapp/demo/urls.py | 2 +- tests/test_admin_edit.py | 8 ++++++-- tests/test_middleware.py | 9 +++++---- tox.ini | 20 +++++++++++++++----- 13 files changed, 53 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 77895ef..2f54555 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ __pycache__ *.pyc *.egg-info *.sqlite +.testmondata diff --git a/CHANGES b/CHANGES index e41b807..8577f9b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,6 @@ Release 1.4 (dev) ----------------- -* +* django 1.11 compatibility Release 1.3.2 (10 Sep 2016) diff --git a/README.rst b/README.rst index b2ec4d8..8a8bf2b 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ Django Concurrency django-concurrency is an optimistic lock [1]_ implementation for Django. -Supported Django versions: 1.6.x, 1.7.x, 1.8.x, 1.9. +Supported Django versions: 1.8.x, 1.9.x, 1.10.x., 1.11.x It prevents users from doing concurrent editing in Django both from UI and from a django command. diff --git a/src/concurrency/config.py b/src/concurrency/config.py index 1e452c2..6691cec 100644 --- a/src/concurrency/config.py +++ b/src/concurrency/config.py @@ -1,7 +1,10 @@ from __future__ import absolute_import, unicode_literals from django.core.exceptions import ImproperlyConfigured -from django.core.urlresolvers import get_callable +try: + from django.core.urlresolvers import get_callable +except ImportError: + from django.urls.utils import get_callable from django.test.signals import setting_changed from django.utils import six diff --git a/src/concurrency/middleware.py b/src/concurrency/middleware.py index c793d9d..ca26742 100644 --- a/src/concurrency/middleware.py +++ b/src/concurrency/middleware.py @@ -2,11 +2,16 @@ from __future__ import absolute_import, unicode_literals from django.core.signals import got_request_exception -from django.core.urlresolvers import get_callable from concurrency.config import conf from concurrency.exceptions import RecordModifiedError +try: + from django.core.urlresolvers import get_callable +except ImportError: + from django.urls.utils import get_callable + + class ConcurrencyMiddleware(object): """ Intercept :ref:`RecordModifiedError` and invoke a callable defined in diff --git a/src/concurrency/views.py b/src/concurrency/views.py index eff3772..f053b2c 100644 --- a/src/concurrency/views.py +++ b/src/concurrency/views.py @@ -4,7 +4,6 @@ from django.http import HttpResponse from django.template import loader from django.template.base import Template -from django.template.context import RequestContext from django.utils.translation import ugettext as _ from concurrency.compat import TemplateDoesNotExist @@ -40,7 +39,8 @@ def conflict(request, target=None, template_name='409.html'): saved = target.__class__._default_manager.get(pk=target.pk) except target.__class__.DoesNotExist: saved = None - ctx = RequestContext(request, {'target': target, - 'saved': saved, - 'request_path': request.path}) + ctx = {'target': target, + 'saved': saved, + 'request_path': request.path} + return ConflictResponse(template.render(ctx)) diff --git a/src/requirements/develop.pip b/src/requirements/develop.pip index c64164e..db62570 100644 --- a/src/requirements/develop.pip +++ b/src/requirements/develop.pip @@ -1,7 +1,7 @@ coverage django_extensions flake8 -ipython +ipython<6.0 pdbpp psycopg2 sphinx diff --git a/src/requirements/testing.pip b/src/requirements/testing.pip index 6204e0a..955a6ac 100644 --- a/src/requirements/testing.pip +++ b/src/requirements/testing.pip @@ -7,6 +7,8 @@ pytest-django>=3.0.0 pytest-echo>=1.3 pytest-pythonpath>=0.7.1 pytest>=3.0.3 +pytest-watch +pytest-testmon pdbpp readline tox>=2.4.1 diff --git a/tests/demoapp/demo/models.py b/tests/demoapp/demo/models.py index 757997e..8e1b6e1 100644 --- a/tests/demoapp/demo/models.py +++ b/tests/demoapp/demo/models.py @@ -209,7 +209,7 @@ class ConditionalVersionModel(models.Model): field1 = models.CharField(max_length=30, blank=True, null=True, unique=True) field2 = models.CharField(max_length=30, blank=True, null=True, unique=True) field3 = models.CharField(max_length=30, blank=True, null=True, unique=True) - user = models.ForeignKey(User, null=True) + user = models.ForeignKey(User, null=True, on_delete=models.CASCADE) class Meta: app_label = 'demo' @@ -224,7 +224,8 @@ class Anything(models.Model): ConditionalVersionModelWithoutMeta instances. """ name = models.CharField(max_length=10) - a_relation = models.ForeignKey('demo.ConditionalVersionModelWithoutMeta') + a_relation = models.ForeignKey('demo.ConditionalVersionModelWithoutMeta', + on_delete=models.CASCADE) class Meta: app_label = 'demo' @@ -238,7 +239,7 @@ class ConditionalVersionModelWithoutMeta(models.Model): field1 = models.CharField(max_length=30, blank=True, null=True, unique=True) field2 = models.CharField(max_length=30, blank=True, null=True, unique=True) field3 = models.CharField(max_length=30, blank=True, null=True, unique=True) - user = models.ForeignKey(User, null=True) + user = models.ForeignKey(User, null=True, on_delete=models.CASCADE) anythings = models.ManyToManyField(Anything) class Meta: @@ -248,8 +249,10 @@ class Meta: class ThroughRelation(models.Model): version = ConditionalVersionField() left = models.ForeignKey('demo.ConditionalVersionModelSelfRelation', + on_delete=models.CASCADE, related_name='+') right = models.ForeignKey('demo.ConditionalVersionModelSelfRelation', + on_delete=models.CASCADE, related_name='+') class Meta: diff --git a/tests/demoapp/demo/urls.py b/tests/demoapp/demo/urls.py index 0d64f51..e3aa377 100644 --- a/tests/demoapp/demo/urls.py +++ b/tests/demoapp/demo/urls.py @@ -17,5 +17,5 @@ UpdateView.as_view(model=SimpleConcurrentModel), name='concurrent-edit'), url(r'^admin/', - include(admin.site.urls)) + admin.site.urls) ) diff --git a/tests/test_admin_edit.py b/tests/test_admin_edit.py index 60747b9..3eaf81d 100644 --- a/tests/test_admin_edit.py +++ b/tests/test_admin_edit.py @@ -1,13 +1,17 @@ -from django.core.urlresolvers import reverse +import pytest from django.utils.translation import ugettext as _ -import pytest from demo.base import SENTINEL, AdminTestCase from demo.models import SimpleConcurrentModel from demo.util import nextname from concurrency.forms import VersionFieldSigner +try: + from django.core.urlresolvers import reverse +except ImportError: + from django.urls import reverse + @pytest.mark.django_db @pytest.mark.admin diff --git a/tests/test_middleware.py b/tests/test_middleware.py index 3716ba3..f1355e5 100644 --- a/tests/test_middleware.py +++ b/tests/test_middleware.py @@ -1,13 +1,10 @@ # -*- coding: utf-8 -*- -import django from django.conf import settings from django.contrib.admin.sites import site -from django.core.urlresolvers import reverse from django.http import HttpRequest -from django.test.utils import override_settings, modify_settings +from django.test.utils import override_settings import mock -import pytest from demo.base import AdminTestCase from demo.models import SimpleConcurrentModel from demo.util import DELETE_ATTRIBUTE, attributes, unique_id @@ -17,6 +14,10 @@ from concurrency.exceptions import RecordModifiedError from concurrency.middleware import ConcurrencyMiddleware +try: + from django.core.urlresolvers import reverse +except ImportError: + from django.urls import reverse def _get_request(path): request = HttpRequest() diff --git a/tox.ini b/tox.ini index e5ca60b..16c8615 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] -envlist = py{27}-d{18,19,110}-{pg,sqlite,mysql}, - py{34,35}-d{18,19,110}-{pg,sqlite} - pypy-d{18,19,110}-{pg,sqlite} +envlist = py{27}-d{18,19,110,111}-{pg,sqlite,mysql}, + py{34,35}-d{18,19,110,111}-{pg,sqlite} + pypy-d{18,19,110,111}-{pg,sqlite} [pytest] python_paths=./tests/demoapp/ @@ -47,11 +47,21 @@ deps= d18: django-reversion==1.9.3 d19: django>=1.9,<1.10 - d19: django-reversion==1.10 + d19: django-reversion>=1.10 - d110: django-reversion==1.10 + d110: django-reversion>=1.10 d110: django>=1.10,<1.11 + d111: django-reversion>=1.10 + d111: django>=1.11,<1.12 + + d20: django-reversion>=2.0.8 + d20: django>=2.0dev,<2.1 + + trunk: django-reversion>=2.0.8 + trunk: git+git://github.com/django/django.git#egg=django + + -rsrc/requirements/testing.pip commands = From 53340b73bf7c2031e35efe34536fc7fb97238677 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 2 May 2017 20:59:12 +0200 Subject: [PATCH 5/9] open 1.4 --- src/concurrency/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/concurrency/__init__.py b/src/concurrency/__init__.py index d06d5e4..ca71f7f 100755 --- a/src/concurrency/__init__.py +++ b/src/concurrency/__init__.py @@ -5,7 +5,7 @@ __author__ = 'sax' default_app_config = 'concurrency.apps.ConcurrencyConfig' -VERSION = __version__ = (1, 3, 2, 'final', 0) +VERSION = __version__ = (1, 4, 0, 'alpha', 0) NAME = 'django-concurrency' From 6f2e11678f87f796f08b8f754fdc8c2520b17bd3 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 2 May 2017 21:00:21 +0200 Subject: [PATCH 6/9] updates CHANGES --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 8577f9b..36878bb 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,7 @@ Release 1.4 (dev) ----------------- -* django 1.11 compatibility - +* Django 1.11 compatibility +* some minor support for Django 2.0 Release 1.3.2 (10 Sep 2016) ------------------------- From 281ed419cfef8d7fe3ac804cc4243ba23851f163 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 2 May 2017 21:07:00 +0200 Subject: [PATCH 7/9] fixes travis config --- .travis.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5b34107..467d96a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,9 @@ env: - TOXENV=py27-d110-pg - TOXENV=py27-d110-sqlite - TOXENV=py27-d110-mysql + - TOXENV=py27-d111-pg + - TOXENV=py27-d111-sqlite + - TOXENV=py27-d111-mysql - TOXENV=py33-d18-pg - TOXENV=py33-d18-sqlite @@ -36,11 +39,14 @@ env: - TOXENV=py35-d19-sqlite - TOXENV=py35-d110-pg - TOXENV=py35-d110-sqlite + - TOXENV=py35-d111-pg + - TOXENV=py35-d111-sqlite - TOXENV=pypy-d18-pg - TOXENV=pypy-d18-sqlite - TOXENV=pypy-d19-pg - TOXENV=pypy-d19-sqlite + - TOXENV=pypy-d110-pg - TOXENV=pypy-d110-sqlite @@ -50,8 +56,7 @@ install: - pip install tox "coverage<=4.0" python-coveralls>=2.5 coveralls>=0.5 codecov script: - - tox -e $TOXENV -- py.test tests -v --capture=no --cov=concurrency \ - --cov-report=xml --cov-config=tests/.coveragerc + - tox -e $TOXENV -- py.test tests -v --capture=no --cov=concurrency --cov-report=xml --cov-config=tests/.coveragerc before_success: - coverage erase From 186984e6522005c74def4d0a72a4087fe97ab345 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 2 May 2017 21:46:06 +0200 Subject: [PATCH 8/9] improve django version detection --- src/requirements/testing.pip | 2 +- tests/demoapp/demo/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/requirements/testing.pip b/src/requirements/testing.pip index 955a6ac..56559bf 100644 --- a/src/requirements/testing.pip +++ b/src/requirements/testing.pip @@ -1,5 +1,5 @@ check-manifest==0.30 -django-webtest>=1.8.0 +django-webtest>=1.9.1 mock>=1.0.1 pytest-cache>=1.0 pytest-cov>=1.6 diff --git a/tests/demoapp/demo/settings.py b/tests/demoapp/demo/settings.py index 7f95ffa..6d6d799 100644 --- a/tests/demoapp/demo/settings.py +++ b/tests/demoapp/demo/settings.py @@ -36,7 +36,7 @@ 'auth': 'demo.auth_migrations', } -if django.VERSION[1] >= 10: +if django.VERSION[0] == 2 or django.VERSION[1] >= 10: MIDDLEWARE_CLASSES = [] MIDDLEWARE = [ # 'concurrency.middleware.ConcurrencyMiddleware', From 3f83bb1fe181f39bfc34ef919a62bc580bc81076 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 2 May 2017 22:36:01 +0200 Subject: [PATCH 9/9] bump 1.4 --- docs/conf.py | 2 +- setup.py | 2 ++ src/concurrency/__init__.py | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 8b58a0d..afc0ec6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -87,7 +87,7 @@ version = ".".join(map(str, concurrency.VERSION[0:2])) # The full version, including alpha/beta/rc tags. release = concurrency.get_version() -next_version = '1.4' +next_version = '1.5' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/setup.py b/setup.py index e3f2258..8ab2401 100755 --- a/setup.py +++ b/setup.py @@ -70,6 +70,8 @@ def run_tests(self): 'Programming Language :: Python', 'Framework :: Django :: 1.8', 'Framework :: Django :: 1.9', + 'Framework :: Django :: 1.10', + 'Framework :: Django :: 1.11', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.3', diff --git a/src/concurrency/__init__.py b/src/concurrency/__init__.py index ca71f7f..2a81090 100755 --- a/src/concurrency/__init__.py +++ b/src/concurrency/__init__.py @@ -5,7 +5,7 @@ __author__ = 'sax' default_app_config = 'concurrency.apps.ConcurrencyConfig' -VERSION = __version__ = (1, 4, 0, 'alpha', 0) +VERSION = __version__ = (1, 4, 0, 'final', 0) NAME = 'django-concurrency'