﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
35735	For python 3.9+ class property may not be accessible by Django's template system	Fabian Braun	Fabian Braun	"Before python 3.9 class properties were always available through the template system. If you had a class
{{{
class MyClass:
    in_template = True
}}}
you could access the class property in the template through (if it was returned by a callable) `{{ get_my_class.in_template }}`. 

The template system first checks if the class is subscriptable (i.e. tries `context_value[""in_template""]`), will fail and then will get the in_template property.

As of python 3.9 some classes actually are subscriptable and trying to get the item will not fail: Typing shortcuts introduced syntax like `list[int]`. This hides class properties from the template system.

Here's a test (that might go into tests/template_tests/syntax_tests/tests_basic.py) which passes on Python 3.9 and fails on Python 3.10+:
{{{
    @setup({""basic-syntax19b"": ""{{ klass.in_template }}""})
    def test_access_class_property(self):
        class MyClass(list):
            in_template = True

        def get_my_class():
            return MyClass

        # Pass the callable to return the class, or it would be resolved by the template
        # engine
        output = self.engine.render_to_string(
            ""basic-syntax19b"",
            {""klass"": get_my_class}
        )
        self.assertEqual(output, ""True"")
}}}

I'd be happy to propose a fix that will not call a classes' `__class_getitem__` method.

Thanks to [https://github.com/benzkji Ben Stähli] and [https://github.com/last-partizan Serhii Tereshchenko] for figuring out this issue.

References:

* https://github.com/django-cms/django-cms/issues/7948"	Bug	assigned	Template system	5.0	Normal			Fabian Braun	Unreviewed	0	0	0	0	0	0
