Skip to content

Commit

Permalink
Add Django 2.2 compatibility. (chibisov#253)
Browse files Browse the repository at this point in the history
- Add tox/travis targets
 - Fix issues with migrations in Django 2.2
 - Drop django.utils.six usage (removed in Django 3.x & drf-extension is not compatible with python 2.7)
  • Loading branch information
joehybird authored and auvipy committed Apr 23, 2019
1 parent 949c084 commit 1d28a4b
Show file tree
Hide file tree
Showing 14 changed files with 256 additions and 22 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ install:
- pip install tox tox-travis

script:
- tox
- tox -r
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ Full documentation for project is available at [http://chibisov.github.io/drf-ex

* Tested for python 3.4, 3.5, 3.6 and 3.7 versions
* Tested for releases of Django Rest Framework 3.9
* Tested for Django from 1.11 to 2.1 versions
* Tested for django-filter 2.0.0
* Tested for Django from 1.11 to 2.2 versions
* Tested for django-filter 2.1.0

## Installation:

Expand Down
5 changes: 2 additions & 3 deletions rest_framework_extensions/cache/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@


from rest_framework_extensions.settings import extensions_api_settings
from django.utils import six


def get_cache(alias):
Expand Down Expand Up @@ -110,7 +109,7 @@ def calculate_key(self,
request,
args,
kwargs):
if isinstance(self.key_func, six.string_types):
if isinstance(self.key_func, str):
key_func = getattr(view_instance, self.key_func)
else:
key_func = self.key_func
Expand All @@ -123,7 +122,7 @@ def calculate_key(self,
)

def calculate_timeout(self, view_instance, **_):
if isinstance(self.timeout, six.string_types):
if isinstance(self.timeout, str):
self.timeout = getattr(view_instance, self.timeout)
return self.timeout

Expand Down
4 changes: 1 addition & 3 deletions rest_framework_extensions/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
"""
from __future__ import unicode_literals

from django.utils import six


# handle different QuerySet representations
def queryset_to_value_list(queryset):
assert isinstance(queryset, six.string_types)
assert isinstance(queryset, str)

# django 1.10 introduces syntax "<QuerySet [(#1), (#2), ...]>"
# we extract only the list of tuples from the string
Expand Down
3 changes: 1 addition & 2 deletions rest_framework_extensions/etag/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

from rest_framework_extensions.utils import prepare_header_name
from rest_framework_extensions.settings import extensions_api_settings
from django.utils import six

logger = logging.getLogger('django.request')

Expand Down Expand Up @@ -104,7 +103,7 @@ def calculate_etag(self,
request,
args,
kwargs):
if isinstance(self.etag_func, six.string_types):
if isinstance(self.etag_func, str):
etag_func = getattr(view_instance, self.etag_func)
else:
etag_func = self.etag_func
Expand Down
4 changes: 1 addition & 3 deletions rest_framework_extensions/mixins.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
# -*- coding: utf-8 -*-
# Try to import six from Django, fallback to included `six`.

from django.utils import six


from rest_framework_extensions.cache.mixins import CacheResponseMixin
# from rest_framework_extensions.etag.mixins import ReadOnlyETAGMixin, ETAGMixin
Expand Down Expand Up @@ -73,7 +71,7 @@ def filter_queryset_by_parents_lookups(self, queryset):

def get_parents_query_dict(self):
result = {}
for kwarg_name, kwarg_value in six.iteritems(self.kwargs):
for kwarg_name, kwarg_value in self.kwargs.items():
if kwarg_name.startswith(extensions_api_settings.DEFAULT_PARENT_LOOKUP_KWARG_NAME_PREFIX):
query_lookup = kwarg_name.replace(
extensions_api_settings.DEFAULT_PARENT_LOOKUP_KWARG_NAME_PREFIX,
Expand Down
4 changes: 2 additions & 2 deletions rest_framework_extensions/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from django.utils.http import urlencode
from rest_framework.settings import api_settings
from django.test.client import RequestFactory # changed here
from django.utils.encoding import force_bytes, six # changed here
from django.utils.encoding import force_bytes # changed here


def force_authenticate(request, user=None, token=None):
Expand Down Expand Up @@ -66,7 +66,7 @@ def _encode_data(self, data, format=None, content_type=None):
)

# Coerce text to bytes if required.
if isinstance(ret, six.text_type):
if isinstance(ret, str):
ret = bytes(ret.encode(renderer.charset))

return ret, content_type
Expand Down
3 changes: 2 additions & 1 deletion tests_app/settings.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Django settings for testproject project.
import multiprocessing
import os

DEBUG = True
DEBUG_PROPAGATE_EXCEPTIONS = True
Expand All @@ -15,7 +16,7 @@
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'test',
'NAME': 'drf_extensions',
'TEST_CHARSET': 'utf8',
},
}
Expand Down
169 changes: 169 additions & 0 deletions tests_app/tests/functional/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
# Generated by Django 2.2 on 2019-04-16 11:51

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
('contenttypes', '0002_remove_content_type_name'),
]

operations = [
migrations.CreateModel(
name='Comment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(max_length=254)),
('content', models.CharField(max_length=200)),
('created', models.DateTimeField(auto_now_add=True)),
],
),
migrations.CreateModel(
name='CommentForListDestroyModelMixin',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(max_length=254)),
],
),
migrations.CreateModel(
name='CommentForListUpdateModelMixin',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(max_length=254)),
],
),
migrations.CreateModel(
name='CommentForPaginateByMaxMixin',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(max_length=254)),
('content', models.CharField(max_length=200)),
('created', models.DateTimeField(auto_now_add=True)),
],
options={
'ordering': ['id'],
},
),
migrations.CreateModel(
name='DefaultRouterGroupModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
],
),
migrations.CreateModel(
name='DefaultRouterPermissionModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
],
),
migrations.CreateModel(
name='KeyConstructorUserProperty',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
],
),
migrations.CreateModel(
name='NestedRouterMixinBookModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=30)),
],
),
migrations.CreateModel(
name='NestedRouterMixinGroupModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
],
),
migrations.CreateModel(
name='NestedRouterMixinPermissionModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
],
),
migrations.CreateModel(
name='NestedRouterMixinTaskModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=30)),
],
),
migrations.CreateModel(
name='PermissionsComment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.CharField(max_length=100)),
],
),
migrations.CreateModel(
name='RouterTestModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid', models.CharField(max_length=20)),
('text', models.CharField(max_length=200)),
],
),
migrations.CreateModel(
name='UserForListUpdateModelMixin',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(max_length=254)),
('name', models.CharField(max_length=10)),
('age', models.IntegerField()),
('last_name', models.CharField(max_length=10)),
('password', models.CharField(max_length=100)),
],
),
migrations.CreateModel(
name='NestedRouterMixinUserModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(blank=True, max_length=254, null=True)),
('name', models.CharField(max_length=10)),
('groups', models.ManyToManyField(related_name='user_groups', to='functional.NestedRouterMixinGroupModel')),
],
),
migrations.AddField(
model_name='nestedroutermixingroupmodel',
name='permissions',
field=models.ManyToManyField(to='functional.NestedRouterMixinPermissionModel'),
),
migrations.CreateModel(
name='NestedRouterMixinCommentModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('object_id', models.PositiveIntegerField(blank=True, null=True)),
('text', models.CharField(max_length=30)),
('content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
],
),
migrations.CreateModel(
name='KeyConstructorUserModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('property', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='functional.KeyConstructorUserProperty')),
],
),
migrations.CreateModel(
name='DefaultRouterUserModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
('groups', models.ManyToManyField(related_name='user_groups', to='functional.DefaultRouterGroupModel')),
],
),
migrations.AddField(
model_name='defaultroutergroupmodel',
name='permissions',
field=models.ManyToManyField(to='functional.DefaultRouterPermissionModel'),
),
]
Empty file.
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey


Expand Down Expand Up @@ -29,7 +28,7 @@ class NestedRouterMixinBookModel(models.Model):

class NestedRouterMixinCommentModel(models.Model):
content_type = models.ForeignKey(
ContentType,
"contenttypes.ContentType",
blank=True,
null=True,
on_delete=models.CASCADE,
Expand Down
68 changes: 68 additions & 0 deletions tests_app/tests/unit/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Generated by Django 2.2 on 2019-04-16 11:51

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='BitTestModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_active', models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name='NestedRouterMixinGroupModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
],
),
migrations.CreateModel(
name='NestedRouterMixinPermissionModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
],
),
migrations.CreateModel(
name='UserModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20)),
],
),
migrations.CreateModel(
name='NestedRouterMixinUserModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
('groups', models.ManyToManyField(related_name='user_groups', to='unit.NestedRouterMixinGroupModel')),
],
),
migrations.AddField(
model_name='nestedroutermixingroupmodel',
name='permissions',
field=models.ManyToManyField(to='unit.NestedRouterMixinPermissionModel'),
),
migrations.CreateModel(
name='CommentModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=20)),
('text', models.CharField(max_length=200)),
('attachment', models.FileField(blank=True, max_length=500, null=True, upload_to='test_serializers')),
('hidden_text', models.CharField(blank=True, max_length=200, null=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='unit.UserModel')),
('users_liked', models.ManyToManyField(blank=True, to='unit.UserModel')),
],
),
]
Empty file.
Loading

0 comments on commit 1d28a4b

Please sign in to comment.