Skip to content

Commit

Permalink
Merge pull request #69 from ambitioninc/chore/django4-prequel
Browse files Browse the repository at this point in the history
Django 3+4 compatibility
  • Loading branch information
somewes authored Jun 29, 2023
2 parents 65e8f6c + dd79442 commit 40ef446
Show file tree
Hide file tree
Showing 21 changed files with 315 additions and 460 deletions.
18 changes: 7 additions & 11 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,11 @@ 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~=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'
Expand All @@ -38,6 +32,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
Expand All @@ -53,8 +49,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
Expand All @@ -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",
Expand All @@ -78,7 +74,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
5 changes: 5 additions & 0 deletions docs/release_notes.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
Release Notes
=============

v3.1.0
------
* drop django 2
* add django 4.2

v3.0.0
------
* drop python 3.6
Expand Down
3 changes: 0 additions & 3 deletions entity_event/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,2 @@
# flake8: noqa
from .version import __version__


default_app_config = 'entity_event.apps.EntityEventConfig'
12 changes: 3 additions & 9 deletions entity_event/context_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down
3 changes: 1 addition & 2 deletions entity_event/context_serializer.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import json
from django.db import models
from django.forms import model_to_dict
import six


class DefaultContextSerializer(object):
Expand Down Expand Up @@ -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
Expand Down
188 changes: 188 additions & 0 deletions entity_event/migrations/0001_0005_squashed.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
# 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),
),
]
Loading

0 comments on commit 40ef446

Please sign in to comment.