﻿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(list):
    in_template = True
    do_not_call_in_templates = True  # prevent instantiation

    @classmethod
    def render_all_objects(cls):
        ...
}}}
you could access the class property in the template through (if it was contained in the context) `{{ MyClass.in_template }}` or `{{ MyClass. render_all_objects }}`. 

The template system first gets the class `MyClass` (and does not instantiate it) or gets it as a result of a callable `get_my_class`. Then it checks if the class is subscriptable (i.e. tries `MyClass[""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]`. These hide class properties or methods 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
            do_not_call_in_templates = True  # prevent instantiation

        output = self.engine.render_to_string(""basic-syntax19b"", {""klass"": MyClass})
        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	closed	Template system	dev	Normal	fixed		Fabian Braun	Ready for checkin	1	0	0	0	0	0
