From f56b05e00c9e133847025630eff39a927c6726b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ryan=20O=E2=80=99Hara?= Date: Wed, 20 Dec 2017 16:57:11 -0800 Subject: [PATCH 1/3] Test Django 2.0 in tox, Django 1.8 on CI --- .travis.yml | 10 ++++++++-- test_project/generic/models.py | 6 ++++-- test_project/many_to_one/models.py | 3 ++- test_project/one_to_one/models.py | 5 +++-- tox.ini | 3 +++ 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index fba58ab..f0cb3f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,13 @@ python: - "pypy" env: - - "$DJANGO='django<2'" + - deps='django<1.9 djangorestframework<3.7' + - deps='django<2' + +matrix: + include: + - python: "3.6" + env: deps='django<2.1' sudo: false @@ -15,7 +21,7 @@ before_install: # command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors install: - - pip install $DJANGO + - pip install $deps - pip install -r requirements-dev.txt - pip install coveralls==1.1 # travis pypy not compatible with later versions - pip freeze diff --git a/test_project/generic/models.py b/test_project/generic/models.py index bde5674..4c07416 100644 --- a/test_project/generic/models.py +++ b/test_project/generic/models.py @@ -18,8 +18,10 @@ def __str__(self): @six.python_2_unicode_compatible class ModelB(models.Model): name = models.CharField(max_length=64) - a = models.ForeignKey(ModelA, blank=True, null=True, related_name='rel_b') - content_type = models.ForeignKey(ContentType, related_name='+') + a = models.ForeignKey(ModelA, blank=True, null=True, related_name='rel_b', + on_delete=models.CASCADE) + content_type = models.ForeignKey(ContentType, related_name='+', + on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') diff --git a/test_project/many_to_one/models.py b/test_project/many_to_one/models.py index 9fe69c4..6d6b6f1 100644 --- a/test_project/many_to_one/models.py +++ b/test_project/many_to_one/models.py @@ -19,7 +19,8 @@ def __str__(self): class Article(models.Model): headline = models.CharField(max_length=100) pub_date = models.DateField() - reporter = models.ForeignKey(Reporter, related_name='articles') + reporter = models.ForeignKey(Reporter, related_name='articles', + on_delete=models.CASCADE) def __str__(self): return self.headline diff --git a/test_project/one_to_one/models.py b/test_project/one_to_one/models.py index a2e4377..16f4cca 100644 --- a/test_project/one_to_one/models.py +++ b/test_project/one_to_one/models.py @@ -16,7 +16,8 @@ def __str__(self): @six.python_2_unicode_compatible class Restaurant(models.Model): - place = models.OneToOneField(Place, primary_key=True) + place = models.OneToOneField(Place, primary_key=True, + on_delete=models.CASCADE) serves_hot_dogs = models.BooleanField(default=False) serves_pizza = models.BooleanField(default=False) @@ -26,7 +27,7 @@ def __str__(self): @six.python_2_unicode_compatible class Waiter(models.Model): - restaurant = models.ForeignKey(Restaurant) + restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE) name = models.CharField(max_length=50) def __str__(self): diff --git a/tox.ini b/tox.ini index 3df908f..edf530f 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,7 @@ [tox] envlist = {py27,py36,pypy}-django{18,11} + py36-django20 # 1.9 breaks pypy3 hence only testing with 18 # scandir fails to install in pypy3 so skippint for now # {pypy3}-django{18} @@ -19,7 +20,9 @@ commands = make check deps = django18: django<1.9 + django18: djangorestframework<3.7 django11: django<2 + django20: django<2.1 whitelist_externals = make From 19ba836b31656d60c90916e29fa8cea4fb9087ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ryan=20O=E2=80=99Hara?= Date: Tue, 19 Dec 2017 18:20:35 -0800 Subject: [PATCH 2/3] Make compatible with Django 2.0 --- url_filter/filtersets/django.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/url_filter/filtersets/django.py b/url_filter/filtersets/django.py index df4c5f2..74a2527 100644 --- a/url_filter/filtersets/django.py +++ b/url_filter/filtersets/django.py @@ -122,8 +122,14 @@ def _build_filterset_from_related_field(self, field): Build a :class:`.FilterSet` for a Django relation model field such as ``ForeignKey``. """ + try: + name = field.remote_field.name + except AttributeError: + # Django < 1.9 + name = field.rel.name + return self._build_django_filterset(field, { - 'exclude': [field.rel.name], + 'exclude': [name], }) def _build_filterset_from_reverse_field(self, field): From adfc279f741b1a3a44ab7e955ff19cdb775a9e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ryan=20O=E2=80=99Hara?= Date: Wed, 20 Dec 2017 23:59:36 -0800 Subject: [PATCH 3/3] Avoid `try` for compatibility fallbacks to cause 100% line coverage to be reported https://github.com/miki725/django-url-filter/pull/52#discussion_r158199585 --- url_filter/filtersets/django.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/url_filter/filtersets/django.py b/url_filter/filtersets/django.py index 74a2527..7caa3ad 100644 --- a/url_filter/filtersets/django.py +++ b/url_filter/filtersets/django.py @@ -122,14 +122,11 @@ def _build_filterset_from_related_field(self, field): Build a :class:`.FilterSet` for a Django relation model field such as ``ForeignKey``. """ - try: - name = field.remote_field.name - except AttributeError: - # Django < 1.9 - name = field.rel.name + # field.rel for Django < 1.9 + remote_field = getattr(field, 'remote_field', None) or field.rel return self._build_django_filterset(field, { - 'exclude': [name], + 'exclude': [remote_field.name], }) def _build_filterset_from_reverse_field(self, field):