Skip to content

Commit 3388534

Browse files
author
Gergely
authored
Django 4 support (#223)
The following changes were made: * Add Django 4 to CI * Fix test loader * Remove deprecated argument * Migrate urls to re_paths * Use method_decorator * Remove varying exception message checks * Migrate assertEquals * Remove timezones from times * Migrate JSONField * Update setup.py
1 parent f9f5162 commit 3388534

File tree

17 files changed

+76
-64
lines changed

17 files changed

+76
-64
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ jobs:
88

99
strategy:
1010
matrix:
11-
python-version: ["3.7", "3.8"]
12-
django-version: ["3.1.4"]
11+
python-version: ["3.8", "3.12"]
12+
django-version: ["3.2.25", "4.2.11"]
1313
database-engine: ["postgres", "mysql"]
1414

1515
services:

binder/history.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from .json import jsondumps, JsonResponse
1212

1313

14-
transaction_commit = Signal(providing_args=['changeset'])
14+
transaction_commit = Signal()
1515

1616

1717
class Changeset(models.Model):

binder/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from django import forms
1212
from django.db import models
1313
from django.db.models.fields.files import FieldFile, FileField
14-
from django.contrib.postgres.fields import CITextField, ArrayField, JSONField, DateTimeRangeField as DTRangeField
14+
from django.contrib.postgres.fields import CITextField, ArrayField, DateTimeRangeField as DTRangeField
1515
from django.core import checks
1616
from django.core.files.base import File, ContentFile
1717
from django.core.files.images import ImageFile
@@ -395,7 +395,7 @@ def clean_value(self, qualifier, v):
395395

396396

397397
class JSONFieldFilter(FieldFilter):
398-
fields = [JSONField]
398+
fields = [models.JSONField]
399399
# TODO: Element or path-based lookup is not supported yet
400400
allowed_qualifiers = [None, 'contains', 'contained_by', 'has_key', 'has_any_keys', 'has_keys', 'isnull']
401401

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django.db import migrations, models
2+
3+
4+
class Migration(migrations.Migration):
5+
6+
dependencies = [
7+
('my_filters', '0001_initial'),
8+
]
9+
10+
operations = [
11+
migrations.AlterField(
12+
model_name='MyFilter',
13+
name='params',
14+
field=models.JSONField(),
15+
),
16+
]

binder/plugins/my_filters/models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from django.db import models
2-
from django.contrib.postgres.fields import JSONField
32
from django.conf import settings
43

54
from ...models import BinderModel
@@ -13,7 +12,7 @@ class MyFilter(BinderModel):
1312
)
1413
view = models.TextField()
1514
name = models.TextField()
16-
params = JSONField()
15+
params = models.JSONField()
1716
default = models.BooleanField(default=False)
1817

1918
class Meta(BinderModel.Meta):

binder/plugins/views/userview.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ def reset_request(self, request):
290290

291291
return HttpResponse(status=204)
292292

293-
@never_cache
293+
@method_decorator(never_cache)
294294
@list_route(name='send_activation_email', unauthenticated=True)
295295
@no_scoping_required()
296296
def send_activation_email(self, request):
@@ -355,7 +355,7 @@ def send_activation_email(self, request):
355355
return response
356356

357357
@method_decorator(sensitive_post_parameters())
358-
@never_cache
358+
@method_decorator(never_cache)
359359
@detail_route(name='activate', unauthenticated=True)
360360
@no_scoping_required()
361361
def activate(self, request, pk=None):
@@ -406,7 +406,7 @@ def activate(self, request, pk=None):
406406
return self.respond_with_user(request, user.id)
407407

408408
@method_decorator(sensitive_post_parameters())
409-
@never_cache
409+
@method_decorator(never_cache)
410410
@detail_route(name='reset_password', unauthenticated=True, methods=['PUT'])
411411
@no_scoping_required()
412412
def reset_password(self, request, pk=None):
@@ -466,7 +466,7 @@ def _reset_pass_for_user(self, request, user_id, token, password):
466466
return self.respond_with_user(request, user.id)
467467

468468
@method_decorator(sensitive_post_parameters())
469-
@never_cache
469+
@method_decorator(never_cache)
470470
@list_route(name='change_password')
471471
@no_scoping_required()
472472
def change_password(self, request):

binder/tests_discoverer.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
from django.test.runner import is_discoverable
21
from django.apps import apps
2+
try:
3+
from django.test.runner import is_discoverable
4+
except ImportError:
5+
# Django 4 support
6+
from django.test.runner import try_importing
7+
def is_discoverable(path):
8+
is_importable, _ = try_importing(path)
9+
return is_importable
310

411
# This prevents discoverer from loading models and views, which will
512
# cause all sorts of random failures.

ci-requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
psycopg2<2.9
1+
psycopg2<3.0
22
mysqlclient
33
Pillow
44
django-request-id

docs/install.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ CSRF_FAILURE_VIEW = 'binder.router.csrf_failure'
2424
In `urls.py`, add the following:
2525

2626
```python
27-
from django.conf.urls import url, include
27+
from django.urls import re_path, include
2828

2929
import binder.router
3030
import binder.views
@@ -33,8 +33,8 @@ import binder.models
3333
router = binder.router.Router().register(binder.views.ModelView)
3434

3535
urlpatterns = [
36-
url(r'^', include(router.urls)),
37-
url(r'^', binder.views.api_catchall, name='catchall'),
36+
re_path(r'^', include(router.urls)),
37+
re_path(r'^', binder.views.api_catchall, name='catchall'),
3838
]
3939

4040
binder.models.install_history_signal_handlers(binder.models.BinderModel)

project/project/urls.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from django.conf.urls import url, include
1+
from django.urls import re_path, include
22
from django.contrib import admin
33

44
import testapp.urls
55

66
urlpatterns = [
7-
url(r'^admin/', admin.site.urls, name='admin'),
8-
url(r'^api/', include(testapp.urls), name='testapp'),
7+
re_path(r'^admin/', admin.site.urls, name='admin'),
8+
re_path(r'^api/', include(testapp.urls), name='testapp'),
99
]

0 commit comments

Comments
 (0)