From 39a8151c767a47bca9fc05a500b0c518d6854225 Mon Sep 17 00:00:00 2001 From: Patrick Altman Date: Sat, 15 Aug 2020 10:02:53 -0500 Subject: [PATCH 1/2] Use Django 3.1 models.JSONField This drops all prior Django support and will take us to v5 for this library. As such, migrations have been reset to a single initial migration which should be fine if upgrading prior versions as there has been no schema change but should alleviate having to have postgres installed just to run migrations. --- .circleci/config.yml | 39 +++++-------------- makemigrations.py | 2 - pinax/eventlog/fields.py | 33 ---------------- pinax/eventlog/migrations/0001_initial.py | 29 +++++++------- .../migrations/0002_auto_20150113_1450.py | 27 ------------- .../migrations/0003_auto_20160111_0208.py | 26 ------------- .../migrations/0004_auto_20191205_2033.py | 19 --------- .../migrations/0005_auto_20200428_2208.py | 20 ---------- pinax/eventlog/models.py | 9 +---- runtests.py | 2 - setup.py | 12 ++---- tox.ini | 11 +++--- 12 files changed, 33 insertions(+), 196 deletions(-) delete mode 100644 pinax/eventlog/fields.py delete mode 100644 pinax/eventlog/migrations/0002_auto_20150113_1450.py delete mode 100644 pinax/eventlog/migrations/0003_auto_20160111_0208.py delete mode 100644 pinax/eventlog/migrations/0004_auto_20191205_2033.py delete mode 100644 pinax/eventlog/migrations/0005_auto_20200428_2208.py diff --git a/.circleci/config.yml b/.circleci/config.yml index 6326b6b..f08a5ce 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -38,51 +38,30 @@ jobs: environment: - TOXENV=checkqa - UPLOAD_COVERAGE=0 - py36dj22: + py36dj31: <<: *common docker: - image: circleci/python:3.6 environment: - TOXENV=py36-dj22 - py36dj30: - <<: *common - docker: - - image: circleci/python:3.6 - environment: - TOXENV=py36-dj30 - py37dj22: - <<: *common - docker: - - image: circleci/python:3.7 - environment: - TOXENV=py37-dj22 - py37dj30: + TOXENV=py36-dj31 + py37dj31: <<: *common docker: - image: circleci/python:3.7 environment: - TOXENV=py37-dj30 - py38dj22: - <<: *common - docker: - - image: circleci/python:3.8 - environment: - TOXENV=py38-dj22 - py38dj30: + TOXENV=py37-dj31 + py38dj31: <<: *common docker: - image: circleci/python:3.8 environment: - TOXENV=py38-dj30 + TOXENV=py38-dj31 workflows: version: 2 test: jobs: - lint - - py36dj22 - - py36dj30 - - py37dj22 - - py37dj30 - - py38dj22 - - py38dj30 + - py36dj31 + - py37dj31 + - py38dj31 diff --git a/makemigrations.py b/makemigrations.py index 0dd016e..0e39506 100644 --- a/makemigrations.py +++ b/makemigrations.py @@ -3,10 +3,8 @@ import sys import django - from django.conf import settings - DEFAULT_SETTINGS = dict( INSTALLED_APPS=[ "django.contrib.auth", diff --git a/pinax/eventlog/fields.py b/pinax/eventlog/fields.py deleted file mode 100644 index bed6f9e..0000000 --- a/pinax/eventlog/fields.py +++ /dev/null @@ -1,33 +0,0 @@ -import json - -from django.db.models import Field - - -class JSONField(Field): - """ - Simple class to make `JSONField` available to sqlite backends. - """ - - def db_type(self, connection): - return "text" - - def from_db_value(self, value, expression, connection): - if value is not None: - return self.to_python(value) - return value - - def to_python(self, value): - if value is not None: - try: - return json.loads(value) - except (TypeError, ValueError): - return value - return value - - def get_prep_value(self, value): - if value is not None: - return str(json.dumps(value)) - return value - - def value_to_string(self, obj): - return self.value_from_object(obj) diff --git a/pinax/eventlog/migrations/0001_initial.py b/pinax/eventlog/migrations/0001_initial.py index a03e904..d6b2751 100644 --- a/pinax/eventlog/migrations/0001_initial.py +++ b/pinax/eventlog/migrations/0001_initial.py @@ -1,20 +1,18 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals +# Generated by Django 3.1 on 2020-08-15 09:54 -import django.db.models.deletion -import django.utils.timezone from django.conf import settings +import django.core.serializers.json from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone -try: - import jsonfield.fields - field = jsonfield.fields.JSONField(default=dict) -except ImportError: - field = models.TextField() class Migration(migrations.Migration): + initial = True + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] @@ -22,15 +20,16 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Log', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now, db_index=True)), - ('action', models.CharField(max_length=50, db_index=True)), - ('extra', field), - ('user', models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=django.db.models.deletion.SET_NULL, null=True)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(db_index=True, default=django.utils.timezone.now)), + ('action', models.CharField(db_index=True, max_length=50)), + ('object_id', models.PositiveIntegerField(null=True)), + ('extra', models.JSONField(encoder=django.core.serializers.json.DjangoJSONEncoder)), + ('content_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='contenttypes.contenttype')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ['-timestamp'], }, - bases=(models.Model,), ), ] diff --git a/pinax/eventlog/migrations/0002_auto_20150113_1450.py b/pinax/eventlog/migrations/0002_auto_20150113_1450.py deleted file mode 100644 index d1a7de5..0000000 --- a/pinax/eventlog/migrations/0002_auto_20150113_1450.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('contenttypes', '0001_initial'), - ('eventlog', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='log', - name='content_type', - field=models.ForeignKey('contenttypes.ContentType', null=True, on_delete=models.SET_NULL), - preserve_default=True, - ), - migrations.AddField( - model_name='log', - name='object_id', - field=models.PositiveIntegerField(null=True), - preserve_default=True, - ), - ] diff --git a/pinax/eventlog/migrations/0003_auto_20160111_0208.py b/pinax/eventlog/migrations/0003_auto_20160111_0208.py deleted file mode 100644 index aa7013c..0000000 --- a/pinax/eventlog/migrations/0003_auto_20160111_0208.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.1 on 2016-01-11 02:08 -from __future__ import unicode_literals - -from django.db import migrations, models - -try: - import jsonfield.fields - field = jsonfield.fields.JSONField() -except ImportError: - field = models.TextField() - - -class Migration(migrations.Migration): - - dependencies = [ - ('eventlog', '0002_auto_20150113_1450'), - ] - - operations = [ - migrations.AlterField( - model_name='log', - name='extra', - field=field, - ), - ] diff --git a/pinax/eventlog/migrations/0004_auto_20191205_2033.py b/pinax/eventlog/migrations/0004_auto_20191205_2033.py deleted file mode 100644 index ebe71b9..0000000 --- a/pinax/eventlog/migrations/0004_auto_20191205_2033.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.0 on 2019-12-05 20:33 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('eventlog', '0003_auto_20160111_0208'), - ] - - operations = [ - migrations.AlterField( - model_name='log', - name='extra', - field=django.contrib.postgres.fields.jsonb.JSONField(), - ), - ] diff --git a/pinax/eventlog/migrations/0005_auto_20200428_2208.py b/pinax/eventlog/migrations/0005_auto_20200428_2208.py deleted file mode 100644 index 36b7897..0000000 --- a/pinax/eventlog/migrations/0005_auto_20200428_2208.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 2.2.12 on 2020-04-28 22:08 - -import django.contrib.postgres.fields.jsonb -import django.core.serializers.json -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('eventlog', '0004_auto_20191205_2033'), - ] - - operations = [ - migrations.AlterField( - model_name='log', - name='extra', - field=django.contrib.postgres.fields.jsonb.JSONField(encoder=django.core.serializers.json.DjangoJSONEncoder), - ), - ] diff --git a/pinax/eventlog/models.py b/pinax/eventlog/models.py index 0265ad4..71586d5 100644 --- a/pinax/eventlog/models.py +++ b/pinax/eventlog/models.py @@ -7,13 +7,6 @@ from .signals import event_logged -if "sqlite" in settings.DATABASES["default"]["ENGINE"]: - from .fields import JSONField -elif "mysql" in settings.DATABASES["default"]["ENGINE"]: - from django_mysql.models import JSONField, Model -else: - from django.contrib.postgres.fields import JSONField - class Log(models.Model): @@ -27,7 +20,7 @@ class Log(models.Model): content_type = models.ForeignKey(ContentType, null=True, on_delete=models.SET_NULL) object_id = models.PositiveIntegerField(null=True) obj = GenericForeignKey("content_type", "object_id") - extra = JSONField(DjangoJSONEncoder) + extra = models.JSONField(encoder=DjangoJSONEncoder) @property def template_fragment_name(self): diff --git a/runtests.py b/runtests.py index 11144d6..fe4ce77 100644 --- a/runtests.py +++ b/runtests.py @@ -3,10 +3,8 @@ import sys import django - from django.conf import settings - DEFAULT_SETTINGS = dict( INSTALLED_APPS=[ "django.contrib.auth", diff --git a/setup.py b/setup.py index 81609b2..9210af2 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import find_packages, setup -VERSION = "4.0.1" +VERSION = "5.0.0" LONG_DESCRIPTION = """ .. image:: http://pinaxproject.com/pinax-design/patches/pinax-eventlog.svg :target: https://pypi.python.org/pypi/pinax-eventlog/ @@ -43,9 +43,7 @@ +-----------------+-----+-----+-----+ | Django / Python | 3.6 | 3.7 | 3.8 | +=================+=====+=====+=====+ -| 2.2 | * | * | * | -+-----------------+-----+-----+-----+ -| 3.0 | * | * | * | +| 3.1 | * | * | * | +-----------------+-----+-----+-----+ """ @@ -67,8 +65,7 @@ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", - "Framework :: Django :: 2.2", - "Framework :: Django :: 3.0", + "Framework :: Django :: 3.1", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", @@ -80,8 +77,7 @@ "Topic :: Software Development :: Libraries :: Python Modules", ], install_requires=[ - "django>=2.2", - "psycopg2-binary>=2.8.4" + "django>=3.1", ], tests_require=[ ], diff --git a/tox.ini b/tox.ini index 481634b..7bec595 100644 --- a/tox.ini +++ b/tox.ini @@ -28,15 +28,14 @@ show_missing = True [tox] envlist = checkqa, - py{36,37,38}-dj{22,30} + py{36,37,38}-dj{31} [testenv] passenv = CI CIRCLECI CIRCLE_* deps = coverage<5 codecov - dj22: Django>=2.2,<3.0 - dj30: Django>=3.0,<3.1 + dj30: Django>=3.1 master: https://github.com/django/django/tarball/master usedevelop = True @@ -49,6 +48,6 @@ commands = flake8 pinax isort --recursive --check-only --diff pinax -sp tox.ini deps = - flake8 == 3.7.9 - flake8-quotes == 2.1.1 - isort == 4.3.21 + flake8 == 3.8.3 + flake8-quotes == 3.2.0 + isort == 5.4.2 From 730c4b706c7783e3d48fca592a0510b5cae6acde Mon Sep 17 00:00:00 2001 From: Patrick Altman Date: Sat, 15 Aug 2020 10:09:04 -0500 Subject: [PATCH 2/2] Bring in changes from @mattlindesay From https://github.com/pinax/pinax-eventlog/pull/22/ Copying in rather than dealing with merge because of the JSONField and migrations changes --- pinax/eventlog/migrations/0001_initial.py | 8 ++++---- pinax/eventlog/models.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pinax/eventlog/migrations/0001_initial.py b/pinax/eventlog/migrations/0001_initial.py index d6b2751..0d60cfa 100644 --- a/pinax/eventlog/migrations/0001_initial.py +++ b/pinax/eventlog/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.1 on 2020-08-15 09:54 +# Generated by Django 3.1 on 2020-08-15 10:08 from django.conf import settings import django.core.serializers.json @@ -23,9 +23,9 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('timestamp', models.DateTimeField(db_index=True, default=django.utils.timezone.now)), ('action', models.CharField(db_index=True, max_length=50)), - ('object_id', models.PositiveIntegerField(null=True)), - ('extra', models.JSONField(encoder=django.core.serializers.json.DjangoJSONEncoder)), - ('content_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='contenttypes.contenttype')), + ('object_id', models.PositiveIntegerField(blank=True, null=True)), + ('extra', models.JSONField(blank=True, encoder=django.core.serializers.json.DjangoJSONEncoder)), + ('content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='contenttypes.contenttype')), ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), ], options={ diff --git a/pinax/eventlog/models.py b/pinax/eventlog/models.py index 71586d5..8dbe324 100644 --- a/pinax/eventlog/models.py +++ b/pinax/eventlog/models.py @@ -17,10 +17,10 @@ class Log(models.Model): ) timestamp = models.DateTimeField(default=timezone.now, db_index=True) action = models.CharField(max_length=50, db_index=True) - content_type = models.ForeignKey(ContentType, null=True, on_delete=models.SET_NULL) - object_id = models.PositiveIntegerField(null=True) + content_type = models.ForeignKey(ContentType, null=True, on_delete=models.SET_NULL, blank=True) + object_id = models.PositiveIntegerField(null=True, blank=True) obj = GenericForeignKey("content_type", "object_id") - extra = models.JSONField(encoder=DjangoJSONEncoder) + extra = models.JSONField(encoder=DjangoJSONEncoder, blank=True) @property def template_fragment_name(self):