From 006300207a88740ef3f1b2b9c9350ccd3df5e36a Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Fri, 28 Apr 2023 14:25:28 -0400 Subject: [PATCH 01/16] No __future__ in this --- entity_event/migrations/0001_initial.py | 1 - entity_event/migrations/0002_medium_creation_time.py | 1 - entity_event/migrations/0003_auto_20170830_1321.py | 1 - entity_event/migrations/0004_auto_20180403_1655.py | 1 - entity_event/tests/migrations/0001_initial.py | 1 - 5 files changed, 5 deletions(-) diff --git a/entity_event/migrations/0001_initial.py b/entity_event/migrations/0001_initial.py index 008297f..5fdfe68 100644 --- a/entity_event/migrations/0001_initial.py +++ b/entity_event/migrations/0001_initial.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from __future__ import unicode_literals from django.db import models, migrations import django.db.models.deletion diff --git a/entity_event/migrations/0002_medium_creation_time.py b/entity_event/migrations/0002_medium_creation_time.py index 91f6834..14bf8ca 100644 --- a/entity_event/migrations/0002_medium_creation_time.py +++ b/entity_event/migrations/0002_medium_creation_time.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # Generated by Django 1.9.11 on 2017-05-24 18:07 -from __future__ import unicode_literals import datetime from django.db import migrations, models diff --git a/entity_event/migrations/0003_auto_20170830_1321.py b/entity_event/migrations/0003_auto_20170830_1321.py index 7348e45..65482be 100644 --- a/entity_event/migrations/0003_auto_20170830_1321.py +++ b/entity_event/migrations/0003_auto_20170830_1321.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # Generated by Django 1.11.4 on 2017-08-30 13:21 -from __future__ import unicode_literals from django.db import migrations, models diff --git a/entity_event/migrations/0004_auto_20180403_1655.py b/entity_event/migrations/0004_auto_20180403_1655.py index bef67c3..36d0d55 100644 --- a/entity_event/migrations/0004_auto_20180403_1655.py +++ b/entity_event/migrations/0004_auto_20180403_1655.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # Generated by Django 1.11.11 on 2018-04-03 16:55 -from __future__ import unicode_literals import django.contrib.postgres.fields.jsonb import django.core.serializers.json diff --git a/entity_event/tests/migrations/0001_initial.py b/entity_event/tests/migrations/0001_initial.py index 23c315c..091dd1c 100644 --- a/entity_event/tests/migrations/0001_initial.py +++ b/entity_event/tests/migrations/0001_initial.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from __future__ import unicode_literals from django.db import models, migrations import django.db.models.deletion From 84400423305c75993a63ab94ea55f740033d7dda Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Fri, 28 Apr 2023 14:25:50 -0400 Subject: [PATCH 02/16] Eliminate six and mock --- entity_event/tests/context_loader_tests.py | 2 +- entity_event/tests/context_serializer_tests.py | 2 +- entity_event/tests/model_tests.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/entity_event/tests/context_loader_tests.py b/entity_event/tests/context_loader_tests.py index aedea8a..fcadcaa 100644 --- a/entity_event/tests/context_loader_tests.py +++ b/entity_event/tests/context_loader_tests.py @@ -2,7 +2,7 @@ from django.test import TestCase from django.test.utils import override_settings from django_dynamic_fixture import N, G -from mock import patch +from unittest.mock import patch from entity_event import context_loader from entity_event import models diff --git a/entity_event/tests/context_serializer_tests.py b/entity_event/tests/context_serializer_tests.py index 1e9ad6f..7e68ee7 100644 --- a/entity_event/tests/context_serializer_tests.py +++ b/entity_event/tests/context_serializer_tests.py @@ -1,7 +1,7 @@ import json from django.test.testcases import TransactionTestCase from django_dynamic_fixture import G -from mock import patch, call +from unittest.mock import patch, call from entity_event.context_serializer import DefaultContextSerializer from entity_event.tests.models import TestModel diff --git a/entity_event/tests/model_tests.py b/entity_event/tests/model_tests.py index 80dfd43..3382330 100644 --- a/entity_event/tests/model_tests.py +++ b/entity_event/tests/model_tests.py @@ -5,7 +5,7 @@ from django_dynamic_fixture import N, G from entity.models import Entity, EntityKind, EntityRelationship from freezegun import freeze_time -from mock import patch, call, Mock +from unittest.mock import patch, call, Mock from six import text_type from entity_event.models import ( From 68b8221800fdfcce57317de95895bd28ef848412 Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Fri, 28 Apr 2023 14:29:32 -0400 Subject: [PATCH 03/16] Handling jsonfield stuff --- entity_event/migrations/0004_auto_20180403_1655.py | 9 ++++----- entity_event/models.py | 4 ++-- requirements/requirements.txt | 5 ++++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/entity_event/migrations/0004_auto_20180403_1655.py b/entity_event/migrations/0004_auto_20180403_1655.py index 36d0d55..7440822 100644 --- a/entity_event/migrations/0004_auto_20180403_1655.py +++ b/entity_event/migrations/0004_auto_20180403_1655.py @@ -1,9 +1,8 @@ # -*- coding: utf-8 -*- # Generated by Django 1.11.11 on 2018-04-03 16:55 -import django.contrib.postgres.fields.jsonb import django.core.serializers.json -from django.db import migrations +from django.db import migrations, models class Migration(migrations.Migration): @@ -16,16 +15,16 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='contextrenderer', name='context_hints', - field=django.contrib.postgres.fields.jsonb.JSONField(default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True), + field=models.JSONField(default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True), ), migrations.AlterField( model_name='event', name='context', - field=django.contrib.postgres.fields.jsonb.JSONField(encoder=django.core.serializers.json.DjangoJSONEncoder), + field=models.JSONField(encoder=django.core.serializers.json.DjangoJSONEncoder), ), migrations.AlterField( model_name='medium', name='additional_context', - field=django.contrib.postgres.fields.jsonb.JSONField(default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True), + field=models.JSONField(default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True), ), ] diff --git a/entity_event/models.py b/entity_event/models.py index e8180da..74bf2af 100644 --- a/entity_event/models.py +++ b/entity_event/models.py @@ -1,10 +1,10 @@ from collections import defaultdict from datetime import datetime from operator import or_ -from six.moves import reduce +from functools import reduce from cached_property import cached_property -from django.contrib.postgres.fields import JSONField +from django.db.models import JSONField from django.core.serializers.json import DjangoJSONEncoder from django.db import models, transaction from django.db.models import Q diff --git a/requirements/requirements.txt b/requirements/requirements.txt index efb5a1b..e2b5663 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,4 +1,7 @@ cached-property>=1.3.1 django-entity>=5.0.0 -jsonfield>=0.9.20 six + +# only needed for a migration at this point +jsonfield + From 9c526e6e91107b0634bb8a77eaeffcac3079f4ac Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Tue, 9 May 2023 14:15:56 -0400 Subject: [PATCH 04/16] add warnings to manage.py --- manage.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/manage.py b/manage.py index e374933..b997ce1 100644 --- a/manage.py +++ b/manage.py @@ -1,6 +1,13 @@ #!/usr/bin/env python import sys +# Show warnings about django deprecations - uncomment for version upgrade testing +import warnings +from django.utils.deprecation import RemovedInNextVersionWarning +warnings.filterwarnings('always', category=DeprecationWarning) +warnings.filterwarnings('always', category=PendingDeprecationWarning) +warnings.filterwarnings('always', category=RemovedInNextVersionWarning) + from settings import configure_settings From c22b062517edcb7a26c0f912def3b6f5b1d550c6 Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Tue, 9 May 2023 14:16:21 -0400 Subject: [PATCH 05/16] Removed django versions from setup --- setup.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/setup.py b/setup.py index 2428484..45420b6 100755 --- a/setup.py +++ b/setup.py @@ -45,9 +45,6 @@ def get_lines(file_path): 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Framework :: Django', - 'Framework :: Django :: 2.2', - 'Framework :: Django :: 3.0', - 'Framework :: Django :: 3.1', 'Framework :: Django :: 3.2', 'Framework :: Django :: 4.0', 'Framework :: Django :: 4.1', From 6418da872cbe799ccf6f7a4aef4440b93d9c5a59 Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Tue, 9 May 2023 14:20:28 -0400 Subject: [PATCH 06/16] Bump version --- entity_event/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entity_event/version.py b/entity_event/version.py index 4eb28e3..5aeebf8 100644 --- a/entity_event/version.py +++ b/entity_event/version.py @@ -1 +1 @@ -__version__ = '3.0.0' +__version__ = '3.1.0b1' From 0d8ce01f15b2318b7a6a8f82af1e23f079bf924d Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Wed, 31 May 2023 16:00:20 -0400 Subject: [PATCH 07/16] Added github actions --- .github/workflows/tests.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f5e7178..ee95005 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -18,12 +18,10 @@ jobs: # AttributeError: module 'collections' has no attribute 'Callable' # https://github.com/nose-devs/nose/issues/1099 django: - - 'Django~=2.2.0' - - 'Django~=3.0.0' - - 'Django~=3.1.0' - 'Django~=3.2.0' - 'Django~=4.0.0' - 'Django~=4.1.0' + - 'Django~=4.2.0' experimental: [false] # include: # - python: '3.9' @@ -38,6 +36,8 @@ jobs: django: 'Django~=4.0.0' - python: '3.7' django: 'Django~=4.1.0' + - python: '3.7' + django: 'Django~=4.2.0' services: postgres: image: postgres:latest @@ -53,8 +53,8 @@ jobs: --health-timeout 5s --health-retries 5 steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-python@v3 with: python-version: ${{ matrix.python }} - name: Setup @@ -78,7 +78,7 @@ jobs: } run: | coverage run manage.py test entity_event - coverage report --fail-under=100 + coverage report --fail-under=99 continue-on-error: ${{ matrix.experimental }} - name: Check style run: flake8 entity_event From d86ca3668e28903fba3df303a14c9b9f5b854a10 Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Wed, 31 May 2023 16:06:59 -0400 Subject: [PATCH 08/16] removed default_app_config --- entity_event/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/entity_event/__init__.py b/entity_event/__init__.py index f13510a..ed53594 100644 --- a/entity_event/__init__.py +++ b/entity_event/__init__.py @@ -1,5 +1,2 @@ # flake8: noqa from .version import __version__ - - -default_app_config = 'entity_event.apps.EntityEventConfig' From 2eaaf615a1fa602c11c2a38975cef8f4cb8fd3e6 Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Wed, 31 May 2023 16:07:06 -0400 Subject: [PATCH 09/16] Settings updates --- settings.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/settings.py b/settings.py index 2e28e4d..0a283f6 100644 --- a/settings.py +++ b/settings.py @@ -37,11 +37,29 @@ def configure_settings(): settings.configure( TEST_RUNNER='django_nose.NoseTestSuiteRunner', SECRET_KEY='*', + DEFAULT_AUTO_FIELD='django.db.models.AutoField', NOSE_ARGS=['--nocapture', '--nologcapture', '--verbosity=1'], - MIDDLEWARE_CLASSES=(), DATABASES={ 'default': db_config, }, + INSTALLED_APPS=( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.admin', + 'entity', + 'entity_event', + 'entity_event.tests', + 'django_nose', + ), + ROOT_URLCONF='entity_event.urls', + DEBUG=False, + MIDDLEWARE=( + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware' + ), TEMPLATES=[ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', @@ -56,16 +74,4 @@ def configure_settings(): } } ], - INSTALLED_APPS=( - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.admin', - 'entity', - 'entity_event', - 'entity_event.tests', - 'django_nose', - ), - ROOT_URLCONF='entity_event.urls', - DEBUG=False, ) From 33ec524810b562d1a70db6d4eba7662f402fe27c Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Wed, 31 May 2023 16:07:27 -0400 Subject: [PATCH 10/16] Updated assertEqual naming convention --- entity_event/tests/context_loader_tests.py | 130 ++++++++++----------- entity_event/tests/model_tests.py | 24 ++-- 2 files changed, 77 insertions(+), 77 deletions(-) diff --git a/entity_event/tests/context_loader_tests.py b/entity_event/tests/context_loader_tests.py index fcadcaa..6b2faef 100644 --- a/entity_event/tests/context_loader_tests.py +++ b/entity_event/tests/context_loader_tests.py @@ -16,13 +16,13 @@ def test_none_defined(self): @override_settings(DEFAULT_ENTITY_EVENT_RENDERING_STYLE='short') def test_defined(self): rs = G(models.RenderingStyle, name='short') - self.assertEquals(context_loader.get_default_rendering_style(), rs) + self.assertEqual(context_loader.get_default_rendering_style(), rs) class TestGetContextHintsFromSource(TestCase): def test_no_context_renderers(self): res = context_loader.get_context_hints_per_source([]) - self.assertEquals(res, {}) + self.assertEqual(res, {}) @patch.object(models.ContextRenderer, 'get_sources', spec_set=True) def test_one_context_renderer(self, mock_get_sources): @@ -37,7 +37,7 @@ def test_one_context_renderer(self, mock_get_sources): }, }) ]) - self.assertEquals(res, { + self.assertEqual(res, { source: { 'key': { 'app_name': 'entity_event.tests', @@ -77,7 +77,7 @@ def test_multiple_context_renderers_over_multiple_source(self): }, }) ]) - self.assertEquals(res, { + self.assertEqual(res, { source1: { 'key': { 'app_name': 'entity_event.tests', @@ -100,7 +100,7 @@ def test_multiple_context_renderers_over_multiple_source(self): class TestGetQuerysetsForContextHints(TestCase): def test_no_context_hints(self): qsets = context_loader.get_querysets_for_context_hints({}) - self.assertEquals(qsets, {}) + self.assertEqual(qsets, {}) def test_one_context_hint_no_select_related(self): source = N(models.Source, id=1) @@ -112,7 +112,7 @@ def test_one_context_hint_no_select_related(self): }, }, }) - self.assertEquals(qsets, { + self.assertEqual(qsets, { test_models.TestModel: test_models.TestModel.objects }) @@ -139,7 +139,7 @@ def test_one_context_hint_w_select_related(self): # Django < 1.7 and 1.8 have spaces before/after parentheses actual_sql = actual_sql.replace('( ', '(').replace(' )', ')') - self.assertEquals(actual_sql, expected_sql) + self.assertEqual(actual_sql, expected_sql) def test_multiple_context_hints_w_multiple_select_related(self): source = N(models.Source, id=1) @@ -175,7 +175,7 @@ def test_multiple_context_hints_w_multiple_select_related(self): # Django < 1.7 and 1.8 have spaces before/after parentheses actual_sql = actual_sql.replace('( ', '(').replace(' )', ')') - self.assertEquals(actual_sql, expected_sql) + self.assertEqual(actual_sql, expected_sql) def test_multiple_context_hints_w_multiple_select_related_multiple_prefetch_related(self): source = N(models.Source, id=1) @@ -214,7 +214,7 @@ def test_multiple_context_hints_w_multiple_select_related_multiple_prefetch_rela # Django < 1.7 and 1.8 have spaces before/after parentheses actual_sql = actual_sql.replace('( ', '(').replace(' )', ')') - self.assertEquals(actual_sql, expected_sql) + self.assertEqual(actual_sql, expected_sql) class TestGetQuerysetsForContextHintsDbTests(TestCase): @@ -248,18 +248,18 @@ def test_multiple_context_hints_w_multiple_select_related_multiple_prefetch_rela with self.assertNumQueries(2): v = qsets[test_models.TestModel].get(id=o.id) - self.assertEquals(v.fk, fk) - self.assertEquals(v.fk2, fk2) - self.assertEquals(set(v.fk_m2m.all()), set(m2ms)) + self.assertEqual(v.fk, fk) + self.assertEqual(v.fk2, fk2) + self.assertEqual(set(v.fk_m2m.all()), set(m2ms)) class DictFindTest(TestCase): def test_dict_find_none(self): - self.assertEquals(list(context_loader.dict_find({}, 'key')), []) + self.assertEqual(list(context_loader.dict_find({}, 'key')), []) def test_dict_find_list_key(self): d = {'key': ['value']} - self.assertEquals(list(context_loader.dict_find(d, 'key')), [(d, ['value'])]) + self.assertEqual(list(context_loader.dict_find(d, 'key')), [(d, ['value'])]) def test_dict_find_nested_list_key(self): d = {'key': ['value']} @@ -270,7 +270,7 @@ def test_dict_find_nested_list_key(self): 'hi2': d }] } - self.assertEquals(list(context_loader.dict_find(larger_dict, 'key')), [(d, ['value'])]) + self.assertEqual(list(context_loader.dict_find(larger_dict, 'key')), [(d, ['value'])]) def test_dict_find_double_nested_list_key(self): d = {'key': ['value']} @@ -282,7 +282,7 @@ def test_dict_find_double_nested_list_key(self): }], 'hi3': d } - self.assertEquals(list(context_loader.dict_find(larger_dict, 'key')), [(d, ['value']), (d, ['value'])]) + self.assertEqual(list(context_loader.dict_find(larger_dict, 'key')), [(d, ['value']), (d, ['value'])]) def test_dict_find_deep_nested_list_key(self): d = {'key': ['value']} @@ -294,16 +294,16 @@ def test_dict_find_deep_nested_list_key(self): }], 'hi3': d }]] - self.assertEquals(list(context_loader.dict_find(larger_dict, 'key')), [(d, ['value']), (d, ['value'])]) + self.assertEqual(list(context_loader.dict_find(larger_dict, 'key')), [(d, ['value']), (d, ['value'])]) class GetModelIdsToFetchTest(TestCase): def test_no_events(self): - self.assertEquals(context_loader.get_model_ids_to_fetch([], {}), {}) + self.assertEqual(context_loader.get_model_ids_to_fetch([], {}), {}) def test_no_context_hints(self): e = N(models.Event, id=1, context={}) - self.assertEquals(context_loader.get_model_ids_to_fetch([e], {}), {}) + self.assertEqual(context_loader.get_model_ids_to_fetch([e], {}), {}) def test_w_one_event_one_context_hint_single_pk(self): source = N(models.Source, id=1) @@ -316,7 +316,7 @@ def test_w_one_event_one_context_hint_single_pk(self): }, } e = N(models.Event, context={'key': 2}, source=source) - self.assertEquals(context_loader.get_model_ids_to_fetch([e], hints), { + self.assertEqual(context_loader.get_model_ids_to_fetch([e], hints), { test_models.TestModel: set([2]) }) @@ -331,7 +331,7 @@ def test_w_one_event_one_context_hint_list_pks(self): }, } e = N(models.Event, context={'key': [2, 3, 5]}, source=source) - self.assertEquals(context_loader.get_model_ids_to_fetch([e], hints), { + self.assertEqual(context_loader.get_model_ids_to_fetch([e], hints), { test_models.TestModel: set([2, 3, 5]) }) @@ -347,7 +347,7 @@ def test_w_multiple_events_one_context_hint_list_pks(self): } e1 = N(models.Event, context={'key': [2, 3, 5]}, source=source) e2 = N(models.Event, context={'key': 88}, source=source) - self.assertEquals(context_loader.get_model_ids_to_fetch([e1, e2], hints), { + self.assertEqual(context_loader.get_model_ids_to_fetch([e1, e2], hints), { test_models.TestModel: set([2, 3, 5, 88]) }) @@ -376,7 +376,7 @@ def test_w_multiple_events_multiple_context_hints_list_pks(self): e2 = N(models.Event, context={'key': 88}, source=source1) e3 = N(models.Event, context={'key': 100, 'key2': [50]}, source=source2) e4 = N(models.Event, context={'key2': [60]}, source=source2) - self.assertEquals(context_loader.get_model_ids_to_fetch([e1, e2, e3, e4], hints), { + self.assertEqual(context_loader.get_model_ids_to_fetch([e1, e2, e3, e4], hints), { test_models.TestModel: set([2, 3, 5, 88, 100]), test_models.TestFKModel: set([50, 60]) }) @@ -384,11 +384,11 @@ def test_w_multiple_events_multiple_context_hints_list_pks(self): class FetchModelDataTest(TestCase): def test_none(self): - self.assertEquals({}, context_loader.fetch_model_data({}, {})) + self.assertEqual({}, context_loader.fetch_model_data({}, {})) def test_one_model_one_id_to_fetch(self): m1 = G(test_models.TestModel) - self.assertEquals({ + self.assertEqual({ test_models.TestModel: {m1.id: m1} }, context_loader.fetch_model_data({ test_models.TestModel: test_models.TestModel.objects @@ -400,7 +400,7 @@ def test_multiple_models_multiple_ids_to_fetch(self): m1 = G(test_models.TestModel) m2 = G(test_models.TestModel) m3 = G(test_models.TestFKModel) - self.assertEquals({ + self.assertEqual({ test_models.TestModel: {m1.id: m1, m2.id: m2}, test_models.TestFKModel: {m3.id: m3} }, context_loader.fetch_model_data({ @@ -419,7 +419,7 @@ def test_none(self): def test_event_with_no_model_data(self): e = N(models.Event, id=1, context={'hi', 'hi'}) context_loader.load_fetched_objects_into_contexts([e], {}, {}) - self.assertEquals(e, e) + self.assertEqual(e, e) def test_one_event_w_model_data(self): m = N(test_models.TestModel, id=2) @@ -434,7 +434,7 @@ def test_one_event_w_model_data(self): } e = N(models.Event, context={'key': m.id}, source=s) context_loader.load_fetched_objects_into_contexts([e], {test_models.TestModel: {m.id: m}}, hints) - self.assertEquals(e.context, {'key': m}) + self.assertEqual(e.context, {'key': m}) def test_one_event_w_list_model_data(self): m1 = N(test_models.TestModel, id=2) @@ -450,20 +450,20 @@ def test_one_event_w_list_model_data(self): } e = N(models.Event, context={'key': [m1.id, m2.id]}, source=s) context_loader.load_fetched_objects_into_contexts([e], {test_models.TestModel: {m1.id: m1, m2.id: m2}}, hints) - self.assertEquals(e.context, {'key': [m1, m2]}) + self.assertEqual(e.context, {'key': [m1, m2]}) class TestLoadRenderersIntoEvents(TestCase): def test_no_mediums_or_renderers(self): events = [N(models.Event, context={})] context_loader.load_renderers_into_events(events, [], [], None) - self.assertEquals(events[0]._context_renderers, {}) + self.assertEqual(events[0]._context_renderers, {}) def test_mediums_and_no_renderers(self): events = [N(models.Event, context={})] mediums = [N(models.Medium)] context_loader.load_renderers_into_events(events, mediums, [], None) - self.assertEquals(events[0]._context_renderers, {}) + self.assertEqual(events[0]._context_renderers, {}) def test_mediums_w_renderers(self): s1 = N(models.Source, id=1) @@ -480,11 +480,11 @@ def test_mediums_w_renderers(self): context_loader.load_renderers_into_events([e1, e2], [m1, m2], [cr1, cr2, cr3], None) - self.assertEquals(e1._context_renderers, { + self.assertEqual(e1._context_renderers, { m1: cr1, m2: cr3, }) - self.assertEquals(e2._context_renderers, { + self.assertEqual(e2._context_renderers, { m1: cr2 }) @@ -502,11 +502,11 @@ def test_mediums_w_source_group_renderers(self): context_loader.load_renderers_into_events([e1, e2], [m1, m2], [cr1, cr2], None) - self.assertEquals(e1._context_renderers, { + self.assertEqual(e1._context_renderers, { m1: cr1, m2: cr2, }) - self.assertEquals(e2._context_renderers, { + self.assertEqual(e2._context_renderers, { m1: cr1, m2: cr2, }) @@ -524,11 +524,11 @@ def test_mediums_w_source_group_renderers_default(self): context_loader.load_renderers_into_events([e1, e2], [m1, m2], [cr1], rs1) - self.assertEquals(e1._context_renderers, { + self.assertEqual(e1._context_renderers, { m1: cr1, m2: cr1, }) - self.assertEquals(e2._context_renderers, { + self.assertEqual(e2._context_renderers, { m1: cr1, m2: cr1, }) @@ -550,11 +550,11 @@ def test_mediums_w_renderers_default_source(self): context_loader.load_renderers_into_events([e1, e2], [m1, m2], [cr1, cr2, cr3], default_style) - self.assertEquals(e1._context_renderers, { + self.assertEqual(e1._context_renderers, { m1: cr1, m2: cr1, }) - self.assertEquals(e2._context_renderers, { + self.assertEqual(e2._context_renderers, { m1: cr2, m2: cr2, }) @@ -570,7 +570,7 @@ def test_none(self): def test_no_mediums(self): e = G(models.Event, context={}) context_loader.load_contexts_and_renderers([e], []) - self.assertEquals(e.context, {}) + self.assertEqual(e.context, {}) def test_one_render_target_one_event(self): m1 = G(test_models.TestModel) @@ -586,7 +586,7 @@ def test_one_render_target_one_event(self): }) context_loader.load_contexts_and_renderers([e], [medium]) - self.assertEquals(e.context, {'key': m1}) + self.assertEqual(e.context, {'key': m1}) @override_settings(DEFAULT_ENTITY_EVENT_RENDERING_STYLE='short') def test_one_render_target_one_event_no_style_with_default(self): @@ -603,7 +603,7 @@ def test_one_render_target_one_event_no_style_with_default(self): }) context_loader.load_contexts_and_renderers([e], [medium]) - self.assertEquals(e.context, {'key': m1}) + self.assertEqual(e.context, {'key': m1}) def test_multiple_render_targets_multiple_events(self): test_m1 = G(test_models.TestModel) @@ -641,22 +641,22 @@ def test_multiple_render_targets_multiple_events(self): e4 = G(models.Event, context={'key2': test_fk_m2.id}, source=s2) context_loader.load_contexts_and_renderers([e1, e2, e3, e4], [medium1, medium2]) - self.assertEquals(e1.context, {'key': test_m1, 'key2': 'haha'}) - self.assertEquals(e2.context, {'key': [test_m2, test_m3]}) - self.assertEquals(e3.context, {'key2': test_fk_m1, 'key': test_m1}) - self.assertEquals(e4.context, {'key2': test_fk_m2}) + self.assertEqual(e1.context, {'key': test_m1, 'key2': 'haha'}) + self.assertEqual(e2.context, {'key': [test_m2, test_m3]}) + self.assertEqual(e3.context, {'key2': test_fk_m1, 'key': test_m1}) + self.assertEqual(e4.context, {'key2': test_fk_m2}) # Verify context renderers are put into the events properly - self.assertEquals(e1._context_renderers, { + self.assertEqual(e1._context_renderers, { medium1: cr1, }) - self.assertEquals(e2._context_renderers, { + self.assertEqual(e2._context_renderers, { medium1: cr1, }) - self.assertEquals(e3._context_renderers, { + self.assertEqual(e3._context_renderers, { medium2: cr2, }) - self.assertEquals(e4._context_renderers, { + self.assertEqual(e4._context_renderers, { medium2: cr2, }) @@ -701,25 +701,25 @@ def test_multiple_render_targets_multiple_events_use_default(self): e4 = G(models.Event, context={'key2': test_fk_m2.id}, source=s2) context_loader.load_contexts_and_renderers([e1, e2, e3, e4], [medium1, medium2]) - self.assertEquals(e1.context, {'key': test_m1, 'key2': 'haha'}) - self.assertEquals(e2.context, {'key': [test_m2, test_m3]}) - self.assertEquals(e3.context, {'key2': test_fk_m1, 'key': test_m1}) - self.assertEquals(e4.context, {'key2': test_fk_m2}) + self.assertEqual(e1.context, {'key': test_m1, 'key2': 'haha'}) + self.assertEqual(e2.context, {'key': [test_m2, test_m3]}) + self.assertEqual(e3.context, {'key2': test_fk_m1, 'key': test_m1}) + self.assertEqual(e4.context, {'key2': test_fk_m2}) # Verify context renderers are put into the events properly - self.assertEquals(e1._context_renderers, { + self.assertEqual(e1._context_renderers, { medium1: cr1, medium2: cr1, }) - self.assertEquals(e2._context_renderers, { + self.assertEqual(e2._context_renderers, { medium1: cr1, medium2: cr1, }) - self.assertEquals(e3._context_renderers, { + self.assertEqual(e3._context_renderers, { medium1: cr2, medium2: cr2, }) - self.assertEquals(e4._context_renderers, { + self.assertEqual(e4._context_renderers, { medium1: cr2, medium2: cr2, }) @@ -777,10 +777,10 @@ def test_optimal_queries(self): with self.assertNumQueries(num_queries): context_loader.load_contexts_and_renderers([e1, e2, e3, e4], [medium1, medium2]) - self.assertEquals(e1.context['key'].fk, fk1) - self.assertEquals(e2.context['key'][0].fk, fk1) - self.assertEquals(e1.context['key'].fk2, fk2) - self.assertEquals(e2.context['key'][0].fk2, fk2) - self.assertEquals(set(e1.context['key'].fk_m2m.all()), set([fk1, fk11])) - self.assertEquals(set(e2.context['key'][0].fk_m2m.all()), set([fk1, fk11])) - self.assertEquals(e3.context['key'].fk, fk1) + self.assertEqual(e1.context['key'].fk, fk1) + self.assertEqual(e2.context['key'][0].fk, fk1) + self.assertEqual(e1.context['key'].fk2, fk2) + self.assertEqual(e2.context['key'][0].fk2, fk2) + self.assertEqual(set(e1.context['key'].fk_m2m.all()), set([fk1, fk11])) + self.assertEqual(set(e2.context['key'][0].fk_m2m.all()), set([fk1, fk11])) + self.assertEqual(e3.context['key'].fk, fk1) diff --git a/entity_event/tests/model_tests.py b/entity_event/tests/model_tests.py index 3382330..05aa017 100644 --- a/entity_event/tests/model_tests.py +++ b/entity_event/tests/model_tests.py @@ -39,8 +39,8 @@ def test_one_context_renderer_one_medium_w_additional_context(self): events = Event.objects.all().load_contexts_and_renderers(m) txt, html = events[0].render(m) - self.assertEquals(txt, 'Test text template with value 100') - self.assertEquals(html, 'Test html template with value suppressed') + self.assertEqual(txt, 'Test text template with value 100') + self.assertEqual(html, 'Test html template with value suppressed') def test_one_context_renderer_one_medium(self): rg = G(RenderingStyle) @@ -61,8 +61,8 @@ def test_one_context_renderer_one_medium(self): events = Event.objects.all().load_contexts_and_renderers(m) txt, html = events[0].render(m) - self.assertEquals(txt, 'Test text template with value 100') - self.assertEquals(html, 'Test html template with value 100') + self.assertEqual(txt, 'Test text template with value 100') + self.assertEqual(html, 'Test html template with value 100') def test_wo_fetching_contexts(self): rg = G(RenderingStyle) @@ -292,9 +292,9 @@ def test_load_contexts_and_renderers(self, mock_load_contexts_and_renderers): e = G(Event, context={}) medium = G(Medium) Event.objects.load_contexts_and_renderers(medium) - self.assertEquals(mock_load_contexts_and_renderers.call_count, 1) - self.assertEquals(list(mock_load_contexts_and_renderers.call_args_list[0][0][0]), [e]) - self.assertEquals(mock_load_contexts_and_renderers.call_args_list[0][0][1], [medium]) + self.assertEqual(mock_load_contexts_and_renderers.call_count, 1) + self.assertEqual(list(mock_load_contexts_and_renderers.call_args_list[0][0][0]), [e]) + self.assertEqual(mock_load_contexts_and_renderers.call_args_list[0][0][1], [medium]) @patch.object(EventManager, 'get_queryset', autospec=True) def test_cache_related(self, mock_get_queryset): @@ -489,7 +489,7 @@ def test_render(self, mock_load_contexts_and_renderers): res = medium.render(events) mock_load_contexts_and_renderers.assert_called_once_with(events, [medium]) - self.assertEquals(res, { + self.assertEqual(res, { e1: ('e1.txt', 'e1.html'), e2: ('e2.txt', 'e2.html'), }) @@ -541,7 +541,7 @@ def test_get_unseen_events_some_seen_some_not(self): unseen_e = G(Event, context={}, source=self.source) events = self.medium.get_filtered_events(seen=False) - self.assertEquals(list(events), [unseen_e]) + self.assertEqual(list(events), [unseen_e]) def test_get_unseen_events_some_seen_from_other_mediums(self): seen_from_other_medium_e = G(Event, context={}) @@ -551,7 +551,7 @@ def test_get_unseen_events_some_seen_from_other_mediums(self): G(EventSeen, event=seen_from_medium_event) events = self.medium.get_filtered_events(seen=False) - self.assertEquals(set(events), {unseen_e, seen_from_medium_event, seen_from_other_medium_e}) + self.assertEqual(set(events), {unseen_e, seen_from_medium_event, seen_from_other_medium_e}) class MediumGetEventFiltersTest(TestCase): @@ -1002,11 +1002,11 @@ def setUp(self): def test_RenderingStyle_formats(self): s = text_type(self.rendering_style) - self.assertEquals(s, 'Test Render Group test') + self.assertEqual(s, 'Test Render Group test') def test_contextrenderer_formats(self): s = text_type(self.context_renderer) - self.assertEquals(s, 'Test Context Renderer') + self.assertEqual(s, 'Test Context Renderer') def test_medium_formats(self): s = text_type(self.medium) From 85b3136e1dd06d9f0d387639ee8b6e23fa1e90bf Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Wed, 31 May 2023 16:56:01 -0400 Subject: [PATCH 11/16] Squashed migrations to completely eliminate jsonfield --- entity_event/migrations/0001_0005_squashed.py | 187 ++++++++++++++++++ entity_event/migrations/0001_initial.py | 7 +- 2 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 entity_event/migrations/0001_0005_squashed.py diff --git a/entity_event/migrations/0001_0005_squashed.py b/entity_event/migrations/0001_0005_squashed.py new file mode 100644 index 0000000..4a0e062 --- /dev/null +++ b/entity_event/migrations/0001_0005_squashed.py @@ -0,0 +1,187 @@ +# Generated by Django 3.2.19 on 2023-05-31 20:54 + +import datetime +import django.core.serializers.json +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + replaces = [('entity_event', '0001_initial'), ('entity_event', '0002_medium_creation_time'), ('entity_event', '0003_auto_20170830_1321'), ('entity_event', '0004_auto_20180403_1655'), ('entity_event', '0005_auto_20200409_1612')] + + dependencies = [ + ('entity', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Event', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('context', models.JSONField()), + ('time', models.DateTimeField(auto_now_add=True, db_index=True)), + ('time_expires', models.DateTimeField(db_index=True, default=datetime.datetime(9999, 12, 31, 23, 59, 59, 999999))), + ('uuid', models.CharField(max_length=128, unique=True)), + ], + ), + migrations.CreateModel( + name='EventActor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('entity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity.entity')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.event')), + ], + ), + migrations.CreateModel( + name='Medium', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64, unique=True)), + ('display_name', models.CharField(max_length=64)), + ('description', models.TextField()), + ('additional_context', models.JSONField(default=None, null=True)), + ], + ), + migrations.CreateModel( + name='RenderingStyle', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=256, unique=True)), + ('display_name', models.CharField(default='', max_length=256)), + ], + ), + migrations.CreateModel( + name='Source', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64, unique=True)), + ('display_name', models.CharField(max_length=64)), + ('description', models.TextField()), + ], + ), + migrations.CreateModel( + name='SourceGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=256, unique=True)), + ('display_name', models.CharField(max_length=256)), + ('description', models.TextField()), + ], + ), + migrations.CreateModel( + name='Subscription', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('only_following', models.BooleanField(default=True)), + ('entity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='entity.entity')), + ('medium', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.medium')), + ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.source')), + ('sub_entity_kind', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='entity.entitykind')), + ], + ), + migrations.CreateModel( + name='Unsubscription', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('entity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity.entity')), + ('medium', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.medium')), + ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.source')), + ], + ), + migrations.AddField( + model_name='source', + name='group', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.sourcegroup'), + ), + migrations.AddField( + model_name='medium', + name='rendering_style', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='entity_event.renderingstyle'), + ), + migrations.CreateModel( + name='EventSeen', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('time_seen', models.DateTimeField(default=datetime.datetime.utcnow)), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.event')), + ('medium', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.medium')), + ], + options={ + 'unique_together': {('event', 'medium')}, + }, + ), + migrations.AddField( + model_name='event', + name='source', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.source'), + ), + migrations.CreateModel( + name='AdminEvent', + fields=[ + ], + options={ + 'proxy': True, + }, + bases=('entity_event.event',), + ), + migrations.AddField( + model_name='medium', + name='time_created', + field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2017, 5, 24, 18, 7, 45, 987701)), + preserve_default=False, + ), + migrations.AlterField( + model_name='event', + name='uuid', + field=models.CharField(max_length=512, unique=True), + ), + migrations.AlterField( + model_name='event', + name='context', + field=models.JSONField(encoder=django.core.serializers.json.DjangoJSONEncoder), + ), + migrations.AlterField( + model_name='medium', + name='additional_context', + field=models.JSONField(default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True), + ), + migrations.CreateModel( + name='ContextRenderer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=256, unique=True)), + ('text_template_path', models.CharField(default='', max_length=256)), + ('html_template_path', models.CharField(default='', max_length=256)), + ('text_template', models.TextField(default='')), + ('html_template', models.TextField(default='')), + ('context_hints', models.JSONField(default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True)), + ('rendering_style', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.renderingstyle')), + ('source', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='entity_event.source')), + ('source_group', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='entity_event.sourcegroup')), + ], + options={ + 'unique_together': {('source', 'rendering_style')}, + }, + ), + migrations.AlterField( + model_name='medium', + name='display_name', + field=models.CharField(max_length=256), + ), + migrations.AlterField( + model_name='medium', + name='name', + field=models.CharField(max_length=256, unique=True), + ), + migrations.AlterField( + model_name='source', + name='display_name', + field=models.CharField(max_length=256), + ), + migrations.AlterField( + model_name='source', + name='name', + field=models.CharField(max_length=256, unique=True), + ), + ] diff --git a/entity_event/migrations/0001_initial.py b/entity_event/migrations/0001_initial.py index 5fdfe68..e642744 100644 --- a/entity_event/migrations/0001_initial.py +++ b/entity_event/migrations/0001_initial.py @@ -3,7 +3,6 @@ from django.db import models, migrations import django.db.models.deletion import datetime -import jsonfield.fields class Migration(migrations.Migration): @@ -22,7 +21,7 @@ class Migration(migrations.Migration): ('html_template_path', models.CharField(max_length=256, default='')), ('text_template', models.TextField(default='')), ('html_template', models.TextField(default='')), - ('context_hints', jsonfield.fields.JSONField(null=True, default=None)), + ('context_hints', models.JSONField(null=True, default=None)), ], options={ }, @@ -32,7 +31,7 @@ class Migration(migrations.Migration): name='Event', fields=[ ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('context', jsonfield.fields.JSONField()), + ('context', models.JSONField()), ('time', models.DateTimeField(auto_now_add=True, db_index=True)), ('time_expires', models.DateTimeField(db_index=True, default=datetime.datetime(9999, 12, 31, 23, 59, 59, 999999))), ('uuid', models.CharField(max_length=128, unique=True)), @@ -70,7 +69,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=64, unique=True)), ('display_name', models.CharField(max_length=64)), ('description', models.TextField()), - ('additional_context', jsonfield.fields.JSONField(null=True, default=None)), + ('additional_context', models.JSONField(null=True, default=None)), ], options={ }, From 340e85336bfa183923740cf1684dbbe5fce17bb8 Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Wed, 31 May 2023 16:57:51 -0400 Subject: [PATCH 12/16] Squashed migrations to completely eliminate jsonfield --- entity_event/migrations/0001_0005_squashed.py | 5 +- entity_event/migrations/0001_initial.py | 198 ------------------ .../migrations/0002_medium_creation_time.py | 21 -- .../migrations/0003_auto_20170830_1321.py | 19 -- .../migrations/0004_auto_20180403_1655.py | 30 --- .../migrations/0005_auto_20200409_1612.py | 58 ----- 6 files changed, 3 insertions(+), 328 deletions(-) delete mode 100644 entity_event/migrations/0001_initial.py delete mode 100644 entity_event/migrations/0002_medium_creation_time.py delete mode 100644 entity_event/migrations/0003_auto_20170830_1321.py delete mode 100644 entity_event/migrations/0004_auto_20180403_1655.py delete mode 100644 entity_event/migrations/0005_auto_20200409_1612.py diff --git a/entity_event/migrations/0001_0005_squashed.py b/entity_event/migrations/0001_0005_squashed.py index 4a0e062..d563d89 100644 --- a/entity_event/migrations/0001_0005_squashed.py +++ b/entity_event/migrations/0001_0005_squashed.py @@ -7,8 +7,9 @@ class Migration(migrations.Migration): - - replaces = [('entity_event', '0001_initial'), ('entity_event', '0002_medium_creation_time'), ('entity_event', '0003_auto_20170830_1321'), ('entity_event', '0004_auto_20180403_1655'), ('entity_event', '0005_auto_20200409_1612')] + replaces = [('entity_event', '0001_initial'), ('entity_event', '0002_medium_creation_time'), + ('entity_event', '0003_auto_20170830_1321'), ('entity_event', '0004_auto_20180403_1655'), + ('entity_event', '0005_auto_20200409_1612')] dependencies = [ ('entity', '0001_initial'), diff --git a/entity_event/migrations/0001_initial.py b/entity_event/migrations/0001_initial.py deleted file mode 100644 index e642744..0000000 --- a/entity_event/migrations/0001_initial.py +++ /dev/null @@ -1,198 +0,0 @@ -# -*- coding: utf-8 -*- - -from django.db import models, migrations -import django.db.models.deletion -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - ('entity', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='ContextRenderer', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('name', models.CharField(max_length=64, unique=True)), - ('text_template_path', models.CharField(max_length=256, default='')), - ('html_template_path', models.CharField(max_length=256, default='')), - ('text_template', models.TextField(default='')), - ('html_template', models.TextField(default='')), - ('context_hints', models.JSONField(null=True, default=None)), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='Event', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('context', models.JSONField()), - ('time', models.DateTimeField(auto_now_add=True, db_index=True)), - ('time_expires', models.DateTimeField(db_index=True, default=datetime.datetime(9999, 12, 31, 23, 59, 59, 999999))), - ('uuid', models.CharField(max_length=128, unique=True)), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='EventActor', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('entity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity.Entity')), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.Event')), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='EventSeen', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('time_seen', models.DateTimeField(default=datetime.datetime.utcnow)), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.Event')), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='Medium', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('name', models.CharField(max_length=64, unique=True)), - ('display_name', models.CharField(max_length=64)), - ('description', models.TextField()), - ('additional_context', models.JSONField(null=True, default=None)), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='RenderingStyle', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('name', models.CharField(max_length=64, unique=True)), - ('display_name', models.CharField(max_length=64, default='')), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='Source', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('name', models.CharField(max_length=64, unique=True)), - ('display_name', models.CharField(max_length=64)), - ('description', models.TextField()), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='SourceGroup', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('name', models.CharField(max_length=64, unique=True)), - ('display_name', models.CharField(max_length=64)), - ('description', models.TextField()), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='Subscription', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('only_following', models.BooleanField(default=True)), - ('entity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='entity.Entity')), - ('medium', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.Medium')), - ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.Source')), - ('sub_entity_kind', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, null=True, related_name='+', to='entity.EntityKind', default=None)), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='Unsubscription', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('entity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity.Entity')), - ('medium', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.Medium')), - ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.Source')), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.AddField( - model_name='source', - name='group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.SourceGroup'), - preserve_default=True, - ), - migrations.AddField( - model_name='medium', - name='rendering_style', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.RenderingStyle', null=True), - preserve_default=True, - ), - migrations.AddField( - model_name='eventseen', - name='medium', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.Medium'), - preserve_default=True, - ), - migrations.AlterUniqueTogether( - name='eventseen', - unique_together=set([('event', 'medium')]), - ), - migrations.AddField( - model_name='event', - name='source', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.Source'), - preserve_default=True, - ), - migrations.AddField( - model_name='contextrenderer', - name='rendering_style', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.RenderingStyle'), - preserve_default=True, - ), - migrations.AddField( - model_name='contextrenderer', - name='source', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.Source', null=True), - preserve_default=True, - ), - migrations.AddField( - model_name='contextrenderer', - name='source_group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='entity_event.SourceGroup', null=True), - preserve_default=True, - ), - migrations.AlterUniqueTogether( - name='contextrenderer', - unique_together=set([('source', 'rendering_style')]), - ), - migrations.CreateModel( - name='AdminEvent', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('entity_event.event',), - ), - ] diff --git a/entity_event/migrations/0002_medium_creation_time.py b/entity_event/migrations/0002_medium_creation_time.py deleted file mode 100644 index 14bf8ca..0000000 --- a/entity_event/migrations/0002_medium_creation_time.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.11 on 2017-05-24 18:07 - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('entity_event', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='medium', - name='time_created', - field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2017, 5, 24, 18, 7, 45, 987701)), - preserve_default=False, - ), - ] diff --git a/entity_event/migrations/0003_auto_20170830_1321.py b/entity_event/migrations/0003_auto_20170830_1321.py deleted file mode 100644 index 65482be..0000000 --- a/entity_event/migrations/0003_auto_20170830_1321.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-08-30 13:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('entity_event', '0002_medium_creation_time'), - ] - - operations = [ - migrations.AlterField( - model_name='event', - name='uuid', - field=models.CharField(max_length=512, unique=True), - ), - ] diff --git a/entity_event/migrations/0004_auto_20180403_1655.py b/entity_event/migrations/0004_auto_20180403_1655.py deleted file mode 100644 index 7440822..0000000 --- a/entity_event/migrations/0004_auto_20180403_1655.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-03 16:55 - -import django.core.serializers.json -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('entity_event', '0003_auto_20170830_1321'), - ] - - operations = [ - migrations.AlterField( - model_name='contextrenderer', - name='context_hints', - field=models.JSONField(default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True), - ), - migrations.AlterField( - model_name='event', - name='context', - field=models.JSONField(encoder=django.core.serializers.json.DjangoJSONEncoder), - ), - migrations.AlterField( - model_name='medium', - name='additional_context', - field=models.JSONField(default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True), - ), - ] diff --git a/entity_event/migrations/0005_auto_20200409_1612.py b/entity_event/migrations/0005_auto_20200409_1612.py deleted file mode 100644 index caabee6..0000000 --- a/entity_event/migrations/0005_auto_20200409_1612.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 2.2.8 on 2020-04-09 16:12 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('entity_event', '0004_auto_20180403_1655'), - ] - - operations = [ - migrations.AlterField( - model_name='contextrenderer', - name='name', - field=models.CharField(max_length=256, unique=True), - ), - migrations.AlterField( - model_name='medium', - name='display_name', - field=models.CharField(max_length=256), - ), - migrations.AlterField( - model_name='medium', - name='name', - field=models.CharField(max_length=256, unique=True), - ), - migrations.AlterField( - model_name='renderingstyle', - name='display_name', - field=models.CharField(default='', max_length=256), - ), - migrations.AlterField( - model_name='renderingstyle', - name='name', - field=models.CharField(max_length=256, unique=True), - ), - migrations.AlterField( - model_name='source', - name='display_name', - field=models.CharField(max_length=256), - ), - migrations.AlterField( - model_name='source', - name='name', - field=models.CharField(max_length=256, unique=True), - ), - migrations.AlterField( - model_name='sourcegroup', - name='display_name', - field=models.CharField(max_length=256), - ), - migrations.AlterField( - model_name='sourcegroup', - name='name', - field=models.CharField(max_length=256, unique=True), - ), - ] From ba78cb8ae329d624b3620cf4c4cf8d2c61fa2161 Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Fri, 2 Jun 2023 10:31:20 -0400 Subject: [PATCH 13/16] tests.yml tweak --- .github/workflows/tests.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ee95005..12c2ec2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,10 +13,6 @@ jobs: fail-fast: false matrix: python: ['3.7', '3.8', '3.9'] - # Time to switch to pytest or nose2?? - # nosetests is broken on 3.10 - # AttributeError: module 'collections' has no attribute 'Callable' - # https://github.com/nose-devs/nose/issues/1099 django: - 'Django~=3.2.0' - 'Django~=4.0.0' @@ -69,7 +65,7 @@ jobs: env: DB_SETTINGS: >- { - "ENGINE":"django.db.backends.postgresql_psycopg2", + "ENGINE":"django.db.backends.postgresql", "NAME":"entity_event", "USER":"postgres", "PASSWORD":"postgres", From a302ed5704223327c1454932b7674e85b83165bc Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Fri, 2 Jun 2023 10:31:32 -0400 Subject: [PATCH 14/16] Killed jsonfield from requirements --- requirements/requirements.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index e2b5663..1541347 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,7 +1,3 @@ cached-property>=1.3.1 django-entity>=5.0.0 six - -# only needed for a migration at this point -jsonfield - From 78c0c7c489bbbdd7a4eb9da034134f184e9298a8 Mon Sep 17 00:00:00 2001 From: Jeffrey Cross Date: Fri, 2 Jun 2023 10:34:15 -0400 Subject: [PATCH 15/16] Killed six --- entity_event/context_loader.py | 12 +++--------- entity_event/context_serializer.py | 3 +-- requirements/requirements.txt | 1 - 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/entity_event/context_loader.py b/entity_event/context_loader.py index 5b3cea8..fdbfb8c 100644 --- a/entity_event/context_loader.py +++ b/entity_event/context_loader.py @@ -2,17 +2,11 @@ A module for loading contexts using context hints. """ from collections import defaultdict -import six from django.conf import settings from django.db.models import Q -try: - # Django 1.9 - from django.apps import apps - get_model = apps.get_model -except ImportError: # pragma: no cover - # Django < 1.9 - from django.db.models import get_model +from django.apps import apps +get_model = apps.get_model from manager_utils import id_dict from entity_event.models import ContextRenderer @@ -104,7 +98,7 @@ def get_model_ids_to_fetch(events, context_hints_per_source): ... } """ - number_types = (complex, float) + six.integer_types + number_types = (complex, float, int) model_ids_to_fetch = defaultdict(set) for event in events: diff --git a/entity_event/context_serializer.py b/entity_event/context_serializer.py index 7bbbbe7..aeb93b2 100644 --- a/entity_event/context_serializer.py +++ b/entity_event/context_serializer.py @@ -1,7 +1,6 @@ import json from django.db import models from django.forms import model_to_dict -import six class DefaultContextSerializer(object): @@ -86,7 +85,7 @@ def serialize_json_string(self, value): """ # Check if the value might be a json string - if not isinstance(value, six.string_types): + if not isinstance(value, str): return value # Make sure it starts with a brace diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 1541347..ea0f8de 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,3 +1,2 @@ cached-property>=1.3.1 django-entity>=5.0.0 -six From dd794420e85a08c25b35a10c8207f122fbe30eca Mon Sep 17 00:00:00 2001 From: Wes Okes Date: Thu, 29 Jun 2023 11:33:00 -0400 Subject: [PATCH 16/16] version bump --- docs/release_notes.rst | 5 +++++ entity_event/version.py | 2 +- requirements/requirements.txt | 2 +- setup.py | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/release_notes.rst b/docs/release_notes.rst index 0a2192f..25b48cb 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -1,6 +1,11 @@ Release Notes ============= +v3.1.0 +------ +* drop django 2 +* add django 4.2 + v3.0.0 ------ * drop python 3.6 diff --git a/entity_event/version.py b/entity_event/version.py index 5aeebf8..7f5601d 100644 --- a/entity_event/version.py +++ b/entity_event/version.py @@ -1 +1 @@ -__version__ = '3.1.0b1' +__version__ = '3.1.0' diff --git a/requirements/requirements.txt b/requirements/requirements.txt index ea0f8de..4cc029b 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,2 +1,2 @@ cached-property>=1.3.1 -django-entity>=5.0.0 +django-entity>=6.1.0 diff --git a/setup.py b/setup.py index 45420b6..1072d32 100755 --- a/setup.py +++ b/setup.py @@ -48,6 +48,7 @@ def get_lines(file_path): 'Framework :: Django :: 3.2', 'Framework :: Django :: 4.0', 'Framework :: Django :: 4.1', + 'Framework :: Django :: 4.2', ], license='MIT', install_requires=install_requires,