#36922: Commit 787cc96e is reachable from main but not 6.0.2
-------------------------------------+-------------------------------------
Reporter: Julien Palard | Owner: (none)
Type: Bug | Status: closed
Component: Database layer | Version: 6.0
(models, ORM) |
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by Julien Palard):
django-oscar tests are failing without this patch:
{{{
> pytest -x --pdb
================================================================= test
session starts
=================================================================
platform linux -- Python 3.13.12, pytest-9.0.2, pluggy-1.6.0
django: version: 6.0.2
rootdir: /home/mdk/src/django-oscar
configfile: setup.cfg
testpaths: tests/
plugins: Faker-40.1.2, django-webtest-1.9.14, django-4.11.1, xdist-3.8.0
collected 1682 items
tests/functional/basket/test_manipulation.py F
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
traceback
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
self = <tests.functional.basket.test_manipulation.TestAddingToBasket
testMethod=test_validation_errors_in_form>
def test_validation_errors_in_form(self):
> product = factories.ProductFactory()
^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/functional/basket/test_manipulation.py:43:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _
.venv/lib/python3.13/site-packages/factory/base.py:43: in __call__
return cls.create(**kwargs)
^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/base.py:539: in create
return cls._generate(enums.CREATE_STRATEGY, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/django.py:122: in _generate
return super()._generate(strategy, params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/base.py:468: in _generate
return step.build()
^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/builder.py:283: in build
postgen_results[declaration_name] =
declaration.declaration.evaluate_post(
.venv/lib/python3.13/site-packages/factory/declarations.py:652: in
evaluate_post
return self.call(instance, step, postgen_context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/declarations.py:733: in call
return step.recurse(factory, passed_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/builder.py:228: in recurse
return builder.build(parent_step=self, force_sequence=force_sequence)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/builder.py:270: in build
step.resolve(pre)
.venv/lib/python3.13/site-packages/factory/builder.py:211: in resolve
self.attributes[field_name] = getattr(self.stub, field_name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/builder.py:356: in __getattr__
value = value.evaluate_pre(
.venv/lib/python3.13/site-packages/factory/declarations.py:67: in
evaluate_pre
return self.evaluate(instance, step, context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/declarations.py:457: in
evaluate
return step.recurse(subfactory, extra, force_sequence=force_sequence)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/builder.py:228: in recurse
return builder.build(parent_step=self, force_sequence=force_sequence)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/builder.py:274: in build
instance = self.factory_meta.instantiate(
.venv/lib/python3.13/site-packages/factory/base.py:320: in instantiate
return self.factory._create(model, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/factory/django.py:175: in _create
return manager.create(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in
manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/query.py:669: in
create
obj.save(force_insert=True, using=self.db)
src/oscar/apps/catalogue/abstract_models.py:244: in save
super().save(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:874: in save
self.save_base(
.venv/lib/python3.13/site-packages/django/db/models/base.py:981: in
save_base
post_save.send(
.venv/lib/python3.13/site-packages/django/dispatch/dispatcher.py:209: in
send
response = receiver(signal=self, sender=sender, **named)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/oscar/apps/catalogue/receivers.py:46: in
post_save_set_ancestors_are_public
instance.set_ancestors_are_public()
src/oscar/apps/catalogue/abstract_models.py:255: in
set_ancestors_are_public
self.get_descendants_and_self().update(
.venv/lib/python3.13/site-packages/django/db/models/query.py:1300: in
update
rows = query.get_compiler(self.db).execute_sql(ROW_COUNT)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:2111:
in execute_sql
row_count = super().execute_sql(result_type)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:1611:
in execute_sql
sql, params = self.as_sql()
^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:2074:
in as_sql
sql, params = self.compile(val)
^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:578:
in compile
sql, params = node.as_sql(self, self.connection)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/expressions.py:1551:
in as_sql
sql, params = super().as_sql(compiler, connection)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/expressions.py:1530:
in as_sql
return compiler.compile(self.expression)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:578:
in compile
sql, params = node.as_sql(self, self.connection)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/expressions.py:1859:
in as_sql
return super().as_sql(compiler, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/expressions.py:1829:
in as_sql
subquery_sql, sql_params = self.query.as_sql(compiler, connection)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/query.py:1323: in
as_sql
sql, params = self.get_compiler(connection=connection).as_sql()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:795:
in as_sql
self.compile(self.where) if self.where is not None else ("", [])
^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:578:
in compile
sql, params = node.as_sql(self, self.connection)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/where.py:151: in
as_sql
sql, params = compiler.compile(child)
^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:578:
in compile
sql, params = node.as_sql(self, self.connection)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _
self = ReverseStartsWith(Col(U0, catalogue.Category.path),
Col(catalogue_category, catalogue.Category.path))
compiler = <SQLCompiler model=Category connection=<DatabaseWrapper
vendor='postgresql' alias='default'> using=None>
connection = <DatabaseWrapper vendor='postgresql' alias='default'>
def as_sql(self, compiler, connection):
lhs_sql, params = self.process_lhs(compiler, connection)
rhs_sql, rhs_params = self.process_rhs(compiler, connection)
> params.extend(rhs_params)
^^^^^^^^^^^^^
E AttributeError: 'tuple' object has no attribute 'extend'
.venv/lib/python3.13/site-packages/django/db/models/lookups.py:240:
AttributeError
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
entering PDB
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PDB post_mortem
(IO-capturing turned off)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> /home/mdk/src/django-oscar/.venv/lib/python3.13/site-
packages/django/db/models/lookups.py(240)as_sql()
-> params.extend(rhs_params)
(Pdb)
}}}
--
Ticket URL: <
https://code.djangoproject.com/ticket/36922#comment:3>