Skip to content

Support Django 5.1 #397

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Draft
wants to merge 11 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 26 additions & 73 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,16 @@ jobs:

strategy:
matrix:
Python3.12 - Django 5.1:
python.version: '3.12'
tox.env: 'py312-django51'
Python3.11 - Django 5.1:
python.version: '3.11'
tox.env: 'py311-django51'
Python3.10 - Django 5.1:
python.version: '3.10'
tox.env: 'py310-django51'

Python3.12 - Django 5.0:
python.version: '3.12'
tox.env: 'py312-django50'
Expand All @@ -34,6 +44,9 @@ jobs:
python.version: '3.10'
tox.env: 'py310-django50'

Python3.12 - Django 4.2:
python.version: '3.12'
tox.env: 'py311-django42'
Python3.11 - Django 4.2:
python.version: '3.11'
tox.env: 'py311-django42'
Expand All @@ -47,43 +60,6 @@ jobs:
python.version: '3.8'
tox.env: 'py38-django42'

Python3.11 - Django 4.1:
python.version: '3.11'
tox.env: 'py311-django41'
Python3.10 - Django 4.1:
python.version: '3.10'
tox.env: 'py310-django41'
Python 3.9 - Django 4.1:
python.version: '3.9'
tox.env: 'py39-django41'
Python 3.8 - Django 4.1:
python.version: '3.8'
tox.env: 'py38-django41'

Python3.11 - Django 4.0:
python.version: '3.11'
tox.env: 'py311-django40'
Python3.10 - Django 4.0:
python.version: '3.10'
tox.env: 'py310-django40'
Python 3.9 - Django 4.0:
python.version: '3.9'
tox.env: 'py39-django40'
Python 3.8 - Django 4.0:
python.version: '3.8'
tox.env: 'py38-django40'

Python3.11 - Django 3.2:
python.version: '3.11'
tox.env: 'py311-django32'
Python 3.9 - Django 3.2:
python.version: '3.9'
tox.env: 'py39-django32'
Python 3.8 - Django 3.2:
python.version: '3.8'
tox.env: 'py38-django32'


steps:
- task: CredScan@3
inputs:
Expand Down Expand Up @@ -138,6 +114,16 @@ jobs:

strategy:
matrix:
Python3.12 - Django 5.1:
python.version: '3.12'
tox.env: 'py312-django51'
Python3.11 - Django 5.1:
python.version: '3.11'
tox.env: 'py311-django51'
Python3.10 - Django 5.1:
python.version: '3.10'
tox.env: 'py310-django51'

Python3.12 - Django 5.0:
python.version: '3.12'
tox.env: 'py312-django50'
Expand All @@ -148,6 +134,9 @@ jobs:
python.version: '3.10'
tox.env: 'py310-django50'

Python3.12 - Django 4.2:
python.version: '3.12'
tox.env: 'py311-django42'
Python3.11 - Django 4.2:
python.version: '3.11'
tox.env: 'py311-django42'
Expand All @@ -161,42 +150,6 @@ jobs:
python.version: '3.8'
tox.env: 'py38-django42'

Python3.11 - Django 4.1:
python.version: '3.11'
tox.env: 'py311-django41'
Python3.10 - Django 4.1:
python.version: '3.10'
tox.env: 'py310-django41'
Python 3.9 - Django 4.1:
python.version: '3.9'
tox.env: 'py39-django41'
Python 3.8 - Django 4.1:
python.version: '3.8'
tox.env: 'py38-django41'

Python3.11 - Django 4.0:
python.version: '3.11'
tox.env: 'py311-django40'
Python3.10 - Django 4.0:
python.version: '3.10'
tox.env: 'py310-django40'
Python 3.9 - Django 4.0:
python.version: '3.9'
tox.env: 'py39-django40'
Python 3.8 - Django 4.0:
python.version: '3.8'
tox.env: 'py38-django40'

Python3.11 - Django 3.2:
python.version: '3.11'
tox.env: 'py311-django32'
Python 3.9 - Django 3.2:
python.version: '3.9'
tox.env: 'py39-django32'
Python 3.8 - Django 3.2:
python.version: '3.8'
tox.env: 'py38-django32'

steps:
- task: UsePythonVersion@0
inputs:
Expand Down
5 changes: 4 additions & 1 deletion mssql/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,10 @@ def _get_check_sql(self, model, schema_editor):
query = Query(model=model, alias_cols=False)
else:
query = Query(model=model)
where = query.build_where(self.check)
if VERSION >= (5, 1):
where = query.build_where(self.condition)
else:
where = query.build_where(self.check)
compiler = query.get_compiler(connection=schema_editor.connection)
sql, params = where.as_sql(compiler, schema_editor.connection)
if schema_editor.connection.vendor == 'microsoft':
Expand Down
40 changes: 26 additions & 14 deletions mssql/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -292,17 +292,18 @@ def alter_unique_together(self, model, old_unique_together, new_unique_together)
def _model_indexes_sql(self, model):
"""
Return a list of all index SQL statements (field indexes,
index_together, Meta.indexes) for the specified model.
index_together (Django 5.0 and below), Meta.indexes) for the specified model.
"""
if not model._meta.managed or model._meta.proxy or model._meta.swapped:
return []
output = []
for field in model._meta.local_fields:
output.extend(self._field_indexes_sql(model, field))

for field_names in model._meta.index_together:
fields = [model._meta.get_field(field) for field in field_names]
output.append(self._create_index_sql(model, fields, suffix="_idx"))
if django_version <= (5, 0):
for field_names in model._meta.index_together:
fields = [model._meta.get_field(field) for field in field_names]
output.append(self._create_index_sql(model, fields, suffix="_idx"))

if django_version >= (4, 0):
for field_names in model._meta.unique_together:
Expand Down Expand Up @@ -394,8 +395,17 @@ def _column_generated_sql(self, field):
params = ()
return f"GENERATED ALWAYS AS ({expression_sql}) {persistency_sql}", params

def _alter_field(self, model, old_field, new_field, old_type, new_type,
old_db_params, new_db_params, strict=False):
def _alter_field(
self,
model,
old_field,
new_field,
old_type,
new_type,
old_db_params,
new_db_params,
strict=False,
):
"""Actually perform a "physical" (non-ManyToMany) field update."""

# the backend doesn't support altering a column to/from AutoField as
Expand Down Expand Up @@ -803,10 +813,11 @@ def _alter_field(self, model, old_field, new_field, old_type, new_type,
if old_field.db_index and new_field.db_index:
index_columns.append([old_field])
else:
for fields in model._meta.index_together:
columns = [model._meta.get_field(field) for field in fields]
if old_field.column in [c.column for c in columns]:
index_columns.append(columns)
if django_version <= (5, 0):
for fields in model._meta.index_together:
columns = [model._meta.get_field(field) for field in fields]
if old_field.column in [c.column for c in columns]:
index_columns.append(columns)
if index_columns:
for columns in index_columns:
create_index_sql_statement = self._create_index_sql(model, columns)
Expand Down Expand Up @@ -935,10 +946,11 @@ def _delete_indexes(self, model, old_field, new_field):
index_columns.append([old_field.column])
elif old_field.null != new_field.null:
index_columns.append([old_field.column])
for fields in model._meta.index_together:
columns = [model._meta.get_field(field).column for field in fields]
if old_field.column in columns:
index_columns.append(columns)
if django_version <= (5, 0):
for fields in model._meta.index_together:
columns = [model._meta.get_field(field).column for field in fields]
if old_field.column in columns:
index_columns.append(columns)

for index in model._meta.indexes:
columns = [model._meta.get_field(field).column for field in index.fields]
Expand Down
7 changes: 3 additions & 4 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,10 @@
'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: 3.11',
'Programming Language :: Python :: 3.12',
'Framework :: Django :: 3.2',
'Framework :: Django :: 4.0',
'Framework :: Django :: 4.1',
'Framework :: Django :: 4.2',
'Framework :: Django :: 5.0',
'Framework :: Django :: 5.1',

]

this_directory = path.abspath(path.dirname(__file__))
Expand All @@ -42,7 +41,7 @@
license='BSD',
packages=find_packages(),
install_requires=[
'django>=3.2,<5.1',
'django>=4.2,<5.2',
'pyodbc>=3.0',
'pytz',
],
Expand Down
7 changes: 4 additions & 3 deletions testapp/tests/test_indexes.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,10 @@ def test_correct_indexes_exist(self):
expected_index_causes = []
if field.db_index:
expected_index_causes.append('db_index=True')
for field_names in model_cls._meta.index_together:
if field.name in field_names:
expected_index_causes.append(f'index_together[{field_names}]')
if VERSION <= (5, 0):
for field_names in model_cls._meta.index_together:
if field.name in field_names:
expected_index_causes.append(f'index_together[{field_names}]')
if field._unique and field.null:
# This is implemented using a (filtered) unique index (not a constraint) to get ANSI NULL behaviour
expected_index_causes.append('unique=True & null=True')
Expand Down
3 changes: 2 additions & 1 deletion testapp/tests/test_multiple_databases.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@
from django import VERSION
from django.core.exceptions import ValidationError
from django.db import OperationalError
from django.db.backends.sqlite3.operations import DatabaseOperations
from django.db.backends.base.operations import BaseDatabaseOperations
from django.test import TestCase, skipUnlessDBFeature

from ..models import BinaryData, Pizza, Topping

if VERSION >= (3, 2):
from ..models import TestCheckConstraintWithUnicode

DatabaseOperations = BaseDatabaseOperations

@skipUnless(
VERSION >= (3, 1),
Expand Down
11 changes: 4 additions & 7 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
[tox]
envlist =
{py36,py37,py38,py39}-django32,
{py38, py39, py310}-django40,
{py38, py39, py310}-django41,
{py38, py39, py310}-django42,
{py310, py311, py312}-django50
{py310, py311, py312}-django50,
{py310, py311, py312}-django51


[testenv]
allowlist_externals =
Expand All @@ -18,8 +17,6 @@ deps =
coverage==5.5
unittest-xml-reporting

django32: django==3.2.*
django40: django>=4.0a1,<4.1
django41: django>=4.1a1,<4.2
django42: django>=4.2,<4.3
django50: django>=5.0,<5.1
django51: django>=5.1,<5.2
Loading