diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6ec9163..b08ac52 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,10 @@ Changelog ========= +**1.5 (June 28, 2018)** + +* Improved support for Django 1.11, with initial support for 2.0 + **1.4 (June 8, 2017)** * New: localization for messages in admin. Russian locale available diff --git a/Makefile b/Makefile index 6f563f4..2d46ec4 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,3 @@ test: - DJANGO_SETTINGS_MODULE=locking.tests.settings django-admin.py collectstatic --link --noinput - DJANGO_SETTINGS_MODULE=locking.tests.settings django-admin.py test locking + DJANGO_SETTINGS_MODULE=tests.settings django-admin.py collectstatic --link --noinput + DJANGO_SETTINGS_MODULE=tests.settings django-admin.py test tests diff --git a/README.md b/README.md index 7ba7b07..59a2da2 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Prevents users from overwriting each others changes in Django. Django Admin Locking is tested in the following environments * Python (2.7, 3.4) -* Django (1.8, 1.9, 1.10) +* Django (1.8, 1.9, 1.10, 1.11) ## Installation diff --git a/locking/models.py b/locking/models.py index 09102a2..3679cf6 100644 --- a/locking/models.py +++ b/locking/models.py @@ -80,9 +80,10 @@ def get_queryset(self): class Lock(models.Model): id = models.CharField(max_length=15, primary_key=True) - locked_by = models.ForeignKey(getattr(settings, 'AUTH_USER_MODEL', 'auth.User')) + locked_by = models.ForeignKey(getattr(settings, 'AUTH_USER_MODEL', 'auth.User'), + on_delete=models.CASCADE) date_expires = models.DateTimeField() - content_type = models.ForeignKey(ContentType) + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') diff --git a/locking/static/locking/js/locking.admin.js b/locking/static/locking/js/locking.admin.js index 02c1b1e..6949804 100644 --- a/locking/static/locking/js/locking.admin.js +++ b/locking/static/locking/js/locking.admin.js @@ -26,27 +26,29 @@ $('.locking-status.locked').removeClass('locked').removeAttr('title'); for (var i = 0; i < data.length; i++) { user = data[i]['locked_by']; - if (user['username'] === self.currentUser) { - lockedMessage = self.lockedByMeText; - lockedClass = "editing"; - } else { - name = user['first_name'] + ' ' + user['last_name']; - if (name === ' ') { - name = user['username']; + if (user) { + if (user['username'] === self.currentUser) { + lockedMessage = self.lockedByMeText; + lockedClass = "editing"; + } else { + name = user['first_name'] + ' ' + user['last_name']; + if (name === ' ') { + name = user['username']; + } + lockedMessage = self.lockedByUserText + ' ' + name; + if (user['email']){ + lockedMessage += ' (' + user['email'] + ')'; + } + lockedClass = "locked"; } - lockedMessage = self.lockedByUserText + ' ' + name; - if (user['email']){ - lockedMessage += ' (' + user['email'] + ')'; - } - lockedClass = "locked"; - } - $('#locking-' + data[i]['object_id']) - .removeClass('locked editing') - .addClass(lockedClass) - .attr('title', lockedMessage) - .click(function () { - locking.cookies.set(self.cookieName, '1', 60 * 1000); - }); + $('#locking-' + data[i]['object_id']) + .removeClass('locked editing') + .addClass(lockedClass) + .attr('title', lockedMessage) + .click(function () { + locking.cookies.set(self.cookieName, '1', 60 * 1000); + }); + }; } }}); }; diff --git a/setup.py b/setup.py index bd27c31..c8363a8 100644 --- a/setup.py +++ b/setup.py @@ -2,9 +2,9 @@ setup( name='django-admin-locking', - version='1.4', + version='1.5', url='https://github.com/joshmaker/django-admin-locking/', - download_url='https://github.com/joshmaker/django-admin-locking/tarball/v1.4', + download_url='https://github.com/joshmaker/django-admin-locking/tarball/v1.5', license='BSD', description='Prevents users from overwriting each others changes in Django.', author='Josh West', diff --git a/tests/settings.py b/tests/settings.py index 58dec0c..12ec004 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -39,7 +39,7 @@ MEDIA_URL = '/media/' # Avoids https://code.djangoproject.com/ticket/21451 -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', @@ -47,6 +47,7 @@ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) +MIDDLEWARE_CLASSES = MIDDLEWARE ROOT_URLCONF = 'tests.urls'